lintian doesn't like orphan packages with uploaders...
[debian/amanda] / server-src / tapefile.c
index d3afe12bbfd42bb467554ad395c48578e3f1b581..35cbef231c1619a5c7e8f90f6bba25650ec61ef1 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Amanda, The Advanced Maryland Automatic Network Disk Archiver
  * Copyright (c) 1991-1998 University of Maryland at College Park
+ * Copyright (c) 2007-2012 Zmanda, Inc.  All Rights Reserved.
  * All Rights Reserved.
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -50,7 +51,7 @@ read_tapelist(
     char *line = NULL;
     int status = 0;
 
-    tape_list = NULL;
+    clear_tapelist();
     if((tapef = fopen(tapefile,"r")) == NULL) {
        if (errno == ENOENT) {
            /* no tapelist is equivalent to an empty tapelist */
@@ -102,6 +103,12 @@ write_tapelist(
        g_fprintf(tapef, "%s %s", tp->datestamp, tp->label);
        if(tp->reuse) g_fprintf(tapef, " reuse");
        else g_fprintf(tapef, " no-reuse");
+       if (tp->barcode)
+           g_fprintf(tapef, " BARCODE:%s", tp->barcode);
+       if (tp->meta)
+           g_fprintf(tapef, " META:%s", tp->meta);
+       if (tp->blocksize)
+           g_fprintf(tapef, " BLOCKSIZE:%jd", (intmax_t)tp->blocksize);
        if (tp->comment)
            g_fprintf(tapef, " #%s", tp->comment);
        g_fprintf(tapef, "\n");
@@ -126,6 +133,9 @@ clear_tapelist(void)
     for(tp = tape_list; tp; tp = next) {
        amfree(tp->label);
        amfree(tp->datestamp);
+       amfree(tp->barcode);
+       amfree(tp->meta);
+       amfree(tp->comment);
        next = tp->next;
        amfree(tp);
     }
@@ -269,6 +279,9 @@ remove_tapelabel(
        }
        amfree(tp->datestamp);
        amfree(tp->label);
+       amfree(tp->meta);
+       amfree(tp->comment);
+       amfree(tp->barcode);
        amfree(tp);
     }
 }
@@ -283,7 +296,7 @@ add_tapelabel(
 
     /* insert a new record to the front of the list */
 
-    new = (tape_t *) alloc(SIZEOF(tape_t));
+    new = g_new0(tape_t, 1);
 
     new->datestamp = stralloc(datestamp);
     new->position = 0;
@@ -354,21 +367,21 @@ parse_tapeline(
     tape_t *tp = NULL;
     char *s, *s1;
     int ch;
+    char *cline;
 
     *status = 0;
-    tp = (tape_t *) alloc(SIZEOF(tape_t));
-
-    tp->prev = NULL;
-    tp->next = NULL;
 
     s = line;
     ch = *s++;
 
     skip_whitespace(s, ch);
     if(ch == '\0') {
-       amfree(tp);
        return NULL;
     }
+
+    cline = g_strdup(line);
+    tp = g_new0(tape_t, 1);
+
     s1 = s - 1;
     skip_non_whitespace(s, ch);
     s[-1] = '\0';
@@ -397,10 +410,33 @@ parse_tapeline(
        skip_whitespace(s, ch);
     }
 
+    if (strncmp_const(s - 1, "BARCODE:") == 0) {
+       s1 = s - 1 + 8;
+       skip_non_whitespace(s, ch);
+       s[-1] = '\0';
+       skip_whitespace(s, ch);
+       tp->barcode = stralloc(s1);
+    }
+
+    if (strncmp_const(s - 1, "META:") == 0) {
+       s1 = s - 1 + 5;
+       skip_non_whitespace(s, ch);
+       s[-1] = '\0';
+       skip_whitespace(s, ch);
+       tp->meta = stralloc(s1);
+    }
+
+    if (strncmp_const(s - 1, "BLOCKSIZE:") == 0) {
+       s1 = s - 1 + 10;
+       skip_non_whitespace(s, ch);
+       s[-1] = '\0';
+       skip_whitespace(s, ch);
+       tp->blocksize = atol(s1);
+    }
     if (*(s - 1) == '#') {
        tp->comment = stralloc(s); /* skip leading '#' */
-    } else {
-       tp->comment = NULL;
+    } else if (*(s-1)) {
+       g_critical("Bogus line in the tapelist file: %s", cline);
     }
 
     return tp;