📄 miscd.c
字号:
sin.sin6_port = htons(60001); inet_pton(AF_INET6, "::1", &sin.sin6_addr);#else sin.sin_family = AF_INET; sin.sin_port = htons(60001);#ifdef HAVE_INET_ATON inet_aton("127.0.0.1", &sin.sin_addr);#elif defined HAVE_INET_PTON inet_pton(AF_INET, "127.0.0.1", &sin.sin_addr);#else /* Is it OK? */ my_inet_aton("127.0.0.1", &sin.sin_addr);#endif#endif /* IPV6 */ if (0 != bind(m_socket, (struct sockaddr *) &sin, sizeof(sin))) { bbslog("3system", "userd:bind %s", strerror(errno)); exit(-1); } if (0 != listen(m_socket, 5)) { bbslog("3system", "userd:listen %s", strerror(errno)); exit(-1); } while (1) { int sock, id; sock = getrequest(m_socket); if (!strcmp(cmd, "NEW")) id = getnewuserid(username); else if (!strcmp(cmd, "SET")) { setuserid2(num, username); id = 0; } else if (!strcmp(cmd, "DEL")) { setuserid2(num, ""); id = 0; } else continue; putrequest(sock, id); } return;}void utmpd(){ int m_socket; struct sockaddr_in sin; int sinlen = sizeof(sin); int opt = 1; bzero(&sin, sizeof(sin)); if ((m_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { bbslog("3system", "utmpd:socket %s", strerror(errno)); exit(-1); } setsockopt(m_socket, SOL_SOCKET, SO_REUSEADDR, &opt, 4); memset(&sin, 0, sinlen); sin.sin_family = AF_INET; sin.sin_port = htons(60002);#ifdef HAVE_INET_ATON inet_aton("127.0.0.1", &sin.sin_addr);#elif defined HAVE_INET_PTON inet_pton(AF_INET, "127.0.0.1", &sin.sin_addr);#else /* Is it OK? */ my_inet_aton("127.0.0.1", &sin.sin_addr);#endif if (0 != bind(m_socket, (struct sockaddr *) &sin, sizeof(sin))) { bbslog("3system", "utmpd:bind %s", strerror(errno)); exit(-1); } if (0 != listen(m_socket, 5)) { bbslog("3system", "utmpd:listen %s", strerror(errno)); exit(-1); } while (1) { int sock, id; sock = getutmprequest(m_socket);#if 0 { /*kill user */ time_t now; struct user_info *uentp; now = time(NULL); if ((now > utmpshm->uptime + 120) || (now < utmpshm->uptime - 120)) { int n; utmpshm->uptime = now; bbslog("1system", "UTMP:Clean user utmp cache"); for (n = 0; n < USHM_SIZE; n++) { utmpshm->uptime = now; uentp = &(utmpshm->uinfo[n]); if (uentp->active && uentp->pid && kill(uentp->pid, 0) == -1) { /*uentp检查 */ char buf[STRLEN]; strncpy(buf, uentp->userid, IDLEN + 2); clear_utmp(n + 1); RemoveMsgCountFile(buf); } } } }#endif /* utmp */ switch (utmpreq.command) { case 1: // getnewutmp id = getnewutmpent2(&utmpreq.u_info.utmp); break; case 2: id = -1; break; // clear, by uentp case 3: // clear, by id /*这个代码有错误的,因为pid不能不判断 */ clear_utmp(utmpreq.u_info.uent, 0, 0); id = 0; break; default: id = -1; break; } putrequest(sock, id); } return;}void flushd(){ struct sigaction act; atexit(do_exit); bzero(&act, sizeof(act)); act.sa_handler = do_exit_sig; sigaction(SIGTERM, &act, NULL); sigaction(SIGHUP, &act, NULL); sigaction(SIGABRT, &act, NULL); while (1) { sleep(24 * 60 * 60); flushdata(); };}static void reaper(){ while (waitpid(-1, NULL, WNOHANG | WUNTRACED) > 0);}void timed(){#ifndef CYGWIN setpublicshmreadonly(0);#endif while (1) {#undef time bbssettime(time(0)); sleep(1);#define time(x) bbstime(x) }}static int check_file_writable(const char *filename){ struct stat st; int val; val = stat(filename, &st); if (val < 0 && errno == ENOENT) /* 文件不存在,认为可写 */ return 1; else if (val == 0) { /* 只检查文件 owner */ if (st.st_uid == getuid() && ((st.st_mode & (S_IRUSR | S_IWUSR)) == (S_IRUSR | S_IWUSR))) return 1; /* else if (st.st_gid == getgid() && (st.st_mode & (S_IRGRP | S_IWGRP) == (S_IRGRP | S_IWGRP))) return 1; else if (st.st_mode & (S_IROTH | S_IWOTH) == (S_IROTH | S_IWOTH)) return 1; */ } return 0;}static int miscd_dodaemon(char *argv1, char *daemon){ struct sigaction act; char *commandline; char commbuf[10];#if USE_TMPFS==1 char ch;#endif if (!check_file_writable(PASSFILE)) { fprintf(stderr, "Error! File %s is not writable.\n", PASSFILE); exit(-1); } if (!check_file_writable(BOARDS)) { fprintf(stderr, "Error! File %s is not writable.\n", BOARDS); exit(-1); } truncate(BOARDS, MAXBOARD * sizeof(struct boardheader)); if (load_ucache() != 0) { printf("ft,load ucache error!"); exit(-1); }#if USE_TMPFS==1 /* init tmpfs */ sprintf(genbuf1,"%s/home",TMPFSROOT); mkdir(genbuf1,0700); sprintf(genbuf1,"%s/boards",TMPFSROOT); mkdir(genbuf1,0700); for (ch='A';ch<='Z';ch++) { sprintf(genbuf1,"%s/home/%c",TMPFSROOT,ch); mkdir(genbuf1,0700); }#endif resolve_boards();#if HAVE_WWW==1 resolve_guest_table();#endif if (argv1 != NULL) { switch (fork()) { case -1: printf("faint, i can't fork.\n"); exit(0); break; case 0: break; default: exit(0); break; } commandline = argv1; } else { commandline = commbuf; } setsid();#ifdef AIX setpgrp();#elif defined FREEBSD setpgid(0, 0);#else // by zixia setpgrp(0, 0); setpgrp();#endif#ifdef AIX act.sa_handler = NULL; act.sa_flags = SA_RESTART | SA_NOCLDWAIT; sigaction(SIGCHLD, &act, NULL);#else act.sa_handler = reaper; act.sa_flags = SA_RESTART; sigaction(SIGCHLD, &act, NULL);#endif if (((daemon == NULL) || (!strcmp(daemon, "timed"))) && ((argv1 == NULL) || fork())) { strcpy(commandline, "timed"); timed(); } if (((daemon == NULL) || (!strcmp(daemon, "killd"))) && ((argv1 == NULL) || fork())) { strcpy(commandline, "killd"); while (1) { int ft; if (argv1 == NULL) { dokilluser(); //doupdategiveupuser(); } else { switch (fork()) { case -1: bbslog("3error", "fork failed\n"); break; case 0: dokilluser(); //doupdategiveupuser(); exit(0); break; default: break; } } switch (fork()) { case -1: bbslog("3error", "fork failed\n"); break; case 0: dokillalldir(); exit(0); break; default: break; } ft = time(0); do { sleep(86400 - (time(0) - ft)); /* 1 day */ } while (ft + 86400 > time(0)); }; } if (((daemon == NULL) || (!strcmp(daemon, "userd"))) && ((argv1 == NULL) || fork())) { strcpy(commandline, "userd"); userd(); } if ((daemon == NULL) || (!strcmp(daemon, "flushd"))) { strcpy(commandline, "flushd"); flushd(); } return 0;}int main(int argc, char *argv[]){ chdir(BBSHOME); setuid(BBSUID); setgid(BBSGID); setreuid(BBSUID, BBSUID); setregid(BBSGID, BBSGID);#ifndef CYGWIN#undef time bbssettime(time(0)); sleep(1);#define time(x) bbstime(x)#endif setpublicshmreadonly(0);#ifndef CYGWIN setpublicshmreadonly(1);#endif init_bbslog(); if (argc > 1) { if (strcasecmp(argv[1], "killuser") == 0) { if (resolve_ucache() != 0) return -1; return dokilluser(); } if (strcasecmp(argv[1], "giveup") == 0) { if (resolve_ucache() != 0) return -1; return doupdategiveupuser(); } if (strcasecmp(argv[1], "allboards") == 0) return dokillalldir(); if (strcasecmp(argv[1], "daemon") == 0) return miscd_dodaemon(argv[1], argv[2]); if (strcasecmp(argv[1], "killdir") == 0) return dokilldir(argv[2]); if (strcasecmp(argv[1], "flush") == 0) { if (resolve_ucache() != 0) return -1; resolve_boards(); flushdata(); return 0; } return miscd_dodaemon(NULL, argv[1]); } printf("Usage : %s daemon: to run as a daemon (this is the most common use)\n", argv[0]); printf(" %s killuser: to kill old users\n", argv[0]); printf(" %s giveup: to unlock given-up users\n", argv[0]); printf(" %s killdir <BOARDNAME>: to delete old file in <BOARDNAME>\n", argv[0]); printf(" %s allboards: to delete old files in all boards\n", argv[0]); printf(" %s flush: to synchronize .PASSWDS and .BOARDS to disk\n", argv[0]); printf("That's all, folks. See doc/README.SYSOP for more details\n"); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -