|
|
1.1 ! root 1: /* copy.c ! 2: Copy one file to another for the UUCP package. ! 3: ! 4: Copyright (C) 1991, 1992 Ian Lance Taylor ! 5: ! 6: This file is part of the Taylor UUCP package. ! 7: ! 8: This program is free software; you can redistribute it and/or ! 9: modify it under the terms of the GNU General Public License as ! 10: published by the Free Software Foundation; either version 2 of the ! 11: License, or (at your option) any later version. ! 12: ! 13: This program is distributed in the hope that it will be useful, but ! 14: WITHOUT ANY WARRANTY; without even the implied warranty of ! 15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! 16: General Public License for more details. ! 17: ! 18: You should have received a copy of the GNU General Public License ! 19: along with this program; if not, write to the Free Software ! 20: Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! 21: ! 22: The author of the program may be contacted at [email protected] or ! 23: c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254. ! 24: */ ! 25: ! 26: #include "uucp.h" ! 27: ! 28: #if USE_RCS_ID ! 29: const char copy_rcsid[] = "$Id: copy.c,v 1.1 93/07/30 07:52:59 bin Exp Locker: bin $"; ! 30: #endif ! 31: ! 32: #include "uudefs.h" ! 33: #include "system.h" ! 34: #include "sysdep.h" ! 35: ! 36: #include <stdio.h> ! 37: #include <errno.h> ! 38: ! 39: /* Copy one file to another. */ ! 40: ! 41: #if USE_STDIO ! 42: ! 43: boolean ! 44: fcopy_file (zfrom, zto, fpublic, fmkdirs) ! 45: const char *zfrom; ! 46: const char *zto; ! 47: boolean fpublic; ! 48: boolean fmkdirs; ! 49: { ! 50: FILE *efrom; ! 51: boolean fret; ! 52: ! 53: efrom = fopen (zfrom, BINREAD); ! 54: if (efrom == NULL) ! 55: { ! 56: ulog (LOG_ERROR, "fopen (%s): %s", zfrom, strerror (errno)); ! 57: return FALSE; ! 58: } ! 59: ! 60: fret = fcopy_open_file (efrom, zto, fpublic, fmkdirs); ! 61: (void) fclose (efrom); ! 62: return fret; ! 63: } ! 64: ! 65: boolean ! 66: fcopy_open_file (efrom, zto, fpublic, fmkdirs) ! 67: FILE *efrom; ! 68: const char *zto; ! 69: boolean fpublic; ! 70: boolean fmkdirs; ! 71: { ! 72: FILE *eto; ! 73: char ab[8192]; ! 74: int c; ! 75: ! 76: eto = esysdep_fopen (zto, fpublic, FALSE, fmkdirs); ! 77: if (eto == NULL) ! 78: return FALSE; ! 79: ! 80: while ((c = fread (ab, sizeof (char), sizeof ab, efrom)) != 0) ! 81: { ! 82: if (fwrite (ab, sizeof (char), (size_t) c, eto) != c) ! 83: { ! 84: ulog (LOG_ERROR, "fwrite: %s", strerror (errno)); ! 85: (void) fclose (eto); ! 86: (void) remove (zto); ! 87: return FALSE; ! 88: } ! 89: } ! 90: ! 91: if (fclose (eto) != 0) ! 92: { ! 93: ulog (LOG_ERROR, "fclose: %s", strerror (errno)); ! 94: (void) remove (zto); ! 95: return FALSE; ! 96: } ! 97: ! 98: return TRUE; ! 99: } ! 100: ! 101: #else /* ! USE_STDIO */ ! 102: ! 103: #if HAVE_FCNTL_H ! 104: #include <fcntl.h> ! 105: #else ! 106: #if HAVE_SYS_FILE_H ! 107: #include <sys/file.h> ! 108: #endif ! 109: #endif ! 110: ! 111: #ifndef O_RDONLY ! 112: #define O_RDONLY 0 ! 113: #define O_WRONLY 1 ! 114: #define O_RDWR 2 ! 115: #endif ! 116: ! 117: #ifndef O_NOCTTY ! 118: #define O_NOCTTY 0 ! 119: #endif ! 120: ! 121: boolean ! 122: fcopy_file (zfrom, zto, fpublic, fmkdirs) ! 123: const char *zfrom; ! 124: const char *zto; ! 125: boolean fpublic; ! 126: boolean fmkdirs; ! 127: { ! 128: int ofrom; ! 129: boolean fret; ! 130: ! 131: ofrom = open (zfrom, O_RDONLY | O_NOCTTY, 0); ! 132: if (ofrom < 0) ! 133: { ! 134: ulog (LOG_ERROR, "open (%s): %s", zfrom, strerror (errno)); ! 135: return FALSE; ! 136: } ! 137: ! 138: fret = fcopy_open_file (ofrom, zto, fpublic, fmkdirs); ! 139: (void) close (ofrom); ! 140: return fret; ! 141: } ! 142: ! 143: boolean ! 144: fcopy_open_file (ofrom, zto, fpublic, fmkdirs) ! 145: int ofrom; ! 146: const char *zto; ! 147: boolean fpublic; ! 148: boolean fmkdirs; ! 149: { ! 150: int oto; ! 151: char ab[8192]; ! 152: int c; ! 153: ! 154: /* These file mode arguments are from the UNIX version of sysdep.h; ! 155: each system dependent header file will need their own ! 156: definitions. */ ! 157: oto = creat (zto, fpublic ? IPUBLIC_FILE_MODE : IPRIVATE_FILE_MODE); ! 158: if (oto < 0) ! 159: { ! 160: if (errno == ENOENT && fmkdirs) ! 161: { ! 162: if (! fsysdep_make_dirs (zto, fpublic)) ! 163: return FALSE; ! 164: oto = creat (zto, ! 165: fpublic ? IPUBLIC_FILE_MODE : IPRIVATE_FILE_MODE); ! 166: } ! 167: if (oto < 0) ! 168: { ! 169: ulog (LOG_ERROR, "open (%s): %s", zto, strerror (errno)); ! 170: return FALSE; ! 171: } ! 172: } ! 173: ! 174: while ((c = read (ofrom, ab, sizeof ab)) > 0) ! 175: { ! 176: if (write (oto, ab, (size_t) c) != c) ! 177: { ! 178: ulog (LOG_ERROR, "write: %s", strerror (errno)); ! 179: (void) close (oto); ! 180: (void) remove (zto); ! 181: return FALSE; ! 182: } ! 183: } ! 184: ! 185: if (close (oto) < 0) ! 186: { ! 187: ulog (LOG_ERROR, "close: %s", strerror (errno)); ! 188: (void) remove (zto); ! 189: return FALSE; ! 190: } ! 191: ! 192: if (c < 0) ! 193: { ! 194: ulog (LOG_ERROR, "read: %s", strerror (errno)); ! 195: (void) remove (zto); ! 196: return FALSE; ! 197: } ! 198: ! 199: return TRUE; ! 200: } ! 201: ! 202: #endif /* ! USE_STDIO */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.