diff options
Diffstat (limited to 'innbbsd/innbbsd.c')
-rw-r--r-- | innbbsd/innbbsd.c | 1246 |
1 files changed, 634 insertions, 612 deletions
diff --git a/innbbsd/innbbsd.c b/innbbsd/innbbsd.c index f7fc0fc0..a302c398 100644 --- a/innbbsd/innbbsd.c +++ b/innbbsd/innbbsd.c @@ -12,769 +12,791 @@ #endif #ifdef STDC -# ifndef ARG -# define ARG(x) (x) -# else -# define ARG(x) () -# endif +#ifndef ARG +#define ARG(x) (x) +#else +#define ARG(x) () +#endif #endif -/*< add <mid> <recno> ... -> 200 OK -< quit - 500 BYE - -> 300 DBZ Server ... -< query <mid> -> 250 <recno> ... -> 450 NOT FOUND! -*/ - -static int CMDhelp ARG((ClientType*)); -static int CMDquit ARG((ClientType*)); -static int CMDihave ARG((ClientType*)); -static int CMDstat ARG((ClientType*)); -static int CMDaddhist ARG((ClientType*)); -static int CMDgrephist ARG((ClientType*)); -static int CMDmidcheck ARG((ClientType*)); -static int CMDshutdown ARG((ClientType*)); -static int CMDmode ARG((ClientType*)); -static int CMDreload ARG((ClientType*)); -static int CMDhismaint ARG((ClientType*)); -static int CMDverboselog ARG((ClientType*)); -static int CMDlistnodelist ARG((ClientType*)); -static int CMDlistnewsfeeds ARG((ClientType*)); +/* + * < add <mid> <recno> ... > 200 OK < quit 500 BYE + * + * > 300 DBZ Server ... < query <mid> > 250 <recno> ... > 450 NOT FOUND! + */ + +static int CMDhelp ARG((ClientType *)); +static int CMDquit ARG((ClientType *)); +static int CMDihave ARG((ClientType *)); +static int CMDstat ARG((ClientType *)); +static int CMDaddhist ARG((ClientType *)); +static int CMDgrephist ARG((ClientType *)); +static int CMDmidcheck ARG((ClientType *)); +static int CMDshutdown ARG((ClientType *)); +static int CMDmode ARG((ClientType *)); +static int CMDreload ARG((ClientType *)); +static int CMDhismaint ARG((ClientType *)); +static int CMDverboselog ARG((ClientType *)); +static int CMDlistnodelist ARG((ClientType *)); +static int CMDlistnewsfeeds ARG((ClientType *)); #ifdef GETRUSAGE -static int CMDgetrusage ARG((ClientType*)); -static int CMDmallocmap ARG((ClientType*)); +static int CMDgetrusage ARG((ClientType *)); +static int CMDmallocmap ARG((ClientType *)); #endif -static daemoncmd_t cmds[]= -/* cmd-name, cmd-usage, min-argc, max-argc, errorcode, normalcode, cmd-func */ -{ {"help","help [cmd]",1,2,99,100,CMDhelp}, - {"quit","quit",1,0,99,100,CMDquit}, +static daemoncmd_t cmds[] = +/* cmd-name, cmd-usage, min-argc, max-argc, errorcode, normalcode, cmd-func */ +{{"help", "help [cmd]", 1, 2, 99, 100, CMDhelp}, +{"quit", "quit", 1, 0, 99, 100, CMDquit}, #ifndef DBZSERVER - {"ihave","ihave mid",2,2,435,335,CMDihave}, +{"ihave", "ihave mid", 2, 2, 435, 335, CMDihave}, #endif - {"stat","stat mid",2,2,223,430,CMDstat}, - {"addhist","addhist <mid> <path>",3,3, NNTP_ADDHIST_BAD, NNTP_ADDHIST_OK,CMDaddhist}, - {"grephist","grephist <mid>",2,2, NNTP_GREPHIST_BAD, NNTP_GREPHIST_OK, CMDgrephist}, - {"midcheck","midcheck [on|off]",1,2, NNTP_MIDCHECK_BAD, NNTP_MIDCHECK_OK, CMDmidcheck}, - {"shutdown","shutdown (local)",1,1, NNTP_SHUTDOWN_BAD, NNTP_SHUTDOWN_OK, CMDshutdown}, - {"mode","mode (local)",1,1, NNTP_MODE_BAD, NNTP_MODE_OK, CMDmode}, - {"listnodelist","listnodelist (local)",1,1, NNTP_MODE_BAD, NNTP_MODE_OK, CMDlistnodelist}, - {"listnewsfeeds","listnewsfeeds (local)",1,1, NNTP_MODE_BAD, NNTP_MODE_OK, CMDlistnewsfeeds}, - {"reload","reload (local)",1,1, NNTP_RELOAD_BAD, NNTP_RELOAD_OK, CMDreload}, - {"hismaint","hismaint (local)",1,1, NNTP_RELOAD_BAD, NNTP_RELOAD_OK, CMDhismaint}, - {"verboselog","verboselog [on|off](local)",1,2, NNTP_VERBOSELOG_BAD, NNTP_VERBOSELOG_OK, CMDverboselog}, +{"stat", "stat mid", 2, 2, 223, 430, CMDstat}, +{"addhist", "addhist <mid> <path>", 3, 3, NNTP_ADDHIST_BAD, NNTP_ADDHIST_OK, CMDaddhist}, +{"grephist", "grephist <mid>", 2, 2, NNTP_GREPHIST_BAD, NNTP_GREPHIST_OK, CMDgrephist}, +{"midcheck", "midcheck [on|off]", 1, 2, NNTP_MIDCHECK_BAD, NNTP_MIDCHECK_OK, CMDmidcheck}, +{"shutdown", "shutdown (local)", 1, 1, NNTP_SHUTDOWN_BAD, NNTP_SHUTDOWN_OK, CMDshutdown}, +{"mode", "mode (local)", 1, 1, NNTP_MODE_BAD, NNTP_MODE_OK, CMDmode}, +{"listnodelist", "listnodelist (local)", 1, 1, NNTP_MODE_BAD, NNTP_MODE_OK, CMDlistnodelist}, +{"listnewsfeeds", "listnewsfeeds (local)", 1, 1, NNTP_MODE_BAD, NNTP_MODE_OK, CMDlistnewsfeeds}, +{"reload", "reload (local)", 1, 1, NNTP_RELOAD_BAD, NNTP_RELOAD_OK, CMDreload}, +{"hismaint", "hismaint (local)", 1, 1, NNTP_RELOAD_BAD, NNTP_RELOAD_OK, CMDhismaint}, +{"verboselog", "verboselog [on|off](local)", 1, 2, NNTP_VERBOSELOG_BAD, NNTP_VERBOSELOG_OK, CMDverboselog}, #ifdef GETRUSAGE - {"getrusage","getrusage (local)",1,1, NNTP_MODE_BAD, NNTP_MODE_OK, CMDgetrusage}, +{"getrusage", "getrusage (local)", 1, 1, NNTP_MODE_BAD, NNTP_MODE_OK, CMDgetrusage}, #endif #ifdef MALLOCMAP - {"mallocmap","mallocmap (local)",1,1, NNTP_MODE_BAD, NNTP_MODE_OK, CMDmallocmap}, +{"mallocmap", "mallocmap (local)", 1, 1, NNTP_MODE_BAD, NNTP_MODE_OK, CMDmallocmap}, #endif - {NULL,NULL,0,0,99,100,NULL} +{NULL, NULL, 0, 0, 99, 100, NULL} }; installinnbbsd() { - installdaemon(cmds,100,NULL); + installdaemon(cmds, 100, NULL); } #ifdef OLDLIBINBBSINND testandmkdir(dir) -char *dir; + char *dir; { - if (!isdir(dir)) { - char path[MAXPATHLEN+12]; - sprintf(path,"mkdir -p %s",dir); - system(path); - } + if (!isdir(dir)) { + char path[MAXPATHLEN + 12]; + sprintf(path, "mkdir -p %s", dir); + system(path); + } } - -static char splitbuf[2048]; -static char joinbuf[1024]; -#define MAXTOK 50 -static char* Splitptr[MAXTOK]; -char **split(line,pat) -char *line,*pat; + +static char splitbuf[2048]; +static char joinbuf[1024]; +#define MAXTOK 50 +static char *Splitptr[MAXTOK]; +char ** +split(line, pat) + char *line, *pat; { - char *p; - int i; - - for (i=0;i<MAXTOK;++i) Splitptr[i] = NULL; - strncpy(splitbuf,line,sizeof splitbuf - 1 ); - /*printf("%d %d\n",strlen(line),strlen(splitbuf));*/ - splitbuf[sizeof splitbuf - 1] = '\0'; - for (i=0,p=splitbuf;*p && i< MAXTOK -1 ;){ - for (Splitptr[i++]=p;*p && !strchr(pat,*p);p++); - if (*p=='\0') break; - for (*p++='\0'; *p && strchr(pat,*p);p++); - } - return Splitptr; + char *p; + int i; + + for (i = 0; i < MAXTOK; ++i) + Splitptr[i] = NULL; + strncpy(splitbuf, line, sizeof splitbuf - 1); + /* printf("%d %d\n",strlen(line),strlen(splitbuf)); */ + splitbuf[sizeof splitbuf - 1] = '\0'; + for (i = 0, p = splitbuf; *p && i < MAXTOK - 1;) { + for (Splitptr[i++] = p; *p && !strchr(pat, *p); p++); + if (*p == '\0') + break; + for (*p++ = '\0'; *p && strchr(pat, *p); p++); + } + return Splitptr; } -char **BNGsplit(line) -char *line; +char ** +BNGsplit(line) + char *line; { - char **ptr = split(line,","); - newsfeeds_t *nf1, *nf2; - char *n11, *n12, *n21, *n22; - int i,j; - for (i=0; ptr[i] != NULL; i++) { - nf1 = (newsfeeds_t*)search_group(ptr[i]); - for (j=i+1; ptr[j] != NULL; j++) { - if (strcmp(ptr[i],ptr[j])==0) { - *ptr[j] = '\0'; - continue; - } - nf2 = (newsfeeds_t*)search_group(ptr[j]); - if (nf1 && nf2) { - if (strcmp(nf1->board,nf2->board)==0) { - *ptr[j] = '\0'; - continue; - } - for (n11 = nf1->board, n12 = (char*)strchr(n11,','); - n11 && *n11 ; n12 = (char*) strchr(n11,',')) { - if (n12) *n12 = '\0'; - for (n21 = nf2->board, n22 = (char*)strchr(n21,','); - n21 && *n21 ; n22 = (char*) strchr(n21,',')) { - if (n22) *n22 = '\0'; - if (strcmp(n11,n21)==0) { - *n21 = '\t'; - } - if (n22) { - *n22 = ','; - n21 = n22 + 1; - } else - break; - } - if (n12) { - *n12 = ','; - n11 = n12 +1; - } else - break; - } - } - } - } - return ptr; + char **ptr = split(line, ","); + newsfeeds_t *nf1, *nf2; + char *n11, *n12, *n21, *n22; + int i, j; + for (i = 0; ptr[i] != NULL; i++) { + nf1 = (newsfeeds_t *) search_group(ptr[i]); + for (j = i + 1; ptr[j] != NULL; j++) { + if (strcmp(ptr[i], ptr[j]) == 0) { + *ptr[j] = '\0'; + continue; + } + nf2 = (newsfeeds_t *) search_group(ptr[j]); + if (nf1 && nf2) { + if (strcmp(nf1->board, nf2->board) == 0) { + *ptr[j] = '\0'; + continue; + } + for (n11 = nf1->board, n12 = (char *)strchr(n11, ','); + n11 && *n11; n12 = (char *)strchr(n11, ',')) { + if (n12) + *n12 = '\0'; + for (n21 = nf2->board, n22 = (char *)strchr(n21, ','); + n21 && *n21; n22 = (char *)strchr(n21, ',')) { + if (n22) + *n22 = '\0'; + if (strcmp(n11, n21) == 0) { + *n21 = '\t'; + } + if (n22) { + *n22 = ','; + n21 = n22 + 1; + } else + break; + } + if (n12) { + *n12 = ','; + n11 = n12 + 1; + } else + break; + } + } + } + } + return ptr; } -char **ssplit(line,pat) -char *line,*pat; +char ** +ssplit(line, pat) + char *line, *pat; { - char *p; - int i; - for (i=0;i<MAXTOK;++i) Splitptr[i] = NULL; - strncpy(splitbuf,line,1024); - for (i=0,p=splitbuf;*p && i< MAXTOK;){ - for (Splitptr[i++]=p;*p && !strchr(pat,*p);p++); - if (*p=='\0') break; - *p=0;p++; -/* for (*p='\0'; strchr(pat,*p);p++);*/ - } - return Splitptr; + char *p; + int i; + for (i = 0; i < MAXTOK; ++i) + Splitptr[i] = NULL; + strncpy(splitbuf, line, 1024); + for (i = 0, p = splitbuf; *p && i < MAXTOK;) { + for (Splitptr[i++] = p; *p && !strchr(pat, *p); p++); + if (*p == '\0') + break; + *p = 0; + p++; + /* for (*p='\0'; strchr(pat,*p);p++); */ + } + return Splitptr; } -char *join(lineptr,pat,num) -char **lineptr,*pat; -int num; +char * +join(lineptr, pat, num) + char **lineptr, *pat; + int num; { - int i; + int i; + joinbuf[0] = '\0'; + if (lineptr[0] != NULL) + strncpy(joinbuf, lineptr[0], 1024); + else { joinbuf[0] = '\0'; - if (lineptr[0] != NULL) - strncpy(joinbuf,lineptr[0],1024); - else { - joinbuf[0]='\0'; - return joinbuf; - } - for (i=1;i<num;i++) { - strcat(joinbuf,pat); - if (lineptr[i] != NULL) - strcat(joinbuf,lineptr[i]); - else - break; - } return joinbuf; + } + for (i = 1; i < num; i++) { + strcat(joinbuf, pat); + if (lineptr[i] != NULL) + strcat(joinbuf, lineptr[i]); + else + break; + } + return joinbuf; } #endif -static int CMDtnrpd(client) -ClientType *client; +static int +CMDtnrpd(client) + ClientType *client; { - argv_t *argv = &client->Argv; - fprintf(argv->out,"%d %s\n",argv->dc->usage); - return 0; + argv_t *argv = &client->Argv; + fprintf(argv->out, "%d %s\n", argv->dc->usage); + return 0; } islocalconnect(client) -ClientType *client; + ClientType *client; { - if (strcmp(client->username,"localuser") != 0 || - strcmp(client->hostname,"localhost") != 0) - return 0; - return 1; + if (strcmp(client->username, "localuser") != 0 || + strcmp(client->hostname, "localhost") != 0) + return 0; + return 1; } -static shutdownflag = 0; +static shutdownflag = 0; INNBBSDhalt() { - shutdownflag = 1; + shutdownflag = 1; } -int INNBBSDshutdown() +int +INNBBSDshutdown() { - return shutdownflag; + return shutdownflag; } -static int CMDshutdown(client) -ClientType *client; +static int +CMDshutdown(client) + ClientType *client; { - argv_t *argv = &client->Argv; - buffer_t *in = &client->in; - daemoncmd_t *p = argv->dc; - if (!islocalconnect(client)) { - fprintf(argv->out,"%d shutdown access denied\r\n", p->errorcode); - fflush(argv->out); - verboselog("Shutdown Put: %d shutdown access denied\n", p->errorcode); - return 1; - } - shutdownflag = 1; - fprintf(argv->out,"%d shutdown starting\r\n", p->normalcode); + argv_t *argv = &client->Argv; + buffer_t *in = &client->in; + daemoncmd_t *p = argv->dc; + if (!islocalconnect(client)) { + fprintf(argv->out, "%d shutdown access denied\r\n", p->errorcode); fflush(argv->out); - verboselog("Shutdown Put: %d shutdown starting\n", p->normalcode); + verboselog("Shutdown Put: %d shutdown access denied\n", p->errorcode); return 1; + } + shutdownflag = 1; + fprintf(argv->out, "%d shutdown starting\r\n", p->normalcode); + fflush(argv->out); + verboselog("Shutdown Put: %d shutdown starting\n", p->normalcode); + return 1; } -static int CMDmode(client) -ClientType *client; +static int +CMDmode(client) + ClientType *client; { - /*char cwdpath[MAXPATHLEN+1];*/ - argv_t *argv = &client->Argv; - extern ClientType INNBBSD_STAT; - buffer_t *in = &client->in; - daemoncmd_t *p = argv->dc; - time_t uptime, now; - int i,j; - time_t lasthist; - ClientType *client1 = &INNBBSD_STAT; - - if (!islocalconnect(client)) { - fprintf(argv->out,"%d mode access denied\r\n", p->errorcode); - fflush(argv->out); - verboselog("Mode Put: %d mode access denied\n", p->errorcode); - return 1; - } - fprintf(argv->out,"%d mode\r\n", p->normalcode); + /* char cwdpath[MAXPATHLEN+1]; */ + argv_t *argv = &client->Argv; + extern ClientType INNBBSD_STAT; + buffer_t *in = &client->in; + daemoncmd_t *p = argv->dc; + time_t uptime, now; + int i, j; + time_t lasthist; + ClientType *client1 = &INNBBSD_STAT; + + if (!islocalconnect(client)) { + fprintf(argv->out, "%d mode access denied\r\n", p->errorcode); fflush(argv->out); - verboselog("Mode Put: %d mode\n", p->normalcode); - uptime = innbbsdstartup(); + verboselog("Mode Put: %d mode access denied\n", p->errorcode); + return 1; + } + fprintf(argv->out, "%d mode\r\n", p->normalcode); + fflush(argv->out); + verboselog("Mode Put: %d mode\n", p->normalcode); + uptime = innbbsdstartup(); + time(&now); + fprintf(argv->out, "up since %salive %.2f days\r\n", ctime(&uptime), (double)(now - innbbsdstartup()) / 86400); + fprintf(argv->out, "BBSHOME %s\r\n", BBSHOME); + fprintf(argv->out, "MYBBSID %s\r\n", MYBBSID); + fprintf(argv->out, "ECHOMAIL %s\r\n", ECHOMAIL); + fprintf(argv->out, "INNDHOME %s\r\n", INNDHOME); + fprintf(argv->out, "HISTORY %s\r\n", HISTORY); + fprintf(argv->out, "LOGFILE %s\r\n", LOGFILE); + fprintf(argv->out, "INNBBSCONF %s\r\n", INNBBSCONF); + fprintf(argv->out, "BBSFEEDS %s\r\n", BBSFEEDS); + fprintf(argv->out, "Verbose log: %s\r\n", isverboselog() ? "ON" : "OFF"); + fprintf(argv->out, "History Expire Days %d\r\n", Expiredays); + fprintf(argv->out, "History Expire Time %d:%d\r\n", His_Maint_Hour, His_Maint_Min); + lasthist = gethisinfo(); + if (lasthist > 0) { + time_t keep = lasthist, keep1; time(&now); - fprintf(argv->out,"up since %salive %.2f days\r\n", ctime(&uptime), (double)(now - innbbsdstartup())/86400); - fprintf(argv->out,"BBSHOME %s\r\n", BBSHOME); - fprintf(argv->out,"MYBBSID %s\r\n", MYBBSID); - fprintf(argv->out,"ECHOMAIL %s\r\n", ECHOMAIL); - fprintf(argv->out,"INNDHOME %s\r\n", INNDHOME); - fprintf(argv->out,"HISTORY %s\r\n", HISTORY); - fprintf(argv->out,"LOGFILE %s\r\n", LOGFILE); - fprintf(argv->out,"INNBBSCONF %s\r\n", INNBBSCONF); - fprintf(argv->out,"BBSFEEDS %s\r\n", BBSFEEDS); - fprintf(argv->out,"Verbose log: %s\r\n", isverboselog() ?"ON":"OFF"); - fprintf(argv->out,"History Expire Days %d\r\n", Expiredays); - fprintf(argv->out,"History Expire Time %d:%d\r\n", His_Maint_Hour, His_Maint_Min); - lasthist = gethisinfo(); - if (lasthist > 0) { - time_t keep = lasthist, keep1; - time(&now); - fprintf(argv->out,"Oldest history entry created: %s",(char*)ctime(&keep)); - keep = Expiredays * 86400 * 2 + lasthist; - keep1 = keep - now ; - fprintf(argv->out,"Next time to maintain history: (%.2f days later) %s",(double)keep1/86400, (char*)ctime(&keep)); - } - fprintf(argv->out,"PID is %d\r\n", getpid()); - fprintf(argv->out,"LOCAL ONLY %d\r\n", LOCALNODELIST); - fprintf(argv->out,"NONE NEWSFEEDS %d\r\n", NONENEWSFEEDS); - fprintf(argv->out,"Max connections %d\r\n", Maxclient); + fprintf(argv->out, "Oldest history entry created: %s", (char *)ctime(&keep)); + keep = Expiredays * 86400 * 2 + lasthist; + keep1 = keep - now; + fprintf(argv->out, "Next time to maintain history: (%.2f days later) %s", (double)keep1 / 86400, (char *)ctime(&keep)); + } + fprintf(argv->out, "PID is %d\r\n", getpid()); + fprintf(argv->out, "LOCAL ONLY %d\r\n", LOCALNODELIST); + fprintf(argv->out, "NONE NEWSFEEDS %d\r\n", NONENEWSFEEDS); + fprintf(argv->out, "Max connections %d\r\n", Maxclient); #ifdef DEBUGCWD - getwd(cwdpath); - fprintf(argv->out,"Working directory %s\r\n", cwdpath); + getwd(cwdpath); + fprintf(argv->out, "Working directory %s\r\n", cwdpath); #endif - if (Channel) - for (i=0, j=0; i< Maxclient; ++i) { - if (Channel[i].fd == -1) continue; - if (Channel+i == client) continue; - j++; - fprintf(argv->out," %d) in->used %d, in->left %d %s@%s\r\n",i, - Channel[i].in.used, Channel[i].in.left, - Channel[i].username,Channel[i].hostname); + if (Channel) + for (i = 0, j = 0; i < Maxclient; ++i) { + if (Channel[i].fd == -1) + continue; + if (Channel + i == client) + continue; + j++; + fprintf(argv->out, " %d) in->used %d, in->left %d %s@%s\r\n", i, + Channel[i].in.used, Channel[i].in.left, + Channel[i].username, Channel[i].hostname); } - fprintf(argv->out,"Total connections %d\r\n", j); - fprintf(argv->out,"Total rec: %d dup: %d fail: %d size: %d, stat rec: %d fail: %d\n", client1->ihavecount, client1->ihaveduplicate, client1->ihavefail, client1->ihavesize, client1->statcount, client1->statfail); - fprintf(argv->out,".\r\n"); - fflush(argv->out); - return 1; + fprintf(argv->out, "Total connections %d\r\n", j); + fprintf(argv->out, "Total rec: %d dup: %d fail: %d size: %d, stat rec: %d fail: %d\n", client1->ihavecount, client1->ihaveduplicate, client1->ihavefail, client1->ihavesize, client1->statcount, client1->statfail); + fprintf(argv->out, ".\r\n"); + fflush(argv->out); + return 1; } -static int +static int CMDlistnodelist(client) -ClientType *client; + ClientType *client; { - int nlcount; - argv_t *argv = &client->Argv; - buffer_t *in = &client->in; - daemoncmd_t *p = argv->dc; - if (!islocalconnect(client)) { - fprintf(argv->out,"%d listnodelist access denied\r\n", p->errorcode); - fflush(argv->out); - verboselog("Mallocmap Put: %d listnodelist access denied\n", p->errorcode); - return 1; - } - fprintf(argv->out,"%d listnodelist\r\n", p->normalcode); - for (nlcount =0; nlcount < NLCOUNT; nlcount++) { - nodelist_t *nl = NODELIST+nlcount; - fprintf(argv->out,"%2d %s /\\/\\ %s\r\n", nlcount+1, nl->node==NULL?"":nl->node, nl->exclusion==NULL?"":nl->exclusion); - fprintf(argv->out," %s:%s:%s\r\n",nl->host==NULL?"":nl->host, nl->protocol==NULL?"":nl->protocol, nl->comments == NULL ? "": nl->comments); - } - fprintf(argv->out,".\r\n"); + int nlcount; + argv_t *argv = &client->Argv; + buffer_t *in = &client->in; + daemoncmd_t *p = argv->dc; + if (!islocalconnect(client)) { + fprintf(argv->out, "%d listnodelist access denied\r\n", p->errorcode); fflush(argv->out); - verboselog("Listnodelist Put: %d listnodelist complete\n", p->normalcode); + verboselog("Mallocmap Put: %d listnodelist access denied\n", p->errorcode); return 1; + } + fprintf(argv->out, "%d listnodelist\r\n", p->normalcode); + for (nlcount = 0; nlcount < NLCOUNT; nlcount++) { + nodelist_t *nl = NODELIST + nlcount; + fprintf(argv->out, "%2d %s /\\/\\ %s\r\n", nlcount + 1, nl->node == NULL ? "" : nl->node, nl->exclusion == NULL ? "" : nl->exclusion); + fprintf(argv->out, " %s:%s:%s\r\n", nl->host == NULL ? "" : nl->host, nl->protocol == NULL ? "" : nl->protocol, nl->comments == NULL ? "" : nl->comments); + } + fprintf(argv->out, ".\r\n"); + fflush(argv->out); + verboselog("Listnodelist Put: %d listnodelist complete\n", p->normalcode); + return 1; } -static int +static int CMDlistnewsfeeds(client) -ClientType *client; + ClientType *client; { - argv_t *argv = &client->Argv; - buffer_t *in = &client->in; - daemoncmd_t *p = argv->dc; - int nfcount; - if (!islocalconnect(client)) { - fprintf(argv->out,"%d listnewsfeeds access denied\r\n", p->errorcode); - fflush(argv->out); - verboselog("Mallocmap Put: %d listnewsfeeds access denied\n", p->errorcode); - return 1; - } - fprintf(argv->out,"%d listnewsfeeds\r\n", p->normalcode); - for (nfcount =0; nfcount < NFCOUNT; nfcount++) { - newsfeeds_t *nf = NEWSFEEDS + nfcount; - fprintf(argv->out,"%3d %s<=>%s\r\n",nfcount+1, nf->newsgroups, nf->board); - fprintf(argv->out," %s\r\n",nf->path==NULL?"(Null)":nf->path); - } - fprintf(argv->out,".\r\n"); + argv_t *argv = &client->Argv; + buffer_t *in = &client->in; + daemoncmd_t *p = argv->dc; + int nfcount; + if (!islocalconnect(client)) { + fprintf(argv->out, "%d listnewsfeeds access denied\r\n", p->errorcode); fflush(argv->out); - verboselog("Listnewsfeeds Put: %d listnewsfeeds complete\n", p->normalcode); + verboselog("Mallocmap Put: %d listnewsfeeds access denied\n", p->errorcode); return 1; + } + fprintf(argv->out, "%d listnewsfeeds\r\n", p->normalcode); + for (nfcount = 0; nfcount < NFCOUNT; nfcount++) { + newsfeeds_t *nf = NEWSFEEDS + nfcount; + fprintf(argv->out, "%3d %s<=>%s\r\n", nfcount + 1, nf->newsgroups, nf->board); + fprintf(argv->out, " %s\r\n", nf->path == NULL ? "(Null)" : nf->path); + } + fprintf(argv->out, ".\r\n"); + fflush(argv->out); + verboselog("Listnewsfeeds Put: %d listnewsfeeds complete\n", p->normalcode); + return 1; } #ifdef MALLOCMAP -static int CMDmallocmap(client) -ClientType *client; +static int +CMDmallocmap(client) + ClientType *client; { - argv_t *argv = &client->Argv; - buffer_t *in = &client->in; - daemoncmd_t *p = argv->dc; - struct rusage ru; - int savefd ; - if (!islocalconnect(client)) { - fprintf(argv->out,"%d mallocmap access denied\r\n", p->errorcode); - fflush(argv->out); - verboselog("Mallocmap Put: %d mallocmap access denied\n", p->errorcode); - return 1; - } - fprintf(argv->out,"%d mallocmap\r\n", p->normalcode); - savefd = dup(1); - dup2(client->fd, 1); - mallocmap(); - dup2(savefd, 1); - close(savefd); - fprintf(argv->out,".\r\n"); + argv_t *argv = &client->Argv; + buffer_t *in = &client->in; + daemoncmd_t *p = argv->dc; + struct rusage ru; + int savefd; + if (!islocalconnect(client)) { + fprintf(argv->out, "%d mallocmap access denied\r\n", p->errorcode); fflush(argv->out); - verboselog("Mallocmap Put: %d mallocmap complete\n", p->normalcode); + verboselog("Mallocmap Put: %d mallocmap access denied\n", p->errorcode); return 1; + } + fprintf(argv->out, "%d mallocmap\r\n", p->normalcode); + savefd = dup(1); + dup2(client->fd, 1); + mallocmap(); + dup2(savefd, 1); + close(savefd); + fprintf(argv->out, ".\r\n"); + fflush(argv->out); + verboselog("Mallocmap Put: %d mallocmap complete\n", p->normalcode); + return 1; } #endif #ifdef GETRUSAGE -static int CMDgetrusage(client) -ClientType *client; +static int +CMDgetrusage(client) + ClientType *client; { - argv_t *argv = &client->Argv; - buffer_t *in = &client->in; - daemoncmd_t *p = argv->dc; - struct rusage ru; - if (!islocalconnect(client)) { - fprintf(argv->out,"%d getrusage access denied\r\n", p->errorcode); - fflush(argv->out); - verboselog("Getrusage Put: %d getrusage access denied\n", p->errorcode); - return 1; - } - fprintf(argv->out,"%d getrusage\r\n", p->normalcode); - if (getrusage(RUSAGE_SELF,&ru) == 0) { - fprintf(argv->out,"user time used: %.6f\r\n",(double)ru.ru_utime.tv_sec + (double)ru.ru_utime.tv_usec/1000000.0); - fprintf(argv->out,"system time used: %.6f\r\n",(double)ru.ru_stime.tv_sec + (double)ru.ru_stime.tv_usec/1000000.0); - fprintf(argv->out,"maximum resident set size: %lu\r\n",ru.ru_maxrss * getpagesize()); - fprintf(argv->out,"integral resident set size: %lu\r\n",ru.ru_idrss * getpagesize()); - fprintf(argv->out,"page faults not requiring physical I/O: %d\r\n",ru.ru_minflt); - fprintf(argv->out,"page faults requiring physical I/O: %d\r\n",ru.ru_majflt); - fprintf(argv->out,"swaps: %d\r\n",ru.ru_nswap); - fprintf(argv->out,"block input operations: %d\r\n",ru.ru_inblock); - fprintf(argv->out,"block output operations: %d\r\n",ru.ru_oublock); - fprintf(argv->out,"messages sent: %d\r\n",ru.ru_msgsnd); - fprintf(argv->out,"messages received: %d\r\n",ru.ru_msgrcv); - fprintf(argv->out,"signals received: %d\r\n",ru.ru_nsignals); - fprintf(argv->out,"voluntary context switches: %d\r\n",ru.ru_nvcsw); - fprintf(argv->out,"involuntary context switches: %d\r\n",ru.ru_nivcsw); - } - fprintf(argv->out,".\r\n"); + argv_t *argv = &client->Argv; + buffer_t *in = &client->in; + daemoncmd_t *p = argv->dc; + struct rusage ru; + if (!islocalconnect(client)) { + fprintf(argv->out, "%d getrusage access denied\r\n", p->errorcode); fflush(argv->out); - verboselog("Getrusage Put: %d getrusage complete\n", p->normalcode); + verboselog("Getrusage Put: %d getrusage access denied\n", p->errorcode); return 1; + } + fprintf(argv->out, "%d getrusage\r\n", p->normalcode); + if (getrusage(RUSAGE_SELF, &ru) == 0) { + fprintf(argv->out, "user time used: %.6f\r\n", (double)ru.ru_utime.tv_sec + (double)ru.ru_utime.tv_usec / 1000000.0); + fprintf(argv->out, "system time used: %.6f\r\n", (double)ru.ru_stime.tv_sec + (double)ru.ru_stime.tv_usec / 1000000.0); + fprintf(argv->out, "maximum resident set size: %lu\r\n", ru.ru_maxrss * getpagesize()); + fprintf(argv->out, "integral resident set size: %lu\r\n", ru.ru_idrss * getpagesize()); + fprintf(argv->out, "page faults not requiring physical I/O: %d\r\n", ru.ru_minflt); + fprintf(argv->out, "page faults requiring physical I/O: %d\r\n", ru.ru_majflt); + fprintf(argv->out, "swaps: %d\r\n", ru.ru_nswap); + fprintf(argv->out, "block input operations: %d\r\n", ru.ru_inblock); + fprintf(argv->out, "block output operations: %d\r\n", ru.ru_oublock); + fprintf(argv->out, "messages sent: %d\r\n", ru.ru_msgsnd); + fprintf(argv->out, "messages received: %d\r\n", ru.ru_msgrcv); + fprintf(argv->out, "signals received: %d\r\n", ru.ru_nsignals); + fprintf(argv->out, "voluntary context switches: %d\r\n", ru.ru_nvcsw); + fprintf(argv->out, "involuntary context switches: %d\r\n", ru.ru_nivcsw); + } + fprintf(argv->out, ".\r\n"); + fflush(argv->out); + verboselog("Getrusage Put: %d getrusage complete\n", p->normalcode); + return 1; } #endif -static int CMDhismaint(client) -ClientType *client; +static int +CMDhismaint(client) + ClientType *client; { - argv_t *argv = &client->Argv; - buffer_t *in = &client->in; - daemoncmd_t *p = argv->dc; - if (!islocalconnect(client)) { - fprintf(argv->out,"%d hismaint access denied\r\n", p->errorcode); - fflush(argv->out); - verboselog("Hismaint Put: %d hismaint access denied\n", p->errorcode); - return 1; - } - verboselog("Hismaint Put: %d hismaint start\n", p->normalcode); - HISmaint(); - fprintf(argv->out,"%d hismaint complete\r\n", p->normalcode); + argv_t *argv = &client->Argv; + buffer_t *in = &client->in; + daemoncmd_t *p = argv->dc; + if (!islocalconnect(client)) { + fprintf(argv->out, "%d hismaint access denied\r\n", p->errorcode); fflush(argv->out); - verboselog("Hismaint Put: %d hismaint complete\n", p->normalcode); + verboselog("Hismaint Put: %d hismaint access denied\n", p->errorcode); return 1; + } + verboselog("Hismaint Put: %d hismaint start\n", p->normalcode); + HISmaint(); + fprintf(argv->out, "%d hismaint complete\r\n", p->normalcode); + fflush(argv->out); + verboselog("Hismaint Put: %d hismaint complete\n", p->normalcode); + return 1; } -static int CMDreload(client) -ClientType *client; +static int +CMDreload(client) + ClientType *client; { - argv_t *argv = &client->Argv; - buffer_t *in = &client->in; - daemoncmd_t *p = argv->dc; - if (!islocalconnect(client)) { - fprintf(argv->out,"%d reload access denied\r\n", p->errorcode); - fflush(argv->out); - verboselog("Reload Put: %d reload access denied\n", p->errorcode); - return 1; - } - initial_bbs("feed"); - fprintf(argv->out,"%d reload complete\r\n", p->normalcode); + argv_t *argv = &client->Argv; + buffer_t *in = &client->in; + daemoncmd_t *p = argv->dc; + if (!islocalconnect(client)) { + fprintf(argv->out, "%d reload access denied\r\n", p->errorcode); fflush(argv->out); - verboselog("Reload Put: %d reload complete\n", p->normalcode); + verboselog("Reload Put: %d reload access denied\n", p->errorcode); return 1; + } + initial_bbs("feed"); + fprintf(argv->out, "%d reload complete\r\n", p->normalcode); + fflush(argv->out); + verboselog("Reload Put: %d reload complete\n", p->normalcode); + return 1; } -static int CMDverboselog(client) -ClientType *client; +static int +CMDverboselog(client) + ClientType *client; { - argv_t *argv = &client->Argv; - buffer_t *in = &client->in; - daemoncmd_t *p = argv->dc; - if (!islocalconnect(client)) { - fprintf(argv->out,"%d verboselog access denied\r\n", p->errorcode); - fflush(argv->out); - verboselog("Reload Put: %d verboselog access denied\n", p->errorcode); - return 1; - } - if (client->mode == 0) { - if (argv->argc > 1) { - if (strcasecmp(argv->argv[1],"off")==0) { + argv_t *argv = &client->Argv; + buffer_t *in = &client->in; + daemoncmd_t *p = argv->dc; + if (!islocalconnect(client)) { + fprintf(argv->out, "%d verboselog access denied\r\n", p->errorcode); + fflush(argv->out); + verboselog("Reload Put: %d verboselog access denied\n", p->errorcode); + return 1; + } + if (client->mode == 0) { + if (argv->argc > 1) { + if (strcasecmp(argv->argv[1], "off") == 0) { setverboseoff(); - } else { + } else { setverboseon(); - } - } + } } - fprintf(argv->out,"%d verboselog %s\r\n",p->normalcode, - isverboselog() ?"ON":"OFF"); - fflush(argv->out); - verboselog("%d verboselog %s\r\n",p->normalcode, - isverboselog()?"ON":"OFF"); + } + fprintf(argv->out, "%d verboselog %s\r\n", p->normalcode, + isverboselog() ? "ON" : "OFF"); + fflush(argv->out); + verboselog("%d verboselog %s\r\n", p->normalcode, + isverboselog() ? "ON" : "OFF"); } -static int CMDmidcheck(client) -ClientType *client; +static int +CMDmidcheck(client) + ClientType *client; { - argv_t *argv = &client->Argv; - buffer_t *in = &client->in; - daemoncmd_t *p = argv->dc; - if (client->mode == 0) { - if (argv->argc > 1) { - if (strcasecmp(argv->argv[1],"off")==0) { + argv_t *argv = &client->Argv; + buffer_t *in = &client->in; + daemoncmd_t *p = argv->dc; + if (client->mode == 0) { + if (argv->argc > 1) { + if (strcasecmp(argv->argv[1], "off") == 0) { client->midcheck = 0; - } else { + } else { client->midcheck = 1; - } - } + } } - fprintf(argv->out,"%d mid check %s\r\n",p->normalcode, - client->midcheck == 1?"ON":"OFF"); - fflush(argv->out); - verboselog("%d mid check %s\r\n",p->normalcode, - client->midcheck == 1?"ON":"OFF"); + } + fprintf(argv->out, "%d mid check %s\r\n", p->normalcode, + client->midcheck == 1 ? "ON" : "OFF"); + fflush(argv->out); + verboselog("%d mid check %s\r\n", p->normalcode, + client->midcheck == 1 ? "ON" : "OFF"); } -static int CMDgrephist(client) -ClientType *client; +static int +CMDgrephist(client) + ClientType *client; { - argv_t *argv = &client->Argv; - buffer_t *in = &client->in; - daemoncmd_t *p = argv->dc; - if (client->mode == 0) { - if (argv->argc > 1) { - char *ptr; - ptr = (char*)DBfetch(argv->argv[1]); + argv_t *argv = &client->Argv; + buffer_t *in = &client->in; + daemoncmd_t *p = argv->dc; + if (client->mode == 0) { + if (argv->argc > 1) { + char *ptr; + ptr = (char *)DBfetch(argv->argv[1]); if (ptr != NULL) { - fprintf(argv->out,"%d %s OK\r\n", p->normalcode, ptr); + fprintf(argv->out, "%d %s OK\r\n", p->normalcode, ptr); fflush(argv->out); verboselog("Addhist Put: %d %s OK\n", p->normalcode, ptr); return 0; } else { - fprintf(argv->out,"%d %s not found\r\n", p->errorcode,argv->argv[1]); + fprintf(argv->out, "%d %s not found\r\n", p->errorcode, argv->argv[1]); fflush(argv->out); verboselog("Addhist Put: %d %s not found\n", p->errorcode, argv->argv[1]); return 1; } - } } - fprintf(argv->out,"%d grephist error\r\n", p->errorcode); - fflush(argv->out); - verboselog("Addhist Put: %d grephist error\n", p->errorcode); - return 1; + } + fprintf(argv->out, "%d grephist error\r\n", p->errorcode); + fflush(argv->out); + verboselog("Addhist Put: %d grephist error\n", p->errorcode); + return 1; } -static int CMDaddhist(client) -ClientType *client; +static int +CMDaddhist(client) + ClientType *client; { - argv_t *argv = &client->Argv; - buffer_t *in = &client->in; - daemoncmd_t *p = argv->dc; - /* - if (strcmp(client->username,"localuser") != 0 || - strcmp(client->hostname,"localhost") != 0) { - fprintf(argv->out,"%d add hist access denied\r\n", p->errorcode); - fflush(argv->out); - verboselog("Addhist Put: %d add hist access denied\n", p->errorcode); - return 1; - } - */ - if (client->mode == 0) { - if (argv->argc > 2) { - char *ptr; - ptr = (char*)DBfetch(argv->argv[1]); + argv_t *argv = &client->Argv; + buffer_t *in = &client->in; + daemoncmd_t *p = argv->dc; + /* + * if (strcmp(client->username,"localuser") != 0 || + * strcmp(client->hostname,"localhost") != 0) { fprintf(argv->out,"%d add + * hist access denied\r\n", p->errorcode); fflush(argv->out); + * verboselog("Addhist Put: %d add hist access denied\n", p->errorcode); + * return 1; } + */ + if (client->mode == 0) { + if (argv->argc > 2) { + char *ptr; + ptr = (char *)DBfetch(argv->argv[1]); if (ptr == NULL) { - if (storeDB(argv->argv[1], argv->argv[2]) < 0) { - fprintf(argv->out,"%d add hist store DB error\r\n", p->errorcode); - fflush(argv->out); - verboselog("Addhist Put: %d add hist store DB error\n", p->errorcode); - return 1; - } else { - fprintf(argv->out,"%d add hist OK\r\n", p->normalcode); - fflush(argv->out); - verboselog("Addhist Put: %d add hist OK\n", p->normalcode); - return 0; - } + if (storeDB(argv->argv[1], argv->argv[2]) < 0) { + fprintf(argv->out, "%d add hist store DB error\r\n", p->errorcode); + fflush(argv->out); + verboselog("Addhist Put: %d add hist store DB error\n", p->errorcode); + return 1; + } else { + fprintf(argv->out, "%d add hist OK\r\n", p->normalcode); + fflush(argv->out); + verboselog("Addhist Put: %d add hist OK\n", p->normalcode); + return 0; + } } else { - fprintf(argv->out,"%d add hist duplicate error\r\n", p->errorcode); + fprintf(argv->out, "%d add hist duplicate error\r\n", p->errorcode); fflush(argv->out); verboselog("Addhist Put: %d add hist duplicate error\n", p->errorcode); return 1; } - } - } - fprintf(argv->out,"%d add hist error\r\n", p->errorcode); - fflush(argv->out); - verboselog("Addhist Put: %d add hist error\n", p->errorcode); - return 1; + } + } + fprintf(argv->out, "%d add hist error\r\n", p->errorcode); + fflush(argv->out); + verboselog("Addhist Put: %d add hist error\n", p->errorcode); + return 1; } -static int CMDstat(client) -ClientType *client; +static int +CMDstat(client) + ClientType *client; { - argv_t *argv = &client->Argv; - char *ptr, *frontptr; - buffer_t *in = &client->in; - daemoncmd_t *p; - if (client->mode == 0) { - client->statcount++; - if (argv->argc > 1) { - if (argv->argv[1][0] != '<') { - fprintf(argv->out,"430 No such article\r\n"); - fflush(argv->out); - verboselog("Stat Put: 430 No such article\n"); - client->statfail++; - return 0; - } - ptr = (char*)DBfetch(argv->argv[1]); - if (ptr != NULL) { - fprintf(argv->out,"223 0 status %s\r\n",argv->argv[1]); - fflush(argv->out); - client->mode = 0; - verboselog("Stat Put: 223 0 status %s\n",argv->argv[1]); - return 1; - } else { - fprintf(argv->out,"430 No such article\r\n"); - fflush(argv->out); - verboselog("Stat Put: 430 No such article\n"); - client->mode = 0; - client->statfail++; - } - } - } + argv_t *argv = &client->Argv; + char *ptr, *frontptr; + buffer_t *in = &client->in; + daemoncmd_t *p; + if (client->mode == 0) { + client->statcount++; + if (argv->argc > 1) { + if (argv->argv[1][0] != '<') { + fprintf(argv->out, "430 No such article\r\n"); + fflush(argv->out); + verboselog("Stat Put: 430 No such article\n"); + client->statfail++; + return 0; + } + ptr = (char *)DBfetch(argv->argv[1]); + if (ptr != NULL) { + fprintf(argv->out, "223 0 status %s\r\n", argv->argv[1]); + fflush(argv->out); + client->mode = 0; + verboselog("Stat Put: 223 0 status %s\n", argv->argv[1]); + return 1; + } else { + fprintf(argv->out, "430 No such article\r\n"); + fflush(argv->out); + verboselog("Stat Put: 430 No such article\n"); + client->mode = 0; + client->statfail++; + } + } + } } #ifndef DBZSERVER -static int CMDihave(client) -ClientType *client; +static int +CMDihave(client) + ClientType *client; { - argv_t *argv = &client->Argv; - char *ptr=NULL, *frontptr; - buffer_t *in = &client->in; - daemoncmd_t *p; - if (client->mode == 0) { - client->ihavecount++; - if (argv->argc > 1) { - if (argv->argv[1][0] != '<') { - fprintf(argv->out,"435 Bad Message-ID\r\n"); - fflush(argv->out); - verboselog("Ihave Put: 435 Bad Message-ID\n"); - client->ihavefail++; - return 0; - } - if (client->midcheck == 1) - ptr = (char*)DBfetch(argv->argv[1]); - if (ptr != NULL && client->midcheck == 1) { - fprintf(argv->out,"435 Duplicate\r\n"); - fflush(argv->out); - client->mode = 0; - verboselog("Ihave Put: 435 Duplicate\n"); - client->ihaveduplicate++; - client->ihavefail++; - return 1; - } else { - fprintf(argv->out,"335\r\n"); + argv_t *argv = &client->Argv; + char *ptr = NULL, *frontptr; + buffer_t *in = &client->in; + daemoncmd_t *p; + if (client->mode == 0) { + client->ihavecount++; + if (argv->argc > 1) { + if (argv->argv[1][0] != '<') { + fprintf(argv->out, "435 Bad Message-ID\r\n"); + fflush(argv->out); + verboselog("Ihave Put: 435 Bad Message-ID\n"); + client->ihavefail++; + return 0; + } + if (client->midcheck == 1) + ptr = (char *)DBfetch(argv->argv[1]); + if (ptr != NULL && client->midcheck == 1) { + fprintf(argv->out, "435 Duplicate\r\n"); + fflush(argv->out); + client->mode = 0; + verboselog("Ihave Put: 435 Duplicate\n"); + client->ihaveduplicate++; + client->ihavefail++; + return 1; + } else { + fprintf(argv->out, "335\r\n"); + fflush(argv->out); + client->mode = 1; + verboselog("Ihave Put: 335\n"); + } + } + } else { + client->mode = 0; + readlines(client); + if (HEADER[SUBJECT_H] && HEADER[FROM_H] && HEADER[DATE_H] && + HEADER[MID_H] && HEADER[NEWSGROUPS_H]) { + char *path1, *path2; + int rel; + str_decode_M3(HEADER[SUBJECT_H]); + str_decode_M3(HEADER[FROM_H]); + str_decode_M3(HEADER[DATE_H]); + str_decode_M3(HEADER[MID_H]); + str_decode_M3(HEADER[NEWSGROUPS_H]); + rel = 0; + path1 = (char *)mymalloc(strlen(HEADER[PATH_H]) + 3); + path2 = (char *)mymalloc(strlen(MYBBSID) + 3); + sprintf(path1, "!%s!", HEADER[PATH_H]); + sprintf(path2, "!%s!", MYBBSID); + if (HEADER[CONTROL_H]) { + bbslog("Control: %s\n", HEADER[CONTROL_H]); + if (strncasecmp(HEADER[CONTROL_H], "cancel ", 7) == 0) { + rel = cancel_article_front(HEADER[CONTROL_H] + 7); + } else { + rel = receive_control(); + } + } else if ((char *)strstr(path1, path2) != NULL) { + bbslog(":Warn: Loop back article: %s!%s\n", MYBBSID, HEADER[PATH_H]); + } else { + rel = receive_article(); + } + free(path1); + free(path2); + if (rel == -1) { + fprintf(argv->out, "400 server side failed\r\n"); + fflush(argv->out); + verboselog("Ihave Put: 400\n"); + clearfdset(client->fd); + fclose(client->Argv.in); + fclose(client->Argv.out); + close(client->fd); + client->fd = -1; + client->mode = 0; + client->ihavefail++; + return; + } else { + fprintf(argv->out, "235\r\n"); + verboselog("Ihave Put: 235\n"); + } fflush(argv->out); - client->mode = 1; - verboselog("Ihave Put: 335\n"); - } - } + } else if (!HEADER[PATH_H]) { + fprintf(argv->out, "437 No Path in \"ihave %s\" header\r\n", HEADER[MID_H]); + fflush(argv->out); + verboselog("Put: 437 No Path in \"ihave %s\" header\n", HEADER[MID_H]); + client->ihavefail++; } else { - client->mode = 0; - readlines(client); - if (HEADER[SUBJECT_H] && HEADER[FROM_H] && HEADER[DATE_H] && - HEADER[MID_H] && HEADER[NEWSGROUPS_H] ) { - char *path1, *path2; - int rel ; - str_decode_M3(HEADER[SUBJECT_H]); - str_decode_M3(HEADER[FROM_H]); - str_decode_M3(HEADER[DATE_H]); - str_decode_M3(HEADER[MID_H]); - str_decode_M3(HEADER[NEWSGROUPS_H]); - rel = 0; - path1 = (char*)mymalloc(strlen(HEADER[PATH_H]) + 3); - path2 = (char*)mymalloc(strlen(MYBBSID) + 3); - sprintf(path1, "!%s!",HEADER[PATH_H]); - sprintf(path2, "!%s!",MYBBSID); - if (HEADER[CONTROL_H]) { - bbslog( "Control: %s\n", HEADER[CONTROL_H] ); - if (strncasecmp(HEADER[CONTROL_H],"cancel ",7)==0) { - rel = cancel_article_front(HEADER[CONTROL_H]+7); - } else { - rel = receive_control(); - } - } else if ( (char*)strstr(path1, path2) != NULL) { - bbslog( ":Warn: Loop back article: %s!%s\n",MYBBSID,HEADER[PATH_H] ); - } else { - rel = receive_article(); - } - free(path1); - free(path2); - if (rel == -1) { - fprintf(argv->out,"400 server side failed\r\n"); - fflush(argv->out); - verboselog("Ihave Put: 400\n"); - clearfdset(client->fd); - fclose(client->Argv.in); - fclose(client->Argv.out); - close(client->fd); - client->fd = -1; - client->mode = 0; - client->ihavefail++; - return; - } else { - fprintf(argv->out,"235\r\n"); - verboselog("Ihave Put: 235\n"); - } - fflush(argv->out); - } else if (!HEADER[PATH_H]) { - fprintf(argv->out,"437 No Path in \"ihave %s\" header\r\n",HEADER[MID_H]); - fflush(argv->out); - verboselog("Put: 437 No Path in \"ihave %s\" header\n",HEADER[MID_H]); - client->ihavefail++; - } else { - fprintf(argv->out,"437 No colon-space in \"ihave %s\" header\r\n",HEADER[MID_H]); - fflush(argv->out); - verboselog("Ihave Put: 437 No colon-space in \"ihave %s\" header\n",HEADER[MID_H]); - client->ihavefail++; - } + fprintf(argv->out, "437 No colon-space in \"ihave %s\" header\r\n", HEADER[MID_H]); + fflush(argv->out); + verboselog("Ihave Put: 437 No colon-space in \"ihave %s\" header\n", HEADER[MID_H]); + client->ihavefail++; + } #ifdef DEBUG - printf("subject is %s\n",HEADER[SUBJECT_H]); - printf("from is %s\n",HEADER[FROM_H]); - printf("Date is %s\n",HEADER[DATE_H]); - printf("Newsgroups is %s\n",HEADER[NEWSGROUPS_H]); - printf("mid is %s\n",HEADER[MID_H]); - printf("path is %s\n",HEADER[PATH_H]); + printf("subject is %s\n", HEADER[SUBJECT_H]); + printf("from is %s\n", HEADER[FROM_H]); + printf("Date is %s\n", HEADER[DATE_H]); + printf("Newsgroups is %s\n", HEADER[NEWSGROUPS_H]); + printf("mid is %s\n", HEADER[MID_H]); + printf("path is %s\n", HEADER[PATH_H]); #endif - } - fflush(argv->out); - return 0; + } + fflush(argv->out); + return 0; } #endif -static int CMDhelp(client) -ClientType *client; +static int +CMDhelp(client) + ClientType *client; { - argv_t *argv = &client->Argv; - daemoncmd_t *p; - if (argv->argc>=1) { - fprintf(argv->out,"%d Available Commands\r\n",argv->dc->normalcode); - for (p=cmds;p->name !=NULL;p++) { - fprintf(argv->out," %s\r\n",p->usage); - } - fprintf(argv->out,"Report problems to %s\r\n",ADMINUSER); - } - fputs(".\r\n",argv->out); - fflush(argv->out); - client->mode = 0; - return 0; + argv_t *argv = &client->Argv; + daemoncmd_t *p; + if (argv->argc >= 1) { + fprintf(argv->out, "%d Available Commands\r\n", argv->dc->normalcode); + for (p = cmds; p->name != NULL; p++) { + fprintf(argv->out, " %s\r\n", p->usage); + } + fprintf(argv->out, "Report problems to %s\r\n", ADMINUSER); + } + fputs(".\r\n", argv->out); + fflush(argv->out); + client->mode = 0; + return 0; } -static int CMDquit(client) -ClientType *client; +static int +CMDquit(client) + ClientType *client; { - argv_t *argv = &client->Argv; - fprintf(argv->out,"205 quit\r\n"); - fflush(argv->out); - verboselog("Quit Put: 205 quit\n"); - clearfdset(client->fd); - fclose(client->Argv.in); - fclose(client->Argv.out); - close(client->fd); - client->fd = -1; - client->mode = 0; - channeldestroy(client); - /*exit(0);*/ + argv_t *argv = &client->Argv; + fprintf(argv->out, "205 quit\r\n"); + fflush(argv->out); + verboselog("Quit Put: 205 quit\n"); + clearfdset(client->fd); + fclose(client->Argv.in); + fclose(client->Argv.out); + close(client->fd); + client->fd = -1; + client->mode = 0; + channeldestroy(client); + /* exit(0); */ } |