X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fsystem.c;h=05313db88a9190297ecd0ca90f9a0f742617c8c2;hb=35f5b4881520894420b479eb09bd2a50d1a91726;hp=b1783b1ac2ecca05280f267752ee25d05be8b011;hpb=0b939d7dbc87703afe765410202d2781f3f7b222;p=chaz%2Ftar diff --git a/src/system.c b/src/system.c index b1783b1..05313db 100644 --- a/src/system.c +++ b/src/system.c @@ -14,7 +14,7 @@ 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. */ + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include @@ -22,30 +22,6 @@ #include #include -void -sys_stat_nanoseconds (struct tar_stat_info *st) -{ -#if defined(HAVE_STRUCT_STAT_ST_SPARE1) - st->atime_nsec = st->stat.st_spare1 * 1000; - st->mtime_nsec = st->stat.st_spare2 * 1000; - st->ctime_nsec = st->stat.st_spare3 * 1000; -#elif defined(HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC) - st->atime_nsec = st->stat.st_atim.tv_nsec; - st->mtime_nsec = st->stat.st_mtim.tv_nsec; - st->ctime_nsec = st->stat.st_ctim.tv_nsec; -#elif defined(HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC) - st->atime_nsec = st->stat.st_atimespec.tv_nsec; - st->mtime_nsec = st->stat.st_mtimespec.tv_nsec; - st->ctime_nsec = st->stat.st_ctimespec.tv_nsec; -#elif defined(HAVE_STRUCT_STAT_ST_ATIMENSEC) - st->atime_nsec = st->stat.st_atimensec; - st->mtime_nsec = st->stat.st_mtimensec; - st->ctime_nsec = st->stat.st_ctimensec; -#else - st->atime_nsec = st->mtime_nsec = st->ctime_nsec = 0; -#endif -} - #if MSDOS bool @@ -635,23 +611,36 @@ dec_to_env (char *envar, uintmax_t num) char *numstr; numstr = STRINGIFY_BIGINT (num, buf); - setenv (envar, numstr, 1); + if (setenv (envar, numstr, 1) != 0) + xalloc_die (); +} + +static void +time_to_env (char *envar, struct timespec t) +{ + char buf[TIMESPEC_STRSIZE_BOUND]; + if (setenv (envar, code_timespec (t, buf), 1) != 0) + xalloc_die (); } static void oct_to_env (char *envar, unsigned long num) { char buf[1+1+(sizeof(unsigned long)*CHAR_BIT+2)/3]; - + snprintf (buf, sizeof buf, "0%lo", num); - setenv (envar, buf, 1); + if (setenv (envar, buf, 1) != 0) + xalloc_die (); } static void str_to_env (char *envar, char const *str) { if (str) - setenv (envar, str, 1); + { + if (setenv (envar, str, 1) != 0) + xalloc_die (); + } else unsetenv (envar); } @@ -662,7 +651,8 @@ chr_to_env (char *envar, char c) char buf[2]; buf[0] = c; buf[1] = 0; - setenv (envar, buf, 1); + if (setenv (envar, buf, 1) != 0) + xalloc_die (); } static void @@ -674,12 +664,12 @@ stat_to_env (char *name, char type, struct tar_stat_info *st) str_to_env ("TAR_REALNAME", st->file_name); str_to_env ("TAR_UNAME", st->uname); str_to_env ("TAR_GNAME", st->gname); - dec_to_env ("TAR_MTIME", st->stat.st_mtime); - dec_to_env ("TAR_ATIME", st->stat.st_atime); - dec_to_env ("TAR_CTIME", st->stat.st_ctime); + time_to_env ("TAR_ATIME", st->atime); + time_to_env ("TAR_MTIME", st->mtime); + time_to_env ("TAR_CTIME", st->ctime); dec_to_env ("TAR_SIZE", st->stat.st_size); dec_to_env ("TAR_UID", st->stat.st_uid); - dec_to_env ("TAR_GID", st->stat.st_gid); + dec_to_env ("TAR_GID", st->stat.st_gid); switch (type) { @@ -713,36 +703,21 @@ sys_exec_command (char *file_name, int typechar, struct tar_stat_info *st) { int p[2]; char *argv[4]; - - if (pipe (p)) - { - pipe_error (file_name); - return -1; - } + xpipe (p); pipe_handler = signal (SIGPIPE, SIG_IGN); - pid = fork (); - - if (pid < 0) - { - fork_error (file_name); - close (p[1]); - close (p[0]); - signal (SIGPIPE, pipe_handler); - return -1; - } + pid = xfork (); if (pid != 0) { - close (p[0]); - return p[1]; + xclose (p[PREAD]); + return p[PWRITE]; } /* Child */ - close (0); - dup (p[0]); - close (p[1]); - + xdup2 (p[PREAD], STDIN_FILENO); + xclose (p[PWRITE]); + stat_to_env (file_name, typechar, st); argv[0] = "/bin/sh"; @@ -752,15 +727,14 @@ sys_exec_command (char *file_name, int typechar, struct tar_stat_info *st) execv ("/bin/sh", argv); - exec_error (file_name); - _exit (127); + exec_fatal (file_name); } void sys_wait_command (void) { int status; - + if (pid < 0) return; @@ -786,10 +760,9 @@ sys_wait_command (void) } else ERROR ((0, 0, _("%lu: Child terminated on unknown reason"), - (unsigned long) pid, WTERMSIG (status))); + (unsigned long) pid)); pid = -1; } #endif /* not MSDOS */ -