diff options
Diffstat (limited to 'mbbsd/mbbsd.c')
-rw-r--r-- | mbbsd/mbbsd.c | 1504 |
1 files changed, 743 insertions, 761 deletions
diff --git a/mbbsd/mbbsd.c b/mbbsd/mbbsd.c index 5109474d..c9736e1b 100644 --- a/mbbsd/mbbsd.c +++ b/mbbsd/mbbsd.c @@ -1,148 +1,150 @@ -/* $Id: mbbsd.c,v 1.39 2002/07/05 13:14:14 in2 Exp $ */ +/* $Id: mbbsd.c,v 1.40 2002/07/05 17:10:27 in2 Exp $ */ #include "bbs.h" #define SOCKET_QLEN 4 #define TH_LOW 100 #define TH_HIGH 120 -static void do_aloha (char *hello); +static void do_aloha(char *hello); #if 0 -static jmp_buf byebye; +static jmp_buf byebye; #endif -static char remoteusername[40] = "?"; +static char remoteusername[40] = "?"; static unsigned char enter_uflag; -static int use_shell_login_mode = 0; +static int use_shell_login_mode = 0; static struct sockaddr_in xsin; /* set signal handler, which won't be reset once signal comes */ static void -signal_restart (int signum, void (*handler) (int)) +signal_restart(int signum, void (*handler) (int)) { struct sigaction act; act.sa_handler = handler; - memset (&(act.sa_mask), 0, sizeof (sigset_t)); + memset(&(act.sa_mask), 0, sizeof(sigset_t)); act.sa_flags = 0; - sigaction (signum, &act, NULL); + sigaction(signum, &act, NULL); } static void -start_daemon () +start_daemon() { - int n; - char buf[80]; - + int n; + char buf[80]; + /* * More idiot speed-hacking --- the first time conversion makes the C * library open the files containing the locale definition and time zone. * If this hasn't happened in the parent process, it happens in the * children, once per connection --- and it does add up. */ - time_t dummy = time (NULL); - struct tm *dummy_time = localtime (&dummy); - - strftime (buf, 80, "%d/%b/%Y:%H:%M:%S", dummy_time); - -#ifndef NO_FORK - if ((n = fork ())){ - exit (0); + time_t dummy = time(NULL); + struct tm *dummy_time = localtime(&dummy); + + strftime(buf, 80, "%d/%b/%Y:%H:%M:%S", dummy_time); + +#ifndef NO_FORK + if ((n = fork())) { + exit(0); } #endif - + /* rocker.011018: it's a good idea to close all unexcept fd!! */ - n = getdtablesize (); + n = getdtablesize(); while (n) - close (--n); - /* rocker.011018: we don't need to remember original tty, - so request a new session id */ - setsid (); - - /* rocker.011018: after new session, - we should insure the process is clean daemon */ + close(--n); + /* + * rocker.011018: we don't need to remember original tty, so request a + * new session id + */ + setsid(); + + /* + * rocker.011018: after new session, we should insure the process is + * clean daemon + */ #ifndef NO_FORK - if ((n = fork ())){ - exit (0); + if ((n = fork())) { + exit(0); } #endif } static void -reapchild (int sig) +reapchild(int sig) { - int state, pid; - - while ((pid = waitpid (-1, &state, WNOHANG | WUNTRACED)) > 0) - ; + int state, pid; + + while ((pid = waitpid(-1, &state, WNOHANG | WUNTRACED)) > 0); } #define BANNER \ "¡i" BBSNAME "¡j¡· ¥x¤j¬y¦æºô ¡·(" MYHOSTNAME ") ½Õ´T(" MYIP ") " /* -#define BANNER \ -"¡i" BBSNAME "¡j¡· ¥x¤j¬y¦æºô ¡·(" MYHOSTNAME ")\r\n"\ -" ½Õ´T(" MYIP ") " -*/ + * #define BANNER \ "¡i" BBSNAME "¡j¡· ¥x¤j¬y¦æºô ¡·(" MYHOSTNAME ")\r\n"\ " + * ½Õ´T(" MYIP ") " + */ /* check load and print approriate banner string in buf */ static int -chkload (char *buf) +chkload(char *buf) { - char cpu_load[30]; - int i; - - i = cpuload (cpu_load); - - sprintf (buf, BANNER" ¨t²Ît²ü\r\n %s %s \r\n", cpu_load, - (i > MAX_CPULOAD ? "¡A°ªt²ü¶q¡A½Ðµy«á¦A¨Ó " - "(½Ð§Q¥Îport 3000~3010³s½u)" : "")); + char cpu_load[30]; + int i; + + i = cpuload(cpu_load); + + sprintf(buf, BANNER " ¨t²Ît²ü\r\n %s %s \r\n", cpu_load, + (i > MAX_CPULOAD ? "¡A°ªt²ü¶q¡A½Ðµy«á¦A¨Ó " + "(½Ð§Q¥Îport 3000~3010³s½u)" : "")); #ifdef INSCREEN strcpy(buf, (i > MAX_CPULOAD ? BANNER "°ªt²ü¶q¡A½Ðµy«á¦A¨Ó(½Ð§Q¥Îport 3000~3010³s½u)" : "")); #else sprintf(buf, BANNER "%s\r\n", - (i > MAX_CPULOAD ? "°ªt²ü¶q¡A½Ðµy«á¦A¨Ó(½Ð§Q¥Îport 3000~3010³s½u)":"")); + (i > MAX_CPULOAD ? "°ªt²ü¶q¡A½Ðµy«á¦A¨Ó(½Ð§Q¥Îport 3000~3010³s½u)" : "")); #endif if (i > MAX_CPULOAD) return 1; - + return 0; } void -log_user (char *msg) +log_user(char *msg) { - char filename[200]; - - sprintf (filename, BBSHOME "/home/%c/%s/USERLOG", - cuser.userid[0], cuser.userid); - log_file (filename, msg); + char filename[200]; + + sprintf(filename, BBSHOME "/home/%c/%s/USERLOG", + cuser.userid[0], cuser.userid); + log_file(filename, msg); } void -log_usies (char *mode, char *mesg) +log_usies(char *mode, char *mesg) { - char genbuf[200]; - + char genbuf[200]; + if (!mesg) - sprintf (genbuf, cuser.userid[0] ? "%s %s %-12s Stay:%d (%s)" : - "%s %s %s Stay:%d (%s)", - Cdate (&now), mode, cuser.userid, - (int)(now - login_start_time) / 60, cuser.username); + sprintf(genbuf, cuser.userid[0] ? "%s %s %-12s Stay:%d (%s)" : + "%s %s %s Stay:%d (%s)", + Cdate(&now), mode, cuser.userid, + (int)(now - login_start_time) / 60, cuser.username); else - sprintf (genbuf, cuser.userid[0] ? "%s %s %-12s %s" : "%s %s %s%s", - Cdate (&now), mode, cuser.userid, mesg); - log_file (FN_USIES, genbuf); - + sprintf(genbuf, cuser.userid[0] ? "%s %s %-12s %s" : "%s %s %s%s", + Cdate(&now), mode, cuser.userid, mesg); + log_file(FN_USIES, genbuf); + /* °lÂÜ¨Ï¥ÎªÌ */ - if (HAS_PERM (PERM_LOGUSER)) - log_user (genbuf); + if (HAS_PERM(PERM_LOGUSER)) + log_user(genbuf); } static void -setflags (int mask, int value) +setflags(int mask, int value) { if (value) cuser.uflag |= mask; @@ -151,209 +153,206 @@ setflags (int mask, int value) } void -u_exit (char *mode) +u_exit(char *mode) { //userec_t xuser; - int diff = (time (0) - login_start_time) / 60; + int diff = (time(0) - login_start_time) / 60; /* close fd 0 & a to terminate network */ close(0); close(1); - reload_money(); - auto_backup (); + reload_money(); + auto_backup(); save_brdbuf(); - setflags (PAGER_FLAG, currutmp->pager != 1); - setflags (CLOAK_FLAG, currutmp->invisible); - + setflags(PAGER_FLAG, currutmp->pager != 1); + setflags(CLOAK_FLAG, currutmp->invisible); + cuser.invisible = currutmp->invisible; cuser.pager = currutmp->pager; memcpy(cuser.mind, currutmp->mind, 4); setutmpbid(0); - if (!(HAS_PERM (PERM_SYSOP) && HAS_PERM (PERM_DENYPOST)) && - !currutmp->invisible ) - do_aloha ("<<¤U¯¸³qª¾>> -- §Ú¨«Åo¡I"); - - purge_utmp (currutmp); - if ((cuser.uflag != enter_uflag) || (currmode & MODE_DIRTY) || diff){ + if (!(HAS_PERM(PERM_SYSOP) && HAS_PERM(PERM_DENYPOST)) && + !currutmp->invisible) + do_aloha("<<¤U¯¸³qª¾>> -- §Ú¨«Åo¡I"); + + purge_utmp(currutmp); + if ((cuser.uflag != enter_uflag) || (currmode & MODE_DIRTY) || diff) { if (!diff && cuser.numlogins) cuser.numlogins = --cuser.numlogins; /* Leeym ¤W¯¸°±¯d®É¶¡¨î¦¡ */ } - passwd_update (usernum, &cuser); - log_usies (mode, NULL); + passwd_update(usernum, &cuser); + log_usies(mode, NULL); } void -system_abort () +system_abort() { if (currmode) - u_exit ("ABORT"); - - clear (); - refresh (); - fprintf (stdout, "ÁÂÁÂ¥úÁ{, °O±o±`¨Ó³á !\n"); - exit (0); + u_exit("ABORT"); + + clear(); + refresh(); + fprintf(stdout, "ÁÂÁÂ¥úÁ{, °O±o±`¨Ó³á !\n"); + exit(0); } void -abort_bbs (int sig) +abort_bbs(int sig) { if (currmode) - u_exit ("AXXED"); - exit (0); + u_exit("AXXED"); + exit(0); } static void -abort_bbs_debug (int sig) +abort_bbs_debug(int sig) { - static int reentrant = 0; - - if (!reentrant){ - int i; + static int reentrant = 0; + + if (!reentrant) { + int i; /* close all file descriptors (including the network connection) */ - for( i = 0 ; i < 256 ; ++i ) + for (i = 0; i < 256; ++i) close(i); reentrant = 1; if (currmode) - u_exit ("AXXED"); - setproctitle("debug me!(%d)",sig); - sleep(3600); /* wait 60 mins for debug */ + u_exit("AXXED"); + setproctitle("debug me!(%d)", sig); + sleep(3600); /* wait 60 mins for debug */ } - exit (0); + exit(0); } /* µn¿ý BBS µ{¦¡ */ static void -mysrand () +mysrand() { - srand (time (NULL) + currutmp->pid); /* ®É¶¡¸ò pid ·í rand ªº seed */ + srand(time(NULL) + currutmp->pid); /* ®É¶¡¸ò pid ·í rand ªº seed */ } int -dosearchuser (char *userid) +dosearchuser(char *userid) { - if ((usernum = getuser (userid))) - memcpy (&cuser, &xuser, sizeof (cuser)); + if ((usernum = getuser(userid))) + memcpy(&cuser, &xuser, sizeof(cuser)); else - memset (&cuser, 0, sizeof (cuser)); + memset(&cuser, 0, sizeof(cuser)); return usernum; } static void talk_request(int sig) { - bell (); - bell (); - if (currutmp->msgcount){ - char buf[200]; - time_t now = time (0); - - sprintf (buf, "\033[33;41m¡¹%s\033[34;47m [%s] %s \033[0m", - SHM->uinfo[currutmp->destuip].userid, my_ctime (&now), - (currutmp->sig == 2)? "«n®ø®§¼s¼½¡I(½ÐCtrl-U,l¬d¬Ý¼ö°T°O¿ý)" - : "©I¥s¡B©I¥s¡AÅ¥¨ì½Ð¦^µª"); - move (0, 0); - clrtoeol (); - outs (buf); - refresh (); - } - else{ - unsigned char mode0 = currutmp->mode; - char c0 = currutmp->chatid[0]; - screenline_t *screen0 = calloc (t_lines, sizeof (screenline_t)); - + bell(); + bell(); + if (currutmp->msgcount) { + char buf[200]; + time_t now = time(0); + + sprintf(buf, "\033[33;41m¡¹%s\033[34;47m [%s] %s \033[0m", + SHM->uinfo[currutmp->destuip].userid, my_ctime(&now), + (currutmp->sig == 2) ? "«n®ø®§¼s¼½¡I(½ÐCtrl-U,l¬d¬Ý¼ö°T°O¿ý)" + : "©I¥s¡B©I¥s¡AÅ¥¨ì½Ð¦^µª"); + move(0, 0); + clrtoeol(); + outs(buf); + refresh(); + } else { + unsigned char mode0 = currutmp->mode; + char c0 = currutmp->chatid[0]; + screenline_t *screen0 = calloc(t_lines, sizeof(screenline_t)); + currutmp->mode = 0; currutmp->chatid[0] = 1; - memcpy (screen0, big_picture, t_lines * sizeof (screenline_t)); - talkreply (); + memcpy(screen0, big_picture, t_lines * sizeof(screenline_t)); + talkreply(); currutmp->mode = mode0; currutmp->chatid[0] = c0; - memcpy (big_picture, screen0, t_lines * sizeof (screenline_t)); - free (screen0); - redoscr (); + memcpy(big_picture, screen0, t_lines * sizeof(screenline_t)); + free(screen0); + redoscr(); } } void show_call_in(int save, int which) { - char buf[200]; - sprintf (buf, "\033[1;33;46m¡¹%s\033[37;45m %s \033[m", - currutmp->msgs[which].userid, currutmp->msgs[which].last_call_in); - move (b_lines, 0); - clrtoeol (); - refresh (); - outmsg (buf); - - if (save){ - char genbuf[200]; - time_t now; - if (!fp_writelog){ - sethomefile (genbuf, cuser.userid, fn_writelog); - fp_writelog = fopen (genbuf, "a"); + char buf[200]; + sprintf(buf, "\033[1;33;46m¡¹%s\033[37;45m %s \033[m", + currutmp->msgs[which].userid, currutmp->msgs[which].last_call_in); + move(b_lines, 0); + clrtoeol(); + refresh(); + outmsg(buf); + + if (save) { + char genbuf[200]; + time_t now; + if (!fp_writelog) { + sethomefile(genbuf, cuser.userid, fn_writelog); + fp_writelog = fopen(genbuf, "a"); } - if (fp_writelog){ - time (&now); - fprintf (fp_writelog, "%s \033[0m[%s]\n", buf, Cdatelite (&now)); + if (fp_writelog) { + time(&now); + fprintf(fp_writelog, "%s \033[0m[%s]\n", buf, Cdatelite(&now)); } } } -static int add_history_water(water_t *w, msgque_t *msg) +static int +add_history_water(water_t * w, msgque_t * msg) { - // mode: 1: all data(including userid, pid); - // 0: only last_call_in Ptt:¥ý§ï¦^¨Ó ¬Ù¤£¦h ¶i¶¥·|¦³°ÝÃD - memcpy(&w->msg[w->top], msg, sizeof(msgque_t)); + //mode:1:all data(including userid, pid); +//0: only last_call_in Ptt:¥ý§ï¦^¨Ó¬Ù¤£¦h ¶ i ¶ ¥·|¦³°ÝÃD + memcpy(&w->msg[w->top], msg, sizeof(msgque_t)); w->top++; w->top %= WATERMODE(WATER_OFO) ? 5 : MAX_REVIEW; - + if (w->count < MAX_REVIEW) w->count++; - + return w->count; } static int -add_history(msgque_t *msg) +add_history(msgque_t * msg) { - int i = 0, j, waterinit = 0; - water_t *tmp; - if( WATERMODE(WATER_ORIG) || WATERMODE(WATER_NEW) ) + int i = 0, j, waterinit = 0; + water_t *tmp; + if (WATERMODE(WATER_ORIG) || WATERMODE(WATER_NEW)) add_history_water(&water[0], msg); - if( WATERMODE(WATER_NEW) || WATERMODE(WATER_OFO) ){ - for(i = 0 ; i < 5 && swater[i] ; i++ ) - if( swater[i]->pid == msg->pid ) + if (WATERMODE(WATER_NEW) || WATERMODE(WATER_OFO)) { + for (i = 0; i < 5 && swater[i]; i++) + if (swater[i]->pid == msg->pid) break; - if( i == 5 ){ + if (i == 5) { waterinit = 1; i = 4; memset(swater[4], 0, sizeof(water_t)); - } - else if( !swater[i] ){ + } else if (!swater[i]) { water_usies = i + 1; swater[i] = &water[i + 1]; waterinit = 1; } tmp = swater[i]; - if( waterinit ){ + if (waterinit) { memcpy(swater[i]->userid, msg->userid, sizeof(swater[i]->userid)); swater[i]->pid = msg->pid; } - - if( !swater[i]->uin ) + if (!swater[i]->uin) swater[i]->uin = currutmp; - - for( j = i ; j > 0 ; j-- ) + + for (j = i; j > 0; j--) swater[j] = swater[j - 1]; swater[0] = tmp; add_history_water(swater[0], msg); } - - if(WATERMODE(WATER_ORIG) || WATERMODE(WATER_NEW) ){ - if( watermode > 0 && - (water_which == swater[0] || water_which == &water[0]) ){ + if (WATERMODE(WATER_ORIG) || WATERMODE(WATER_NEW)) { + if (watermode > 0 && + (water_which == swater[0] || water_which == &water[0])) { if (watermode < water_which->count) watermode++; t_display_new(); @@ -363,35 +362,34 @@ add_history(msgque_t *msg) } void -write_request (int sig) +write_request(int sig) { - int i; - - if( WATERMODE(WATER_OFO) ){ - /* sig = SIGUSR2 waterball come in - 0 flush to water[] (by my_write2()) - */ - if( sig != 0 ){ - if( wmofo == 0 ) /* ¥¿¦b¦^¤ô²y */ + int i; + + if (WATERMODE(WATER_OFO)) { + /* + * sig = SIGUSR2 waterball come in 0 flush to water[] (by + * my_write2()) + */ + if (sig != 0) { + if (wmofo == 0) /* ¥¿¦b¦^¤ô²y */ wmofo = 1; - bell (); + bell(); show_call_in(1, currutmp->msgcount - 1); - refresh (); + refresh(); } - - if( sig == 0 || /* ¦^¤ô²yªº®ÉÔ¤S¦³¤ô²y¶i¨Ó, ¦^§¹«á¤@¦¸¼g¦^¥h */ - wmofo == -1 ){ /* ¤£¦b¦^¤ô²y¼Ò¦¡ */ - do{ + if (sig == 0 || /* ¦^¤ô²yªº®ÉÔ¤S¦³¤ô²y¶i¨Ó, ¦^§¹«á¤@¦¸¼g¦^¥h */ + wmofo == -1) { /* ¤£¦b¦^¤ô²y¼Ò¦¡ */ + do { add_history(&currutmp->msgs[0]); - if( currutmp->msgcount-- ) + if (currutmp->msgcount--) for (i = 0; i < currutmp->msgcount; i++) currutmp->msgs[i] = currutmp->msgs[i + 1]; } while (currutmp->msgcount); currutmp->msgcount = 0; } - } - else{ + } else { if (currutmp->mode != 0 && currutmp->pager != 0 && cuser.userlevel != 0 && @@ -401,25 +399,24 @@ write_request (int sig) currutmp->mode != CHATING && currutmp->mode != PAGE && currutmp->mode != IDLE && - currutmp->mode != MAILALL && currutmp->mode != MONITOR){ - char c0 = currutmp->chatid[0]; - int currstat0 = currstat; - unsigned char mode0 = currutmp->mode; - + currutmp->mode != MAILALL && currutmp->mode != MONITOR) { + char c0 = currutmp->chatid[0]; + int currstat0 = currstat; + unsigned char mode0 = currutmp->mode; + currutmp->mode = 0; currutmp->chatid[0] = 2; currstat = XMODE; - - do{ - bell (); + + do { + bell(); show_call_in(1, 0); - igetch (); + igetch(); currutmp->msgcount--; - if (currutmp->msgcount >= MAX_MSGS){ + if (currutmp->msgcount >= MAX_MSGS) { /* this causes chaos... jochang */ - raise (SIGFPE); + raise(SIGFPE); } - add_history(&currutmp->msgs[0]); for (i = 0; i < currutmp->msgcount; i++) currutmp->msgs[i] = currutmp->msgs[i + 1]; @@ -428,271 +425,263 @@ write_request (int sig) currutmp->chatid[0] = c0; currutmp->mode = mode0; currstat = currstat0; - } - else{ - bell (); + } else { + bell(); show_call_in(1, 0); add_history(&currutmp->msgs[0]); - - refresh (); + + refresh(); currutmp->msgcount = 0; } } } static void -multi_user_check () +multi_user_check() { register userinfo_t *ui; - register pid_t pid; - char genbuf[3]; - - if (HAS_PERM (PERM_SYSOP)) + register pid_t pid; + char genbuf[3]; + + if (HAS_PERM(PERM_SYSOP)) return; /* don't check sysops */ - - if (cuser.userlevel){ - if (!(ui = (userinfo_t *) search_ulist (usernum))) - return; /* user isn't logged in */ - + + if (cuser.userlevel) { + if (!(ui = (userinfo_t *) search_ulist(usernum))) + return; /* user isn't logged in */ + pid = ui->pid; - if (!pid /*|| (kill(pid, 0) == -1) */ ) - return; /* stale entry in utmp file */ - - getdata (b_lines - 1, 0, "±z·Q§R°£¨ä¥L«½Æªº login (Y/N)¶Ü¡H[Y] ", - genbuf, 3, LCECHO); - - if (genbuf[0] != 'n'){ + if (!pid /* || (kill(pid, 0) == -1) */ ) + return; /* stale entry in utmp file */ + + getdata(b_lines - 1, 0, "±z·Q§R°£¨ä¥L«½Æªº login (Y/N)¶Ü¡H[Y] ", + genbuf, 3, LCECHO); + + if (genbuf[0] != 'n') { if (pid > 0) - kill (pid, SIGHUP); - log_usies ("KICK ", cuser.username); + kill(pid, SIGHUP); + log_usies("KICK ", cuser.username); + } else { + if (search_ulistn(usernum, 3) != NULL) + system_abort(); /* Goodbye(); */ } - else{ - if (search_ulistn(usernum, 3)!=NULL) - system_abort (); /* Goodbye(); */ - } - } - else{ + } else { /* allow multiple guest user */ - if (search_ulistn(usernum, 100)!=NULL){ - outs ("\n©êºp¡A¥Ø«e¤w¦³¤Ó¦h guest ¦b¯¸¤W, ½Ð¥Înewµù¥U¡C\n"); - pressanykey (); - oflush (); - exit (1); + if (search_ulistn(usernum, 100) != NULL) { + outs("\n©êºp¡A¥Ø«e¤w¦³¤Ó¦h guest ¦b¯¸¤W, ½Ð¥Înewµù¥U¡C\n"); + pressanykey(); + oflush(); + exit(1); } } } /* bad login */ -static char str_badlogin[] = "logins.bad"; +static char str_badlogin[] = "logins.bad"; static void -logattempt (char *uid, char type) +logattempt(char *uid, char type) { - char fname[40]; - int fd, len; - char genbuf[200]; - - sprintf (genbuf, "%c%-12s[%s] %s@%s\n", type, uid, - Cdate (&login_start_time), remoteusername, fromhost); - len = strlen (genbuf); - if ((fd = open (str_badlogin, O_WRONLY | O_CREAT | O_APPEND, 0644)) > 0){ - write (fd, genbuf, len); - close (fd); + char fname[40]; + int fd, len; + char genbuf[200]; + + sprintf(genbuf, "%c%-12s[%s] %s@%s\n", type, uid, + Cdate(&login_start_time), remoteusername, fromhost); + len = strlen(genbuf); + if ((fd = open(str_badlogin, O_WRONLY | O_CREAT | O_APPEND, 0644)) > 0) { + write(fd, genbuf, len); + close(fd); } - if (type == '-'){ - sprintf (genbuf, "[%s] %s\n", Cdate (&login_start_time), fromhost); - len = strlen (genbuf); - sethomefile (fname, uid, str_badlogin); - if ((fd = open (fname, O_WRONLY | O_CREAT | O_APPEND, 0644)) > 0){ - write (fd, genbuf, len); - close (fd); + if (type == '-') { + sprintf(genbuf, "[%s] %s\n", Cdate(&login_start_time), fromhost); + len = strlen(genbuf); + sethomefile(fname, uid, str_badlogin); + if ((fd = open(fname, O_WRONLY | O_CREAT | O_APPEND, 0644)) > 0) { + write(fd, genbuf, len); + close(fd); } } } static void -login_query () +login_query() { - char uid[IDLEN + 1], passbuf[PASSLEN]; - int attempts; - char genbuf[200]; + char uid[IDLEN + 1], passbuf[PASSLEN]; + int attempts; + char genbuf[200]; attach_SHM(); - resolve_garbage (); - now= time(0); + resolve_garbage(); + now = time(0); attempts = SHM->UTMPnumber; #ifdef DEBUG move(1, 0); prints("debugging mode\ncurrent pid: %d\n", getpid()); #else - show_file ("etc/Welcome", 1, -1, NO_RELOAD); + show_file("etc/Welcome", 1, -1, NO_RELOAD); #endif - output ("1", 1); - if (attempts >= MAX_ACTIVE){ - outs ("¥Ñ©ó¤H¼Æ¤Ó¦h¡A½Ð±zµy«á¦A¨Ó¡C\n"); - refresh (); - exit (1); + output("1", 1); + if (attempts >= MAX_ACTIVE) { + outs("¥Ñ©ó¤H¼Æ¤Ó¦h¡A½Ð±zµy«á¦A¨Ó¡C\n"); + refresh(); + exit(1); } - - /* hint */ - - attempts = 0; - while (1){ - if (attempts++ >= LOGINATTEMPTS){ - more ("etc/goodbye", NA); - pressanykey (); - exit (1); - } + /* hint */ + + attempts = 0; + while (1) { + if (attempts++ >= LOGINATTEMPTS) { + more("etc/goodbye", NA); + pressanykey(); + exit(1); + } #ifdef DEBUG - move(19, 0); - prints("current pid: %d ", getpid()); + move(19, 0); + prints("current pid: %d ", getpid()); #endif - getdata (20, 0, "½Ð¿é¤J¥N¸¹¡A©Î¥H[guest]°ÑÆ[¡A¥H[new]µù¥U¡G", - uid, sizeof(uid), DOECHO); - if (strcasecmp (uid, str_new) == 0){ + getdata(20, 0, "½Ð¿é¤J¥N¸¹¡A©Î¥H[guest]°ÑÆ[¡A¥H[new]µù¥U¡G", + uid, sizeof(uid), DOECHO); + if (strcasecmp(uid, str_new) == 0) { #ifdef LOGINASNEW - new_register (); - break; + new_register(); + break; #else - outs ("¥»¨t²Î¥Ø«eµLªk¥H new µù¥U, ½Ð¥Î guest ¶i¤J\n"); - continue; + outs("¥»¨t²Î¥Ø«eµLªk¥H new µù¥U, ½Ð¥Î guest ¶i¤J\n"); + continue; #endif - } - else if (uid[0] == '\0' || !dosearchuser (uid)){ - outs (err_uid); - } - else if (strcmp (uid, STR_GUEST)){ - getdata (21, 0, MSG_PASSWD, passbuf, sizeof(passbuf), NOECHO); - passbuf[8] = '\0'; - - if (!checkpasswd (cuser.passwd, passbuf) - /* || (HAS_PERM(PERM_SYSOP) && !use_shell_login_mode) */ ){ - logattempt (cuser.userid, '-'); - outs (ERR_PASSWD); - } - else{ - logattempt (cuser.userid, ' '); - if (strcasecmp ("SYSOP", cuser.userid) == 0) - cuser.userlevel = PERM_BASIC | PERM_CHAT | PERM_PAGE | - PERM_POST | PERM_LOGINOK | PERM_MAILLIMIT | - PERM_CLOAK | PERM_SEECLOAK | PERM_XEMPT | - PERM_DENYPOST | PERM_BM | PERM_ACCOUNTS | - PERM_CHATROOM | PERM_BOARD | PERM_SYSOP | PERM_BBSADM; - break; - } - } - else{ /* guest */ - cuser.userlevel = 0; - cuser.uflag = COLOR_FLAG | PAGER_FLAG | BRDSORT_FLAG | MOVIE_FLAG; - break; - } - } - multi_user_check (); - sethomepath (genbuf, cuser.userid); - mkdir (genbuf, 0755); + } else if (uid[0] == '\0' || !dosearchuser(uid)) { + outs(err_uid); + } else if (strcmp(uid, STR_GUEST)) { + getdata(21, 0, MSG_PASSWD, passbuf, sizeof(passbuf), NOECHO); + passbuf[8] = '\0'; + + if (!checkpasswd(cuser.passwd, passbuf) + /* || (HAS_PERM(PERM_SYSOP) && !use_shell_login_mode) */ ) { + logattempt(cuser.userid, '-'); + outs(ERR_PASSWD); + } else { + logattempt(cuser.userid, ' '); + if (strcasecmp("SYSOP", cuser.userid) == 0) + cuser.userlevel = PERM_BASIC | PERM_CHAT | PERM_PAGE | + PERM_POST | PERM_LOGINOK | PERM_MAILLIMIT | + PERM_CLOAK | PERM_SEECLOAK | PERM_XEMPT | + PERM_DENYPOST | PERM_BM | PERM_ACCOUNTS | + PERM_CHATROOM | PERM_BOARD | PERM_SYSOP | PERM_BBSADM; + break; + } + } else { /* guest */ + cuser.userlevel = 0; + cuser.uflag = COLOR_FLAG | PAGER_FLAG | BRDSORT_FLAG | MOVIE_FLAG; + break; + } + } + multi_user_check(); + sethomepath(genbuf, cuser.userid); + mkdir(genbuf, 0755); } void -add_distinct (char *fname, char *line) +add_distinct(char *fname, char *line) { - FILE *fp; - int n = 0; - - if ((fp = fopen (fname, "a+"))){ - char buffer[80]; - char tmpname[100]; - FILE *fptmp; - - strcpy (tmpname, fname); - strcat (tmpname, "_tmp"); - if (!(fptmp = fopen (tmpname, "w"))){ - fclose (fp); + FILE *fp; + int n = 0; + + if ((fp = fopen(fname, "a+"))) { + char buffer[80]; + char tmpname[100]; + FILE *fptmp; + + strcpy(tmpname, fname); + strcat(tmpname, "_tmp"); + if (!(fptmp = fopen(tmpname, "w"))) { + fclose(fp); return; } - rewind (fp); - while (fgets (buffer, 80, fp)){ - char *p = buffer + strlen (buffer) - 1; - + rewind(fp); + while (fgets(buffer, 80, fp)) { + char *p = buffer + strlen(buffer) - 1; + if (p[-1] == '\n' || p[-1] == '\r') p[-1] = 0; - if (!strcmp (buffer, line)) + if (!strcmp(buffer, line)) break; - sscanf (buffer + strlen (buffer) + 2, "%d", &n); - fprintf (fptmp, "%s%c#%d\n", buffer, 0, n); + sscanf(buffer + strlen(buffer) + 2, "%d", &n); + fprintf(fptmp, "%s%c#%d\n", buffer, 0, n); } - - if (feof (fp)) - fprintf (fptmp, "%s%c#1\n", line, 0); - else{ - sscanf (buffer + strlen (buffer) + 2, "%d", &n); - fprintf (fptmp, "%s%c#%d\n", buffer, 0, n + 1); - while (fgets (buffer, 80, fp)){ - sscanf (buffer + strlen (buffer) + 2, "%d", &n); - fprintf (fptmp, "%s%c#%d\n", buffer, 0, n); + + if (feof(fp)) + fprintf(fptmp, "%s%c#1\n", line, 0); + else { + sscanf(buffer + strlen(buffer) + 2, "%d", &n); + fprintf(fptmp, "%s%c#%d\n", buffer, 0, n + 1); + while (fgets(buffer, 80, fp)) { + sscanf(buffer + strlen(buffer) + 2, "%d", &n); + fprintf(fptmp, "%s%c#%d\n", buffer, 0, n); } } - fclose (fp); - fclose (fptmp); - unlink (fname); - rename (tmpname, fname); + fclose(fp); + fclose(fptmp); + unlink(fname); + rename(tmpname, fname); } } void -del_distinct (char *fname, char *line) +del_distinct(char *fname, char *line) { - FILE *fp; - int n = 0; - - if ((fp = fopen (fname, "r"))){ - char buffer[80]; - char tmpname[100]; - FILE *fptmp; - - strcpy (tmpname, fname); - strcat (tmpname, "_tmp"); - if (!(fptmp = fopen (tmpname, "w"))){ - fclose (fp); + FILE *fp; + int n = 0; + + if ((fp = fopen(fname, "r"))) { + char buffer[80]; + char tmpname[100]; + FILE *fptmp; + + strcpy(tmpname, fname); + strcat(tmpname, "_tmp"); + if (!(fptmp = fopen(tmpname, "w"))) { + fclose(fp); return; } - rewind (fp); - while (fgets (buffer, 80, fp)){ - char *p = buffer + strlen (buffer) - 1; - + rewind(fp); + while (fgets(buffer, 80, fp)) { + char *p = buffer + strlen(buffer) - 1; + if (p[-1] == '\n' || p[-1] == '\r') p[-1] = 0; - if (!strcmp (buffer, line)) + if (!strcmp(buffer, line)) break; - sscanf (buffer + strlen (buffer) + 2, "%d", &n); - fprintf (fptmp, "%s%c#%d\n", buffer, 0, n); + sscanf(buffer + strlen(buffer) + 2, "%d", &n); + fprintf(fptmp, "%s%c#%d\n", buffer, 0, n); } - - if (!feof (fp)) - while (fgets (buffer, 80, fp)){ - sscanf (buffer + strlen (buffer) + 2, "%d", &n); - fprintf (fptmp, "%s%c#%d\n", buffer, 0, n); + + if (!feof(fp)) + while (fgets(buffer, 80, fp)) { + sscanf(buffer + strlen(buffer) + 2, "%d", &n); + fprintf(fptmp, "%s%c#%d\n", buffer, 0, n); } - fclose (fp); - fclose (fptmp); - unlink (fname); - rename (tmpname, fname); + fclose(fp); + fclose(fptmp); + unlink(fname); + rename(tmpname, fname); } } #ifdef WHERE static int -where (char *from) +where(char *from) { - register int i = 0, count = 0, j; - - for (j = 0; j < SHM->top; j++){ - char *token = strtok (SHM->domain[j], "&"); - + register int i = 0, count = 0, j; + + for (j = 0; j < SHM->top; j++) { + char *token = strtok(SHM->domain[j], "&"); + i = 0; count = 0; - while (token){ - if (strstr (from, token)) + while (token) { + if (strstr(from, token)) count++; - token = strtok (NULL, "&"); + token = strtok(NULL, "&"); i++; } if (i == count) @@ -705,305 +694,302 @@ where (char *from) #endif static void -check_BM () +check_BM() { - int i; - boardheader_t *bhdr; - + int i; + boardheader_t *bhdr; + cuser.userlevel &= ~PERM_BM; - for (i = 0, bhdr = bcache; i < numboards && !is_BM (bhdr->BM); i++, bhdr++) - ; + for (i = 0, bhdr = bcache; i < numboards && !is_BM(bhdr->BM); i++, bhdr++); } static void -setup_utmp (int mode) +setup_utmp(int mode) { - userinfo_t uinfo; - memset (&uinfo, 0, sizeof (uinfo)); - uinfo.pid = currpid = getpid (); + userinfo_t uinfo; + memset(&uinfo, 0, sizeof(uinfo)); + uinfo.pid = currpid = getpid(); uinfo.uid = usernum; uinfo.mode = currstat = mode; - uinfo.mailalert = load_mailalert (cuser.userid); + uinfo.mailalert = load_mailalert(cuser.userid); if (!(cuser.numlogins % 20) && cuser.userlevel & PERM_BM) - check_BM (); /* Ptt ¦Û°Ê¨ú¤UÂ÷¾ªO¥DÅv¤O */ - + check_BM(); /* Ptt ¦Û°Ê¨ú¤UÂ÷¾ªO¥DÅv¤O */ + uinfo.userlevel = cuser.userlevel; uinfo.sex = cuser.sex % 8; - uinfo.lastact = time (NULL); - strcpy (uinfo.userid, cuser.userid); - strcpy (uinfo.realname, cuser.realname); - strcpy (uinfo.username, cuser.username); - strncpy (uinfo.from, fromhost, 23); + uinfo.lastact = time(NULL); + strcpy(uinfo.userid, cuser.userid); + strcpy(uinfo.realname, cuser.realname); + strcpy(uinfo.username, cuser.username); + strncpy(uinfo.from, fromhost, 23); uinfo.five_win = cuser.five_win; uinfo.five_lose = cuser.five_lose; uinfo.five_tie = cuser.five_tie; uinfo.invisible = cuser.invisible % 2; - uinfo.pager = cuser.pager%5; + uinfo.pager = cuser.pager % 5; memcpy(uinfo.mind, cuser.mind, 4); #ifdef WHERE - uinfo.from_alias = where (fromhost); + uinfo.from_alias = where(fromhost); #endif #ifndef FAST_LOGIN - setuserfile (buf, "remoteuser"); - - strcpy (remotebuf, fromhost); - strcat (remotebuf, ctime (&now)); - remotebuf[strlen (remotebuf) - 1] = 0; - add_distinct (buf, remotebuf); + setuserfile(buf, "remoteuser"); + + strcpy(remotebuf, fromhost); + strcat(remotebuf, ctime(&now)); + remotebuf[strlen(remotebuf) - 1] = 0; + add_distinct(buf, remotebuf); #endif if (enter_uflag & CLOAK_FLAG) uinfo.invisible = YEA; - getnewutmpent (&uinfo); + getnewutmpent(&uinfo); #ifndef _BBS_UTIL_C_ - friend_load (); + friend_load(); #endif } static void -user_login () +user_login() { - char ans[4], i; - char genbuf[200]; - struct tm *ptime, *tmp; - time_t now; - int a; + char ans[4], i; + char genbuf[200]; + struct tm *ptime, *tmp; + time_t now; + int a; /*** Heat:¼s§iµü char *ADV[] = { "7/17 @LIVE ¶Ã¼u, ¦óªYÁJ ªº ¤J³õ¨÷n°eµ¹ ptt ªº·R¥ÎªÌ!", "±ýª¾¸Ô±¡½Ð¬Ý PttAct ªO!!", }; ***/ - - log_usies ("ENTER", fromhost); - setproctitle ("%s: %s", margs, cuser.userid); - resolve_fcache (); - resolve_boards (); - memset( &water[0],0,sizeof(water_t) * 6); + + log_usies("ENTER", fromhost); + setproctitle("%s: %s", margs, cuser.userid); + resolve_fcache(); + resolve_boards(); + memset(&water[0], 0, sizeof(water_t) * 6); strcpy(water[0].userid, " ¥þ³¡ "); /* ªì©l¤Æ uinfo¡Bflag¡Bmode */ - setup_utmp (LOGIN); - mysrand (); /* ªì©l¤Æ: random number ¼W¥[user¸ò®É¶¡ªº®t²§ */ + setup_utmp(LOGIN); + mysrand(); /* ªì©l¤Æ: random number ¼W¥[user¸ò®É¶¡ªº®t²§ */ currmode = MODE_STARTED; enter_uflag = cuser.uflag; - + /* get local time */ - time (&now); - ptime = localtime (&now); - tmp = localtime (&cuser.lastlogin); - if ((a = SHM->UTMPnumber) > SHM->max_user){ + time(&now); + ptime = localtime(&now); + tmp = localtime(&cuser.lastlogin); + if ((a = SHM->UTMPnumber) > SHM->max_user) { SHM->max_user = a; SHM->max_time = now; } - init_brdbuf(); - brc_initial (DEFAULT_BOARD); - set_board (); + init_brdbuf(); + brc_initial(DEFAULT_BOARD); + set_board(); /* µe±³B²z¶}©l */ - if (!(HAS_PERM (PERM_SYSOP) && HAS_PERM (PERM_DENYPOST)) && !currutmp->invisible ) - do_aloha ("<<¤W¯¸³qª¾>> -- §Ú¨Ó°Õ¡I"); - if (ptime->tm_mday == cuser.day && ptime->tm_mon + 1 == cuser.month){ - more ("etc/Welcome_birth", NA); + if (!(HAS_PERM(PERM_SYSOP) && HAS_PERM(PERM_DENYPOST)) && !currutmp->invisible) + do_aloha("<<¤W¯¸³qª¾>> -- §Ú¨Ó°Õ¡I"); + if (ptime->tm_mday == cuser.day && ptime->tm_mon + 1 == cuser.month) { + more("etc/Welcome_birth", NA); currutmp->birth = 1; - } - else{ + } else { #ifdef MULTI_WELCOME_LOGIN - char buf[80]; - int nScreens; - for( nScreens = 0 ; nScreens < 10 ; ++nScreens ){ + char buf[80]; + int nScreens; + for (nScreens = 0; nScreens < 10; ++nScreens) { sprintf(buf, "etc/Welcome_login.%d", nScreens); - if( access(buf, 0) < 0 ) + if (access(buf, 0) < 0) break; } printf("%d\n", nScreens); - if( nScreens == 0 ){ // multi screen error? - more ("etc/Welcome_login", NA); - } - else{ + if (nScreens == 0) { + //multi screen error ? + more("etc/Welcome_login", NA); + } else { sprintf(buf, "etc/Welcome_login.%d", (int)login_start_time % nScreens); - more (buf, NA); + more(buf, NA); } #else - more ("etc/Welcome_login", NA); + more("etc/Welcome_login", NA); #endif //pressanykey(); //more("etc/CSIE_Week", NA); currutmp->birth = 0; } - - if (cuser.userlevel){/* not guest */ - move (t_lines - 4, 0); - prints ("\033[m Åwªï±z²Ä \033[1;33m%d\033[0;37m «×«ô³X¥»¯¸¡A" - "¤W¦¸±z¬O±q \033[1;33m%s\033[0;37m ³s©¹¥»¯¸¡A\n" - " §Ú°O±o¨º¤Ñ¬O \033[1;33m%s\033[0;37m¡C\n", - ++cuser.numlogins, cuser.lasthost, Cdate (&cuser.lastlogin)); - pressanykey (); - - if (currutmp->birth && tmp->tm_mday != ptime->tm_mday){ - more ("etc/birth.post", YEA); - brc_initial ("WhoAmI"); - set_board (); - do_post (); + + if (cuser.userlevel) { /* not guest */ + move(t_lines - 4, 0); + prints("\033[m Åwªï±z²Ä \033[1;33m%d\033[0;37m «×«ô³X¥»¯¸¡A" + "¤W¦¸±z¬O±q \033[1;33m%s\033[0;37m ³s©¹¥»¯¸¡A\n" + " §Ú°O±o¨º¤Ñ¬O \033[1;33m%s\033[0;37m¡C\n", + ++cuser.numlogins, cuser.lasthost, Cdate(&cuser.lastlogin)); + pressanykey(); + + if (currutmp->birth && tmp->tm_mday != ptime->tm_mday) { + more("etc/birth.post", YEA); + brc_initial("WhoAmI"); + set_board(); + do_post(); } - setuserfile (genbuf, str_badlogin); - if (more (genbuf, NA) != -1){ - getdata (b_lines - 1, 0, "±zn§R°£¥H¤W¿ù»~¹Á¸Õªº°O¿ý¶Ü(Y/N)?[Y]", - ans, 3, LCECHO); + setuserfile(genbuf, str_badlogin); + if (more(genbuf, NA) != -1) { + getdata(b_lines - 1, 0, "±zn§R°£¥H¤W¿ù»~¹Á¸Õªº°O¿ý¶Ü(Y/N)?[Y]", + ans, 3, LCECHO); if (*ans != 'n') - unlink (genbuf); + unlink(genbuf); } - check_register (); - strncpy (cuser.lasthost, fromhost, 16); + check_register(); + strncpy(cuser.lasthost, fromhost, 16); cuser.lasthost[15] = '\0'; - restore_backup (); - } - else if (!strcmp (cuser.userid, STR_GUEST)){ - char *nick[13] = { + restore_backup(); + } else if (!strcmp(cuser.userid, STR_GUEST)) { + char *nick[13] = { "·¦¤l", "¨©´ß", "¤º¦ç", "Ä_¯S²~", "½¨®³½", "¾ð¸", "¯BµÓ", "¾c¤l", "¼ç¤ô¸¥", "Å]¤ý", "ÅKÅø", "¦Ò¨÷", "¤j¬ü¤k" }; - char *name[13] = { + char *name[13] = { "¤j¤ý·¦¤l", "ÆxÄMÁ³", "¤ñ°ò¥§", "¥i¤f¥i¼Ö", "¥õªaªº³½", "¾Ð", "°ª©£«Î", "AIR Jordon", "¬õ¦â¤Q¤ë¸¹", "§å½ð½ð", "SASAYA·¦¥¤", "Àn³J", "¥¬¾|§J÷«³½»µ·" }; - char *addr[13] = { + char *addr[13] = { "¤Ñ°ó¼Ö¶é", "¤j®ü", "ºñ®q¤p©]¦±", "¬ü°ê", "ºñ¦â¬À·äÁG", "»·¤è", "쥻®ü", "NIKE", "ĬÁp", "¨k¤K618«Ç", "·R¤§¨ý", "¤Ñ¤W", "ÂŦâ¬À·äÁG" }; i = login_start_time % 13; - sprintf (cuser.username, "®üÃäº}¨Óªº%s", nick[(int) i]); - sprintf (currutmp->username, cuser.username); - sprintf (cuser.realname, name[(int) i]); - sprintf (currutmp->realname, cuser.realname); - sprintf (cuser.address, addr[(int) i]); + sprintf(cuser.username, "®üÃäº}¨Óªº%s", nick[(int)i]); + sprintf(currutmp->username, cuser.username); + sprintf(cuser.realname, name[(int)i]); + sprintf(currutmp->realname, cuser.realname); + sprintf(cuser.address, addr[(int)i]); cuser.sex = i % 8; currutmp->pager = 2; - pressanykey (); - } - else - pressanykey (); - - if (!PERM_HIDE (currutmp)) + pressanykey(); + } else + pressanykey(); + + if (!PERM_HIDE(currutmp)) cuser.lastlogin = login_start_time; - - passwd_update (usernum, &cuser); - + + passwd_update(usernum, &cuser); + for (i = 0; i < NUMVIEWFILE; i++) if ((cuser.loginview >> i) & 1) - more (loginview_file[(int) i][0], YEA); + more(loginview_file[(int)i][0], YEA); } static void -do_aloha (char *hello) +do_aloha(char *hello) { - FILE *fp; - char userid[80]; - char genbuf[200]; - - setuserfile (genbuf, "aloha"); - if ((fp = fopen (genbuf, "r"))){ - sprintf (genbuf, hello); - while (fgets (userid, 80, fp)){ - userinfo_t *uentp; - int tuid; - - if ((tuid = searchuser (userid)) && tuid != usernum && - (uentp = (userinfo_t *) search_ulist (tuid)) && - isvisible(uentp, currutmp)){ - my_write (uentp->pid, genbuf, uentp->userid, 2, NULL); + FILE *fp; + char userid[80]; + char genbuf[200]; + + setuserfile(genbuf, "aloha"); + if ((fp = fopen(genbuf, "r"))) { + sprintf(genbuf, hello); + while (fgets(userid, 80, fp)) { + userinfo_t *uentp; + int tuid; + + if ((tuid = searchuser(userid)) && tuid != usernum && + (uentp = (userinfo_t *) search_ulist(tuid)) && + isvisible(uentp, currutmp)) { + my_write(uentp->pid, genbuf, uentp->userid, 2, NULL); } } - fclose (fp); + fclose(fp); } } static void -do_term_init () +do_term_init() { - term_init (); - initscr (); + term_init(); + initscr(); } static void -start_client () +start_client() { #ifdef CPULIMIT - struct rlimit rml; + struct rlimit rml; rml.rlim_cur = CPULIMIT * 60; rml.rlim_max = CPULIMIT * 60; setrlimit(RLIMIT_CPU, &rml); #endif - + /* system init */ - nice (2); /* Ptt: lower priority */ - login_start_time = time (0); + nice(2); /* Ptt: lower priority */ + login_start_time = time(0); currmode = 0; - - signal (SIGHUP, abort_bbs); - signal (SIGTERM, abort_bbs); - signal (SIGPIPE, abort_bbs); - - signal (SIGINT, abort_bbs_debug); - signal (SIGQUIT, abort_bbs_debug); - signal (SIGILL, abort_bbs_debug); - signal (SIGABRT, abort_bbs_debug); - signal (SIGFPE, abort_bbs_debug); - signal (SIGBUS, abort_bbs_debug); - signal (SIGSEGV, abort_bbs_debug); - - signal_restart (SIGUSR1, talk_request); - signal_restart (SIGUSR2, write_request); - - dup2 (0, 1); + + signal(SIGHUP, abort_bbs); + signal(SIGTERM, abort_bbs); + signal(SIGPIPE, abort_bbs); + + signal(SIGINT, abort_bbs_debug); + signal(SIGQUIT, abort_bbs_debug); + signal(SIGILL, abort_bbs_debug); + signal(SIGABRT, abort_bbs_debug); + signal(SIGFPE, abort_bbs_debug); + signal(SIGBUS, abort_bbs_debug); + signal(SIGSEGV, abort_bbs_debug); + + signal_restart(SIGUSR1, talk_request); + signal_restart(SIGUSR2, write_request); + + dup2(0, 1); /* initialize passwd semaphores */ - if( passwd_init() ) - exit (1); - - do_term_init (); - signal (SIGALRM, abort_bbs); - alarm (600); - login_query (); /* Ptt ¥[¤Wlogin time out */ - user_login (); - m_init (); - - if (now - SHM->close_vote_time > 86400) // §ï¬°¤@¤Ñ¤@¦¸ - { - b_closepolls (); - SHM->close_vote_time = now; - } + if (passwd_init()) + exit(1); + + do_term_init(); + signal(SIGALRM, abort_bbs); + alarm(600); + login_query(); /* Ptt ¥[¤Wlogin time out */ + user_login(); + m_init(); + + if (now - SHM->close_vote_time > 86400) + //§ï¬°¤@¤Ñ¤@¦¸ + { + b_closepolls(); + SHM->close_vote_time = now; + } if (!(cuser.uflag & COLOR_FLAG)) showansi = 0; - signal (SIGALRM, SIG_IGN); - if (chkmailbox ()) - m_read (); - - domenu (MMENU, "¥D¥\\¯àªí", (currutmp->mailalert ? 'M' : 'C'), cmdlist); + signal(SIGALRM, SIG_IGN); + if (chkmailbox()) + m_read(); + + domenu(MMENU, "¥D¥\\¯àªí", (currutmp->mailalert ? 'M' : 'C'), cmdlist); } /* FSA (finite state automata) for telnet protocol */ static void -telnet_init () +telnet_init() { - static char svr[] = { + static char svr[] = { IAC, DO, TELOPT_TTYPE, IAC, SB, TELOPT_TTYPE, TELQUAL_SEND, IAC, SE, IAC, WILL, TELOPT_ECHO, IAC, WILL, TELOPT_SGA }; - char *cmd; - int n, len, rset; - struct timeval to; - char buf[64]; - for (n = 0, cmd = svr; n < 4; n++){ + char *cmd; + int n, len, rset; + struct timeval to; + char buf[64]; + for (n = 0, cmd = svr; n < 4; n++) { len = (n == 1 ? 6 : 3); - write (0, cmd, len); + write(0, cmd, len); cmd += len; to.tv_sec = 3; to.tv_usec = 0; - rset=1; + rset = 1; if (select(1, (fd_set *) & rset, NULL, NULL, &to) > 0) - recv(0, buf, sizeof (buf),0); + recv(0, buf, sizeof(buf), 0); } } @@ -1013,7 +999,7 @@ telnet_init () * 1413 protocols. It queries an RFC 931 etc. compatible daemon on a remote * host to look up the owner of a connection. The information should not be * used for authentication purposes. This routine intercepts alarm signals. - * + * * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands. */ @@ -1025,140 +1011,141 @@ telnet_init () #if 0 /* timeout - handle timeouts */ static void -timeout (int sig) +timeout(int sig) { - longjmp (byebye, sig); + longjmp(byebye, sig); } #endif static void -getremotename (struct sockaddr_in *from, char *rhost, char *rname) +getremotename(struct sockaddr_in * from, char *rhost, char *rname) { /* get remote host name */ - + #ifdef FAST_LOGIN - strcpy (rhost, (char *) inet_ntoa (from->sin_addr)); + strcpy(rhost, (char *)inet_ntoa(from->sin_addr)); #else struct sockaddr_in our_sin; struct sockaddr_in rmt_sin; - unsigned rmt_port, rmt_pt; - unsigned our_port, our_pt; - FILE *fp; - char buffer[512], user[80], *cp; - int s; + unsigned rmt_port, rmt_pt; + unsigned our_port, our_pt; + FILE *fp; + char buffer[512], user[80], *cp; + int s; static struct hostent *hp; - - + + hp = NULL; - if (setjmp (byebye) == 0){ - signal (SIGALRM, timeout); - alarm (3); - hp = gethostbyaddr ((char *) &from->sin_addr, sizeof (struct in_addr), - from->sin_family); - alarm (0); + if (setjmp(byebye) == 0) { + signal(SIGALRM, timeout); + alarm(3); + hp = gethostbyaddr((char *)&from->sin_addr, sizeof(struct in_addr), + from->sin_family); + alarm(0); } - strcpy (rhost, hp ? hp->h_name : (char *) inet_ntoa (from->sin_addr)); - -/* - * Use one unbuffered stdio stream for writing to and for reading from the - * RFC931 etc. server. This is done because of a bug in the SunOS 4.1.x - * stdio library. The bug may live in other stdio implementations, too. - * When we use a single, buffered, bidirectional stdio stream ("r+" or "w+" - * mode) we read our own output. Such behaviour would make sense with - * resources that support random-access operations, but not with sockets. - */ + strcpy(rhost, hp ? hp->h_name : (char *)inet_ntoa(from->sin_addr)); + + /* + * Use one unbuffered stdio stream for writing to and for reading from + * the RFC931 etc. server. This is done because of a bug in the SunOS + * 4.1.x stdio library. The bug may live in other stdio implementations, + * too. When we use a single, buffered, bidirectional stdio stream ("r+" + * or "w+" mode) we read our own output. Such behaviour would make sense + * with resources that support random-access operations, but not with + * sockets. + */ - s = sizeof (our_sin); - if (getsockname (0, (struct sockaddr *) &our_sin, &s) < 0) + s = sizeof(our_sin); + if (getsockname(0, (struct sockaddr *) & our_sin, &s) < 0) return; - - if ((s = socket (AF_INET, SOCK_STREAM, 0)) < 0) + + if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) return; - - if (!(fp = fdopen (s, "r+"))){ - close (s); + + if (!(fp = fdopen(s, "r+"))) { + close(s); return; } /* Set up a timer so we won't get stuck while waiting for the server. */ - if (setjmp (byebye) == 0){ - signal (SIGALRM, timeout); - alarm (RFC931_TIMEOUT); - -/* - * Bind the local and remote ends of the query socket to the same IP - * addresses as the connection under investigation. We go through all - * this trouble because the local or remote system might have more than - * one network address. The RFC931 etc. client sends only port numbers; - * the server takes the IP addresses from the query socket. - */ - our_pt = ntohs (our_sin.sin_port); - our_sin.sin_port = htons (ANY_PORT); - - rmt_sin = *from; - rmt_pt = ntohs (rmt_sin.sin_port); - rmt_sin.sin_port = htons (RFC931_PORT); - - setbuf (fp, (char *) 0); - s = fileno (fp); - - if (bind (s, (struct sockaddr *) &our_sin, sizeof (our_sin)) >= 0 && - connect (s, (struct sockaddr *) &rmt_sin, sizeof (rmt_sin)) >= 0){ -/* - * Send query to server. Neglect the risk that a 13-byte write would - * have to be fragmented by the local system and cause trouble with - * buggy System V stdio libraries. - */ - fprintf (fp, "%u,%u\r\n", rmt_pt, our_pt); - fflush (fp); -/* - * Read response from server. Use fgets()/sscanf() so we can work - * around System V stdio libraries that incorrectly assume EOF when a - * read from a socket returns less than requested. - */ - if (fgets (buffer, sizeof (buffer), fp) && !ferror (fp) - && !feof (fp) - && sscanf (buffer, "%u , %u : USERID :%*[^:]:%79s", &rmt_port, - &our_port, user) == 3 && rmt_pt == rmt_port - && our_pt == our_port){ + if (setjmp(byebye) == 0) { + signal(SIGALRM, timeout); + alarm(RFC931_TIMEOUT); + + /* + * Bind the local and remote ends of the query socket to the same IP + * addresses as the connection under investigation. We go through all + * this trouble because the local or remote system might have more + * than one network address. The RFC931 etc. client sends only port + * numbers; the server takes the IP addresses from the query socket. + */ + our_pt = ntohs(our_sin.sin_port); + our_sin.sin_port = htons(ANY_PORT); -/* - * Strip trailing carriage return. It is part of the protocol, not - * part of the data. - */ - if ((cp = (char *) strchr (user, '\r'))) + rmt_sin = *from; + rmt_pt = ntohs(rmt_sin.sin_port); + rmt_sin.sin_port = htons(RFC931_PORT); + + setbuf(fp, (char *)0); + s = fileno(fp); + + if (bind(s, (struct sockaddr *) & our_sin, sizeof(our_sin)) >= 0 && + connect(s, (struct sockaddr *) & rmt_sin, sizeof(rmt_sin)) >= 0) { + /* + * Send query to server. Neglect the risk that a 13-byte write + * would have to be fragmented by the local system and cause + * trouble with buggy System V stdio libraries. + */ + fprintf(fp, "%u,%u\r\n", rmt_pt, our_pt); + fflush(fp); + /* + * Read response from server. Use fgets()/sscanf() so we can work + * around System V stdio libraries that incorrectly assume EOF + * when a read from a socket returns less than requested. + */ + if (fgets(buffer, sizeof(buffer), fp) && !ferror(fp) + && !feof(fp) + && sscanf(buffer, "%u , %u : USERID :%*[^:]:%79s", &rmt_port, + &our_port, user) == 3 && rmt_pt == rmt_port + && our_pt == our_port) { + + /* + * Strip trailing carriage return. It is part of the + * protocol, not part of the data. + */ + if ((cp = (char *)strchr(user, '\r'))) *cp = 0; - strcpy (rname, user); + strcpy(rname, user); } } - alarm (0); + alarm(0); } - fclose (fp); + fclose(fp); #endif } static int -bind_port (int port) +bind_port(int port) { - int sock, on; - - sock = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); - + int sock, on; + + sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + on = 1; - setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)); - setsockopt (sock, SOL_SOCKET, SO_KEEPALIVE, (char *) &on, sizeof (on)); - + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)); + setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, sizeof(on)); + on = 0; - setsockopt (sock, SOL_SOCKET, SO_LINGER, (char *) &on, sizeof (on)); - - xsin.sin_port = htons (port); - if (bind (sock, (struct sockaddr *) &xsin, sizeof xsin) < 0){ - syslog (LOG_INFO, "bbsd bind_port can't bind to %d", port); - exit (1); + setsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&on, sizeof(on)); + + xsin.sin_port = htons(port); + if (bind(sock, (struct sockaddr *) & xsin, sizeof xsin) < 0) { + syslog(LOG_INFO, "bbsd bind_port can't bind to %d", port); + exit(1); } - if (listen (sock, SOCKET_QLEN) < 0){ - syslog (LOG_INFO, "bbsd bind_port can't listen to %d", port); - exit (1); + if (listen(sock, SOCKET_QLEN) < 0) { + syslog(LOG_INFO, "bbsd bind_port can't listen to %d", port); + exit(1); } return sock; } @@ -1167,136 +1154,132 @@ bind_port (int port) /*******************************************************/ -static void shell_login (int argc, char *argv[], char *envp[]); -static void daemon_login (int argc, char *argv[], char *envp[]); -static int check_ban_and_load (int fd); +static void shell_login(int argc, char *argv[], char *envp[]); +static void daemon_login(int argc, char *argv[], char *envp[]); +static int check_ban_and_load(int fd); int -main (int argc, char *argv[], char *envp[]) +main(int argc, char *argv[], char *envp[]) { start_time = time(NULL); /* avoid SIGPIPE */ - signal (SIGPIPE, SIG_IGN); - + signal(SIGPIPE, SIG_IGN); + /* avoid erroneous signal from other mbbsd */ - signal (SIGUSR1, SIG_IGN); - signal (SIGUSR2, SIG_IGN); - + signal(SIGUSR1, SIG_IGN); + signal(SIGUSR2, SIG_IGN); + /* check if invoked as "bbs" */ if (argc == 3) - shell_login (argc, argv, envp); + shell_login(argc, argv, envp); else - daemon_login (argc, argv, envp); - + daemon_login(argc, argv, envp); + return 0; } static void -shell_login (int argc, char *argv[], char *envp[]) +shell_login(int argc, char *argv[], char *envp[]) { - + /* Give up root privileges: no way back from here */ - setgid (BBSGID); - setuid (BBSUID); - chdir (BBSHOME); - - + setgid(BBSGID); + setuid(BBSUID); + chdir(BBSHOME); + + use_shell_login_mode = 1; - initsetproctitle (argc, argv, envp); - - /* copy fromindent: Standard input:1138: Error:Unexpected end of file - the original "bbs" */ - if (argc > 1){ - strcpy (fromhost, argv[1]); + initsetproctitle(argc, argv, envp); + + /* + * copy fromindent: Standard input:1138: Error:Unexpected end of file the + * original "bbs" + */ + if (argc > 1) { + strcpy(fromhost, argv[1]); if (argc > 3) - strcpy (remoteusername, argv[3]); + strcpy(remoteusername, argv[3]); } - - close (2); + close(2); /* don't close fd 1, at least init_tty need it */ - - init_tty (); - if (check_ban_and_load (0)){ - exit (0); + + init_tty(); + if (check_ban_and_load(0)) { + exit(0); } - start_client (); + start_client(); } static void -daemon_login (int argc, char *argv[], char *envp[]) +daemon_login(int argc, char *argv[], char *envp[]) { - int msock, csock; /* socket for Master and Child */ - FILE *fp; - int listen_port = 23; - int len_of_sock_addr; - char buf[256]; - + int msock, csock; /* socket for Master and Child */ + FILE *fp; + int listen_port = 23; + int len_of_sock_addr; + char buf[256]; + /* setup standalone */ start_daemon(); - + signal_restart(SIGCHLD, reapchild); - + /* choose port */ - if(argc == 1) + if (argc == 1) listen_port = 3006; - else if(argc >= 2) + else if (argc >= 2) listen_port = atoi(argv[1]); - sprintf(margs, "%s %d ", argv[0],listen_port); + sprintf(margs, "%s %d ", argv[0], listen_port); /* port binding */ xsin.sin_family = AF_INET; msock = bind_port(listen_port); - if(msock<0) { + if (msock < 0) { syslog(LOG_INFO, "mbbsd bind_port failed.\n"); exit(1); } - - initsetproctitle(argc, argv, envp); setproctitle("%s: listening ", margs); - + /* Give up root privileges: no way back from here */ setgid(BBSGID); setuid(BBSUID); chdir(BBSHOME); - + sprintf(buf, "run/mbbsd.%d.pid", listen_port); - if((fp = fopen(buf, "w"))) { + if ((fp = fopen(buf, "w"))) { fprintf(fp, "%d\n", getpid()); fclose(fp); } - /* main loop */ - for(;;) { + for (;;) { len_of_sock_addr = sizeof(xsin); - csock = accept(msock, (struct sockaddr *)&xsin, (socklen_t *)&len_of_sock_addr); + csock = accept(msock, (struct sockaddr *) & xsin, (socklen_t *) & len_of_sock_addr); - if(csock < 0) { - if(errno!=EINTR) sleep(1); + if (csock < 0) { + if (errno != EINTR) + sleep(1); continue; } - - if(check_ban_and_load(csock)) - { + if (check_ban_and_load(csock)) { close(csock); continue; } - #ifdef NO_FORK break; #else - if(fork()==0) + if (fork() == 0) break; else close(csock); #endif - } + } /* here is only child running */ - + setproctitle("%s: ...login wait... ", margs); close(msock); dup2(csock, 0); @@ -1309,35 +1292,34 @@ daemon_login (int argc, char *argv[], char *envp[]) close(1); } -/* check if we're banning login and if the load is too high. - if login is permitted, return 0; - else return -1; - approriate message is output to fd. -*/ -static int check_ban_and_load(int fd) +/* + * check if we're banning login and if the load is too high. if login is + * permitted, return 0; else return -1; approriate message is output to fd. + */ +static int +check_ban_and_load(int fd) { - FILE *fp; - static char buf[256]; - static time_t chkload_time = 0; - static int overload = 0; /* overload or banned, update every 1 sec */ - static int banned = 0; - - if((time(0) - chkload_time) > 1) { + FILE *fp; + static char buf[256]; + static time_t chkload_time = 0; + static int overload = 0; /* overload or banned, update every 1 + * sec */ + static int banned = 0; + + if ((time(0) - chkload_time) > 1) { overload = chkload(buf); - banned = !access(BBSHOME "/BAN",R_OK) && + banned = !access(BBSHOME "/BAN", R_OK) && (strcmp(fromhost, "localhost") != 0); chkload_time = time(0); } - write(fd, buf, strlen(buf)); - if(banned && (fp = fopen(BBSHOME "/BAN", "r"))) { - while(fgets(buf, 256, fp)) + if (banned && (fp = fopen(BBSHOME "/BAN", "r"))) { + while (fgets(buf, 256, fp)) write(fd, buf, strlen(buf)); fclose(fp); } - - if(banned || overload) + if (banned || overload) return -1; #ifdef INSCREEN |