Imported Upstream version 2.5.1p3
[debian/amanda] / client-src / rundump.c
index d25f2f3cf0d73123e5c28572d2e5a0af8d788c4c..f42ed27803695f0f98894bd88e531a1337a5512c 100644 (file)
  * file named AUTHORS, in the root directory of this distribution.
  */
 /*
- * $Id: rundump.c,v 1.23.2.3.6.1.2.1 2005/09/20 21:31:52 jrjackson Exp $
+ * $Id: rundump.c,v 1.33 2006/07/25 18:27:56 martinea Exp $
  *
  * runs DUMP program as root
+ *
+ * argv[0] is the rundump program name
+ * argv[1] is the config name or NOCONFIG
+ * argv[2] will be argv[0] of the DUMP program
+ * ...
  */
 #include "amanda.h"
 #include "version.h"
 
-int main P((int argc, char **argv));
+int main(int argc, char **argv);
 
 #if defined(VDUMP) || defined(XFSDUMP)
+#  undef USE_RUNDUMP
 #  define USE_RUNDUMP
 #endif
 
@@ -47,9 +53,10 @@ int main P((int argc, char **argv));
 #  endif
 #endif
 
-int main(argc, argv)
-int argc;
-char **argv;
+int
+main(
+    int                argc,
+    char **    argv)
 {
 #ifndef ERRMSG
     char *dump_program;
@@ -62,8 +69,16 @@ char **argv;
 
     set_pname("rundump");
 
-    dbopen();
-    dbprintf(("%s: version %s\n", argv[0], version()));
+    /* Don't die when child closes pipe */
+    signal(SIGPIPE, SIG_IGN);
+
+    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()));
 
 #ifdef ERRMSG                                                  /* { */
 
@@ -76,15 +91,18 @@ char **argv;
 
     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) {
        error("error [must be invoked by %s]\n", CLIENT_LOGIN);
+       /*NOTREACHED*/
     }
 
     if (geteuid() != 0) {
        error("error [must be setuid root]\n");
+       /*NOTREACHED*/
     }
 #endif /* FORCE_USERID */
 
@@ -92,6 +110,16 @@ char **argv;
     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++;
+
 #ifdef XFSDUMP
 
     if (strcmp(argv[0], "xfsdump") == 0)
@@ -138,7 +166,7 @@ char **argv;
     execve(dump_program, argv, safe_env());
 
     e = strerror(errno);
-    dbprintf(("execve of %s failed (%s)\n", dump_program, e));
+    dbprintf(("failed (%s)\n", e));
     dbclose();
 
     fprintf(stderr, "rundump: could not exec %s: %s\n", dump_program, e);