📄 label_tape.c
字号:
usage(argv[0], mode); break; case MODE_CART_CTL: have_loc_arg = have_loadp_arg = have_drive_arg = have_slot_arg = -1; i = goptions(-argc, (UChar **) argv, "s:s;b:i;b:m;b:l;b:t;b:e;s-1:P;s-1:S;s-1:L;s-1:D;s:C;s:d;" "b:F;b:f;s:c;s:n;i:b;b:r", &configfile, &cctl_inventory, &cctl_move, &cctl_list, &cctl_label, &cctl_eject, &have_loc_arg, &locstr, &have_slot_arg, &slotstr, &have_loadp_arg, &loadportstr, &have_drive_arg, &drivestr, &cartstr, &given_changer, &forced, &dont_ask, &changerconffile, &comment, &tapeblocksize, &delfromhd); if(i) usage(argv[0], mode); break; case MODE_CART_IS: i = goptions(-argc, (UChar **) argv, "s:c;s:d;i2:i;i-1:;i:S", &configfile, &devicename, &cartis_wcart, &cartis_wfile, &have_cartis_cart, &cartis_cart, &cartridge_set); if(i) usage(argv[0], mode); break; } remoteuser = getenv(REMOTEUSERENVVAR); if(!remoteuser) remoteuser = ""; clientuname = getenv(REMOTEHOSTENVVAR); if(!clientuname) clientuname = ""; return(0);}main(int argc, char ** argv){ Int32 i; FILE *fp; struct stat statb; UChar *backuphome, **cpptr, *line = NULL, *cptr;#ifdef ENABLE_NLS setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE);#endif programfile = find_program(argv[0]); if(!programfile){ cptr = FN_LASTDIRDELIM(argv[0]); if(cptr) cptr++; else cptr = argv[0]; EM__(programfile = strapp(DEFSERVBINDIR FN_DIRSEPSTR, cptr)); if(access(programfile, X_OK)){ fprintf(stderr, T_("Error: Cannot find program file of `%s'"), argv[0]); exit(4); } } cptr = FN_BASENAME((UChar *) argv[0]); for(i = 0; i < sizeof(cmd_res) / sizeof(*cmd_res); i++){ if(re_find_match_once(cmd_res[i], cptr, NULL, NULL) >= 0){ mode = i; break; } } if(mode < 0){ fprintf(stderr, T_("Error: Command name %s not recognized.\n"), cptr); do_exit(1); } interactive = isatty(0); get_prog_options(argc, argv, mode); if(scnd_label == -1) scnd_label = scnd_label_arg = -2; /* no 2nd label given */ cptr = mkabspath(programfile, NULL); programdir = resolve_path__(cptr, NULL); free(cptr); SETZERO(default_stat); if(!stat(programdir, &statb)) COPYVAL(default_stat, statb); else fprintf(stderr, T_("Warning: Cannot find program file of `%s'"), argv[0]); /* determine home directory */ backuphome = getenv("BACKUP_HOME"); if(!backuphome){ /* construct file- and dirnames */#ifdef ORIG_DEFAULTS backuphome = programdir; if( (cptr = FN_LASTDIRDELIM(programdir)) ) *(cptr) = '\0'; if( (cptr = FN_LASTDIRDELIM(programdir)) ) *(cptr) = '\0'; bindir = strapp(programdir, FN_DIRSEPSTR "bin"); libdir = strapp(programdir, FN_DIRSEPSTR "lib"); confdir = strapp(programdir, FN_DIRSEPSTR "etc");#else /* defined(ORIG_DEFAULTS) */ bindir = strdup(DEFSERVBINDIR); libdir = strdup(DEFSERVLIBDIR); confdir = strdup(DEFSERVCONFDIR);#endif /* if else defined(ORIG_DEFAULTS) */ } else { EM__(backuphome = strdup(backuphome)); /* construct file- and dirnames */ bindir = strapp(backuphome, FN_DIRSEPSTR "bin"); libdir = strapp(backuphome, FN_DIRSEPSTR "lib"); confdir = strapp(backuphome, FN_DIRSEPSTR "etc"); } if(!bindir || !libdir || !confdir) nomemfatal(NULL); if(!configfile){ for(cpptr = default_configfilenames; *cpptr; cpptr++); EM__(*cpptr = strapp(confdir, FN_DIRSEPSTR DEFSERVERCONF)); for(cpptr = default_configfilenames; *cpptr; cpptr++){ configfile = *cpptr; if(!stat(*cpptr, &statb) && access(*cpptr, R_OK)){ while(*cpptr) cpptr++; break; } if(!stat(*cpptr, &statb)) break; } configfile = *cpptr; } if(!configfile){ fp = fopen("/etc/inetd.conf", "r"); if(fp){ forever{ if(line) ZFREE(line); line = fget_alloc_str(fp); if(!line) break; if(strstr(line, bindir)){ cptr = first_nospace(line); if(*cptr == '#') continue; cptr = line + strlen(line) - 1; while(isspace(*cptr) && cptr > line) cptr--; *(cptr + 1) = '\0'; while(!isspace(*cptr) && cptr > line) cptr--; cptr++; if(!access(cptr, R_OK)) EM__(configfile = strdup(cptr)); break; } } fclose(fp); } else{ fp = fopen("/etc/xinetd.conf", "r"); if(fp){ forever{ if(line) ZFREE(line); line = fget_alloc_str(fp); if(!line) break; if(strstr(line, bindir) && re_find_match_once("^[ \t]*server_args[ \t]*=", line, NULL, NULL)){ cptr = first_nospace(line); if(*cptr == '#') continue; cptr = line + strlen(line) - 1; while(isspace(*cptr) && cptr > line) cptr--; *(cptr + 1) = '\0'; while(!isspace(*cptr) && cptr > line) cptr--; cptr++; if(!access(cptr, R_OK)) EM__(configfile = strdup(cptr)); break; } } fclose(fp); } } } if(!configfile){ fprintf(stderr, T_("Warning: Cannot determine server side configuration file, using defaults.\n")); configfile = "<configuration file not specified>"; } else{ i = read_param_file(configfile, entries, sizeof(entries) / sizeof(entries[0]), NULL, NULL); if(i){ fprintf(stderr, T_("Error: Cannot read configuration file `%s'.\n"), configfile); exit(3); } } get_prog_options(argc, argv, mode); if(devicelock.lockfile) if(empty_string(devicelock.lockfile)) devicelock.lockfile = NULL; if(vardir) if(empty_string(vardir)) vardir = NULL; if(devicelock.lockfile) massage_string(devicelock.lockfile); if(vardir) massage_string(vardir); if(!setfilecmd) EM__(setfilecmd = strdup(DEFAULT_SETFILECMD)); if(devicesstr) if(empty_string(devicesstr)) ZFREE(devicesstr); if(!devicename){ if(!devicesstr) EM__(devicesstr = strdup(DEFAULT_TAPE_DEVICE)); if(devicesstr){ if( (i = devices_from_confstr_msg(devicesstr, &streamers, &num_streamers, &changers, &num_changers, stderr)) ) exit(27); set_devices(curdevidx); } } if(strlen(comment) > 256){ fprintf(stderr, T_("Warning: Comment longer than 256 characters, truncated.\n")); comment[256] = '\0'; } if(!vardir)#ifndef ORIG_DEFAULTS vardir = strdup(DEFSERVVARDIR);#else vardir = strapp(backuphome, FN_DIRSEPSTR "var");#endif nomemfatal(vardir); bytesontape_file = strapp(vardir, FN_DIRSEPSTR BYTESONTAPE_FILE); precious_tapes_file = strapp(vardir, FN_DIRSEPSTR PRECIOUS_TAPES_FILE); cartorder_file = strapp(vardir, FN_DIRSEPSTR CARTRIDGE_ORDER_FILE); ro_tapes_file = strapp(vardir, FN_DIRSEPSTR READONLY_TAPES_FILE); cartloc_file = strapp(vardir, FN_DIRSEPSTR CARTRIDGE_LOCATION_FILE); used_blocksizes_file = strapp(vardir, FN_DIRSEPSTR USED_BLOCKSIZES_FILE); client_message_file = strapp(vardir, FN_DIRSEPSTR CLIENT_MESSAGE_FILE); if(!bytesontape_file || !precious_tapes_file || !cartloc_file || !ro_tapes_file || !cartorder_file || !used_blocksizes_file || !client_message_file){ nomemfatal(NULL); } if(!tapeposfile) EM__(tapeposfile = strdup(DEFAULT_TAPEPOSFILE)); if(!user_to_inform) EM__(user_to_inform = strdup(DEFAULT_USERTOINFORM)); if(!mail_program) EM__(mail_program = strdup(DEFAULT_MAILPROGRAM)); cptr = mail_program; EM__(mail_program = repl_substring(mail_program, "%u", user_to_inform)); free(cptr); if(!devicelock.lockfile) devicelock.lockfile = select_lockfile(DEFAULT_SERVERLOCKFILE); EEM__(repl_dirs(&devicelock.lockfile) || repl_dirs(&mail_program) || repl_dirs(&setfilecmd) || repl_dirs(&tapeposfile)); if(loggingfile) EEM__(repl_dirs(&loggingfile)); cptr = repl_substring(setfilecmd, "%d", devicename); free(setfilecmd); setfilecmd = repl_substring(cptr, "%n", "1"); free(cptr); cptr = setfilecmd; setfilecmd = repl_substring(cptr, "%m", "0"); free(cptr); i = uname(&unam); if(i < 0) strcpy(unam.nodename, "???"); infobuffersize = (INFOBLOCKSIZE / tapeblocksize + 1) * tapeblocksize; infobuffer = (UChar *) malloc_forced(infobuffersize * sizeof(UChar)); if(!infobuffer){ nomemfatal(NULL); } if(mode == MODE_CART_CTL) do_exit(cart_ctl(argc, (UChar **) argv)); if(mode == MODE_LABEL_TAPE) do_exit(label_tape(argc, (UChar **) argv)); if(mode == MODE_CART_IS) do_exit(cart_is(argc, (UChar **) argv)); fprintf(stderr, "Internal Implementation error, Please report: label_tape.c, mode\n"); exit(37);}static intlabel_tape(Int32 argc, UChar ** argv){ unsigned long omode; Uns32Range *tape_ranges; UChar cbuf[30], *cptr; Flag ask_ow = NO, title_pr = NO; Int32 num_entries = 0, i, n; int fd, i1; KeyValuePair *allentries = NULL; struct stat statb; memset(infobuffer, 0, sizeof(UChar) * infobuffersize); if(!query){ if(label < 1 || label > num_cartridges){ fprintf(stderr, T_("Error: Illegal cartridge label (must be in the range 1 - %d).\n"), (int) num_cartridges); return(7); } if(scnd_label < 1){ if(!(scnd_label == -2 && scnd_label_arg)) /* argument is given */ fprintf(stderr, T_("Warning: Illegal secondary label (must be >= 1), ignored.\n")); scnd_label = label; } } /* The following is to keep the server from possible */ /* probing, whether there is a tape in the drive, cause */ /* this would probably make the tape being ejected, */ /* while we want to write a label to it ... */ /* if we don't get the lock, c'est la vie */ /* F_OK is often 0 (???), so an or-ed mask can't be used */ if(!query && !access(CARTREADY_FILE, F_OK) && !access(CARTREADY_FILE, W_OK)) waitlockfd = set_wlock_timeout(CARTREADY_FILE, 2000); if(!query && !dont_ask){ printf(T_("You are about to write a label at the beginning of the tape.\n")); printf(T_("All data on this tape will be lost and it will become very\n")); printf(T_("expensive to get anything back, possibly nothing at all.\n")); printf(T_("\nDo you want to continue ? [y/n] ")); fflush(stdout); if(!interactive){ fprintf(stderr, T_("\nCannot read confirmation from TTY. Exiting.\n")); return(13); } if(wait_for_input(0, 120) < 1){ fprintf(stderr, T_("\nTimeout on input, exiting.\n")); return(15); } cbuf[0] = '\0'; while(!fgets(cbuf, 20, stdin)); if(cbuf[0] != 'y' && cbuf[0] != 'Y') return(0); fprintf(stdout, "\n"); } if(set_lock_msg(&devicelock, forced, !interactive) != BU_GOT_LOCK && !forced) return(9); i = system(setfilecmd); if(i < 0 || WEXITSTATUS(i)){ fprintf(stderr, T_("Warning: Cannot rewind tape.\n")); } i = stat(devicename, &statb); if(i){ fprintf(stderr, T_("Error: Cannot stat tape device %s\n"), devicename); return(11); } COPYVAL(devstatb, statb); if(IS_DIRECTORY(statb)){ EM__(cptr = strapp(devicename, FN_DIRSEPSTR "data.0")); free(devicename); devicename = cptr; } label_given = 0; if((i = find_tape_blocksize(devicename, &cptr)) > 0){ memcpy(infobuffer, cptr, MIN(i, infobuffersize) * sizeof(UChar)); free(cptr); label_given = 1; if(!strstr(infobuffer, INFOHEADER)) label_given = 0; infobuffer[infobuffersize - 1] = '\0'; } else{ if(query){ if(!IS_DIRECTORY(statb) && !IS_REGFILE(statb)){ fprintf(stderr, T_("Error: Cannot read from tape device `%s'.\n"), devicename); return(8); } } } i = system(setfilecmd); if(i < 0 || WEXITSTATUS(i)){ fprintf(stderr, T_("Warning: Cannot rewind tape.\n")); } if(query && !only_read_label){ if(label_given) fprintf(stdout, "%s\n", infobuffer); else fprintf(stderr, T_("<Cannot read label>\n")); } if(!query){ ask_ow = NO; if(label_given && (cptr = strstr(infobuffer, CARTNOTEXT))){ if(cptr){ n = sscanf(cptr + strlen(CARTNOTEXT), "%d", &i1); if(n > 0){ actcart = i1; tape_ranges = get_readonly_tapes(); if(tape_ranges){ if(in_Uns32Ranges(tape_ranges, actcart)){ fprintf(stdout, T_("Cartridge %d is among the read-only tapes\n"), (int) actcart); ask_ow = YES; } free(tape_ranges); } allentries = kfile_getall(precious_tapes_file, &num_entries, KFILE_LOCKED); if(allentries){ title_pr = NO; for(i = 0; i < num_entries; i++){ tape_ranges = sscan_Uns32Ranges(allentries[i].value, 1, num_cartridges, NULL, NULL); if(in_Uns32Ranges(tape_ranges, actcart)){ if(!title_pr){ fprintf(stdout, T_("Cartridge %d is needed by the" " following clients for restore:\n"), (int) actcart); title_pr = YES; } ask_ow = YES; fprintf(stdout, "%s\n", allentries[i].key); } free(tape_ranges); } kfile_freeall(allentries, num_entries); } if(ask_ow && !delfromhd && !dont_ask){ printf(T_("Do you want to delete cartridge %d \nfrom the" " cartridge handling database ?\n"), (int) actcart); fflush(stdout); if(!interactive){ fprintf(stderr, T_("Cannot read confirmation from TTY. Exiting.\n")); return(14); } if(wait_for_input(0, 120) < 1){ fprintf(stderr, T_("Timeout on input, exiting.\n")); return(15); } cbuf[0] = '\0'; while(!fgets(cbuf, 20, stdin)); if(cbuf[0] == 'y' || cbuf[0] == 'Y') delfromhd = YES; } if(delfromhd){ delete_tape(actcart); fprintf(stdout, T_("Cartridge %d is %s in cartridge management.\n"), (int) actcart, (actcart == label ? T_("reinitialized") : T_("deleted")));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -