⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 label_tape.c

📁 一套客户/服务器模式的备份系统代码,跨平台,支持linux,AIX, IRIX, FreeBSD, Digital Unix (OSF1), Solaris and HP-UX.
💻 C
📖 第 1 页 / 共 5 页
字号:
	  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 + -