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