aboutsummaryrefslogtreecommitdiff
path: root/gnu/libexec/uucp/common_sources/copy.c
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/libexec/uucp/common_sources/copy.c')
-rw-r--r--gnu/libexec/uucp/common_sources/copy.c202
1 files changed, 202 insertions, 0 deletions
diff --git a/gnu/libexec/uucp/common_sources/copy.c b/gnu/libexec/uucp/common_sources/copy.c
new file mode 100644
index 000000000000..0d1a5bb2c270
--- /dev/null
+++ b/gnu/libexec/uucp/common_sources/copy.c
@@ -0,0 +1,202 @@
+/* copy.c
+ Copy one file to another for the UUCP package.
+
+ Copyright (C) 1991, 1992 Ian Lance Taylor
+
+ This file is part of the Taylor UUCP package.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ The author of the program may be contacted at ian@airs.com or
+ c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
+ */
+
+#include "uucp.h"
+
+#if USE_RCS_ID
+const char copy_rcsid[] = "$Id: copy.c,v 1.1 1993/08/05 18:22:37 conklin Exp $";
+#endif
+
+#include "uudefs.h"
+#include "system.h"
+#include "sysdep.h"
+
+#include <stdio.h>
+#include <errno.h>
+
+/* Copy one file to another. */
+
+#if USE_STDIO
+
+boolean
+fcopy_file (zfrom, zto, fpublic, fmkdirs)
+ const char *zfrom;
+ const char *zto;
+ boolean fpublic;
+ boolean fmkdirs;
+{
+ FILE *efrom;
+ boolean fret;
+
+ efrom = fopen (zfrom, BINREAD);
+ if (efrom == NULL)
+ {
+ ulog (LOG_ERROR, "fopen (%s): %s", zfrom, strerror (errno));
+ return FALSE;
+ }
+
+ fret = fcopy_open_file (efrom, zto, fpublic, fmkdirs);
+ (void) fclose (efrom);
+ return fret;
+}
+
+boolean
+fcopy_open_file (efrom, zto, fpublic, fmkdirs)
+ FILE *efrom;
+ const char *zto;
+ boolean fpublic;
+ boolean fmkdirs;
+{
+ FILE *eto;
+ char ab[8192];
+ int c;
+
+ eto = esysdep_fopen (zto, fpublic, FALSE, fmkdirs);
+ if (eto == NULL)
+ return FALSE;
+
+ while ((c = fread (ab, sizeof (char), sizeof ab, efrom)) != 0)
+ {
+ if (fwrite (ab, sizeof (char), (size_t) c, eto) != c)
+ {
+ ulog (LOG_ERROR, "fwrite: %s", strerror (errno));
+ (void) fclose (eto);
+ (void) remove (zto);
+ return FALSE;
+ }
+ }
+
+ if (fclose (eto) != 0)
+ {
+ ulog (LOG_ERROR, "fclose: %s", strerror (errno));
+ (void) remove (zto);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+#else /* ! USE_STDIO */
+
+#if HAVE_FCNTL_H
+#include <fcntl.h>
+#else
+#if HAVE_SYS_FILE_H
+#include <sys/file.h>
+#endif
+#endif
+
+#ifndef O_RDONLY
+#define O_RDONLY 0
+#define O_WRONLY 1
+#define O_RDWR 2
+#endif
+
+#ifndef O_NOCTTY
+#define O_NOCTTY 0
+#endif
+
+boolean
+fcopy_file (zfrom, zto, fpublic, fmkdirs)
+ const char *zfrom;
+ const char *zto;
+ boolean fpublic;
+ boolean fmkdirs;
+{
+ int ofrom;
+ boolean fret;
+
+ ofrom = open (zfrom, O_RDONLY | O_NOCTTY, 0);
+ if (ofrom < 0)
+ {
+ ulog (LOG_ERROR, "open (%s): %s", zfrom, strerror (errno));
+ return FALSE;
+ }
+
+ fret = fcopy_open_file (ofrom, zto, fpublic, fmkdirs);
+ (void) close (ofrom);
+ return fret;
+}
+
+boolean
+fcopy_open_file (ofrom, zto, fpublic, fmkdirs)
+ int ofrom;
+ const char *zto;
+ boolean fpublic;
+ boolean fmkdirs;
+{
+ int oto;
+ char ab[8192];
+ int c;
+
+ /* These file mode arguments are from the UNIX version of sysdep.h;
+ each system dependent header file will need their own
+ definitions. */
+ oto = creat (zto, fpublic ? IPUBLIC_FILE_MODE : IPRIVATE_FILE_MODE);
+ if (oto < 0)
+ {
+ if (errno == ENOENT && fmkdirs)
+ {
+ if (! fsysdep_make_dirs (zto, fpublic))
+ return FALSE;
+ oto = creat (zto,
+ fpublic ? IPUBLIC_FILE_MODE : IPRIVATE_FILE_MODE);
+ }
+ if (oto < 0)
+ {
+ ulog (LOG_ERROR, "open (%s): %s", zto, strerror (errno));
+ return FALSE;
+ }
+ }
+
+ while ((c = read (ofrom, ab, sizeof ab)) > 0)
+ {
+ if (write (oto, ab, (size_t) c) != c)
+ {
+ ulog (LOG_ERROR, "write: %s", strerror (errno));
+ (void) close (oto);
+ (void) remove (zto);
+ return FALSE;
+ }
+ }
+
+ if (close (oto) < 0)
+ {
+ ulog (LOG_ERROR, "close: %s", strerror (errno));
+ (void) remove (zto);
+ return FALSE;
+ }
+
+ if (c < 0)
+ {
+ ulog (LOG_ERROR, "read: %s", strerror (errno));
+ (void) remove (zto);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+#endif /* ! USE_STDIO */