Hash :
222b0486
Author :
Date :
2005-09-19T17:28:14
Use a consistent style for including <config.h>. * __fpending.c, acl.c, argmatch.c, argp-help.c, argp-parse.c, argp-pvh.c, backupfile.c, basename.c, c-stack.c, calloc.c, check-version.c, cloexec.c, closeout.c, copy-file.c, creat-safer.c, cycle-check.c, dirfd.c, dirname.c, dup-safer.c, dup2.c, euidaccess.c, exclude.c, exitfail.c, fatal-signal.c, fd-safer.c, file-type.c, fileblocks.c, filemode.c, filenamecat.c, findprog.c, fnmatch.c, fopen-safer.c, free.c, fsusage.c, ftruncate.c, full-write.c, fwriteerror.c, getaddrinfo.c, getcwd.c, getdelim.c, getline.c, getlogin_r.c, getndelim2.c, getnline.c, getopt1.c, getpass.c, group-member.c, hard-locale.c, hash-pjw.c, hash.c, human.c, idcache.c, inet_ntop.c, isdir.c, long-options.c, malloc.c, memcasecmp.c, memcmp.c, memcoll.c, memcpy.c, memmove.c, mkdir-p.c, modechange.c, mountlist.c, open-safer.c, physmem.c, pipe-safer.c, pipe.c, poll.c, posixver.c, progname.c, progreloc.c, putenv.c, quote.c, quotearg.c, readline.c, readlink.c, realloc.c, regex.c, rename.c, rmdir.c, rpmatch.c, safe-read.c, same.c, save-cwd.c, savedir.c, sig2str.c, strcspn.c, strerror.c, stripslash.c, strncasecmp.c, strndup.c, strnlen.c, strnlen1.c, strsep.c, strstr.c, strtod.c, strtoimax.c, strtol.c, strverscmp.c, tempname.c, time_r.c, userspec.c, utimecmp.c, version-etc-fsf.c, version-etc.c, wait-process.c, xalloc-die.c, xgetcwd.c, xmalloc.c, xmemcoll.c, xnanosleep.c, xreadlink.c, xsetenv.c, xstrndup.c, xstrtoimax.c, xstrtol.c, xstrtoumax.c, yesno.c: Standardize inclusion of config.h. * __fpending.h, dirfd.h, getdate.h, human.h, inttostr.h: Removed inclusion of config.h from header files. * inttostr.c: Adjusted in-tree users. * timespec.h: Remove superfluous warning to include config.h. * atexit.c, chdir-long.c chown.c, fchown-stub.c, getgroups.c, gettimeofday.c, lchown.c, lstat.c, mkdir.c, mkstemp.c, nanosleep.c, openat.c, raise.c, readtokens0.c, readutmp.c, unlinkdir.c: Guard inclusion of config.h with HAVE_CONFIG_H.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
/* Copying of files.
Copyright (C) 2001-2003 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
/* Specification. */
#include "copy-file.h"
#include <errno.h>
#include <fcntl.h>
#include <stddef.h>
#include <sys/stat.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
#if HAVE_UTIME || HAVE_UTIMES
# if HAVE_UTIME_H
# include <utime.h>
# else
# include <sys/utime.h>
# endif
#endif
#include "error.h"
#include "safe-read.h"
#include "full-write.h"
#include "binary-io.h"
#include "exit.h"
#include "gettext.h"
#define _(str) gettext (str)
void
copy_file_preserving (const char *src_filename, const char *dest_filename)
{
int src_fd;
struct stat statbuf;
int mode;
int dest_fd;
char buf[4096];
const size_t 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 (;;)
{
size_t n_read = safe_read (src_fd, buf, buf_size);
if (n_read == SAFE_READ_ERROR)
error (EXIT_FAILURE, errno, _("error reading \"%s\""), src_filename);
if (n_read == 0)
break;
if (full_write (dest_fd, buf, n_read) < n_read)
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
#if HAVE_CHOWN
/* Preserve the owner and group. */
chown (dest_filename, statbuf.st_uid, statbuf.st_gid);
#endif
/* Preserve the access permissions. */
chmod (dest_filename, mode);
}