int main(int argc, char *argv[]) { chdir(BBSHOME); //进入BBS用户主目录 setuid(BBSUID); //将进程的 用户ID setgid(BBSGID); //组ID设置成BBS setreuid(BBSUID, BBSUID); //设置有效用户ID setregid(BBSGID, BBSGID); //有效组ID为BBS if (argc <= 1) { printf("usage: daemon | flushed | reload\n"); exit(0); } if ( !strcasecmp(argv[1], "daemon") ) { // miscd daemon switch (fork()) { //后台程序:需要创建一个子进程,由子进程杀死父进程 case -1: // printf("cannot fork\n"); exit(0); break; case 0: // 子进程 break; default: exit(0); //父进程 break; } if (load_ucache() != 0) { //将用户的数据映射到内存 printf("load ucache error\n"); exit(-1); } if (resolve_boards() < 0) exit(-1); atexit(do_exit); //注册退出前运行的函数.正常退出前须执行此函数 while (1) { //循环 refresh_utmp(); //刷新用户临时数据 b_closepolls(); //关闭投票 flush_ucache(); //将用户在内存中的数据写回.PASSWDS flush_bcache(); sleep(60 * 15); //睡眠十分钟,即每十五分钟同步一次. } } else if ( !strcasecmp(argv[1], "flushed") ) { //miscd flushed if (resolve_ucache() == -1) exit(1); flush_ucache(); flush_bcache(); } else if ( !strcasecmp(argv[1], "reload") ) { //miscd reload if (load_ucache() != 0) { printf("load ucache error\n"); exit(-1); } } else { printf("usage: daemon | flushed | reload\n"); exit(0); } return 0; }
int main(int argc, char* argv[]) { int mode; chdir(BBSHOME); resolve_boards(); load_ucache(); mode = 0; if(argc > 1) { if(strcmp(argv[1], "-u") == 0) mode = 1; else { cnv_index(argv[1]); printf("%s is done.\n", argv[1]); return 0; } } if(mode == 0) { apply_boards(cnv_board, NULL); apply_users(cnv_mail, NULL); } else { apply_boards(undo_board, NULL); apply_users(undo_mail, NULL); } return 0; }
void bootstrap(void) { int ret; char *prompt[] = { "Input SYSOP's passwd: ", "Input SYSOP's passwd again: ", }; char *pw[2]; /* store SYSOP's password */ /* * About function getpass(): * lots of codes still use the function, so we use it, * though it is obsolete. * XXX: memory leak here is harmless. */ while (1) { pw[0] = strdup(getpass(prompt[0])); if (strlen(pw[0]) > PASSLEN) { fprintf(stderr, "password too long, reinput\n"); continue; } if (strlen(pw[0]) < 4) { fprintf(stderr, "password too short, reinput\n"); continue; } if (!strcmp(pw[0], "SYSOP")) { fprintf(stderr, "password same as BBS ID, reinput\n"); continue; } pw[1] = strdup(getpass(prompt[1])); if (strcmp(pw[0], pw[1])) { fprintf(stderr, "passwords don't match, reinput\n"); continue; } break; } clean_ipc(); clean_ids_boards(); if ((ret = system(BBSHOME "/bin/miscd daemon")) != 0) error("error running miscd, return value = %d", ret); if ((ret = system(BBSHOME "/bin/bbslogd")) != 0) error("error running bbslogd, return value = %d", ret); chdir(BBSHOME); resolve_boards(); resolve_utmp(); load_ucache(); add_bbsid("SYSOP", pw[0]); add_bbsid("guest", "anypassword"); add_allboards(); clean_ipc(); }
int main(void) { int i; if (initbbsinfo(&bbsinfo) < 0) goto quit; if (load_ucache() < 0) goto quit; for (i = 0; i < 4; i++) { getrandomint(&(bbsinfo.ucachehashshm->regkey[i])); getrandomint(&(bbsinfo.ucachehashshm->oldregkey[i])); } bbsinfo.ucachehashshm->keytime = time(NULL); bbsinfo.ucachehashshm->uptime = time(NULL); return 0; quit: printf("E!\n"); return -1; }
int main(int argc, char **argv) { chdir(BBSHOME); #undef time bbssettime(time(0)); sleep(1); resolve_boards(); load_ucache(); if (argc == 2 && strcmp(argv[1], "--all") == 0) { printf("Transfering Board....\n"); apply_boards(strip_board, NULL); printf("Transfering user mail....\n"); apply_users(strip_mail, NULL); } else if (argc == 2 && strcmp(argv[1], "--mail") == 0) { apply_users(strip_mail, NULL); } else if (argc == 2 && strcmp(argv[1], "--board") == 0) { apply_boards(strip_board, NULL); } else if (argc == 2 && strcmp(argv[1], "--rollback") == 0) { //apply_boards(rollback_board, NULL); apply_users(rollback_mail, NULL); } else if (argc == 3 && strcmp(argv[1], "-b") == 0) { struct boardheader *bh; if ((bh = getbcache(argv[2])) == NULL) { fprintf(stderr, "Board <%s> not found!\n", argv[2]); exit(-1); } strip_board(bh, NULL); } else if (argc == 3 && strcmp(argv[1], "-m") == 0) { struct userec *user; if (!getuser(argv[2], &user)) { fprintf(stderr, "User <%s> not found!\n", argv[2]); exit(-1); } strip_mail(user, NULL); } else if (argc == 3 && strcmp(argv[1], "--rollback-board") == 0) { struct boardheader *bh; if ((bh = getbcache(argv[2])) == NULL) { fprintf(stderr, "Board <%s> not found!\n", argv[2]); exit(-1); } rollback_board(bh, NULL); } else if (argc == 3 && strcmp(argv[1], "--rollback-mail") == 0) { struct userec *user; if (!getuser(argv[2], &user)) { fprintf(stderr, "User <%s> not found!\n", argv[2]); exit(-1); } rollback_mail(user, NULL); } else { fprintf(stderr, "Usage:\n", argv[0]); fprintf(stderr, " %s --all Strip all fileheaders.\n", argv[0]); fprintf(stderr, " %s --mail Strip mail fileheaders.\n", argv[0]); fprintf(stderr, " %s --board Strip board fileheaders.\n", argv[0]); fprintf(stderr, " %s --rollback Rollback all fileheaders.\n", argv[0]); fprintf(stderr, " %s -b board Strip fileheaders of a board.\n", argv[0]); fprintf(stderr, " %s -m user Strip fileheaders of a user's mailbox.\n", argv[0]); fprintf(stderr, " %s --rollback-board board Rollback fileheaders of a board.\n", argv[0]); fprintf(stderr, " %s --rollback-mail user Rollback fileheaders of a user's mailbox.\n", argv[0]); exit(-1); } return 0; }
static int miscd_dodaemon(char *argv1, char *daemon) { struct sigaction act; char *commandline; char commbuf[10]; char ch; 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); } /* 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); } resolve_boards(); resolve_utmp(); resolve_guest_table(); 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(); #if defined(FREEBSD) || defined(MACOSX) 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(); exit(0); } if (((daemon == NULL) || (!strcmp(daemon, "killd"))) && ((argv1 == NULL) || fork())) { strcpy(commandline, "killd"); char line[20]; const char *path = "var/killd.pid"; int pidfd = open(path, O_RDWR | O_CREAT, 0660); if (write_lock(pidfd, 0, SEEK_SET, 0) < 0) { bbslog("3error", "killd had already been started!"); exit(-1); } snprintf(line, sizeof(line), "%ld\n", (long)getpid()); ftruncate(pidfd, 0); write(pidfd, line, strlen(line)); while (1) { time_t ft; ft = getnextday4am(); do { sleep(ft - time(0)); } while (ft > time(0)); 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; } }; exit(0); } if (((daemon == NULL) || (!strcmp(daemon, "userd"))) && ((argv1 == NULL) || fork())) { strcpy(commandline, "userd"); userd(); exit(0); } if ((daemon == NULL) || (!strcmp(daemon, "flushd"))) { strcpy(commandline, "flushd"); flushd(); exit(0); } return 0; }