From: Sergey Poznyakoff Date: Tue, 6 Dec 2005 16:32:17 +0000 (+0000) Subject: (sys_exec_info_script): New function. X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Ftar;a=commitdiff_plain;h=ea019af0cc9a7609f128568c3b8b5c528cb6e1f3 (sys_exec_info_script): New function. --- diff --git a/src/system.c b/src/system.c index 99cb0f3..695f952 100644 --- a/src/system.c +++ b/src/system.c @@ -657,6 +657,7 @@ chr_to_env (char *envar, char c) static void stat_to_env (char *name, char type, struct tar_stat_info *st) { + str_to_env ("TAR_VERSION", PACKAGE_VERSION); chr_to_env ("TAR_FILETYPE", type); oct_to_env ("TAR_MODE", st->stat.st_mode); str_to_env ("TAR_FILENAME", name); @@ -764,4 +765,51 @@ sys_wait_command (void) pid = -1; } +int +sys_exec_info_script (const char *archive_name, int volume_number) +{ + pid_t pid; + char *argv[4]; + char uintbuf[UINTMAX_STRSIZE_BOUND]; + + pid = xfork (); + + if (pid != 0) + { + int status; + + /* Master */ + while (waitpid (pid, &status, 0) == -1) + if (errno != EINTR) + { + waitpid_error (info_script_option); + return -1; + } + + if (WIFEXITED (status)) + return WEXITSTATUS (status); + + return -1; + } + + /* Child */ + setenv ("TAR_VERSION", PACKAGE_VERSION, 1); + setenv ("TAR_ARCHIVE", archive_name, 1); + setenv ("TAR_VOLUME", STRINGIFY_BIGINT (volume_number, uintbuf), 1); + setenv ("TAR_SUBCOMMAND", subcommand_string (subcommand_option), 1); + setenv ("TAR_FORMAT", + archive_format_string (current_format == DEFAULT_FORMAT ? + archive_format : current_format), 1); + + argv[0] = "/bin/sh"; + argv[1] = "-c"; + argv[2] = (char*) info_script_option; + argv[3] = NULL; + + execv (argv[0], argv); + + exec_fatal (info_script_option); +} + + #endif /* not MSDOS */