X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=server-src%2Ftapefile.c;h=faf58759bb510625a11337a4c8751b035cda8552;hb=949b8910a5e23c4285d0b1aedacfc82a14dc97a5;hp=52ece52ee4fba44a0f21f616dc28af4d512cbe42;hpb=2627875b7d18858bc1f9f7652811e4d8c15a23eb;p=debian%2Famanda diff --git a/server-src/tapefile.c b/server-src/tapefile.c index 52ece52..faf5875 100644 --- a/server-src/tapefile.c +++ b/server-src/tapefile.c @@ -29,6 +29,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 +50,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 +102,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 +132,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 +143,7 @@ clear_tapelist(void) tape_t * lookup_tapelabel( - char *label) + const char *label) { tape_t *tp; @@ -182,6 +192,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 +278,9 @@ remove_tapelabel( } amfree(tp->datestamp); amfree(tp->label); + amfree(tp->meta); + amfree(tp->comment); + amfree(tp->barcode); amfree(tp); } } @@ -273,7 +295,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; @@ -346,19 +368,17 @@ parse_tapeline( int ch; *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; } + + tp = g_new0(tape_t, 1); + s1 = s - 1; skip_non_whitespace(s, ch); s[-1] = '\0'; @@ -387,10 +407,31 @@ 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; } return tp; @@ -470,12 +511,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 +536,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); + } }