lintian doesn't like orphan packages with uploaders...
[debian/amanda] / server-src / tapefile.c
index 52ece52ee4fba44a0f21f616dc28af4d512cbe42..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
@@ -29,6 +30,7 @@
  * routines to read and write the amanda active tape list
  */
 #include "amanda.h"
+#include "match.h"
 #include "tapefile.h"
 #include "conffile.h"
 
@@ -49,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 */
@@ -101,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");
@@ -125,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);
     }
@@ -133,7 +144,7 @@ clear_tapelist(void)
 
 tape_t *
 lookup_tapelabel(
-    char *label)
+    const char *label)
 {
     tape_t *tp;
 
@@ -182,6 +193,15 @@ lookup_nb_tape(void)
     return pos;
 }
 
+
+char *
+get_last_reusable_tape_label(
+     int skip)
+{
+    tape_t *tp = lookup_last_reusable_tape(skip);
+    return (tp != NULL) ? tp->label : NULL;
+}
+
 tape_t *
 lookup_last_reusable_tape(
      int skip)
@@ -259,6 +279,9 @@ remove_tapelabel(
        }
        amfree(tp->datestamp);
        amfree(tp->label);
+       amfree(tp->meta);
+       amfree(tp->comment);
+       amfree(tp->barcode);
        amfree(tp);
     }
 }
@@ -273,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;
@@ -344,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';
@@ -387,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;
@@ -470,12 +516,12 @@ stamp2time(
     return mktime(tm);
 }
 
-void
-print_new_tapes(
-    FILE *output,
-    int   nb)
+char *
+list_new_tapes(
+    int nb)
 {
     tape_t *lasttp, *iter;
+    char *result = NULL;
 
     /* Find latest reusable new tape */
     lasttp = lookup_tapepos(lookup_nb_tape());
@@ -495,23 +541,36 @@ print_new_tapes(
        }
 
        if(c == 1) {
-           g_fprintf(output,
-                     _("The next new tape already labelled is: %s.\n"),
-                     lasttp->label);
+           result = g_strdup_printf(
+                       _("The next new tape already labelled is: %s."),
+                       lasttp->label);
        } else {
-           g_fprintf(output,
-                     _("The next %d new tapes already labelled are: %s"),
-                     c, lasttp->label);
+           result = g_strdup_printf(
+                       _("The next %d new tapes already labelled are: %s"),
+                       c, lasttp->label);
            iter = lasttp->prev;
            c--;
            while(iter && c > 0 && strcmp(iter->datestamp,"0") == 0) {
                if (iter->reuse) {
-                   g_fprintf(output, ", %s", iter->label);
+                   result = vstrextend(&result, ", ", iter->label, NULL);
                    c--;
                }
                iter = iter->prev;
            }
-           g_fprintf(output, ".\n");
        }
     }
+    return result;
+}
+
+void
+print_new_tapes(
+    FILE *output,
+    int   nb)
+{
+    char *result = list_new_tapes(nb);
+
+    if (result) {
+       g_fprintf(output,"%s\n", result);
+       amfree(result);
+    }
 }