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

📄 miscd.c

📁 KBSBBS的守护进程 每天定时执行相关的功能
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -