X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=client-src%2Fruntar.c;h=5d46111850c967efd9f1ed562b5d088e46ffde1c;hb=12179dea039515c06168c0037d048566a3f623de;hp=d24352bd907f7a31c1dc195f21f59e80e3ce8c39;hpb=94c03cae686e4196a345d72452fda2a5203768ce;p=debian%2Famanda diff --git a/client-src/runtar.c b/client-src/runtar.c index d24352b..5d46111 100644 --- a/client-src/runtar.c +++ b/client-src/runtar.c @@ -24,18 +24,25 @@ * file named AUTHORS, in the root directory of this distribution. */ /* - * $Id: runtar.c,v 1.17 2006/01/14 04:37:18 paddy_s Exp $ + * $Id: runtar.c,v 1.24 2006/08/25 11:41:31 martinea Exp $ * * runs GNUTAR program as root + * + * argv[0] is the runtar program name + * argv[1] is the config name or NOCONFIG + * argv[2] will be argv[0] of the gtar program + * ... */ #include "amanda.h" #include "version.h" +#include "util.h" -int main P((int argc, char **argv)); +int main(int argc, char **argv); -int main(argc, argv) -int argc; -char **argv; +int +main( + int argc, + char ** argv) { #ifdef GNUTAR int i; @@ -51,8 +58,19 @@ char **argv; /* Don't die when child closes pipe */ signal(SIGPIPE, SIG_IGN); - dbopen(); - dbprintf(("%s: version %s\n", argv[0], version())); + dbopen(DBG_SUBDIR_CLIENT); + if (argc < 3) { + error("%s: Need at least 3 arguments\n", debug_prefix(NULL)); + /*NOTREACHED*/ + } + + dbprintf(("%s: version %s\n", debug_prefix(NULL), version())); + + if (strcmp(argv[3], "--create") != 0) { + error("%s: Can only be used to create tar archives\n", + debug_prefix(NULL)); + /*NOTREACHED*/ + } #ifndef GNUTAR @@ -63,25 +81,68 @@ char **argv; #else + /* + * Print out version information for tar. + */ + do { + FILE * version_file; + char version_buf[80]; + + if ((version_file = popen(GNUTAR " --version 2>&1", "r")) != NULL) { + if (fgets(version_buf, (int)sizeof(version_buf), version_file) != NULL) { + dbprintf((GNUTAR " version: %s\n", version_buf)); + } else { + if (ferror(version_file)) { + dbprintf((GNUTAR " version: Read failure: %s\n", strerror(errno))); + } else { + dbprintf((GNUTAR " version: Read failure; EOF\n")); + } + } + } else { + dbprintf((GNUTAR " version: unavailable: %s\n", strerror(errno))); + } + } while(0); + if(client_uid == (uid_t) -1) { error("error [cannot find user %s in passwd file]\n", CLIENT_LOGIN); + /*NOTREACHED*/ } #ifdef FORCE_USERID - if (getuid() != client_uid) + if (getuid() != client_uid) { error("error [must be invoked by %s]\n", CLIENT_LOGIN); + /*NOTREACHED*/ + } - if (geteuid() != 0) + if (geteuid() != 0) { error("error [must be setuid root]\n"); + /*NOTREACHED*/ + } #endif #if !defined (DONT_SUID_ROOT) setuid(0); #endif + /* skip argv[0] */ + argc--; + argv++; + + dbprintf(("config: %s\n", argv[0])); + if (strcmp(argv[0], "NOCONFIG") != 0) + dbrename(argv[0], DBG_SUBDIR_CLIENT); + argc--; + argv++; + + dbprintf(("running: %s: ",GNUTAR)); - for (i=0; argv[i]; i++) - dbprintf(("%s ", argv[i])); + for (i=0; argv[i]; i++) { + char *quoted; + + quoted = quote_string(argv[i]); + dbprintf(("'%s' ", quoted)); + amfree(quoted); + } dbprintf(("\n")); dbf = dbfn(); if (dbf) {