lintian doesn't like orphan packages with uploaders...
[debian/amanda] / server-src / cmdline.c
index 4a08dad0f1cfab5d11002535a7adb14010f90e83..c7894216510aef949bca425d2fa5ca9518a2099d 100644 (file)
@@ -1,9 +1,10 @@
 /*
- * Copyright (c) 2007, 2008, 2009, 2010 Zmanda, Inc.  All Rights Reserved.
+ * Copyright (c) 2007-2012 Zmanda, Inc.  All Rights Reserved.
  * 
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published
- * by the Free Software Foundation.
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
  * 
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -25,8 +26,8 @@
  * Utility routines for handling command lines.
  */
 
-#include <ctype.h>
 #include "amanda.h"
+#include <ctype.h>
 #include "match.h"
 #include "cmdline.h"
 #include "holding.h"
@@ -36,7 +37,8 @@ dumpspec_new(
     char *host, 
     char *disk, 
     char *datestamp,
-    char *level)
+    char *level,
+    char *write_timestamp)
 {
     dumpspec_t *rv;
 
@@ -45,6 +47,7 @@ dumpspec_new(
     if (disk) rv->disk = stralloc(disk);
     if (datestamp) rv->datestamp = stralloc(datestamp);
     if (level) rv->level = stralloc(level);
+    if (write_timestamp) rv->write_timestamp = stralloc(write_timestamp);
 
     return rv;
 }
@@ -58,6 +61,7 @@ dumpspec_free(
     if (dumpspec->disk) free(dumpspec->disk);
     if (dumpspec->datestamp) free(dumpspec->datestamp);
     if (dumpspec->level) free(dumpspec->level);
+    if (dumpspec->write_timestamp) free(dumpspec->write_timestamp);
     free(dumpspec);
 }
 
@@ -86,11 +90,16 @@ cmdline_parse_dumpspecs(
     enum { ARG_GET_HOST, ARG_GET_DISK, ARG_GET_DATESTAMP, ARG_GET_LEVEL } arg_state = ARG_GET_HOST;
 
     while (optind < argc) {
+       char *new_name = NULL;
         name = argv[optind];
+       if (flags & CMDLINE_EXACT_MATCH  && *name != '=') {
+           new_name = g_strconcat("=", name, NULL);
+           name = new_name;
+       }
         switch (arg_state) {
             case ARG_GET_HOST:
                 arg_state = ARG_GET_DISK;
-                dumpspec = dumpspec_new(name, NULL, NULL, NULL);
+                dumpspec = dumpspec_new(name, NULL, NULL, NULL, NULL);
                list = g_slist_append(list, (gpointer)dumpspec);
                 break;
 
@@ -109,12 +118,14 @@ cmdline_parse_dumpspecs(
                 arg_state = ARG_GET_HOST;
                if (!(flags & CMDLINE_PARSE_LEVEL)) continue;
                 if (name[0] != '\0'
+                   && !(flags & CMDLINE_EXACT_MATCH)
                     && (errstr=validate_regexp(name)) != NULL) {
                     error(_("bad level regex \"%s\": %s\n"), name, errstr);
                 }
                 dumpspec->level = stralloc(name);
                 break;
         }
+       amfree(new_name);
 
        optind++;
     }
@@ -124,7 +135,7 @@ cmdline_parse_dumpspecs(
     if (list == NULL && (flags & CMDLINE_EMPTY_TO_WILDCARD)) {
         dumpspec = dumpspec_new("", "", 
                (flags & CMDLINE_PARSE_DATESTAMP)?"":NULL,
-               (flags & CMDLINE_PARSE_LEVEL)?"":NULL);
+               (flags & CMDLINE_PARSE_LEVEL)?"":NULL, "");
        list = g_slist_append(list, (gpointer)dumpspec);
     }
 
@@ -244,7 +255,7 @@ cmdline_match_holding(
        dumpfile_free_data(&file);
     }
 
-    g_slist_free_full(holding_files);
+    slist_free_full(holding_files, g_free);
 
     return matching_files;
 }