]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
Subroutine for copying regular files.
authorBruno Haible <bruno@clisp.org>
Sat, 20 Oct 2001 13:09:15 +0000 (13:09 +0000)
committerBruno Haible <bruno@clisp.org>
Sat, 20 Oct 2001 13:09:15 +0000 (13:09 +0000)
ChangeLog
configure.in
lib/ChangeLog
lib/copy-file.c [new file with mode: 0644]
lib/copy-file.h [new file with mode: 0644]

index 9d03bcad86c37fb97b5cb8ffdb60a0879f3bac14..57bff64258b52a7de19d2372c60e5bd64f4593a0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2001-09-17  Bruno Haible  <haible@clisp.cons.org>
+
+       * configure.in: Check for utime and utimes.
+
 2001-09-08  Bruno Haible  <haible@clisp.cons.org>
 
        * configure.in (AC_OUTPUT): Add intl-java/Makefile.
index 8be2817a7f7ece3ee4ad04e96096c7078cd0cd9c..4bb0fe5564d5b67bab3620843643c6d7ffe85bc5 100644 (file)
@@ -67,7 +67,7 @@ dnl Checks for library functions.
 AC_FUNC_ALLOCA
 AC_FUNC_VPRINTF
 AC_CHECK_FUNCS([getcwd mblen memcpy posix_spawn raise select strchr strerror \
-uname])
+uname utime utimes])
 AC_REPLACE_FUNCS([memset stpcpy stpncpy strcspn \
 strcasecmp strncasecmp strpbrk strstr strtoul vasprintf])
 AM_FUNC_GETLINE
index 73b737ed049bf525b3cdd147700d68574203fd80..ca6b83806f68d1c8bad66ac6e2668398aa144026 100644 (file)
@@ -1,3 +1,10 @@
+2001-09-17  Bruno Haible  <haible@clisp.cons.org>
+
+       * copy-file.h: New file.
+       * copy-file.c: New file.
+       * Makefile.am (libnlsut_a_SOURCES): Add copy-file.c.
+       (libnlsut_a_HEADER): Add copy-file.h.
+
 2001-09-17  Bruno Haible  <haible@clisp.cons.org>
 
        * basename.h: New file.
diff --git a/lib/copy-file.c b/lib/copy-file.c
new file mode 100644 (file)
index 0000000..130ef66
--- /dev/null
@@ -0,0 +1,115 @@
+/* Copying of files.
+   Copyright (C) 2001 Free Software Foundation, Inc.
+   Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+   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, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+/* Specification.  */
+#include "copy-file.h"
+
+#include <errno.h>
+#include <fcntl.h>
+
+#if HAVE_UTIME || HAVE_UTIMES
+# include <utime.h>
+#endif
+
+#include "error.h"
+#include "full-write.h"
+#include "system.h"
+#include "libgettext.h"
+
+#define _(str) gettext (str)
+
+/* On reasonable systems, binary I/O is the default.  */
+#ifndef O_BINARY
+# define O_BINARY 0
+#endif
+
+void
+copy_file (src_filename, dest_filename)
+     const char *src_filename;
+     const char *dest_filename;
+{
+  int src_fd;
+  struct stat statbuf;
+  int mode;
+  int dest_fd;
+  char buf[4096];
+  const int buf_size = sizeof (buf);
+
+  src_fd = open (src_filename, O_RDONLY | O_BINARY);
+  if (src_fd < 0 || fstat (src_fd, &statbuf) < 0)
+    error (EXIT_FAILURE, errno, _("error while opening \"%s\" for reading"),
+          src_filename);
+
+  mode = statbuf.st_mode & 07777;
+
+  dest_fd = open (dest_filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0600);
+  if (dest_fd < 0)
+    error (EXIT_FAILURE, errno, _("cannot open backup file \"%s\" for writing"),
+          dest_filename);
+
+  /* Copy the file contents.  */
+  for (;;)
+    {
+      ssize_t n_read = read (src_fd, buf, buf_size);
+      if (n_read < 0)
+       {
+#ifdef EINTR
+         if (errno == EINTR)
+           continue;
+#endif
+         error (EXIT_FAILURE, errno, _("error reading \"%s\""), src_filename);
+       }
+      if (n_read == 0)
+       break;
+
+      if (full_write (dest_fd, buf, n_read) < 0)
+       error (EXIT_FAILURE, errno, _("error writing \"%s\""), dest_filename);
+    }
+
+  if (close (dest_fd) < 0)
+    error (EXIT_FAILURE, errno, _("error writing \"%s\""), dest_filename);
+  if (close (src_fd) < 0)
+    error (EXIT_FAILURE, errno, _("error after reading \"%s\""), src_filename);
+
+  /* Preserve the access and modification times.  */
+#if HAVE_UTIME
+  {
+    struct utimbuf ut;
+
+    ut.actime = statbuf.st_atime;
+    ut.modtime = statbuf.st_mtime;
+    utime (dest_filename, &ut);
+  }
+#elif HAVE_UTIMES
+  {
+    struct timeval ut[2];
+
+    ut[0].tv_sec = statbuf.st_atime; ut[0].tv_usec = 0;
+    ut[1].tv_sec = statbuf.st_mtime; ut[1].tv_usec = 0;
+    utimes (dest_filename, &ut);
+  }
+#endif
+
+  /* Preserve the access permissions.  */
+  chmod (dest_filename, mode);
+}
diff --git a/lib/copy-file.h b/lib/copy-file.h
new file mode 100644 (file)
index 0000000..ce68dd2
--- /dev/null
@@ -0,0 +1,23 @@
+/* Copying of files.
+   Copyright (C) 2001 Free Software Foundation, Inc.
+   Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+   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, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+/* Copy a reular file: from src_filename to dest_filename.
+   The destination file is assumed to be a backup file.
+   Exit upon failure.  */
+extern void copy_file PARAMS ((const char *src_filename,
+                              const char *dest_filename));