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

📄 server.c

📁 一套客户/服务器模式的备份系统代码,跨平台,支持linux,AIX, IRIX, FreeBSD, Digital Unix (OSF1), Solaris and HP-UX.
💻 C
📖 第 1 页 / 共 5 页
字号:
Int32	send_clientmsg();Int32	proof_authentication();Int32	wait_for_service(Int8, Flag);void	sig_handler();Int32	create_streamer_buffer();void	dismiss_streamer_buffer();Flag	check_interrupted();Int32	set_lock(LockData *, Int8);Int32	release_lock(LockData *);void	register_pref_serv();Int32	get_input(UChar *);Int32	process_tape_ops(Flag, Flag);Int32	check_access_cmd();Int32	change_tapeblocksize(Int32, UChar **, Int32 *, Flag *);Int32	find_tape_blocksize(UChar *, UChar **, Flag);#ifdef	HAVE_POSIX_THREADSInt32	start_buffer_thread();Int32	end_buffer_thread();#endifvoidlogmsg(int prio, UChar * fmt, ...){  va_list	args;  FILE		*fp, *lfp = NULL;  va_start(args, fmt);  if(loggingfile)    lfp = fopen(loggingfile, "a");  fp = (lfp ? lfp : stderr);  fprintf(fp, "%s, ", actimestr());  vfprintf(fp, fmt, args);  fflush(fp);  if(lfp)    fclose(lfp);  if(syslog_ident)    gvsyslog(syslog_ident, LOG_CONS | LOG_PID, LOG_DAEMON, prio, fmt, args);  va_end(args);}voidfatal(UChar * msg){  logmsg(LOG_CRIT, "%s", msg);  do_exit(1);}voidnomemfatal(void * ptr){  if(!ptr)    fatal("Error: Cannot allocate memory.\n");}voiddo_exit(int exitst){  if(exiting){    DB("Internal error, do_exit loops.\n", 0, 0, 0);    return;  }  exiting = YES;	/* just in case, if we have produced a loop */  closetape(YES);  if(streamerbuf_memfile)    unlink(streamerbuf_memfile);  register_pref_serv();  release_lock(&g_lock);  if(interrupted){    logmsg(LOG_WARNING, T_("Interrupted, going to exit.\n"));  }  else{    if(exitst)	logmsg(LOG_ERR, T_("Exiting with bad status %d, most recent system error: %s\n"), exitst,				strerror(errno));  }  ms_sleep(1000 * 1);  exit(exitst);}static voidset_devices(Int32 idx){  devicename = streamers[idx].devicename;  if(streamers[idx].changer)    changername = streamers[idx].changer->changername;  else    changername = NULL;}Int32put_in_sh(UChar ** str){  char	*cptr;  return(0);/* NOTREACHED */  if(!str)    return(0);  if(!(*str))    return(0);  cptr = strchain("sh -c \"", *str, " 1>",		(loggingfile ? loggingfile : (UChar *) "/dev/null"),		"0>&1 2>&1\"", NULL);  if(!cptr)    return(-1);  free(*str);  *str = cptr;  return(0);}Int32message_to_operator(FILE * mfp, Flag issue_clientmsg){  FILE		*pp = NULL;  UChar		*mp, *cptr, *cptr2, msg_buf[1024];  Int32		r = 0, n;  int		fd;  time_t	starttime, time_now;  struct stat	statb;  forever{		/* pseudo-loop for easily skipping code with break */    if(strlen(remoteuser) > 0){      mp = repl_substring(mail_program, "%U", remoteuser);      if(!mp){	r |= 1;	break;      }    }    else{      mp = strdup(mail_program);      if(!mp){	r |= 1;	break;      }      while( (cptr = strstr(mp, "%U")) ){	/* remove entire word with %U */	cptr2 = first_space(cptr);	cptr2 = first_nospace(cptr2);	while(cptr > mp && !isspace(*(cptr - 1)))	  cptr--;	memmove(cptr, cptr2, strlen(cptr2) + 1);      }    }    if(strlen(clientuname) > 0){      cptr = repl_substring(mp, "%H", clientuname);      free(mp);      mp = cptr;      if(!mp){	r |= 1;	break;      }    }    else{      while( (cptr = strstr(mp, "%H")) ){	/* remove entire word with %H */	cptr2 = first_space(cptr);	cptr2 = first_nospace(cptr2);	while(cptr > mp && !isspace(*(cptr - 1)))	  cptr--;	memmove(cptr, cptr2, strlen(cptr2) + 1);      }    }    pp = popen(mp, "w");    free(mp);    break;	/* always break */  }  fd = -1;  starttime = time(NULL);  while(issue_clientmsg){	if(!stat(client_message_file, &statb)){	  time_now = time(NULL);	  if(statb.st_mtime >= time_now){	    ms_sleep((statb.st_mtime - time_now + 1) * 1000);	    continue;	  }	}	/* in fact we have a race here, but this is uncricital */	fd = set_wlock(client_message_file);	if(fd >= 0){	  ftruncate(fd, 0);	  break;	}	if(time(NULL) > starttime + 60){	  r |= 2;	  break;	}	ms_sleep(200 + (Int32)(drandom() * 500.0));  }  fseek(mfp, 0, SEEK_SET);  while((n = fread(msg_buf, 1, 1024, mfp)) > 0){    if(fd >= 0)	write_forced(fd, msg_buf, n);    if(pp)	fwrite(msg_buf, 1, n, pp);  }  fclose(mfp);  if(fd >= 0)    close(fd);  if(pp)    pclose(pp);  return(r);}voidset_defaults(Flag reconfig){  ZFREE(cryptfile);  ZFREE(serverid);  ZFREE(devicesstr);  devicename = NULL;  changername = NULL;  free_devices_and_changers(streamers, num_streamers, changers, num_changers);  streamers = NULL;  changers = NULL;  num_changers = num_streamers = 0;  devprobe_interval = DEFAULT_DEVPROBEITV;  ZFREE(vardir);  ZFREE(init_cmd);  ZFREE(exit_cmd);  ZFREE(setcartcmd);  ZFREE(nextcartcmd);  ZFREE(setfilecmd);  ZFREE(skipfilescmd);  ZFREE(erasetapecmd);  ZFREE(initmediacmd);  ZFREE(weofcmd);  ZFREE(tapefullcmd);  ZFREE(tapeposfile);  ZFREE(bytesontape_file);  ZFREE(loggingfile);  ZFREE(syslog_ident);  ZFREE(statusfile);  ZFREE(precious_tapes_file);  ZFREE(ro_tapes_file);  ZFREE(cartorder_file);  ZFREE(tape_usage_file);  ZFREE(user_to_inform);  ZFREE(mail_program);  ZFREE(used_blocksizes_file);  ZFREE(client_message_file);  cartridge_handler = 0;  num_cartridges = 1;  reject_unlabeled = NO;  prefer_cart_in_changer = NO;  full_append = NO;  var_append = NO;  ZFREE(endcarts);  free_array((UChar **) cartridge_sets, 0);  cartridge_sets = NULL;  ZFREE(cartsetstr);  free_array((UChar **) cartset_clients, 0);  cartset_clients = NULL;  num_cartsets = 0;  if(!reconfig)		/* current tapeblocksize must not change */    tapeblocksize = DEFAULT_TAPEBLOCKSIZE;  conf_tapeblocksize = DEFAULT_TAPEBLOCKSIZE;  maxbytes_per_file = DEFAULT_MAXBYTESPERFILE;  ZFREE(maxbytes_per_tape);  ZFREE(maxbytes_per_tape_str);  ZFREE(pref_client_file);  ZFREE(infobuffer);  ZFREE(insfilenum);  ZFREE(inscart);  cartins_gracetime = DEFAULT_CARTGRACETIME;  devunavail_send_mail = DEFAULT_DEVUNAVSENDMAIL;  devunavail_give_up = DEFAULT_DEVUNAVGIVEUP;   ZFREE(g_lock.lockfile);  ZFREE(cartctlcmd);  ZFREE(streamerbuf_confstr);  ZFREE(streamerbuf_memfile);  streamerbuf_conf_highmark = DEFAULT_TAPEBUFHIGHMARK;  streamerbuf_conf_lowmark = DEFAULT_TAPEBUFLOWMARK;}Int32serverconf(Flag reconfig){  Int32		i, j, r = NO_ERROR;  UChar		*cptr, *cptr2, **cpptr;  int		i1;  double	d1;  struct stat	statb;  set_defaults(reconfig);  ER__(read_param_file(configfilename, entries,	/* read config file */			sizeof(entries) / sizeof(entries[0]), NULL, NULL), i);				  /* set defaults for not given parameters */  if(cartsetstr)    if(empty_string(cartsetstr))      ZFREE(cartsetstr);  if(num_cartsets < 1 && !cartsetstr){    ZFREE(endcarts);    EM__(cartridge_sets = NEWP(Uns32Range *, 2));    cartridge_sets[1] = NULL;    EM__(cartridge_sets[0] = add_to_Uns32Ranges(NULL, 1, num_cartridges));    num_cartsets = 1;  }  if(!serverid){    EM__(cptr = get_my_off_hn());    EM__(serverid = strchain(cptr, ":", configfilename, NULL));    free(cptr);  }  for(cptr = serverid; *cptr; cptr++)    if(isspace(*cptr) || !isprint(*cptr))	*cptr = '*';  if(!nextcartcmd)    EM__(nextcartcmd = strdup(DEFAULT_NEXTCARTCMD));  if(!setfilecmd)    EM__(setfilecmd = strdup(DEFAULT_SETFILECMD));  if(!skipfilescmd)    EM__(skipfilescmd = strdup(DEFAULT_SKIPFILESCMD));  if(!weofcmd)    EM__(weofcmd = strdup(DEFAULT_WEOFCMD));  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));  if(init_cmd)    if(empty_string(init_cmd))      ZFREE(init_cmd);  if(exit_cmd)   if(empty_string(exit_cmd))      ZFREE(exit_cmd);  if(setcartcmd)    if(empty_string(setcartcmd))      ZFREE(setcartcmd);  if(erasetapecmd)    if(empty_string(erasetapecmd))      ZFREE(erasetapecmd);  if(initmediacmd)    if(empty_string(initmediacmd))      ZFREE(initmediacmd);  if(tapefullcmd)    if(empty_string(tapefullcmd))      ZFREE(tapefullcmd);  if(loggingfile)    if(empty_string(loggingfile))      ZFREE(loggingfile);  if(g_lock.lockfile)    if(empty_string(g_lock.lockfile))      ZFREE(g_lock.lockfile);  if(cryptfile)    if(empty_string(cryptfile))      ZFREE(cryptfile);  if(vardir)    if(empty_string(vardir))      ZFREE(vardir);  if(statusfile)    if(empty_string(statusfile))      ZFREE(statusfile);  if(vardir)    massage_string(vardir);  if(cryptfile)    massage_string(cryptfile);  if(devicesstr){    if( (i = devices_from_confstr(devicesstr, &streamers, &num_streamers,			&changers, &num_changers)) ){	logmsg(LOG_ERR, "%s: %s\n", T_("Error"),			T_(devices_from_confstr_strerr(i)));	exit(27);    }  }  if(num_streamers < 1){    if( (i = devices_from_confstr(DEFAULT_TAPE_DEVICE,			&streamers, &num_streamers,			&changers, &num_changers)) ){	logmsg(LOG_ERR, "%s: %s\n",		T_("Internal error evaluating default tape device string"),			T_(devices_from_confstr_strerr(i)));	exit(28);    }  }  set_devices(curdevidx);#ifndef	ORIG_DEFAULTS  if(!vardir)    vardir = strdup(DEFSERVVARDIR);  if(!libdir)    libdir = strdup(DEFSERVLIBDIR);  if(!confdir)    confdir = strdup(DEFSERVCONFDIR);  if(!bindir)    bindir = strdup(DEFSERVBINDIR);#else  if(!vardir)    vardir = strapp(backuphome, FN_DIRSEPSTR "var");  if(!confdir)    confdir = strapp(backuphome, FN_DIRSEPSTR "etc");  if(!libdir)    libdir = strapp(backuphome, FN_DIRSEPSTR "lib");  if(!bindir)    bindir = strapp(backuphome, FN_DIRSEPSTR "bin");#endif  if(!vardir || !confdir || !libdir || !bindir)    EM__(NULL);  if(!g_lock.lockfile){    for(cpptr = lockdirs; *cpptr; cpptr++){      i = stat(*cpptr, &statb);      if(!i){	if(! access(*cpptr, W_OK)){	  EM__(g_lock.lockfile = strchain(*cpptr, FN_DIRSEPSTR,					DEFAULT_SERVERLOCKFILE, NULL));	  break;	}      }    }  }  EEM__(repl_dirs(&tapeposfile) || repl_dirs(&(g_lock.lockfile))		|| repl_dirs(&nextcartcmd)		|| repl_dirs(&setfilecmd) || repl_dirs(&skipfilescmd)		|| repl_dirs(&weofcmd) || repl_dirs(&mail_program));  if(setcartcmd)    EEM__(repl_dirs(&setcartcmd));  if(init_cmd)    EEM__(repl_dirs(&init_cmd));  if(exit_cmd)    EEM__(repl_dirs(&exit_cmd));  if(erasetapecmd)    EEM__(repl_dirs(&erasetapecmd));  if(initmediacmd)    EEM__(repl_dirs(&initmediacmd));  if(tapefullcmd)    EEM__(repl_dirs(&tapefullcmd));  if(loggingfile)    EEM__(repl_dirs(&loggingfile));  if(cryptfile)    EEM__(repl_dirs(&cryptfile));  if(programdir)    EEM__(repl_dirs(&programdir));  if(statusfile){    EEM__(repl_dirs(&statusfile));  }  else{    EM__(statusfile = strapp(vardir, FN_DIRSEPSTR STATUSFILE));  }  EM__(cartctlcmd = strapp(bindir, FN_DIRSEPSTR "cart_ctl"));  if(access(cartctlcmd, X_OK)){    ZFREE(cartctlcmd);    logmsg(LOG_WARNING, T_("Warning: program `%s' not found.\n"),					"cart_ctl");  }  /* check and set encryption key */  cptr = cryptfile;  if(cryptfile){    i = get_entry_by_host(cryptfile, slavemode ? "" : remotehost, &cptr);    if(i < 0){	logmsg(LOG_ERR,		T_("Error: No authentication key file configured for %s.\n"),				remotehost);	do_exit(14);    }   if( (i = check_cryptfile(cptr)) ){	logmsg((i > 0 ? LOG_WARNING : LOG_ERR),			T_("%s on encryption key file `%s': %s.\n"),			(i > 0 ? T_("Warning") : T_("Error")),			cptr, check_cryptfile_msg(i));	if(i < 0)	  do_exit(11);	logmsg(LOG_WARNING, T_("Warning: Ignoring file `%s', using compiled-in key.\n"),					cptr);	ZFREE(cptr);    }  }  set_cryptkey(cptr, ACCESSKEYSTRING,#ifdef	HAVE_DES_ENCRYPTION		YES#else		NO#endif		);  ZFREE(cptr);  if(cartsetstr && num_cartsets){    logmsg(LOG_INFO, T_("Warning: Both old parameter LastCartridges and new CartridgeSets supplied. Ignoring LastCartridges entry.\n"));    num_cartsets = 0;    ZFREE(endcarts);  }  if(cartsetstr)    num_cartsets = word_countq(cartsetstr);  insfilenum = NEWP(Int32, num_cartsets);	/* alloc memory */  inscart = NEWP(Int32, num_cartsets);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -