📄 server.c
字号:
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 + -