taperscan.c
来自「开源备份软件源码 AMANDA, the Advanced Marylan」· C语言 代码 · 共 586 行 · 第 1/2 页
C
586 行
if (label_result == 1 || label_result == 3 || (label_result == 2 && !ct->backwards)) { *(ct->tapedev) = stralloc(device); ct->tape_status = label_result; amfree(ct->slotstr); ct->slotstr = stralloc(slotstr); result = 1; } else { if ((label_result == 2) && (ct->first_labelstr_slot == NULL)) ct->first_labelstr_slot = stralloc(slotstr); result = 0; } break; } ct->output_callback(ct->output_data, *(ct->error_message)); amfree(*(ct->error_message)); return result;}static int scan_init( void *data, int rc, G_GNUC_UNUSED int nslots, int backwards, G_GNUC_UNUSED int searchable){ changertrack_t *ct = ((changertrack_t*)data); if (rc) { *(ct->error_message) = newvstrallocf(*(ct->error_message), _("%scould not get changer info: %s\n"), *(ct->error_message), changer_resultstr); ct->output_callback(ct->output_data, *(ct->error_message)); amfree(*(ct->error_message)); } ct->backwards = backwards; return 0;}intchanger_taper_scan( char *wantlabel, char **gotlabel, char **timestamp, char **tapedev, taper_scan_tracker_t * tracker, TaperscanOutputFunctor taperscan_output_callback, void *output_data, TaperscanProlongFunctor prolong_callback, void * prolong_data){ char *error_message = NULL; changertrack_t local_data; char *outslotstr = NULL; int result; *gotlabel = *timestamp = *tapedev = NULL; local_data.wantlabel = wantlabel; local_data.gotlabel = gotlabel; local_data.timestamp = timestamp; local_data.error_message = &error_message; local_data.tapedev = tapedev; local_data.first_labelstr_slot = NULL; local_data.backwards = 0; local_data.tape_status = 0; local_data.output_callback = taperscan_output_callback; local_data.output_data = output_data; local_data.prolong_callback = prolong_callback; local_data.prolong_data = prolong_data; local_data.persistent = tracker; local_data.slotstr = NULL; changer_find(&local_data, scan_init, scan_slot, wantlabel); if (*(local_data.tapedev)) { /* We got it, and it's loaded. */ if (local_data.persistent != NULL && local_data.slotstr != NULL) { g_hash_table_insert(local_data.persistent->scanned_slots, local_data.slotstr, NULL); } else { amfree(local_data.slotstr); } amfree(local_data.first_labelstr_slot); return local_data.tape_status; } else if (local_data.first_labelstr_slot) { /* Use plan B. */ if (prolong_callback && !prolong_callback(prolong_data)) { return -1; } result = changer_loadslot(local_data.first_labelstr_slot, &outslotstr, tapedev); amfree(local_data.first_labelstr_slot); amfree(outslotstr); if (result == 0) { amfree(*gotlabel); amfree(*timestamp); result = scan_read_label(*tapedev, NULL, NULL, gotlabel, timestamp, &error_message); taperscan_output_callback(output_data, error_message); amfree(error_message); if (result > 0 && local_data.persistent != NULL && local_data.slotstr != NULL) { g_hash_table_insert(local_data.persistent->scanned_slots, local_data.slotstr, NULL); } else { amfree(local_data.slotstr); } return result; } } /* Didn't find a tape. :-( */ assert(local_data.tape_status <= 0); return -1;}int taper_scan(char* wantlabel, char** gotlabel, char** timestamp, char** tapedev, taper_scan_tracker_t * tracker, TaperscanOutputFunctor output_functor, void *output_data, TaperscanProlongFunctor prolong_functor, void *prolong_data) { char *error_message = NULL; int result; *gotlabel = *timestamp = NULL; if (wantlabel == NULL) { tape_t *tmp; tmp = lookup_last_reusable_tape(0); if (tmp != NULL) { wantlabel = tmp->label; } } if (changer_init()) { result = changer_taper_scan(wantlabel, gotlabel, timestamp, tapedev, tracker, output_functor, output_data, prolong_functor, prolong_data); } else { /* Note that the tracker is not used in this case. */ *tapedev = stralloc(getconf_str(CNF_TAPEDEV)); if (*tapedev == NULL) { result = -1; output_functor(output_data, _("No tapedev specified")); } else { result = scan_read_label(*tapedev, NULL, wantlabel, gotlabel, timestamp, &error_message); output_functor(output_data, error_message); amfree(error_message); } } return result;}#define AUTO_LABEL_MAX_LEN 1024char *find_brand_new_tape_label(void){ char *format; char newlabel[AUTO_LABEL_MAX_LEN]; char tmpnum[30]; /* 64-bit integers can be 21 digists... */ char tmpfmt[16]; char *auto_pos = NULL; int i; ssize_t label_len, auto_len; tape_t *tp; if (!getconf_seen(CNF_LABEL_NEW_TAPES)) { return NULL; } format = getconf_str(CNF_LABEL_NEW_TAPES); memset(newlabel, 0, AUTO_LABEL_MAX_LEN); label_len = 0; auto_len = -1; /* Only find the first '%' */ while (*format != '\0') { if (label_len + 4 > AUTO_LABEL_MAX_LEN) { g_fprintf(stderr, _("Auto label format is too long!\n")); return NULL; } if (*format == '\\') { /* Copy the next character. */ newlabel[label_len++] = format[1]; format += 2; } else if (*format == '%' && auto_len == -1) { /* This is the format specifier. */ auto_pos = newlabel + label_len; auto_len = 0; while (*format == '%' && label_len < AUTO_LABEL_MAX_LEN) { newlabel[label_len++] = '%'; auto_len ++; format ++; } } else { /* Just copy a character. */ newlabel[label_len++] = *(format++); } } /* Sometimes we copy the null, sometimes not. */ if (newlabel[label_len] != '\0') { newlabel[label_len++] = '\0'; } if (auto_pos == NULL) { g_fprintf(stderr, _("Auto label template contains no '%%'!\n")); return NULL; } g_snprintf(tmpfmt, SIZEOF(tmpfmt), "%%0%zdd", (size_t)auto_len); for (i = 1; i < INT_MAX; i ++) { g_snprintf(tmpnum, SIZEOF(tmpnum), tmpfmt, i); if (strlen(tmpnum) != (size_t)auto_len) { g_fprintf(stderr, _("All possible auto-labels used.\n")); return NULL; } strncpy(auto_pos, tmpnum, (size_t)auto_len); tp = lookup_tapelabel(newlabel); if (tp == NULL) { /* Got it. Double-check that this is a labelstr match. */ if (!match(getconf_str(CNF_LABELSTR), newlabel)) { g_fprintf(stderr, _("New label %s does not match labelstr %s from amanda.conf\n"), newlabel, getconf_str(CNF_LABELSTR)); return 0; } return stralloc(newlabel); } } /* Should not get here unless you have over two billion tapes. */ g_fprintf(stderr, _("Taper internal error in find_brand_new_tape_label.")); return 0;}voidFILE_taperscan_output_callback( void *data, char *msg){ if(!msg) return; if(strlen(msg) == 0) return; if(data) g_fprintf((FILE *)data, "%s", msg); else g_printf("%s", msg);}voidCHAR_taperscan_output_callback( /*@keep@*/ void *data, char *msg){ char **s = (char **)data; if(!msg) return; if(strlen(msg) == 0) return; if(*s) strappend(*s, msg); else *s = stralloc(msg);}taper_scan_tracker_t * taper_scan_tracker_new(void) { taper_scan_tracker_t * rval = malloc(sizeof(*rval)); rval->scanned_slots = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); return rval;}void taper_scan_tracker_free(taper_scan_tracker_t * tracker) { if (tracker->scanned_slots != NULL) { g_hash_table_destroy(tracker->scanned_slots); } free(tracker);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?