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

📄 miscd.c

📁 KBSBBS的守护进程 每天定时执行相关的功能
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <sys/types.h>#include <sys/wait.h>#include "sys/socket.h"#include "netinet/in.h"#include <signal.h>#include "bbs.h"static void flushdata(){    FILE *fp;    flush_ucache();    flush_bcache();    if (NULL != (fp = fopen("etc/maxuser", "w"))) {        fprintf(fp, "%d %d", publicshm->max_user,publicshm->max_wwwguest);        fclose(fp);    }    bbslog("4miscdaemon", "flush passwd file");}void do_exit(){    flushdata();}void do_exit_sig(int sig){    do_exit();    exit(0);}static char genbuf1[255];int killdir(char *basedir, char *filename){    int fd;    struct stat st;    struct fileheader *files, *afile;    int i;    int now = (time(NULL) / 86400) % 100;    int count = 0;    int deleted = 0;    strcpy(genbuf1, basedir);    strcat(genbuf1, "/");    strcat(genbuf1, filename);    fd = open(genbuf1, O_RDWR);    if (fd < 0)        return 0;    if (flock(fd, LOCK_EX) < 0) {        close(fd);        return 0;    }    if (fstat(fd, &st) < 0) {        flock(fd, LOCK_UN);        close(fd);        return 0;    }    if ((files = (struct fileheader *) malloc(st.st_size)) == NULL) {        flock(fd, LOCK_UN);        close(fd);        return 0;    }    if (read(fd, files, st.st_size) < 0) {        free(files);        flock(fd, LOCK_UN);        close(fd);        return 0;    }    lseek(fd, 0, 0);    for (i = 0, afile = files; i < st.st_size / sizeof(struct fileheader); i++, afile++) {	int delta;	delta=now-afile->accessed[sizeof(afile->accessed) - 1];	if (delta<0) delta+=100;        if (delta > DAY_DELETED_CLEAN) {            strcpy(genbuf1, basedir);            strcat(genbuf1, "/");            strcat(genbuf1, afile->filename);            unlink(genbuf1);            deleted++;        } else {            write(fd, afile, sizeof(struct fileheader));            count += sizeof(struct fileheader);        }    }    ftruncate(fd, count);    flock(fd, LOCK_EX);    free(files);    close(fd);    return deleted;}int dokilldir(char *board){    char hehe[255];    int killed;    if (!board[0])        return 0;    strcpy(hehe, "boards");    strcat(hehe, "/");    strcat(hehe, board);    killed = killdir(hehe, ".DELETED") + killdir(hehe, ".JUNK");    if (killed > 0)        newbbslog(BBSLOG_USIES, "deleted %d files in %s board", killed, board);    return killed;}int doaboard(struct boardheader *brd,void* arg){    if (!brd)        return 0;    return dokilldir(brd->filename);}int dokillalldir(){    resolve_boards();    apply_boards(doaboard,NULL);    return 0;}static char tmpbuf[255];static char genbuf1[255];#if 0char *setmailpath(buf, userid)  /* 取 某用户 的mail */    char *buf, *userid;{    if (isalpha(userid[0]))     /* 加入错误判断,提高容错性, alex 1997.1.6 */        sprintf(buf, "mail/%c/%s", toupper(userid[0]), userid);    else        sprintf(buf, "mail/wrong/%s", userid);    return buf;}char *sethomepath(buf, userid)  /* 取 某用户 的home */    char *buf, *userid;{    if (isalpha(userid[0]))     /* 加入错误判断,提高容错性, alex 1997.1.6 */        sprintf(buf, "home/%c/%s", toupper(userid[0]), userid);    else        sprintf(buf, "home/wrong/%s", userid);    return buf;}#endif#ifndef SAVELIVEint kickuser(struct user_info *uentp, char *arg, int count){    if (uentp->mode != WEBEXPLORE)        kill(uentp->pid, SIGKILL);    clear_utmp((uentp - utmpshm->uinfo) + 1, uentp->uid, uentp->pid);    return 0;}int killauser(struct userec *theuser, char *data){    int a;    struct userec *ft;    if (!theuser || theuser->userid[0] == 0)        return 0;    a = compute_user_value(theuser);    if ((a <= 0)&&strcmp(theuser->userid,"guest")) {        newbbslog(BBSLOG_USIES, "kill user %s", theuser->userid);        apply_utmp((APPLY_UTMP_FUNC) kickuser, 0, theuser->userid, 0);        a = getuser(theuser->userid, &ft);        setmailpath(tmpbuf, theuser->userid);        sprintf(genbuf1, "/bin/rm -rf %s", tmpbuf);        system(genbuf1);        sethomepath(tmpbuf, theuser->userid);        sprintf(genbuf1, "/bin/rm -rf %s", tmpbuf);        system(genbuf1);        sprintf(genbuf1, "/bin/rm -fr tmp/email/%s", theuser->userid);        system(genbuf1);        setuserid2(a, "");        theuser->userlevel = 0;        /*strcpy(theuser->address, "");*/        strcpy(theuser->username, "");        /*strcpy(theuser->realname, "");*/    }    return 0;}#endifint dokilluser(){#ifndef SAVELIVE    resolve_utmp();    newbbslog(BBSLOG_USIES, "Started kill users\n");    apply_users(killauser, NULL);    newbbslog(BBSLOG_USIES, "kill users done\n");#endif    return 0;}int updateauser(struct userec *user,char *arg){    static const unsigned int GIVEUP_PERM[GIVEUPINFO_PERM_COUNT]={        PERM_BASIC,PERM_POST,PERM_CHAT,PERM_PAGE,PERM_DENYMAIL,PERM_DENYRELAX};    static const unsigned int GIVEUP_MASK=(PERM_BASIC|PERM_POST|PERM_CHAT|PERM_PAGE|PERM_DENYMAIL|PERM_DENYRELAX);    static const unsigned int INV_MASK=(PERM_DENYMAIL|PERM_DENYRELAX);    int i,mod,s[GIVEUPINFO_PERM_COUNT];    if(!(user->userlevel&PERM_LOGINOK))        return 0;    if(((user->userlevel^INV_MASK)&GIVEUP_MASK)==GIVEUP_MASK)        return 0;    get_giveupinfo(user,s);    for(mod=0,i=0;i<GIVEUPINFO_PERM_COUNT;i++){        if(!s[i])            continue;        if(!(((s[i]<0)?(-s[i]):s[i])>time(NULL)/86400)){            s[i]=0;            user->userlevel|=GIVEUP_PERM[i];            user->userlevel^=(INV_MASK&GIVEUP_PERM[i]);            mod++;        }    }    if(mod)        save_giveupinfo(user,s);    return 0;}int doupdategiveupuser(){    newbbslog(BBSLOG_USIES, "Started update giveup users\n");    apply_users(updateauser, NULL);    newbbslog(BBSLOG_USIES, "update giveup users done\n");    return 0;}int getnextday4am(){    time_t now = time(0);    struct tm *tm = localtime(&now);    if (tm->tm_hour >= 4) {        now += 86400;        tm = localtime(&now);    }    tm->tm_hour = 4;    tm->tm_sec = 0;    tm->tm_min = 4;    return mktime(tm);}int ismonday(){    time_t now = time(0);    struct tm *tm = localtime(&now);    return tm->tm_wday == 1;}static char *username;static char *cmd;static int num;struct requesthdr {    int command;    union {        struct user_info utmp;        int uent;    } u_info;} utmpreq;int getutmprequest(int m_socket){    int len;    struct sockaddr_in sin;    int s;    char *phdr = (char *) &utmpreq;    int totalread=0;    len = sizeof(sin);    for (s = accept(m_socket, (struct sockaddr*)&sin, &len);; s = accept(m_socket, (struct sockaddr *)&sin, &len)) {        if ((s <= 0) && errno != EINTR) {            bbslog("3system", "utmpd:accept %s", strerror(errno));            exit(-1);        }        if (s <= 0)            continue;        memset(&utmpreq, 0, sizeof(utmpreq));        len = 1;        while (totalread < sizeof(utmpreq) && len > 0) {            len = read(s, phdr, sizeof(utmpreq) - totalread);            if (len > 0) {                totalread += len;                phdr += len;            }        }        if (len <= 0) {            close(s);            continue;        }        close(s);    }    return s;}int getrequest(int m_socket){    int len;    struct sockaddr_in sin;    int s;    char *pnum;    len = sizeof(sin);    for (s = accept(m_socket, (struct sockaddr*)&sin, &len);; s = accept(m_socket, (struct sockaddr *)&sin, &len)) {        if ((s <= 0) && errno != EINTR) {            bbslog("3system", "userd:accept %s", strerror(errno));            exit(-1);        }        if (s <= 0)            continue;        memset(tmpbuf, 0, 255);        len = read(s, tmpbuf, 255);        if (len <= 0) {            close(s);            continue;        }        strtok(tmpbuf, " ");        cmd = tmpbuf;        username = strtok(NULL, " ");        pnum = strtok(NULL, " ");        num = pnum ? atoi(pnum) : 0;        if (strcmp(tmpbuf, "QUIT") == 0)            exit(0);        if (strcmp(tmpbuf, "NEW") == 0)            break;        if (strcmp(tmpbuf, "SET") == 0)            break;        if (strcmp(tmpbuf, "DEL") == 0) {            pnum = username;            num = atoi(pnum);            break;        }        close(s);    }    return s;}void putrequest(int sock, int id){    write(sock, &id, sizeof(id));    close(sock);}void userd(){    int m_socket;#ifdef HAVE_IPV6_SMTH    struct sockaddr_in6 sin;#else    struct sockaddr_in sin;#endif    int sinlen = sizeof(sin);    int opt = 1;    bzero(&sin, sizeof(sin));#ifdef HAVE_IPV6_SMTH    if ((m_socket = socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP)) < 0) {#else    if ((m_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {#endif        bbslog("3system", "userd:socket %s", strerror(errno));        exit(-1);    }    setsockopt(m_socket, SOL_SOCKET, SO_REUSEADDR, &opt, 4);    memset(&sin, 0, sinlen);#ifdef HAVE_IPV6_SMTH    sin.sin6_family = AF_INET6;

⌨️ 快捷键说明

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