Imported Upstream version 2.6.0
[debian/amanda] / server-src / getconf.c
index c645ebdf3a812c42aad96f5c60fded247395a7c0..fb90b37afb0150863f3dc9a7a0b3288c53fa3b78 100644 (file)
@@ -25,7 +25,7 @@
  *                        University of Maryland at College Park
  */
 /*
- * $Id: getconf.c,v 1.18 2006/01/14 04:37:19 paddy_s Exp $
+ * $Id: getconf.c,v 1.26 2006/07/25 19:00:56 martinea Exp $
  *
  * a little wrapper to extract config variables for shell scripts
  */
 #include "genversion.h"
 #include "conffile.h"
 
-int main P((int argc, char **argv));
+int main(int argc, char **argv);
+
+/*
+ * HOSTNAME_INSTANCE may not be defined at this point.
+ * We define it locally if it is needed...
+ *
+ * If CLIENT_HOST_PRINCIPAL is defined as HOSTNAME_INSTANCE
+ * then local host is the client host principal.
+ */
+#ifndef HOSTNAME_INSTANCE
+#  define HOSTNAME_INSTANCE "localhost"
+#endif
+
+#ifndef KEYFILE
+#  define KEYFILE "id_rsa"
+#endif
 
 static struct build_info {
     char *symbol;
@@ -47,130 +62,175 @@ static struct build_info {
     { "bindir",                                bindir },
     { "sbindir",                       sbindir },
     { "libexecdir",                    libexecdir },
+    { "amlibexecdir",                  amlibexecdir },
     { "mandir",                                mandir },
     { "AMANDA_TMPDIR",                 AMANDA_TMPDIR },
     { "CONFIG_DIR",                    CONFIG_DIR },
+#ifdef MAILER
     { "MAILER",                                MAILER },
+#endif
     { "DEFAULT_SERVER",                        DEFAULT_SERVER },
     { "DEFAULT_CONFIG",                        DEFAULT_CONFIG },
     { "DEFAULT_TAPE_SERVER",           DEFAULT_TAPE_SERVER },
-    { "DEFAULT_TAPE_DEVICE",           DEFAULT_TAPE_SERVER },
+#ifdef DEFAULT_TAPE_DEVICE
+    { "DEFAULT_TAPE_DEVICE",           DEFAULT_TAPE_DEVICE },
+#endif
     { "CLIENT_LOGIN",                  CLIENT_LOGIN },
 
     { "BUILT_DATE",
 #if defined(BUILT_DATE)
        BUILT_DATE
+#else
+       NULL
 #endif
     },
     { "BUILT_MACH",
 #if defined(BUILT_MACH)
        BUILT_MACH
+#else
+       NULL
 #endif
     },
     { "CC",
 #if defined(CC)
        CC
+#else
+       NULL
 #endif
     },
 
     { "AMANDA_DBGDIR",
 #if defined(AMANDA_DBGDIR)
        AMANDA_DBGDIR
+#else
+       NULL
 #endif
     },
     { "DEV_PREFIX",
 #if defined(DEV_PREFIX)
        DEV_PREFIX
+#else
+       NULL
 #endif
     },
     { "RDEV_PREFIX",
 #if defined(RDEV_PREFIX)
-       RDEV_PREFIX },
+       RDEV_PREFIX
+#else
+       NULL
 #endif
+    },
     { "DUMP",
 #if defined(DUMP)
        DUMP
+#else
+       NULL
 #endif
     },
     { "RESTORE",
 #if defined(DUMP)
        RESTORE
+#else
+       NULL
 #endif
     },
     { "VDUMP",
 #if defined(VDUMP)
        VDUMP
+#else
+       NULL
 #endif
     },
     { "VRESTORE",
 #if defined(VDUMP)
        VRESTORE
+#else
+       NULL
 #endif
     },
     { "XFSDUMP",
 #if defined(XFSDUMP)
        XFSDUMP
+#else
+       NULL
 #endif
     },
     { "XFSRESTORE",
 #if defined(XFSDUMP)
        XFSRESTORE
+#else
+       NULL
 #endif
     },
     { "VXDUMP",
 #if defined(VXDUMP)
        VXDUMP
+#else
+       NULL
 #endif
     },
     { "VXRESTORE",
 #if defined(VXDUMP)
        VXRESTORE
+#else
+       NULL
 #endif
     },
     { "SAMBA_CLIENT",
 #if defined(SAMBA_CLIENT)
        SAMBA_CLIENT
+#else
+       NULL
 #endif
     },
     { "GNUTAR",
 #if defined(GNUTAR)
        GNUTAR
+#else
+       NULL
 #endif
     },
     { "COMPRESS_PATH",
 #if defined(COMPRESS_PATH)
        COMPRESS_PATH
+#else
+       NULL
 #endif
     },
     { "UNCOMPRESS_PATH",
 #if defined(UNCOMPRESS_PATH)
        UNCOMPRESS_PATH
+#else
+       NULL
 #endif
     },
     { "listed_incr_dir",
 #if defined(GNUTAR_LISTED_INCREMENTAL_DIR)
        GNUTAR_LISTED_INCREMENTAL_DIR
+#else
+       NULL
 #endif
     },
     { "GNUTAR_LISTED_INCREMENTAL_DIR",
 #if defined(GNUTAR_LISTED_INCREMENTAL_DIR)
        GNUTAR_LISTED_INCREMENTAL_DIR
+#else
+       NULL
 #endif
     },
 
     { "AIX_BACKUP",
 #if defined(AIX_BACKUP)
        "1"
-#endif
-    },
-    { "AIX_TAPEIO",
-#if defined(AIX_TAPEIO)
-       "1"
+#else
+       NULL
 #endif
     },
     { "DUMP_RETURNS_1",
 #if defined(DUMP_RETURNS_1)
        "1"
+#else
+       NULL
 #endif
     },
 
@@ -191,135 +251,198 @@ static struct build_info {
     { "STATFS_BSD",
 #if defined(STATFS_BSD)
        "1"
+#else
+       NULL
 #endif
     },
     { "STATFS_OSF1",
 #if defined(STATFS_OSF1)
        "1"
+#else
+       NULL
 #endif
     },
     { "STATFS_ULTRIX",
 #if defined(STATFS_ULTRIX)
        "1"
+#else
+       NULL
 #endif
     },
     { "ASSERTIONS",
 #if defined(ASSERTIONS)
        "1"
-#endif
-    },
-    { "DEBUG_CODE",
-#if defined(DEBUG_CODE)
-       "1"
+#else
+       NULL
 #endif
     },
     { "BSD_SECURITY",
 #if defined(BSD_SECURITY)
        "1"
+#else
+       NULL
 #endif
     },
     { "USE_AMANDAHOSTS",
 #if defined(USE_AMANDAHOSTS)
        "1"
+#else
+       NULL
 #endif
     },
     { "USE_RUNDUMP",
 #if defined(USE_RUNDUMP)
        "1"
+#else
+       NULL
 #endif
     },
-    { "FORCE_USERID",
-#if defined(FORCE_USERID)
+    { "CHECK_USERID",
+#if defined(CHECK_USERID)
        "1"
+#else
+       NULL
 #endif
     },
     { "USE_VERSION_SUFFIXES",
 #if defined(USE_VERSION_SUFFIXES)
        "1"
+#else
+       NULL
 #endif
     },
     { "HAVE_GZIP",
 #if defined(HAVE_GZIP)
        "1"
+#else
+       NULL
 #endif
     },
 
     { "KRB4_SECURITY",
 #if defined(KRB4_SECURITY)
        "1"
+#else
+       NULL
+#endif
+    },
+    { "SERVER_HOST_PRINCIPAL",
+#if defined(KRB4_SECURITY)
+       SERVER_HOST_PRINCIPAL
+#else
+       NULL
 #endif
     },
-    { "SERVER_HOST_PRINCIPLE",
+    { "SERVER_HOST_PRINCIPLE", /* backward-compatibility (spelling error) */
 #if defined(KRB4_SECURITY)
-       SERVER_HOST_PRINCIPLE
+       SERVER_HOST_PRINCIPAL
+#else
+       NULL
 #endif
     },
     { "SERVER_HOST_INSTANCE",
 #if defined(KRB4_SECURITY)
        SERVER_HOST_INSTANCE
+#else
+       NULL
 #endif
     },
     { "SERVER_HOST_KEY_FILE",
 #if defined(KRB4_SECURITY)
        SERVER_HOST_KEY_FILE
+#else
+       NULL
 #endif
     },
-    { "CLIENT_HOST_PRINCIPLE",
+    { "CLIENT_HOST_PRINCIPAL",
 #if defined(KRB4_SECURITY)
-       CLIENT_HOST_PRINCIPLE
+       CLIENT_HOST_PRINCIPAL
+#else
+       NULL
+#endif
+    },
+    { "CLIENT_HOST_PRINCIPLE", /* backward-compatibility (spelling error) */
+#if defined(KRB4_SECURITY)
+       CLIENT_HOST_PRINCIPAL
+#else
+       NULL
 #endif
     },
     { "CLIENT_HOST_INSTANCE",
 #if defined(KRB4_SECURITY)
        CLIENT_HOST_INSTANCE
+#else
+       NULL
 #endif
     },
     { "CLIENT_HOST_KEY_FILE",
 #if defined(KRB4_SECURITY)
        CLIENT_HOST_KEY_FILE
+#else
+       NULL
 #endif
     },
 
     { "COMPRESS_SUFFIX",
 #if defined(COMPRESS_SUFFIX)
        COMPRESS_SUFFIX
+#else
+       NULL
 #endif
     },
     { "COMPRESS_FAST_OPT",
 #if defined(COMPRESS_FAST_OPT)
        COMPRESS_FAST_OPT
+#else
+       NULL
 #endif
     },
     { "COMPRESS_BEST_OPT",
 #if defined(COMPRESS_BEST_OPT)
        COMPRESS_BEST_OPT
+#else
+       NULL
 #endif
     },
     { "UNCOMPRESS_OPT",
 #if defined(UNCOMPRESS_OPT)
        UNCOMPRESS_OPT
+#else
+       NULL
 #endif
     },
 
     { NULL,                    NULL }
 };
 
-int main(argc, argv)
-int argc;
-char **argv;
+int
+main(
+    int                argc,
+    char **    argv)
 {
-    char *result;
-    unsigned long malloc_hist_1, malloc_size_1;
-    unsigned long malloc_hist_2, malloc_size_2;
-    char *pgm;
-    char *conffile;
-    char *parmname;
+    char *result = NULL;
+    char *pgm = NULL;
+    char *parmname = NULL;
     int i;
+    int asklist;
     char number[NUM_STR_SIZE];
+    int myarg;
+    config_overwrites_t *cfg_ovr = NULL;
+    char *cfg_opt = NULL;
+    gboolean cfg_ok;
+
+    /*
+     * Configure program for internationalization:
+     *   1) Only set the message locale for now.
+     *   2) Set textdomain for all amanda related programs to "amanda"
+     *      We don't want to be forced to support dozens of message catalogs.
+     */  
+    setlocale(LC_MESSAGES, "C");
+    textdomain("amanda"); 
 
     safe_fd(-1, 0);
 
-    malloc_size_1 = malloc_inuse(&malloc_hist_1);
+    cfg_ovr = extract_commandline_config_overwrites(&argc, &argv);
 
     if((pgm = strrchr(argv[0], '/')) == NULL) {
        pgm = argv[0];
@@ -332,28 +455,40 @@ char **argv;
     signal(SIGPIPE, SIG_IGN);
 
     if(argc < 2) {
-       fprintf(stderr, "Usage: %s [config] <parmname>\n", pgm);
+       g_fprintf(stderr, _("Usage: %s [config] [--list] <parmname> [-o configoption]*\n"), pgm);
        exit(1);
     }
 
-    if (argc > 2) {
-       config_name = stralloc(argv[1]);
-       config_dir = vstralloc(CONFIG_DIR, "/", config_name, "/", NULL);
-       parmname = argv[2];
-    } else {
-       char my_cwd[STR_SIZE];
+    asklist = 0;
+    myarg = 1;
+    if (strcmp(argv[1],"--list") == 0) {
+       asklist = 1;
+       myarg = 2;
+    } else if (argc > 2 && strcmp(argv[2],"--list") == 0) {
+       asklist = 1;
+       myarg = 3;
+    } else if (argc > 2) {
+       myarg = 2;
+    }
 
-       if (getcwd(my_cwd, sizeof(my_cwd)) == NULL) {
-           error("cannot determine current working directory");
-       }
-       config_dir = stralloc2(my_cwd, "/");
-       if ((config_name = strrchr(my_cwd, '/')) != NULL) {
-           config_name = stralloc(config_name + 1);
-       }
-       parmname = argv[1];
+    if (myarg > asklist + 1)
+       cfg_opt = argv[1];
+
+    if (myarg >= argc) {
+       error(_("Must specify a parameter"));
     }
+    parmname = argv[myarg];
 
-    safe_cd();
+    /* do the config_init() now, although the result isn't checked until the end,
+     * when we try to look up config parameters */
+    cfg_ok = config_init(CONFIG_INIT_EXPLICIT_NAME | CONFIG_INIT_USE_CWD, cfg_opt);
+    if (cfg_ok) apply_config_overwrites(cfg_ovr);
+
+    safe_cd(); /* call this *after* config_init() */
+
+    /* Note that we dont use check_running_as(..) here, because we may not have a configuration
+     * (e.g., when we're examining build parameters).  If folks run this as the wrong user, that's
+     * their own problem. */
 
     /*
      * Fill in the build values that need runtime help.
@@ -364,24 +499,24 @@ char **argv;
 #else
     i = -1;
 #endif
-    snprintf(number, sizeof(number), "%ld", (long)i);
+    g_snprintf(number, SIZEOF(number), "%ld", (long)i);
     build_info[1].value = stralloc(number);
 #if defined(KRB4_SECURITY)
     i = TICKET_LIFETIME;
 #else
     i = -1;
 #endif
-    snprintf(number, sizeof(number), "%ld", (long)i);
+    g_snprintf(number, SIZEOF(number), "%ld", (long)i);
     build_info[2].value = stralloc(number);
 
 #undef p
 #define        p       "build."
 
-    if(strncmp(parmname, p, sizeof(p) - 1) == 0) {
+    if(strncmp(parmname, p, SIZEOF(p) - 1) == 0) {
        char *s;
        char *t;
 
-       t = stralloc(parmname + sizeof(p) - 1);
+       t = stralloc(parmname + SIZEOF(p) - 1);
        for(i = 0; (s = build_info[i].symbol) != NULL; i++) {
            if(strcasecmp(s, t) == 0) {
                break;
@@ -397,17 +532,17 @@ char **argv;
 #undef p
 #define        p       "dbopen."
 
-    } else if(strncmp(parmname, p, sizeof(p) - 1) == 0) {
+    } else if(strncmp(parmname, p, SIZEOF(p) - 1) == 0) {
        char *pname;
        char *dbname;
 
-       if((pname = strrchr(parmname + sizeof(p) - 1, '/')) == NULL) {
-           pname = parmname + sizeof(p) - 1;
+       if((pname = strrchr(parmname + SIZEOF(p) - 1, '/')) == NULL) {
+           pname = parmname + SIZEOF(p) - 1;
        } else {
            pname++;
        }
        set_pname(pname);
-       dbopen();
+       dbopen(DBG_SUBDIR_SERVER);
        if((dbname = dbfn()) == NULL) {
            result = stralloc("/dev/null");
        } else {
@@ -421,14 +556,15 @@ char **argv;
 #undef p
 #define        p       "dbclose."
 
-    } else if(strncmp(parmname, p, sizeof(p) - 1) == 0) {
+    } else if(strncmp(parmname, p, SIZEOF(p) - 1) == 0) {
        char *t;
        char *pname;
        char *dbname;
 
-       t = stralloc(parmname + sizeof(p) - 1);
+       t = stralloc(parmname + SIZEOF(p) - 1);
        if((dbname = strchr(t, ':')) == NULL) {
-           error("cannot parse %s", parmname);
+           error(_("cannot parse %s"), parmname);
+           /*NOTREACHED*/
        }
        *dbname++ = '\0';
        if((pname = strrchr(t, '/')) == NULL) {
@@ -444,34 +580,53 @@ char **argv;
        amfree(t);
 
     } else {
-       conffile = stralloc2(config_dir, CONFFILE_NAME);
-       if(read_conffile(conffile)) {
-           error("errors processing config file \"%s\"", conffile);
+       /* *now* we check the result of config_init */
+       if (!cfg_ok) {
+           if (cfg_opt) {
+               error(_("errors processing conf file \"%s\""), cfg_opt);
+               /*NOTREACHED*/
+           } else {
+               error(_("errors processing conf file in current directory."));
+               /*NOTREACHED*/
+           }
+       }
+
+       dbrename(config_name, DBG_SUBDIR_SERVER);
+       if (asklist) {
+           GSList *list = getconf_list(parmname);
+           GSList *iter;
+           result = stralloc("");
+
+           for (iter = list; iter != NULL; iter = iter->next) {
+               result = newvstralloc(result, result, iter->data, "\n", NULL);
+           }
+
+           g_slist_free(list);
+       } else {
+           val_t *val = getconf_byname(parmname);
+           if (val) {
+               char **dispstrs = val_t_display_strs(val, FALSE);
+               result = g_strjoinv("\n", dispstrs);
+               g_strfreev(dispstrs);
+           }
        }
-       amfree(conffile);
-       result = getconf_byname(parmname);
     }
-    if(result == NULL) {
-       result = stralloc("BUGGY");
-       fprintf(stderr, "%s: no such parameter \"%s\"\n",
+
+    if (result == NULL) {
+       g_fprintf(stderr, _("%s: no such parameter \"%s\"\n"),
                get_pname(), parmname);
        fflush(stderr);
+    } else {
+       if (asklist)
+           fputs(result, stdout); /* don't add a '\n' */
+       else
+           puts(result); /* add a '\n' */
     }
 
-    puts(result);
-
     amfree(result);
-    amfree(config_dir);
-    amfree(config_name);
     for(i = 0; i < 3; i++) {
        amfree(build_info[i].value);
     }
 
-    malloc_size_2 = malloc_inuse(&malloc_hist_2);
-
-    if(malloc_size_1 != malloc_size_2) {
-       malloc_list(fileno(stderr), malloc_hist_1, malloc_hist_2);
-    }
-
     return 0;
 }