ncohafmuta-1.4.2/bot/
ncohafmuta-1.4.2/helpfiles/
ncohafmuta-1.4.2/lib/emailver/
ncohafmuta-1.4.2/tzinfo/Atlantic/
ncohafmuta-1.4.2/tzinfo/Brazil/
ncohafmuta-1.4.2/tzinfo/Chile/
ncohafmuta-1.4.2/tzinfo/Indian/
ncohafmuta-1.4.2/tzinfo/Mexico/
ncohafmuta-1.4.2/tzinfo/Mideast/
ncohafmuta-1.4.2/tzinfo/SystemV/
ncohafmuta-1.4.2/utils/
ncohafmuta-1.4.2/utils/code_fragments/new_config/
/* filecopy.c
  $Id: filecopy.c,v 1.1 2000/03/02 11:46:36 gwiley Exp $
  Glen Wiley, <gwiley@ieee.org>

  this function will reliably copy a file, detecting
  whether source/destination are the same file
  returns 0 on success
*/

#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>

/* size of the buffer used for copying the file */
static const int COPYBUFFSZ = 4096;

/*-------------------------------------- filecopy
 copy file to a separate file
 return 0 on success, errno on failure
*/
int
filecopy(const char *fn_src, const char *fn_dst)
{
        int   bytesr;
        int   retval  = 0;
        int   done    = 0;
        FILE  *fh_src = NULL;
        FILE  *fh_dst = NULL;
        char  *buff   = NULL;
        char  *p      = NULL;
        struct stat stat_s;
        struct stat stat_d;

        buff = (char *) malloc(COPYBUFFSZ);
        if(buff == NULL)
                return errno;

        if(stat(fn_src, &stat_s) != 0)
                retval = errno;

        // if we can stat the dest file then make sure it is not the same as src 
        if(stat(fn_dst, &stat_d) == 0)
        {
                if(stat_s.st_dev == stat_d.st_dev && stat_s.st_ino == stat_d.st_ino)
                        retval = EEXIST;
        }

        if(!retval)
        {
                fh_src = fopen(fn_src, "r");
                if(fh_src == NULL)
                        retval = errno;
        }

        if(!retval)
        {
                fh_dst = fopen(fn_dst, "w+");
                if(fh_dst == NULL)
                        retval = errno;
                else
                {
                        while(!retval)
                        {
                                bytesr = fread(buff, 1, COPYBUFFSZ, fh_src);
                                if(bytesr < 1)
                                {
                                        if(feof(fh_src))
                                                break;
                                        else
                                                retval = ferror(fh_src);
                                }
                                else
                                {
                                        if(fwrite(buff, 1, bytesr, fh_dst) != bytesr)
                                        {
                                                retval = ferror(fh_dst);
                                                break;
                                        }
                                }
                        }
                } // if fh_dst

                if(fh_dst)
                        fclose(fh_dst);

        } // if !retval

        if(fh_src)
                fclose(fh_src);

        if(buff)
                free(buff);

        return retval;
} // filecopy

/* filecopy */