diff options
author | in2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2004-01-08 15:54:00 +0800 |
---|---|---|
committer | in2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2004-01-08 15:54:00 +0800 |
commit | 271bcfc4e7d98aafb59b6e67399244f635ee74e8 (patch) | |
tree | 6c8c84e636581109db1de66d4036441c36b607c8 /innbbsd | |
parent | 9b4d34a17c6061171456ae8e4b63dcd270f53091 (diff) | |
download | pttbbs-271bcfc4e7d98aafb59b6e67399244f635ee74e8.tar pttbbs-271bcfc4e7d98aafb59b6e67399244f635ee74e8.tar.gz pttbbs-271bcfc4e7d98aafb59b6e67399244f635ee74e8.tar.bz2 pttbbs-271bcfc4e7d98aafb59b6e67399244f635ee74e8.tar.lz pttbbs-271bcfc4e7d98aafb59b6e67399244f635ee74e8.tar.xz pttbbs-271bcfc4e7d98aafb59b6e67399244f635ee74e8.tar.zst pttbbs-271bcfc4e7d98aafb59b6e67399244f635ee74e8.zip |
indent -i4
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@1473 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'innbbsd')
33 files changed, 10437 insertions, 10847 deletions
diff --git a/innbbsd/antisplam.h b/innbbsd/antisplam.h index f72f5348..dc55ef2f 100644 --- a/innbbsd/antisplam.h +++ b/innbbsd/antisplam.h @@ -1,24 +1,24 @@ #define char_lower(c) ((c >= 'A' && c <= 'Z') ? c|32 : c) -#if 0 /* string.h , libc */ +#if 0 /* string.h , libc */ int strcasestr(str, tag) - char *str, *tag; /* tag : lower-case string */ + char *str, *tag; /* tag : lower-case string */ { - char buf[256]; + char buf[256]; - str_lower(buf, str); - return (int) strstr(buf, tag); + str_lower(buf, str); + return (int)strstr(buf, tag); } #endif int bad_subject(char *subject) { - char *badkey[] = {"無碼","avcd","mp3",NULL}; - int i; - for(i=0; badkey[i]; i++) - if(strcasestr(subject, badkey[i])) return 1; - return 0; -} - + char *badkey[] = {"無碼", "avcd", "mp3", NULL}; + int i; + for (i = 0; badkey[i]; i++) + if (strcasestr(subject, badkey[i])) + return 1; + return 0; +} diff --git a/innbbsd/bbslib.c b/innbbsd/bbslib.c index c0177e87..d8ab6401 100644 --- a/innbbsd/bbslib.c +++ b/innbbsd/bbslib.c @@ -1,712 +1,762 @@ #if defined( LINUX ) -# include "innbbsconf.h" -# include "bbslib.h" -# include <stdarg.h> +#include "innbbsconf.h" +#include "bbslib.h" +#include <stdarg.h> #else -# include <stdarg.h> -# include "innbbsconf.h" -# include "bbslib.h" +#include <stdarg.h> +#include "innbbsconf.h" +#include "bbslib.h" #endif -char INNBBSCONF[MAXPATHLEN]; -char INNDHOME[MAXPATHLEN]; -char HISTORY[MAXPATHLEN]; -char LOGFILE[MAXPATHLEN]; -char MYBBSID[MAXPATHLEN]; -char ECHOMAIL[MAXPATHLEN]; -char BBSFEEDS[MAXPATHLEN]; -char LOCALDAEMON[MAXPATHLEN]; - -int His_Maint_Min= HIS_MAINT_MIN; -int His_Maint_Hour= HIS_MAINT_HOUR; -int Expiredays = EXPIREDAYS; - -nodelist_t *NODELIST=NULL, **NODELIST_BYNODE=NULL; -newsfeeds_t *NEWSFEEDS=NULL, **NEWSFEEDS_BYBOARD=NULL; -static char *NODELIST_BUF, *NEWSFEEDS_BUF; -int NFCOUNT, NLCOUNT; -int LOCALNODELIST=0, NONENEWSFEEDS=0; +char INNBBSCONF[MAXPATHLEN]; +char INNDHOME[MAXPATHLEN]; +char HISTORY[MAXPATHLEN]; +char LOGFILE[MAXPATHLEN]; +char MYBBSID[MAXPATHLEN]; +char ECHOMAIL[MAXPATHLEN]; +char BBSFEEDS[MAXPATHLEN]; +char LOCALDAEMON[MAXPATHLEN]; + +int His_Maint_Min = HIS_MAINT_MIN; +int His_Maint_Hour = HIS_MAINT_HOUR; +int Expiredays = EXPIREDAYS; + +nodelist_t *NODELIST = NULL, **NODELIST_BYNODE = NULL; +newsfeeds_t *NEWSFEEDS = NULL, **NEWSFEEDS_BYBOARD = NULL; +static char *NODELIST_BUF, *NEWSFEEDS_BUF; +int NFCOUNT, NLCOUNT; +int LOCALNODELIST = 0, NONENEWSFEEDS = 0; #ifndef _PATH_BBSHOME -# define _PATH_BBSHOME "/u/staff/bbsroot/csie_util/bntpd/home" +#define _PATH_BBSHOME "/u/staff/bbsroot/csie_util/bntpd/home" #endif -static FILE *bbslogfp; +static FILE *bbslogfp; -static int -verboseFlag=0; +static int + verboseFlag = 0; -static char* -verboseFilename=NULL; -static char verbosename[MAXPATHLEN]; +static char * + verboseFilename = NULL; +static char verbosename[MAXPATHLEN]; verboseon(filename) -char *filename; + char *filename; { - verboseFlag = 1; - if ( filename != NULL ) { - if (strchr(filename,'/') == NULL) { - sprintf(verbosename,"%s/innd/%s",BBSHOME,filename); - filename = verbosename; - } - } - verboseFilename = filename; + verboseFlag = 1; + if (filename != NULL) { + if (strchr(filename, '/') == NULL) { + sprintf(verbosename, "%s/innd/%s", BBSHOME, filename); + filename = verbosename; + } + } + verboseFilename = filename; } verboseoff() { - verboseFlag = 0; + verboseFlag = 0; } setverboseon() { - verboseFlag = 1; + verboseFlag = 1; } isverboselog() { - return verboseFlag; + return verboseFlag; } setverboseoff() { - verboseoff(); - if (bbslogfp != NULL) { - fclose(bbslogfp); - bbslogfp = NULL; - } + verboseoff(); + if (bbslogfp != NULL) { + fclose(bbslogfp); + bbslogfp = NULL; + } } -verboselog(char *fmt, ...) +verboselog(char *fmt,...) { - va_list ap; - char datebuf[40]; - time_t now; + va_list ap; + char datebuf[40]; + time_t now; - if (verboseFlag == 0) return; + if (verboseFlag == 0) + return; - va_start(ap, fmt); + va_start(ap, fmt); - time(&now); - strftime(datebuf, sizeof(datebuf), "%b %d %X ", localtime(&now)); + time(&now); + strftime(datebuf, sizeof(datebuf), "%b %d %X ", localtime(&now)); - if (bbslogfp == NULL) { - if (verboseFilename != NULL) - bbslogfp = fopen(verboseFilename, "a"); - else - bbslogfp = fdopen(1, "a"); - } - if (bbslogfp == NULL) { - va_end(ap); - return; - } - fprintf(bbslogfp,"%s[%d] ",datebuf, getpid()); - vfprintf(bbslogfp, fmt, ap); - fflush(bbslogfp); + if (bbslogfp == NULL) { + if (verboseFilename != NULL) + bbslogfp = fopen(verboseFilename, "a"); + else + bbslogfp = fdopen(1, "a"); + } + if (bbslogfp == NULL) { va_end(ap); + return; + } + fprintf(bbslogfp, "%s[%d] ", datebuf, getpid()); + vfprintf(bbslogfp, fmt, ap); + fflush(bbslogfp); + va_end(ap); } #ifdef PalmBBS -xbbslog(char *fmt, ...) +xbbslog(char *fmt,...) #else -bbslog(char *fmt, ...) +bbslog(char *fmt,...) #endif { - va_list ap; - char datebuf[40]; - time_t now; + va_list ap; + char datebuf[40]; + time_t now; - va_start(ap, fmt); + va_start(ap, fmt); - time(&now); - strftime(datebuf, sizeof(datebuf), "%b %d %X ", localtime(&now)); + time(&now); + strftime(datebuf, sizeof(datebuf), "%b %d %X ", localtime(&now)); - if (bbslogfp == NULL) { - bbslogfp = fopen(LOGFILE, "a"); - } - if (bbslogfp == NULL) { - va_end(ap); - return; - } - fprintf(bbslogfp,"%s[%d] ",datebuf,getpid()); - vfprintf(bbslogfp, fmt, ap); - fflush(bbslogfp); + if (bbslogfp == NULL) { + bbslogfp = fopen(LOGFILE, "a"); + } + if (bbslogfp == NULL) { va_end(ap); + return; + } + fprintf(bbslogfp, "%s[%d] ", datebuf, getpid()); + vfprintf(bbslogfp, fmt, ap); + fflush(bbslogfp); + va_end(ap); } initial_bbs(outgoing) -char *outgoing; + char *outgoing; { - FILE* FN; - struct stat st; - int fd, i; - char *bbsnameptr=NULL; - -/* reopen bbslog */ - if (bbslogfp != NULL) { - fclose(bbslogfp); - bbslogfp = NULL; - } - + FILE *FN; + struct stat st; + int fd, i; + char *bbsnameptr = NULL; + + /* reopen bbslog */ + if (bbslogfp != NULL) { + fclose(bbslogfp); + bbslogfp = NULL; + } #ifdef WITH_ECHOMAIL - init_echomailfp(); - init_bbsfeedsfp(); + init_echomailfp(); + init_bbsfeedsfp(); #endif - LOCALNODELIST=0, NONENEWSFEEDS =0; - sprintf(INNDHOME,"%s/innd",BBSHOME); - sprintf(HISTORY, "%s/history",INNDHOME); - sprintf(LOGFILE, "%s/bbslog",INNDHOME); - sprintf(ECHOMAIL,"%s/echomail.log",BBSHOME); - sprintf(LOCALDAEMON,"%s/.innbbsd",INNDHOME); - sprintf(INNBBSCONF,"%s/innbbs.conf",INNDHOME); - sprintf(BBSFEEDS,"%s/bbsfeeds.log",INNDHOME); - - if (isfile(INNBBSCONF)) { - FILE *conf; - char buffer[MAXPATHLEN]; - conf = fopen(INNBBSCONF,"r"); - if (conf != NULL) { - while (fgets( buffer, sizeof buffer, conf) != NULL) { - char *ptr, *front=NULL, *value=NULL, *value2=NULL, *value3=NULL; - if ( buffer[0] == '#' || buffer[0] == '\n') continue; - for ( front = buffer; *front && isspace(*front); front++); - for ( ptr = front; *ptr && !isspace(*ptr) ; ptr++) ; - if (*ptr == '\0') continue; - *ptr++ = '\0'; - for ( ; *ptr && isspace(*ptr) ; ptr++) ; - if (*ptr == '\0') continue; - value = ptr++; - for ( ; *ptr && !isspace(*ptr) ; ptr++) ; - if (*ptr) { - *ptr++ = '\0'; - for ( ; *ptr && isspace(*ptr) ; ptr++) ; - value2 = ptr++; - for ( ; *ptr && !isspace(*ptr) ; ptr++) ; - if (*ptr) { - *ptr++ = '\0'; - for ( ; *ptr && isspace(*ptr) ; ptr++) ; - value3 = ptr++; - for ( ; *ptr && !isspace(*ptr) ; ptr++) ; - if (*ptr) { - *ptr++ = '\0'; - } - } - } - if ( strcasecmp(front,"expiredays") == 0) { - Expiredays = atoi(value); - if (Expiredays < 0) { - Expiredays = EXPIREDAYS; - } - } else if ( strcasecmp(front,"expiretime") == 0) { - ptr = strchr(value,':'); - if (ptr == NULL) { - fprintf(stderr, "Syntax error in innbbs.conf\n"); - } else { - *ptr++ = '\0'; - His_Maint_Hour = atoi(value); - His_Maint_Min = atoi(ptr); - if (His_Maint_Hour < 0) - His_Maint_Hour = HIS_MAINT_HOUR; - if (His_Maint_Min < 0) - His_Maint_Min = HIS_MAINT_MIN; + LOCALNODELIST = 0, NONENEWSFEEDS = 0; + sprintf(INNDHOME, "%s/innd", BBSHOME); + sprintf(HISTORY, "%s/history", INNDHOME); + sprintf(LOGFILE, "%s/bbslog", INNDHOME); + sprintf(ECHOMAIL, "%s/echomail.log", BBSHOME); + sprintf(LOCALDAEMON, "%s/.innbbsd", INNDHOME); + sprintf(INNBBSCONF, "%s/innbbs.conf", INNDHOME); + sprintf(BBSFEEDS, "%s/bbsfeeds.log", INNDHOME); + + if (isfile(INNBBSCONF)) { + FILE *conf; + char buffer[MAXPATHLEN]; + conf = fopen(INNBBSCONF, "r"); + if (conf != NULL) { + while (fgets(buffer, sizeof buffer, conf) != NULL) { + char *ptr, *front = NULL, *value = NULL, *value2 = NULL, + *value3 = NULL; + if (buffer[0] == '#' || buffer[0] == '\n') + continue; + for (front = buffer; *front && isspace(*front); front++); + for (ptr = front; *ptr && !isspace(*ptr); ptr++); + if (*ptr == '\0') + continue; + *ptr++ = '\0'; + for (; *ptr && isspace(*ptr); ptr++); + if (*ptr == '\0') + continue; + value = ptr++; + for (; *ptr && !isspace(*ptr); ptr++); + if (*ptr) { + *ptr++ = '\0'; + for (; *ptr && isspace(*ptr); ptr++); + value2 = ptr++; + for (; *ptr && !isspace(*ptr); ptr++); + if (*ptr) { + *ptr++ = '\0'; + for (; *ptr && isspace(*ptr); ptr++); + value3 = ptr++; + for (; *ptr && !isspace(*ptr); ptr++); + if (*ptr) { + *ptr++ = '\0'; + } + } } - } else if ( strcasecmp(front,"newsfeeds") == 0) { - if (strcmp(value,"none")==0) - NONENEWSFEEDS = 1; - } else if ( strcasecmp(front,"nodelist") == 0) { - if (strcmp(value,"local")==0) - LOCALNODELIST = 1; - } /*else if ( strcasecmp(front,"newsfeeds") == 0) { - printf("newsfeeds %s\n", value); - } else if ( strcasecmp(front,"nodelist") == 0) { - printf("nodelist %s\n", value); - } else if ( strcasecmp(front,"bbsname") == 0) { - printf("bbsname %s\n", value); - } */ - } - fclose(conf); - } - } - + if (strcasecmp(front, "expiredays") == 0) { + Expiredays = atoi(value); + if (Expiredays < 0) { + Expiredays = EXPIREDAYS; + } + } else if (strcasecmp(front, "expiretime") == 0) { + ptr = strchr(value, ':'); + if (ptr == NULL) { + fprintf(stderr, "Syntax error in innbbs.conf\n"); + } else { + *ptr++ = '\0'; + His_Maint_Hour = atoi(value); + His_Maint_Min = atoi(ptr); + if (His_Maint_Hour < 0) + His_Maint_Hour = HIS_MAINT_HOUR; + if (His_Maint_Min < 0) + His_Maint_Min = HIS_MAINT_MIN; + } + } else if (strcasecmp(front, "newsfeeds") == 0) { + if (strcmp(value, "none") == 0) + NONENEWSFEEDS = 1; + } else if (strcasecmp(front, "nodelist") == 0) { + if (strcmp(value, "local") == 0) + LOCALNODELIST = 1; + } /* else if ( strcasecmp(front,"newsfeeds") == + * 0) { printf("newsfeeds %s\n", value); } + * else if ( strcasecmp(front,"nodelist") == + * 0) { printf("nodelist %s\n", value); } + * else if ( strcasecmp(front,"bbsname") == + * 0) { printf("bbsname %s\n", value); } */ + } + fclose(conf); + } + } #ifdef WITH_ECHOMAIL - bbsnameptr = (char*) fileglue("%s/bbsname.bbs",INNDHOME); - if ((FN = fopen( bbsnameptr ,"r" ))==NULL) { - fprintf(stderr,"can't open file %s\n", bbsnameptr); - return 0; - } - while ( fscanf(FN,"%s", MYBBSID) != EOF); - fclose(FN); - if( ! isdir(fileglue("%s/out.going",BBSHOME)) ) { - mkdir( (char*)fileglue("%s/out.going",BBSHOME), 0750 ); - } - if (NONENEWSFEEDS == 0) - readnffile(INNDHOME); - if (LOCALNODELIST == 0) { - if (readnlfile(INNDHOME, outgoing) != 0) return 0; - } - + bbsnameptr = (char *)fileglue("%s/bbsname.bbs", INNDHOME); + if ((FN = fopen(bbsnameptr, "r")) == NULL) { + fprintf(stderr, "can't open file %s\n", bbsnameptr); + return 0; + } + while (fscanf(FN, "%s", MYBBSID) != EOF); + fclose(FN); + if (!isdir(fileglue("%s/out.going", BBSHOME))) { + mkdir((char *)fileglue("%s/out.going", BBSHOME), 0750); + } + if (NONENEWSFEEDS == 0) + readnffile(INNDHOME); + if (LOCALNODELIST == 0) { + if (readnlfile(INNDHOME, outgoing) != 0) + return 0; + } #endif - return 1; + return 1; } -static int -nf_byboardcmp(a,b) -newsfeeds_t **a, **b; +static int +nf_byboardcmp(a, b) + newsfeeds_t **a, **b; { -/* - if (!a || !*a || !(*a)->board) return -1; - if (!b || !*b || !(*b)->board) return 1; -*/ - return strcasecmp((*a)->board, (*b)->board); + /* + * if (!a || !*a || !(*a)->board) return -1; if (!b || !*b || + * !(*b)->board) return 1; + */ + return strcasecmp((*a)->board, (*b)->board); } -static int -nfcmp(a,b) -newsfeeds_t *a, *b; +static int +nfcmp(a, b) + newsfeeds_t *a, *b; { -/* - if (!a || !a->newsgroups) return -1; - if (!b || !b->newsgroups) return 1; -*/ - return strcasecmp(a->newsgroups, b->newsgroups); + /* + * if (!a || !a->newsgroups) return -1; if (!b || !b->newsgroups) return + * 1; + */ + return strcasecmp(a->newsgroups, b->newsgroups); } -static int -nlcmp(a,b) -nodelist_t *a, *b; +static int +nlcmp(a, b) + nodelist_t *a, *b; { -/* - if (!a || !a->host) return -1; - if (!b || !b->host) return 1; -*/ - return strcasecmp(a->host, b->host); + /* + * if (!a || !a->host) return -1; if (!b || !b->host) return 1; + */ + return strcasecmp(a->host, b->host); } -static int -nl_bynodecmp(a,b) -nodelist_t **a, **b; +static int +nl_bynodecmp(a, b) + nodelist_t **a, **b; { -/* - if (!a || !*a || !(*a)->node) return -1; - if (!b || !*b || !(*b)->node) return 1; -*/ - return strcasecmp((*a)->node, (*b)->node); + /* + * if (!a || !*a || !(*a)->node) return -1; if (!b || !*b || !(*b)->node) + * return 1; + */ + return strcasecmp((*a)->node, (*b)->node); } /* read in newsfeeds.bbs and nodelist.bbs */ readnlfile(inndhome, outgoing) -char *inndhome; -char *outgoing; + char *inndhome; + char *outgoing; { - FILE *fp; - char buff[1024]; - struct stat st; - int i, count, j; - char *ptr, *nodelistptr; - static lastcount=0; - - sprintf(buff,"%s/nodelist.bbs", inndhome); - fp = fopen(buff,"r"); + FILE *fp; + char buff[1024]; + struct stat st; + int i, count, j; + char *ptr, *nodelistptr; + static lastcount = 0; + + sprintf(buff, "%s/nodelist.bbs", inndhome); + fp = fopen(buff, "r"); if (fp == NULL) { - fprintf(stderr,"open fail %s",buff); - return -1; + fprintf(stderr, "open fail %s", buff); + return -1; } - if (fstat(fileno(fp),&st) != 0) { - fprintf(stderr,"stat fail %s", buff); - return -1; + if (fstat(fileno(fp), &st) != 0) { + fprintf(stderr, "stat fail %s", buff); + return -1; } if (NODELIST_BUF == NULL) { - NODELIST_BUF = (char*) mymalloc( st.st_size +1); + NODELIST_BUF = (char *)mymalloc(st.st_size + 1); } else { - NODELIST_BUF = (char*) myrealloc( NODELIST_BUF, st.st_size +1); + NODELIST_BUF = (char *)myrealloc(NODELIST_BUF, st.st_size + 1); } - i = 0, count =0; + i = 0, count = 0; while (fgets(buff, sizeof buff, fp) != NULL) { - if (buff[0] == '#') continue; - if (buff[0] == '\n') continue; - strcpy(NODELIST_BUF+i, buff); - i += strlen(buff); - count ++; + if (buff[0] == '#') + continue; + if (buff[0] == '\n') + continue; + strcpy(NODELIST_BUF + i, buff); + i += strlen(buff); + count++; } fclose(fp); if (NODELIST == NULL) { - NODELIST = (nodelist_t*) mymalloc(sizeof(nodelist_t) * (count+1)); - NODELIST_BYNODE = (nodelist_t**) mymalloc(sizeof(nodelist_t*) * (count+1)); + NODELIST = (nodelist_t *) mymalloc(sizeof(nodelist_t) * (count + 1)); + NODELIST_BYNODE = (nodelist_t **) mymalloc(sizeof(nodelist_t *) * (count + 1)); } else { - NODELIST = (nodelist_t*) myrealloc(NODELIST, sizeof(nodelist_t) * (count+1)); - NODELIST_BYNODE = (nodelist_t**) myrealloc(NODELIST_BYNODE, sizeof(nodelist_t*) * (count+1)); + NODELIST = (nodelist_t *) myrealloc(NODELIST, sizeof(nodelist_t) * (count + 1)); + NODELIST_BYNODE = (nodelist_t **) myrealloc(NODELIST_BYNODE, sizeof(nodelist_t *) * (count + 1)); } - for (i=lastcount; i< count; i++) { - NODELIST[i].feedfp = NULL; + for (i = lastcount; i < count; i++) { + NODELIST[i].feedfp = NULL; } lastcount = count; NLCOUNT = 0; - for (ptr = NODELIST_BUF; (nodelistptr = (char*)strchr(ptr,'\n')) != NULL; ptr = nodelistptr +1, NLCOUNT++) { - char *nptr , *bptr, *pptr, *tptr; + for (ptr = NODELIST_BUF; (nodelistptr = (char *)strchr(ptr, '\n')) != NULL; ptr = nodelistptr + 1, NLCOUNT++) { + char *nptr, *bptr, *pptr, *tptr; *nodelistptr = '\0'; NODELIST[NLCOUNT].host = ""; NODELIST[NLCOUNT].exclusion = ""; NODELIST[NLCOUNT].node = ""; NODELIST[NLCOUNT].protocol = "IHAVE(119)"; NODELIST[NLCOUNT].comments = ""; - NODELIST_BYNODE[NLCOUNT] = NODELIST+NLCOUNT; - for (nptr= ptr ;*nptr && isspace(*nptr); ) nptr++; + NODELIST_BYNODE[NLCOUNT] = NODELIST + NLCOUNT; + for (nptr = ptr; *nptr && isspace(*nptr);) + nptr++; if (*nptr == '\0') { - bbslog("nodelist.bbs %d entry read error\n", NLCOUNT); - return -1; - } - /*NODELIST[NLCOUNT].id = nptr;*/ - NODELIST[NLCOUNT].node = nptr; - for (nptr++; *nptr && !isspace(*nptr); ) nptr++; + bbslog("nodelist.bbs %d entry read error\n", NLCOUNT); + return -1; + } + /* NODELIST[NLCOUNT].id = nptr; */ + NODELIST[NLCOUNT].node = nptr; + for (nptr++; *nptr && !isspace(*nptr);) + nptr++; if (*nptr == '\0') { - bbslog("nodelist.bbs node %d entry read error\n", NLCOUNT); - return -1; - } - *nptr = '\0'; - if ((tptr = strchr(NODELIST[NLCOUNT].node,'/'))) { - *tptr = '\0'; - NODELIST[NLCOUNT].exclusion = tptr + 1; + bbslog("nodelist.bbs node %d entry read error\n", NLCOUNT); + return -1; + } + *nptr = '\0'; + if ((tptr = strchr(NODELIST[NLCOUNT].node, '/'))) { + *tptr = '\0'; + NODELIST[NLCOUNT].exclusion = tptr + 1; } else { - NODELIST[NLCOUNT].exclusion = ""; + NODELIST[NLCOUNT].exclusion = ""; } - for (nptr++ ;*nptr && isspace(*nptr); ) nptr++; - if (*nptr == '\0') continue; - if (*nptr=='+' || *nptr=='-') { - NODELIST[NLCOUNT].feedtype = *nptr; - if (NODELIST[NLCOUNT].feedfp != NULL) { - fclose(NODELIST[NLCOUNT].feedfp); - } - if ( NODELIST[NLCOUNT].feedtype == '+') - if (outgoing != NULL) { - NODELIST[NLCOUNT].feedfp = fopen((char*)fileglue("%s/out.going/%s.%s",BBSHOME, NODELIST[NLCOUNT].node, outgoing),"a"); - } - nptr++; + for (nptr++; *nptr && isspace(*nptr);) + nptr++; + if (*nptr == '\0') + continue; + if (*nptr == '+' || *nptr == '-') { + NODELIST[NLCOUNT].feedtype = *nptr; + if (NODELIST[NLCOUNT].feedfp != NULL) { + fclose(NODELIST[NLCOUNT].feedfp); + } + if (NODELIST[NLCOUNT].feedtype == '+') + if (outgoing != NULL) { + NODELIST[NLCOUNT].feedfp = fopen((char *)fileglue("%s/out.going/%s.%s", BBSHOME, NODELIST[NLCOUNT].node, outgoing), "a"); + } + nptr++; } else { - NODELIST[NLCOUNT].feedtype = ' '; + NODELIST[NLCOUNT].feedtype = ' '; } - NODELIST[NLCOUNT].host = nptr; - for (nptr++; *nptr && !isspace(*nptr); ) nptr++; + NODELIST[NLCOUNT].host = nptr; + for (nptr++; *nptr && !isspace(*nptr);) + nptr++; if (*nptr == '\0') { - continue; - } - *nptr = '\0'; - for (nptr++;*nptr && isspace(*nptr); ) nptr++; - if (*nptr == '\0') continue; - NODELIST[NLCOUNT].protocol = nptr; - for (nptr++; *nptr && !isspace(*nptr); ) nptr++; - if (*nptr == '\0') continue; - *nptr = '\0'; - for (nptr++;*nptr && strchr(" \t\r\n",*nptr); ) nptr++; - if (*nptr == '\0') continue; - NODELIST[NLCOUNT].comments = nptr; + continue; + } + *nptr = '\0'; + for (nptr++; *nptr && isspace(*nptr);) + nptr++; + if (*nptr == '\0') + continue; + NODELIST[NLCOUNT].protocol = nptr; + for (nptr++; *nptr && !isspace(*nptr);) + nptr++; + if (*nptr == '\0') + continue; + *nptr = '\0'; + for (nptr++; *nptr && strchr(" \t\r\n", *nptr);) + nptr++; + if (*nptr == '\0') + continue; + NODELIST[NLCOUNT].comments = nptr; } qsort(NODELIST, NLCOUNT, sizeof(nodelist_t), nlcmp); - qsort(NODELIST_BYNODE, NLCOUNT, sizeof(nodelist_t*), nl_bynodecmp); + qsort(NODELIST_BYNODE, NLCOUNT, sizeof(nodelist_t *), nl_bynodecmp); return 0; } readnffile(inndhome) -char *inndhome; + char *inndhome; { - FILE *fp; - char buff[1024]; - struct stat st; - int i, count; - char *ptr, *newsfeedsptr; - - sprintf(buff,"%s/newsfeeds.bbs", inndhome); - fp = fopen(buff,"r"); + FILE *fp; + char buff[1024]; + struct stat st; + int i, count; + char *ptr, *newsfeedsptr; + + sprintf(buff, "%s/newsfeeds.bbs", inndhome); + fp = fopen(buff, "r"); if (fp == NULL) { - fprintf(stderr,"open fail %s",buff); - return -1; + fprintf(stderr, "open fail %s", buff); + return -1; } - if (fstat(fileno(fp),&st) != 0) { - fprintf(stderr,"stat fail %s", buff); - return -1; + if (fstat(fileno(fp), &st) != 0) { + fprintf(stderr, "stat fail %s", buff); + return -1; } if (NEWSFEEDS_BUF == NULL) { - NEWSFEEDS_BUF = (char*) mymalloc( st.st_size +1); + NEWSFEEDS_BUF = (char *)mymalloc(st.st_size + 1); } else { - NEWSFEEDS_BUF = (char*) myrealloc( NEWSFEEDS_BUF, st.st_size +1); + NEWSFEEDS_BUF = (char *)myrealloc(NEWSFEEDS_BUF, st.st_size + 1); } - i = 0, count =0; + i = 0, count = 0; while (fgets(buff, sizeof buff, fp) != NULL) { - if (buff[0] == '#') continue; - if (buff[0] == '\n') continue; - strcpy(NEWSFEEDS_BUF+i, buff); - i += strlen(buff); - count ++; + if (buff[0] == '#') + continue; + if (buff[0] == '\n') + continue; + strcpy(NEWSFEEDS_BUF + i, buff); + i += strlen(buff); + count++; } fclose(fp); if (NEWSFEEDS == NULL) { - NEWSFEEDS = (newsfeeds_t*) mymalloc(sizeof(newsfeeds_t) * (count+1)); - NEWSFEEDS_BYBOARD = (newsfeeds_t**) mymalloc(sizeof(newsfeeds_t*) * (count+1)); + NEWSFEEDS = (newsfeeds_t *) mymalloc(sizeof(newsfeeds_t) * (count + 1)); + NEWSFEEDS_BYBOARD = (newsfeeds_t **) mymalloc(sizeof(newsfeeds_t *) * (count + 1)); } else { - NEWSFEEDS = (newsfeeds_t*) myrealloc(NEWSFEEDS, sizeof(newsfeeds_t) * (count+1)); - NEWSFEEDS_BYBOARD = (newsfeeds_t**) myrealloc(NEWSFEEDS_BYBOARD, sizeof(newsfeeds_t*) * (count+1)); + NEWSFEEDS = (newsfeeds_t *) myrealloc(NEWSFEEDS, sizeof(newsfeeds_t) * (count + 1)); + NEWSFEEDS_BYBOARD = (newsfeeds_t **) myrealloc(NEWSFEEDS_BYBOARD, sizeof(newsfeeds_t *) * (count + 1)); } - NFCOUNT = 0; - for (ptr = NEWSFEEDS_BUF; (newsfeedsptr = (char*)strchr(ptr,'\n')) != NULL; ptr = newsfeedsptr +1, NFCOUNT++) { - char *nptr , *bptr, *pptr; + NFCOUNT = 0; + for (ptr = NEWSFEEDS_BUF; (newsfeedsptr = (char *)strchr(ptr, '\n')) != NULL; ptr = newsfeedsptr + 1, NFCOUNT++) { + char *nptr, *bptr, *pptr; *newsfeedsptr = '\0'; NEWSFEEDS[NFCOUNT].newsgroups = ""; NEWSFEEDS[NFCOUNT].board = ""; NEWSFEEDS[NFCOUNT].path = NULL; - NEWSFEEDS_BYBOARD[NFCOUNT] = NEWSFEEDS+NFCOUNT; - for (nptr= ptr ;*nptr && isspace(*nptr); ) nptr++; - if (*nptr == '\0') continue; - NEWSFEEDS[NFCOUNT].newsgroups = nptr; - for (nptr++; *nptr && !isspace(*nptr); ) nptr++; - if (*nptr == '\0') continue; - *nptr = '\0'; - for (nptr++ ;*nptr && isspace(*nptr); ) nptr++; - if (*nptr == '\0') continue; - NEWSFEEDS[NFCOUNT].board = nptr; - for (nptr++; *nptr && !isspace(*nptr); ) nptr++; - if (*nptr == '\0') continue; - *nptr = '\0'; - for (nptr++;*nptr && isspace(*nptr); ) nptr++; - if (*nptr == '\0') continue; - NEWSFEEDS[NFCOUNT].path = nptr; - for (nptr++; *nptr && !strchr("\r\n",*nptr); ) nptr++; - *nptr = '\0'; + NEWSFEEDS_BYBOARD[NFCOUNT] = NEWSFEEDS + NFCOUNT; + for (nptr = ptr; *nptr && isspace(*nptr);) + nptr++; + if (*nptr == '\0') + continue; + NEWSFEEDS[NFCOUNT].newsgroups = nptr; + for (nptr++; *nptr && !isspace(*nptr);) + nptr++; + if (*nptr == '\0') + continue; + *nptr = '\0'; + for (nptr++; *nptr && isspace(*nptr);) + nptr++; + if (*nptr == '\0') + continue; + NEWSFEEDS[NFCOUNT].board = nptr; + for (nptr++; *nptr && !isspace(*nptr);) + nptr++; + if (*nptr == '\0') + continue; + *nptr = '\0'; + for (nptr++; *nptr && isspace(*nptr);) + nptr++; + if (*nptr == '\0') + continue; + NEWSFEEDS[NFCOUNT].path = nptr; + for (nptr++; *nptr && !strchr("\r\n", *nptr);) + nptr++; + *nptr = '\0'; } qsort(NEWSFEEDS, NFCOUNT, sizeof(newsfeeds_t), nfcmp); - qsort(NEWSFEEDS_BYBOARD, NFCOUNT, sizeof(newsfeeds_t*), nf_byboardcmp); + qsort(NEWSFEEDS_BYBOARD, NFCOUNT, sizeof(newsfeeds_t *), nf_byboardcmp); } -newsfeeds_t *search_board(board) -char *board; +newsfeeds_t * +search_board(board) + char *board; { - newsfeeds_t nft, *nftptr, **find; - if (NONENEWSFEEDS) return NULL; - nft.board = board; - nftptr = &nft; - find = (newsfeeds_t**)bsearch((char*)&nftptr, NEWSFEEDS_BYBOARD, NFCOUNT, sizeof(newsfeeds_t*), nf_byboardcmp); - if (find != NULL) return *find; - return NULL; + newsfeeds_t nft, *nftptr, **find; + if (NONENEWSFEEDS) + return NULL; + nft.board = board; + nftptr = &nft; + find = (newsfeeds_t **) bsearch((char *)&nftptr, NEWSFEEDS_BYBOARD, NFCOUNT, sizeof(newsfeeds_t *), nf_byboardcmp); + if (find != NULL) + return *find; + return NULL; } -nodelist_t *search_nodelist_bynode(node) -char *node; +nodelist_t * +search_nodelist_bynode(node) + char *node; { - nodelist_t nlt, *nltptr, **find; - if (LOCALNODELIST) return NULL; - nlt.node = node; - nltptr = ≮ - find = (nodelist_t**)bsearch((char*)&nltptr, NODELIST_BYNODE, NLCOUNT, sizeof(nodelist_t*), nl_bynodecmp); - if (find != NULL) return *find; - return NULL; + nodelist_t nlt, *nltptr, **find; + if (LOCALNODELIST) + return NULL; + nlt.node = node; + nltptr = ≮ + find = (nodelist_t **) bsearch((char *)&nltptr, NODELIST_BYNODE, NLCOUNT, sizeof(nodelist_t *), nl_bynodecmp); + if (find != NULL) + return *find; + return NULL; } -nodelist_t *search_nodelist(site, identuser) -char *site; -char *identuser; +nodelist_t * +search_nodelist(site, identuser) + char *site; + char *identuser; { - nodelist_t nlt, *find; - char buffer[1024]; - if (LOCALNODELIST) return NULL; - nlt.host = site; - find = (nodelist_t*)bsearch((char*)&nlt, NODELIST, NLCOUNT, sizeof(nodelist_t), nlcmp); - if (find == NULL && identuser != NULL) { - sprintf(buffer,"%s@%s", identuser, site); - nlt.host = buffer; - find = (nodelist_t*)bsearch((char*)&nlt, NODELIST, NLCOUNT, sizeof(nodelist_t), nlcmp); - } - return find; + nodelist_t nlt, *find; + char buffer[1024]; + if (LOCALNODELIST) + return NULL; + nlt.host = site; + find = (nodelist_t *) bsearch((char *)&nlt, NODELIST, NLCOUNT, sizeof(nodelist_t), nlcmp); + if (find == NULL && identuser != NULL) { + sprintf(buffer, "%s@%s", identuser, site); + nlt.host = buffer; + find = (nodelist_t *) bsearch((char *)&nlt, NODELIST, NLCOUNT, sizeof(nodelist_t), nlcmp); + } + return find; } -newsfeeds_t *search_group(newsgroup) -char *newsgroup; +newsfeeds_t * +search_group(newsgroup) + char *newsgroup; { - newsfeeds_t nft, *find; - if (NONENEWSFEEDS) return NULL; - nft.newsgroups = newsgroup; - find = (newsfeeds_t*)bsearch((char*)&nft, NEWSFEEDS, NFCOUNT, sizeof(newsfeeds_t), nfcmp); - return find; + newsfeeds_t nft, *find; + if (NONENEWSFEEDS) + return NULL; + nft.newsgroups = newsgroup; + find = (newsfeeds_t *) bsearch((char *)&nft, NEWSFEEDS, NFCOUNT, sizeof(newsfeeds_t), nfcmp); + return find; } -char *ascii_date(now) -time_t now; +char * +ascii_date(now) + time_t now; { - static char datebuf[40]; - /*time_t now; - time(&now);*/ - strftime(datebuf, sizeof(datebuf), "%d %b %Y %X GMT", gmtime(&now)); - return datebuf; + static char datebuf[40]; + /* + * time_t now; time(&now); + */ + strftime(datebuf, sizeof(datebuf), "%d %b %Y %X GMT", gmtime(&now)); + return datebuf; } -char * +char * restrdup(ptr, string) -char *ptr; -char *string; + char *ptr; + char *string; { - int len ; - if (string == NULL) { - if (ptr != NULL) *ptr = '\0'; - return ptr; - } - len = strlen(string) + 1; - if (ptr != NULL) { - ptr = (char*)myrealloc(ptr, len); - } else - ptr = (char*)mymalloc(len); - strcpy(ptr, string); - return ptr; + int len; + if (string == NULL) { + if (ptr != NULL) + *ptr = '\0'; + return ptr; + } + len = strlen(string) + 1; + if (ptr != NULL) { + ptr = (char *)myrealloc(ptr, len); + } else + ptr = (char *)mymalloc(len); + strcpy(ptr, string); + return ptr; } -void * +void * mymalloc(size) -int size; + int size; { - char *ptr = (char*)malloc(size); + char *ptr = (char *)malloc(size); if (ptr == NULL) { - fprintf(stderr, "cant allocate memory\n"); - syslog(LOG_ERR, "cant allocate memory %m"); - exit(1); + fprintf(stderr, "cant allocate memory\n"); + syslog(LOG_ERR, "cant allocate memory %m"); + exit(1); } return ptr; } -void * +void * myrealloc(optr, size) -void *optr; -int size; + void *optr; + int size; { - char *ptr = (char*)realloc(optr, size); + char *ptr = (char *)realloc(optr, size); if (ptr == NULL) { - fprintf(stderr, "cant allocate memory\n"); - syslog(LOG_ERR, "cant allocate memory %m"); - exit(1); + fprintf(stderr, "cant allocate memory\n"); + syslog(LOG_ERR, "cant allocate memory %m"); + exit(1); } return ptr; } 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; } #ifdef BBSLIB main() { - initial_bbs("feed"); - printf("%s\n",ascii_date()); + initial_bbs("feed"); + printf("%s\n", ascii_date()); } #endif - diff --git a/innbbsd/bbslib.h b/innbbsd/bbslib.h index a03a1d67..ed595389 100644 --- a/innbbsd/bbslib.h +++ b/innbbsd/bbslib.h @@ -2,58 +2,58 @@ #define BBSLIB_H typedef struct nodelist_t { - char *node; - char *exclusion; - char *host; - char *protocol; - char *comments; - int feedtype; - FILE *feedfp; -} nodelist_t; + char *node; + char *exclusion; + char *host; + char *protocol; + char *comments; + int feedtype; + FILE *feedfp; +} nodelist_t; typedef struct newsfeeds_t { - char *newsgroups; - char *board; - char *path; -} newsfeeds_t; + char *newsgroups; + char *board; + char *path; +} newsfeeds_t; typedef struct overview_t { - char *board, *filename, *group; - time_t mtime; - char *from, *subject; -} overview_t; - -extern char MYBBSID[]; -extern char ECHOMAIL[]; -extern char BBSFEEDS[]; -extern char LOCALDAEMON[]; -extern char INNDHOME[]; -extern char HISTORY[]; -extern char LOGFILE[]; -extern char INNBBSCONF[]; + char *board, *filename, *group; + time_t mtime; + char *from, *subject; +} overview_t; + +extern char MYBBSID[]; +extern char ECHOMAIL[]; +extern char BBSFEEDS[]; +extern char LOCALDAEMON[]; +extern char INNDHOME[]; +extern char HISTORY[]; +extern char LOGFILE[]; +extern char INNBBSCONF[]; extern nodelist_t *NODELIST; extern nodelist_t **NODELIST_BYNODE; extern newsfeeds_t *NEWSFEEDS, **NEWSFEEDS_BYBOARD; -extern int NFCOUNT, NLCOUNT; -extern int Expiredays, His_Maint_Min, His_Maint_Hour; -extern int LOCALNODELIST, NONENEWSFEEDS; -extern int Maxclient; - -# ifndef ARG -# ifdef __STDC__ -# define ARG(x) x -# else -# define ARG(x) () -# endif -# endif - -int initial_bbs ARG((char* )); -char *restrdup ARG((char *, char *)); -nodelist_t *search_nodelist ARG((char *, char *)); -newsfeeds_t *search_group ARG((char *)); -int bbslog(char *fmt, ...); -void *mymalloc ARG((int)); -void *myrealloc ARG((void *, int)); +extern int NFCOUNT, NLCOUNT; +extern int Expiredays, His_Maint_Min, His_Maint_Hour; +extern int LOCALNODELIST, NONENEWSFEEDS; +extern int Maxclient; + +#ifndef ARG +#ifdef __STDC__ +#define ARG(x) x +#else +#define ARG(x) () +#endif +#endif + +int initial_bbs ARG((char *)); +char *restrdup ARG((char *, char *)); +nodelist_t *search_nodelist ARG((char *, char *)); +newsfeeds_t *search_group ARG((char *)); +int bbslog(char *fmt,...); +void *mymalloc ARG((int)); +void *myrealloc ARG((void *, int)); #ifdef PalmBBS #define bbslog xbbslog diff --git a/innbbsd/bbslink.c b/innbbsd/bbslink.c index b7ca2f9d..510a8536 100644 --- a/innbbsd/bbslink.c +++ b/innbbsd/bbslink.c @@ -1,18 +1,18 @@ #if defined( LINUX ) -# include "innbbsconf.h" -# include "bbslib.h" -# include <stdarg.h> +#include "innbbsconf.h" +#include "bbslib.h" +#include <stdarg.h> #else -# include <stdarg.h> -# include "innbbsconf.h" -# include "bbslib.h" +#include <stdarg.h> +#include "innbbsconf.h" +#include "bbslib.h" #endif #include "antisplam.h" #include <sys/mman.h> #ifndef AIX -# include <sys/fcntl.h> +#include <sys/fcntl.h> #endif #if defined(PalmBBS) @@ -28,7 +28,7 @@ * TODO 1. read newsfeeds.bbs, read nodelist.bbs, read bbsname.bbs 2. scan * new posts and append to .link 3. rename .link to .send (must lock) 4. * start to send .send out and append not sent to .link - * + * * 5. node.LOCK (with pid) 6. log articles sent */ @@ -37,453 +37,409 @@ #define MAXBUFLEN 256 #endif -#define MAX_OUTGO_POST 100 /* bbslink 一次處理的轉出最大文章數量 */ +#define MAX_OUTGO_POST 100 /* bbslink 一次處理的轉出最大文章數量 */ -typedef struct my_out_bntp -{ - char *board, *filename, *userid, *nickname, *subject; -} my_out_bntp; +typedef struct my_out_bntp { + char *board, *filename, *userid, *nickname, *subject; +} my_out_bntp; struct my_out_bntp out_bntp[MAX_OUTGO_POST]; -int outgo_post=0; - -typedef struct Over_t -{ - time_t mtime; - char date[MAXBUFLEN]; - char nickname[MAXBUFLEN]; - char subject[MAXBUFLEN]; - char from[MAXBUFLEN]; - char msgid[MAXBUFLEN]; - char site[MAXBUFLEN]; - char board[MAXBUFLEN]; -} linkoverview_t; - -typedef struct SendOver_t -{ - char *board, *filename, *group, *from, *subject; - char *outgoingtype, *msgid, *path; - char *date, *control; - time_t mtime; -} soverview_t; - -typedef struct Stat_t -{ - int localsendout; - int localfailed; - int remotesendout; - int remotefailed; -} stat_t; - -static stat_t *BBSLINK_STAT; - -static int NoAction = 0; -static int Verbose = 0; -static int VisitOnly = 0; -static int NoVisit = 0; -static char *DefaultFeedSite = ""; -static int KillFormerBBSLINK = 0; - -extern char *SITE; -extern char *GROUPS; - -char NICKNAME[MAXBUFLEN]; - -char DATE_BUF[MAXBUFLEN]; -extern char *DATE; - -char FROM_BUF[MAXBUFLEN]; -extern char *FROM; +int outgo_post = 0; + +typedef struct Over_t { + time_t mtime; + char date[MAXBUFLEN]; + char nickname[MAXBUFLEN]; + char subject[MAXBUFLEN]; + char from[MAXBUFLEN]; + char msgid[MAXBUFLEN]; + char site[MAXBUFLEN]; + char board[MAXBUFLEN]; +} linkoverview_t; + +typedef struct SendOver_t { + char *board, *filename, *group, *from, *subject; + char *outgoingtype, *msgid, *path; + char *date, *control; + time_t mtime; +} soverview_t; + +typedef struct Stat_t { + int localsendout; + int localfailed; + int remotesendout; + int remotefailed; +} stat_t; + +static stat_t *BBSLINK_STAT; + +static int NoAction = 0; +static int Verbose = 0; +static int VisitOnly = 0; +static int NoVisit = 0; +static char *DefaultFeedSite = ""; +static int KillFormerBBSLINK = 0; + +extern char *SITE; +extern char *GROUPS; + +char NICKNAME[MAXBUFLEN]; + +char DATE_BUF[MAXBUFLEN]; +extern char *DATE; + +char FROM_BUF[MAXBUFLEN]; +extern char *FROM; #ifndef MapleBBS -char POSTER_BUF[MAXBUFLEN]; -char *POSTER; +char POSTER_BUF[MAXBUFLEN]; +char *POSTER; #endif -char MYADDR[MAXBUFLEN]; -char MYSITE[MAXBUFLEN]; +char MYADDR[MAXBUFLEN]; +char MYSITE[MAXBUFLEN]; -char SUBJECT_BUF[MAXBUFLEN]; -extern char *SUBJECT; +char SUBJECT_BUF[MAXBUFLEN]; +extern char *SUBJECT; -char MSGID_BUF[MAXBUFLEN]; -extern char *MSGID; +char MSGID_BUF[MAXBUFLEN]; +extern char *MSGID; -char LINKPROTOCOL[MAXBUFLEN]; -int LINKPORT; -char ORGANIZATION[MAXBUFLEN]; -char NEWSCONTROL[MAXBUFLEN]; -char NEWSAPPROVED[MAXBUFLEN]; -char NNTPHOST_BUF[MAXBUFLEN]; -extern char *NNTPHOST; -char PATH_BUF[MAXBUFLEN]; -extern char *PATH; +char LINKPROTOCOL[MAXBUFLEN]; +int LINKPORT; +char ORGANIZATION[MAXBUFLEN]; +char NEWSCONTROL[MAXBUFLEN]; +char NEWSAPPROVED[MAXBUFLEN]; +char NNTPHOST_BUF[MAXBUFLEN]; +extern char *NNTPHOST; +char PATH_BUF[MAXBUFLEN]; +extern char *PATH; -char CONTROL_BUF[MAXBUFLEN]; -extern char *CONTROL; +char CONTROL_BUF[MAXBUFLEN]; +extern char *CONTROL; -char *BODY, *HEAD; +char *BODY, *HEAD; -int USEIHAVE = 1; -int USEPOST = 0; -int USEDATA = 0; -int FEEDTYPE = ' '; +int USEIHAVE = 1; +int USEPOST = 0; +int USEDATA = 0; +int FEEDTYPE = ' '; -int NNTP = -1; -FILE *NNTPrfp = NULL; -FILE *NNTPwfp = NULL; -char NNTPbuffer[1024]; -static char *NEWSFEED; -static char *REMOTE = "REMOTE"; -static char *LOCAL = "LOCAL"; +int NNTP = -1; +FILE *NNTPrfp = NULL; +FILE *NNTPwfp = NULL; +char NNTPbuffer[1024]; +static char *NEWSFEED; +static char *REMOTE = "REMOTE"; +static char *LOCAL = "LOCAL"; -static int FD, FD_SIZE; -static char *FD_BUF; -static char *FD_END; +static int FD, FD_SIZE; +static char *FD_BUF; +static char *FD_END; -static char *COMMENT = "\n"; -/*"[Ptt 送出]\n";*/ +static char *COMMENT = "\n"; +/* "[Ptt 送出]\n"; */ -char *fileglue(); +char *fileglue(); int is_outgo_post(board, filename, userid, nickname, subject) - char *board, *filename, *userid, *nickname, *subject; + char *board, *filename, *userid, *nickname, *subject; { - int mypost; - - for (mypost = 0; mypost < outgo_post; mypost++) - { - if (!strcmp(out_bntp[mypost].filename, filename)) - if (!strcmp(out_bntp[mypost].userid, userid)) - if (!strcmp(out_bntp[mypost].board, board)) - if (!strcmp(out_bntp[mypost].nickname, nickname)) - if (!strcmp(out_bntp[mypost].subject, subject)){ - if (Verbose) - printf("bad_cancel: %s, %s(%s), %s, %s\n", - board, userid, nickname, subject, filename); - bbslog("bad_cancel: %s, %s(%s), %s, %s\n", - board, userid, nickname, subject, filename); - return 1; + int mypost; + + for (mypost = 0; mypost < outgo_post; mypost++) { + if (!strcmp(out_bntp[mypost].filename, filename)) + if (!strcmp(out_bntp[mypost].userid, userid)) + if (!strcmp(out_bntp[mypost].board, board)) + if (!strcmp(out_bntp[mypost].nickname, nickname)) + if (!strcmp(out_bntp[mypost].subject, subject)) { + if (Verbose) + printf("bad_cancel: %s, %s(%s), %s, %s\n", + board, userid, nickname, subject, filename); + bbslog("bad_cancel: %s, %s(%s), %s, %s\n", + board, userid, nickname, subject, filename); + return 1; + } } - } - return 0; + return 0; } /* -woju -Cross-fs rename() -*/ + * woju Cross-fs rename() + */ -Rename(char* src, char* dst) +Rename(char *src, char *dst) { - char cmd[200]; + char cmd[200]; - if (rename(src, dst) == 0) - return 0; + if (rename(src, dst) == 0) + return 0; - sprintf(cmd, "/bin/mv %s %s", src, dst); - return system(cmd); + sprintf(cmd, "/bin/mv %s %s", src, dst); + return system(cmd); } bbslink_un_lock(file) - char *file; + char *file; { - char *lockfile = fileglue("%s.LOCK", file); + char *lockfile = fileglue("%s.LOCK", file); - if (isfile(lockfile)) - unlink(lockfile); + if (isfile(lockfile)) + unlink(lockfile); } bbslink_get_lock(file) - char *file; + char *file; { - int lockfd; - char LockFile[MAXPATHLEN]; - - strncpy(LockFile, (char *) fileglue("%s.LOCK", file), sizeof LockFile); - if ((lockfd = open(LockFile, O_RDONLY)) >= 0) - { - char buf[10]; - int pid; - - if (read(lockfd, buf, sizeof buf) > 0 && - (pid = atoi(buf)) > 0 && kill(pid, 0) == 0) - { - if (KillFormerBBSLINK) - { - kill(pid, SIGTERM); - unlink(LockFile); - } - else - { - fprintf(stderr, "another process [%d] running\n", pid); - return 0; - } + int lockfd; + char LockFile[MAXPATHLEN]; + + strncpy(LockFile, (char *)fileglue("%s.LOCK", file), sizeof LockFile); + if ((lockfd = open(LockFile, O_RDONLY)) >= 0) { + char buf[10]; + int pid; + + if (read(lockfd, buf, sizeof buf) > 0 && + (pid = atoi(buf)) > 0 && kill(pid, 0) == 0) { + if (KillFormerBBSLINK) { + kill(pid, SIGTERM); + unlink(LockFile); + } else { + fprintf(stderr, "another process [%d] running\n", pid); + return 0; + } + } else { + fprintf(stderr, "no process [%d] running, but lock file existed, unlinked\n", pid); + unlink(LockFile); + } + close(lockfd); } - else - { - fprintf(stderr, "no process [%d] running, but lock file existed, unlinked\n", pid); - unlink(LockFile); + if ((lockfd = open(LockFile, O_RDWR | O_CREAT | O_EXCL, 0644)) < 0) { + fprintf(stderr, "lock %s error: another bbslink process running\n", LockFile); + return 0; + } else { + char buf[10]; + int pid; + + sprintf(buf, "%-.8d\n", getpid()); + write(lockfd, buf, strlen(buf)); + close(lockfd); + return 1; } - close(lockfd); - } - - if ((lockfd = open(LockFile, O_RDWR | O_CREAT | O_EXCL, 0644)) < 0) - { - fprintf(stderr, "lock %s error: another bbslink process running\n", LockFile); - return 0; - } - else - { - char buf[10]; - int pid; - - sprintf(buf, "%-.8d\n", getpid()); - write(lockfd, buf, strlen(buf)); - close(lockfd); - return 1; - } } int -tcpcommand(char *fmt, ...) +tcpcommand(char *fmt,...) { - va_list ap; - char *ptr; - - va_start(ap, fmt); - vfprintf(NNTPwfp, fmt, ap); - fprintf(NNTPwfp, "\r\n"); - fflush(NNTPwfp); - - fgets(NNTPbuffer, sizeof NNTPbuffer, NNTPrfp); - ptr = strchr(NNTPbuffer, '\r'); - if (ptr) - *ptr = '\0'; - ptr = strchr(NNTPbuffer, '\n'); - if (ptr) - *ptr = '\0'; - va_end(ap); - return atoi(NNTPbuffer); + va_list ap; + char *ptr; + + va_start(ap, fmt); + vfprintf(NNTPwfp, fmt, ap); + fprintf(NNTPwfp, "\r\n"); + fflush(NNTPwfp); + + fgets(NNTPbuffer, sizeof NNTPbuffer, NNTPrfp); + ptr = strchr(NNTPbuffer, '\r'); + if (ptr) + *ptr = '\0'; + ptr = strchr(NNTPbuffer, '\n'); + if (ptr) + *ptr = '\0'; + va_end(ap); + return atoi(NNTPbuffer); } -char * +char * tcpmessage() { - char *ptr; + char *ptr; - ptr = strchr(NNTPbuffer, ' '); - if (ptr) - return ptr; - return NNTPbuffer; + ptr = strchr(NNTPbuffer, ' '); + if (ptr) + return ptr; + return NNTPbuffer; } read_article(lover, filename, userid) - linkoverview_t *lover; - char *filename, *userid; + linkoverview_t *lover; + char *filename, *userid; { - FILE *fp; - int fd; - struct stat st; - time_t mtime; - char *buffer; - char *artptr, *artend, *artback; - - if (stat(filename, &st) != 0) - return 0; - lover->mtime = st.st_mtime; - fd = open(filename, O_RDONLY); - if (fd < 0) - { - bbslog("<bbslink> Err: can't open %s\n", filename); - return 0; - } - - if (FD_BUF == NULL) - { - FD_BUF = mymalloc(st.st_size + 1 + strlen(COMMENT)); - } - else - { - FD_BUF = myrealloc(FD_BUF, st.st_size + 1 + strlen(COMMENT)); - } - FD_BUF[st.st_size] = '\0'; - read(fd, FD_BUF, st.st_size); - sprintf(FD_BUF + st.st_size, "%s", COMMENT); - st.st_size += strlen(COMMENT); - FD_SIZE = st.st_size; - for (buffer = FD_BUF, artend = FD_BUF + st.st_size, - artback = strchr(buffer, '\n'); - buffer && buffer < artend && *buffer; - artback = strchr(buffer, '\n') - ) - { - /* while( fgets(buffer, sizeof buffer, fp) != NULL) { */ - char *m, *n; - char *ptr; - - if (artback != NULL) - *artback = '\0'; - if (*buffer == '\0') - break; - -#ifndef MapleBBS - if (strstr(buffer, userid) != NULL) - { - m = strchr(buffer, '('); - n = strrchr(buffer, ')'); - if (m != NULL && n != NULL) - { - strncpy(lover->nickname, m + 1, n - m - 1); - lover->nickname[n - m - 1] = '\0'; - } - else - { - *lover->nickname = '\0'; - } + FILE *fp; + int fd; + struct stat st; + time_t mtime; + char *buffer; + char *artptr, *artend, *artback; + + if (stat(filename, &st) != 0) + return 0; + lover->mtime = st.st_mtime; + fd = open(filename, O_RDONLY); + if (fd < 0) { + bbslog("<bbslink> Err: can't open %s\n", filename); + return 0; } - else if (strncmp(buffer, "Date: ", 11) == 0) - { - strcpy(lover->date, buffer + 11); - } - else if (strncmp(buffer, "發信站: ", 8) == 0) - { - m = strchr(buffer, '('); - n = strrchr(buffer, ')'); - strncpy(lover->date, m + 1, n - m - 1); - lover->date[n - m - 1] = '\0'; + if (FD_BUF == NULL) { + FD_BUF = mymalloc(st.st_size + 1 + strlen(COMMENT)); + } else { + FD_BUF = myrealloc(FD_BUF, st.st_size + 1 + strlen(COMMENT)); } + FD_BUF[st.st_size] = '\0'; + read(fd, FD_BUF, st.st_size); + sprintf(FD_BUF + st.st_size, "%s", COMMENT); + st.st_size += strlen(COMMENT); + FD_SIZE = st.st_size; + for (buffer = FD_BUF, artend = FD_BUF + st.st_size, + artback = strchr(buffer, '\n'); + buffer && buffer < artend && *buffer; + artback = strchr(buffer, '\n') + ) { + /* while( fgets(buffer, sizeof buffer, fp) != NULL) { */ + char *m, *n; + char *ptr; + + if (artback != NULL) + *artback = '\0'; + if (*buffer == '\0') + break; + +#ifndef MapleBBS + if (strstr(buffer, userid) != NULL) { + m = strchr(buffer, '('); + n = strrchr(buffer, ')'); + if (m != NULL && n != NULL) { + strncpy(lover->nickname, m + 1, n - m - 1); + lover->nickname[n - m - 1] = '\0'; + } else { + *lover->nickname = '\0'; + } + } else if (strncmp(buffer, "Date: ", 11) == 0) { + strcpy(lover->date, buffer + 11); + } else if (strncmp(buffer, "發信站: ", 8) == 0) { + m = strchr(buffer, '('); + n = strrchr(buffer, ')'); + strncpy(lover->date, m + 1, n - m - 1); + lover->date[n - m - 1] = '\0'; + } #endif - if (artback != NULL) - { - *artback = '\n'; - buffer = artback + 1; + if (artback != NULL) { + *artback = '\n'; + buffer = artback + 1; + } else { + break; + } } + if (artback != NULL) + BODY = artback + 1; else - { - break; - } - } - if (artback != NULL) - BODY = artback + 1; - else - BODY = ""; - close(fd); - return 1; + BODY = ""; + close(fd); + return 1; } save_outgoing(sover, filename, userid, poster, mtime) - soverview_t *sover, *filename, *userid, *poster; - time_t mtime; + soverview_t *sover, *filename, *userid, *poster; + time_t mtime; { - newsfeeds_t *nf; - char *group, *server, *serveraddr; - char *subject, *path; - char *board; - char *ptr1, *ptr2; - - board = sover->board; - - PATH = MYBBSID; - nf = (newsfeeds_t *) search_board(board); - if (nf == NULL) - { - bbslog("<bbslink> save_outgoing: No such board %s\n", board); - return; - } - else - { - group = nf->newsgroups; - server = nf->path; - } - if (!server || !*server) - { - sprintf(PATH_BUF, "%.*s (local)", sizeof PATH_BUF - 9, MYBBSID); - PATH = PATH_BUF; - serveraddr = ""; - sover->path = PATH; - } - for (ptr1 = server; ptr1 && *ptr1;) - { - nodelist_t *nl; - char savech; - - for (; *ptr1 && isspace(*ptr1); ptr1++); - if (!*ptr1) - break; - for (ptr2 = ptr1; *ptr2 && !isspace(*ptr2); ptr2++); - savech = *ptr2; - *ptr2 = '\0'; - nl = (nodelist_t *) search_nodelist_bynode(ptr1); - *ptr2 = savech; - ptr1 = ptr2++; - if (nl == NULL) - continue; - /* if (nl->feedfp == NULL) continue; */ - - if (nl->host && *nl->host) - { - if (nl->feedfp == NULL) - { - nl->feedfp = fopen(fileglue("%s/%s.link", INNDHOME, nl->node), "a"); - if (nl->feedfp == NULL) - { - bbslog("<save outgoing> append failed for %s/%s.link", INNDHOME, nl->node); - } - } - if (nl->feedfp != NULL) - { - flock(fileno(nl->feedfp), LOCK_EX); - fprintf(nl->feedfp, "%s\t%s\t%s\t%ld\t%s\t%s\n", sover->board, filename, group, mtime, FROM, sover->subject); - fflush(nl->feedfp); - flock(fileno(nl->feedfp), LOCK_UN); - } + newsfeeds_t *nf; + char *group, *server, *serveraddr; + char *subject, *path; + char *board; + char *ptr1, *ptr2; + + board = sover->board; + + PATH = MYBBSID; + nf = (newsfeeds_t *) search_board(board); + if (nf == NULL) { + bbslog("<bbslink> save_outgoing: No such board %s\n", board); + return; + } else { + group = nf->newsgroups; + server = nf->path; + } + if (!server || !*server) { + sprintf(PATH_BUF, "%.*s (local)", sizeof PATH_BUF - 9, MYBBSID); + PATH = PATH_BUF; + serveraddr = ""; + sover->path = PATH; + } + for (ptr1 = server; ptr1 && *ptr1;) { + nodelist_t *nl; + char savech; + + for (; *ptr1 && isspace(*ptr1); ptr1++); + if (!*ptr1) + break; + for (ptr2 = ptr1; *ptr2 && !isspace(*ptr2); ptr2++); + savech = *ptr2; + *ptr2 = '\0'; + nl = (nodelist_t *) search_nodelist_bynode(ptr1); + *ptr2 = savech; + ptr1 = ptr2++; + if (nl == NULL) + continue; + /* if (nl->feedfp == NULL) continue; */ + + if (nl->host && *nl->host) { + if (nl->feedfp == NULL) { + nl->feedfp = fopen(fileglue("%s/%s.link", INNDHOME, nl->node), "a"); + if (nl->feedfp == NULL) { + bbslog("<save outgoing> append failed for %s/%s.link", INNDHOME, nl->node); + } + } + if (nl->feedfp != NULL) { + flock(fileno(nl->feedfp), LOCK_EX); + fprintf(nl->feedfp, "%s\t%s\t%s\t%ld\t%s\t%s\n", sover->board, filename, group, mtime, FROM, sover->subject); + fflush(nl->feedfp); + flock(fileno(nl->feedfp), LOCK_UN); + } + } + if (savech == '\0') + break; } - if (savech == '\0') - break; - } } #ifndef MapleBBS save_article(board, filename, sover) - char *board, *filename; - soverview_t *sover; + char *board, *filename; + soverview_t *sover; { - FILE *FN; - - if (Verbose) - printf("<save_article> %s %s\n", board, filename); - FN = fopen(fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename), "w"); - if (FN == NULL) - { - bbslog("<save_article> err: %s %s\n", board, filename); + FILE *FN; + if (Verbose) - printf("<save_article> err: %s %s\n", board, filename); - return 0; - } - flock(fileno(FN), LOCK_EX); - fprintf(FN, "發信人: %s, 信區: %s\n", POSTER, sover->board); - fprintf(FN, "標 題: %s\n", sover->subject); - fprintf(FN, "發信站: %s (%s)\n", MYSITE, sover->date); - fprintf(FN, "轉信站: %s\n", sover->path); - fprintf(FN, "\n"); - fputs(BODY, FN); - flock(fileno(FN), LOCK_UN); - fclose(FN); + printf("<save_article> %s %s\n", board, filename); + FN = fopen(fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename), "w"); + if (FN == NULL) { + bbslog("<save_article> err: %s %s\n", board, filename); + if (Verbose) + printf("<save_article> err: %s %s\n", board, filename); + return 0; + } + flock(fileno(FN), LOCK_EX); + fprintf(FN, "發信人: %s, 信區: %s\n", POSTER, sover->board); + fprintf(FN, "標 題: %s\n", sover->subject); + fprintf(FN, "發信站: %s (%s)\n", MYSITE, sover->date); + fprintf(FN, "轉信站: %s\n", sover->path); + fprintf(FN, "\n"); + fputs(BODY, FN); + flock(fileno(FN), LOCK_UN); + fclose(FN); #if defined(PalmBBS) - { - struct utimbuf times; - - times.actime = sover->mtime; - times.modtime = sover->mtime; - utime(fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename), ×); - utime(fileglue("%s/.bcache/%s", BBSHOME, board), NULL); - } + { + struct utimbuf times; + + times.actime = sover->mtime; + times.modtime = sover->mtime; + utime(fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename), ×); + utime(fileglue("%s/.bcache/%s", BBSHOME, board), NULL); + } #endif } #endif @@ -491,869 +447,736 @@ save_article(board, filename, sover) /* process_article() read_article() save_outgoing() save_article() */ process_article(board, filename, userid, nickname, subject) - char *board, *filename, *userid, *nickname, *subject; + char *board, *filename, *userid, *nickname, *subject; { - char *n, *filepath; - char poster[MAXBUFLEN]; - soverview_t sover; - - if (!*userid) - { - return; - } - else if (!subject || !*subject) - { - subject = "無題"; - } - filepath = fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename); - if (isfile(filepath)) - { - linkoverview_t lover; - - if (read_article(&lover, filepath, userid)) - { + char *n, *filepath; + char poster[MAXBUFLEN]; + soverview_t sover; + + if (!*userid) { + return; + } else if (!subject || !*subject) { + subject = "無題"; + } + filepath = fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename); + if (isfile(filepath)) { + linkoverview_t lover; + + if (read_article(&lover, filepath, userid)) { #ifndef MapleBBS - strncpy(POSTER_BUF, fileglue("%s@%s (%s)", userid, MYBBSID, nickname), sizeof POSTER_BUF); - POSTER = POSTER_BUF; + strncpy(POSTER_BUF, fileglue("%s@%s (%s)", userid, MYBBSID, nickname), sizeof POSTER_BUF); + POSTER = POSTER_BUF; #endif - strncpy(FROM_BUF, fileglue("%s.bbs@%s (%s)", userid, MYADDR, nickname), sizeof FROM_BUF); - FROM = FROM_BUF; - sover.from = FROM; - sover.board = board; - sover.subject = subject; - PATH = MYBBSID; - sover.path = MYBBSID; - sover.date = lover.date; - sover.mtime = lover.mtime; - if (!VisitOnly) - { - save_outgoing(&sover, filename, userid, poster, lover.mtime); + strncpy(FROM_BUF, fileglue("%s.bbs@%s (%s)", userid, MYADDR, nickname), sizeof FROM_BUF); + FROM = FROM_BUF; + sover.from = FROM; + sover.board = board; + sover.subject = subject; + PATH = MYBBSID; + sover.path = MYBBSID; + sover.date = lover.date; + sover.mtime = lover.mtime; + if (!VisitOnly) { + save_outgoing(&sover, filename, userid, poster, lover.mtime); #ifndef MapleBBS - save_article(board, filename, &sover); + save_article(board, filename, &sover); #endif - } + } + } } - } } -char * +char * baseN(val, base, len) - int val, base, len; + int val, base, len; { - int n, ans; - static char str[MAXBUFLEN]; - char *pstr = str; - int index; - - for (index = len - 1; index >= 0; index--) - { - n = val % base; - val /= base; - if (n < 10) - { - n += '0'; + int n, ans; + static char str[MAXBUFLEN]; + char *pstr = str; + int index; + + for (index = len - 1; index >= 0; index--) { + n = val % base; + val /= base; + if (n < 10) { + n += '0'; + } else if (n < 36) { + n += 'A' - 10; + } else if (n < 62) { + n += 'a' - 36; + } else { + n = '_'; + } + str[index] = n; } - else if (n < 36) - { - n += 'A' - 10; - } - else if (n < 62) - { - n += 'a' - 36; - } - else - { - n = '_'; - } - str[index] = n; - } - str[len] = '\0'; - return str; + str[len] = '\0'; + return str; } -char * +char * hash_value(str) - char *str; + char *str; { - int val, n; - char *ptr; - - if (*str) - ptr = str + strlen(str) - 1; - else - ptr = str; - val = 0; - while (ptr >= str) - { - n = *ptr; - val = (val + n * 0x100) ^ n; - ptr--; - } - return baseN(val, 64, 3); + int val, n; + char *ptr; + + if (*str) + ptr = str + strlen(str) - 1; + else + ptr = str; + val = 0; + while (ptr >= str) { + n = *ptr; + val = (val + n * 0x100) ^ n; + ptr--; + } + return baseN(val, 64, 3); } /* process_cancel() save_outgoing() hash_value(); baseN(); ascii_date(); */ read_outgoing(sover) - soverview_t *sover; + soverview_t *sover; { - char *board, *filename, *group, *from, *subject, *outgoingtype, *msgid, *path; - char *buffer, *bufferp; - FILE *ECHOMAIL, *FN; - char *hash; - char times[MAXBUFLEN]; - time_t mtime; - - board = sover->board; - filename = sover->filename; - group = sover->group; - mtime = sover->mtime; - from = sover->from; - subject = sover->subject; - outgoingtype = sover->outgoingtype; - msgid = sover->msgid; - path = sover->path; - if (Verbose) - { - printf("<read_outgoing> %s:%s:%s\n", board, filename, group); - printf(" => %ld:%s\n", mtime, from); - printf(" => %s\n", subject); - printf(" => %s:%s\n", outgoingtype, msgid); - printf(" => %s\n", path); - } - if (NEWSFEED == LOCAL) - { - char *end = strrchr(filename, '.'); - - if (end) - *end = '\0'; - strncpy(times, baseN(atol(filename + 2), 48, 6), sizeof times); - if (end) - *end = '.'; - hash = hash_value(fileglue("%s.%s", filename, board)); - sprintf(MSGID_BUF, "%s$%s@%s", times, hash, MYADDR); - } - else - { - strncpy(MSGID_BUF, msgid, sizeof MSGID_BUF); - } - sover->msgid = MSGID; - if (mtime == -1) - { - static char BODY_BUF[MAXBUFLEN]; - - strncpy(BODY_BUF, fileglue("%s\r\n", subject), sizeof BODY_BUF); - BODY = BODY_BUF; - sprintf(SUBJECT_BUF, "cmsg cancel <%s>", MSGID); - SUBJECT = SUBJECT_BUF; - sprintf(CONTROL_BUF, "cancel <%s>", MSGID); - CONTROL = CONTROL_BUF; - strncpy(MSGID_BUF, fileglue("%d.%s", getpid(), MSGID_BUF), sizeof MSGID_BUF); - sprintf(DATE_BUF, "%s", ascii_date(time(NULL))); - DATE = DATE_BUF; - sover->subject = SUBJECT; - sover->control = CONTROL; + char *board, *filename, *group, *from, *subject, *outgoingtype, + *msgid, *path; + char *buffer, *bufferp; + FILE *ECHOMAIL, *FN; + char *hash; + char times[MAXBUFLEN]; + time_t mtime; + + board = sover->board; + filename = sover->filename; + group = sover->group; + mtime = sover->mtime; + from = sover->from; + subject = sover->subject; + outgoingtype = sover->outgoingtype; + msgid = sover->msgid; + path = sover->path; + if (Verbose) { + printf("<read_outgoing> %s:%s:%s\n", board, filename, group); + printf(" => %ld:%s\n", mtime, from); + printf(" => %s\n", subject); + printf(" => %s:%s\n", outgoingtype, msgid); + printf(" => %s\n", path); + } + if (NEWSFEED == LOCAL) { + char *end = strrchr(filename, '.'); + + if (end) + *end = '\0'; + strncpy(times, baseN(atol(filename + 2), 48, 6), sizeof times); + if (end) + *end = '.'; + hash = hash_value(fileglue("%s.%s", filename, board)); + sprintf(MSGID_BUF, "%s$%s@%s", times, hash, MYADDR); + } else { + strncpy(MSGID_BUF, msgid, sizeof MSGID_BUF); + } sover->msgid = MSGID; - sover->date = DATE; - } - else - { - sover->control = CONTROL; - sover->date = DATE_BUF; - DATE = DATE_BUF; - *CONTROL = '\0'; - sprintf(DATE, "%s", ascii_date((mtime))); - if (NEWSFEED == LOCAL && !NoAction) - { - SITE = MYSITE; - PATH = MYBBSID; - GROUPS = group; + if (mtime == -1) { + static char BODY_BUF[MAXBUFLEN]; + + strncpy(BODY_BUF, fileglue("%s\r\n", subject), sizeof BODY_BUF); + BODY = BODY_BUF; + sprintf(SUBJECT_BUF, "cmsg cancel <%s>", MSGID); + SUBJECT = SUBJECT_BUF; + sprintf(CONTROL_BUF, "cancel <%s>", MSGID); + CONTROL = CONTROL_BUF; + strncpy(MSGID_BUF, fileglue("%d.%s", getpid(), MSGID_BUF), sizeof MSGID_BUF); + sprintf(DATE_BUF, "%s", ascii_date(time(NULL))); + DATE = DATE_BUF; + sover->subject = SUBJECT; + sover->control = CONTROL; + sover->msgid = MSGID; + sover->date = DATE; + } else { + sover->control = CONTROL; + sover->date = DATE_BUF; + DATE = DATE_BUF; + *CONTROL = '\0'; + sprintf(DATE, "%s", ascii_date((mtime))); + if (NEWSFEED == LOCAL && !NoAction) { + SITE = MYSITE; + PATH = MYBBSID; + GROUPS = group; #ifndef MapleBBS - echomaillog(); + echomaillog(); #endif + } + BODY = ""; + FD = open(fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename), O_RDONLY); + if (FD < 0) { + if (Verbose) + printf(" !! can't open %s/boards/%c/%s/%s\n", BBSHOME, board[0], board, filename); + else + fprintf(stderr, "can't open %s/boards/%c/%s/%s\n", BBSHOME, board[0], board, filename); + return -1; + } + FD_SIZE = filesize(fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename)); + if (FD_BUF == NULL) { + FD_BUF = (char *)mymalloc(FD_SIZE + 1 + strlen(COMMENT)); + } else { + FD_BUF = (char *)myrealloc(FD_BUF, FD_SIZE + 1 + strlen(COMMENT)); + } + FD_END = FD_BUF + FD_SIZE; + *FD_END = '\0'; + read(FD, FD_BUF, FD_SIZE); + sprintf(FD_END, "%s", COMMENT); + FD_SIZE += strlen(COMMENT); + FD_END += strlen(COMMENT); + if (Verbose) { + printf("<read in> %s/boards/%c/%s/%s\n", BBSHOME, board[0], board, filename); + } + *ORGANIZATION = '\0'; + *NEWSCONTROL = '\0'; + *NEWSAPPROVED = '\0'; + *NNTPHOST_BUF = '\0'; + NNTPHOST = NULL; + + for (buffer = FD_BUF, bufferp = strchr(buffer, '\n'); + buffer && *buffer; bufferp = strchr(buffer, '\n')) { + if (bufferp) + *bufferp = '\0'; + if (*buffer == '\0') { + break; + } + /* printf("get buffer %s\n", buffer); */ + if (NEWSFEED == REMOTE) { + if (strncmp(buffer, "Date: ", 11) == 0) { + strcpy(DATE_BUF, buffer + 11); + DATE = DATE_BUF; + } else if (strncmp(buffer, "發信站: ", 8) == 0) { + char *m, *n; + + m = strchr(buffer, '('); + n = strrchr(buffer, ')'); + if (m && n) { + strncpy(DATE_BUF, m + 1, n - m - 1); + DATE_BUF[n - m - 1] = '\0'; + DATE = DATE_BUF; + strncpy(ORGANIZATION, buffer + 8, m - 8 - buffer - 1); + ORGANIZATION[m - 8 - buffer - 1] = '\0'; + } + } else if (strncmp(buffer, "Control: ", 9) == 0) { + strcpy(NEWSCONTROL, buffer + 9); + } else if (strncmp(buffer, "Approved: ", 10) == 0) { + strcpy(NEWSAPPROVED, buffer + 10); + } else if (strncmp(buffer, "Origin: ", 8) == 0) { + strcpy(NNTPHOST_BUF, buffer + 8); + NNTPHOST = NNTPHOST_BUF; + } + } + if (bufferp) { + *bufferp = '\n'; + buffer = bufferp + 1; + } else { + break; + } + } + if (bufferp) { + BODY = bufferp + 1; + } else + BODY = ""; + if (bufferp) + for (buffer = bufferp + 1, bufferp = strchr(buffer, '\n'); + buffer && *buffer; bufferp = strchr(buffer, '\n')) { + if (bufferp) + *bufferp = '\0'; + /* printf("get line (%s)\n", buffer); */ + /* + * if( strcmp(buffer,".")==0 ) { buffer[1]='.'; + * buffer[2]='\0'; } + */ + if (NEWSFEED == REMOTE && + strncmp(NEWSCONTROL, "cancel", 5) == 0 && + strncmp(buffer, "------------------", 18) == 0) { + break; + } else if (strncmp(buffer, "◆ From: ", 9) == 0) { + strcpy(NNTPHOST_BUF, buffer + 9); + NNTPHOST = NNTPHOST_BUF; + } + /* $BODY[ @BODY ] = "$_\r\n"; */ + if (bufferp) { + *bufferp = '\n'; + buffer = bufferp + 1; + } else { + break; + } + } + /* # fprintf("BODY @BODY\n"; */ + close(FD); } - BODY = ""; - FD = open(fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename), O_RDONLY); - if (FD < 0) - { - if (Verbose) - printf(" !! can't open %s/boards/%c/%s/%s\n", BBSHOME, board[0], board, filename); - else - fprintf(stderr, "can't open %s/boards/%c/%s/%s\n", BBSHOME, board[0], board, filename); - return -1; - } - - FD_SIZE = filesize(fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename)); - if (FD_BUF == NULL) - { - FD_BUF = (char *) mymalloc(FD_SIZE + 1 + strlen(COMMENT)); - } - else - { - FD_BUF = (char *) myrealloc(FD_BUF, FD_SIZE + 1 + strlen(COMMENT)); - } - FD_END = FD_BUF + FD_SIZE; - *FD_END = '\0'; - read(FD, FD_BUF, FD_SIZE); - sprintf(FD_END, "%s", COMMENT); - FD_SIZE += strlen(COMMENT); - FD_END += strlen(COMMENT); - if (Verbose) - { - printf("<read in> %s/boards/%c/%s/%s\n", BBSHOME, board[0], board, filename); - } - - *ORGANIZATION = '\0'; - *NEWSCONTROL = '\0'; - *NEWSAPPROVED = '\0'; - *NNTPHOST_BUF = '\0'; - NNTPHOST = NULL; - - for (buffer = FD_BUF, bufferp = strchr(buffer, '\n'); - buffer && *buffer; bufferp = strchr(buffer, '\n')) - { - if (bufferp) - *bufferp = '\0'; - if (*buffer == '\0') - { - break; - } - /* printf("get buffer %s\n", buffer); */ - if (NEWSFEED == REMOTE) - { - if (strncmp(buffer, "Date: ", 11) == 0) - { - strcpy(DATE_BUF, buffer + 11); - DATE = DATE_BUF; - } - else if (strncmp(buffer, "發信站: ", 8) == 0) - { - char *m, *n; - - m = strchr(buffer, '('); - n = strrchr(buffer, ')'); - if (m && n) - { - strncpy(DATE_BUF, m + 1, n - m - 1); - DATE_BUF[n - m - 1] = '\0'; - DATE = DATE_BUF; - strncpy(ORGANIZATION, buffer + 8, m - 8 - buffer - 1); - ORGANIZATION[m - 8 - buffer - 1] = '\0'; - } - } - else if (strncmp(buffer, "Control: ", 9) == 0) - { - strcpy(NEWSCONTROL, buffer + 9); - } - else if (strncmp(buffer, "Approved: ", 10) == 0) - { - strcpy(NEWSAPPROVED, buffer + 10); - } - else if (strncmp(buffer, "Origin: ", 8) == 0) - { - strcpy(NNTPHOST_BUF, buffer + 8); - NNTPHOST = NNTPHOST_BUF; - } - } - if (bufferp) - { - *bufferp = '\n'; - buffer = bufferp + 1; - } - else - { - break; - } - } - if (bufferp) - { - BODY = bufferp + 1; - } - else - BODY = ""; - if (bufferp) - for (buffer = bufferp + 1, bufferp = strchr(buffer, '\n'); - buffer && *buffer; bufferp = strchr(buffer, '\n')) - { - if (bufferp) - *bufferp = '\0'; - /* printf("get line (%s)\n", buffer); */ - /* if( strcmp(buffer,".")==0 ) { buffer[1]='.'; buffer[2]='\0'; } */ - if (NEWSFEED == REMOTE && - strncmp(NEWSCONTROL, "cancel", 5) == 0 && - strncmp(buffer, "------------------", 18) == 0) - { - break; - } - else if (strncmp(buffer, "◆ From: ", 9) == 0) - { - strcpy(NNTPHOST_BUF, buffer + 9); - NNTPHOST = NNTPHOST_BUF; - } - /* $BODY[ @BODY ] = "$_\r\n"; */ - if (bufferp) - { - *bufferp = '\n'; - buffer = bufferp + 1; - } - else - { - break; - } - } - /* # fprintf("BODY @BODY\n"; */ - close(FD); - } - return 0; + return 0; } #ifdef TEST #endif openfeed(node) - nodelist_t *node; + nodelist_t *node; { - if (node->feedfp == NULL) - { - node->feedfp = fopen(fileglue("%s/%s.link", INNDHOME, node->node), "a"); - } + if (node->feedfp == NULL) { + node->feedfp = fopen(fileglue("%s/%s.link", INNDHOME, node->node), "a"); + } } queuefeed(node, textline) - nodelist_t *node; - char *textline; + nodelist_t *node; + char *textline; { - openfeed(node); - if (node->feedfp != NULL) - { - flock(fileno(node->feedfp), LOCK_EX); - fprintf(node->feedfp, "%s", textline); - fflush(node->feedfp); - flock(fileno(node->feedfp), LOCK_UN); - } + openfeed(node); + if (node->feedfp != NULL) { + flock(fileno(node->feedfp), LOCK_EX); + fprintf(node->feedfp, "%s", textline); + fflush(node->feedfp); + flock(fileno(node->feedfp), LOCK_UN); + } } post_article(node, site, sover, textline) - nodelist_t *node; - char *site; - soverview_t *sover; - char *textline; + nodelist_t *node; + char *site; + soverview_t *sover; + char *textline; { - int status; - char *filename = sover->filename; - char *msgid = sover->msgid; - char *board = sover->board; - char *bodyp, *body; - - if (Verbose) - fprintf(stdout, "<post_article> %s %s %s\n", site, filename, msgid); - if (NoAction && Verbose) - { - printf(" ==>%s\n", sover->path); - printf(" ==>%s:%s\n", sover->from, sover->group); - printf(" ==>%s:%s\n", sover->subject, sover->date); - body = BODY; - bodyp = strchr(body, '\n'); - if (bodyp) - *bodyp = '\0'; - printf(" ==>%s\n", body); - if (bodyp) - *bodyp = '\n'; - if (bodyp) - { - body = bodyp + 1; - bodyp = strchr(body, '\n'); - if (bodyp) - *bodyp = '\0'; - printf(" ==>%s\n", body); - if (bodyp) - *bodyp = '\n'; - } - } - if (NoAction) - return 1; - if (NEWSFEED == REMOTE) - { - fprintf(NNTPwfp, "Path: %s\r\n", sover->path); - fprintf(NNTPwfp, "From: %s\r\n", sover->from); - fprintf(NNTPwfp, "Newsgroups: %s\r\n", sover->group); - fprintf(NNTPwfp, "Subject: %s\r\n", sover->subject); - /* # fprintf( NNTPwfp,"Post with subject ($subject)\n"); */ - fprintf(NNTPwfp, "Date: %s\r\n", sover->date); - if (*ORGANIZATION) - fprintf(NNTPwfp, "Organization: %s\r\n", ORGANIZATION); - fprintf(NNTPwfp, "Message-ID: <%s>\r\n", sover->msgid); - if (*NEWSCONTROL) - fprintf(NNTPwfp, "Control: %s\r\n", NEWSCONTROL); - if (*NEWSAPPROVED) - fprintf(NNTPwfp, "Approved: %s\r\n", NEWSAPPROVED); - } - else - { - fprintf(NNTPwfp, "Path: %s\r\n", MYBBSID); - fprintf(NNTPwfp, "From: %s\r\n", sover->from); - fprintf(NNTPwfp, "Newsgroups: %s\r\n", sover->group); - fprintf(NNTPwfp, "Subject: %s\r\n", sover->subject); - fprintf(NNTPwfp, "Date: %s\r\n", sover->date); - fprintf(NNTPwfp, "Organization: %s\r\n", MYSITE); - fprintf(NNTPwfp, "Message-ID: <%s>\r\n", sover->msgid); - fprintf(NNTPwfp, "Mime-Version: 1.0\r\n"); - fprintf(NNTPwfp, "Content-Type: text/plain; charset=Big5\r\n"); - fprintf(NNTPwfp, "Content-Transfer-Encoding: 8bit\r\n"); - fprintf(NNTPwfp, "X-Filename: %s/%s\r\n", sover->board, sover->filename); - } - if (NNTPHOST && *NNTPHOST && USEIHAVE) - fprintf(NNTPwfp, "NNTP-Posting-Host: %s\r\n", NNTPHOST); - else if (NNTPHOST && *NNTPHOST) - fprintf(NNTPwfp, "X-Auth-From: %s\r\n", NNTPHOST); - if (*CONTROL) - { - fprintf(NNTPwfp, "Control: %s\r\n", CONTROL); - } - fputs("\r\n", NNTPwfp); - for (body = BODY, bodyp = strchr(body, '\n'); - body && *body; bodyp = strchr(body, '\n')) - { - if (bodyp) - *bodyp = '\0'; - - fputs(body, NNTPwfp); - if (body[0] == '.' && body[1] == '\0') - fputs(".", NNTPwfp); - fputs("\r\n", NNTPwfp); - if (bodyp) - { - *bodyp = '\n'; - body = bodyp + 1; - } - else - { - break; - } - } - /* print "send out @BODY\n"; */ - status = tcpcommand("."); - /* 435 duplicated article 437 invalid header */ - - if (USEIHAVE) - { - if (status == 235) - { - if (NEWSFEED == LOCAL) - { - bbslog("Sendout <%s> from %s/%s\n", msgid, board, filename); - } - } - else if (status == 437 || status == 435) - { - bbslog("<bbslink> :Warn: %d %s <%s>\n", status, (char *) tcpmessage(), msgid); - if (Verbose) - printf(":Warn: %d %s <%s>\n", status, (char *) tcpmessage(), msgid); - return 0; - } - else - { - bbslog("<bbslink> :Err: %d %s of <%s>\n", status, (char *) tcpmessage(), msgid); - if (Verbose) - printf(":Err: %d %s of <%s>\n", status, (char *) tcpmessage(), msgid); - if (!strstr(tcpmessage(), "Article not posted")) - queuefeed(node, textline); - return 0; - } - } - else if (USEPOST) - { - if (status == 240) - { - bbslog("Sendout <%s> from %s/%s\n", msgid, board, filename); + int status; + char *filename = sover->filename; + char *msgid = sover->msgid; + char *board = sover->board; + char *bodyp, *body; + + if (Verbose) + fprintf(stdout, "<post_article> %s %s %s\n", site, filename, msgid); + if (NoAction && Verbose) { + printf(" ==>%s\n", sover->path); + printf(" ==>%s:%s\n", sover->from, sover->group); + printf(" ==>%s:%s\n", sover->subject, sover->date); + body = BODY; + bodyp = strchr(body, '\n'); + if (bodyp) + *bodyp = '\0'; + printf(" ==>%s\n", body); + if (bodyp) + *bodyp = '\n'; + if (bodyp) { + body = bodyp + 1; + bodyp = strchr(body, '\n'); + if (bodyp) + *bodyp = '\0'; + printf(" ==>%s\n", body); + if (bodyp) + *bodyp = '\n'; + } } - else if (status == 437 || status == 435) - { - bbslog("<bbslink> :Warn: %d %s <%s>\n", status, (char *) tcpmessage(), msgid); - if (Verbose) - printf(":Warn: %d %s <%s>\n", status, (char *) tcpmessage(), msgid); - return 0; + if (NoAction) + return 1; + if (NEWSFEED == REMOTE) { + fprintf(NNTPwfp, "Path: %s\r\n", sover->path); + fprintf(NNTPwfp, "From: %s\r\n", sover->from); + fprintf(NNTPwfp, "Newsgroups: %s\r\n", sover->group); + fprintf(NNTPwfp, "Subject: %s\r\n", sover->subject); + /* # fprintf( NNTPwfp,"Post with subject ($subject)\n"); */ + fprintf(NNTPwfp, "Date: %s\r\n", sover->date); + if (*ORGANIZATION) + fprintf(NNTPwfp, "Organization: %s\r\n", ORGANIZATION); + fprintf(NNTPwfp, "Message-ID: <%s>\r\n", sover->msgid); + if (*NEWSCONTROL) + fprintf(NNTPwfp, "Control: %s\r\n", NEWSCONTROL); + if (*NEWSAPPROVED) + fprintf(NNTPwfp, "Approved: %s\r\n", NEWSAPPROVED); + } else { + fprintf(NNTPwfp, "Path: %s\r\n", MYBBSID); + fprintf(NNTPwfp, "From: %s\r\n", sover->from); + fprintf(NNTPwfp, "Newsgroups: %s\r\n", sover->group); + fprintf(NNTPwfp, "Subject: %s\r\n", sover->subject); + fprintf(NNTPwfp, "Date: %s\r\n", sover->date); + fprintf(NNTPwfp, "Organization: %s\r\n", MYSITE); + fprintf(NNTPwfp, "Message-ID: <%s>\r\n", sover->msgid); + fprintf(NNTPwfp, "Mime-Version: 1.0\r\n"); + fprintf(NNTPwfp, "Content-Type: text/plain; charset=Big5\r\n"); + fprintf(NNTPwfp, "Content-Transfer-Encoding: 8bit\r\n"); + fprintf(NNTPwfp, "X-Filename: %s/%s\r\n", sover->board, sover->filename); } - else - { - bbslog("<bbslink> :Err: %d %s of <%s>\n", status, (char *) tcpmessage(), msgid); - if (!strstr(tcpmessage(), "Article not posted")) - queuefeed(node, textline); - return 0; + if (NNTPHOST && *NNTPHOST && USEIHAVE) + fprintf(NNTPwfp, "NNTP-Posting-Host: %s\r\n", NNTPHOST); + else if (NNTPHOST && *NNTPHOST) + fprintf(NNTPwfp, "X-Auth-From: %s\r\n", NNTPHOST); + if (*CONTROL) { + fprintf(NNTPwfp, "Control: %s\r\n", CONTROL); } - } - else - { - if (status == 250) - { - bbslog("<bbslink> DATA Sendout <%s> from %s/%s\n", msgid, board, filename); - if (Verbose) - printf("<DATA Sendout> <%s> from %s/%s\n", msgid, board, filename); + fputs("\r\n", NNTPwfp); + for (body = BODY, bodyp = strchr(body, '\n'); + body && *body; bodyp = strchr(body, '\n')) { + if (bodyp) + *bodyp = '\0'; + + fputs(body, NNTPwfp); + if (body[0] == '.' && body[1] == '\0') + fputs(".", NNTPwfp); + fputs("\r\n", NNTPwfp); + if (bodyp) { + *bodyp = '\n'; + body = bodyp + 1; + } else { + break; + } } - else - { - bbslog("<bbslink> :Err: %d %s of <%s>\n", status, (char *) tcpmessage(), msgid); - if (Verbose) - printf(":Err: %d %s of <%s>\n", status, (char *) tcpmessage(), msgid); - if (!strstr(tcpmessage(), "Article not posted")) - queuefeed(node, textline); - return 0; + /* print "send out @BODY\n"; */ + status = tcpcommand("."); + /* 435 duplicated article 437 invalid header */ + + if (USEIHAVE) { + if (status == 235) { + if (NEWSFEED == LOCAL) { + bbslog("Sendout <%s> from %s/%s\n", msgid, board, filename); + } + } else if (status == 437 || status == 435) { + bbslog("<bbslink> :Warn: %d %s <%s>\n", status, (char *)tcpmessage(), msgid); + if (Verbose) + printf(":Warn: %d %s <%s>\n", status, (char *)tcpmessage(), msgid); + return 0; + } else { + bbslog("<bbslink> :Err: %d %s of <%s>\n", status, (char *)tcpmessage(), msgid); + if (Verbose) + printf(":Err: %d %s of <%s>\n", status, (char *)tcpmessage(), msgid); + if (!strstr(tcpmessage(), "Article not posted")) + queuefeed(node, textline); + return 0; + } + } else if (USEPOST) { + if (status == 240) { + bbslog("Sendout <%s> from %s/%s\n", msgid, board, filename); + } else if (status == 437 || status == 435) { + bbslog("<bbslink> :Warn: %d %s <%s>\n", status, (char *)tcpmessage(), msgid); + if (Verbose) + printf(":Warn: %d %s <%s>\n", status, (char *)tcpmessage(), msgid); + return 0; + } else { + bbslog("<bbslink> :Err: %d %s of <%s>\n", status, (char *)tcpmessage(), msgid); + if (!strstr(tcpmessage(), "Article not posted")) + queuefeed(node, textline); + return 0; + } + } else { + if (status == 250) { + bbslog("<bbslink> DATA Sendout <%s> from %s/%s\n", msgid, board, filename); + if (Verbose) + printf("<DATA Sendout> <%s> from %s/%s\n", msgid, board, filename); + } else { + bbslog("<bbslink> :Err: %d %s of <%s>\n", status, (char *)tcpmessage(), msgid); + if (Verbose) + printf(":Err: %d %s of <%s>\n", status, (char *)tcpmessage(), msgid); + if (!strstr(tcpmessage(), "Article not posted")) + queuefeed(node, textline); + return 0; + } } - } - return 1; + return 1; } process_cancel(board, filename, userid, nickname, subject) - char *board, *filename, *userid, *nickname, *subject; + char *board, *filename, *userid, *nickname, *subject; { - time_t mtime; - soverview_t sover; - - if (!userid || !*userid) - { - return; - } - mtime = -1; - strncpy(FROM_BUF, fileglue("%s.bbs@%s (%s)", userid, MYADDR, nickname), sizeof FROM_BUF); - FROM = FROM_BUF; - sover.from = FROM; - sover.board = board; - sover.subject = subject; - PATH = MYBBSID; - sover.path = MYBBSID; - /* save_outgoing(&sover, filename, userid, poster, -1); */ - save_outgoing(&sover, filename, userid, userid, -1); + time_t mtime; + soverview_t sover; + + if (!userid || !*userid) { + return; + } + mtime = -1; + strncpy(FROM_BUF, fileglue("%s.bbs@%s (%s)", userid, MYADDR, nickname), sizeof FROM_BUF); + FROM = FROM_BUF; + sover.from = FROM; + sover.board = board; + sover.subject = subject; + PATH = MYBBSID; + sover.path = MYBBSID; + /* save_outgoing(&sover, filename, userid, poster, -1); */ + save_outgoing(&sover, filename, userid, userid, -1); } open_link(hostname, hostprot, hostport) - char *hostname, *hostprot, *hostport; + char *hostname, *hostprot, *hostport; { - USEIHAVE = 1; - USEPOST = 0; - USEDATA = 0; - FEEDTYPE = ' '; - if (Verbose) - printf("<OPEN_link> %s %s %s\n", hostname, hostprot, hostport); - if (strncasecmp(hostprot, "IHAVE", 5) != 0) - { - USEIHAVE = 0; - USEPOST = 1; - if (strncasecmp(hostprot, "POST", 4) == 0) - { - USEPOST = 1; - } - else if (strncasecmp(hostprot, "DATA", 4) == 0) - { - USEPOST = 0; - USEDATA = 1; - } - } - - FEEDTYPE = hostname[0]; - if (!USEDATA) - { - char *atsign; - - if (FEEDTYPE == '-' || FEEDTYPE == '+') - { - hostname = hostname + 1; - } - atsign = strchr(hostname, '@'); - if (atsign != NULL) - { - hostname = atsign + 1; - } - if (!NoAction) - { - if (Verbose) - printf("<inetclient> %s %s\n", hostname, hostport); - if ((NNTP = inetclient(hostname, hostport, "tcp")) < 0) - { - bbslog("<bbslink> :Err: server %s %s error: cant connect\n", hostname, hostport); - if (Verbose) - printf(":Err: server %s %s error: cant connect\n", hostname, hostport); - return 0; - /* exit( 0 ); */ - /* return; */ - } - NNTPrfp = fdopen(NNTP, "r"); - NNTPwfp = fdopen(NNTP, "w"); - fgets(NNTPbuffer, sizeof NNTPbuffer, NNTPrfp); - if (atoi(NNTPbuffer) != 200) - { - bbslog("<bbslink> :Err: server error: %s", NNTPbuffer); - if (Verbose) - printf(":Err: server error: %s", NNTPbuffer); - return 0; - /* exit( 0 ); */ - } - } - else - { - if (Verbose) - printf("<inetclient> %s %s\n", hostname, hostport); - } - } - else - { - if (!NoAction) - { - if (Verbose) - printf("<inetclient> localhost %s\n", hostport); - if ((NNTP = inetclient("localhost", hostport, "tcp")) < 0) - { - bbslog("<bbslink> :Err: server %s port %s error: cant connect\n", hostname, hostport); - if (Verbose) - printf(":Err: server error: cant connect"); - return 0; - /* exit( 0 ); */ - /* return; */ - } - NNTPrfp = fdopen(NNTP, "r"); - NNTPwfp = fdopen(NNTP, "w"); - fgets(NNTPbuffer, sizeof NNTPbuffer, NNTPrfp); - if (strncmp(NNTPbuffer, "220", 3) != 0) - { - bbslog("<bbslink> :Err: server error: %s", NNTPbuffer); - if (Verbose) - printf(":Err: server error: %s", NNTPbuffer); - return 0; - /* exit( 0 ); */ - } - if (strncmp(NNTPbuffer, "220-", 4) == 0) - { - fgets(NNTPbuffer, sizeof NNTPbuffer, NNTPrfp); - } + USEIHAVE = 1; + USEPOST = 0; + USEDATA = 0; + FEEDTYPE = ' '; + if (Verbose) + printf("<OPEN_link> %s %s %s\n", hostname, hostprot, hostport); + if (strncasecmp(hostprot, "IHAVE", 5) != 0) { + USEIHAVE = 0; + USEPOST = 1; + if (strncasecmp(hostprot, "POST", 4) == 0) { + USEPOST = 1; + } else if (strncasecmp(hostprot, "DATA", 4) == 0) { + USEPOST = 0; + USEDATA = 1; + } } - else - { - if (Verbose) - printf("<inetclient> %s %s\n", hostname, hostport); + FEEDTYPE = hostname[0]; + if (!USEDATA) { + char *atsign; + + if (FEEDTYPE == '-' || FEEDTYPE == '+') { + hostname = hostname + 1; + } + atsign = strchr(hostname, '@'); + if (atsign != NULL) { + hostname = atsign + 1; + } + if (!NoAction) { + if (Verbose) + printf("<inetclient> %s %s\n", hostname, hostport); + if ((NNTP = inetclient(hostname, hostport, "tcp")) < 0) { + bbslog("<bbslink> :Err: server %s %s error: cant connect\n", hostname, hostport); + if (Verbose) + printf(":Err: server %s %s error: cant connect\n", hostname, hostport); + return 0; + /* exit( 0 ); */ + /* return; */ + } + NNTPrfp = fdopen(NNTP, "r"); + NNTPwfp = fdopen(NNTP, "w"); + fgets(NNTPbuffer, sizeof NNTPbuffer, NNTPrfp); + if (atoi(NNTPbuffer) != 200) { + bbslog("<bbslink> :Err: server error: %s", NNTPbuffer); + if (Verbose) + printf(":Err: server error: %s", NNTPbuffer); + return 0; + /* exit( 0 ); */ + } + } else { + if (Verbose) + printf("<inetclient> %s %s\n", hostname, hostport); + } + } else { + if (!NoAction) { + if (Verbose) + printf("<inetclient> localhost %s\n", hostport); + if ((NNTP = inetclient("localhost", hostport, "tcp")) < 0) { + bbslog("<bbslink> :Err: server %s port %s error: cant connect\n", hostname, hostport); + if (Verbose) + printf(":Err: server error: cant connect"); + return 0; + /* exit( 0 ); */ + /* return; */ + } + NNTPrfp = fdopen(NNTP, "r"); + NNTPwfp = fdopen(NNTP, "w"); + fgets(NNTPbuffer, sizeof NNTPbuffer, NNTPrfp); + if (strncmp(NNTPbuffer, "220", 3) != 0) { + bbslog("<bbslink> :Err: server error: %s", NNTPbuffer); + if (Verbose) + printf(":Err: server error: %s", NNTPbuffer); + return 0; + /* exit( 0 ); */ + } + if (strncmp(NNTPbuffer, "220-", 4) == 0) { + fgets(NNTPbuffer, sizeof NNTPbuffer, NNTPrfp); + } + } else { + if (Verbose) + printf("<inetclient> %s %s\n", hostname, hostport); + } } - } - return 1; + return 1; } send_outgoing(node, site, hostname, sover, textline) - nodelist_t *node; - soverview_t *sover; - char *hostname, *site; - char *textline; + nodelist_t *node; + soverview_t *sover; + char *hostname, *site; + char *textline; { - int status; - char *board, *filepath, *msgid; - int returnstatus = 0; - - board = sover->board; - filepath = sover->filename; - msgid = sover->msgid; - - if (Verbose) - printf("<send_outgoing> %s:%s:%s:%s\n", site, board, filepath, msgid); - if (BODY != NULL && !NoAction) - { - if (USEIHAVE) - { -/* status = tcpcommand("IHAVE <%s>", msgid);*/ - char buf[80]; - sprintf(buf, "IHAVE <%s>", msgid); - status = tcpcommand(buf); - if (status == 335) - { - returnstatus = post_article(node, site, sover, textline); - } - else if (status == 435) - { - bbslog("<bbslink> :Warn: %d %s, IHAVE <%s>\n", status, (char *) tcpmessage(), msgid); - if (Verbose) - printf(":Warn: %d %s, IHAVE <%s>\n", status, (char *) tcpmessage(), msgid); - returnstatus = 0; - } - else - { - bbslog("<bbslink> :Err: %d %s, IHAVE <%s>\n", status, (char *) tcpmessage(), msgid); - if (Verbose) - printf(":Err: %d %s, IHAVE <%s>\n", status, (char *) tcpmessage(), msgid); - if (!strstr(tcpmessage(), "Article not posted")) - queuefeed(node, textline); - returnstatus = 0; - } - } - else if (USEPOST) - { - tcpcommand("MODE READER"); - status = tcpcommand("POST"); - if (status == 340) - { - returnstatus = post_article(node, site, sover, textline); - } - else if (status == 441) - { - bbslog("<bbslink> :Warn: %d %s, POST <%s>\n", status, (char *) tcpmessage(), msgid); - if (Verbose) - printf(":Warn: %d %s, POST <%s>\n", status, (char *) tcpmessage(), msgid); - returnstatus = 0; - } - else - { - bbslog("<bbslink> :Err: %d %s, POST <%s>\n", status, (char *) tcpmessage(), msgid); - if (Verbose) - printf(":Err: %d %s, POST <%s>\n", status, (char *) tcpmessage(), msgid); - if (!strstr(tcpmessage(), "Article not posted")) - queuefeed(node, textline); - returnstatus = 0; - } - } - else - { - tcpcommand("HELO"); - tcpcommand("MAIL FROM: bbs"); - tcpcommand("RCPT TO: %s", hostname); - status = tcpcommand("DATA"); - if (status == 354) - { - returnstatus = post_article(node, site, sover, textline); - } - else - { - bbslog("<bbslink> :Err: %d %s, DATA <%s>\n", status, (char *) tcpmessage(), msgid); - if (Verbose) - printf(":Err: %d %s, DATA <%s>\n", status, (char *) tcpmessage(), msgid); - if (!strstr(tcpmessage(), "Article not posted")) - queuefeed(node, textline); - returnstatus = 0; - } + int status; + char *board, *filepath, *msgid; + int returnstatus = 0; + + board = sover->board; + filepath = sover->filename; + msgid = sover->msgid; + + if (Verbose) + printf("<send_outgoing> %s:%s:%s:%s\n", site, board, filepath, msgid); + if (BODY != NULL && !NoAction) { + if (USEIHAVE) { + /* status = tcpcommand("IHAVE <%s>", msgid); */ + char buf[80]; + sprintf(buf, "IHAVE <%s>", msgid); + status = tcpcommand(buf); + if (status == 335) { + returnstatus = post_article(node, site, sover, textline); + } else if (status == 435) { + bbslog("<bbslink> :Warn: %d %s, IHAVE <%s>\n", status, (char *)tcpmessage(), msgid); + if (Verbose) + printf(":Warn: %d %s, IHAVE <%s>\n", status, (char *)tcpmessage(), msgid); + returnstatus = 0; + } else { + bbslog("<bbslink> :Err: %d %s, IHAVE <%s>\n", status, (char *)tcpmessage(), msgid); + if (Verbose) + printf(":Err: %d %s, IHAVE <%s>\n", status, (char *)tcpmessage(), msgid); + if (!strstr(tcpmessage(), "Article not posted")) + queuefeed(node, textline); + returnstatus = 0; + } + } else if (USEPOST) { + tcpcommand("MODE READER"); + status = tcpcommand("POST"); + if (status == 340) { + returnstatus = post_article(node, site, sover, textline); + } else if (status == 441) { + bbslog("<bbslink> :Warn: %d %s, POST <%s>\n", status, (char *)tcpmessage(), msgid); + if (Verbose) + printf(":Warn: %d %s, POST <%s>\n", status, (char *)tcpmessage(), msgid); + returnstatus = 0; + } else { + bbslog("<bbslink> :Err: %d %s, POST <%s>\n", status, (char *)tcpmessage(), msgid); + if (Verbose) + printf(":Err: %d %s, POST <%s>\n", status, (char *)tcpmessage(), msgid); + if (!strstr(tcpmessage(), "Article not posted")) + queuefeed(node, textline); + returnstatus = 0; + } + } else { + tcpcommand("HELO"); + tcpcommand("MAIL FROM: bbs"); + tcpcommand("RCPT TO: %s", hostname); + status = tcpcommand("DATA"); + if (status == 354) { + returnstatus = post_article(node, site, sover, textline); + } else { + bbslog("<bbslink> :Err: %d %s, DATA <%s>\n", status, (char *)tcpmessage(), msgid); + if (Verbose) + printf(":Err: %d %s, DATA <%s>\n", status, (char *)tcpmessage(), msgid); + if (!strstr(tcpmessage(), "Article not posted")) + queuefeed(node, textline); + returnstatus = 0; + } + } + } else if (NoAction) { + returnstatus = post_article(node, site, sover, textline); } - } - else if (NoAction) - { - returnstatus = post_article(node, site, sover, textline); - } - return returnstatus; + return returnstatus; } save_nntplink(node, overview) - nodelist_t *node; - char *overview; + nodelist_t *node; + char *overview; { - FILE *POSTS; - char buffer[1024]; - - openfeed(node); - POSTS = fopen(overview, "r"); - if (POSTS == NULL) - return 0; - openfeed(node); - /* if (node->feedfp == NULL) return 0; */ - flock(fileno(node->feedfp), LOCK_EX); - while (fgets(buffer, sizeof buffer, POSTS) != NULL) - { - fputs(buffer, node->feedfp); - fflush(node->feedfp); - } - flock(fileno(node->feedfp), LOCK_UN); - fclose(POSTS); - if (Verbose) - printf("<Unlinking> %s\n", overview); - if (!NoAction) - unlink(overview); - return 1; + FILE *POSTS; + char buffer[1024]; + + openfeed(node); + POSTS = fopen(overview, "r"); + if (POSTS == NULL) + return 0; + openfeed(node); + /* if (node->feedfp == NULL) return 0; */ + flock(fileno(node->feedfp), LOCK_EX); + while (fgets(buffer, sizeof buffer, POSTS) != NULL) { + fputs(buffer, node->feedfp); + fflush(node->feedfp); + } + flock(fileno(node->feedfp), LOCK_UN); + fclose(POSTS); + if (Verbose) + printf("<Unlinking> %s\n", overview); + if (!NoAction) + unlink(overview); + return 1; } -char * +char * get_tmpfile(tmpfile) - char *tmpfile; + char *tmpfile; { - FILE *FN; - static char result[256]; - - FN = fopen(tmpfile, "r"); - fgets(result, sizeof result, FN); - fclose(FN); - unlink(tmpfile); - return (result); + FILE *FN; + static char result[256]; + + FN = fopen(tmpfile, "r"); + fgets(result, sizeof result, FN); + fclose(FN); + unlink(tmpfile); + return (result); } /* cancel moderating posts */ cancel_outgoing(board, filename, from, subject) - char *board, *filename, *from, *subject; + char *board, *filename, *from, *subject; { - char *base, filepath[MAXPATHLEN]; - FILE *FN; - char *result; - char TMPFILE[MAXPATHLEN]; - - if (Verbose) - { - printf("<cancel_outgoing> %s %s %s %s\n", board, filename, from, subject); - } - - sprintf(TMPFILE, "/tmp/cancel_outgoing.%d.%d", getuid(), getpid()); - - bbslog("<cancel_outgoing> Try to move moderated post from %s to deleted\n", board); - if (Verbose) - printf("Try to move moderated post from %s to deleted\n", board); - FN = popen(fileglue("%s/bbspost post %s/boards/d/deleted > %s", - INNDHOME, BBSHOME, TMPFILE), "w"); - if (FN == NULL) - { - bbslog("<cancel_outgoing> can't run %s/bbspost\n", INNDHOME); - if (Verbose) - printf("<cancel_outgoing> can't run %s/bbspost\n", INNDHOME); - return 0; - } - fprintf(FN, "%s\n", from); - fprintf(FN, "%s\n", subject); - fprintf(FN, "發信人: %s, 信區: %s\n", from, board); - fprintf(FN, "標 題: %s\n", subject); - fprintf(FN, "發信站: %s (%s)\n", MYSITE, DATE); - fprintf(FN, "轉信站: %s\n", MYBBSID); - fputs("\n", FN); - fputs(BODY, FN); - pclose(FN); - result = (char *) get_tmpfile(TMPFILE); - if (strncmp(result, "post to ", 8) == 0) - { - /* try to remove it */ - strncpy(filepath, fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename), sizeof filepath); - if (isfile(filepath)) - { - Rename(filepath, fileglue("%s.cancel", filepath)); + char *base, filepath[MAXPATHLEN]; + FILE *FN; + char *result; + char TMPFILE[MAXPATHLEN]; + + if (Verbose) { + printf("<cancel_outgoing> %s %s %s %s\n", board, filename, from, subject); } - FN = fopen(filepath, "w"); + sprintf(TMPFILE, "/tmp/cancel_outgoing.%d.%d", getuid(), getpid()); + bbslog("<cancel_outgoing> Try to move moderated post from %s to deleted\n", board); + if (Verbose) + printf("Try to move moderated post from %s to deleted\n", board); + FN = popen(fileglue("%s/bbspost post %s/boards/d/deleted > %s", + INNDHOME, BBSHOME, TMPFILE), "w"); + if (FN == NULL) { + bbslog("<cancel_outgoing> can't run %s/bbspost\n", INNDHOME); + if (Verbose) + printf("<cancel_outgoing> can't run %s/bbspost\n", INNDHOME); + return 0; + } + fprintf(FN, "%s\n", from); + fprintf(FN, "%s\n", subject); fprintf(FN, "發信人: %s, 信區: %s\n", from, board); - fprintf(FN, "標 題: <article cancelled and mailed to the moderator\n"); + fprintf(FN, "標 題: %s\n", subject); fprintf(FN, "發信站: %s (%s)\n", MYSITE, DATE); fprintf(FN, "轉信站: %s\n", MYBBSID); - fprintf(FN, "\n"); fputs("\n", FN); - fprintf(FN, "你的文章 \"%s\" 已經送往審核中. 請等待回覆.\n", subject); - fputs("\n", FN); - fputs("Your post has been sent to the moderator and move\n", FN); - fputs("into the deleted board. If the post accepted by the moderator,\n", FN); - fputs("it will be posted in this board again. Please wait.\n", FN); - - } - else - { - bbslog("%s", result); - } - - bbslog("%s/bbspost cancel %s %s %s moderate\n", INNDHOME, BBSHOME, board, filename); - if (Verbose) - printf("%s/bbspost cancel %s %s %s moderate\n", INNDHOME, BBSHOME, board, filename); - system(fileglue("%s/bbspost cancel %s %s %s moderate", - INNDHOME, BBSHOME, board, filename)); - return 1; + fputs(BODY, FN); + pclose(FN); + result = (char *)get_tmpfile(TMPFILE); + if (strncmp(result, "post to ", 8) == 0) { + /* try to remove it */ + strncpy(filepath, fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename), sizeof filepath); + if (isfile(filepath)) { + Rename(filepath, fileglue("%s.cancel", filepath)); + } + FN = fopen(filepath, "w"); + + fprintf(FN, "發信人: %s, 信區: %s\n", from, board); + fprintf(FN, "標 題: <article cancelled and mailed to the moderator\n"); + fprintf(FN, "發信站: %s (%s)\n", MYSITE, DATE); + fprintf(FN, "轉信站: %s\n", MYBBSID); + fprintf(FN, "\n"); + fputs("\n", FN); + fprintf(FN, "你的文章 \"%s\" 已經送往審核中. 請等待回覆.\n", subject); + fputs("\n", FN); + fputs("Your post has been sent to the moderator and move\n", FN); + fputs("into the deleted board. If the post accepted by the moderator,\n", FN); + fputs("it will be posted in this board again. Please wait.\n", FN); + + } else { + bbslog("%s", result); + } + + bbslog("%s/bbspost cancel %s %s %s moderate\n", INNDHOME, BBSHOME, board, filename); + if (Verbose) + printf("%s/bbspost cancel %s %s %s moderate\n", INNDHOME, BBSHOME, board, filename); + system(fileglue("%s/bbspost cancel %s %s %s moderate", + INNDHOME, BBSHOME, board, filename)); + return 1; } /* @@ -1361,662 +1184,599 @@ cancel_outgoing(board, filename, from, subject) * cancel_outgoing */ send_nntplink(node, site, hostname, hostprot, hostport, overview, nlcount) - nodelist_t *node; - char *site, *hostname, *hostprot, *hostport, *overview; - int nlcount; + nodelist_t *node; + char *site, *hostname, *hostprot, *hostport, *overview; + int nlcount; { - FILE *POSTS; - char textline[1024]; - char baktextline[1024]; - char *filepath; - int status; - - if (Verbose) - { - printf("<send nntplink> %s %s %s %s\n", site, hostname, hostprot, hostport); - printf(" ==> %s\n", overview); - } - if (!open_link(hostname, hostprot, hostport)) - { - save_nntplink(node, overview); - return 0; - } - POSTS = fopen(overview, "r"); - if (POSTS == NULL) - { - if (Verbose) - printf("open %s failed\n", overview); - return 0; - } - while (fgets(textline, sizeof textline, POSTS) != NULL) - { - char *linebreak = strchr(textline, '\n'); - char *ptr; - char *board, *filename, *subject, *group, *mtime, *from; - char *outgoingtype; - char *msgid, *path; - soverview_t soverview; - - strcpy(baktextline, textline); - if (linebreak) - *linebreak = '\0'; - - board = "", filename = "", mtime = "", group = "", from = "", subject = ""; - outgoingtype = "", msgid = "", path = ""; - /* get board field */ - board = textline; - ptr = strchr(textline, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* filename field */ - filename = ptr; - - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - - *ptr++ = '\0'; - - /* group field */ - group = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* mtime field */ - mtime = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* from field */ - from = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* subject */ - subject = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - goto try_read_outgoing; - *ptr++ = '\0'; - - /* outgoing type field */ - outgoingtype = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - goto try_read_outgoing; - *ptr++ = '\0'; - - /* msgid */ - msgid = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - goto try_read_outgoing; - *ptr++ = '\0'; - - /* path */ - path = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - goto try_read_outgoing; + FILE *POSTS; + char textline[1024]; + char baktextline[1024]; + char *filepath; + int status; + + if (Verbose) { + printf("<send nntplink> %s %s %s %s\n", site, hostname, hostprot, hostport); + printf(" ==> %s\n", overview); + } + if (!open_link(hostname, hostprot, hostport)) { + save_nntplink(node, overview); + return 0; + } + POSTS = fopen(overview, "r"); + if (POSTS == NULL) { + if (Verbose) + printf("open %s failed\n", overview); + return 0; + } + while (fgets(textline, sizeof textline, POSTS) != NULL) { + char *linebreak = strchr(textline, '\n'); + char *ptr; + char *board, *filename, *subject, *group, *mtime, *from; + char *outgoingtype; + char *msgid, *path; + soverview_t soverview; + + strcpy(baktextline, textline); + if (linebreak) + *linebreak = '\0'; + + board = "", filename = "", mtime = "", group = "", from = "", subject = ""; + outgoingtype = "", msgid = "", path = ""; + /* get board field */ + board = textline; + ptr = strchr(textline, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* filename field */ + filename = ptr; + + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + + *ptr++ = '\0'; + + /* group field */ + group = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* mtime field */ + mtime = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* from field */ + from = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* subject */ + subject = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + goto try_read_outgoing; + *ptr++ = '\0'; + + /* outgoing type field */ + outgoingtype = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + goto try_read_outgoing; + *ptr++ = '\0'; + + /* msgid */ + msgid = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + goto try_read_outgoing; + *ptr++ = '\0'; + + /* path */ + path = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + goto try_read_outgoing; try_read_outgoing: - NEWSFEED = LOCAL; - if (outgoingtype && msgid && path && *outgoingtype && *msgid && *path) - { - char *left, *right; - - NEWSFEED = REMOTE; - left = strchr(msgid, '<'); - right = strrchr(msgid, '>'); - if (left) - msgid = left + 1; - if (right) - *right = '\0'; + NEWSFEED = LOCAL; + if (outgoingtype && msgid && path && *outgoingtype && *msgid && *path) { + char *left, *right; + + NEWSFEED = REMOTE; + left = strchr(msgid, '<'); + right = strrchr(msgid, '>'); + if (left) + msgid = left + 1; + if (right) + *right = '\0'; + } + soverview.board = board; + soverview.filename = filename; + soverview.group = group; + soverview.mtime = atol(mtime); + soverview.from = from; + str_decode_M3(subject); + soverview.subject = subject; + soverview.outgoingtype = outgoingtype; + soverview.msgid = msgid; + soverview.path = path; + if (read_outgoing(&soverview) == 0) { + int sendresult = send_outgoing(node, site, hostname, &soverview, baktextline); + int sendfailed = 1 - sendresult; + + if (NEWSFEED == REMOTE) { + BBSLINK_STAT[nlcount].remotesendout += sendresult; + BBSLINK_STAT[nlcount].remotefailed += sendfailed; + } else { + BBSLINK_STAT[nlcount].localsendout += sendresult; + BBSLINK_STAT[nlcount].localfailed += sendfailed; + } + if (node->feedtype == '-') { + if (!NoAction && sendresult) + cancel_outgoing(board, filename, from, subject); + } + } } - soverview.board = board; - soverview.filename = filename; - soverview.group = group; - soverview.mtime = atol(mtime); - soverview.from = from; - str_decode_M3(subject); - soverview.subject = subject; - soverview.outgoingtype = outgoingtype; - soverview.msgid = msgid; - soverview.path = path; - if (read_outgoing(&soverview) == 0) - { - int sendresult = send_outgoing(node, site, hostname, &soverview, baktextline); - int sendfailed = 1 - sendresult; - - if (NEWSFEED == REMOTE) - { - BBSLINK_STAT[nlcount].remotesendout += sendresult; - BBSLINK_STAT[nlcount].remotefailed += sendfailed; - } - else - { - BBSLINK_STAT[nlcount].localsendout += sendresult; - BBSLINK_STAT[nlcount].localfailed += sendfailed; - } - if (node->feedtype == '-') - { - if (!NoAction && sendresult) - cancel_outgoing(board, filename, from, subject); - } - } - } - fclose(POSTS); - close_link(); - if (Verbose) - printf("<Unlinking> %s\n", overview); - if (!NoAction) - unlink(overview); + fclose(POSTS); + close_link(); + if (Verbose) + printf("<Unlinking> %s\n", overview); + if (!NoAction) + unlink(overview); } close_link() { - int status; - - if (Verbose) - printf("<close_link>\n"); - if (NoAction) - return; - status = tcpcommand("QUIT"); - if (status != 205 && status != 221) - { - bbslog("<bbslink> :Err: Cannot quit message '%d %s'\n", status, (char *) tcpmessage()); + int status; + if (Verbose) - printf(":Err: Cannot quit message '%d %s'\n", status, (char *) tcpmessage()); - } - fclose(NNTPwfp); - fclose(NNTPrfp); - close(NNTP); + printf("<close_link>\n"); + if (NoAction) + return; + status = tcpcommand("QUIT"); + if (status != 205 && status != 221) { + bbslog("<bbslink> :Err: Cannot quit message '%d %s'\n", status, (char *)tcpmessage()); + if (Verbose) + printf(":Err: Cannot quit message '%d %s'\n", status, (char *)tcpmessage()); + } + fclose(NNTPwfp); + fclose(NNTPrfp); + close(NNTP); } /* * send_article() send_nntplink() read_outgoing() - * + * */ send_article() { - char *site, *addr, *protocol, *port, *op; - char *nntphost; - int nlcount; - - chdir(INNDHOME); - - for (nlcount = 0; nlcount < NLCOUNT; nlcount++) - { - nodelist_t *node; - char linkfile[MAXPATHLEN]; - char sendfile[MAXPATHLEN]; - char feedfile[MAXPATHLEN]; - char feedingfile[MAXPATHLEN]; - char protocol[MAXBUFLEN], port[MAXBUFLEN]; - - node = NODELIST + nlcount; - site = node->node; - nntphost = node->host; - op = node->protocol; - - if (DefaultFeedSite && *DefaultFeedSite) - { - if (strcmp(node->node, DefaultFeedSite) != 0) - continue; + char *site, *addr, *protocol, *port, *op; + char *nntphost; + int nlcount; + + chdir(INNDHOME); + + for (nlcount = 0; nlcount < NLCOUNT; nlcount++) { + nodelist_t *node; + char linkfile[MAXPATHLEN]; + char sendfile[MAXPATHLEN]; + char feedfile[MAXPATHLEN]; + char feedingfile[MAXPATHLEN]; + char protocol[MAXBUFLEN], port[MAXBUFLEN]; + + node = NODELIST + nlcount; + site = node->node; + nntphost = node->host; + op = node->protocol; + + if (DefaultFeedSite && *DefaultFeedSite) { + if (strcmp(node->node, DefaultFeedSite) != 0) + continue; + } + if (op && (strncasecmp(op, "ihave", 5) == 0 || + strncasecmp(op, "post", 4) == 0 || + strncasecmp(op, "data", 4) == 0)) { + char *left, *right; + + left = strchr(op, '('), right = strrchr(op, ')'); + if (left && right) { + *left = '\0'; + *right = '\0'; + strncpy(protocol, op, sizeof protocol); + strncpy(port, left + 1, sizeof port); + *left = '('; + *right = ')'; + } else { + strncpy(protocol, op, sizeof protocol); + strncpy(port, "nntp", sizeof port); + } + } else { + strcpy(protocol, "IHAVE"); + strcpy(port, "nntp"); + } + sprintf(linkfile, "%s.link", site); + sprintf(sendfile, "%s.sending", site); + sprintf(feedfile, "%s.feed", site); + sprintf(feedingfile, "%s.feeding", site); + if (isfile(sendfile) && !iszerofile(sendfile)) { + if (bbslink_get_lock(sendfile)) { + send_nntplink(node, site, nntphost, protocol, port, sendfile, nlcount); + bbslink_un_lock(sendfile); + } + } + if (isfile(linkfile) && !iszerofile(linkfile)) { + if (!NoAction) { + if (bbslink_get_lock(sendfile) && bbslink_get_lock(linkfile) && + bbslink_get_lock(feedingfile)) { + if (isfile(sendfile) && !iszerofile(sendfile)) { + save_nntplink(node, sendfile); + } + if (node->feedfp) { + fclose(node->feedfp); + node->feedfp = NULL; + } + Rename(linkfile, sendfile); + send_nntplink(node, site, nntphost, protocol, port, sendfile, nlcount); + bbslink_un_lock(linkfile); + bbslink_un_lock(sendfile); + bbslink_un_lock(feedingfile); + } + } else { + send_nntplink(node, site, nntphost, protocol, port, linkfile, nlcount); + } + } + if (isfile(feedingfile) && !iszerofile(feedingfile)) { + if (bbslink_get_lock(feedingfile)) { + send_nntplink(node, site, nntphost, protocol, port, feedingfile, nlcount); + bbslink_un_lock(feedingfile); + } + } + if (isfile(feedfile) && !iszerofile(feedfile)) { + if (!NoAction) { + if (bbslink_get_lock(feedfile) && bbslink_get_lock(feedingfile)) { + if (isfile(feedingfile) && !iszerofile(feedingfile)) { + save_nntplink(node, feedingfile); + if (node->feedfp) { + fclose(node->feedfp); + node->feedfp = NULL; + } + } + Rename(feedfile, feedingfile); + system(fileglue("%s/ctlinnbbsd reload > /dev/null", INNDHOME)); + send_nntplink(node, site, nntphost, protocol, port, feedingfile, nlcount); + bbslink_un_lock(feedfile); + bbslink_un_lock(feedingfile); + } + } else { + send_nntplink(node, site, nntphost, protocol, port, feedfile, nlcount); + } + } } - - if (op && (strncasecmp(op, "ihave", 5) == 0 || - strncasecmp(op, "post", 4) == 0 || - strncasecmp(op, "data", 4) == 0)) - { - char *left, *right; - - left = strchr(op, '('), right = strrchr(op, ')'); - if (left && right) - { - *left = '\0'; - *right = '\0'; - strncpy(protocol, op, sizeof protocol); - strncpy(port, left + 1, sizeof port); - *left = '('; - *right = ')'; - } - else - { - strncpy(protocol, op, sizeof protocol); - strncpy(port, "nntp", sizeof port); - } - } - else - { - strcpy(protocol, "IHAVE"); - strcpy(port, "nntp"); - } - sprintf(linkfile, "%s.link", site); - sprintf(sendfile, "%s.sending", site); - sprintf(feedfile, "%s.feed", site); - sprintf(feedingfile, "%s.feeding", site); - if (isfile(sendfile) && !iszerofile(sendfile)) - { - if (bbslink_get_lock(sendfile)) - { - send_nntplink(node, site, nntphost, protocol, port, sendfile, nlcount); - bbslink_un_lock(sendfile); - } - } - if (isfile(linkfile) && !iszerofile(linkfile)) - { - if (!NoAction) - { - if (bbslink_get_lock(sendfile) && bbslink_get_lock(linkfile) && - bbslink_get_lock(feedingfile)) - { - if (isfile(sendfile) && !iszerofile(sendfile)) - { - save_nntplink(node, sendfile); - } - if (node->feedfp) - { - fclose(node->feedfp); - node->feedfp = NULL; - } - Rename(linkfile, sendfile); - send_nntplink(node, site, nntphost, protocol, port, sendfile, nlcount); - bbslink_un_lock(linkfile); - bbslink_un_lock(sendfile); - bbslink_un_lock(feedingfile); - } - } - else - { - send_nntplink(node, site, nntphost, protocol, port, linkfile, nlcount); - } - } - if (isfile(feedingfile) && !iszerofile(feedingfile)) - { - if (bbslink_get_lock(feedingfile)) - { - send_nntplink(node, site, nntphost, protocol, port, feedingfile, nlcount); - bbslink_un_lock(feedingfile); - } - } - if (isfile(feedfile) && !iszerofile(feedfile)) - { - if (!NoAction) - { - if (bbslink_get_lock(feedfile) && bbslink_get_lock(feedingfile)) - { - if (isfile(feedingfile) && !iszerofile(feedingfile)) - { - save_nntplink(node, feedingfile); - if (node->feedfp) - { - fclose(node->feedfp); - node->feedfp = NULL; - } - } - Rename(feedfile, feedingfile); - system(fileglue("%s/ctlinnbbsd reload > /dev/null", INNDHOME)); - send_nntplink(node, site, nntphost, protocol, port, feedingfile, nlcount); - bbslink_un_lock(feedfile); - bbslink_un_lock(feedingfile); - } - } - else - { - send_nntplink(node, site, nntphost, protocol, port, feedfile, nlcount); - } - } - } } /* bntplink() bbspost() process_article() process_cancel() send_article() */ show_usage(argv) - char *argv; + char *argv; { - fprintf(stderr, "%s initialization failed or improper options !!\n", argv); - fprintf(stderr, "Usage: %s [options] bbs_home\n", argv); - fprintf(stderr, " -v (show transmission status)\n"); - fprintf(stderr, " -n (dont send out articles and leave queue untouched)\n"); - fprintf(stderr, " -s site (only process articles sent to site)\n"); - fprintf(stderr, " -V (visit only: bbspost visit)\n"); - fprintf(stderr, " -N (no visit, and only process batch queue)\n"); - fprintf(stderr, " -k (kill the former bbslink process before started)\n\n"); - fprintf(stderr, "本程式要正常執行必須將以下檔案置於 %s/innd 下:\n", BBSHOME); - fprintf(stderr, "bbsname.bbs 設定貴站的 BBS ID (請儘量簡短)\n"); - fprintf(stderr, "nodelist.bbs 設定網路各 BBS 站的 ID, Address 和 fullname\n"); - fprintf(stderr, "newsfeeds.bbs 設定網路信件的 newsgroup board nodelist ...\n"); + fprintf(stderr, "%s initialization failed or improper options !!\n", argv); + fprintf(stderr, "Usage: %s [options] bbs_home\n", argv); + fprintf(stderr, " -v (show transmission status)\n"); + fprintf(stderr, " -n (dont send out articles and leave queue untouched)\n"); + fprintf(stderr, " -s site (only process articles sent to site)\n"); + fprintf(stderr, " -V (visit only: bbspost visit)\n"); + fprintf(stderr, " -N (no visit, and only process batch queue)\n"); + fprintf(stderr, " -k (kill the former bbslink process before started)\n\n"); + fprintf(stderr, "本程式要正常執行必須將以下檔案置於 %s/innd 下:\n", BBSHOME); + fprintf(stderr, "bbsname.bbs 設定貴站的 BBS ID (請儘量簡短)\n"); + fprintf(stderr, "nodelist.bbs 設定網路各 BBS 站的 ID, Address 和 fullname\n"); + fprintf(stderr, "newsfeeds.bbs 設定網路信件的 newsgroup board nodelist ...\n"); } bntplink(argc, argv) - int argc; - char **argv; + int argc; + char **argv; { - static char *OUTING = ".outing"; - nodelist_t *nl; - int linkport; - char result[4096]; - char cancelfile[MAXPATHLEN], cancelpost[MAXPATHLEN]; - char bbslink_lockfile[MAXPATHLEN]; - FILE *NEWPOST; - char *left, *right; - int nlcount; - -// strcpy(BBSHOME, argv[0]); - if (initial_bbs("link") == 0) - { - return -1; - } - - BBSLINK_STAT = (stat_t *) malloc(sizeof(stat_t) * (NLCOUNT + 1)); - for (nlcount = 0; nlcount < NLCOUNT; nlcount++) - { - BBSLINK_STAT[nlcount].localsendout = 0; - BBSLINK_STAT[nlcount].remotesendout = 0; - BBSLINK_STAT[nlcount].localfailed = 0; - BBSLINK_STAT[nlcount].remotefailed = 0; - } - - nl = (nodelist_t *) search_nodelist_bynode(MYBBSID); - if (nl == NULL) - { - *MYADDR = '\0'; - *MYSITE = '\0'; - *LINKPROTOCOL = '\0'; - } - else - { - strncpy(MYADDR, nl->host, sizeof MYADDR); - strncpy(LINKPROTOCOL, nl->protocol, sizeof LINKPROTOCOL); - strncpy(MYSITE, nl->comments, sizeof MYSITE); - } - if (Verbose) - { - printf("MYADDR: %s\n", MYADDR); - printf("MYSITE: %s\n", MYSITE); - } - left = strchr(nl->protocol, '('); - right = strrchr(nl->protocol, ')'); - if (left && right) - { - *right = '\0'; - strncpy(LINKPROTOCOL, nl->protocol, sizeof LINKPROTOCOL); - LINKPORT = atoi(left + 1); - *right = ')'; - } - - if (!NoVisit) - { - sprintf(bbslink_lockfile, "%s/.bbslink.visit", INNDHOME); - if (!Rename(fileglue("%s/out.bntp", INNDHOME), OUTING) && bbslink_get_lock(bbslink_lockfile)) - { - /* When try to visit new post, try to lock it */ - NEWPOST = fopen(OUTING, "r"); - if (NEWPOST == NULL) - { - bbslog("<bbslink> Err: can't open %s\n", OUTING); - bbslink_un_lock(bbslink_lockfile); - return -1; - } - while (fgets(result, sizeof result, NEWPOST)) - { - /* chop( $_ ); */ - char *board, *filename, *userid, *nickname, *subject; - char *ptr; - - ptr = strchr(result, '\n'); - if (ptr) - *ptr = '\0'; - - board = filename = userid = nickname = subject = NULL; - /* board field */ - board = result; - ptr = strchr(result, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* filename field */ - filename = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* userid field */ - userid = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* nickname field */ - nickname = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* subject field */ - subject = ptr; - /* ptr = strchr(ptr, '\t'); if (ptr == NULL) continue; ptr++ = '\0'; */ - - if(bad_subject(subject)) continue; - - if(outgo_post < MAX_OUTGO_POST){ - out_bntp[outgo_post].board = board; - out_bntp[outgo_post].filename = filename; - out_bntp[outgo_post].userid = userid; - out_bntp[outgo_post].nickname = nickname; - out_bntp[outgo_post].subject = subject; - outgo_post++; - } - - process_article(board, filename, userid, nickname, subject); - } - fclose(NEWPOST); - unlink(OUTING); - bbslink_un_lock(bbslink_lockfile); - } /* getlock */ - } /* if NoVisit is false */ - - sprintf(cancelpost, "%s/cancel.bntp", INNDHOME); - if (isfile(cancelpost)) - { - FILE *CANCELFILE; - - if (bbslink_get_lock(cancelpost) && bbslink_get_lock(cancelfile)) - { - sprintf(cancelfile, "%s.%d", cancelpost, getpid()); - Rename(cancelpost, cancelfile); - CANCELFILE = fopen(cancelfile, "r"); - while (fgets(result, sizeof result, CANCELFILE) != NULL) - { - /* chop( $_ ); */ - char *board, *filename, *userid, *nickname, *subject; - char *ptr, **sptr; - - ptr = strchr(result, '\n'); - if (ptr) - *ptr = '\0'; - board = filename = userid = nickname = subject = NULL; - - /* board field */ - board = result; - ptr = strchr(result, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* filename field */ - filename = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* userid field */ - userid = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* nickname field */ - nickname = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* subject field */ - subject = ptr; - /* ptr = strchr(ptr, '\t'); if (ptr == NULL) continue; ptr++ = '\0'; */ - if(!is_outgo_post(board, filename, userid, nickname, subject)) - process_cancel(board, filename, userid, nickname, subject); - } - fclose(CANCELFILE); - if (Verbose) - printf("Unlinking %s\n", cancelfile); - if (!NoAction) - unlink(cancelfile); - bbslink_un_lock(cancelfile); - bbslink_un_lock(cancelpost); + static char *OUTING = ".outing"; + nodelist_t *nl; + int linkport; + char result[4096]; + char cancelfile[MAXPATHLEN], cancelpost[MAXPATHLEN]; + char bbslink_lockfile[MAXPATHLEN]; + FILE *NEWPOST; + char *left, *right; + int nlcount; + + //strcpy(BBSHOME, argv[0]); + if (initial_bbs("link") == 0) { + return -1; + } + BBSLINK_STAT = (stat_t *) malloc(sizeof(stat_t) * (NLCOUNT + 1)); + for (nlcount = 0; nlcount < NLCOUNT; nlcount++) { + BBSLINK_STAT[nlcount].localsendout = 0; + BBSLINK_STAT[nlcount].remotesendout = 0; + BBSLINK_STAT[nlcount].localfailed = 0; + BBSLINK_STAT[nlcount].remotefailed = 0; } - } - for (nlcount = 0; nlcount < NLCOUNT; nlcount++) - { - if (NODELIST[nlcount].feedfp != NULL) - { - fclose(NODELIST[nlcount].feedfp); - NODELIST[nlcount].feedfp = NULL; + nl = (nodelist_t *) search_nodelist_bynode(MYBBSID); + if (nl == NULL) { + *MYADDR = '\0'; + *MYSITE = '\0'; + *LINKPROTOCOL = '\0'; + } else { + strncpy(MYADDR, nl->host, sizeof MYADDR); + strncpy(LINKPROTOCOL, nl->protocol, sizeof LINKPROTOCOL); + strncpy(MYSITE, nl->comments, sizeof MYSITE); } - } - - send_article(); - for (nlcount = 0; nlcount < NLCOUNT; nlcount++) - { - int localsendout, remotesendout, localfailed, remotefailed; - - localsendout = BBSLINK_STAT[nlcount].localsendout; - remotesendout = BBSLINK_STAT[nlcount].remotesendout; - localfailed = BBSLINK_STAT[nlcount].localfailed; - remotefailed = BBSLINK_STAT[nlcount].remotefailed; - if (localsendout || remotesendout || localfailed || remotefailed) - bbslog("<bbslink> [%s]%s lsend:%d rsend:%d lfail:%d rfail:%d\n", - NODELIST[nlcount].node, NoAction ? "NoAction" : "", localsendout, remotesendout, - localfailed, remotefailed); - if (NODELIST[nlcount].feedfp != NULL) - { - fclose(NODELIST[nlcount].feedfp); - NODELIST[nlcount].feedfp = NULL; + if (Verbose) { + printf("MYADDR: %s\n", MYADDR); + printf("MYSITE: %s\n", MYSITE); + } + left = strchr(nl->protocol, '('); + right = strrchr(nl->protocol, ')'); + if (left && right) { + *right = '\0'; + strncpy(LINKPROTOCOL, nl->protocol, sizeof LINKPROTOCOL); + LINKPORT = atoi(left + 1); + *right = ')'; + } + if (!NoVisit) { + sprintf(bbslink_lockfile, "%s/.bbslink.visit", INNDHOME); + if (!Rename(fileglue("%s/out.bntp", INNDHOME), OUTING) && bbslink_get_lock(bbslink_lockfile)) { + /* When try to visit new post, try to lock it */ + NEWPOST = fopen(OUTING, "r"); + if (NEWPOST == NULL) { + bbslog("<bbslink> Err: can't open %s\n", OUTING); + bbslink_un_lock(bbslink_lockfile); + return -1; + } + while (fgets(result, sizeof result, NEWPOST)) { + /* chop( $_ ); */ + char *board, *filename, *userid, *nickname, *subject; + char *ptr; + + ptr = strchr(result, '\n'); + if (ptr) + *ptr = '\0'; + + board = filename = userid = nickname = subject = NULL; + /* board field */ + board = result; + ptr = strchr(result, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* filename field */ + filename = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* userid field */ + userid = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* nickname field */ + nickname = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* subject field */ + subject = ptr; + /* + * ptr = strchr(ptr, '\t'); if (ptr == NULL) continue; ptr++ + * = '\0'; + */ + + if (bad_subject(subject)) + continue; + + if (outgo_post < MAX_OUTGO_POST) { + out_bntp[outgo_post].board = board; + out_bntp[outgo_post].filename = filename; + out_bntp[outgo_post].userid = userid; + out_bntp[outgo_post].nickname = nickname; + out_bntp[outgo_post].subject = subject; + outgo_post++; + } + process_article(board, filename, userid, nickname, subject); + } + fclose(NEWPOST); + unlink(OUTING); + bbslink_un_lock(bbslink_lockfile); + } /* getlock */ + } /* if NoVisit is false */ + sprintf(cancelpost, "%s/cancel.bntp", INNDHOME); + if (isfile(cancelpost)) { + FILE *CANCELFILE; + + if (bbslink_get_lock(cancelpost) && bbslink_get_lock(cancelfile)) { + sprintf(cancelfile, "%s.%d", cancelpost, getpid()); + Rename(cancelpost, cancelfile); + CANCELFILE = fopen(cancelfile, "r"); + while (fgets(result, sizeof result, CANCELFILE) != NULL) { + /* chop( $_ ); */ + char *board, *filename, *userid, *nickname, *subject; + char *ptr, **sptr; + + ptr = strchr(result, '\n'); + if (ptr) + *ptr = '\0'; + board = filename = userid = nickname = subject = NULL; + + /* board field */ + board = result; + ptr = strchr(result, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* filename field */ + filename = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* userid field */ + userid = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* nickname field */ + nickname = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* subject field */ + subject = ptr; + /* + * ptr = strchr(ptr, '\t'); if (ptr == NULL) continue; ptr++ + * = '\0'; + */ + if (!is_outgo_post(board, filename, userid, nickname, subject)) + process_cancel(board, filename, userid, nickname, subject); + } + fclose(CANCELFILE); + if (Verbose) + printf("Unlinking %s\n", cancelfile); + if (!NoAction) + unlink(cancelfile); + bbslink_un_lock(cancelfile); + bbslink_un_lock(cancelpost); + } } - } - if (BBSLINK_STAT); - free(BBSLINK_STAT); - return 0; + for (nlcount = 0; nlcount < NLCOUNT; nlcount++) { + if (NODELIST[nlcount].feedfp != NULL) { + fclose(NODELIST[nlcount].feedfp); + NODELIST[nlcount].feedfp = NULL; + } + } + + send_article(); + for (nlcount = 0; nlcount < NLCOUNT; nlcount++) { + int localsendout, remotesendout, localfailed, remotefailed; + + localsendout = BBSLINK_STAT[nlcount].localsendout; + remotesendout = BBSLINK_STAT[nlcount].remotesendout; + localfailed = BBSLINK_STAT[nlcount].localfailed; + remotefailed = BBSLINK_STAT[nlcount].remotefailed; + if (localsendout || remotesendout || localfailed || remotefailed) + bbslog("<bbslink> [%s]%s lsend:%d rsend:%d lfail:%d rfail:%d\n", + NODELIST[nlcount].node, NoAction ? "NoAction" : "", localsendout, remotesendout, + localfailed, remotefailed); + if (NODELIST[nlcount].feedfp != NULL) { + fclose(NODELIST[nlcount].feedfp); + NODELIST[nlcount].feedfp = NULL; + } + } + if (BBSLINK_STAT); + free(BBSLINK_STAT); + return 0; } /* -termbbslink(sig) - int sig; -{ - bbslog("kill signal received %d, terminated\n", sig); - if (Verbose) - printf("kill signal received %d, terminated\n", sig); - exit(0); -} -*/ + * termbbslink(sig) int sig; { bbslog("kill signal received %d, + * terminated\n", sig); if (Verbose) printf("kill signal received %d, + * terminated\n", sig); exit(0); } + */ void termbbslink() { - bbslog("kill signal received ??, terminated\n"); - if (Verbose) - printf("kill signal received ??, terminated\n"); - exit(0); + bbslog("kill signal received ??, terminated\n"); + if (Verbose) + printf("kill signal received ??, terminated\n"); + exit(0); } -char *REMOTEUSERNAME = ""; -char *REMOTEHOSTNAME = ""; +char *REMOTEUSERNAME = ""; +char *REMOTEHOSTNAME = ""; -extern char *optarg; -extern int opterr, optind; +extern char *optarg; +extern int opterr, optind; main(argc, argv) - int argc; - char **argv; + int argc; + char **argv; { - int c, errflag = 0; + int c, errflag = 0; - CONTROL = CONTROL_BUF; - MSGID = MSGID_BUF; + CONTROL = CONTROL_BUF; + MSGID = MSGID_BUF; - /* For debug Only */ + /* For debug Only */ #define DEBUGBBSLINK #ifdef DEBUGBBSLINK - NoAction = 0; - Verbose = 0; - VisitOnly = 0; - NoVisit = 0; - DefaultFeedSite = ""; + NoAction = 0; + Verbose = 0; + VisitOnly = 0; + NoVisit = 0; + DefaultFeedSite = ""; #endif - while ((c = getopt(argc, argv, "s:hnvVNk")) != -1) - switch (c) - { - case 's': - DefaultFeedSite = optarg; - break; - case 'n': - NoAction = 1; - break; - case 'v': - Verbose = 1; - break; - case 'V': - VisitOnly = 1; - break; - case 'N': - NoVisit = 1; - break; - case 'k': - KillFormerBBSLINK = 1; - break; - case 'h': - default: - errflag++; - break; + while ((c = getopt(argc, argv, "s:hnvVNk")) != -1) + switch (c) { + case 's': + DefaultFeedSite = optarg; + break; + case 'n': + NoAction = 1; + break; + case 'v': + Verbose = 1; + break; + case 'V': + VisitOnly = 1; + break; + case 'N': + NoVisit = 1; + break; + case 'k': + KillFormerBBSLINK = 1; + break; + case 'h': + default: + errflag++; + break; + } + if (errflag > 0) { + show_usage(argv[0]); + return (1); } - if (errflag > 0) - { - show_usage(argv[0]); - return (1); - } - if (argc - optind < 1) - { - show_usage(argv[0]); - exit(1); - } - signal(SIGTERM, termbbslink); - if (bntplink(argc - optind, argv + optind) != 0) - { - show_usage(argv[0]); - exit(1); - } - return 0; + if (argc - optind < 1) { + show_usage(argv[0]); + exit(1); + } + signal(SIGTERM, termbbslink); + if (bntplink(argc - optind, argv + optind) != 0) { + show_usage(argv[0]); + exit(1); + } + return 0; } diff --git a/innbbsd/bbslink2.c b/innbbsd/bbslink2.c index 7a6834b3..15ef1f1a 100644 --- a/innbbsd/bbslink2.c +++ b/innbbsd/bbslink2.c @@ -1,17 +1,17 @@ #if defined( LINUX ) -# include "innbbsconf.h" -# include "bbslib.h" -# include <varargs.h> +#include "innbbsconf.h" +#include "bbslib.h" +#include <varargs.h> #else -# include <varargs.h> -# include "innbbsconf.h" -# include "bbslib.h" +#include <varargs.h> +#include "innbbsconf.h" +#include "bbslib.h" #endif #include <sys/mman.h> #ifndef AIX -# include <sys/fcntl.h> +#include <sys/fcntl.h> #endif #if defined(PalmBBS) @@ -27,7 +27,7 @@ * TODO 1. read newsfeeds.bbs, read nodelist.bbs, read bbsname.bbs 2. scan * new posts and append to .link 3. rename .link to .send (must lock) 4. * start to send .send out and append not sent to .link - * + * * 5. node.LOCK (with pid) 6. log articles sent */ @@ -36,181 +36,166 @@ #define MAXBUFLEN 256 #endif -typedef struct Over_t -{ - time_t mtime; - char date[MAXBUFLEN]; - char nickname[MAXBUFLEN]; - char subject[MAXBUFLEN]; - char from[MAXBUFLEN]; - char msgid[MAXBUFLEN]; - char site[MAXBUFLEN]; - char board[MAXBUFLEN]; -} linkoverview_t; - -typedef struct SendOver_t -{ - char *board, *filename, *group, *from, *subject; - char *outgoingtype, *msgid, *path; - char *date, *control; - time_t mtime; -} soverview_t; - -typedef struct Stat_t -{ - int localsendout; - int localfailed; - int remotesendout; - int remotefailed; -} stat_t; - -static stat_t *BBSLINK_STAT; - -static int NoAction = 0; -static int Verbose = 0; -static int VisitOnly = 0; -static int NoVisit = 0; -static char *DefaultFeedSite = ""; -static int KillFormerBBSLINK = 0; - -extern char *SITE; -extern char *GROUPS; - -char NICKNAME[MAXBUFLEN]; - -char DATE_BUF[MAXBUFLEN]; -extern char *DATE; - -char FROM_BUF[MAXBUFLEN]; -extern char *FROM; +typedef struct Over_t { + time_t mtime; + char date[MAXBUFLEN]; + char nickname[MAXBUFLEN]; + char subject[MAXBUFLEN]; + char from[MAXBUFLEN]; + char msgid[MAXBUFLEN]; + char site[MAXBUFLEN]; + char board[MAXBUFLEN]; +} linkoverview_t; + +typedef struct SendOver_t { + char *board, *filename, *group, *from, *subject; + char *outgoingtype, *msgid, *path; + char *date, *control; + time_t mtime; +} soverview_t; + +typedef struct Stat_t { + int localsendout; + int localfailed; + int remotesendout; + int remotefailed; +} stat_t; + +static stat_t *BBSLINK_STAT; + +static int NoAction = 0; +static int Verbose = 0; +static int VisitOnly = 0; +static int NoVisit = 0; +static char *DefaultFeedSite = ""; +static int KillFormerBBSLINK = 0; + +extern char *SITE; +extern char *GROUPS; + +char NICKNAME[MAXBUFLEN]; + +char DATE_BUF[MAXBUFLEN]; +extern char *DATE; + +char FROM_BUF[MAXBUFLEN]; +extern char *FROM; #ifndef MapleBBS -char POSTER_BUF[MAXBUFLEN]; -char *POSTER; +char POSTER_BUF[MAXBUFLEN]; +char *POSTER; #endif -char MYADDR[MAXBUFLEN]; -char MYSITE[MAXBUFLEN]; +char MYADDR[MAXBUFLEN]; +char MYSITE[MAXBUFLEN]; -char SUBJECT_BUF[MAXBUFLEN]; -extern char *SUBJECT; +char SUBJECT_BUF[MAXBUFLEN]; +extern char *SUBJECT; -char MSGID_BUF[MAXBUFLEN]; -extern char *MSGID; +char MSGID_BUF[MAXBUFLEN]; +extern char *MSGID; -char LINKPROTOCOL[MAXBUFLEN]; -int LINKPORT; -char ORGANIZATION[MAXBUFLEN]; -char NEWSCONTROL[MAXBUFLEN]; -char NEWSAPPROVED[MAXBUFLEN]; -char NNTPHOST_BUF[MAXBUFLEN]; -extern char *NNTPHOST; -char PATH_BUF[MAXBUFLEN]; -extern char *PATH; +char LINKPROTOCOL[MAXBUFLEN]; +int LINKPORT; +char ORGANIZATION[MAXBUFLEN]; +char NEWSCONTROL[MAXBUFLEN]; +char NEWSAPPROVED[MAXBUFLEN]; +char NNTPHOST_BUF[MAXBUFLEN]; +extern char *NNTPHOST; +char PATH_BUF[MAXBUFLEN]; +extern char *PATH; -char CONTROL_BUF[MAXBUFLEN]; -extern char *CONTROL; +char CONTROL_BUF[MAXBUFLEN]; +extern char *CONTROL; -char *BODY, *HEAD; +char *BODY, *HEAD; -int USEIHAVE = 1; -int USEPOST = 0; -int USEDATA = 0; -int FEEDTYPE = ' '; +int USEIHAVE = 1; +int USEPOST = 0; +int USEDATA = 0; +int FEEDTYPE = ' '; -int NNTP = -1; -FILE *NNTPrfp = NULL; -FILE *NNTPwfp = NULL; -char NNTPbuffer[1024]; -static char *NEWSFEED; -static char *REMOTE = "REMOTE"; -static char *LOCAL = "LOCAL"; +int NNTP = -1; +FILE *NNTPrfp = NULL; +FILE *NNTPwfp = NULL; +char NNTPbuffer[1024]; +static char *NEWSFEED; +static char *REMOTE = "REMOTE"; +static char *LOCAL = "LOCAL"; -static int FD, FD_SIZE; -static char *FD_BUF; -static char *FD_END; +static int FD, FD_SIZE; +static char *FD_BUF; +static char *FD_END; -static char *COMMENT = +static char *COMMENT = "[Ptt 送出]\n"; -char *fileglue(); +char *fileglue(); /* -woju -Cross-fs rename() -*/ + * woju Cross-fs rename() + */ -Rename(char* src, char* dst) +Rename(char *src, char *dst) { - char cmd[200]; + char cmd[200]; - if (rename(src, dst) == 0) - return 0; + if (rename(src, dst) == 0) + return 0; - sprintf(cmd, "/bin/mv %s %s", src, dst); - return system(cmd); + sprintf(cmd, "/bin/mv %s %s", src, dst); + return system(cmd); } bbslink_un_lock(file) - char *file; + char *file; { - char *lockfile = fileglue("%s.LOCK", file); + char *lockfile = fileglue("%s.LOCK", file); - if (isfile(lockfile)) - unlink(lockfile); + if (isfile(lockfile)) + unlink(lockfile); } bbslink_get_lock(file) - char *file; + char *file; { - int lockfd; - char LockFile[MAXPATHLEN]; - - strncpy(LockFile, (char *) fileglue("%s.LOCK", file), sizeof LockFile); - if ((lockfd = open(LockFile, O_RDONLY)) >= 0) - { - char buf[10]; - int pid; - - if (read(lockfd, buf, sizeof buf) > 0 && - (pid = atoi(buf)) > 0 && kill(pid, 0) == 0) - { - if (KillFormerBBSLINK) - { - kill(pid, SIGTERM); - unlink(LockFile); - } - else - { - fprintf(stderr, "another process [%d] running\n", pid); - return 0; - } + int lockfd; + char LockFile[MAXPATHLEN]; + + strncpy(LockFile, (char *)fileglue("%s.LOCK", file), sizeof LockFile); + if ((lockfd = open(LockFile, O_RDONLY)) >= 0) { + char buf[10]; + int pid; + + if (read(lockfd, buf, sizeof buf) > 0 && + (pid = atoi(buf)) > 0 && kill(pid, 0) == 0) { + if (KillFormerBBSLINK) { + kill(pid, SIGTERM); + unlink(LockFile); + } else { + fprintf(stderr, "another process [%d] running\n", pid); + return 0; + } + } else { + fprintf(stderr, "no process [%d] running, but lock file existed, unlinked\n", pid); + unlink(LockFile); + } + close(lockfd); } - else - { - fprintf(stderr, "no process [%d] running, but lock file existed, unlinked\n", pid); - unlink(LockFile); + if ((lockfd = open(LockFile, O_RDWR | O_CREAT | O_EXCL, 0644)) < 0) { + fprintf(stderr, "lock %s error: another bbslink process running\n", LockFile); + return 0; + } else { + char buf[10]; + int pid; + + sprintf(buf, "%-.8d\n", getpid()); + write(lockfd, buf, strlen(buf)); + close(lockfd); + return 1; } - close(lockfd); - } - - if ((lockfd = open(LockFile, O_RDWR | O_CREAT | O_EXCL, 0644)) < 0) - { - fprintf(stderr, "lock %s error: another bbslink process running\n", LockFile); - return 0; - } - else - { - char buf[10]; - int pid; - - sprintf(buf, "%-.8d\n", getpid()); - write(lockfd, buf, strlen(buf)); - close(lockfd); - return 1; - } } @@ -218,241 +203,214 @@ int tcpcommand(va_alist) va_dcl { - va_list ap; - register char *fmt; - char *ptr; - - va_start(ap); - vfprintf(NNTPwfp, fmt, ap); - fprintf(NNTPwfp, "\r\n"); - fflush(NNTPwfp); - - fgets(NNTPbuffer, sizeof NNTPbuffer, NNTPrfp); - ptr = strchr(NNTPbuffer, '\r'); - if (ptr) - *ptr = '\0'; - ptr = strchr(NNTPbuffer, '\n'); - if (ptr) - *ptr = '\0'; - va_end(ap); - return atoi(NNTPbuffer); + va_list ap; + register char *fmt; + char *ptr; + + va_start(ap); + vfprintf(NNTPwfp, fmt, ap); + fprintf(NNTPwfp, "\r\n"); + fflush(NNTPwfp); + + fgets(NNTPbuffer, sizeof NNTPbuffer, NNTPrfp); + ptr = strchr(NNTPbuffer, '\r'); + if (ptr) + *ptr = '\0'; + ptr = strchr(NNTPbuffer, '\n'); + if (ptr) + *ptr = '\0'; + va_end(ap); + return atoi(NNTPbuffer); } -char * +char * tcpmessage() { - char *ptr; + char *ptr; - ptr = strchr(NNTPbuffer, ' '); - if (ptr) - return ptr; - return NNTPbuffer; + ptr = strchr(NNTPbuffer, ' '); + if (ptr) + return ptr; + return NNTPbuffer; } read_article(lover, filename, userid) - linkoverview_t *lover; - char *filename, *userid; + linkoverview_t *lover; + char *filename, *userid; { - FILE *fp; - int fd; - struct stat st; - time_t mtime; - char *buffer; - char *artptr, *artend, *artback; - - if (stat(filename, &st) != 0) - return 0; - lover->mtime = st.st_mtime; - fd = open(filename, O_RDONLY); - if (fd < 0) - { - bbslog("<bbslink> Err: can't open %s\n", filename); - return 0; - } - - if (FD_BUF == NULL) - { - FD_BUF = mymalloc(st.st_size + 1 + strlen(COMMENT)); - } - else - { - FD_BUF = myrealloc(FD_BUF, st.st_size + 1 + strlen(COMMENT)); - } - FD_BUF[st.st_size] = '\0'; - read(fd, FD_BUF, st.st_size); - sprintf(FD_BUF + st.st_size, "%s", COMMENT); - st.st_size += strlen(COMMENT); - FD_SIZE = st.st_size; - for (buffer = FD_BUF, artend = FD_BUF + st.st_size, - artback = strchr(buffer, '\n'); - buffer && buffer < artend && *buffer; - artback = strchr(buffer, '\n') - ) - { - /* while( fgets(buffer, sizeof buffer, fp) != NULL) { */ - char *m, *n; - char *ptr; - - if (artback != NULL) - *artback = '\0'; - if (*buffer == '\0') - break; - -#ifndef MapleBBS - if (strstr(buffer, userid) != NULL) - { - m = strchr(buffer, '('); - n = strrchr(buffer, ')'); - if (m != NULL && n != NULL) - { - strncpy(lover->nickname, m + 1, n - m - 1); - lover->nickname[n - m - 1] = '\0'; - } - else - { - *lover->nickname = '\0'; - } + FILE *fp; + int fd; + struct stat st; + time_t mtime; + char *buffer; + char *artptr, *artend, *artback; + + if (stat(filename, &st) != 0) + return 0; + lover->mtime = st.st_mtime; + fd = open(filename, O_RDONLY); + if (fd < 0) { + bbslog("<bbslink> Err: can't open %s\n", filename); + return 0; } - else if (strncmp(buffer, "Date: ", 11) == 0) - { - strcpy(lover->date, buffer + 11); - } - else if (strncmp(buffer, "發信站: ", 8) == 0) - { - m = strchr(buffer, '('); - n = strrchr(buffer, ')'); - strncpy(lover->date, m + 1, n - m - 1); - lover->date[n - m - 1] = '\0'; + if (FD_BUF == NULL) { + FD_BUF = mymalloc(st.st_size + 1 + strlen(COMMENT)); + } else { + FD_BUF = myrealloc(FD_BUF, st.st_size + 1 + strlen(COMMENT)); } + FD_BUF[st.st_size] = '\0'; + read(fd, FD_BUF, st.st_size); + sprintf(FD_BUF + st.st_size, "%s", COMMENT); + st.st_size += strlen(COMMENT); + FD_SIZE = st.st_size; + for (buffer = FD_BUF, artend = FD_BUF + st.st_size, + artback = strchr(buffer, '\n'); + buffer && buffer < artend && *buffer; + artback = strchr(buffer, '\n') + ) { + /* while( fgets(buffer, sizeof buffer, fp) != NULL) { */ + char *m, *n; + char *ptr; + + if (artback != NULL) + *artback = '\0'; + if (*buffer == '\0') + break; + +#ifndef MapleBBS + if (strstr(buffer, userid) != NULL) { + m = strchr(buffer, '('); + n = strrchr(buffer, ')'); + if (m != NULL && n != NULL) { + strncpy(lover->nickname, m + 1, n - m - 1); + lover->nickname[n - m - 1] = '\0'; + } else { + *lover->nickname = '\0'; + } + } else if (strncmp(buffer, "Date: ", 11) == 0) { + strcpy(lover->date, buffer + 11); + } else if (strncmp(buffer, "發信站: ", 8) == 0) { + m = strchr(buffer, '('); + n = strrchr(buffer, ')'); + strncpy(lover->date, m + 1, n - m - 1); + lover->date[n - m - 1] = '\0'; + } #endif - if (artback != NULL) - { - *artback = '\n'; - buffer = artback + 1; + if (artback != NULL) { + *artback = '\n'; + buffer = artback + 1; + } else { + break; + } } + if (artback != NULL) + BODY = artback + 1; else - { - break; - } - } - if (artback != NULL) - BODY = artback + 1; - else - BODY = ""; - close(fd); - return 1; + BODY = ""; + close(fd); + return 1; } save_outgoing(sover, filename, userid, poster, mtime) - soverview_t *sover, *filename, *userid, *poster; - time_t mtime; + soverview_t *sover, *filename, *userid, *poster; + time_t mtime; { - newsfeeds_t *nf; - char *group, *server, *serveraddr; - char *subject, *path; - char *board; - char *ptr1, *ptr2; - - board = sover->board; - - PATH = MYBBSID; - nf = (newsfeeds_t *) search_board(board); - if (nf == NULL) - { - bbslog("<bbslink> save_outgoing: No such board %s\n", board); - return; - } - else - { - group = nf->newsgroups; - server = nf->path; - } - if (!server || !*server) - { - sprintf(PATH_BUF, "%.*s (local)", sizeof PATH_BUF - 9, MYBBSID); - PATH = PATH_BUF; - serveraddr = ""; - sover->path = PATH; - } - for (ptr1 = server; ptr1 && *ptr1;) - { - nodelist_t *nl; - char savech; - - for (; *ptr1 && isspace(*ptr1); ptr1++); - if (!*ptr1) - break; - for (ptr2 = ptr1; *ptr2 && !isspace(*ptr2); ptr2++); - savech = *ptr2; - *ptr2 = '\0'; - nl = (nodelist_t *) search_nodelist_bynode(ptr1); - *ptr2 = savech; - ptr1 = ptr2++; - if (nl == NULL) - continue; - /* if (nl->feedfp == NULL) continue; */ - - if (nl->host && *nl->host) - { - if (nl->feedfp == NULL) - { - nl->feedfp = fopen(fileglue("%s/%s.link", INNDHOME, nl->node), "a"); - if (nl->feedfp == NULL) - { - bbslog("<save outgoing> append failed for %s/%s.link", INNDHOME, nl->node); - } - } - if (nl->feedfp != NULL) - { - flock(fileno(nl->feedfp), LOCK_EX); - fprintf(nl->feedfp, "%s\t%s\t%s\t%ld\t%s\t%s\n", sover->board, filename, group, mtime, FROM, sover->subject); - fflush(nl->feedfp); - flock(fileno(nl->feedfp), LOCK_UN); - } + newsfeeds_t *nf; + char *group, *server, *serveraddr; + char *subject, *path; + char *board; + char *ptr1, *ptr2; + + board = sover->board; + + PATH = MYBBSID; + nf = (newsfeeds_t *) search_board(board); + if (nf == NULL) { + bbslog("<bbslink> save_outgoing: No such board %s\n", board); + return; + } else { + group = nf->newsgroups; + server = nf->path; + } + if (!server || !*server) { + sprintf(PATH_BUF, "%.*s (local)", sizeof PATH_BUF - 9, MYBBSID); + PATH = PATH_BUF; + serveraddr = ""; + sover->path = PATH; + } + for (ptr1 = server; ptr1 && *ptr1;) { + nodelist_t *nl; + char savech; + + for (; *ptr1 && isspace(*ptr1); ptr1++); + if (!*ptr1) + break; + for (ptr2 = ptr1; *ptr2 && !isspace(*ptr2); ptr2++); + savech = *ptr2; + *ptr2 = '\0'; + nl = (nodelist_t *) search_nodelist_bynode(ptr1); + *ptr2 = savech; + ptr1 = ptr2++; + if (nl == NULL) + continue; + /* if (nl->feedfp == NULL) continue; */ + + if (nl->host && *nl->host) { + if (nl->feedfp == NULL) { + nl->feedfp = fopen(fileglue("%s/%s.link", INNDHOME, nl->node), "a"); + if (nl->feedfp == NULL) { + bbslog("<save outgoing> append failed for %s/%s.link", INNDHOME, nl->node); + } + } + if (nl->feedfp != NULL) { + flock(fileno(nl->feedfp), LOCK_EX); + fprintf(nl->feedfp, "%s\t%s\t%s\t%ld\t%s\t%s\n", sover->board, filename, group, mtime, FROM, sover->subject); + fflush(nl->feedfp); + flock(fileno(nl->feedfp), LOCK_UN); + } + } + if (savech == '\0') + break; } - if (savech == '\0') - break; - } } #ifndef MapleBBS save_article(board, filename, sover) - char *board, *filename; - soverview_t *sover; + char *board, *filename; + soverview_t *sover; { - FILE *FN; - - if (Verbose) - printf("<save_article> %s %s\n", board, filename); - FN = fopen(fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename), "w"); - if (FN == NULL) - { - bbslog("<save_article> err: %s %s\n", board, filename); + FILE *FN; + if (Verbose) - printf("<save_article> err: %s %s\n", board, filename); - return 0; - } - flock(fileno(FN), LOCK_EX); - fprintf(FN, "發信人: %s, 信區: %s\n", POSTER, sover->board); - fprintf(FN, "標 題: %s\n", sover->subject); - fprintf(FN, "發信站: %s (%s)\n", MYSITE, sover->date); - fprintf(FN, "轉信站: %s\n", sover->path); - fprintf(FN, "\n"); - fputs(BODY, FN); - flock(fileno(FN), LOCK_UN); - fclose(FN); + printf("<save_article> %s %s\n", board, filename); + FN = fopen(fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename), "w"); + if (FN == NULL) { + bbslog("<save_article> err: %s %s\n", board, filename); + if (Verbose) + printf("<save_article> err: %s %s\n", board, filename); + return 0; + } + flock(fileno(FN), LOCK_EX); + fprintf(FN, "發信人: %s, 信區: %s\n", POSTER, sover->board); + fprintf(FN, "標 題: %s\n", sover->subject); + fprintf(FN, "發信站: %s (%s)\n", MYSITE, sover->date); + fprintf(FN, "轉信站: %s\n", sover->path); + fprintf(FN, "\n"); + fputs(BODY, FN); + flock(fileno(FN), LOCK_UN); + fclose(FN); #if defined(PalmBBS) - { - struct utimbuf times; - - times.actime = sover->mtime; - times.modtime = sover->mtime; - utime(fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename), ×); - utime(fileglue("%s/.bcache/%s", BBSHOME, board), NULL); - } + { + struct utimbuf times; + + times.actime = sover->mtime; + times.modtime = sover->mtime; + utime(fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename), ×); + utime(fileglue("%s/.bcache/%s", BBSHOME, board), NULL); + } #endif } #endif @@ -460,846 +418,717 @@ save_article(board, filename, sover) /* process_article() read_article() save_outgoing() save_article() */ process_article(board, filename, userid, nickname, subject) - char *board, *filename, *userid, *nickname, *subject; + char *board, *filename, *userid, *nickname, *subject; { - char *n, *filepath; - char poster[MAXBUFLEN]; - soverview_t sover; - - if (!*userid) - { - return; - } - else if (!subject || !*subject) - { - subject = "無題"; - } - filepath = fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename); - if (isfile(filepath)) - { - linkoverview_t lover; - - if (read_article(&lover, filepath, userid)) - { + char *n, *filepath; + char poster[MAXBUFLEN]; + soverview_t sover; + + if (!*userid) { + return; + } else if (!subject || !*subject) { + subject = "無題"; + } + filepath = fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename); + if (isfile(filepath)) { + linkoverview_t lover; + + if (read_article(&lover, filepath, userid)) { #ifndef MapleBBS - strncpy(POSTER_BUF, fileglue("%s@%s (%s)", userid, MYBBSID, nickname), sizeof POSTER_BUF); - POSTER = POSTER_BUF; + strncpy(POSTER_BUF, fileglue("%s@%s (%s)", userid, MYBBSID, nickname), sizeof POSTER_BUF); + POSTER = POSTER_BUF; #endif - strncpy(FROM_BUF, fileglue("%s.bbs@%s (%s)", userid, MYADDR, nickname), sizeof FROM_BUF); - FROM = FROM_BUF; - sover.from = FROM; - sover.board = board; - sover.subject = subject; - PATH = MYBBSID; - sover.path = MYBBSID; - sover.date = lover.date; - sover.mtime = lover.mtime; - if (!VisitOnly) - { - save_outgoing(&sover, filename, userid, poster, lover.mtime); + strncpy(FROM_BUF, fileglue("%s.bbs@%s (%s)", userid, MYADDR, nickname), sizeof FROM_BUF); + FROM = FROM_BUF; + sover.from = FROM; + sover.board = board; + sover.subject = subject; + PATH = MYBBSID; + sover.path = MYBBSID; + sover.date = lover.date; + sover.mtime = lover.mtime; + if (!VisitOnly) { + save_outgoing(&sover, filename, userid, poster, lover.mtime); #ifndef MapleBBS - save_article(board, filename, &sover); + save_article(board, filename, &sover); #endif - } + } + } } - } } -char * +char * baseN(val, base, len) - int val, base, len; + int val, base, len; { - int n, ans; - static char str[MAXBUFLEN]; - char *pstr = str; - int index; - - for (index = len - 1; index >= 0; index--) - { - n = val % base; - val /= base; - if (n < 10) - { - n += '0'; - } - else if (n < 36) - { - n += 'A' - 10; + int n, ans; + static char str[MAXBUFLEN]; + char *pstr = str; + int index; + + for (index = len - 1; index >= 0; index--) { + n = val % base; + val /= base; + if (n < 10) { + n += '0'; + } else if (n < 36) { + n += 'A' - 10; + } else if (n < 62) { + n += 'a' - 36; + } else { + n = '_'; + } + str[index] = n; } - else if (n < 62) - { - n += 'a' - 36; - } - else - { - n = '_'; - } - str[index] = n; - } - str[len] = '\0'; - return str; + str[len] = '\0'; + return str; } -char * +char * hash_value(str) - char *str; + char *str; { - int val, n; - char *ptr; - - if (*str) - ptr = str + strlen(str) - 1; - else - ptr = str; - val = 0; - while (ptr >= str) - { - n = *ptr; - val = (val + n * 0x100) ^ n; - ptr--; - } - return baseN(val, 64, 3); + int val, n; + char *ptr; + + if (*str) + ptr = str + strlen(str) - 1; + else + ptr = str; + val = 0; + while (ptr >= str) { + n = *ptr; + val = (val + n * 0x100) ^ n; + ptr--; + } + return baseN(val, 64, 3); } /* process_cancel() save_outgoing() hash_value(); baseN(); ascii_date(); */ read_outgoing(sover) - soverview_t *sover; + soverview_t *sover; { - char *board, *filename, *group, *from, *subject, *outgoingtype, *msgid, *path; - char *buffer, *bufferp; - FILE *ECHOMAIL, *FN; - char *hash; - char times[MAXBUFLEN]; - time_t mtime; - - board = sover->board; - filename = sover->filename; - group = sover->group; - mtime = sover->mtime; - from = sover->from; - subject = sover->subject; - outgoingtype = sover->outgoingtype; - msgid = sover->msgid; - path = sover->path; - if (Verbose) - { - printf("<read_outgoing> %s:%s:%s\n", board, filename, group); - printf(" => %ld:%s\n", mtime, from); - printf(" => %s\n", subject); - printf(" => %s:%s\n", outgoingtype, msgid); - printf(" => %s\n", path); - } - if (NEWSFEED == LOCAL) - { - char *end = strrchr(filename, '.'); - - if (end) - *end = '\0'; - strncpy(times, baseN(atol(filename + 2), 48, 6), sizeof times); - if (end) - *end = '.'; - hash = hash_value(fileglue("%s.%s", filename, board)); - sprintf(MSGID_BUF, "%s$%s@%s", times, hash, MYADDR); - } - else - { - strncpy(MSGID_BUF, msgid, sizeof MSGID_BUF); - } - sover->msgid = MSGID; - if (mtime == -1) - { - static char BODY_BUF[MAXBUFLEN]; - - strncpy(BODY_BUF, fileglue("%s\r\n", subject), sizeof BODY_BUF); - BODY = BODY_BUF; - sprintf(SUBJECT_BUF, "cmsg cancel <%s>", MSGID); - SUBJECT = SUBJECT_BUF; - sprintf(CONTROL_BUF, "cancel <%s>", MSGID); - CONTROL = CONTROL_BUF; - strncpy(MSGID_BUF, fileglue("%d.%s", getpid(), MSGID_BUF), sizeof MSGID_BUF); - sprintf(DATE_BUF, "%s", ascii_date(time(NULL))); - DATE = DATE_BUF; - sover->subject = SUBJECT; - sover->control = CONTROL; + char *board, *filename, *group, *from, *subject, *outgoingtype, + *msgid, *path; + char *buffer, *bufferp; + FILE *ECHOMAIL, *FN; + char *hash; + char times[MAXBUFLEN]; + time_t mtime; + + board = sover->board; + filename = sover->filename; + group = sover->group; + mtime = sover->mtime; + from = sover->from; + subject = sover->subject; + outgoingtype = sover->outgoingtype; + msgid = sover->msgid; + path = sover->path; + if (Verbose) { + printf("<read_outgoing> %s:%s:%s\n", board, filename, group); + printf(" => %ld:%s\n", mtime, from); + printf(" => %s\n", subject); + printf(" => %s:%s\n", outgoingtype, msgid); + printf(" => %s\n", path); + } + if (NEWSFEED == LOCAL) { + char *end = strrchr(filename, '.'); + + if (end) + *end = '\0'; + strncpy(times, baseN(atol(filename + 2), 48, 6), sizeof times); + if (end) + *end = '.'; + hash = hash_value(fileglue("%s.%s", filename, board)); + sprintf(MSGID_BUF, "%s$%s@%s", times, hash, MYADDR); + } else { + strncpy(MSGID_BUF, msgid, sizeof MSGID_BUF); + } sover->msgid = MSGID; - sover->date = DATE; - } - else - { - sover->control = CONTROL; - sover->date = DATE_BUF; - DATE = DATE_BUF; - *CONTROL = '\0'; - sprintf(DATE, "%s", ascii_date((mtime))); - if (NEWSFEED == LOCAL && !NoAction) - { - SITE = MYSITE; - PATH = MYBBSID; - GROUPS = group; + if (mtime == -1) { + static char BODY_BUF[MAXBUFLEN]; + + strncpy(BODY_BUF, fileglue("%s\r\n", subject), sizeof BODY_BUF); + BODY = BODY_BUF; + sprintf(SUBJECT_BUF, "cmsg cancel <%s>", MSGID); + SUBJECT = SUBJECT_BUF; + sprintf(CONTROL_BUF, "cancel <%s>", MSGID); + CONTROL = CONTROL_BUF; + strncpy(MSGID_BUF, fileglue("%d.%s", getpid(), MSGID_BUF), sizeof MSGID_BUF); + sprintf(DATE_BUF, "%s", ascii_date(time(NULL))); + DATE = DATE_BUF; + sover->subject = SUBJECT; + sover->control = CONTROL; + sover->msgid = MSGID; + sover->date = DATE; + } else { + sover->control = CONTROL; + sover->date = DATE_BUF; + DATE = DATE_BUF; + *CONTROL = '\0'; + sprintf(DATE, "%s", ascii_date((mtime))); + if (NEWSFEED == LOCAL && !NoAction) { + SITE = MYSITE; + PATH = MYBBSID; + GROUPS = group; #ifndef MapleBBS - echomaillog(); + echomaillog(); #endif + } + BODY = ""; + FD = open(fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename), O_RDONLY); + if (FD < 0) { + if (Verbose) + printf(" !! can't open %s/boards/%c/%s/%s\n", BBSHOME, board[0], board, filename); + else + fprintf(stderr, "can't open %s/boards/%c/%s/%s\n", BBSHOME, board[0], board, filename); + return -1; + } + FD_SIZE = filesize(fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename)); + if (FD_BUF == NULL) { + FD_BUF = (char *)mymalloc(FD_SIZE + 1 + strlen(COMMENT)); + } else { + FD_BUF = (char *)myrealloc(FD_BUF, FD_SIZE + 1 + strlen(COMMENT)); + } + FD_END = FD_BUF + FD_SIZE; + *FD_END = '\0'; + read(FD, FD_BUF, FD_SIZE); + sprintf(FD_END, "%s", COMMENT); + FD_SIZE += strlen(COMMENT); + FD_END += strlen(COMMENT); + if (Verbose) { + printf("<read in> %s/boards/%c/%s/%s\n", BBSHOME, board[0], board, filename); + } + *ORGANIZATION = '\0'; + *NEWSCONTROL = '\0'; + *NEWSAPPROVED = '\0'; + *NNTPHOST_BUF = '\0'; + NNTPHOST = NULL; + + for (buffer = FD_BUF, bufferp = strchr(buffer, '\n'); + buffer && *buffer; bufferp = strchr(buffer, '\n')) { + if (bufferp) + *bufferp = '\0'; + if (*buffer == '\0') { + break; + } + /* printf("get buffer %s\n", buffer); */ + if (NEWSFEED == REMOTE) { + if (strncmp(buffer, "Date: ", 11) == 0) { + strcpy(DATE_BUF, buffer + 11); + DATE = DATE_BUF; + } else if (strncmp(buffer, "發信站: ", 8) == 0) { + char *m, *n; + + m = strchr(buffer, '('); + n = strrchr(buffer, ')'); + if (m && n) { + strncpy(DATE_BUF, m + 1, n - m - 1); + DATE_BUF[n - m - 1] = '\0'; + DATE = DATE_BUF; + strncpy(ORGANIZATION, buffer + 8, m - 8 - buffer - 1); + ORGANIZATION[m - 8 - buffer - 1] = '\0'; + } + } else if (strncmp(buffer, "Control: ", 9) == 0) { + strcpy(NEWSCONTROL, buffer + 9); + } else if (strncmp(buffer, "Approved: ", 10) == 0) { + strcpy(NEWSAPPROVED, buffer + 10); + } else if (strncmp(buffer, "Origin: ", 8) == 0) { + strcpy(NNTPHOST_BUF, buffer + 8); + NNTPHOST = NNTPHOST_BUF; + } + } + if (bufferp) { + *bufferp = '\n'; + buffer = bufferp + 1; + } else { + break; + } + } + if (bufferp) { + BODY = bufferp + 1; + } else + BODY = ""; + if (bufferp) + for (buffer = bufferp + 1, bufferp = strchr(buffer, '\n'); + buffer && *buffer; bufferp = strchr(buffer, '\n')) { + if (bufferp) + *bufferp = '\0'; + /* printf("get line (%s)\n", buffer); */ + /* + * if( strcmp(buffer,".")==0 ) { buffer[1]='.'; + * buffer[2]='\0'; } + */ + if (NEWSFEED == REMOTE && + strncmp(NEWSCONTROL, "cancel", 5) == 0 && + strncmp(buffer, "------------------", 18) == 0) { + break; + } + /* $BODY[ @BODY ] = "$_\r\n"; */ + if (bufferp) { + *bufferp = '\n'; + buffer = bufferp + 1; + } else { + break; + } + } + /* # fprintf("BODY @BODY\n"; */ + close(FD); } - BODY = ""; - FD = open(fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename), O_RDONLY); - if (FD < 0) - { - if (Verbose) - printf(" !! can't open %s/boards/%c/%s/%s\n", BBSHOME, board[0], board, filename); - else - fprintf(stderr, "can't open %s/boards/%c/%s/%s\n", BBSHOME, board[0], board, filename); - return -1; - } - - FD_SIZE = filesize(fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename)); - if (FD_BUF == NULL) - { - FD_BUF = (char *) mymalloc(FD_SIZE + 1 + strlen(COMMENT)); - } - else - { - FD_BUF = (char *) myrealloc(FD_BUF, FD_SIZE + 1 + strlen(COMMENT)); - } - FD_END = FD_BUF + FD_SIZE; - *FD_END = '\0'; - read(FD, FD_BUF, FD_SIZE); - sprintf(FD_END, "%s", COMMENT); - FD_SIZE += strlen(COMMENT); - FD_END += strlen(COMMENT); - if (Verbose) - { - printf("<read in> %s/boards/%c/%s/%s\n", BBSHOME, board[0], board, filename); - } - - *ORGANIZATION = '\0'; - *NEWSCONTROL = '\0'; - *NEWSAPPROVED = '\0'; - *NNTPHOST_BUF = '\0'; - NNTPHOST = NULL; - - for (buffer = FD_BUF, bufferp = strchr(buffer, '\n'); - buffer && *buffer; bufferp = strchr(buffer, '\n')) - { - if (bufferp) - *bufferp = '\0'; - if (*buffer == '\0') - { - break; - } - /* printf("get buffer %s\n", buffer); */ - if (NEWSFEED == REMOTE) - { - if (strncmp(buffer, "Date: ", 11) == 0) - { - strcpy(DATE_BUF, buffer + 11); - DATE = DATE_BUF; - } - else if (strncmp(buffer, "發信站: ", 8) == 0) - { - char *m, *n; - - m = strchr(buffer, '('); - n = strrchr(buffer, ')'); - if (m && n) - { - strncpy(DATE_BUF, m + 1, n - m - 1); - DATE_BUF[n - m - 1] = '\0'; - DATE = DATE_BUF; - strncpy(ORGANIZATION, buffer + 8, m - 8 - buffer - 1); - ORGANIZATION[m - 8 - buffer - 1] = '\0'; - } - } - else if (strncmp(buffer, "Control: ", 9) == 0) - { - strcpy(NEWSCONTROL, buffer + 9); - } - else if (strncmp(buffer, "Approved: ", 10) == 0) - { - strcpy(NEWSAPPROVED, buffer + 10); - } - else if (strncmp(buffer, "Origin: ", 8) == 0) - { - strcpy(NNTPHOST_BUF, buffer + 8); - NNTPHOST = NNTPHOST_BUF; - } - } - if (bufferp) - { - *bufferp = '\n'; - buffer = bufferp + 1; - } - else - { - break; - } - } - if (bufferp) - { - BODY = bufferp + 1; - } - else - BODY = ""; - if (bufferp) - for (buffer = bufferp + 1, bufferp = strchr(buffer, '\n'); - buffer && *buffer; bufferp = strchr(buffer, '\n')) - { - if (bufferp) - *bufferp = '\0'; - /* printf("get line (%s)\n", buffer); */ - /* if( strcmp(buffer,".")==0 ) { buffer[1]='.'; buffer[2]='\0'; } */ - if (NEWSFEED == REMOTE && - strncmp(NEWSCONTROL, "cancel", 5) == 0 && - strncmp(buffer, "------------------", 18) == 0) - { - break; - } - /* $BODY[ @BODY ] = "$_\r\n"; */ - if (bufferp) - { - *bufferp = '\n'; - buffer = bufferp + 1; - } - else - { - break; - } - } - /* # fprintf("BODY @BODY\n"; */ - close(FD); - } - return 0; + return 0; } #ifdef TEST #endif openfeed(node) - nodelist_t *node; + nodelist_t *node; { - if (node->feedfp == NULL) - { - node->feedfp = fopen(fileglue("%s/%s.link", INNDHOME, node->node), "a"); - } + if (node->feedfp == NULL) { + node->feedfp = fopen(fileglue("%s/%s.link", INNDHOME, node->node), "a"); + } } queuefeed(node, textline) - nodelist_t *node; - char *textline; + nodelist_t *node; + char *textline; { - openfeed(node); - if (node->feedfp != NULL) - { - flock(fileno(node->feedfp), LOCK_EX); - fprintf(node->feedfp, "%s", textline); - fflush(node->feedfp); - flock(fileno(node->feedfp), LOCK_UN); - } + openfeed(node); + if (node->feedfp != NULL) { + flock(fileno(node->feedfp), LOCK_EX); + fprintf(node->feedfp, "%s", textline); + fflush(node->feedfp); + flock(fileno(node->feedfp), LOCK_UN); + } } post_article(node, site, sover, textline) - nodelist_t *node; - char *site; - soverview_t *sover; - char *textline; + nodelist_t *node; + char *site; + soverview_t *sover; + char *textline; { - int status; - char *filename = sover->filename; - char *msgid = sover->msgid; - char *board = sover->board; - char *bodyp, *body; - - if (Verbose) - fprintf(stdout, "<post_article> %s %s %s\n", site, filename, msgid); - if (NoAction && Verbose) - { - printf(" ==>%s\n", sover->path); - printf(" ==>%s:%s\n", sover->from, sover->group); - printf(" ==>%s:%s\n", sover->subject, sover->date); - body = BODY; - bodyp = strchr(body, '\n'); - if (bodyp) - *bodyp = '\0'; - printf(" ==>%s\n", body); - if (bodyp) - *bodyp = '\n'; - if (bodyp) - { - body = bodyp + 1; - bodyp = strchr(body, '\n'); - if (bodyp) - *bodyp = '\0'; - printf(" ==>%s\n", body); - if (bodyp) - *bodyp = '\n'; - } - } - if (NoAction) - return 1; - if (NEWSFEED == REMOTE) - { - fprintf(NNTPwfp, "Path: %s\r\n", sover->path); - fprintf(NNTPwfp, "From: %s\r\n", sover->from); - fprintf(NNTPwfp, "Newsgroups: %s\r\n", sover->group); - fprintf(NNTPwfp, "Subject: %s\r\n", sover->subject); - /* # fprintf( NNTPwfp,"Post with subject ($subject)\n"); */ - fprintf(NNTPwfp, "Date: %s\r\n", sover->date); - if (*ORGANIZATION) - fprintf(NNTPwfp, "Organization: %s\r\n", ORGANIZATION); - fprintf(NNTPwfp, "Message-ID: <%s>\r\n", sover->msgid); - if (*NEWSCONTROL) - fprintf(NNTPwfp, "Control: %s\r\n", NEWSCONTROL); - if (*NEWSAPPROVED) - fprintf(NNTPwfp, "Approved: %s\r\n", NEWSAPPROVED); - } - else - { - fprintf(NNTPwfp, "Path: %s\r\n", MYBBSID); - fprintf(NNTPwfp, "From: %s\r\n", sover->from); - fprintf(NNTPwfp, "Newsgroups: %s\r\n", sover->group); - fprintf(NNTPwfp, "Subject: %s\r\n", sover->subject); - fprintf(NNTPwfp, "Date: %s\r\n", sover->date); - fprintf(NNTPwfp, "Organization: %s\r\n", MYSITE); - fprintf(NNTPwfp, "Message-ID: <%s>\r\n", sover->msgid); - fprintf(NNTPwfp, "X-Filename: %s/%s\r\n", sover->board, sover->filename); - } - if (NNTPHOST && *NNTPHOST && USEIHAVE) - fprintf(NNTPwfp, "NNTP-Posting-Host: %s\r\n", NNTPHOST); - else if (NNTPHOST && *NNTPHOST) - fprintf(NNTPwfp, "X-Auth-From: %s\r\n", NNTPHOST); - if (*CONTROL) - { - fprintf(NNTPwfp, "Control: %s\r\n", CONTROL); - } - fputs("\r\n", NNTPwfp); - for (body = BODY, bodyp = strchr(body, '\n'); - body && *body; bodyp = strchr(body, '\n')) - { - if (bodyp) - *bodyp = '\0'; - - fputs(body, NNTPwfp); - if (body[0] == '.' && body[1] == '\0') - fputs(".", NNTPwfp); - fputs("\r\n", NNTPwfp); - if (bodyp) - { - *bodyp = '\n'; - body = bodyp + 1; - } - else - { - break; - } - } - /* print "send out @BODY\n"; */ - status = tcpcommand("."); - /* 435 duplicated article 437 invalid header */ - - if (USEIHAVE) - { - if (status == 235) - { - if (NEWSFEED == LOCAL) - { - bbslog("Sendout <%s> from %s/%s\n", msgid, board, filename); - } - } - else if (status == 437 || status == 435) - { - bbslog("<bbslink> :Warn: %d %s <%s>\n", status, (char *) tcpmessage(), msgid); - if (Verbose) - printf(":Warn: %d %s <%s>\n", status, (char *) tcpmessage(), msgid); - return 0; - } - else - { - bbslog("<bbslink> :Err: %d %s of <%s>\n", status, (char *) tcpmessage(), msgid); - if (Verbose) - printf(":Err: %d %s of <%s>\n", status, (char *) tcpmessage(), msgid); - queuefeed(node, textline); - return 0; + int status; + char *filename = sover->filename; + char *msgid = sover->msgid; + char *board = sover->board; + char *bodyp, *body; + + if (Verbose) + fprintf(stdout, "<post_article> %s %s %s\n", site, filename, msgid); + if (NoAction && Verbose) { + printf(" ==>%s\n", sover->path); + printf(" ==>%s:%s\n", sover->from, sover->group); + printf(" ==>%s:%s\n", sover->subject, sover->date); + body = BODY; + bodyp = strchr(body, '\n'); + if (bodyp) + *bodyp = '\0'; + printf(" ==>%s\n", body); + if (bodyp) + *bodyp = '\n'; + if (bodyp) { + body = bodyp + 1; + bodyp = strchr(body, '\n'); + if (bodyp) + *bodyp = '\0'; + printf(" ==>%s\n", body); + if (bodyp) + *bodyp = '\n'; + } } - } - else if (USEPOST) - { - if (status == 240) - { - bbslog("Sendout <%s> from %s/%s\n", msgid, board, filename); + if (NoAction) + return 1; + if (NEWSFEED == REMOTE) { + fprintf(NNTPwfp, "Path: %s\r\n", sover->path); + fprintf(NNTPwfp, "From: %s\r\n", sover->from); + fprintf(NNTPwfp, "Newsgroups: %s\r\n", sover->group); + fprintf(NNTPwfp, "Subject: %s\r\n", sover->subject); + /* # fprintf( NNTPwfp,"Post with subject ($subject)\n"); */ + fprintf(NNTPwfp, "Date: %s\r\n", sover->date); + if (*ORGANIZATION) + fprintf(NNTPwfp, "Organization: %s\r\n", ORGANIZATION); + fprintf(NNTPwfp, "Message-ID: <%s>\r\n", sover->msgid); + if (*NEWSCONTROL) + fprintf(NNTPwfp, "Control: %s\r\n", NEWSCONTROL); + if (*NEWSAPPROVED) + fprintf(NNTPwfp, "Approved: %s\r\n", NEWSAPPROVED); + } else { + fprintf(NNTPwfp, "Path: %s\r\n", MYBBSID); + fprintf(NNTPwfp, "From: %s\r\n", sover->from); + fprintf(NNTPwfp, "Newsgroups: %s\r\n", sover->group); + fprintf(NNTPwfp, "Subject: %s\r\n", sover->subject); + fprintf(NNTPwfp, "Date: %s\r\n", sover->date); + fprintf(NNTPwfp, "Organization: %s\r\n", MYSITE); + fprintf(NNTPwfp, "Message-ID: <%s>\r\n", sover->msgid); + fprintf(NNTPwfp, "X-Filename: %s/%s\r\n", sover->board, sover->filename); } - else - { - bbslog("<bbslink> :Err: %d %s of <%s>\n", status, (char *) tcpmessage(), msgid); - queuefeed(node, textline); - return 0; + if (NNTPHOST && *NNTPHOST && USEIHAVE) + fprintf(NNTPwfp, "NNTP-Posting-Host: %s\r\n", NNTPHOST); + else if (NNTPHOST && *NNTPHOST) + fprintf(NNTPwfp, "X-Auth-From: %s\r\n", NNTPHOST); + if (*CONTROL) { + fprintf(NNTPwfp, "Control: %s\r\n", CONTROL); } - } - else - { - if (status == 250) - { - bbslog("<bbslink> DATA Sendout <%s> from %s/%s\n", msgid, board, filename); - if (Verbose) - printf("<DATA Sendout> <%s> from %s/%s\n", msgid, board, filename); + fputs("\r\n", NNTPwfp); + for (body = BODY, bodyp = strchr(body, '\n'); + body && *body; bodyp = strchr(body, '\n')) { + if (bodyp) + *bodyp = '\0'; + + fputs(body, NNTPwfp); + if (body[0] == '.' && body[1] == '\0') + fputs(".", NNTPwfp); + fputs("\r\n", NNTPwfp); + if (bodyp) { + *bodyp = '\n'; + body = bodyp + 1; + } else { + break; + } } - else - { - bbslog("<bbslink> :Err: %d %s of <%s>\n", status, (char *) tcpmessage(), msgid); - if (Verbose) - printf(":Err: %d %s of <%s>\n", status, (char *) tcpmessage(), msgid); - queuefeed(node, textline); - return 0; + /* print "send out @BODY\n"; */ + status = tcpcommand("."); + /* 435 duplicated article 437 invalid header */ + + if (USEIHAVE) { + if (status == 235) { + if (NEWSFEED == LOCAL) { + bbslog("Sendout <%s> from %s/%s\n", msgid, board, filename); + } + } else if (status == 437 || status == 435) { + bbslog("<bbslink> :Warn: %d %s <%s>\n", status, (char *)tcpmessage(), msgid); + if (Verbose) + printf(":Warn: %d %s <%s>\n", status, (char *)tcpmessage(), msgid); + return 0; + } else { + bbslog("<bbslink> :Err: %d %s of <%s>\n", status, (char *)tcpmessage(), msgid); + if (Verbose) + printf(":Err: %d %s of <%s>\n", status, (char *)tcpmessage(), msgid); + queuefeed(node, textline); + return 0; + } + } else if (USEPOST) { + if (status == 240) { + bbslog("Sendout <%s> from %s/%s\n", msgid, board, filename); + } else { + bbslog("<bbslink> :Err: %d %s of <%s>\n", status, (char *)tcpmessage(), msgid); + queuefeed(node, textline); + return 0; + } + } else { + if (status == 250) { + bbslog("<bbslink> DATA Sendout <%s> from %s/%s\n", msgid, board, filename); + if (Verbose) + printf("<DATA Sendout> <%s> from %s/%s\n", msgid, board, filename); + } else { + bbslog("<bbslink> :Err: %d %s of <%s>\n", status, (char *)tcpmessage(), msgid); + if (Verbose) + printf(":Err: %d %s of <%s>\n", status, (char *)tcpmessage(), msgid); + queuefeed(node, textline); + return 0; + } } - } - return 1; + return 1; } process_cancel(board, filename, userid, nickname, subject) - char *board, *filename, *userid, *nickname, *subject; + char *board, *filename, *userid, *nickname, *subject; { - time_t mtime; - soverview_t sover; - - if (!userid || !*userid) - { - return; - } - mtime = -1; - strncpy(FROM_BUF, fileglue("%s.bbs@%s (%s)", userid, MYADDR, nickname), sizeof FROM_BUF); - FROM = FROM_BUF; - sover.from = FROM; - sover.board = board; - sover.subject = subject; - PATH = MYBBSID; - sover.path = MYBBSID; - /* save_outgoing(&sover, filename, userid, poster, -1); */ - save_outgoing(&sover, filename, userid, userid, -1); + time_t mtime; + soverview_t sover; + + if (!userid || !*userid) { + return; + } + mtime = -1; + strncpy(FROM_BUF, fileglue("%s.bbs@%s (%s)", userid, MYADDR, nickname), sizeof FROM_BUF); + FROM = FROM_BUF; + sover.from = FROM; + sover.board = board; + sover.subject = subject; + PATH = MYBBSID; + sover.path = MYBBSID; + /* save_outgoing(&sover, filename, userid, poster, -1); */ + save_outgoing(&sover, filename, userid, userid, -1); } open_link(hostname, hostprot, hostport) - char *hostname, *hostprot, *hostport; + char *hostname, *hostprot, *hostport; { - USEIHAVE = 1; - USEPOST = 0; - USEDATA = 0; - FEEDTYPE = ' '; - if (Verbose) - printf("<OPEN_link> %s %s %s\n", hostname, hostprot, hostport); - if (strncasecmp(hostprot, "IHAVE", 5) != 0) - { - USEIHAVE = 0; - USEPOST = 1; - if (strncasecmp(hostprot, "POST", 4) == 0) - { - USEPOST = 1; - } - else if (strncasecmp(hostprot, "DATA", 4) == 0) - { - USEPOST = 0; - USEDATA = 1; - } - } - - FEEDTYPE = hostname[0]; - if (!USEDATA) - { - char *atsign; - - if (FEEDTYPE == '-' || FEEDTYPE == '+') - { - hostname = hostname + 1; - } - atsign = strchr(hostname, '@'); - if (atsign != NULL) - { - hostname = atsign + 1; - } - if (!NoAction) - { - if (Verbose) - printf("<inetclient> %s %s\n", hostname, hostport); - if ((NNTP = inetclient(hostname, hostport, "tcp")) < 0) - { - bbslog("<bbslink> :Err: server %s %s error: cant connect\n", hostname, hostport); - if (Verbose) - printf(":Err: server %s %s error: cant connect\n", hostname, hostport); - return 0; - /* exit( 0 ); */ - /* return; */ - } - NNTPrfp = fdopen(NNTP, "r"); - NNTPwfp = fdopen(NNTP, "w"); - fgets(NNTPbuffer, sizeof NNTPbuffer, NNTPrfp); - if (atoi(NNTPbuffer) != 200) - { - bbslog("<bbslink> :Err: server error: %s", NNTPbuffer); - if (Verbose) - printf(":Err: server error: %s", NNTPbuffer); - return 0; - /* exit( 0 ); */ - } - } - else - { - if (Verbose) - printf("<inetclient> %s %s\n", hostname, hostport); - } - } - else - { - if (!NoAction) - { - if (Verbose) - printf("<inetclient> localhost %s\n", hostport); - if ((NNTP = inetclient("localhost", hostport, "tcp")) < 0) - { - bbslog("<bbslink> :Err: server %s port %s error: cant connect\n", hostname, hostport); - if (Verbose) - printf(":Err: server error: cant connect"); - return 0; - /* exit( 0 ); */ - /* return; */ - } - NNTPrfp = fdopen(NNTP, "r"); - NNTPwfp = fdopen(NNTP, "w"); - fgets(NNTPbuffer, sizeof NNTPbuffer, NNTPrfp); - if (strncmp(NNTPbuffer, "220", 3) != 0) - { - bbslog("<bbslink> :Err: server error: %s", NNTPbuffer); - if (Verbose) - printf(":Err: server error: %s", NNTPbuffer); - return 0; - /* exit( 0 ); */ - } - if (strncmp(NNTPbuffer, "220-", 4) == 0) - { - fgets(NNTPbuffer, sizeof NNTPbuffer, NNTPrfp); - } + USEIHAVE = 1; + USEPOST = 0; + USEDATA = 0; + FEEDTYPE = ' '; + if (Verbose) + printf("<OPEN_link> %s %s %s\n", hostname, hostprot, hostport); + if (strncasecmp(hostprot, "IHAVE", 5) != 0) { + USEIHAVE = 0; + USEPOST = 1; + if (strncasecmp(hostprot, "POST", 4) == 0) { + USEPOST = 1; + } else if (strncasecmp(hostprot, "DATA", 4) == 0) { + USEPOST = 0; + USEDATA = 1; + } } - else - { - if (Verbose) - printf("<inetclient> %s %s\n", hostname, hostport); + FEEDTYPE = hostname[0]; + if (!USEDATA) { + char *atsign; + + if (FEEDTYPE == '-' || FEEDTYPE == '+') { + hostname = hostname + 1; + } + atsign = strchr(hostname, '@'); + if (atsign != NULL) { + hostname = atsign + 1; + } + if (!NoAction) { + if (Verbose) + printf("<inetclient> %s %s\n", hostname, hostport); + if ((NNTP = inetclient(hostname, hostport, "tcp")) < 0) { + bbslog("<bbslink> :Err: server %s %s error: cant connect\n", hostname, hostport); + if (Verbose) + printf(":Err: server %s %s error: cant connect\n", hostname, hostport); + return 0; + /* exit( 0 ); */ + /* return; */ + } + NNTPrfp = fdopen(NNTP, "r"); + NNTPwfp = fdopen(NNTP, "w"); + fgets(NNTPbuffer, sizeof NNTPbuffer, NNTPrfp); + if (atoi(NNTPbuffer) != 200) { + bbslog("<bbslink> :Err: server error: %s", NNTPbuffer); + if (Verbose) + printf(":Err: server error: %s", NNTPbuffer); + return 0; + /* exit( 0 ); */ + } + } else { + if (Verbose) + printf("<inetclient> %s %s\n", hostname, hostport); + } + } else { + if (!NoAction) { + if (Verbose) + printf("<inetclient> localhost %s\n", hostport); + if ((NNTP = inetclient("localhost", hostport, "tcp")) < 0) { + bbslog("<bbslink> :Err: server %s port %s error: cant connect\n", hostname, hostport); + if (Verbose) + printf(":Err: server error: cant connect"); + return 0; + /* exit( 0 ); */ + /* return; */ + } + NNTPrfp = fdopen(NNTP, "r"); + NNTPwfp = fdopen(NNTP, "w"); + fgets(NNTPbuffer, sizeof NNTPbuffer, NNTPrfp); + if (strncmp(NNTPbuffer, "220", 3) != 0) { + bbslog("<bbslink> :Err: server error: %s", NNTPbuffer); + if (Verbose) + printf(":Err: server error: %s", NNTPbuffer); + return 0; + /* exit( 0 ); */ + } + if (strncmp(NNTPbuffer, "220-", 4) == 0) { + fgets(NNTPbuffer, sizeof NNTPbuffer, NNTPrfp); + } + } else { + if (Verbose) + printf("<inetclient> %s %s\n", hostname, hostport); + } } - } - return 1; + return 1; } send_outgoing(node, site, hostname, sover, textline) - nodelist_t *node; - soverview_t *sover; - char *hostname, *site; - char *textline; + nodelist_t *node; + soverview_t *sover; + char *hostname, *site; + char *textline; { - int status; - char *board, *filepath, *msgid; - int returnstatus = 0; - - board = sover->board; - filepath = sover->filename; - msgid = sover->msgid; - - if (Verbose) - printf("<send_outgoing> %s:%s:%s:%s\n", site, board, filepath, msgid); - if (BODY != NULL && !NoAction) - { - if (USEIHAVE) - { - status = tcpcommand("IHAVE <%s>", msgid); - if (status == 335) - { - returnstatus = post_article(node, site, sover, textline); - } - else if (status == 435) - { - bbslog("<bbslink> :Warn: %d %s, IHAVE <%s>\n", status, (char *) tcpmessage(), msgid); - if (Verbose) - printf(":Warn: %d %s, IHAVE <%s>\n", status, (char *) tcpmessage(), msgid); - returnstatus = 0; - } - else - { - bbslog("<bbslink> :Err: %d %s, IHAVE <%s>\n", status, (char *) tcpmessage(), msgid); - if (Verbose) - printf(":Err: %d %s, IHAVE <%s>\n", status, (char *) tcpmessage(), msgid); - queuefeed(node, textline); - returnstatus = 0; - } - } - else if (USEPOST) - { - tcpcommand("MODE READER"); - status = tcpcommand("POST"); - if (status == 340) - { - returnstatus = post_article(node, site, sover, textline); - } - else if (status == 441) - { - bbslog("<bbslink> :Warn: %d %s, POST <%s>\n", status, (char *) tcpmessage(), msgid); - if (Verbose) - printf(":Warn: %d %s, POST <%s>\n", status, (char *) tcpmessage(), msgid); - returnstatus = 0; - } - else - { - bbslog("<bbslink> :Err: %d %s, POST <%s>\n", status, (char *) tcpmessage(), msgid); - if (Verbose) - printf(":Err: %d %s, POST <%s>\n", status, (char *) tcpmessage(), msgid); - queuefeed(node, textline); - returnstatus = 0; - } - } - else - { - tcpcommand("HELO"); - tcpcommand("MAIL FROM: bbs"); - tcpcommand("RCPT TO: %s", hostname); - status = tcpcommand("DATA"); - if (status == 354) - { - returnstatus = post_article(node, site, sover, textline); - } - else - { - bbslog("<bbslink> :Err: %d %s, DATA <%s>\n", status, (char *) tcpmessage(), msgid); - if (Verbose) - printf(":Err: %d %s, DATA <%s>\n", status, (char *) tcpmessage(), msgid); - - queuefeed(node, textline); - returnstatus = 0; - } + int status; + char *board, *filepath, *msgid; + int returnstatus = 0; + + board = sover->board; + filepath = sover->filename; + msgid = sover->msgid; + + if (Verbose) + printf("<send_outgoing> %s:%s:%s:%s\n", site, board, filepath, msgid); + if (BODY != NULL && !NoAction) { + if (USEIHAVE) { + status = tcpcommand("IHAVE <%s>", msgid); + if (status == 335) { + returnstatus = post_article(node, site, sover, textline); + } else if (status == 435) { + bbslog("<bbslink> :Warn: %d %s, IHAVE <%s>\n", status, (char *)tcpmessage(), msgid); + if (Verbose) + printf(":Warn: %d %s, IHAVE <%s>\n", status, (char *)tcpmessage(), msgid); + returnstatus = 0; + } else { + bbslog("<bbslink> :Err: %d %s, IHAVE <%s>\n", status, (char *)tcpmessage(), msgid); + if (Verbose) + printf(":Err: %d %s, IHAVE <%s>\n", status, (char *)tcpmessage(), msgid); + queuefeed(node, textline); + returnstatus = 0; + } + } else if (USEPOST) { + tcpcommand("MODE READER"); + status = tcpcommand("POST"); + if (status == 340) { + returnstatus = post_article(node, site, sover, textline); + } else if (status == 441) { + bbslog("<bbslink> :Warn: %d %s, POST <%s>\n", status, (char *)tcpmessage(), msgid); + if (Verbose) + printf(":Warn: %d %s, POST <%s>\n", status, (char *)tcpmessage(), msgid); + returnstatus = 0; + } else { + bbslog("<bbslink> :Err: %d %s, POST <%s>\n", status, (char *)tcpmessage(), msgid); + if (Verbose) + printf(":Err: %d %s, POST <%s>\n", status, (char *)tcpmessage(), msgid); + queuefeed(node, textline); + returnstatus = 0; + } + } else { + tcpcommand("HELO"); + tcpcommand("MAIL FROM: bbs"); + tcpcommand("RCPT TO: %s", hostname); + status = tcpcommand("DATA"); + if (status == 354) { + returnstatus = post_article(node, site, sover, textline); + } else { + bbslog("<bbslink> :Err: %d %s, DATA <%s>\n", status, (char *)tcpmessage(), msgid); + if (Verbose) + printf(":Err: %d %s, DATA <%s>\n", status, (char *)tcpmessage(), msgid); + + queuefeed(node, textline); + returnstatus = 0; + } + } + } else if (NoAction) { + returnstatus = post_article(node, site, sover, textline); } - } - else if (NoAction) - { - returnstatus = post_article(node, site, sover, textline); - } - return returnstatus; + return returnstatus; } save_nntplink(node, overview) - nodelist_t *node; - char *overview; + nodelist_t *node; + char *overview; { - FILE *POSTS; - char buffer[1024]; - - openfeed(node); - POSTS = fopen(overview, "r"); - if (POSTS == NULL) - return 0; - openfeed(node); - /* if (node->feedfp == NULL) return 0; */ - flock(fileno(node->feedfp), LOCK_EX); - while (fgets(buffer, sizeof buffer, POSTS) != NULL) - { - fputs(buffer, node->feedfp); - fflush(node->feedfp); - } - flock(fileno(node->feedfp), LOCK_UN); - fclose(POSTS); - if (Verbose) - printf("<Unlinking> %s\n", overview); - if (!NoAction) - unlink(overview); - return 1; + FILE *POSTS; + char buffer[1024]; + + openfeed(node); + POSTS = fopen(overview, "r"); + if (POSTS == NULL) + return 0; + openfeed(node); + /* if (node->feedfp == NULL) return 0; */ + flock(fileno(node->feedfp), LOCK_EX); + while (fgets(buffer, sizeof buffer, POSTS) != NULL) { + fputs(buffer, node->feedfp); + fflush(node->feedfp); + } + flock(fileno(node->feedfp), LOCK_UN); + fclose(POSTS); + if (Verbose) + printf("<Unlinking> %s\n", overview); + if (!NoAction) + unlink(overview); + return 1; } -char * +char * get_tmpfile(tmpfile) - char *tmpfile; + char *tmpfile; { - FILE *FN; - static char result[256]; - - FN = fopen(tmpfile, "r"); - fgets(result, sizeof result, FN); - fclose(FN); - unlink(tmpfile); - return (result); + FILE *FN; + static char result[256]; + + FN = fopen(tmpfile, "r"); + fgets(result, sizeof result, FN); + fclose(FN); + unlink(tmpfile); + return (result); } /* cancel moderating posts */ cancel_outgoing(board, filename, from, subject) - char *board, *filename, *from, *subject; + char *board, *filename, *from, *subject; { - char *base, filepath[MAXPATHLEN]; - FILE *FN; - char *result; - char TMPFILE[MAXPATHLEN]; - - if (Verbose) - { - printf("<cancel_outgoing> %s %s %s %s\n", board, filename, from, subject); - } - - sprintf(TMPFILE, "/tmp/cancel_outgoing.%d.%d", getuid(), getpid()); - - bbslog("<cancel_outgoing> Try to move moderated post from %s to deleted\n", board); - if (Verbose) - printf("Try to move moderated post from %s to deleted\n", board); - FN = popen(fileglue("%s/bbspost post %s/boards/d/deleted > %s", - INNDHOME, BBSHOME, TMPFILE), "w"); - if (FN == NULL) - { - bbslog("<cancel_outgoing> can't run %s/bbspost\n", INNDHOME); - if (Verbose) - printf("<cancel_outgoing> can't run %s/bbspost\n", INNDHOME); - return 0; - } - fprintf(FN, "%s\n", from); - fprintf(FN, "%s\n", subject); - fprintf(FN, "發信人: %s, 信區: %s\n", from, board); - fprintf(FN, "標 題: %s\n", subject); - fprintf(FN, "發信站: %s (%s)\n", MYSITE, DATE); - fprintf(FN, "轉信站: %s\n", MYBBSID); - fputs("\n", FN); - fputs(BODY, FN); - pclose(FN); - result = (char *) get_tmpfile(TMPFILE); - if (strncmp(result, "post to ", 8) == 0) - { - /* try to remove it */ - strncpy(filepath, fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename), sizeof filepath); - if (isfile(filepath)) - { - Rename(filepath, fileglue("%s.cancel", filepath)); + char *base, filepath[MAXPATHLEN]; + FILE *FN; + char *result; + char TMPFILE[MAXPATHLEN]; + + if (Verbose) { + printf("<cancel_outgoing> %s %s %s %s\n", board, filename, from, subject); } - FN = fopen(filepath, "w"); + sprintf(TMPFILE, "/tmp/cancel_outgoing.%d.%d", getuid(), getpid()); + bbslog("<cancel_outgoing> Try to move moderated post from %s to deleted\n", board); + if (Verbose) + printf("Try to move moderated post from %s to deleted\n", board); + FN = popen(fileglue("%s/bbspost post %s/boards/d/deleted > %s", + INNDHOME, BBSHOME, TMPFILE), "w"); + if (FN == NULL) { + bbslog("<cancel_outgoing> can't run %s/bbspost\n", INNDHOME); + if (Verbose) + printf("<cancel_outgoing> can't run %s/bbspost\n", INNDHOME); + return 0; + } + fprintf(FN, "%s\n", from); + fprintf(FN, "%s\n", subject); fprintf(FN, "發信人: %s, 信區: %s\n", from, board); - fprintf(FN, "標 題: <article cancelled and mailed to the moderator\n"); + fprintf(FN, "標 題: %s\n", subject); fprintf(FN, "發信站: %s (%s)\n", MYSITE, DATE); fprintf(FN, "轉信站: %s\n", MYBBSID); - fprintf(FN, "\n"); - fputs("\n", FN); - fprintf(FN, "你的文章 \"%s\" 已經送往審核中. 請等待回覆.\n", subject); fputs("\n", FN); - fputs("Your post has been sent to the moderator and move\n", FN); - fputs("into the deleted board. If the post accepted by the moderator,\n", FN); - fputs("it will be posted in this board again. Please wait.\n", FN); - - } - else - { - bbslog("%s", result); - } - - bbslog("%s/bbspost cancel %s %s %s moderate\n", INNDHOME, BBSHOME, board, filename); - if (Verbose) - printf("%s/bbspost cancel %s %s %s moderate\n", INNDHOME, BBSHOME, board, filename); - system(fileglue("%s/bbspost cancel %s %s %s moderate", - INNDHOME, BBSHOME, board, filename)); - return 1; + fputs(BODY, FN); + pclose(FN); + result = (char *)get_tmpfile(TMPFILE); + if (strncmp(result, "post to ", 8) == 0) { + /* try to remove it */ + strncpy(filepath, fileglue("%s/boards/%c/%s/%s", BBSHOME, board[0], board, filename), sizeof filepath); + if (isfile(filepath)) { + Rename(filepath, fileglue("%s.cancel", filepath)); + } + FN = fopen(filepath, "w"); + + fprintf(FN, "發信人: %s, 信區: %s\n", from, board); + fprintf(FN, "標 題: <article cancelled and mailed to the moderator\n"); + fprintf(FN, "發信站: %s (%s)\n", MYSITE, DATE); + fprintf(FN, "轉信站: %s\n", MYBBSID); + fprintf(FN, "\n"); + fputs("\n", FN); + fprintf(FN, "你的文章 \"%s\" 已經送往審核中. 請等待回覆.\n", subject); + fputs("\n", FN); + fputs("Your post has been sent to the moderator and move\n", FN); + fputs("into the deleted board. If the post accepted by the moderator,\n", FN); + fputs("it will be posted in this board again. Please wait.\n", FN); + + } else { + bbslog("%s", result); + } + + bbslog("%s/bbspost cancel %s %s %s moderate\n", INNDHOME, BBSHOME, board, filename); + if (Verbose) + printf("%s/bbspost cancel %s %s %s moderate\n", INNDHOME, BBSHOME, board, filename); + system(fileglue("%s/bbspost cancel %s %s %s moderate", + INNDHOME, BBSHOME, board, filename)); + return 1; } /* @@ -1307,710 +1136,643 @@ cancel_outgoing(board, filename, from, subject) * cancel_outgoing */ send_nntplink(node, site, hostname, hostprot, hostport, overview, nlcount) - nodelist_t *node; - char *site, *hostname, *hostprot, *hostport, *overview; - int nlcount; + nodelist_t *node; + char *site, *hostname, *hostprot, *hostport, *overview; + int nlcount; { - FILE *POSTS; - char textline[1024]; - char baktextline[1024]; - char *filepath; - int status; - - if (Verbose) - { - printf("<send nntplink> %s %s %s %s\n", site, hostname, hostprot, hostport); - printf(" ==> %s\n", overview); - } - if (!open_link(hostname, hostprot, hostport)) - { - save_nntplink(node, overview); - return 0; - } - POSTS = fopen(overview, "r"); - if (POSTS == NULL) - { - if (Verbose) - printf("open %s failed\n", overview); - return 0; - } - while (fgets(textline, sizeof textline, POSTS) != NULL) - { - char *linebreak = strchr(textline, '\n'); - char *ptr; - char *board, *filename, *subject, *group, *mtime, *from; - char *outgoingtype; - char *msgid, *path; - soverview_t soverview; - - strcpy(baktextline, textline); - if (linebreak) - *linebreak = '\0'; - - board = "", filename = "", mtime = "", group = "", from = "", subject = ""; - outgoingtype = "", msgid = "", path = ""; - /* get board field */ - board = textline; - ptr = strchr(textline, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* filename field */ - filename = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* group field */ - group = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* mtime field */ - mtime = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* from field */ - from = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* subject */ - subject = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - goto try_read_outgoing; - *ptr++ = '\0'; - - /* outgoing type field */ - outgoingtype = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - goto try_read_outgoing; - *ptr++ = '\0'; - - /* msgid */ - msgid = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - goto try_read_outgoing; - *ptr++ = '\0'; - - /* path */ - path = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - goto try_read_outgoing; + FILE *POSTS; + char textline[1024]; + char baktextline[1024]; + char *filepath; + int status; + + if (Verbose) { + printf("<send nntplink> %s %s %s %s\n", site, hostname, hostprot, hostport); + printf(" ==> %s\n", overview); + } + if (!open_link(hostname, hostprot, hostport)) { + save_nntplink(node, overview); + return 0; + } + POSTS = fopen(overview, "r"); + if (POSTS == NULL) { + if (Verbose) + printf("open %s failed\n", overview); + return 0; + } + while (fgets(textline, sizeof textline, POSTS) != NULL) { + char *linebreak = strchr(textline, '\n'); + char *ptr; + char *board, *filename, *subject, *group, *mtime, *from; + char *outgoingtype; + char *msgid, *path; + soverview_t soverview; + + strcpy(baktextline, textline); + if (linebreak) + *linebreak = '\0'; + + board = "", filename = "", mtime = "", group = "", from = "", subject = ""; + outgoingtype = "", msgid = "", path = ""; + /* get board field */ + board = textline; + ptr = strchr(textline, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* filename field */ + filename = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* group field */ + group = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* mtime field */ + mtime = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* from field */ + from = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* subject */ + subject = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + goto try_read_outgoing; + *ptr++ = '\0'; + + /* outgoing type field */ + outgoingtype = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + goto try_read_outgoing; + *ptr++ = '\0'; + + /* msgid */ + msgid = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + goto try_read_outgoing; + *ptr++ = '\0'; + + /* path */ + path = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + goto try_read_outgoing; try_read_outgoing: - NEWSFEED = LOCAL; - if (outgoingtype && msgid && path && *outgoingtype && *msgid && *path) - { - char *left, *right; - - NEWSFEED = REMOTE; - left = strchr(msgid, '<'); - right = strrchr(msgid, '>'); - if (left) - msgid = left + 1; - if (right) - *right = '\0'; + NEWSFEED = LOCAL; + if (outgoingtype && msgid && path && *outgoingtype && *msgid && *path) { + char *left, *right; + + NEWSFEED = REMOTE; + left = strchr(msgid, '<'); + right = strrchr(msgid, '>'); + if (left) + msgid = left + 1; + if (right) + *right = '\0'; + } + soverview.board = board; + soverview.filename = filename; + soverview.group = group; + soverview.mtime = atol(mtime); + soverview.from = from; + soverview.subject = subject; + soverview.outgoingtype = outgoingtype; + soverview.msgid = msgid; + soverview.path = path; + if (read_outgoing(&soverview) == 0) { + int sendresult = send_outgoing(node, site, hostname, &soverview, baktextline); + int sendfailed = 1 - sendresult; + + if (NEWSFEED == REMOTE) { + BBSLINK_STAT[nlcount].remotesendout += sendresult; + BBSLINK_STAT[nlcount].remotefailed += sendfailed; + } else { + BBSLINK_STAT[nlcount].localsendout += sendresult; + BBSLINK_STAT[nlcount].localfailed += sendfailed; + } + if (node->feedtype == '-') { + if (!NoAction && sendresult) + cancel_outgoing(board, filename, from, subject); + } + } } - soverview.board = board; - soverview.filename = filename; - soverview.group = group; - soverview.mtime = atol(mtime); - soverview.from = from; - soverview.subject = subject; - soverview.outgoingtype = outgoingtype; - soverview.msgid = msgid; - soverview.path = path; - if (read_outgoing(&soverview) == 0) - { - int sendresult = send_outgoing(node, site, hostname, &soverview, baktextline); - int sendfailed = 1 - sendresult; - - if (NEWSFEED == REMOTE) - { - BBSLINK_STAT[nlcount].remotesendout += sendresult; - BBSLINK_STAT[nlcount].remotefailed += sendfailed; - } - else - { - BBSLINK_STAT[nlcount].localsendout += sendresult; - BBSLINK_STAT[nlcount].localfailed += sendfailed; - } - if (node->feedtype == '-') - { - if (!NoAction && sendresult) - cancel_outgoing(board, filename, from, subject); - } - } - } - fclose(POSTS); - close_link(); - if (Verbose) - printf("<Unlinking> %s\n", overview); - if (!NoAction) - unlink(overview); + fclose(POSTS); + close_link(); + if (Verbose) + printf("<Unlinking> %s\n", overview); + if (!NoAction) + unlink(overview); } close_link() { - int status; - - if (Verbose) - printf("<close_link>\n"); - if (NoAction) - return; - status = tcpcommand("QUIT"); - if (status != 205 && status != 221) - { - bbslog("<bbslink> :Err: Cannot quit message '%d %s'\n", status, (char *) tcpmessage()); + int status; + if (Verbose) - printf(":Err: Cannot quit message '%d %s'\n", status, (char *) tcpmessage()); - } - fclose(NNTPwfp); - fclose(NNTPrfp); - close(NNTP); + printf("<close_link>\n"); + if (NoAction) + return; + status = tcpcommand("QUIT"); + if (status != 205 && status != 221) { + bbslog("<bbslink> :Err: Cannot quit message '%d %s'\n", status, (char *)tcpmessage()); + if (Verbose) + printf(":Err: Cannot quit message '%d %s'\n", status, (char *)tcpmessage()); + } + fclose(NNTPwfp); + fclose(NNTPrfp); + close(NNTP); } /* * send_article() send_nntplink() read_outgoing() - * + * */ send_article() { - char *site, *addr, *protocol, *port, *op; - char *nntphost; - int nlcount; - - chdir(INNDHOME); - - for (nlcount = 0; nlcount < NLCOUNT; nlcount++) - { - nodelist_t *node; - char linkfile[MAXPATHLEN]; - char sendfile[MAXPATHLEN]; - char feedfile[MAXPATHLEN]; - char feedingfile[MAXPATHLEN]; - char protocol[MAXBUFLEN], port[MAXBUFLEN]; - - node = NODELIST + nlcount; - site = node->node; - nntphost = node->host; - op = node->protocol; - - if (DefaultFeedSite && *DefaultFeedSite) - { - if (strcmp(node->node, DefaultFeedSite) != 0) - continue; - } - - if (op && (strncasecmp(op, "ihave", 5) == 0 || - strncasecmp(op, "post", 4) == 0 || - strncasecmp(op, "data", 4) == 0)) - { - char *left, *right; - - left = strchr(op, '('), right = strrchr(op, ')'); - if (left && right) - { - *left = '\0'; - *right = '\0'; - strncpy(protocol, op, sizeof protocol); - strncpy(port, left + 1, sizeof port); - *left = '('; - *right = ')'; - } - else - { - strncpy(protocol, op, sizeof protocol); - strncpy(port, "nntp", sizeof port); - } + char *site, *addr, *protocol, *port, *op; + char *nntphost; + int nlcount; + + chdir(INNDHOME); + + for (nlcount = 0; nlcount < NLCOUNT; nlcount++) { + nodelist_t *node; + char linkfile[MAXPATHLEN]; + char sendfile[MAXPATHLEN]; + char feedfile[MAXPATHLEN]; + char feedingfile[MAXPATHLEN]; + char protocol[MAXBUFLEN], port[MAXBUFLEN]; + + node = NODELIST + nlcount; + site = node->node; + nntphost = node->host; + op = node->protocol; + + if (DefaultFeedSite && *DefaultFeedSite) { + if (strcmp(node->node, DefaultFeedSite) != 0) + continue; + } + if (op && (strncasecmp(op, "ihave", 5) == 0 || + strncasecmp(op, "post", 4) == 0 || + strncasecmp(op, "data", 4) == 0)) { + char *left, *right; + + left = strchr(op, '('), right = strrchr(op, ')'); + if (left && right) { + *left = '\0'; + *right = '\0'; + strncpy(protocol, op, sizeof protocol); + strncpy(port, left + 1, sizeof port); + *left = '('; + *right = ')'; + } else { + strncpy(protocol, op, sizeof protocol); + strncpy(port, "nntp", sizeof port); + } + } else { + strcpy(protocol, "IHAVE"); + strcpy(port, "nntp"); + } + sprintf(linkfile, "%s.link", site); + sprintf(sendfile, "%s.sending", site); + sprintf(feedfile, "%s.feed", site); + sprintf(feedingfile, "%s.feeding", site); + if (isfile(sendfile) && !iszerofile(sendfile)) { + if (bbslink_get_lock(sendfile)) { + send_nntplink(node, site, nntphost, protocol, port, sendfile, nlcount); + bbslink_un_lock(sendfile); + } + } + if (isfile(linkfile) && !iszerofile(linkfile)) { + if (!NoAction) { + if (bbslink_get_lock(sendfile) && bbslink_get_lock(linkfile) && + bbslink_get_lock(feedingfile)) { + if (isfile(sendfile) && !iszerofile(sendfile)) { + save_nntplink(node, sendfile); + } + if (node->feedfp) { + fclose(node->feedfp); + node->feedfp = NULL; + } + Rename(linkfile, sendfile); + send_nntplink(node, site, nntphost, protocol, port, sendfile, nlcount); + bbslink_un_lock(linkfile); + bbslink_un_lock(sendfile); + bbslink_un_lock(feedingfile); + } + } else { + send_nntplink(node, site, nntphost, protocol, port, linkfile, nlcount); + } + } + if (isfile(feedingfile) && !iszerofile(feedingfile)) { + if (bbslink_get_lock(feedingfile)) { + send_nntplink(node, site, nntphost, protocol, port, feedingfile, nlcount); + bbslink_un_lock(feedingfile); + } + } + if (isfile(feedfile) && !iszerofile(feedfile)) { + if (!NoAction) { + if (bbslink_get_lock(feedfile) && bbslink_get_lock(feedingfile)) { + if (isfile(feedingfile) && !iszerofile(feedingfile)) { + save_nntplink(node, feedingfile); + if (node->feedfp) { + fclose(node->feedfp); + node->feedfp = NULL; + } + } + Rename(feedfile, feedingfile); + system(fileglue("%s/ctlinnbbsd reload > /dev/null", INNDHOME)); + send_nntplink(node, site, nntphost, protocol, port, feedingfile, nlcount); + bbslink_un_lock(feedfile); + bbslink_un_lock(feedingfile); + } + } else { + send_nntplink(node, site, nntphost, protocol, port, feedfile, nlcount); + } + } } - else - { - strcpy(protocol, "IHAVE"); - strcpy(port, "nntp"); - } - sprintf(linkfile, "%s.link", site); - sprintf(sendfile, "%s.sending", site); - sprintf(feedfile, "%s.feed", site); - sprintf(feedingfile, "%s.feeding", site); - if (isfile(sendfile) && !iszerofile(sendfile)) - { - if (bbslink_get_lock(sendfile)) - { - send_nntplink(node, site, nntphost, protocol, port, sendfile, nlcount); - bbslink_un_lock(sendfile); - } - } - if (isfile(linkfile) && !iszerofile(linkfile)) - { - if (!NoAction) - { - if (bbslink_get_lock(sendfile) && bbslink_get_lock(linkfile) && - bbslink_get_lock(feedingfile)) - { - if (isfile(sendfile) && !iszerofile(sendfile)) - { - save_nntplink(node, sendfile); - } - if (node->feedfp) - { - fclose(node->feedfp); - node->feedfp = NULL; - } - Rename(linkfile, sendfile); - send_nntplink(node, site, nntphost, protocol, port, sendfile, nlcount); - bbslink_un_lock(linkfile); - bbslink_un_lock(sendfile); - bbslink_un_lock(feedingfile); - } - } - else - { - send_nntplink(node, site, nntphost, protocol, port, linkfile, nlcount); - } - } - if (isfile(feedingfile) && !iszerofile(feedingfile)) - { - if (bbslink_get_lock(feedingfile)) - { - send_nntplink(node, site, nntphost, protocol, port, feedingfile, nlcount); - bbslink_un_lock(feedingfile); - } - } - if (isfile(feedfile) && !iszerofile(feedfile)) - { - if (!NoAction) - { - if (bbslink_get_lock(feedfile) && bbslink_get_lock(feedingfile)) - { - if (isfile(feedingfile) && !iszerofile(feedingfile)) - { - save_nntplink(node, feedingfile); - if (node->feedfp) - { - fclose(node->feedfp); - node->feedfp = NULL; - } - } - Rename(feedfile, feedingfile); - system(fileglue("%s/ctlinnbbsd reload > /dev/null", INNDHOME)); - send_nntplink(node, site, nntphost, protocol, port, feedingfile, nlcount); - bbslink_un_lock(feedfile); - bbslink_un_lock(feedingfile); - } - } - else - { - send_nntplink(node, site, nntphost, protocol, port, feedfile, nlcount); - } - } - } } /* bntplink() bbspost() process_article() process_cancel() send_article() */ show_usage(argv) - char *argv; + char *argv; { - fprintf(stderr, "%s initialization failed or improper options !!\n", argv); -/* -woju -*/ - fprintf(stderr, "Usage: %s [options] bbs_home board\n", argv); - fprintf(stderr, " -v (show transmission status)\n"); - fprintf(stderr, " -n (dont send out articles and leave queue untouched)\n"); - fprintf(stderr, " -s site (only process articles sent to site)\n"); - fprintf(stderr, " -V (visit only: bbspost visit)\n"); - fprintf(stderr, " -N (no visit, and only process batch queue)\n"); - fprintf(stderr, " -k (kill the former bbslink process before started)\n\n"); - fprintf(stderr, "本程式要正常執行必須將以下檔案置於 %s/innd 下:\n", BBSHOME); - fprintf(stderr, "bbsname.bbs 設定貴站的 BBS ID (請儘量簡短)\n"); - fprintf(stderr, "nodelist.bbs 設定網路各 BBS 站的 ID, Address 和 fullname\n"); - fprintf(stderr, "newsfeeds.bbs 設定網路信件的 newsgroup board nodelist ...\n"); + fprintf(stderr, "%s initialization failed or improper options !!\n", argv); + /* + * woju + */ + fprintf(stderr, "Usage: %s [options] bbs_home board\n", argv); + fprintf(stderr, " -v (show transmission status)\n"); + fprintf(stderr, " -n (dont send out articles and leave queue untouched)\n"); + fprintf(stderr, " -s site (only process articles sent to site)\n"); + fprintf(stderr, " -V (visit only: bbspost visit)\n"); + fprintf(stderr, " -N (no visit, and only process batch queue)\n"); + fprintf(stderr, " -k (kill the former bbslink process before started)\n\n"); + fprintf(stderr, "本程式要正常執行必須將以下檔案置於 %s/innd 下:\n", BBSHOME); + fprintf(stderr, "bbsname.bbs 設定貴站的 BBS ID (請儘量簡短)\n"); + fprintf(stderr, "nodelist.bbs 設定網路各 BBS 站的 ID, Address 和 fullname\n"); + fprintf(stderr, "newsfeeds.bbs 設定網路信件的 newsgroup board nodelist ...\n"); } /* -woju -*/ -struct fileheader -{ - char filename[33]; /* M.9876543210.A */ - char savemode; /* file save mode */ - char owner[12 + 2]; /* uid[.] */ - char date[6]; /* [02/02] or space(5) */ - char title[72+ 1]; - unsigned char filemode; /* must be last field @ boards.c */ + * woju + */ +struct fileheader { + char filename[33]; /* M.9876543210.A */ + char savemode; /* file save mode */ + char owner[12 + 2]; /* uid[.] */ + char date[6]; /* [02/02] or space(5) */ + char title[72 + 1]; + unsigned char filemode; /* must be last field @ boards.c */ }; typedef struct fileheader fileheader; bntplink(argc, argv) - int argc; - char **argv; + int argc; + char **argv; { -/* -woju - static char *OUTING = ".outing"; -*/ - static char OUTING[MAXPATHLEN]; - fileheader fhdr; - char *fname, *s1, *s2; - char nick[100]; - FILE* fp; - - nodelist_t *nl; - int linkport; - char result[4096]; - char cancelfile[MAXPATHLEN], cancelpost[MAXPATHLEN]; - char bbslink_lockfile[MAXPATHLEN]; - FILE *NEWPOST; - char *left, *right; - int nlcount; - - strcpy(BBSHOME, argv[0]); -/* -woju -*/ - sprintf(OUTING, "%s/boards/%c/%s/", BBSHOME, argv[1][0], argv[1]); - fname = OUTING + strlen(OUTING); - - if (initial_bbs("link") == 0) - { - return -1; - } - - BBSLINK_STAT = (stat_t *) malloc(sizeof(stat_t) * (NLCOUNT + 1)); - for (nlcount = 0; nlcount < NLCOUNT; nlcount++) - { - BBSLINK_STAT[nlcount].localsendout = 0; - BBSLINK_STAT[nlcount].remotesendout = 0; - BBSLINK_STAT[nlcount].localfailed = 0; - BBSLINK_STAT[nlcount].remotefailed = 0; - } - - nl = (nodelist_t *) search_nodelist_bynode(MYBBSID); - if (nl == NULL) - { - *MYADDR = '\0'; - *MYSITE = '\0'; - *LINKPROTOCOL = '\0'; - } - else - { - strncpy(MYADDR, nl->host, sizeof MYADDR); - strncpy(LINKPROTOCOL, nl->protocol, sizeof LINKPROTOCOL); - strncpy(MYSITE, nl->comments, sizeof MYSITE); - } - if (Verbose) - { - printf("MYADDR: %s\n", MYADDR); - printf("MYSITE: %s\n", MYSITE); - } - left = strchr(nl->protocol, '('); - right = strrchr(nl->protocol, ')'); - if (left && right) - { - *right = '\0'; - strncpy(LINKPROTOCOL, nl->protocol, sizeof LINKPROTOCOL); - LINKPORT = atoi(left + 1); - *right = ')'; - } - - if (!NoVisit) - { - sprintf(bbslink_lockfile, "%s/.bbslink.visit", INNDHOME); -/* -woju - if (!Rename(fileglue("%s/out.bntp", INNDHOME), OUTING) && bbslink_get_lock(bbslink_lockfile)) -*/ - if (strcpy(fname, ".DIR")) - { - /* When try to visit new post, try to lock it */ - NEWPOST = fopen(OUTING, "r"); - if (NEWPOST == NULL) - { - bbslog("<bbslink> Err: can't open %s\n", OUTING); -/* -woju - bbslink_un_lock(bbslink_lockfile); -*/ - return -1; - } + /* + * woju static char *OUTING = ".outing"; + */ + static char OUTING[MAXPATHLEN]; + fileheader fhdr; + char *fname, *s1, *s2; + char nick[100]; + FILE *fp; + + nodelist_t *nl; + int linkport; + char result[4096]; + char cancelfile[MAXPATHLEN], cancelpost[MAXPATHLEN]; + char bbslink_lockfile[MAXPATHLEN]; + FILE *NEWPOST; + char *left, *right; + int nlcount; + + strcpy(BBSHOME, argv[0]); + /* + * woju + */ + sprintf(OUTING, "%s/boards/%c/%s/", BBSHOME, argv[1][0], argv[1]); + fname = OUTING + strlen(OUTING); + + if (initial_bbs("link") == 0) { + return -1; + } + BBSLINK_STAT = (stat_t *) malloc(sizeof(stat_t) * (NLCOUNT + 1)); + for (nlcount = 0; nlcount < NLCOUNT; nlcount++) { + BBSLINK_STAT[nlcount].localsendout = 0; + BBSLINK_STAT[nlcount].remotesendout = 0; + BBSLINK_STAT[nlcount].localfailed = 0; + BBSLINK_STAT[nlcount].remotefailed = 0; + } + + nl = (nodelist_t *) search_nodelist_bynode(MYBBSID); + if (nl == NULL) { + *MYADDR = '\0'; + *MYSITE = '\0'; + *LINKPROTOCOL = '\0'; + } else { + strncpy(MYADDR, nl->host, sizeof MYADDR); + strncpy(LINKPROTOCOL, nl->protocol, sizeof LINKPROTOCOL); + strncpy(MYSITE, nl->comments, sizeof MYSITE); + } + if (Verbose) { + printf("MYADDR: %s\n", MYADDR); + printf("MYSITE: %s\n", MYSITE); + } + left = strchr(nl->protocol, '('); + right = strrchr(nl->protocol, ')'); + if (left && right) { + *right = '\0'; + strncpy(LINKPROTOCOL, nl->protocol, sizeof LINKPROTOCOL); + LINKPORT = atoi(left + 1); + *right = ')'; + } + if (!NoVisit) { + sprintf(bbslink_lockfile, "%s/.bbslink.visit", INNDHOME); + /* + * woju if (!Rename(fileglue("%s/out.bntp", INNDHOME), OUTING) && + * bbslink_get_lock(bbslink_lockfile)) + */ + if (strcpy(fname, ".DIR")) { + /* When try to visit new post, try to lock it */ + NEWPOST = fopen(OUTING, "r"); + if (NEWPOST == NULL) { + bbslog("<bbslink> Err: can't open %s\n", OUTING); + /* + * woju bbslink_un_lock(bbslink_lockfile); + */ + return -1; + } #ifdef 0 -woju - while (fgets(result, sizeof result, NEWPOST)) - { - /* chop( $_ ); */ - char *board, *filename, *userid, *nickname, *subject; - char *ptr; - - ptr = strchr(result, '\n'); - if (ptr) - *ptr = '\0'; - - board = filename = userid = nickname = subject = NULL; - /* board field */ - board = result; - ptr = strchr(result, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* filename field */ - filename = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* userid field */ - userid = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* nickname field */ - nickname = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* subject field */ - subject = ptr; - /* ptr = strchr(ptr, '\t'); if (ptr == NULL) continue; ptr++ = '\0'; */ - - process_article(board, filename, userid, nickname, subject); - } + woju + while (fgets(result, sizeof result, NEWPOST)) { + /* chop( $_ ); */ + char *board, *filename, *userid, *nickname, *subject; + char *ptr; + + ptr = strchr(result, '\n'); + if (ptr) + *ptr = '\0'; + + board = filename = userid = nickname = subject = NULL; + /* board field */ + board = result; + ptr = strchr(result, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* filename field */ + filename = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* userid field */ + userid = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* nickname field */ + nickname = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* subject field */ + subject = ptr; + /* + * ptr = strchr(ptr, '\t'); if (ptr == NULL) continue; ptr++ + * = '\0'; + */ + + process_article(board, filename, userid, nickname, subject); + } #endif - while (fread(&fhdr, sizeof(fhdr), 1, NEWPOST) == 1) { - nick[1] = 0; - strcpy(fname, fhdr.filename); - if (fp = fopen(OUTING, "r")) { - fgets(nick, 100, fp); - if ((s1 = strchr(nick, '(')) && (s2 = strrchr(nick, ')'))) - *s2 = 0; - else - s1 = nick; - fclose(fp); - } - printf("%s\n", fhdr.title); - process_article(argv[1], fhdr.filename, fhdr.owner, s1 + 1, fhdr.title); - } - fclose(NEWPOST); -/* -woju - unlink(OUTING); - bbslink_un_lock(bbslink_lockfile); -*/ - } /* getlock */ - } /* if NoVisit is false */ - + while (fread(&fhdr, sizeof(fhdr), 1, NEWPOST) == 1) { + nick[1] = 0; + strcpy(fname, fhdr.filename); + if (fp = fopen(OUTING, "r")) { + fgets(nick, 100, fp); + if ((s1 = strchr(nick, '(')) && (s2 = strrchr(nick, ')'))) + *s2 = 0; + else + s1 = nick; + fclose(fp); + } + printf("%s\n", fhdr.title); + process_article(argv[1], fhdr.filename, fhdr.owner, s1 + 1, fhdr.title); + } + fclose(NEWPOST); + /* + * woju unlink(OUTING); bbslink_un_lock(bbslink_lockfile); + */ + } /* getlock */ + } /* if NoVisit is false */ #if 0 -woju - sprintf(cancelpost, "%s/cancel.bntp", INNDHOME); - if (isfile(cancelpost)) - { - FILE *CANCELFILE; - - if (bbslink_get_lock(cancelpost) && bbslink_get_lock(cancelfile)) - { - sprintf(cancelfile, "%s.%d", cancelpost, getpid()); - Rename(cancelpost, cancelfile); - CANCELFILE = fopen(cancelfile, "r"); - while (fgets(result, sizeof result, CANCELFILE) != NULL) - { - /* chop( $_ ); */ - char *board, *filename, *userid, *nickname, *subject; - char *ptr, **sptr; - - ptr = strchr(result, '\n'); - if (ptr) - *ptr = '\0'; - board = filename = userid = nickname = subject = NULL; - - /* board field */ - board = result; - ptr = strchr(result, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* filename field */ - filename = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* userid field */ - userid = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* nickname field */ - nickname = ptr; - ptr = strchr(ptr, '\t'); - if (ptr == NULL) - continue; - *ptr++ = '\0'; - - /* subject field */ - subject = ptr; - /* ptr = strchr(ptr, '\t'); if (ptr == NULL) continue; ptr++ = '\0'; */ - process_cancel(board, filename, userid, nickname, subject); - } - fclose(CANCELFILE); - if (Verbose) - printf("Unlinking %s\n", cancelfile); - if (!NoAction) - unlink(cancelfile); - bbslink_un_lock(cancelfile); - bbslink_un_lock(cancelpost); + woju + sprintf(cancelpost, "%s/cancel.bntp", INNDHOME); + if (isfile(cancelpost)) { + FILE *CANCELFILE; + + if (bbslink_get_lock(cancelpost) && bbslink_get_lock(cancelfile)) { + sprintf(cancelfile, "%s.%d", cancelpost, getpid()); + Rename(cancelpost, cancelfile); + CANCELFILE = fopen(cancelfile, "r"); + while (fgets(result, sizeof result, CANCELFILE) != NULL) { + /* chop( $_ ); */ + char *board, *filename, *userid, *nickname, *subject; + char *ptr, **sptr; + + ptr = strchr(result, '\n'); + if (ptr) + *ptr = '\0'; + board = filename = userid = nickname = subject = NULL; + + /* board field */ + board = result; + ptr = strchr(result, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* filename field */ + filename = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* userid field */ + userid = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* nickname field */ + nickname = ptr; + ptr = strchr(ptr, '\t'); + if (ptr == NULL) + continue; + *ptr++ = '\0'; + + /* subject field */ + subject = ptr; + /* + * ptr = strchr(ptr, '\t'); if (ptr == NULL) continue; ptr++ + * = '\0'; + */ + process_cancel(board, filename, userid, nickname, subject); + } + fclose(CANCELFILE); + if (Verbose) + printf("Unlinking %s\n", cancelfile); + if (!NoAction) + unlink(cancelfile); + bbslink_un_lock(cancelfile); + bbslink_un_lock(cancelpost); + } } - } #endif - for (nlcount = 0; nlcount < NLCOUNT; nlcount++) - { - if (NODELIST[nlcount].feedfp != NULL) - { - fclose(NODELIST[nlcount].feedfp); - NODELIST[nlcount].feedfp = NULL; + for (nlcount = 0; nlcount < NLCOUNT; nlcount++) { + if (NODELIST[nlcount].feedfp != NULL) { + fclose(NODELIST[nlcount].feedfp); + NODELIST[nlcount].feedfp = NULL; + } } - } - - send_article(); - for (nlcount = 0; nlcount < NLCOUNT; nlcount++) - { - int localsendout, remotesendout, localfailed, remotefailed; - - localsendout = BBSLINK_STAT[nlcount].localsendout; - remotesendout = BBSLINK_STAT[nlcount].remotesendout; - localfailed = BBSLINK_STAT[nlcount].localfailed; - remotefailed = BBSLINK_STAT[nlcount].remotefailed; - if (localsendout || remotesendout || localfailed || remotefailed) - bbslog("<bbslink> [%s]%s lsend:%d rsend:%d lfail:%d rfail:%d\n", - NODELIST[nlcount].node, NoAction ? "NoAction" : "", localsendout, remotesendout, - localfailed, remotefailed); - if (NODELIST[nlcount].feedfp != NULL) - { - fclose(NODELIST[nlcount].feedfp); - NODELIST[nlcount].feedfp = NULL; + + send_article(); + for (nlcount = 0; nlcount < NLCOUNT; nlcount++) { + int localsendout, remotesendout, localfailed, remotefailed; + + localsendout = BBSLINK_STAT[nlcount].localsendout; + remotesendout = BBSLINK_STAT[nlcount].remotesendout; + localfailed = BBSLINK_STAT[nlcount].localfailed; + remotefailed = BBSLINK_STAT[nlcount].remotefailed; + if (localsendout || remotesendout || localfailed || remotefailed) + bbslog("<bbslink> [%s]%s lsend:%d rsend:%d lfail:%d rfail:%d\n", + NODELIST[nlcount].node, NoAction ? "NoAction" : "", localsendout, remotesendout, + localfailed, remotefailed); + if (NODELIST[nlcount].feedfp != NULL) { + fclose(NODELIST[nlcount].feedfp); + NODELIST[nlcount].feedfp = NULL; + } } - } - if (BBSLINK_STAT); - free(BBSLINK_STAT); - return 0; + if (BBSLINK_STAT); + free(BBSLINK_STAT); + return 0; } /* -termbbslink(sig) - int sig; -{ - bbslog("kill signal received %d, terminated\n", sig); - if (Verbose) - printf("kill signal received %d, terminated\n", sig); - exit(0); -} -*/ + * termbbslink(sig) int sig; { bbslog("kill signal received %d, + * terminated\n", sig); if (Verbose) printf("kill signal received %d, + * terminated\n", sig); exit(0); } + */ void termbbslink() { - bbslog("kill signal received ??, terminated\n"); - if (Verbose) - printf("kill signal received ??, terminated\n"); - exit(0); + bbslog("kill signal received ??, terminated\n"); + if (Verbose) + printf("kill signal received ??, terminated\n"); + exit(0); } -char *REMOTEUSERNAME = ""; -char *REMOTEHOSTNAME = ""; +char *REMOTEUSERNAME = ""; +char *REMOTEHOSTNAME = ""; -extern char *optarg; -extern int opterr, optind; +extern char *optarg; +extern int opterr, optind; main(argc, argv) - int argc; - char **argv; + int argc; + char **argv; { - int c, errflag = 0; + int c, errflag = 0; - CONTROL = CONTROL_BUF; - MSGID = MSGID_BUF; + CONTROL = CONTROL_BUF; + MSGID = MSGID_BUF; - /* For debug Only */ + /* For debug Only */ #define DEBUGBBSLINK #ifdef DEBUGBBSLINK - NoAction = 0; - Verbose = 0; - VisitOnly = 0; - NoVisit = 0; - DefaultFeedSite = ""; + NoAction = 0; + Verbose = 0; + VisitOnly = 0; + NoVisit = 0; + DefaultFeedSite = ""; #endif - while ((c = getopt(argc, argv, "s:hnvVNk")) != -1) - switch (c) - { - case 's': - DefaultFeedSite = optarg; - break; - case 'n': - NoAction = 1; - break; - case 'v': - Verbose = 1; - break; - case 'V': - VisitOnly = 1; - break; - case 'N': - NoVisit = 1; - break; - case 'k': - KillFormerBBSLINK = 1; - break; - case 'h': - default: - errflag++; - break; + while ((c = getopt(argc, argv, "s:hnvVNk")) != -1) + switch (c) { + case 's': + DefaultFeedSite = optarg; + break; + case 'n': + NoAction = 1; + break; + case 'v': + Verbose = 1; + break; + case 'V': + VisitOnly = 1; + break; + case 'N': + NoVisit = 1; + break; + case 'k': + KillFormerBBSLINK = 1; + break; + case 'h': + default: + errflag++; + break; + } + if (errflag > 0) { + show_usage(argv[0]); + return (1); } - if (errflag > 0) - { - show_usage(argv[0]); - return (1); - } - if (argc - optind < 2) - { - show_usage(argv[0]); - exit(1); - } - signal(SIGTERM, termbbslink); - if (bntplink(argc - optind, argv + optind) != 0) - { - show_usage(argv[0]); - exit(1); - } - return 0; + if (argc - optind < 2) { + show_usage(argv[0]); + exit(1); + } + signal(SIGTERM, termbbslink); + if (bntplink(argc - optind, argv + optind) != 0) { + show_usage(argv[0]); + exit(1); + } + return 0; } diff --git a/innbbsd/bbsnnrp.c b/innbbsd/bbsnnrp.c index 6682f7ba..fadafe72 100644 --- a/innbbsd/bbsnnrp.c +++ b/innbbsd/bbsnnrp.c @@ -1,32 +1,29 @@ /* - Usage: bbsnnrp [options] nntpserver activefile - -h|? (help) - -v (verbose protocol transactions) - -c (reset active files only; don't receive articles) - -r remotehost(send articles to remotehost, default=local) - -p port|(send articles to remotehost at port, default=7777) - path(send articles to local at path, default=~bbs/innd/.innbbsd) - -n (don't ask innbbsd server and stat articles) - -w seconds (wait for seconds and run infinitely, default=once) - -a max_art (maximum number of articles received for a group each time) - -s max_stat(maximum number of articles stated for a group each time) - -t stdin|nntp (default=nntp) -*/ + * Usage: bbsnnrp [options] nntpserver activefile -h|? (help) -v (verbose + * protocol transactions) -c (reset active files only; don't receive + * articles) -r remotehost(send articles to remotehost, default=local) -p + * port|(send articles to remotehost at port, default=7777) path(send + * articles to local at path, default=~bbs/innd/.innbbsd) -n (don't ask + * innbbsd server and stat articles) -w seconds (wait for seconds and run + * infinitely, default=once) -a max_art (maximum number of articles received + * for a group each time) -s max_stat(maximum number of articles stated for a + * group each time) -t stdin|nntp (default=nntp) + */ #include "innbbsconf.h" #include <sys/mman.h> #ifndef AIX -# include <sys/fcntl.h> +#include <sys/fcntl.h> #endif #include "bbslib.h" #include "daemon.h" #include "nntp.h" #ifndef MAX_ARTS -# define MAX_ARTS 100 +#define MAX_ARTS 100 #endif #ifndef MAX_STATS -# define MAX_STATS 1000 +#define MAX_STATS 1000 #endif #if defined(__linux) @@ -35,35 +32,35 @@ #define USE_MMAP #endif -int Max_Arts= MAX_ARTS; -int Max_Stats = MAX_STATS; +int Max_Arts = MAX_ARTS; +int Max_Stats = MAX_STATS; typedef struct NEWSRC_T { - char *nameptr, *lowptr, *highptr, *modeptr; - int namelen, lowlen, highlen; - ULONG low, high; - int mode, subscribe; -} newsrc_t; + char *nameptr, *lowptr, *highptr, *modeptr; + int namelen, lowlen, highlen; + ULONG low, high; + int mode, subscribe; +} newsrc_t; typedef struct NNRP_T { - int nnrpfd; - int innbbsfd; - FILE *nnrpin, *nnrpout; - FILE *innbbsin, *innbbsout; - char activefile[MAXPATHLEN]; - char rcfile[MAXPATHLEN]; - newsrc_t *newsrc; - char *actpointer, *actend; - int actsize, actfd, actdirty; -} nnrp_t; + int nnrpfd; + int innbbsfd; + FILE *nnrpin, *nnrpout; + FILE *innbbsin, *innbbsout; + char activefile[MAXPATHLEN]; + char rcfile[MAXPATHLEN]; + newsrc_t *newsrc; + char *actpointer, *actend; + int actsize, actfd, actdirty; +} nnrp_t; typedef struct XHDR_T { - char *header; - ULONG artno; -} xhdr_t; + char *header; + ULONG artno; +} xhdr_t; -xhdr_t XHDR[MAX_ARTS]; -char LockFile[1024]; +xhdr_t XHDR[MAX_ARTS]; +char LockFile[1024]; #define NNRPGroupOK NNTP_GROUPOK_VAL #define NNRPXhdrOK NNTP_HEAD_FOLLOWS_VAL @@ -74,85 +71,86 @@ char LockFile[1024]; #define NNRPstatOK NNTP_NOTHING_FOLLOWS_VAL #define INNBBSconnectOK NNTP_POSTOK_VAL -nnrp_t BBSNNRP; +nnrp_t BBSNNRP; -void doterm(s) -int s; +void +doterm(s) + int s; { - printf("bbsnnrp terminated. Signal %d\n", s); - writerc(&BBSNNRP); - if (isfile(LockFile)) - unlink(LockFile); - exit(1); + printf("bbsnnrp terminated. Signal %d\n", s); + writerc(&BBSNNRP); + if (isfile(LockFile)) + unlink(LockFile); + exit(1); } -extern char *optarg; -extern int opterr, optind; +extern char *optarg; +extern int opterr, optind; #ifndef MIN_WAIT -# define MIN_WAIT 60 +#define MIN_WAIT 60 #endif -int ResetActive = 0; -int StatHistory = 1; -int AskLocal = 1; -int RunOnce = 1; +int ResetActive = 0; +int StatHistory = 1; +int AskLocal = 1; +int RunOnce = 1; -int DefaultWait = MIN_WAIT; +int DefaultWait = MIN_WAIT; -char *DefaultPort = DefaultINNBBSPort; -char *DefaultPath = LOCALDAEMON; -char *DefaultRemoteHost; +char *DefaultPort = DefaultINNBBSPort; +char *DefaultPath = LOCALDAEMON; +char *DefaultRemoteHost; #ifndef MAXBUFLEN #define MAXBUFLEN 256 #endif -char DefaultNewsgroups[MAXBUFLEN]; -char DefaultOrganization[MAXBUFLEN]; -char DefaultModerator[MAXBUFLEN]; -char DefaultTrustfrom[MAXBUFLEN]; -char DefaultTrustFrom[MAXBUFLEN]; +char DefaultNewsgroups[MAXBUFLEN]; +char DefaultOrganization[MAXBUFLEN]; +char DefaultModerator[MAXBUFLEN]; +char DefaultTrustfrom[MAXBUFLEN]; +char DefaultTrustFrom[MAXBUFLEN]; usage(arg) -char *arg; + char *arg; { -fprintf(stderr,"Usage: %s [options] nntpserver activefile\n", arg); -fprintf(stderr," -h|? (help) \n"); -fprintf(stderr," -v (verbose protocol transactions)\n"); -fprintf(stderr," -c (reset active files only; don't receive articles)\n"); -fprintf(stderr," -r [proto:]remotehost\n"); -fprintf(stderr," (send articles to remotehost, default=ihave:local)\n"); -fprintf(stderr," -p port|(send articles to remotehost at port, default=%s)\n",DefaultINNBBSPort); -fprintf(stderr," path(send articles to local at path, default=~bbs/innd/.innbbsd)\n"); -fprintf(stderr," -w seconds ( > 1 wait for seconds and run infinitely, default=once)\n"); -fprintf(stderr," -n (don't ask innbbsd server and stat articles)\n"); -fprintf(stderr," -a max_art(maximum number of articles received for a group each time)\n"); -fprintf(stderr," default=%d\n", MAX_ARTS); -fprintf(stderr," -s max_stat(maximum number of articles stated for a group each time)\n"); -fprintf(stderr," default=%d\n", MAX_STATS); -fprintf(stderr," -t stdin|nntp (default=nntp)\n"); -fprintf(stderr," -g newsgroups\n"); -fprintf(stderr," -m moderator\n"); -fprintf(stderr," -o organization\n"); -fprintf(stderr," -f trust_user (From: trust_user)\n"); -fprintf(stderr," -F trust_user (From trust_user)\n"); -fprintf(stderr," Please E-mail bug to skhuang@csie.nctu.edu.tw or\n"); -fprintf(stderr," post to tw.bbs.admin.installbbs\n"); + fprintf(stderr, "Usage: %s [options] nntpserver activefile\n", arg); + fprintf(stderr, " -h|? (help) \n"); + fprintf(stderr, " -v (verbose protocol transactions)\n"); + fprintf(stderr, " -c (reset active files only; don't receive articles)\n"); + fprintf(stderr, " -r [proto:]remotehost\n"); + fprintf(stderr, " (send articles to remotehost, default=ihave:local)\n"); + fprintf(stderr, " -p port|(send articles to remotehost at port, default=%s)\n", DefaultINNBBSPort); + fprintf(stderr, " path(send articles to local at path, default=~bbs/innd/.innbbsd)\n"); + fprintf(stderr, " -w seconds ( > 1 wait for seconds and run infinitely, default=once)\n"); + fprintf(stderr, " -n (don't ask innbbsd server and stat articles)\n"); + fprintf(stderr, " -a max_art(maximum number of articles received for a group each time)\n"); + fprintf(stderr, " default=%d\n", MAX_ARTS); + fprintf(stderr, " -s max_stat(maximum number of articles stated for a group each time)\n"); + fprintf(stderr, " default=%d\n", MAX_STATS); + fprintf(stderr, " -t stdin|nntp (default=nntp)\n"); + fprintf(stderr, " -g newsgroups\n"); + fprintf(stderr, " -m moderator\n"); + fprintf(stderr, " -o organization\n"); + fprintf(stderr, " -f trust_user (From: trust_user)\n"); + fprintf(stderr, " -F trust_user (From trust_user)\n"); + fprintf(stderr, " Please E-mail bug to skhuang@csie.nctu.edu.tw or\n"); + fprintf(stderr, " post to tw.bbs.admin.installbbs\n"); } -static char *StdinInputType="stdin"; -static char *NntpInputType="nntp"; -static char *NntpIhaveProtocol="ihave"; -static char *NntpPostProtocol="post"; -static char *DefaultNntpProtocol ; +static char *StdinInputType = "stdin"; +static char *NntpInputType = "nntp"; +static char *NntpIhaveProtocol = "ihave"; +static char *NntpPostProtocol = "post"; +static char *DefaultNntpProtocol; main(argc, argv) -int argc; -char **argv; + int argc; + char **argv; { - char *ptr, *server, *active; - int c, errflag=0; - int lockfd; - char *inputtype; + char *ptr, *server, *active; + int c, errflag = 0; + int lockfd; + char *inputtype; DefaultNntpProtocol = NntpIhaveProtocol; *DefaultNewsgroups = '\0'; @@ -161,1032 +159,1074 @@ char **argv; *DefaultTrustFrom = '\0'; *DefaultTrustfrom = '\0'; inputtype = NntpInputType; - while ((c = getopt(argc,argv,"f:F:m:o:g:w:r:p:a:s:t:h?ncv"))!= -1) - switch (c) { - case 'v': - verboseon("bbsnnrp.log"); - break; - case 'c': - ResetActive = 1; - break; - case 'g': - strncpy(DefaultNewsgroups, optarg, sizeof DefaultNewsgroups); - break; - case 'm': - strncpy(DefaultModerator, optarg, sizeof DefaultModerator); - break; - case 'o': - strncpy(DefaultOrganization, optarg, sizeof DefaultOrganization); - break; - case 'f': - strncpy(DefaultTrustfrom, optarg, sizeof DefaultTrustfrom); - break; - case 'F': - strncpy(DefaultTrustFrom, optarg, sizeof DefaultTrustFrom); - break; - case 'r': { - char *hostptr; - AskLocal = 0; - DefaultRemoteHost = optarg; - if ((hostptr = strchr(optarg,':')) != NULL) { - *hostptr = '\0'; - DefaultRemoteHost = hostptr+1; - if (strcasecmp( optarg, "post" ) == 0) - DefaultNntpProtocol = NntpPostProtocol; - *hostptr = ':'; - } - break; - } - case 'w': - RunOnce = 0; - DefaultWait = atoi(optarg); - if (DefaultWait < MIN_WAIT) - DefaultWait = MIN_WAIT; - break; - case 'p': - if (AskLocal == 0) { - DefaultPort = optarg; - } else { - DefaultPath = optarg; - } - break; - case 'n': - StatHistory = 0; - break; - case 'a': - Max_Arts = atol(optarg); - if (Max_Arts < 0) Max_Arts = 0; - break; - case 's': - Max_Stats = atol(optarg); - if (Max_Stats < 0) Max_Stats = 0; - break; - case 't': - if ( strcasecmp(optarg,StdinInputType) == 0) { - inputtype = StdinInputType; - } - break; - case 'h': - case '?': - default: - errflag ++; - } + while ((c = getopt(argc, argv, "f:F:m:o:g:w:r:p:a:s:t:h?ncv")) != -1) + switch (c) { + case 'v': + verboseon("bbsnnrp.log"); + break; + case 'c': + ResetActive = 1; + break; + case 'g': + strncpy(DefaultNewsgroups, optarg, sizeof DefaultNewsgroups); + break; + case 'm': + strncpy(DefaultModerator, optarg, sizeof DefaultModerator); + break; + case 'o': + strncpy(DefaultOrganization, optarg, sizeof DefaultOrganization); + break; + case 'f': + strncpy(DefaultTrustfrom, optarg, sizeof DefaultTrustfrom); + break; + case 'F': + strncpy(DefaultTrustFrom, optarg, sizeof DefaultTrustFrom); + break; + case 'r':{ + char *hostptr; + AskLocal = 0; + DefaultRemoteHost = optarg; + if ((hostptr = strchr(optarg, ':')) != NULL) { + *hostptr = '\0'; + DefaultRemoteHost = hostptr + 1; + if (strcasecmp(optarg, "post") == 0) + DefaultNntpProtocol = NntpPostProtocol; + *hostptr = ':'; + } + break; + } + case 'w': + RunOnce = 0; + DefaultWait = atoi(optarg); + if (DefaultWait < MIN_WAIT) + DefaultWait = MIN_WAIT; + break; + case 'p': + if (AskLocal == 0) { + DefaultPort = optarg; + } else { + DefaultPath = optarg; + } + break; + case 'n': + StatHistory = 0; + break; + case 'a': + Max_Arts = atol(optarg); + if (Max_Arts < 0) + Max_Arts = 0; + break; + case 's': + Max_Stats = atol(optarg); + if (Max_Stats < 0) + Max_Stats = 0; + break; + case 't': + if (strcasecmp(optarg, StdinInputType) == 0) { + inputtype = StdinInputType; + } + break; + case 'h': + case '?': + default: + errflag++; + } if (errflag > 0) { - usage(argv[0]); - return(1); + usage(argv[0]); + return (1); } if (inputtype == NntpInputType && argc - optind < 2) { - usage(argv[0]); - exit(1); + usage(argv[0]); + exit(1); } if (inputtype == NntpInputType) { - server = argv[optind]; - active = argv[optind+1]; - if ( isfile(active) ) { - strncpy(BBSNNRP.activefile, active, sizeof BBSNNRP.activefile); - } else if ( strchr(active,'/') == NULL) { - sprintf(BBSNNRP.activefile, "%s/innd/%.*s",BBSHOME, sizeof BBSNNRP.activefile - 7 - strlen(BBSHOME), active); - } else { - strncpy(BBSNNRP.activefile, active, sizeof BBSNNRP.activefile); - } + server = argv[optind]; + active = argv[optind + 1]; + if (isfile(active)) { + strncpy(BBSNNRP.activefile, active, sizeof BBSNNRP.activefile); + } else if (strchr(active, '/') == NULL) { + sprintf(BBSNNRP.activefile, "%s/innd/%.*s", BBSHOME, sizeof BBSNNRP.activefile - 7 - strlen(BBSHOME), active); + } else { + strncpy(BBSNNRP.activefile, active, sizeof BBSNNRP.activefile); + } - strncpy(LockFile , (char*)fileglue("%s.lock",active), sizeof LockFile); - if ((lockfd = open(LockFile, O_RDONLY)) >= 0) { - char buf[10]; - int pid; + strncpy(LockFile, (char *)fileglue("%s.lock", active), sizeof LockFile); + if ((lockfd = open(LockFile, O_RDONLY)) >= 0) { + char buf[10]; + int pid; - if (read(lockfd, buf, sizeof buf) > 0 && (pid = atoi(buf))>0 && kill(pid,0)==0) { - fprintf(stderr, "another process [%d] running\n", pid); - exit(1); - } else { - fprintf(stderr, "no process [%d] running, but lock file existed, unlinked\n", pid); + if (read(lockfd, buf, sizeof buf) > 0 && (pid = atoi(buf)) > 0 && kill(pid, 0) == 0) { + fprintf(stderr, "another process [%d] running\n", pid); + exit(1); + } else { + fprintf(stderr, "no process [%d] running, but lock file existed, unlinked\n", pid); + unlink(LockFile); + } + close(lockfd); + } + if ((lockfd = open(LockFile, O_RDWR | O_CREAT | O_EXCL, 0644)) < 0) { + fprintf(stderr, "maybe another %s process running\n", argv[0]); + exit(1); + } else { + char buf[10]; + int pid; + sprintf(buf, "%-.8d\n", getpid()); + write(lockfd, buf, strlen(buf)); + close(lockfd); + } + for (;;) { + if (!initial_bbs(NULL)) { + fprintf(stderr, "Initial BBS failed\n"); + exit(1); + } + initsockets(server, &BBSNNRP, inputtype); + ptr = (char *)strrchr(active, '/'); + if (ptr != NULL) + ptr++; + else + ptr = active; + sprintf(BBSNNRP.rcfile, "%s/.newsrc.%s.%s", INNDHOME, server, ptr); + initrcfiles(&BBSNNRP); + + signal(SIGTERM, doterm); + signal(SIGKILL, doterm); + signal(SIGHUP, doterm); + signal(SIGPIPE, doterm); + + readnews(server, &BBSNNRP); + writerc(&BBSNNRP); + closesockets(); + + if (RunOnce) + break; + sleep(DefaultWait); + } unlink(LockFile); - } - close(lockfd); - } - if ((lockfd = open(LockFile, O_RDWR|O_CREAT|O_EXCL,0644)) < 0) { - fprintf( stderr, "maybe another %s process running\n",argv[0]); - exit(1); - } else { - char buf[10]; - int pid; - sprintf(buf,"%-.8d\n",getpid()); - write(lockfd, buf, strlen(buf)); - close(lockfd); - } - for (;;) { - if (!initial_bbs(NULL)) { - fprintf(stderr, "Initial BBS failed\n"); - exit(1); - } - initsockets(server, &BBSNNRP, inputtype); - ptr = (char*)strrchr(active,'/'); - if (ptr != NULL) - ptr++; - else - ptr = active; - sprintf(BBSNNRP.rcfile,"%s/.newsrc.%s.%s",INNDHOME, server, ptr); - initrcfiles(&BBSNNRP); - - signal(SIGTERM, doterm); - signal(SIGKILL, doterm); - signal(SIGHUP, doterm); - signal(SIGPIPE, doterm); - - readnews(server, &BBSNNRP); - writerc(&BBSNNRP); - closesockets(); - - if (RunOnce) break; - sleep(DefaultWait); - } - unlink(LockFile); - } /* NntpInputType */ + } + /* NntpInputType */ else { - if (!initial_bbs(NULL)) { - fprintf(stderr, "Initial BBS failed\n"); - exit(1); - } - initsockets(server, &BBSNNRP, inputtype); - signal(SIGTERM, doterm); - signal(SIGKILL, doterm); - signal(SIGHUP, doterm); - signal(SIGPIPE, doterm); - - stdinreadnews(&BBSNNRP); - closesockets(); - } /* stdin input type */ + if (!initial_bbs(NULL)) { + fprintf(stderr, "Initial BBS failed\n"); + exit(1); + } + initsockets(server, &BBSNNRP, inputtype); + signal(SIGTERM, doterm); + signal(SIGKILL, doterm); + signal(SIGHUP, doterm); + signal(SIGPIPE, doterm); + + stdinreadnews(&BBSNNRP); + closesockets(); + } /* stdin input type */ return 0; } headbegin(buffer) -char *buffer; + char *buffer; { - if (strncmp(buffer,"Path: ",6)==0 ) { - if (strchr(buffer+6,'!') != NULL) - return 1; - } - if (strncmp(buffer,"From ",5)== 0 ) { - if (strchr(buffer+5,':') != NULL) - return 1; - } - return 0; + if (strncmp(buffer, "Path: ", 6) == 0) { + if (strchr(buffer + 6, '!') != NULL) + return 1; + } + if (strncmp(buffer, "From ", 5) == 0) { + if (strchr(buffer + 5, ':') != NULL) + return 1; + } + return 0; } stdinreadnews(bbsnnrp) -nnrp_t *bbsnnrp; + nnrp_t *bbsnnrp; { - int i; - char buffer[4096]; - ULONG low, high; - char tmpfilename[MAXPATHLEN]; - FILE *tmpfp = NULL; - char mid[1024]; - int pathagain; - int ngmet, submet, midmet, pathmet, orgmet, approvedmet; - int discard; - char sending_path[MAXPATHLEN]; - int sending_path_len=0; - - strncpy(tmpfilename,(char*)fileglue("/tmp/bbsnnrp-stdin-%d-%d",getuid(),getpid()),sizeof tmpfilename); - fgets(buffer, sizeof buffer, bbsnnrp->innbbsin); - verboselog("innbbsGet: %s", buffer); - if (atoi(buffer) != INNBBSconnectOK) { - fprintf(stderr, "INNBBS server not OK\n"); - return; - } - - if ( DefaultNntpProtocol == NntpPostProtocol ) { - fputs("MODE READER\r\n", bbsnnrp->innbbsout); - fflush(bbsnnrp->innbbsout); - verboselog("innbbsPut: MODE READER\n"); - fgets(buffer, sizeof buffer, bbsnnrp->innbbsin); - verboselog("innbbsGet: %s",buffer); - } - - if (StatHistory == 0) { - fputs("MIDCHECK OFF\r\n", bbsnnrp->innbbsout); - fflush(bbsnnrp->innbbsout); - verboselog("innbbsPut: MIDCHECK OFF\n"); - fgets(buffer, sizeof buffer, bbsnnrp->innbbsin); - verboselog("innbbsGet: %s",buffer); - } - tmpfp = fopen(tmpfilename,"w"); - if (tmpfp == NULL) return; - *mid = '\0'; - for (;;) { - fprintf(stderr,"Try to read from stdin ...\n"); - ngmet = 0, submet = 0, midmet = 0, pathmet = 0, orgmet = 0, approvedmet=0; - discard = 0; - while (fgets(buffer, sizeof buffer, stdin) != NULL) { - char *tmpptr; - tmpptr = strchr(buffer,'\n'); - if (tmpptr != NULL) *tmpptr = '\0'; - if (strncasecmp(buffer,"Message-ID: ",12)==0) { - strncpy(mid, buffer+12,sizeof mid); - midmet = 1; - } else if (strncmp(buffer,"Subject: ",9)==0) { - submet = 1; - } else if (strncmp(buffer,"Path: ",6)==0) { - pathmet = 1; - } else if (strncmp(buffer,"Organization: ",14)==0) { - orgmet = 1; - } else if (strncmp(buffer,"Approved: ",10) == 0) { - approvedmet = 1; - } else if (strncmp(buffer,"From: ",6)==0 && *DefaultTrustfrom ) { - if (strstr(buffer+6, DefaultTrustfrom)==NULL) { - discard = 1; - verboselog("Discard: %s for %s",buffer, DefaultTrustfrom); - } - } else if (strncmp(buffer,"From ",5)==0 && *DefaultTrustFrom ) { - if (strstr(buffer+5, DefaultTrustFrom)==NULL) { - discard = 1; - verboselog("Discard: %s for %s",buffer, DefaultTrustFrom); - } - } else if (strncmp(buffer,"Received: ",10)==0) { - char *rptr=buffer+10, *rrptr; - int savech, len; - if (strncmp(buffer+10,"from ",5)==0) { - rptr +=5; - rrptr = strchr(rptr,'('); - if (rrptr != NULL) rptr = rrptr + 1; - rrptr = strchr(rptr,' '); - savech = *rrptr; - if (rrptr != NULL) *rrptr = '\0'; - } else if (strncmp(buffer+10,"(from ",6)==0) { - rptr +=6; - rrptr = strchr(rptr,')'); - savech = *rrptr; - if (rrptr != NULL) *rrptr = '\0'; - } - len = strlen(rptr) +1; - if (*rptr && sending_path_len + len < sizeof(sending_path)) { - if (*sending_path) - strcat(sending_path, "!"); - strcat(sending_path, rptr); - sending_path_len += len ; - } - if (rrptr != NULL) *rrptr = savech; - } - - if (strncmp(buffer,"Newsgroups: ",12)==0) { - if (*DefaultNewsgroups){ - fprintf(tmpfp,"Newsgroups: %s\r\n",DefaultNewsgroups); - } else { - fprintf(tmpfp,"%s\r\n",buffer); - } - ngmet = 1; - } else { - if (buffer[0] == '\0') { - if (!ngmet && *DefaultNewsgroups) { - fprintf(tmpfp,"Newsgroups: %s\r\n",DefaultNewsgroups); - } - if (!submet) { - fprintf(tmpfp,"Subject: (no subject)\r\n"); - } - if (!pathmet) { - fprintf(tmpfp,"Path: from-mail\r\n"); - } - if (!midmet) { - static int seed; - time_t now; - time(&now); - fprintf(tmpfp,"Message-ID: <%d@%d.%d.%d>\r\n",now,getpid(), getuid(), seed); - sprintf(mid, "<%d@%d.%d.%d>", now, getpid(), getuid(), seed); - seed++; - } - if (!orgmet && *DefaultOrganization) { - fprintf(tmpfp,"Organization: %s\r\n", DefaultOrganization); - } - if (!approvedmet && *DefaultModerator) { - fprintf(tmpfp,"Approved: %s\r\n", DefaultModerator); - } - } - if (strncmp(buffer,"From ",5) != 0 && strncmp(buffer,"To: ",4) !=0) { - if (buffer[0] == '\0') { - if (*sending_path) { - fprintf(tmpfp,"X-Sending-Path: %s\r\n",sending_path); - } - } - fprintf(tmpfp,"%s\r\n",buffer); - } - } - if (buffer[0]=='\0') break; - } - fprintf(stderr,"Article Body begin ...\n"); - pathagain = 0; - while (fgets(buffer, sizeof buffer, stdin) != NULL) { - char *tmpptr; - tmpptr = strchr(buffer,'\n'); - if (tmpptr != NULL) *tmpptr = '\0'; - if ( headbegin(buffer) ) { - FILE *oldfp = bbsnnrp->nnrpin; - pathagain = 1; - fputs(".\r\n",tmpfp); - fclose(tmpfp); - fprintf(stderr,"Try to post ...\n"); - tmpfp = fopen(tmpfilename,"r"); - bbsnnrp->nnrpin = tmpfp; - if (!discard) - if (INNBBSihave(bbsnnrp, -1, mid)== -1) { - fprintf(stderr,"post failed\n"); - } - bbsnnrp->nnrpin = oldfp; - fclose(tmpfp); - *mid = '\0'; - tmpfp = fopen(tmpfilename,"w"); - fprintf(tmpfp,"%s\r\n",buffer); - break; - } else { - fprintf(tmpfp,"%s\r\n",buffer); - } - } - if (!pathagain) break; - } - if (!pathagain && tmpfp) { - FILE *oldfp = bbsnnrp->nnrpin; - fputs(".\r\n",tmpfp); - fclose(tmpfp); - fprintf(stderr,"Try to post ...\n"); - tmpfp = fopen(tmpfilename,"r"); - bbsnnrp->nnrpin = tmpfp; - if (!discard) - if (INNBBSihave(bbsnnrp, -1, mid)== -1) { - fprintf(stderr,"post failed\n"); - } - bbsnnrp->nnrpin = oldfp; - fclose(tmpfp); - } - if (isfile(tmpfilename)) { - unlink(tmpfilename); - } + int i; + char buffer[4096]; + ULONG low, high; + char tmpfilename[MAXPATHLEN]; + FILE *tmpfp = NULL; + char mid[1024]; + int pathagain; + int ngmet, submet, midmet, pathmet, orgmet, approvedmet; + int discard; + char sending_path[MAXPATHLEN]; + int sending_path_len = 0; + + strncpy(tmpfilename, (char *)fileglue("/tmp/bbsnnrp-stdin-%d-%d", getuid(), getpid()), sizeof tmpfilename); + fgets(buffer, sizeof buffer, bbsnnrp->innbbsin); + verboselog("innbbsGet: %s", buffer); + if (atoi(buffer) != INNBBSconnectOK) { + fprintf(stderr, "INNBBS server not OK\n"); + return; + } + if (DefaultNntpProtocol == NntpPostProtocol) { + fputs("MODE READER\r\n", bbsnnrp->innbbsout); + fflush(bbsnnrp->innbbsout); + verboselog("innbbsPut: MODE READER\n"); + fgets(buffer, sizeof buffer, bbsnnrp->innbbsin); + verboselog("innbbsGet: %s", buffer); + } + if (StatHistory == 0) { + fputs("MIDCHECK OFF\r\n", bbsnnrp->innbbsout); + fflush(bbsnnrp->innbbsout); + verboselog("innbbsPut: MIDCHECK OFF\n"); + fgets(buffer, sizeof buffer, bbsnnrp->innbbsin); + verboselog("innbbsGet: %s", buffer); + } + tmpfp = fopen(tmpfilename, "w"); + if (tmpfp == NULL) + return; + *mid = '\0'; + for (;;) { + fprintf(stderr, "Try to read from stdin ...\n"); + ngmet = 0, submet = 0, midmet = 0, pathmet = 0, orgmet = 0, approvedmet = 0; + discard = 0; + while (fgets(buffer, sizeof buffer, stdin) != NULL) { + char *tmpptr; + tmpptr = strchr(buffer, '\n'); + if (tmpptr != NULL) + *tmpptr = '\0'; + if (strncasecmp(buffer, "Message-ID: ", 12) == 0) { + strncpy(mid, buffer + 12, sizeof mid); + midmet = 1; + } else if (strncmp(buffer, "Subject: ", 9) == 0) { + submet = 1; + } else if (strncmp(buffer, "Path: ", 6) == 0) { + pathmet = 1; + } else if (strncmp(buffer, "Organization: ", 14) == 0) { + orgmet = 1; + } else if (strncmp(buffer, "Approved: ", 10) == 0) { + approvedmet = 1; + } else if (strncmp(buffer, "From: ", 6) == 0 && *DefaultTrustfrom) { + if (strstr(buffer + 6, DefaultTrustfrom) == NULL) { + discard = 1; + verboselog("Discard: %s for %s", buffer, DefaultTrustfrom); + } + } else if (strncmp(buffer, "From ", 5) == 0 && *DefaultTrustFrom) { + if (strstr(buffer + 5, DefaultTrustFrom) == NULL) { + discard = 1; + verboselog("Discard: %s for %s", buffer, DefaultTrustFrom); + } + } else if (strncmp(buffer, "Received: ", 10) == 0) { + char *rptr = buffer + 10, *rrptr; + int savech, len; + if (strncmp(buffer + 10, "from ", 5) == 0) { + rptr += 5; + rrptr = strchr(rptr, '('); + if (rrptr != NULL) + rptr = rrptr + 1; + rrptr = strchr(rptr, ' '); + savech = *rrptr; + if (rrptr != NULL) + *rrptr = '\0'; + } else if (strncmp(buffer + 10, "(from ", 6) == 0) { + rptr += 6; + rrptr = strchr(rptr, ')'); + savech = *rrptr; + if (rrptr != NULL) + *rrptr = '\0'; + } + len = strlen(rptr) + 1; + if (*rptr && sending_path_len + len < sizeof(sending_path)) { + if (*sending_path) + strcat(sending_path, "!"); + strcat(sending_path, rptr); + sending_path_len += len; + } + if (rrptr != NULL) + *rrptr = savech; + } + if (strncmp(buffer, "Newsgroups: ", 12) == 0) { + if (*DefaultNewsgroups) { + fprintf(tmpfp, "Newsgroups: %s\r\n", DefaultNewsgroups); + } else { + fprintf(tmpfp, "%s\r\n", buffer); + } + ngmet = 1; + } else { + if (buffer[0] == '\0') { + if (!ngmet && *DefaultNewsgroups) { + fprintf(tmpfp, "Newsgroups: %s\r\n", DefaultNewsgroups); + } + if (!submet) { + fprintf(tmpfp, "Subject: (no subject)\r\n"); + } + if (!pathmet) { + fprintf(tmpfp, "Path: from-mail\r\n"); + } + if (!midmet) { + static int seed; + time_t now; + time(&now); + fprintf(tmpfp, "Message-ID: <%d@%d.%d.%d>\r\n", now, getpid(), getuid(), seed); + sprintf(mid, "<%d@%d.%d.%d>", now, getpid(), getuid(), seed); + seed++; + } + if (!orgmet && *DefaultOrganization) { + fprintf(tmpfp, "Organization: %s\r\n", DefaultOrganization); + } + if (!approvedmet && *DefaultModerator) { + fprintf(tmpfp, "Approved: %s\r\n", DefaultModerator); + } + } + if (strncmp(buffer, "From ", 5) != 0 && strncmp(buffer, "To: ", 4) != 0) { + if (buffer[0] == '\0') { + if (*sending_path) { + fprintf(tmpfp, "X-Sending-Path: %s\r\n", sending_path); + } + } + fprintf(tmpfp, "%s\r\n", buffer); + } + } + if (buffer[0] == '\0') + break; + } + fprintf(stderr, "Article Body begin ...\n"); + pathagain = 0; + while (fgets(buffer, sizeof buffer, stdin) != NULL) { + char *tmpptr; + tmpptr = strchr(buffer, '\n'); + if (tmpptr != NULL) + *tmpptr = '\0'; + if (headbegin(buffer)) { + FILE *oldfp = bbsnnrp->nnrpin; + pathagain = 1; + fputs(".\r\n", tmpfp); + fclose(tmpfp); + fprintf(stderr, "Try to post ...\n"); + tmpfp = fopen(tmpfilename, "r"); + bbsnnrp->nnrpin = tmpfp; + if (!discard) + if (INNBBSihave(bbsnnrp, -1, mid) == -1) { + fprintf(stderr, "post failed\n"); + } + bbsnnrp->nnrpin = oldfp; + fclose(tmpfp); + *mid = '\0'; + tmpfp = fopen(tmpfilename, "w"); + fprintf(tmpfp, "%s\r\n", buffer); + break; + } else { + fprintf(tmpfp, "%s\r\n", buffer); + } + } + if (!pathagain) + break; + } + if (!pathagain && tmpfp) { + FILE *oldfp = bbsnnrp->nnrpin; + fputs(".\r\n", tmpfp); + fclose(tmpfp); + fprintf(stderr, "Try to post ...\n"); + tmpfp = fopen(tmpfilename, "r"); + bbsnnrp->nnrpin = tmpfp; + if (!discard) + if (INNBBSihave(bbsnnrp, -1, mid) == -1) { + fprintf(stderr, "post failed\n"); + } + bbsnnrp->nnrpin = oldfp; + fclose(tmpfp); + } + if (isfile(tmpfilename)) { + unlink(tmpfilename); + } } -static char *ACT_BUF, *RC_BUF; -int ACT_COUNT; +static char *ACT_BUF, *RC_BUF; +int ACT_COUNT; initrcfiles(bbsnnrp) -nnrp_t *bbsnnrp; + nnrp_t *bbsnnrp; { - FILE *actfp, *rcfp; - char buff[1024]; - int actfd, i, count, actcount=0, rcount=0, maxcount; - struct stat st; - char *actlistptr, *ptr; - - actfd = open(bbsnnrp->activefile, O_RDWR); - if (actfd < 0) { - fprintf( stderr, "can't read/write %s\n", bbsnnrp->activefile ); - exit(1); - } - if (fstat(actfd, &st) != 0) { - fprintf( stderr, "can't stat %s\n", bbsnnrp->activefile ); - exit(1); - } - - bbsnnrp->actfd = actfd; - bbsnnrp->actsize = st.st_size; + FILE *actfp, *rcfp; + char buff[1024]; + int actfd, i, count, actcount = 0, rcount = 0, maxcount; + struct stat st; + char *actlistptr, *ptr; + + actfd = open(bbsnnrp->activefile, O_RDWR); + if (actfd < 0) { + fprintf(stderr, "can't read/write %s\n", bbsnnrp->activefile); + exit(1); + } + if (fstat(actfd, &st) != 0) { + fprintf(stderr, "can't stat %s\n", bbsnnrp->activefile); + exit(1); + } + bbsnnrp->actfd = actfd; + bbsnnrp->actsize = st.st_size; #ifdef USE_MMAP - bbsnnrp->actpointer = mmap(0, st.st_size, PROT_WRITE | PROT_READ, - MAP_SHARED, actfd, 0); - if (bbsnnrp->actpointer == (char*)-1) { - fprintf( stderr, "mmap error \n"); - exit(1); - } + bbsnnrp->actpointer = mmap(0, st.st_size, PROT_WRITE | PROT_READ, + MAP_SHARED, actfd, 0); + if (bbsnnrp->actpointer == (char *)-1) { + fprintf(stderr, "mmap error \n"); + exit(1); + } #else - if (bbsnnrp->actpointer == NULL) { - bbsnnrp->actpointer = (char*)mymalloc(st.st_size); - } else { - bbsnnrp->actpointer = (char*)myrealloc(bbsnnrp->actpointer,st.st_size); - } - if (bbsnnrp->actpointer == NULL || read(actfd, bbsnnrp->actpointer, st.st_size) <= 0) { - fprintf( stderr, "read act error \n"); - exit(1); - } + if (bbsnnrp->actpointer == NULL) { + bbsnnrp->actpointer = (char *)mymalloc(st.st_size); + } else { + bbsnnrp->actpointer = (char *)myrealloc(bbsnnrp->actpointer, st.st_size); + } + if (bbsnnrp->actpointer == NULL || read(actfd, bbsnnrp->actpointer, st.st_size) <= 0) { + fprintf(stderr, "read act error \n"); + exit(1); + } #endif - bbsnnrp->actend = bbsnnrp->actpointer + st.st_size; - i = 0, count = 0; - for (ptr = bbsnnrp->actpointer; ptr < bbsnnrp->actend && (actlistptr = (char*)strchr(ptr,'\n')) != NULL; ptr = actlistptr +1, ACT_COUNT++) { - if (*ptr == '\n') continue; - if (*ptr == '#') continue; - count ++; - } - bbsnnrp->newsrc = (newsrc_t*) mymalloc( sizeof(newsrc_t) * count); - ACT_COUNT = 0; - for (ptr = bbsnnrp->actpointer; ptr < bbsnnrp->actend && (actlistptr = (char*)strchr(ptr,'\n')) != NULL; ptr = actlistptr +1 ) { - register newsrc_t *rcptr; - char *nptr; - /**actlistptr = '\0';*/ - if (*ptr == '\n') continue; - if (*ptr == '#') continue; - rcptr = &bbsnnrp->newsrc[ACT_COUNT]; - rcptr->nameptr = NULL; - rcptr->namelen = 0; - rcptr->lowptr = NULL; - rcptr->lowlen = 0; - rcptr->highptr = NULL; - rcptr->highlen = 0; - rcptr->modeptr = NULL; - rcptr->low = 0; - rcptr->high = 0; - rcptr->mode = 'y'; - for (nptr= ptr ;*nptr && isspace(*nptr); ) nptr++; - if ( nptr == actlistptr ) continue; - rcptr->nameptr = nptr; - for (nptr++; *nptr && !isspace(*nptr); ) nptr++; - rcptr->namelen = (int)(nptr - rcptr->nameptr); - if ( nptr == actlistptr) continue; - for (nptr++ ;*nptr && isspace(*nptr); ) nptr++; - if ( nptr == actlistptr) continue; - rcptr->highptr = nptr; - rcptr->high = atol(nptr); - for (nptr++; *nptr && !isspace(*nptr); ) nptr++; - rcptr->highlen = (int)(nptr - rcptr->highptr); - if ( nptr == actlistptr) continue; - for (nptr++ ;*nptr && isspace(*nptr); ) nptr++; - if ( nptr == actlistptr) continue; - rcptr->lowptr = nptr; - rcptr->low = atol(nptr); - for (nptr++; *nptr && !isspace(*nptr); ) nptr++; - rcptr->lowlen = (int)(nptr - rcptr->lowptr); - if ( nptr == actlistptr) continue; - for (nptr++ ;*nptr && isspace(*nptr); ) nptr++; - if ( nptr == actlistptr) continue; - rcptr->mode = *nptr; - rcptr->modeptr = nptr; - ACT_COUNT ++; - } + bbsnnrp->actend = bbsnnrp->actpointer + st.st_size; + i = 0, count = 0; + for (ptr = bbsnnrp->actpointer; ptr < bbsnnrp->actend && (actlistptr = (char *)strchr(ptr, '\n')) != NULL; ptr = actlistptr + 1, ACT_COUNT++) { + if (*ptr == '\n') + continue; + if (*ptr == '#') + continue; + count++; + } + bbsnnrp->newsrc = (newsrc_t *) mymalloc(sizeof(newsrc_t) * count); + ACT_COUNT = 0; + for (ptr = bbsnnrp->actpointer; ptr < bbsnnrp->actend && (actlistptr = (char *)strchr(ptr, '\n')) != NULL; ptr = actlistptr + 1) { + register newsrc_t *rcptr; + char *nptr; + /**actlistptr = '\0';*/ + if (*ptr == '\n') + continue; + if (*ptr == '#') + continue; + rcptr = &bbsnnrp->newsrc[ACT_COUNT]; + rcptr->nameptr = NULL; + rcptr->namelen = 0; + rcptr->lowptr = NULL; + rcptr->lowlen = 0; + rcptr->highptr = NULL; + rcptr->highlen = 0; + rcptr->modeptr = NULL; + rcptr->low = 0; + rcptr->high = 0; + rcptr->mode = 'y'; + for (nptr = ptr; *nptr && isspace(*nptr);) + nptr++; + if (nptr == actlistptr) + continue; + rcptr->nameptr = nptr; + for (nptr++; *nptr && !isspace(*nptr);) + nptr++; + rcptr->namelen = (int)(nptr - rcptr->nameptr); + if (nptr == actlistptr) + continue; + for (nptr++; *nptr && isspace(*nptr);) + nptr++; + if (nptr == actlistptr) + continue; + rcptr->highptr = nptr; + rcptr->high = atol(nptr); + for (nptr++; *nptr && !isspace(*nptr);) + nptr++; + rcptr->highlen = (int)(nptr - rcptr->highptr); + if (nptr == actlistptr) + continue; + for (nptr++; *nptr && isspace(*nptr);) + nptr++; + if (nptr == actlistptr) + continue; + rcptr->lowptr = nptr; + rcptr->low = atol(nptr); + for (nptr++; *nptr && !isspace(*nptr);) + nptr++; + rcptr->lowlen = (int)(nptr - rcptr->lowptr); + if (nptr == actlistptr) + continue; + for (nptr++; *nptr && isspace(*nptr);) + nptr++; + if (nptr == actlistptr) + continue; + rcptr->mode = *nptr; + rcptr->modeptr = nptr; + ACT_COUNT++; + } } initsockets(server, bbsnnrp, type) -char *server; -nnrp_t *bbsnnrp; -char *type; + char *server; + nnrp_t *bbsnnrp; + char *type; { - int nnrpfd ; - int innbbsfd; - if (AskLocal) { - innbbsfd = unixclient(DefaultPath,"tcp"); - if (innbbsfd < 0) { - fprintf(stderr, "Connect to %s error. You may not run innbbsd\n", LOCALDAEMON); - /* unix connect fail, may run by inetd, try to connect to local once */ - innbbsfd = inetclient("localhost",DefaultPort,"tcp"); + int nnrpfd; + int innbbsfd; + if (AskLocal) { + innbbsfd = unixclient(DefaultPath, "tcp"); + if (innbbsfd < 0) { + fprintf(stderr, "Connect to %s error. You may not run innbbsd\n", LOCALDAEMON); + /* + * unix connect fail, may run by inetd, try to connect to local + * once + */ + innbbsfd = inetclient("localhost", DefaultPort, "tcp"); + if (innbbsfd < 0) { + exit(2); + } + close(innbbsfd); + /* try again */ + innbbsfd = unixclient(DefaultPath, "tcp"); + if (innbbsfd < 0) { + exit(3); + } + } + verboselog("INNBBS connect to %s\n", DefaultPath); + } else { + innbbsfd = inetclient(DefaultRemoteHost, DefaultPort, "tcp"); if (innbbsfd < 0) { - exit(2); + fprintf(stderr, "Connect to %s at %s error. Remote Server not Ready\n", DefaultRemoteHost, DefaultPort); + exit(2); } - close(innbbsfd); - /* try again */ - innbbsfd = unixclient(DefaultPath,"tcp"); - if (innbbsfd < 0) { - exit(3); + verboselog("INNBBS connect to %s\n", DefaultRemoteHost); + } + if (type == StdinInputType) { + bbsnnrp->nnrpfd = 0; + bbsnnrp->innbbsfd = innbbsfd; + if ((bbsnnrp->nnrpin = fdopen(0, "r")) == NULL || + (bbsnnrp->nnrpout = fdopen(1, "w")) == NULL || + (bbsnnrp->innbbsin = fdopen(innbbsfd, "r")) == NULL || + (bbsnnrp->innbbsout = fdopen(innbbsfd, "w")) == NULL) { + fprintf(stderr, "fdopen error\n"); + exit(3); } - } - verboselog("INNBBS connect to %s\n",DefaultPath); - } else { - innbbsfd = inetclient(DefaultRemoteHost,DefaultPort,"tcp"); - if (innbbsfd < 0) { - fprintf(stderr, "Connect to %s at %s error. Remote Server not Ready\n", DefaultRemoteHost, DefaultPort); - exit(2); - } - verboselog("INNBBS connect to %s\n",DefaultRemoteHost); - } - if (type == StdinInputType) { - bbsnnrp->nnrpfd = 0; - bbsnnrp->innbbsfd = innbbsfd; - if ((bbsnnrp->nnrpin = fdopen(0,"r")) == NULL || - (bbsnnrp->nnrpout= fdopen(1,"w")) == NULL || - (bbsnnrp->innbbsin= fdopen(innbbsfd,"r")) == NULL || - (bbsnnrp->innbbsout= fdopen(innbbsfd,"w"))== NULL ) { - fprintf( stderr, "fdopen error\n"); - exit(3); - } - return; - } - nnrpfd = inetclient(server, "nntp","tcp"); - if (nnrpfd < 0) { - fprintf(stderr, " connect to %s error \n", server); - exit(2); - } - verboselog("NNRP connect to %s\n", server); - bbsnnrp->nnrpfd = nnrpfd; - bbsnnrp->innbbsfd = innbbsfd; - if ((bbsnnrp->nnrpin = fdopen(nnrpfd,"r")) == NULL || - (bbsnnrp->nnrpout= fdopen(nnrpfd,"w")) == NULL || - (bbsnnrp->innbbsin= fdopen(innbbsfd,"r")) == NULL || - (bbsnnrp->innbbsout= fdopen(innbbsfd,"w"))== NULL ) { - fprintf( stderr, "fdopen error\n"); - exit(3); - } + return; + } + nnrpfd = inetclient(server, "nntp", "tcp"); + if (nnrpfd < 0) { + fprintf(stderr, " connect to %s error \n", server); + exit(2); + } + verboselog("NNRP connect to %s\n", server); + bbsnnrp->nnrpfd = nnrpfd; + bbsnnrp->innbbsfd = innbbsfd; + if ((bbsnnrp->nnrpin = fdopen(nnrpfd, "r")) == NULL || + (bbsnnrp->nnrpout = fdopen(nnrpfd, "w")) == NULL || + (bbsnnrp->innbbsin = fdopen(innbbsfd, "r")) == NULL || + (bbsnnrp->innbbsout = fdopen(innbbsfd, "w")) == NULL) { + fprintf(stderr, "fdopen error\n"); + exit(3); + } } closesockets() { - fclose(BBSNNRP.nnrpin); - fclose(BBSNNRP.nnrpout); - fclose(BBSNNRP.innbbsin); - fclose(BBSNNRP.innbbsout); - close(BBSNNRP.nnrpfd); - close(BBSNNRP.innbbsfd); + fclose(BBSNNRP.nnrpin); + fclose(BBSNNRP.nnrpout); + fclose(BBSNNRP.innbbsin); + fclose(BBSNNRP.innbbsout); + close(BBSNNRP.nnrpfd); + close(BBSNNRP.innbbsfd); } updaterc(actptr, len, value) -char *actptr; -int len; -ULONG value; + char *actptr; + int len; + ULONG value; { - for (actptr += len -1; len -- >0; ) { - *actptr-- = value % 10 + '0'; - value /= 10; - } + for (actptr += len - 1; len-- > 0;) { + *actptr-- = value % 10 + '0'; + value /= 10; + } } -/* - if old file is empty, don't need to update - prevent from disk full -*/ +/* + * if old file is empty, don't need to update prevent from disk full + */ int -myrename(old,new) -char *old, *new; +myrename(old, new) + char *old, *new; { - struct stat st; - if (stat(old,&st) != 0) return -1; - if (st.st_size <= 0) return -1; - return rename(old,new); + struct stat st; + if (stat(old, &st) != 0) + return -1; + if (st.st_size <= 0) + return -1; + return rename(old, new); } flushrc(bbsnnrp) -nnrp_t *bbsnnrp; + nnrp_t *bbsnnrp; { - int backfd; - char *bak1; - if (bbsnnrp->actdirty == 0) return; - bak1 = (char*)strdup((char*)fileglue("%s.BAK",bbsnnrp->activefile)); - if (isfile(bak1)) { - myrename(bak1, (char*)fileglue("%s.BAK.OLD",bbsnnrp->activefile)); - } + int backfd; + char *bak1; + if (bbsnnrp->actdirty == 0) + return; + bak1 = (char *)strdup((char *)fileglue("%s.BAK", bbsnnrp->activefile)); + if (isfile(bak1)) { + myrename(bak1, (char *)fileglue("%s.BAK.OLD", bbsnnrp->activefile)); + } #ifdef USE_MMAP - if ((backfd=open((char*)fileglue("%s.BAK",bbsnnrp->activefile),O_WRONLY | O_TRUNC | O_CREAT, 0664)) < 0 || write(backfd, bbsnnrp->actpointer, bbsnnrp->actsize) < bbsnnrp->actsize) + if ((backfd = open((char *)fileglue("%s.BAK", bbsnnrp->activefile), O_WRONLY | O_TRUNC | O_CREAT, 0664)) < 0 || write(backfd, bbsnnrp->actpointer, bbsnnrp->actsize) < bbsnnrp->actsize) #else - myrename(bbsnnrp->activefile, bak1); - if ((backfd=open(bbsnnrp->activefile,O_WRONLY | O_TRUNC | O_CREAT, 0664)) < 0 || write(backfd, bbsnnrp->actpointer, bbsnnrp->actsize) < bbsnnrp->actsize) + myrename(bbsnnrp->activefile, bak1); + if ((backfd = open(bbsnnrp->activefile, O_WRONLY | O_TRUNC | O_CREAT, 0664)) < 0 || write(backfd, bbsnnrp->actpointer, bbsnnrp->actsize) < bbsnnrp->actsize) #endif - { - char emergent[128]; - sprintf(emergent,"/tmp/bbsnnrp.%d.active",getpid()); + { + char emergent[128]; + sprintf(emergent, "/tmp/bbsnnrp.%d.active", getpid()); fprintf(stderr, "write to backup active fail. Maybe disk full\n"); - fprintf(stderr, "try to write in %s\n",emergent); - if ((backfd = open(emergent,O_WRONLY | O_TRUNC | O_CREAT, 0644))<0 || write(backfd, bbsnnrp->actpointer, bbsnnrp->actsize) < bbsnnrp->actsize) - { - fprintf(stderr, "write to %sfail.\n", emergent); + fprintf(stderr, "try to write in %s\n", emergent); + if ((backfd = open(emergent, O_WRONLY | O_TRUNC | O_CREAT, 0644)) < 0 || write(backfd, bbsnnrp->actpointer, bbsnnrp->actsize) < bbsnnrp->actsize) { + fprintf(stderr, "write to %sfail.\n", emergent); } else { - close(backfd); + close(backfd); } /* if write fail, should leave */ - /*exit(1);*/ - } else { - close(backfd); - } - free(bak1); - bbsnnrp->actdirty = 0; + /* exit(1); */ + } else { + close(backfd); + } + free(bak1); + bbsnnrp->actdirty = 0; } writerc(bbsnnrp) -nnrp_t *bbsnnrp; + nnrp_t *bbsnnrp; { - if (bbsnnrp->actpointer) { - flushrc(bbsnnrp); + if (bbsnnrp->actpointer) { + flushrc(bbsnnrp); #ifdef USE_MMAP - if (munmap(bbsnnrp->actpointer, bbsnnrp->actsize) < 0) - fprintf(stderr, "can't unmap\n"); - /*free(bbsnnrp->actpointer);*/ - bbsnnrp->actpointer = NULL; + if (munmap(bbsnnrp->actpointer, bbsnnrp->actsize) < 0) + fprintf(stderr, "can't unmap\n"); + /* free(bbsnnrp->actpointer); */ + bbsnnrp->actpointer = NULL; #endif - if (close(bbsnnrp->actfd) < 0) - fprintf(stderr, "can't close actfd\n"); - } + if (close(bbsnnrp->actfd) < 0) + fprintf(stderr, "can't close actfd\n"); + } } -static FILE* Xhdrfp; -static char NNRPbuffer[4096]; -static char INNBBSbuffer[4096]; +static FILE *Xhdrfp; +static char NNRPbuffer[4096]; +static char INNBBSbuffer[4096]; -char * +char * NNRPgets(string, len, fp) -char *string; -int len; -FILE *fp; + char *string; + int len; + FILE *fp; { - char* re = fgets(string, len, fp); - char *ptr; - if (re != NULL) { - if ((ptr = (char*)strchr(string,'\r'))!=NULL) - *ptr = '\0'; - if ((ptr = (char*)strchr(string,'\n'))!=NULL) - *ptr = '\0'; - } - return re; + char *re = fgets(string, len, fp); + char *ptr; + if (re != NULL) { + if ((ptr = (char *)strchr(string, '\r')) != NULL) + *ptr = '\0'; + if ((ptr = (char *)strchr(string, '\n')) != NULL) + *ptr = '\0'; + } + return re; } -int NNRPstat(bbsnnrp, artno, mid) -nnrp_t *bbsnnrp; - ULONG artno; -char **mid; +int +NNRPstat(bbsnnrp, artno, mid) + nnrp_t *bbsnnrp; + ULONG artno; + char **mid; { - char *ptr; - int code; - - *mid = NULL; - fprintf(bbsnnrp->nnrpout,"STAT %d\r\n",artno); - fflush(bbsnnrp->nnrpout); - verboselog("nnrpPut: STAT %d\n",artno); - NNRPgets(NNRPbuffer, sizeof NNRPbuffer, bbsnnrp->nnrpin); - verboselog("nnrpGet: %s\n",NNRPbuffer); + char *ptr; + int code; - ptr = (char*) strchr(NNRPbuffer, ' '); - if (ptr != NULL) *ptr++ = '\0'; - code = atoi(NNRPbuffer); - ptr = (char*) strchr(ptr, ' '); - if (ptr != NULL) *ptr++ = '\0'; - *mid = ptr; - ptr = (char*) strchr(ptr, ' '); - if (ptr != NULL) *ptr++ = '\0'; - return code; + *mid = NULL; + fprintf(bbsnnrp->nnrpout, "STAT %d\r\n", artno); + fflush(bbsnnrp->nnrpout); + verboselog("nnrpPut: STAT %d\n", artno); + NNRPgets(NNRPbuffer, sizeof NNRPbuffer, bbsnnrp->nnrpin); + verboselog("nnrpGet: %s\n", NNRPbuffer); + + ptr = (char *)strchr(NNRPbuffer, ' '); + if (ptr != NULL) + *ptr++ = '\0'; + code = atoi(NNRPbuffer); + ptr = (char *)strchr(ptr, ' '); + if (ptr != NULL) + *ptr++ = '\0'; + *mid = ptr; + ptr = (char *)strchr(ptr, ' '); + if (ptr != NULL) + *ptr++ = '\0'; + return code; } int NNRPxhdr(pattern, bbsnnrp, i, low, high) -char *pattern; -nnrp_t *bbsnnrp; -int i; -ULONG low, high; + char *pattern; + nnrp_t *bbsnnrp; + int i; + ULONG low, high; { - newsrc_t *rcptr = &bbsnnrp->newsrc[i]; - int size, code; + newsrc_t *rcptr = &bbsnnrp->newsrc[i]; + int size, code; - Xhdrfp = bbsnnrp->nnrpin; - fprintf(bbsnnrp->nnrpout,"XHDR %s %d-%d\r\n",pattern,low, high ); + Xhdrfp = bbsnnrp->nnrpin; + fprintf(bbsnnrp->nnrpout, "XHDR %s %d-%d\r\n", pattern, low, high); #ifdef BBSNNRPDEBUG - printf("XHDR %s %d-%d\r\n",pattern,low, high ); + printf("XHDR %s %d-%d\r\n", pattern, low, high); #endif - fflush(bbsnnrp->nnrpout); - verboselog("nnrpPut: XHDR %s %d-%d\n",pattern,low, high ); - NNRPgets(NNRPbuffer, sizeof NNRPbuffer, bbsnnrp->nnrpin); - verboselog("nnrpGet: %s\n", NNRPbuffer); - code = atoi(NNRPbuffer); - return code; + fflush(bbsnnrp->nnrpout); + verboselog("nnrpPut: XHDR %s %d-%d\n", pattern, low, high); + NNRPgets(NNRPbuffer, sizeof NNRPbuffer, bbsnnrp->nnrpin); + verboselog("nnrpGet: %s\n", NNRPbuffer); + code = atoi(NNRPbuffer); + return code; } -int NNRPxhdrget(artno, mid, iscontrol) -int *artno; -char **mid; -int iscontrol; +int +NNRPxhdrget(artno, mid, iscontrol) + int *artno; + char **mid; + int iscontrol; { *mid = NULL; *artno = 0; if (NNRPgets(NNRPbuffer, sizeof NNRPbuffer, Xhdrfp) == NULL) - return 0; + return 0; else { - char *ptr, *s; - if (strcmp(NNRPbuffer,".")==0) return 0; - ptr = (char*)strchr(NNRPbuffer,' '); - if (!ptr) return 1; - *ptr++ = '\0'; - *artno = atol(NNRPbuffer); - if (iscontrol) { - ptr = (char*)strchr(s=ptr,' '); - if (!ptr) return 1; - *ptr++ = '\0'; - if (strcmp(s,"cancel") != 0) return 1; - } - *mid = ptr; - return 1; + char *ptr, *s; + if (strcmp(NNRPbuffer, ".") == 0) + return 0; + ptr = (char *)strchr(NNRPbuffer, ' '); + if (!ptr) + return 1; + *ptr++ = '\0'; + *artno = atol(NNRPbuffer); + if (iscontrol) { + ptr = (char *)strchr(s = ptr, ' '); + if (!ptr) + return 1; + *ptr++ = '\0'; + if (strcmp(s, "cancel") != 0) + return 1; + } + *mid = ptr; + return 1; } } -int INNBBSstat(bbsnnrp, i, mid) -nnrp_t *bbsnnrp; -int i; -char *mid; +int +INNBBSstat(bbsnnrp, i, mid) + nnrp_t *bbsnnrp; + int i; + char *mid; { - newsrc_t *rcptr = &bbsnnrp->newsrc[i]; - int size, code; - - fprintf(bbsnnrp->innbbsout,"STAT %s\r\n", mid); - fflush(bbsnnrp->innbbsout); - verboselog("innbbsPut: STAT %s\n", mid); - NNRPgets(INNBBSbuffer, sizeof INNBBSbuffer, bbsnnrp->innbbsin); - verboselog("innbbsGet: %s\n", INNBBSbuffer); - return atol(INNBBSbuffer); + newsrc_t *rcptr = &bbsnnrp->newsrc[i]; + int size, code; + + fprintf(bbsnnrp->innbbsout, "STAT %s\r\n", mid); + fflush(bbsnnrp->innbbsout); + verboselog("innbbsPut: STAT %s\n", mid); + NNRPgets(INNBBSbuffer, sizeof INNBBSbuffer, bbsnnrp->innbbsin); + verboselog("innbbsGet: %s\n", INNBBSbuffer); + return atol(INNBBSbuffer); } -int INNBBSihave(bbsnnrp, artno, mid) -nnrp_t *bbsnnrp; -ULONG artno; -char *mid; +int +INNBBSihave(bbsnnrp, artno, mid) + nnrp_t *bbsnnrp; + ULONG artno; + char *mid; { - int size, code; - int header=1; - - if (DefaultNntpProtocol == NntpPostProtocol) { - fprintf(bbsnnrp->innbbsout,"POST\r\n"); - fflush(bbsnnrp->innbbsout); - verboselog("innbbsPut: POST %s\n", mid); - } else { - fprintf(bbsnnrp->innbbsout,"IHAVE %s\r\n", mid); - fflush(bbsnnrp->innbbsout); - verboselog("innbbsPut: IHAVE %s\n", mid); - } - if (NNRPgets(INNBBSbuffer, sizeof INNBBSbuffer, bbsnnrp->innbbsin)==NULL){ + int size, code; + int header = 1; + + if (DefaultNntpProtocol == NntpPostProtocol) { + fprintf(bbsnnrp->innbbsout, "POST\r\n"); + fflush(bbsnnrp->innbbsout); + verboselog("innbbsPut: POST %s\n", mid); + } else { + fprintf(bbsnnrp->innbbsout, "IHAVE %s\r\n", mid); + fflush(bbsnnrp->innbbsout); + verboselog("innbbsPut: IHAVE %s\n", mid); + } + if (NNRPgets(INNBBSbuffer, sizeof INNBBSbuffer, bbsnnrp->innbbsin) == NULL) { return -1; - } - verboselog("innbbsGet: %s\n", INNBBSbuffer); + } + verboselog("innbbsGet: %s\n", INNBBSbuffer); #ifdef BBSNNRPDEBUG - printf("ihave got %s\n", INNBBSbuffer); + printf("ihave got %s\n", INNBBSbuffer); #endif - if (DefaultNntpProtocol == NntpPostProtocol) { - if ((code=atol(INNBBSbuffer)) != NNTP_START_POST_VAL) { - if (code == NNTP_POSTFAIL_VAL) - return 0; - else - return -1; - } - } else { - if ((code=atol(INNBBSbuffer)) != INNBBSihaveOK) { - if (code == 435 || code == 437) - return 0; - else - return -1; - } - } - if (artno != -1) { - fprintf(bbsnnrp->nnrpout,"ARTICLE %d\r\n", artno); - verboselog("nnrpPut: ARTICLE %d\n", artno); + if (DefaultNntpProtocol == NntpPostProtocol) { + if ((code = atol(INNBBSbuffer)) != NNTP_START_POST_VAL) { + if (code == NNTP_POSTFAIL_VAL) + return 0; + else + return -1; + } + } else { + if ((code = atol(INNBBSbuffer)) != INNBBSihaveOK) { + if (code == 435 || code == 437) + return 0; + else + return -1; + } + } + if (artno != -1) { + fprintf(bbsnnrp->nnrpout, "ARTICLE %d\r\n", artno); + verboselog("nnrpPut: ARTICLE %d\n", artno); #ifdef BBSNNRPDEBUG - printf("ARTICLE %d\r\n", artno); + printf("ARTICLE %d\r\n", artno); #endif - fflush(bbsnnrp->nnrpout); - if (NNRPgets(NNRPbuffer, sizeof NNRPbuffer, bbsnnrp->nnrpin)==NULL) { - return -1; - } - verboselog("nnrpGet: %s\n", NNRPbuffer); + fflush(bbsnnrp->nnrpout); + if (NNRPgets(NNRPbuffer, sizeof NNRPbuffer, bbsnnrp->nnrpin) == NULL) { + return -1; + } + verboselog("nnrpGet: %s\n", NNRPbuffer); #ifdef BBSNNRPDEBUG - printf("article got %s\n", NNRPbuffer); + printf("article got %s\n", NNRPbuffer); #endif - if (atol(NNRPbuffer) != NNRParticleOK) { - fputs(".\r\n",bbsnnrp->innbbsout); - fflush(bbsnnrp->innbbsout); - NNRPgets(INNBBSbuffer, sizeof INNBBSbuffer, bbsnnrp->innbbsin); - verboselog("innbbsGet: %s\n",INNBBSbuffer); - return 0; - } - } - header = 1; - while ( fgets(NNRPbuffer, sizeof NNRPbuffer, bbsnnrp->nnrpin) != NULL) - { - if (strcmp(NNRPbuffer,"\r\n") == 0) + if (atol(NNRPbuffer) != NNRParticleOK) { + fputs(".\r\n", bbsnnrp->innbbsout); + fflush(bbsnnrp->innbbsout); + NNRPgets(INNBBSbuffer, sizeof INNBBSbuffer, bbsnnrp->innbbsin); + verboselog("innbbsGet: %s\n", INNBBSbuffer); + return 0; + } + } + header = 1; + while (fgets(NNRPbuffer, sizeof NNRPbuffer, bbsnnrp->nnrpin) != NULL) { + if (strcmp(NNRPbuffer, "\r\n") == 0) header = 0; - if (strcmp(NNRPbuffer,".\r\n")==0) { - verboselog("nnrpGet: .\n"); - fputs(NNRPbuffer,bbsnnrp->innbbsout); - fflush(bbsnnrp->innbbsout); - verboselog("innbbsPut: .\n"); - if (NNRPgets(INNBBSbuffer, sizeof INNBBSbuffer, bbsnnrp->innbbsin)==NULL) + if (strcmp(NNRPbuffer, ".\r\n") == 0) { + verboselog("nnrpGet: .\n"); + fputs(NNRPbuffer, bbsnnrp->innbbsout); + fflush(bbsnnrp->innbbsout); + verboselog("innbbsPut: .\n"); + if (NNRPgets(INNBBSbuffer, sizeof INNBBSbuffer, bbsnnrp->innbbsin) == NULL) return -1; - verboselog("innbbsGet: %s\n",INNBBSbuffer); + verboselog("innbbsGet: %s\n", INNBBSbuffer); #ifdef BBSNNRPDEBUG printf("end ihave got %s\n", INNBBSbuffer); #endif code = atol(INNBBSbuffer); - if (DefaultNntpProtocol == NntpPostProtocol) { - if (code == NNTP_POSTEDOK_VAL) - return 1; - if (code == NNTP_POSTFAIL_VAL) - return 0; + if (DefaultNntpProtocol == NntpPostProtocol) { + if (code == NNTP_POSTEDOK_VAL) + return 1; + if (code == NNTP_POSTFAIL_VAL) + return 0; } else { - if (code == 235) - return 1; - if (code == 437 || code == 435) - return 0; - } - break; - } - if ( DefaultNntpProtocol == NntpPostProtocol && - header && strncasecmp(NNRPbuffer,"NNTP-Posting-Host: ",19)==0) { - fprintf(bbsnnrp->innbbsout,"X-%s",NNRPbuffer); - } else { - fputs(NNRPbuffer,bbsnnrp->innbbsout); - } - } - fflush(bbsnnrp->innbbsout); - return -1; + if (code == 235) + return 1; + if (code == 437 || code == 435) + return 0; + } + break; + } + if (DefaultNntpProtocol == NntpPostProtocol && + header && strncasecmp(NNRPbuffer, "NNTP-Posting-Host: ", 19) == 0) { + fprintf(bbsnnrp->innbbsout, "X-%s", NNRPbuffer); + } else { + fputs(NNRPbuffer, bbsnnrp->innbbsout); + } + } + fflush(bbsnnrp->innbbsout); + return -1; } int NNRPgroup(bbsnnrp, i, low, high) -nnrp_t *bbsnnrp; -int i; -ULONG *low, *high; + nnrp_t *bbsnnrp; + int i; + ULONG *low, *high; { - newsrc_t *rcptr = &bbsnnrp->newsrc[i]; - int size, code; - ULONG tmp; - - fprintf(bbsnnrp->nnrpout,"GROUP %-.*s\r\n", - rcptr->namelen, rcptr->nameptr ); - printf("GROUP %-.*s\r\n", rcptr->namelen, rcptr->nameptr ); - verboselog("nnrpPut: GROUP %-.*s\n", rcptr->namelen, rcptr->nameptr ); - fflush(bbsnnrp->nnrpout); - NNRPgets(NNRPbuffer, sizeof NNRPbuffer, bbsnnrp->nnrpin); - verboselog("nnrpGet: %s\n",NNRPbuffer); - printf("%s\n",NNRPbuffer); - sscanf(NNRPbuffer, "%d %d %ld %ld", &code, &size, low, high); - if (*low > *high) { - tmp = *low; - *low = *high; - *high = tmp; - } - return code; + newsrc_t *rcptr = &bbsnnrp->newsrc[i]; + int size, code; + ULONG tmp; + + fprintf(bbsnnrp->nnrpout, "GROUP %-.*s\r\n", + rcptr->namelen, rcptr->nameptr); + printf("GROUP %-.*s\r\n", rcptr->namelen, rcptr->nameptr); + verboselog("nnrpPut: GROUP %-.*s\n", rcptr->namelen, rcptr->nameptr); + fflush(bbsnnrp->nnrpout); + NNRPgets(NNRPbuffer, sizeof NNRPbuffer, bbsnnrp->nnrpin); + verboselog("nnrpGet: %s\n", NNRPbuffer); + printf("%s\n", NNRPbuffer); + sscanf(NNRPbuffer, "%d %d %ld %ld", &code, &size, low, high); + if (*low > *high) { + tmp = *low; + *low = *high; + *high = tmp; + } + return code; } -readnews(server,bbsnnrp) -char *server; -nnrp_t *bbsnnrp; +readnews(server, bbsnnrp) + char *server; + nnrp_t *bbsnnrp; { - int i; - char buffer[4096]; - ULONG low, high; - - fgets(buffer, sizeof buffer, bbsnnrp->innbbsin); - verboselog("innbbsGet: %s", buffer); - if (atoi(buffer) != INNBBSconnectOK) { - fprintf(stderr, "INNBBS server not OK\n"); - return; - } + int i; + char buffer[4096]; + ULONG low, high; + + fgets(buffer, sizeof buffer, bbsnnrp->innbbsin); + verboselog("innbbsGet: %s", buffer); + if (atoi(buffer) != INNBBSconnectOK) { + fprintf(stderr, "INNBBS server not OK\n"); + return; + } #ifdef BBSNNRPDEBUG - printf("%s",buffer); + printf("%s", buffer); #endif - fgets(buffer, sizeof buffer, bbsnnrp->nnrpin); - verboselog("nnrpGet: %s", buffer); - if (buffer[0] != '2') { - /*if (atoi(buffer) != NNRPconnectOK && atoi(buffer) != NNTP_NOPOSTOK_VAL) {*/ - fprintf(stderr, "NNRP server not OK\n"); - return; - } + fgets(buffer, sizeof buffer, bbsnnrp->nnrpin); + verboselog("nnrpGet: %s", buffer); + if (buffer[0] != '2') { + /* + * if (atoi(buffer) != NNRPconnectOK && atoi(buffer) != + * NNTP_NOPOSTOK_VAL) { + */ + fprintf(stderr, "NNRP server not OK\n"); + return; + } #ifdef BBSNNRPDEBUG - printf("%s",buffer); + printf("%s", buffer); #endif - fputs("MODE READER\r\n", bbsnnrp->nnrpout); - fflush(bbsnnrp->nnrpout); - verboselog("nnrpPut: MODE READER\n"); - fgets(buffer, sizeof buffer, bbsnnrp->nnrpin); - verboselog("nnrpGet: %s",buffer); - - if ( DefaultNntpProtocol == NntpPostProtocol ) { - fputs("MODE READER\r\n", bbsnnrp->innbbsout); - fflush(bbsnnrp->innbbsout); - verboselog("innbbsPut: MODE READER\n"); - fgets(buffer, sizeof buffer, bbsnnrp->innbbsin); - verboselog("innbbsGet: %s",buffer); - } - + fputs("MODE READER\r\n", bbsnnrp->nnrpout); + fflush(bbsnnrp->nnrpout); + verboselog("nnrpPut: MODE READER\n"); + fgets(buffer, sizeof buffer, bbsnnrp->nnrpin); + verboselog("nnrpGet: %s", buffer); + + if (DefaultNntpProtocol == NntpPostProtocol) { + fputs("MODE READER\r\n", bbsnnrp->innbbsout); + fflush(bbsnnrp->innbbsout); + verboselog("innbbsPut: MODE READER\n"); + fgets(buffer, sizeof buffer, bbsnnrp->innbbsin); + verboselog("innbbsGet: %s", buffer); + } #ifdef BBSNNRPDEBUG - printf("%s",buffer); + printf("%s", buffer); #endif - - if (StatHistory == 0) { - fputs("MIDCHECK OFF\r\n", bbsnnrp->innbbsout); - fflush(bbsnnrp->innbbsout); - verboselog("innbbsPut: MIDCHECK OFF\n"); - fgets(buffer, sizeof buffer, bbsnnrp->innbbsin); - verboselog("innbbsGet: %s",buffer); - } - bbsnnrp->actdirty = 0; - for (i =0; i< ACT_COUNT; i++) { - int code = NNRPgroup(bbsnnrp, i, &low, &high); - newsrc_t *rcptr = &bbsnnrp->newsrc[i]; - int j; - ULONG artno; - char *mid; - int artcount; + + if (StatHistory == 0) { + fputs("MIDCHECK OFF\r\n", bbsnnrp->innbbsout); + fflush(bbsnnrp->innbbsout); + verboselog("innbbsPut: MIDCHECK OFF\n"); + fgets(buffer, sizeof buffer, bbsnnrp->innbbsin); + verboselog("innbbsGet: %s", buffer); + } + bbsnnrp->actdirty = 0; + for (i = 0; i < ACT_COUNT; i++) { + int code = NNRPgroup(bbsnnrp, i, &low, &high); + newsrc_t *rcptr = &bbsnnrp->newsrc[i]; + int j; + ULONG artno; + char *mid; + int artcount; #ifdef BBSNNRPDEBUG - printf("got reply %d %ld %ld\n",code, low, high); + printf("got reply %d %ld %ld\n", code, low, high); #endif - artcount = 0; - if (code == 411) - { - FILE *ff=fopen(BBSHOME"/innd/log/badgroup.log","a"); - fprintf(ff,"%s\t%-.*s\r\n", server, rcptr->namelen, rcptr->nameptr); - fclose(ff); - } - else if (code == NNRPGroupOK) { - int xcount; - ULONG maxartno= rcptr->high; - int isCancelControl = (strncmp(rcptr->nameptr,"control",rcptr->namelen)==0) - || - (strncmp(rcptr->nameptr,"control.cancel",rcptr->namelen)==0) ; - -/* less than or equal to high, for server renumber */ - if (rcptr->low != low) { + artcount = 0; + if (code == 411) { + FILE *ff = fopen(BBSHOME "/innd/log/badgroup.log", "a"); + fprintf(ff, "%s\t%-.*s\r\n", server, rcptr->namelen, rcptr->nameptr); + fclose(ff); + } else if (code == NNRPGroupOK) { + int xcount; + ULONG maxartno = rcptr->high; + int isCancelControl = (strncmp(rcptr->nameptr, "control", rcptr->namelen) == 0) + || + (strncmp(rcptr->nameptr, "control.cancel", rcptr->namelen) == 0); + + /* less than or equal to high, for server renumber */ + if (rcptr->low != low) { bbsnnrp->actdirty = 1; rcptr->low = low; updaterc(rcptr->lowptr, rcptr->lowlen, rcptr->low); - } - if (ResetActive) { - if (rcptr->high != high) { - bbsnnrp->actdirty = 1; - rcptr->high = high; - updaterc(rcptr->highptr, rcptr->highlen, rcptr->high); - } - } else if (rcptr->high < high) { - int xhdrcode; - ULONG maxget=high; - int exception=0; - if (rcptr->high < low) { - bbsnnrp->actdirty = 1; - rcptr->high = low; - updaterc(rcptr->highptr, rcptr->highlen, low); - } - if (high > rcptr->high + Max_Stats) { - maxget = rcptr->high + Max_Stats; - } - if ( isCancelControl ) - xhdrcode = NNRPxhdr("Control",bbsnnrp, i, rcptr->high+1, maxget); - else - xhdrcode = NNRPxhdr("Message-ID",bbsnnrp, i, rcptr->high+1, maxget); - - maxartno = maxget; - if ( xhdrcode == NNRPXhdrOK) { - while (NNRPxhdrget(&artno, &mid, isCancelControl)) { -/*#define DEBUG*/ + } + if (ResetActive) { + if (rcptr->high != high) { + bbsnnrp->actdirty = 1; + rcptr->high = high; + updaterc(rcptr->highptr, rcptr->highlen, rcptr->high); + } + } else if (rcptr->high < high) { + int xhdrcode; + ULONG maxget = high; + int exception = 0; + if (rcptr->high < low) { + bbsnnrp->actdirty = 1; + rcptr->high = low; + updaterc(rcptr->highptr, rcptr->highlen, low); + } + if (high > rcptr->high + Max_Stats) { + maxget = rcptr->high + Max_Stats; + } + if (isCancelControl) + xhdrcode = NNRPxhdr("Control", bbsnnrp, i, rcptr->high + 1, maxget); + else + xhdrcode = NNRPxhdr("Message-ID", bbsnnrp, i, rcptr->high + 1, maxget); + + maxartno = maxget; + if (xhdrcode == NNRPXhdrOK) { + while (NNRPxhdrget(&artno, &mid, isCancelControl)) { + /* #define DEBUG */ #ifdef DEBUG - printf("no %d id %s\n",artno, mid); + printf("no %d id %s\n", artno, mid); #endif - if (artcount < Max_Arts) { - if (mid != NULL && !isCancelControl) { - if (!StatHistory || INNBBSstat(bbsnnrp,i,mid) != INNBBSstatOK) { - printf("** %d ** %d need it %s\n", artcount, artno,mid); - XHDR[artcount].artno = artno; - XHDR[artcount].header = restrdup(XHDR[artcount].header,mid); - /*INNBBSihave(bbsnnrp,i,artno,mid);*/ - /* to get it */ - artcount++; - } - } else if (mid != NULL) { - if (INNBBSstat(bbsnnrp,i,mid) == INNBBSstatOK) { - printf("** %d ** %d need cancel %s\n", artcount, artno,mid); - XHDR[artcount].artno = artno; - XHDR[artcount].header = restrdup(XHDR[artcount].header,mid); - artcount++; - } - } - maxartno = artno; - } - } - }/* while xhdr OK */ - exception = 0; - for (xcount = 0; xcount < artcount; xcount++) { - ULONG artno; - char *mid; - artno = XHDR[xcount].artno; - mid = XHDR[xcount].header; - if (isCancelControl) { - if (NNRPstat(bbsnnrp,artno,&mid) == NNRPstatOK) { - } - } - printf("** %d ** %d i have it %s\n", xcount, artno, mid); - if (!ResetActive && mid != NULL) - exception = INNBBSihave(bbsnnrp,artno,mid); - if (exception == -1) break; - if (rcptr->high != artno) { - rcptr->high = artno; - updaterc(rcptr->highptr, rcptr->highlen, rcptr->high); + if (artcount < Max_Arts) { + if (mid != NULL && !isCancelControl) { + if (!StatHistory || INNBBSstat(bbsnnrp, i, mid) != INNBBSstatOK) { + printf("** %d ** %d need it %s\n", artcount, artno, mid); + XHDR[artcount].artno = artno; + XHDR[artcount].header = restrdup(XHDR[artcount].header, mid); + /* INNBBSihave(bbsnnrp,i,artno,mid); */ + /* to get it */ + artcount++; + } + } else if (mid != NULL) { + if (INNBBSstat(bbsnnrp, i, mid) == INNBBSstatOK) { + printf("** %d ** %d need cancel %s\n", artcount, artno, mid); + XHDR[artcount].artno = artno; + XHDR[artcount].header = restrdup(XHDR[artcount].header, mid); + artcount++; + } + } + maxartno = artno; + } + } + } /* while xhdr OK */ + exception = 0; + for (xcount = 0; xcount < artcount; xcount++) { + ULONG artno; + char *mid; + artno = XHDR[xcount].artno; + mid = XHDR[xcount].header; + if (isCancelControl) { + if (NNRPstat(bbsnnrp, artno, &mid) == NNRPstatOK) { + } + } + printf("** %d ** %d i have it %s\n", xcount, artno, mid); + if (!ResetActive && mid != NULL) + exception = INNBBSihave(bbsnnrp, artno, mid); + if (exception == -1) + break; + if (rcptr->high != artno) { + rcptr->high = artno; + updaterc(rcptr->highptr, rcptr->highlen, rcptr->high); + } + } + if (rcptr->high != maxartno && exception != -1) { + bbsnnrp->actdirty = 1; + rcptr->high = maxartno; + updaterc(rcptr->highptr, rcptr->highlen, maxartno); + } } - } - if (rcptr->high != maxartno && exception != -1) { - bbsnnrp->actdirty = 1; - rcptr->high = maxartno; - updaterc(rcptr->highptr, rcptr->highlen, maxartno); - } - } - } - /* - flushrc(bbsnnrp); - */ - } - fprintf(bbsnnrp->innbbsout,"quit\r\n"); - fprintf(bbsnnrp->nnrpout,"quit\r\n"); - fflush(bbsnnrp->innbbsout); - fflush(bbsnnrp->nnrpout); - fgets(NNRPbuffer, sizeof NNRPbuffer, bbsnnrp->nnrpin); - fgets(INNBBSbuffer, sizeof INNBBSbuffer, bbsnnrp->innbbsin); - -/* bbsnnrp->newsrc[0].high = 1900; - updaterc(bbsnnrp->newsrc[0].highptr, bbsnnrp->newsrc[0].highlen, - bbsnnrp->newsrc[0].high); -*/ + } + /* + * flushrc(bbsnnrp); + */ + } + fprintf(bbsnnrp->innbbsout, "quit\r\n"); + fprintf(bbsnnrp->nnrpout, "quit\r\n"); + fflush(bbsnnrp->innbbsout); + fflush(bbsnnrp->nnrpout); + fgets(NNRPbuffer, sizeof NNRPbuffer, bbsnnrp->nnrpin); + fgets(INNBBSbuffer, sizeof INNBBSbuffer, bbsnnrp->innbbsin); + + /* + * bbsnnrp->newsrc[0].high = 1900; updaterc(bbsnnrp->newsrc[0].highptr, + * bbsnnrp->newsrc[0].highlen, bbsnnrp->newsrc[0].high); + */ } INNBBSDhalt() diff --git a/innbbsd/clibrary.h b/innbbsd/clibrary.h index df913aff..1248e650 100644 --- a/innbbsd/clibrary.h +++ b/innbbsd/clibrary.h @@ -1,42 +1,43 @@ -/* $Revision: 1.1 $ -** -** Here be declarations of routines and variables in the C library. -** You must #include <sys/types.h> and <stdio.h> before this file. -*/ +/* + * $Revision: 1.1 $ * + * + * Here be declarations of routines and variables in the C library. * You + * must #include <sys/types.h> and <stdio.h> before this file. + */ #if defined(DO_HAVE_UNISTD) #include <unistd.h> -#endif /* defined(DO_HAVE_UNISTD) */ +#endif /* defined(DO_HAVE_UNISTD) */ #if defined(DO_HAVE_VFORK) #include <vfork.h> -#endif /* defined(DO_HAVE_VFORK) */ +#endif /* defined(DO_HAVE_VFORK) */ - /* Generic pointer, used by memcpy, malloc, etc. */ - /* =()<typedef @<POINTER>@ *POINTER;>()= */ -typedef char *POINTER; - /* What is a file offset? Will not work unless long! */ - /* =()<typedef @<OFFSET_T>@ OFFSET_T;>()= */ -typedef long OFFSET_T; - /* What is the type of an object size? */ - /* =()<typedef @<SIZE_T>@ SIZE_T;>()= */ -typedef int SIZE_T; - /* What is the type of a passwd uid and gid, for use in chown(2)? */ - /* =()<typedef @<UID_T>@ UID_T;>()= */ -typedef int UID_T; - /* =()<typedef @<GID_T>@ GID_T;>()= */ -typedef int GID_T; - /* =()<typedef @<PID_T>@ PID_T;>()= */ -typedef int PID_T; - /* What should a signal handler return? */ - /* =()<#define SIGHANDLER @<SIGHANDLER>@>()= */ +/* Generic pointer, used by memcpy, malloc, etc. */ +/* =()<typedef @<POINTER>@ *POINTER;>()= */ +typedef char *POINTER; +/* What is a file offset? Will not work unless long! */ +/* =()<typedef @<OFFSET_T>@ OFFSET_T;>()= */ +typedef long OFFSET_T; +/* What is the type of an object size? */ +/* =()<typedef @<SIZE_T>@ SIZE_T;>()= */ +typedef int SIZE_T; +/* What is the type of a passwd uid and gid, for use in chown(2)? */ +/* =()<typedef @<UID_T>@ UID_T;>()= */ +typedef int UID_T; +/* =()<typedef @<GID_T>@ GID_T;>()= */ +typedef int GID_T; +/* =()<typedef @<PID_T>@ PID_T;>()= */ +typedef int PID_T; +/* What should a signal handler return? */ +/* =()<#define SIGHANDLER @<SIGHANDLER>@>()= */ #define SIGHANDLER void #if defined(SIG_DFL) - /* What types of variables can be modified in a signal handler? */ - /* =()<typedef @<SIGVAR>@ SIGVAR;>()= */ -typedef int SIGVAR; -#endif /* defined(SIG_DFL) */ +/* What types of variables can be modified in a signal handler? */ +/* =()<typedef @<SIGVAR>@ SIGVAR;>()= */ +typedef int SIGVAR; +#endif /* defined(SIG_DFL) */ /* =()<#include @<STR_HEADER>@>()= */ #include <string.h> @@ -45,42 +46,43 @@ typedef int SIGVAR; /* -** It's a pity we have to go through these contortions, for broken -** systems that have fd_set but not the FD_SET. -*/ + * * It's a pity we have to go through these contortions, for broken * + * systems that have fd_set but not the FD_SET. + */ #if defined(FD_SETSIZE) #define FDSET fd_set #else #include <sys/param.h> #if !defined(NOFILE) - error -- #define NOFILE to the number of files allowed on your machine! -#endif /* !defined(NOFILE) */ +error-- +#define NOFILE to the number of files allowed on your machine! +#endif /* !defined(NOFILE) */ #if !defined(howmany) #define howmany(x, y) (((x) + ((y) - 1)) / (y)) -#endif /* !defined(howmany) */ +#endif /* !defined(howmany) */ #define FD_SETSIZE NOFILE #define NFDBITS (sizeof (long) * 8) typedef struct _FDSET { - long fds_bits[howmany(FD_SETSIZE, NFDBITS)]; -} FDSET; + long fds_bits[howmany(FD_SETSIZE, NFDBITS)]; +} FDSET; #define FD_SET(n, p) (p)->fds_bits[(n) / NFDBITS] |= (1 << ((n) % NFDBITS)) #define FD_CLR(n, p) (p)->fds_bits[(n) / NFDBITS] &= ~(1 << ((n) % NFDBITS)) #define FD_ISSET(n, p) ((p)->fds_bits[(n) / NFDBITS] & (1 << ((n) % NFDBITS))) #define FD_ZERO(p) (void)memset((POINTER)(p), 0, sizeof *(p)) -#endif /* defined(FD_SETSIZE) */ +#endif /* defined(FD_SETSIZE) */ #if !defined(SEEK_SET) #define SEEK_SET 0 -#endif /* !defined(SEEK_SET) */ +#endif /* !defined(SEEK_SET) */ #if !defined(SEEK_END) #define SEEK_END 2 -#endif /* !defined(SEEK_END) */ +#endif /* !defined(SEEK_END) */ /* -** We must use #define to set FREEVAL, since "typedef void FREEVAL;" doesn't -** work on some broken compilers, sigh. -*/ + * * We must use #define to set FREEVAL, since "typedef void FREEVAL;" + * doesn't * work on some broken compilers, sigh. + */ /* =()<#define FREEVAL @<FREEVAL>@>()= */ #define FREEVAL int @@ -88,50 +90,53 @@ typedef struct _FDSET { #include <stdlib.h> #include <unistd.h> #include <string.h> -#if 0 /* old style, use stdio, stdlib, unistd, string now */ -extern int optind; -extern char *optarg; +#if 0 /* old style, use stdio, stdlib, unistd, + * string now */ +extern int optind; +extern char *optarg; #if !defined(__STDC__) -extern int errno; -#endif /* !defined(__STDC__) */ +extern int errno; +#endif /* !defined(__STDC__) */ -extern char *getenv(); -extern char *inet_ntoa(); -extern char *mktemp(); +extern char *getenv(); +extern char *inet_ntoa(); +extern char *mktemp(); #if !defined(strerror) -extern char *strerror(); -#endif /* !defined(strerror) */ -extern long atol(); -extern time_t time(); -extern unsigned long inet_addr(); -extern FREEVAL free(); -extern POINTER malloc(); -extern POINTER realloc(); +extern char *strerror(); +#endif /* !defined(strerror) */ +extern long atol(); +extern time_t time(); +extern unsigned long inet_addr(); +extern FREEVAL free(); +extern POINTER malloc(); +extern POINTER realloc(); #if defined(ACT_MMAP) -extern char *mmap(); -#endif /* defined(ACT_MMAP) */ +extern char *mmap(); +#endif /* defined(ACT_MMAP) */ /* Some backward systems need this. */ -extern FILE *popen(); +extern FILE *popen(); -/* This is in <mystring.h>, but not in some system string headers, - * so we put it here just in case. */ -extern int strncasecmp(); +/* + * This is in <mystring.h>, but not in some system string headers, so we put + * it here just in case. + */ +extern int strncasecmp(); /* =()<extern @<ABORTVAL>@ abort();>()= */ -extern int abort(); +extern int abort(); /* =()<extern @<ALARMVAL>@ alarm();>()= */ -extern int alarm(); +extern int alarm(); /* =()<extern @<EXITVAL>@ exit();>()= */ -extern void exit(); +extern void exit(); /* =()<extern @<GETPIDVAL>@ getpid();>()= */ -extern int getpid(); +extern int getpid(); /* =()<extern @<LSEEKVAL>@ lseek();>()= */ -extern off_t lseek(); +extern off_t lseek(); /* =()<extern @<QSORTVAL>@ qsort();>()= */ -extern int qsort(); +extern int qsort(); /* =()<extern @<SLEEPVAL>@ sleep();>()= */ -extern int sleep(); +extern int sleep(); /* =()<extern @<_EXITVAL>@ _exit();>()= */ -extern int _exit(); +extern int _exit(); #endif diff --git a/innbbsd/closeonexec.c b/innbbsd/closeonexec.c index e005e51b..1fd1a24e 100644 --- a/innbbsd/closeonexec.c +++ b/innbbsd/closeonexec.c @@ -1,7 +1,8 @@ -/* $Revision: 1.1 $ -** -*/ -/*#include "configdata.h"*/ +/* + * $Revision: 1.1 $ * + * + */ +/* #include "configdata.h" */ #include <stdio.h> #include <sys/types.h> #include <errno.h> @@ -9,58 +10,60 @@ #include "clibrary.h" #ifndef CLX_IOCTL -# define CLX_IOCTL +#define CLX_IOCTL #endif #ifndef CLX_FCNTL -# define CLX_FCNTL +#define CLX_FCNTL #endif - + + #if defined(CLX_IOCTL) && !defined(IRIX) #ifdef __linux -# include <termios.h> +#include <termios.h> #else -# include <sgtty.h> +#include <sgtty.h> #endif /* -** Mark a file close-on-exec so that it doesn't get shared with our -** children. Ignore any error codes. -*/ + * * Mark a file close-on-exec so that it doesn't get shared with our * + * children. Ignore any error codes. + */ void closeOnExec(fd, flag) - int fd; - int flag; + int fd; + int flag; { - int oerrno; + int oerrno; oerrno = errno; (void)ioctl(fd, flag ? FIOCLEX : FIONCLEX, (char *)NULL); errno = oerrno; } -#endif /* defined(CLX_IOCTL) */ +#endif /* defined(CLX_IOCTL) */ + + - #if defined(CLX_FCNTL) #include <fcntl.h> /* -** Mark a file close-on-exec so that it doesn't get shared with our -** children. Ignore any error codes. -*/ + * * Mark a file close-on-exec so that it doesn't get shared with our * + * children. Ignore any error codes. + */ void CloseOnExec(fd, flag) - int fd; - int flag; + int fd; + int flag; { - int oerrno; + int oerrno; oerrno = errno; (void)fcntl(fd, F_SETFD, flag ? 1 : 0); errno = oerrno; } -#endif /* defined(CLX_FCNTL) */ +#endif /* defined(CLX_FCNTL) */ diff --git a/innbbsd/connectsock.c b/innbbsd/connectsock.c index 71203cfe..1c401dbc 100644 --- a/innbbsd/connectsock.c +++ b/innbbsd/connectsock.c @@ -3,450 +3,456 @@ #include <signal.h> #include <setjmp.h> -static jmp_buf timebuf; +static jmp_buf timebuf; static void timeout(sig) - int sig; + int sig; { - longjmp(timebuf, sig); + longjmp(timebuf, sig); } -extern int errno; -static void reapchild (s) -int s; +extern int errno; +static void +reapchild(s) + int s; { - int state; - while (waitpid(-1,&state,WNOHANG|WUNTRACED)>0) { - /* printf("reaping child\n");*/ - } + int state; + while (waitpid(-1, &state, WNOHANG | WUNTRACED) > 0) { + /* printf("reaping child\n"); */ + } } -void dokill(s) -int s; +void +dokill(s) + int s; { - kill(0,SIGKILL); + kill(0, SIGKILL); } -static INETDstart = 0; -int startfrominetd(flag) +static INETDstart = 0; +int +startfrominetd(flag) { - INETDstart = flag ; + INETDstart = flag; } -int standalonesetup(fd) -int fd; +int +standalonesetup(fd) + int fd; { - int on =1; - struct linger foobar; - if (setsockopt(fd,SOL_SOCKET, SO_REUSEADDR,(char *)&on,sizeof(on)) < 0) - syslog(LOG_ERR, "setsockopt (SO_REUSEADDR): %m"); - foobar.l_onoff = 0; - if (setsockopt(fd, SOL_SOCKET, SO_LINGER, (char*)&foobar, sizeof (foobar))<0) - syslog(LOG_ERR, "setsockopt (SO_LINGER): %m"); + int on = 1; + struct linger foobar; + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) + syslog(LOG_ERR, "setsockopt (SO_REUSEADDR): %m"); + foobar.l_onoff = 0; + if (setsockopt(fd, SOL_SOCKET, SO_LINGER, (char *)&foobar, sizeof(foobar)) < 0) + syslog(LOG_ERR, "setsockopt (SO_LINGER): %m"); } -static char *UNIX_SERVER_PATH; -static int (*halt)(); +static char *UNIX_SERVER_PATH; +static int (*halt) (); sethaltfunction(haltfunc) -int (*haltfunc)(); + int (*haltfunc) (); { halt = haltfunc; } -void docompletehalt(s) -int s; +void +docompletehalt(s) + int s; { - /*printf("try to remove %s\n", UNIX_SERVER_PATH); - unlink(UNIX_SERVER_PATH);*/ - exit(0); - /*dokill();*/ + /* + * printf("try to remove %s\n", UNIX_SERVER_PATH); + * unlink(UNIX_SERVER_PATH); + */ + exit(0); + /* dokill(); */ } -void doremove(s) -int s; +void +doremove(s) + int s; { - if (halt != NULL) - (*halt)(s); - else - docompletehalt(s); + if (halt != NULL) + (*halt) (s); + else + docompletehalt(s); } initunixserver(path, protocol) -char *path; -char *protocol; + char *path; + char *protocol; { - struct sockaddr_un s_un; - /* unix endpoint address */ - struct protoent *pe; /*protocol information entry*/ - int s; - char *ptr; - - bzero((char*)&s_un,sizeof(s_un)); - s_un.sun_family= AF_UNIX; - strcpy(s_un.sun_path, path); - if (protocol==NULL) - protocol="tcp"; - /* map protocol name to protocol number */ - pe=getprotobyname(protocol); - if (pe==NULL) { - fprintf(stderr,"%s: Unknown protocol.\n",protocol); - return (-1); - } - - /* Allocate a socket */ - s = socket(PF_UNIX,strcmp(protocol,"tcp")?SOCK_DGRAM:SOCK_STREAM,0); - if (s<0) { - printf("protocol %d\n", pe->p_proto); - perror("socket"); - return -1; - } - /*standalonesetup(s);*/ - signal(SIGHUP, SIG_IGN); - signal(SIGUSR1, SIG_IGN); - signal(SIGCHLD,reapchild); - UNIX_SERVER_PATH = path; - signal(SIGINT,doremove); - signal(SIGTERM,doremove); - - chdir("/"); - if (bind(s,(struct sockaddr*)&s_un,sizeof (struct sockaddr_un))<0){ - perror("bind"); - perror(path); - return -1; - } - listen(s,10); - return s; + struct sockaddr_un s_un; + /* unix endpoint address */ + struct protoent *pe; /* protocol information entry */ + int s; + char *ptr; + + bzero((char *)&s_un, sizeof(s_un)); + s_un.sun_family = AF_UNIX; + strcpy(s_un.sun_path, path); + if (protocol == NULL) + protocol = "tcp"; + /* map protocol name to protocol number */ + pe = getprotobyname(protocol); + if (pe == NULL) { + fprintf(stderr, "%s: Unknown protocol.\n", protocol); + return (-1); + } + /* Allocate a socket */ + s = socket(PF_UNIX, strcmp(protocol, "tcp") ? SOCK_DGRAM : SOCK_STREAM, 0); + if (s < 0) { + printf("protocol %d\n", pe->p_proto); + perror("socket"); + return -1; + } + /* standalonesetup(s); */ + signal(SIGHUP, SIG_IGN); + signal(SIGUSR1, SIG_IGN); + signal(SIGCHLD, reapchild); + UNIX_SERVER_PATH = path; + signal(SIGINT, doremove); + signal(SIGTERM, doremove); + + chdir("/"); + if (bind(s, (struct sockaddr *) & s_un, sizeof(struct sockaddr_un)) < 0) { + perror("bind"); + perror(path); + return -1; + } + listen(s, 10); + return s; } -initinetserver(service,protocol) -char *service; -char *protocol; +initinetserver(service, protocol) + char *service; + char *protocol; { - struct servent *se; /*service information entry*/ - struct hostent *he; /*host information entry*/ - struct protoent *pe; /*protocol information entry*/ - struct sockaddr_in sin;/*Internet endpoint address*/ - int port,s; - int randomport=0; - - bzero((char*)&sin,sizeof(sin)); - sin.sin_family= AF_INET; - if (!strcmp("0",service)) { - randomport = 1; - sin.sin_addr.s_addr = INADDR_ANY; - } - - if (service==NULL) - service=DEFAULTPORT; - if (protocol==NULL) - protocol="tcp"; - /* map service name to port number */ - /* service ---> port */ - se = getservbyname(service,protocol); - if (se==NULL) { - port = htons((u_short)atoi(service)); - if (port==0 && !randomport) { - fprintf (stderr, "%s/%s: Unknown service.\n",service,protocol); - return (-1); - } - } else - port=se->s_port; - sin.sin_port = port; - - /* map protocol name to protocol number */ - pe=getprotobyname(protocol); - if (pe==NULL) { - fprintf(stderr,"%s: Unknown protocol.\n",protocol); - return (-1); - } - - /* Allocate a socket */ - s = socket(PF_INET,strcmp(protocol,"tcp")?SOCK_DGRAM:SOCK_STREAM,pe->p_proto); - if (s<0) { - perror("socket"); - return -1; + struct servent *se; /* service information entry */ + struct hostent *he; /* host information entry */ + struct protoent *pe; /* protocol information entry */ + struct sockaddr_in sin; /* Internet endpoint address */ + int port, s; + int randomport = 0; + + bzero((char *)&sin, sizeof(sin)); + sin.sin_family = AF_INET; + if (!strcmp("0", service)) { + randomport = 1; + sin.sin_addr.s_addr = INADDR_ANY; + } + if (service == NULL) + service = DEFAULTPORT; + if (protocol == NULL) + protocol = "tcp"; + /* map service name to port number */ + /* service ---> port */ + se = getservbyname(service, protocol); + if (se == NULL) { + port = htons((u_short) atoi(service)); + if (port == 0 && !randomport) { + fprintf(stderr, "%s/%s: Unknown service.\n", service, protocol); + return (-1); } - standalonesetup(s); - signal(SIGHUP, SIG_IGN); - signal(SIGUSR1, SIG_IGN); - signal(SIGCHLD,reapchild); - signal(SIGINT,dokill); - signal(SIGTERM,dokill); - - chdir("/"); - if (bind(s,(struct sockaddr*)&sin,sizeof (struct sockaddr_in))<0){ - perror("bind"); - return -1; - } - listen(s,10); + } else + port = se->s_port; + sin.sin_port = port; + + /* map protocol name to protocol number */ + pe = getprotobyname(protocol); + if (pe == NULL) { + fprintf(stderr, "%s: Unknown protocol.\n", protocol); + return (-1); + } + /* Allocate a socket */ + s = socket(PF_INET, strcmp(protocol, "tcp") ? SOCK_DGRAM : SOCK_STREAM, pe->p_proto); + if (s < 0) { + perror("socket"); + return -1; + } + standalonesetup(s); + signal(SIGHUP, SIG_IGN); + signal(SIGUSR1, SIG_IGN); + signal(SIGCHLD, reapchild); + signal(SIGINT, dokill); + signal(SIGTERM, dokill); + + chdir("/"); + if (bind(s, (struct sockaddr *) & sin, sizeof(struct sockaddr_in)) < 0) { + perror("bind"); + return -1; + } + listen(s, 10); #ifdef DEBUG - { int length=sizeof(sin); - getsockname(s,&sin,&length); - printf("portnum alocalted %d\n",sin.sin_port); - } + { + int length = sizeof(sin); + getsockname(s, &sin, &length); + printf("portnum alocalted %d\n", sin.sin_port); + } #endif - return s; + return s; } -int open_unix_listen(path,protocol,initfunc) -char *path; -char *protocol; -int (*initfunc) ARG((int)); +int +open_unix_listen(path, protocol, initfunc) + char *path; + char *protocol; + int (*initfunc) ARG((int)); { - int s; - s = initunixserver(path,protocol); - if (s<0) { - return -1; + int s; + s = initunixserver(path, protocol); + if (s < 0) { + return -1; + } + if (initfunc != NULL) { + printf("in inetsingleserver before initfunc s %d\n", s); + if ((*initfunc) (s) < 0) { + perror("initfunc error"); + return -1; } - if (initfunc != NULL) { - printf("in inetsingleserver before initfunc s %d\n",s); - if ((*initfunc)(s)<0) { - perror("initfunc error"); - return -1; - } - printf("end inetsingleserver before initfunc \n"); - } - return s; + printf("end inetsingleserver before initfunc \n"); + } + return s; } -int open_listen(service,protocol,initfunc) -char *service; -char *protocol; -int (*initfunc) ARG((int)); +int +open_listen(service, protocol, initfunc) + char *service; + char *protocol; + int (*initfunc) ARG((int)); { - int s; - if (! INETDstart) - s = initinetserver(service,protocol); - else - s = 0; - if (s<0) { - return -1; + int s; + if (!INETDstart) + s = initinetserver(service, protocol); + else + s = 0; + if (s < 0) { + return -1; + } + if (initfunc != NULL) { + printf("in inetsingleserver before initfunc s %d\n", s); + if ((*initfunc) (s) < 0) { + perror("initfunc error"); + return -1; } - if (initfunc != NULL) { - printf("in inetsingleserver before initfunc s %d\n",s); - if ((*initfunc)(s)<0) { - perror("initfunc error"); - return -1; - } - printf("end inetsingleserver before initfunc \n"); - } - return s; + printf("end inetsingleserver before initfunc \n"); + } + return s; } -int inetsingleserver(service,protocol,serverfunc,initfunc) -char *service; -char *protocol; -int (*initfunc) ARG((int)); -int (*serverfunc) ARG((int)); +int +inetsingleserver(service, protocol, serverfunc, initfunc) + char *service; + char *protocol; + int (*initfunc) ARG((int)); + int (*serverfunc) ARG((int)); { - int s; - if (!INETDstart) - s = initinetserver(service,protocol); - else - s = 0; - if (s<0) { - return -1; + int s; + if (!INETDstart) + s = initinetserver(service, protocol); + else + s = 0; + if (s < 0) { + return -1; + } + if (initfunc != NULL) { + printf("in inetsingleserver before initfunc s %d\n", s); + if ((*initfunc) (s) < 0) { + perror("initfunc error"); + return -1; } - if (initfunc != NULL) { - printf("in inetsingleserver before initfunc s %d\n",s); - if ((*initfunc)(s)<0) { - perror("initfunc error"); - return -1; - } - printf("end inetsingleserver before initfunc \n"); - } - { - int ns=tryaccept(s); - int result=0; - if (ns < 0 && errno != EINTR){ + printf("end inetsingleserver before initfunc \n"); + } { + int ns = tryaccept(s); + int result = 0; + if (ns < 0 && errno != EINTR) { #ifdef DEBUGSERVER - perror("accept"); + perror("accept"); #endif - } - close(s); - if (serverfunc != NULL) - result = (*serverfunc)(ns); - close(ns); - return(result); } + close(s); + if (serverfunc != NULL) + result = (*serverfunc) (ns); + close(ns); + return (result); + } } -int tryaccept(s) -int s; +int +tryaccept(s) + int s; { - int ns,fromlen; - struct sockaddr sockaddr;/*Internet endpoint address*/ - fromlen=sizeof (struct sockaddr_in); + int ns, fromlen; + struct sockaddr sockaddr; /* Internet endpoint address */ + fromlen = sizeof(struct sockaddr_in); #ifdef DEBUGSERVER - fputs("Listening again\n",stdout); + fputs("Listening again\n", stdout); #endif - do { - ns = accept(s,&sockaddr,&fromlen); - errno = 0; - } while ( ns < 0 && errno == EINTR ); - return ns; + do { + ns = accept(s, &sockaddr, &fromlen); + errno = 0; + } while (ns < 0 && errno == EINTR); + return ns; } -int inetserver(service,protocol,serverfunc) -char *service; -char *protocol; -int (*serverfunc) ARG((int)); +int +inetserver(service, protocol, serverfunc) + char *service; + char *protocol; + int (*serverfunc) ARG((int)); { - int port,s; - - if (!INETDstart) - s = initinetserver(service,protocol); - else - s = 0; - if (s<0) { - return -1; - } - for (;;) { - int ns=tryaccept(s); - int result=0; - int pid; - if (ns < 0 && errno != EINTR){ + int port, s; + + if (!INETDstart) + s = initinetserver(service, protocol); + else + s = 0; + if (s < 0) { + return -1; + } + for (;;) { + int ns = tryaccept(s); + int result = 0; + int pid; + if (ns < 0 && errno != EINTR) { #ifdef DEBUGSERVER - perror("accept"); + perror("accept"); #endif - continue; - } + continue; + } #ifdef DEBUGSERVER - fputs("Accept OK\n",stdout); + fputs("Accept OK\n", stdout); #endif - pid = fork(); - if (pid==0) { - close(s); - if (serverfunc != NULL) - result = (*serverfunc)(ns); - close(ns); - exit(result); - } else if (pid < 0) { - perror("fork"); - return -1; - } - close(ns); + pid = fork(); + if (pid == 0) { + close(s); + if (serverfunc != NULL) + result = (*serverfunc) (ns); + close(ns); + exit(result); + } else if (pid < 0) { + perror("fork"); + return -1; } - return 0; + close(ns); + } + return 0; } -int inetclient(server,service,protocol) -char *server; -char *protocol; -char *service; +int +inetclient(server, service, protocol) + char *server; + char *protocol; + char *service; { - struct servent *se; /*service information entry*/ - struct hostent *he; /*host information entry*/ - struct protoent *pe; /*protocol information entry*/ - struct sockaddr_in sin;/*Internet endpoint address*/ - int port,s; - - bzero((char*)&sin,sizeof(sin)); - sin.sin_family= AF_INET; - - if (service==NULL) - service=DEFAULTPORT; - if (protocol==NULL) - protocol="tcp"; - if (server==NULL) - server=DEFAULTSERVER; - /* map service name to port number */ - /* service ---> port */ - se = getservbyname(service,protocol); - if (se==NULL) { - port = htons((u_short)atoi(service)); - if (port==0) { - fprintf (stderr, "%s/%s: Unknown service.\n",service,protocol); - return (-1); - } - } else - port=se->s_port; - sin.sin_port = port; - - /* map server hostname to IP address, allowing for dotted decimal */ - he=gethostbyname(server); - if (he==NULL) { - sin.sin_addr.s_addr = inet_addr(server); - if (sin.sin_addr.s_addr==INADDR_NONE) { - fprintf (stderr, "%s: Unknown host.\n",server); - return (-1); - } - } else - bcopy(he->h_addr,(char*)&sin.sin_addr,he->h_length); - - /* map protocol name to protocol number */ - pe=getprotobyname(protocol); - if (pe==NULL) { - fprintf(stderr,"%s: Unknown protocol.\n",protocol); - return (-1); + struct servent *se; /* service information entry */ + struct hostent *he; /* host information entry */ + struct protoent *pe; /* protocol information entry */ + struct sockaddr_in sin; /* Internet endpoint address */ + int port, s; + + bzero((char *)&sin, sizeof(sin)); + sin.sin_family = AF_INET; + + if (service == NULL) + service = DEFAULTPORT; + if (protocol == NULL) + protocol = "tcp"; + if (server == NULL) + server = DEFAULTSERVER; + /* map service name to port number */ + /* service ---> port */ + se = getservbyname(service, protocol); + if (se == NULL) { + port = htons((u_short) atoi(service)); + if (port == 0) { + fprintf(stderr, "%s/%s: Unknown service.\n", service, protocol); + return (-1); } - - /* Allocate a socket */ - s = socket(PF_INET,strcmp(protocol,"tcp")?SOCK_DGRAM:SOCK_STREAM,pe->p_proto); - if (s<0) { - perror("socket"); - return -1; + } else + port = se->s_port; + sin.sin_port = port; + + /* map server hostname to IP address, allowing for dotted decimal */ + he = gethostbyname(server); + if (he == NULL) { + sin.sin_addr.s_addr = inet_addr(server); + if (sin.sin_addr.s_addr == INADDR_NONE) { + fprintf(stderr, "%s: Unknown host.\n", server); + return (-1); } + } else + bcopy(he->h_addr, (char *)&sin.sin_addr, he->h_length); + + /* map protocol name to protocol number */ + pe = getprotobyname(protocol); + if (pe == NULL) { + fprintf(stderr, "%s: Unknown protocol.\n", protocol); + return (-1); + } + /* Allocate a socket */ + s = socket(PF_INET, strcmp(protocol, "tcp") ? SOCK_DGRAM : SOCK_STREAM, pe->p_proto); + if (s < 0) { + perror("socket"); + return -1; + } + if (setjmp(timebuf) == 0) { + signal(SIGALRM, timeout); + alarm(5); + if (connect(s, (struct sockaddr *) & sin, sizeof(sin)) < 0) { + alarm(0); + return -1; + } + } else { + alarm(0); + return -1; + } + alarm(0); - if (setjmp(timebuf) == 0) - { - signal(SIGALRM, timeout); - alarm(5); - if (connect(s,(struct sockaddr*)&sin,sizeof(sin))<0) - { - alarm(0); - return -1; - } - } - else - { - alarm(0); - return -1; - } - alarm(0); - - return s; + return s; } -int unixclient(path,protocol) -char *path; -char *protocol; +int +unixclient(path, protocol) + char *path; + char *protocol; { - struct protoent *pe; /*protocol information entry*/ - struct sockaddr_un s_un;/*unix endpoint address*/ - int s; - - bzero((char*)&s_un,sizeof(s_un)); - s_un.sun_family= AF_UNIX; - - if (path==NULL) - path=DEFAULTPATH; - if (protocol==NULL) - protocol="tcp"; - strcpy(s_un.sun_path , path); - - /* map protocol name to protocol number */ - pe=getprotobyname(protocol); - if (pe==NULL) { - fprintf(stderr,"%s: Unknown protocol.\n",protocol); - return (-1); - } - /* Allocate a socket */ - s = socket(PF_UNIX,strcmp(protocol,"tcp")?SOCK_DGRAM:SOCK_STREAM,0); - if (s<0) { - perror("socket"); - return -1; - } - /* Connect the socket to the server */ - if (connect(s,(struct sockaddr*)&s_un,sizeof(s_un))<0) { - /*perror("connect");*/ - return -1; - } - return s; + struct protoent *pe; /* protocol information entry */ + struct sockaddr_un s_un; /* unix endpoint address */ + int s; + + bzero((char *)&s_un, sizeof(s_un)); + s_un.sun_family = AF_UNIX; + + if (path == NULL) + path = DEFAULTPATH; + if (protocol == NULL) + protocol = "tcp"; + strcpy(s_un.sun_path, path); + + /* map protocol name to protocol number */ + pe = getprotobyname(protocol); + if (pe == NULL) { + fprintf(stderr, "%s: Unknown protocol.\n", protocol); + return (-1); + } + /* Allocate a socket */ + s = socket(PF_UNIX, strcmp(protocol, "tcp") ? SOCK_DGRAM : SOCK_STREAM, 0); + if (s < 0) { + perror("socket"); + return -1; + } + /* Connect the socket to the server */ + if (connect(s, (struct sockaddr *) & s_un, sizeof(s_un)) < 0) { + /* perror("connect"); */ + return -1; + } + return s; } diff --git a/innbbsd/ctlinnbbsd.c b/innbbsd/ctlinnbbsd.c index 4ba77b52..d7f6f36f 100644 --- a/innbbsd/ctlinnbbsd.c +++ b/innbbsd/ctlinnbbsd.c @@ -1,160 +1,160 @@ #include "innbbsconf.h" #include "bbslib.h" -extern char *optarg; -extern int opterr, optind; +extern char *optarg; +extern int opterr, optind; usage(name) -char *name; + char *name; { - fprintf(stderr, "Usage: %s [-p path] commands\n",name); - fprintf(stderr, " where available commands:\n"); - fprintf(stderr," ctlinnbbsd reload : reload datafiles for innbbsd\n"); - fprintf(stderr," ctlinnbbsd shutdown : shutdown innbbsd gracefully\n"); - fprintf(stderr," ctlinnbbsd mode : examine mode of innbbsd\n"); - fprintf(stderr," ctlinnbbsd addhist <mid> path: add history\n"); - fprintf(stderr," ctlinnbbsd grephist <mid>: query history\n"); - fprintf(stderr," ctlinnbbsd verboselog on|off : verboselog on/off\n"); - fprintf(stderr," ctlinnbbsd hismaint : maintain history\n"); - fprintf(stderr," ctlinnbbsd listnodelist : list nodelist.bbs\n"); - fprintf(stderr," ctlinnbbsd listnewsfeeds : list newsfeeds.bbs\n"); + fprintf(stderr, "Usage: %s [-p path] commands\n", name); + fprintf(stderr, " where available commands:\n"); + fprintf(stderr, " ctlinnbbsd reload : reload datafiles for innbbsd\n"); + fprintf(stderr, " ctlinnbbsd shutdown : shutdown innbbsd gracefully\n"); + fprintf(stderr, " ctlinnbbsd mode : examine mode of innbbsd\n"); + fprintf(stderr, " ctlinnbbsd addhist <mid> path: add history\n"); + fprintf(stderr, " ctlinnbbsd grephist <mid>: query history\n"); + fprintf(stderr, " ctlinnbbsd verboselog on|off : verboselog on/off\n"); + fprintf(stderr, " ctlinnbbsd hismaint : maintain history\n"); + fprintf(stderr, " ctlinnbbsd listnodelist : list nodelist.bbs\n"); + fprintf(stderr, " ctlinnbbsd listnewsfeeds : list newsfeeds.bbs\n"); #ifdef GETRUSAGE - fprintf(stderr," ctlinnbbsd getrusage: get resource usage\n"); + fprintf(stderr, " ctlinnbbsd getrusage: get resource usage\n"); #endif #ifdef MALLOCMAP - fprintf(stderr," ctlinnbbsd mallocmap: get malloc map\n"); + fprintf(stderr, " ctlinnbbsd mallocmap: get malloc map\n"); #endif } -char *DefaultPath = LOCALDAEMON; -char INNBBSbuffer[4096]; +char *DefaultPath = LOCALDAEMON; +char INNBBSbuffer[4096]; -FILE *innbbsin, *innbbsout; -int innbbsfd; +FILE *innbbsin, *innbbsout; +int innbbsfd; ctlinnbbsd(argc, argv) -int argc; -char **argv; + int argc; + char **argv; { - fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin); - printf("%s",INNBBSbuffer); - if (strcasecmp(argv[0], "shutdown")==0 || - strcasecmp(argv[0], "reload")==0 || - strcasecmp(argv[0], "hismaint")==0 || + fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin); + printf("%s", INNBBSbuffer); + if (strcasecmp(argv[0], "shutdown") == 0 || + strcasecmp(argv[0], "reload") == 0 || + strcasecmp(argv[0], "hismaint") == 0 || #ifdef GETRUSAGE - strcasecmp(argv[0], "getrusage")==0 || + strcasecmp(argv[0], "getrusage") == 0 || #endif #ifdef MALLOCMAP - strcasecmp(argv[0], "mallocmap")==0 || + strcasecmp(argv[0], "mallocmap") == 0 || #endif - strcasecmp(argv[0], "mode")==0 || - strcasecmp(argv[0], "listnodelist")==0 || - strcasecmp(argv[0], "listnewsfeeds")==0 - ) { - fprintf( innbbsout, "%s\r\n", argv[0]); - fflush( innbbsout); - fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin); - printf("%s",INNBBSbuffer); - if (strcasecmp(argv[0], "mode") ==0 + strcasecmp(argv[0], "mode") == 0 || + strcasecmp(argv[0], "listnodelist") == 0 || + strcasecmp(argv[0], "listnewsfeeds") == 0 + ) { + fprintf(innbbsout, "%s\r\n", argv[0]); + fflush(innbbsout); + fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin); + printf("%s", INNBBSbuffer); + if (strcasecmp(argv[0], "mode") == 0 #ifdef GETRUSAGE - || - strcasecmp(argv[0], "getrusage") ==0 - || - strcasecmp(argv[0], "mallocmap") ==0 + || + strcasecmp(argv[0], "getrusage") == 0 + || + strcasecmp(argv[0], "mallocmap") == 0 #endif - || - strcasecmp(argv[0], "listnodelist")==0 - || - strcasecmp(argv[0], "listnewsfeeds")==0 - ) { - while (fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin) != NULL) { - if (strcmp(INNBBSbuffer,".\r\n")==0) { - break; - } - printf("%s",INNBBSbuffer); + || + strcasecmp(argv[0], "listnodelist") == 0 + || + strcasecmp(argv[0], "listnewsfeeds") == 0 + ) { + while (fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin) != NULL) { + if (strcmp(INNBBSbuffer, ".\r\n") == 0) { + break; } + printf("%s", INNBBSbuffer); } - } else if (strcasecmp(argv[0], "grephist")==0 || - strcasecmp(argv[0], "verboselog")==0 ) { - if (argc < 2) { - usage("ctlinnbbsd"); - } else { - fprintf( innbbsout, "%s %s\r\n", argv[0], argv[1]); - fflush( innbbsout); - fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin); - printf("%s\n",INNBBSbuffer); - } - } else if (strcasecmp(argv[0], "addhist")==0) { - if (argc < 3) { - usage("ctlinnbbsd"); - } else { - fprintf( innbbsout, "%s %s %s\r\n", argv[0], argv[1], argv[2]); - fflush( innbbsout); - fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin); - printf("%s",INNBBSbuffer); - } + } + } else if (strcasecmp(argv[0], "grephist") == 0 || + strcasecmp(argv[0], "verboselog") == 0) { + if (argc < 2) { + usage("ctlinnbbsd"); } else { - fprintf(stderr, "invalid command %s\n", argv[0]); + fprintf(innbbsout, "%s %s\r\n", argv[0], argv[1]); + fflush(innbbsout); + fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin); + printf("%s\n", INNBBSbuffer); } - if (strcasecmp(argv[0],"shutdown") != 0) { - fprintf( innbbsout, "QUIT\r\n"); - fflush(innbbsout); - fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin); + } else if (strcasecmp(argv[0], "addhist") == 0) { + if (argc < 3) { + usage("ctlinnbbsd"); + } else { + fprintf(innbbsout, "%s %s %s\r\n", argv[0], argv[1], argv[2]); + fflush(innbbsout); + fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin); + printf("%s", INNBBSbuffer); } + } else { + fprintf(stderr, "invalid command %s\n", argv[0]); + } + if (strcasecmp(argv[0], "shutdown") != 0) { + fprintf(innbbsout, "QUIT\r\n"); + fflush(innbbsout); + fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin); + } } initsocket() { - innbbsfd = unixclient(DefaultPath,"tcp"); - if (innbbsfd < 0) { - fprintf(stderr, "Connect to %s error. You may not run innbbsd\n", DefaultPath); - exit(2); - } - if ( (innbbsin= fdopen(innbbsfd,"r")) == NULL || - (innbbsout= fdopen(innbbsfd,"w"))== NULL ) { - fprintf( stderr, "fdopen error\n"); - exit(3); - } + innbbsfd = unixclient(DefaultPath, "tcp"); + if (innbbsfd < 0) { + fprintf(stderr, "Connect to %s error. You may not run innbbsd\n", DefaultPath); + exit(2); + } + if ((innbbsin = fdopen(innbbsfd, "r")) == NULL || + (innbbsout = fdopen(innbbsfd, "w")) == NULL) { + fprintf(stderr, "fdopen error\n"); + exit(3); + } } closesocket() { if (innbbsin != NULL) - fclose(innbbsin); + fclose(innbbsin); if (innbbsout != NULL) - fclose(innbbsout); + fclose(innbbsout); if (innbbsfd >= 0) - close(innbbsfd); + close(innbbsfd); } main(argc, argv) -int argc; -char **argv; + int argc; + char **argv; { - int c, errflag=0; + int c, errflag = 0; - while ((c = getopt(argc,argv,"p:h?"))!= -1) - switch (c) { - case 'p': - DefaultPath = optarg; - break; - case 'h': - case '?': - default: - errflag ++; - break; - } + while ((c = getopt(argc, argv, "p:h?")) != -1) + switch (c) { + case 'p': + DefaultPath = optarg; + break; + case 'h': + case '?': + default: + errflag++; + break; + } if (errflag > 0) { - usage(argv[0]); - return(1); + usage(argv[0]); + return (1); } if (argc - optind < 1) { - usage(argv[0]); - exit(1); + usage(argv[0]); + exit(1); } initial_bbs(NULL); initsocket(); - ctlinnbbsd(argc-optind, argv+optind); + ctlinnbbsd(argc - optind, argv + optind); closesocket(); } diff --git a/innbbsd/daemon.c b/innbbsd/daemon.c index 973a96c8..a60d7d73 100644 --- a/innbbsd/daemon.c +++ b/innbbsd/daemon.c @@ -1,173 +1,176 @@ #include "daemon.h" /* -typedef struct daemoncmd { - char *cmdname; - char *usage; - int argc; - int (*main) ARG((FILE*,FILE*,int,char**,char*)); -} daemoncmd_t; + * typedef struct daemoncmd { char *cmdname; char *usage; int argc; int + * (*main) ARG((FILE*,FILE*,int,char**,char*)); } daemoncmd_t; + * + */ -*/ +void deargify ARG((char ***)); +static daemoncmd_t *dcmdp = NULL; +static char *startupmessage = NULL; +static int startupcode = 100; +static FILE *DIN, *DOUT, *DIO; +typedef int (*F) (); -void deargify ARG((char ***)); -static daemoncmd_t *dcmdp=NULL; -static char *startupmessage=NULL; -static int startupcode=100; -static FILE *DIN,*DOUT,*DIO; -typedef int (*F)(); - -void installdaemon(cmds,code,startupmsg) -daemoncmd_t *cmds; -int code; -char *startupmsg; +void +installdaemon(cmds, code, startupmsg) + daemoncmd_t *cmds; + int code; + char *startupmsg; { - dcmdp = cmds; - startupcode = code; - startupmessage = startupmsg; + dcmdp = cmds; + startupcode = code; + startupmessage = startupmsg; } -daemoncmd_t *searchcmd(cmd) -char *cmd; +daemoncmd_t * +searchcmd(cmd) + char *cmd; { - daemoncmd_t *p; - for (p=dcmdp;p->name != NULL ; p++) { + daemoncmd_t *p; + for (p = dcmdp; p->name != NULL; p++) { #ifdef DEBUGCMD - printf("searching name %s for cmd %s\n",p->name,cmd); + printf("searching name %s for cmd %s\n", p->name, cmd); #endif - if (!strncasecmp(p->name,cmd,1024)) - return p; - } - return NULL; + if (!strncasecmp(p->name, cmd, 1024)) + return p; + } + return NULL; } #if 0 -int daemon(dfd) -int dfd; +int +daemon(dfd) + int dfd; { - static char BUF[1024]; - /*hash_init();*/ - if (dfd > 0) { - DIO = fdopen(dfd,"rw"); - DIN = fdopen(dfd,"r"); - DOUT = fdopen(dfd,"w"); - if (DIO == NULL || DIN == NULL || DOUT == NULL) { - perror("fdopen"); - return -1; - } - } - if (startupmessage) { - fprintf(DOUT,"%d %s\n",startupcode,startupmessage); - fflush(DOUT); + static char BUF[1024]; + /* hash_init(); */ + if (dfd > 0) { + DIO = fdopen(dfd, "rw"); + DIN = fdopen(dfd, "r"); + DOUT = fdopen(dfd, "w"); + if (DIO == NULL || DIN == NULL || DOUT == NULL) { + perror("fdopen"); + return -1; } - while (fgets(BUF,1024,DIN) != NULL) { - int i; - int (*Main)(); - daemoncmd_t *dp; - argv_t Argv; + } + if (startupmessage) { + fprintf(DOUT, "%d %s\n", startupcode, startupmessage); + fflush(DOUT); + } + while (fgets(BUF, 1024, DIN) != NULL) { + int i; + int (*Main) (); + daemoncmd_t *dp; + argv_t Argv; - char *p=(char*)strchr(BUF,'\r'); - if (p == NULL) p=(char*)strchr(BUF,'\n'); - if (p == NULL) continue; - *p='\0'; - if (p==BUF) continue; + char *p = (char *)strchr(BUF, '\r'); + if (p == NULL) + p = (char *)strchr(BUF, '\n'); + if (p == NULL) + continue; + *p = '\0'; + if (p == BUF) + continue; - Argv.argc = 0, Argv.argv = NULL, Argv.inputline=BUF; - Argv.in = DIN, Argv.out = DOUT; - printf("command entered: %s\n",BUF); + Argv.argc = 0, Argv.argv = NULL, Argv.inputline = BUF; + Argv.in = DIN, Argv.out = DOUT; + printf("command entered: %s\n", BUF); #ifdef DEBUGSERVER - fprintf(DOUT,"BUF in client %s\n",BUF); - fprintf(stdout,"BUF in server %s\n",BUF); - fflush(DOUT); + fprintf(DOUT, "BUF in client %s\n", BUF); + fprintf(stdout, "BUF in server %s\n", BUF); + fflush(DOUT); #endif - Argv.argc = argify(BUF,&Argv.argv); + Argv.argc = argify(BUF, &Argv.argv); #ifdef DEBUGSERVER - fprintf(stdout,"argc %d argv ",Argv.argc); - for (i=0;i<Argv.argc;++i) - fprintf(stdout,"%s ",Argv.argv[i]); - fprintf(stdout,"\n"); + fprintf(stdout, "argc %d argv ", Argv.argc); + for (i = 0; i < Argv.argc; ++i) + fprintf(stdout, "%s ", Argv.argv[i]); + fprintf(stdout, "\n"); #endif - dp = searchcmd(Argv.argv[0]); - Argv.dc = dp; - if (dp) { + dp = searchcmd(Argv.argv[0]); + Argv.dc = dp; + if (dp) { #ifdef DEBUGSERVER - printf("find cmd %s by %s\n",dp->name,dp->usage); + printf("find cmd %s by %s\n", dp->name, dp->usage); #endif - if (Argv.argc < dp->argc) { - fprintf(DOUT,"%d Usage: %s\n",dp->errorcode,dp->usage); - fflush(DOUT); - goto cont; - } - if (dp->argno != 0 && Argv.argc > dp->argno) { - fprintf(DOUT,"%d Usage: %s\n",dp->errorcode,dp->usage); - fflush(DOUT); - goto cont; - } - Main=dp->main; - if (Main) { - fflush(stdout); - (*Main)(&Argv); - } - } - else { - fprintf(DOUT,"99 command %s not available\n",Argv.argv[0]); - fflush(DOUT); - } -cont: - deargify(&Argv.argv); + if (Argv.argc < dp->argc) { + fprintf(DOUT, "%d Usage: %s\n", dp->errorcode, dp->usage); + fflush(DOUT); + goto cont; + } + if (dp->argno != 0 && Argv.argc > dp->argno) { + fprintf(DOUT, "%d Usage: %s\n", dp->errorcode, dp->usage); + fflush(DOUT); + goto cont; + } + Main = dp->main; + if (Main) { + fflush(stdout); + (*Main) (&Argv); + } + } else { + fprintf(DOUT, "99 command %s not available\n", Argv.argv[0]); + fflush(DOUT); } - /*hash_reclaim();*/ +cont: + deargify(&Argv.argv); + } + /* hash_reclaim(); */ } #endif #define MAX_ARG 32 #define MAX_ARG_SIZE 16384 -int argify(line, argvp) -char *line, ***argvp; +int +argify(line, argvp) + char *line, ***argvp; { - static char *argvbuffer[MAX_ARG+2]; - char **argv = argvbuffer; - int i; - static char argifybuffer[MAX_ARG_SIZE]; - char *p; - while (strchr("\t\n\r ",*line)) line++; - i=strlen(line); - /*p=(char*) mymalloc(i+1);*/ - p = argifybuffer; - strncpy(p,line, sizeof argifybuffer); - for (*argvp = argv, i=0 ;*p && i < MAX_ARG;){ - for (*argv++=p;*p && !strchr("\t\r\n ",*p);p++); - if (*p=='\0') break; - for (*p++='\0'; strchr("\t\r\n ",*p) && *p;p++); - } - *argv = NULL; - return argv - *argvp; + static char *argvbuffer[MAX_ARG + 2]; + char **argv = argvbuffer; + int i; + static char argifybuffer[MAX_ARG_SIZE]; + char *p; + while (strchr("\t\n\r ", *line)) + line++; + i = strlen(line); + /* p=(char*) mymalloc(i+1); */ + p = argifybuffer; + strncpy(p, line, sizeof argifybuffer); + for (*argvp = argv, i = 0; *p && i < MAX_ARG;) { + for (*argv++ = p; *p && !strchr("\t\r\n ", *p); p++); + if (*p == '\0') + break; + for (*p++ = '\0'; strchr("\t\r\n ", *p) && *p; p++); + } + *argv = NULL; + return argv - *argvp; } -void deargify (argv) -char ***argv; +void +deargify(argv) + char ***argv; { - return; - /*if (*argv != NULL) { - if (*argv[0] != NULL){ - free(*argv[0]); - *argv[0] = NULL; - } - free(*argv); - *argv = NULL; - }*/ + return; + /* + * if (*argv != NULL) { if (*argv[0] != NULL){ free(*argv[0]); argv[0] = + * NULL; } free(*argv); argv = NULL; } + */ } -int daemonprintf(format) -char *format; +int +daemonprintf(format) + char *format; { - fprintf(DOUT,format); - fflush(DOUT); + fprintf(DOUT, format); + fflush(DOUT); } -int daemonputs(output) -char* output; +int +daemonputs(output) + char *output; { - fputs(output, DOUT); - fflush(DOUT); + fputs(output, DOUT); + fflush(DOUT); } diff --git a/innbbsd/daemon.h b/innbbsd/daemon.h index d056051f..36384a20 100644 --- a/innbbsd/daemon.h +++ b/innbbsd/daemon.h @@ -5,50 +5,50 @@ #include <time.h> #ifndef ARG -# ifdef __STDC__ -# define ARG(x) x -# else -# define ARG(x) () -# endif +#ifdef __STDC__ +#define ARG(x) x +#else +#define ARG(x) () +#endif #endif struct Argv_t { - FILE *in,*out; - int argc; - char **argv; - char *inputline; - struct Daemoncmd *dc; + FILE *in, *out; + int argc; + char **argv; + char *inputline; + struct Daemoncmd *dc; }; typedef struct Argv_t argv_t; typedef struct Buffer_t { - char *data; - int used, left, lastread; -} buffer_t; + char *data; + int used, left, lastread; +} buffer_t; typedef struct ClientType { - char hostname[1024]; - char username[32]; - char buffer[4096]; - int mode; - argv_t Argv; - int fd, access, lastread, midcheck; - buffer_t in,out; - int ihavecount, ihavesize, ihaveduplicate, ihavefail; - int statcount, statfail; - time_t begin; -} ClientType; + char hostname[1024]; + char username[32]; + char buffer[4096]; + int mode; + argv_t Argv; + int fd, access, lastread, midcheck; + buffer_t in, out; + int ihavecount, ihavesize, ihaveduplicate, ihavefail; + int statcount, statfail; + time_t begin; +} ClientType; typedef struct Daemoncmd { - char *name; - char *usage; - int argc, argno, errorcode, normalcode; - int (*main) ARG(( ClientType*)); -} daemoncmd_t; - -extern void installdaemon ARG((daemoncmd_t *,int,char*)); + char *name; + char *usage; + int argc, argno, errorcode, normalcode; + int (*main) ARG((ClientType *)); +} daemoncmd_t; + +extern void installdaemon ARG((daemoncmd_t *, int, char *)); extern ClientType *Channel; #endif diff --git a/innbbsd/dbz.c b/innbbsd/dbz.c index 6fd15df8..58616968 100644 --- a/innbbsd/dbz.c +++ b/innbbsd/dbz.c @@ -1,33 +1,32 @@ /* - -dbz.c V3.2 - -Copyright 1988 Jon Zeeff (zeeff@b-tech.ann-arbor.mi.us) -You can use this code in any manner, as long as you leave my name on it -and don't hold me responsible for any problems with it. - -Hacked on by gdb@ninja.UUCP (David Butler); Sun Jun 5 00:27:08 CDT 1988 - -Various improvments + INCORE by moraes@ai.toronto.edu (Mark Moraes) - -Major reworking by Henry Spencer as part of the C News project. - -Minor lint and CodeCenter (Saber) fluff removal by Rich $alz (March, 1991). -Non-portable CloseOnExec() calls added by Rich $alz (September, 1991). -Added "writethrough" and tagmask calculation code from -<rob@violet.berkeley.edu> and <leres@ee.lbl.gov> by Rich $alz (December, 1992). -Merged in MMAP code by David Robinson, formerly <david@elroy.jpl.nasa.gov> -now <david.robinson@sun.com> (January, 1993). - -These routines replace dbm as used by the usenet news software -(it's not a full dbm replacement by any means). It's fast and -simple. It contains no AT&T code. - -In general, dbz's files are 1/20 the size of dbm's. Lookup performance -is somewhat better, while file creation is spectacularly faster, especially -if the incore facility is used. - -*/ + * dbz.c V3.2 + * + * Copyright 1988 Jon Zeeff (zeeff@b-tech.ann-arbor.mi.us) You can use this code + * in any manner, as long as you leave my name on it and don't hold me + * responsible for any problems with it. + * + * Hacked on by gdb@ninja.UUCP (David Butler); Sun Jun 5 00:27:08 CDT 1988 + * + * Various improvments + INCORE by moraes@ai.toronto.edu (Mark Moraes) + * + * Major reworking by Henry Spencer as part of the C News project. + * + * Minor lint and CodeCenter (Saber) fluff removal by Rich $alz (March, 1991). + * Non-portable CloseOnExec() calls added by Rich $alz (September, 1991). + * Added "writethrough" and tagmask calculation code from + * <rob@violet.berkeley.edu> and <leres@ee.lbl.gov> by Rich $alz (December, + * 1992). Merged in MMAP code by David Robinson, formerly + * <david@elroy.jpl.nasa.gov> now <david.robinson@sun.com> (January, 1993). + * + * These routines replace dbm as used by the usenet news software (it's not a + * full dbm replacement by any means). It's fast and simple. It contains no + * AT&T code. + * + * In general, dbz's files are 1/20 the size of dbm's. Lookup performance is + * somewhat better, while file creation is spectacularly faster, especially + * if the incore facility is used. + * + */ #include <stdio.h> #include <sys/types.h> @@ -35,26 +34,24 @@ if the incore facility is used. #include <ctype.h> #include <errno.h> #ifndef __STDC__ -extern int errno; +extern int errno; #endif #include <dbz.h> #include "clibrary.h" /* * #ifdef index. "LIA" = "leave it alone unless you know what you're doing". - * - * FUNNYSEEKS SEEK_SET is not 0, get it from <unistd.h> - * INDEX_SIZE backward compatibility with old dbz; avoid using this - * NMEMORY number of days of memory for use in sizing new table (LIA) - * INCORE backward compatibility with old dbz; use dbzincore() instead - * DBZDEBUG enable debugging - * DEFSIZE default table size (not as critical as in old dbz) - * OLDBNEWS default case mapping as in old B News; set NOBUFFER + * + * FUNNYSEEKS SEEK_SET is not 0, get it from <unistd.h> INDEX_SIZE + * backward compatibility with old dbz; avoid using this NMEMORY + * number of days of memory for use in sizing new table (LIA) INCORE + * backward compatibility with old dbz; use dbzincore() instead DBZDEBUG + * enable debugging DEFSIZE default table size (not as critical as in old + * dbz) OLDBNEWS default case mapping as in old B News; set NOBUFFER * BNEWS default case mapping as in current B News; set NOBUFFER - * DEFCASE default case-map algorithm selector - * NOTAGS fseek offsets are strange, do not do tagging (see below) - * NPAGBUF size of .pag buffer, in longs (LIA) - * SHISTBUF size of ASCII-file buffer, in bytes (LIA) + * DEFCASE default case-map algorithm selector NOTAGS fseek offsets + * are strange, do not do tagging (see below) NPAGBUF size of .pag buffer, + * in longs (LIA) SHISTBUF size of ASCII-file buffer, in bytes (LIA) * MAXRUN length of run which shifts to next table (see below) (LIA) * OVERFLOW long-int arithmetic overflow must be avoided, will trap * NOBUFFER do not buffer hash-table i/o, B News locking is defective @@ -72,35 +69,35 @@ extern int errno; #include <limits.h> #endif -static int dbzversion = 3; /* for validating .dir file format */ +static int dbzversion = 3; /* for validating .dir file format */ /* * The dbz database exploits the fact that when news stores a <key,value> - * tuple, the `value' part is a seek offset into a text file, pointing to - * a copy of the `key' part. This avoids the need to store a copy of - * the key in the dbz files. However, the text file *must* exist and be - * consistent with the dbz files, or things will fail. - * + * tuple, the `value' part is a seek offset into a text file, pointing to a + * copy of the `key' part. This avoids the need to store a copy of the key + * in the dbz files. However, the text file *must* exist and be consistent + * with the dbz files, or things will fail. + * * The basic format of the database is a simple hash table containing the * values. A value is stored by indexing into the table using a hash value * computed from the key; collisions are resolved by linear probing (just - * search forward for an empty slot, wrapping around to the beginning of - * the table if necessary). Linear probing is a performance disaster when - * the table starts to get full, so a complication is introduced. The - * database is actually one *or more* tables, stored sequentially in the - * .pag file, and the length of linear-probe sequences is limited. The - * search (for an existing item or an empty slot) always starts in the - * first table, and whenever MAXRUN probes have been done in table N, - * probing continues in table N+1. This behaves reasonably well even in - * cases of massive overflow. There are some other small complications - * added, see comments below. - * + * search forward for an empty slot, wrapping around to the beginning of the + * table if necessary). Linear probing is a performance disaster when the + * table starts to get full, so a complication is introduced. The database + * is actually one *or more* tables, stored sequentially in the .pag file, + * and the length of linear-probe sequences is limited. The search (for an + * existing item or an empty slot) always starts in the first table, and + * whenever MAXRUN probes have been done in table N, probing continues in + * table N+1. This behaves reasonably well even in cases of massive + * overflow. There are some other small complications added, see comments + * below. + * * The table size is fixed for any particular database, but is determined * dynamically when a database is rebuilt. The strategy is to try to pick * the size so the first table will be no more than 2/3 full, that being * slightly before the point where performance starts to degrade. (It is - * desirable to be a bit conservative because the overflow strategy tends - * to produce files with holes in them, which is a nuisance.) + * desirable to be a bit conservative because the overflow strategy tends to + * produce files with holes in them, which is a nuisance.) */ /* @@ -112,41 +109,40 @@ static int dbzversion = 3; /* for validating .dir file format */ /* * ANSI C says an offset into a file is a long, not an off_t, for some - * reason. This actually does simplify life a bit, but it's still nice - * to have a distinctive name for it. Beware, this is just for readability, + * reason. This actually does simplify life a bit, but it's still nice to + * have a distinctive name for it. Beware, this is just for readability, * don't try to change this. */ #define of_t long #define SOF (sizeof(of_t)) /* - * We assume that unused areas of a binary file are zeros, and that the - * bit pattern of `(of_t)0' is all zeros. The alternative is rather - * painful file initialization. Note that okayvalue(), if OVERFLOW is - * defined, knows what value of an offset would cause overflow. + * We assume that unused areas of a binary file are zeros, and that the bit + * pattern of `(of_t)0' is all zeros. The alternative is rather painful file + * initialization. Note that okayvalue(), if OVERFLOW is defined, knows what + * value of an offset would cause overflow. */ #define VACANT ((of_t)0) -#define BIAS(o) ((o)+1) /* make any valid of_t non-VACANT */ -#define UNBIAS(o) ((o)-1) /* reverse BIAS() effect */ +#define BIAS(o) ((o)+1) /* make any valid of_t non-VACANT */ +#define UNBIAS(o) ((o)-1) /* reverse BIAS() effect */ /* - * In a Unix implementation, or indeed any in which an of_t is a byte - * count, there are a bunch of high bits free in an of_t. There is a - * use for them. Checking a possible hit by looking it up in the base - * file is relatively expensive, and the cost can be dramatically reduced - * by using some of those high bits to tag the value with a few more bits - * of the key's hash. This detects most false hits without the overhead of - * seek+read+strcmp. We use the top bit to indicate whether the value is - * tagged or not, and don't tag a value which is using the tag bits itself. - * We're in trouble if the of_t representation wants to use the top bit. - * The actual bitmasks and offset come from the configuration stuff, - * which permits fiddling with them as necessary, and also suppressing - * them completely (by defining the masks to 0). We build pre-shifted - * versions of the masks for efficiency. + * In a Unix implementation, or indeed any in which an of_t is a byte count, + * there are a bunch of high bits free in an of_t. There is a use for them. + * Checking a possible hit by looking it up in the base file is relatively + * expensive, and the cost can be dramatically reduced by using some of those + * high bits to tag the value with a few more bits of the key's hash. This + * detects most false hits without the overhead of seek+read+strcmp. We use + * the top bit to indicate whether the value is tagged or not, and don't tag + * a value which is using the tag bits itself. We're in trouble if the of_t + * representation wants to use the top bit. The actual bitmasks and offset + * come from the configuration stuff, which permits fiddling with them as + * necessary, and also suppressing them completely (by defining the masks to + * 0). We build pre-shifted versions of the masks for efficiency. */ -static of_t tagbits; /* pre-shifted tag mask */ -static of_t taghere; /* pre-shifted tag-enable bit */ -static of_t tagboth; /* tagbits|taghere */ +static of_t tagbits; /* pre-shifted tag mask */ +static of_t taghere; /* pre-shifted tag-enable bit */ +static of_t tagboth; /* tagbits|taghere */ #define HASTAG(o) ((o)&taghere) #define TAG(o) ((o)&tagbits) #define NOTAG(o) ((o)&~tagboth) @@ -154,9 +150,9 @@ static of_t tagboth; /* tagbits|taghere */ #define MKTAG(v) (((v)<<conf.tagshift)&tagbits) /* - * A new, from-scratch database, not built as a rebuild of an old one, - * needs to know table size, casemap algorithm, and tagging. Normally - * the user supplies this info, but there have to be defaults. + * A new, from-scratch database, not built as a rebuild of an old one, needs + * to know table size, casemap algorithm, and tagging. Normally the user + * supplies this info, but there have to be defaults. */ #ifndef DEFSIZE #define DEFSIZE 120011 /* 300007 might be better */ @@ -183,42 +179,42 @@ static of_t tagboth; /* tagbits|taghere */ #endif /* - * We read configuration info from the .dir file into this structure, - * so we can avoid wired-in assumptions for an existing database. - * - * Among the info is a record of recent peak usages, so that a new table - * size can be chosen intelligently when rebuilding. 10 is a good - * number of usages to keep, since news displays marked fluctuations - * in volume on a 7-day cycle. + * We read configuration info from the .dir file into this structure, so we + * can avoid wired-in assumptions for an existing database. + * + * Among the info is a record of recent peak usages, so that a new table size + * can be chosen intelligently when rebuilding. 10 is a good number of + * usages to keep, since news displays marked fluctuations in volume on a + * 7-day cycle. */ struct dbzconfig { - int olddbz; /* .dir file empty but .pag not? */ - of_t tsize; /* table size */ -# ifndef NMEMORY -# define NMEMORY 10 /* # days of use info to remember */ -# endif -# define NUSEDS (1+NMEMORY) - of_t used[NUSEDS]; /* entries used today, yesterday, ... */ - int valuesize; /* size of table values, == SOF */ - int bytemap[SOF]; /* byte-order map */ - char casemap; /* case-mapping algorithm (see cipoint()) */ - char fieldsep; /* field separator in base file, if any */ - of_t tagenb; /* unshifted tag-enable bit */ - of_t tagmask; /* unshifted tag mask */ - int tagshift; /* shift count for tagmask and tagenb */ + int olddbz; /* .dir file empty but .pag not? */ + of_t tsize; /* table size */ +#ifndef NMEMORY +#define NMEMORY 10 /* # days of use info to remember */ +#endif +#define NUSEDS (1+NMEMORY) + of_t used[NUSEDS]; /* entries used today, yesterday, ... */ + int valuesize; /* size of table values, == SOF */ + int bytemap[SOF]; /* byte-order map */ + char casemap; /* case-mapping algorithm (see cipoint()) */ + char fieldsep; /* field separator in base file, if any */ + of_t tagenb; /* unshifted tag-enable bit */ + of_t tagmask; /* unshifted tag mask */ + int tagshift; /* shift count for tagmask and tagenb */ }; static struct dbzconfig conf; -static int getconf(); -static long getno(); -static int putconf(); -static void mybytemap(); -static of_t bytemap(); +static int getconf(); +static long getno(); +static int putconf(); +static void mybytemap(); +static of_t bytemap(); /* * Using mmap() is a more efficent way of keeping the .pag file incore. On - * average, it cuts the number of system calls and buffer copies in half. - * It also allows one copy to be shared among many processes without - * consuming any extra resources. + * average, it cuts the number of system calls and buffer copies in half. It + * also allows one copy to be shared among many processes without consuming + * any extra resources. */ #ifdef MMAP #include <sys/mman.h> @@ -232,51 +228,50 @@ static of_t bytemap(); #endif #endif -/* - * For a program that makes many, many references to the database, it - * is a large performance win to keep the table in core, if it will fit. - * Note that this does hurt robustness in the event of crashes, and - * dbmclose() *must* be called to flush the in-core database to disk. - * The code is prepared to deal with the possibility that there isn't - * enough memory. There *is* an assumption that a size_t is big enough - * to hold the size (in bytes) of one table, so dbminit() tries to figure - * out whether this is possible first. - * - * The preferred way to ask for an in-core table is to do dbzincore(1) - * before dbminit(). The default is not to do it, although -DINCORE - * overrides this for backward compatibility with old dbz. - * - * We keep only the first table in core. This greatly simplifies the - * code, and bounds memory demand. Furthermore, doing this is a large - * performance win even in the event of massive overflow. +/* + * For a program that makes many, many references to the database, it is a + * large performance win to keep the table in core, if it will fit. Note that + * this does hurt robustness in the event of crashes, and dbmclose() *must* + * be called to flush the in-core database to disk. The code is prepared to + * deal with the possibility that there isn't enough memory. There *is* an + * assumption that a size_t is big enough to hold the size (in bytes) of one + * table, so dbminit() tries to figure out whether this is possible first. + * + * The preferred way to ask for an in-core table is to do dbzincore(1) before + * dbminit(). The default is not to do it, although -DINCORE overrides this + * for backward compatibility with old dbz. + * + * We keep only the first table in core. This greatly simplifies the code, and + * bounds memory demand. Furthermore, doing this is a large performance win + * even in the event of massive overflow. */ #ifdef INCORE -static int incore = 1; +static int incore = 1; #else -static int incore = 0; +static int incore = 0; #endif /* * Write to filesystem even if incore? This replaces a single multi- - * megabyte write when doing a dbzsync with a multi-byte write each - * time an article is added. On most systems, this will give an overall - * performance boost. + * megabyte write when doing a dbzsync with a multi-byte write each time an + * article is added. On most systems, this will give an overall performance + * boost. */ -static int writethrough = 0; +static int writethrough = 0; /* * Stdio buffer for .pag reads. Buffering more than about 16 does not help * significantly at the densities we try to maintain, and the much larger - * buffers that most stdios default to are much more expensive to fill. - * With small buffers, stdio is performance-competitive with raw read(), - * and it's much more portable. + * buffers that most stdios default to are much more expensive to fill. With + * small buffers, stdio is performance-competitive with raw read(), and it's + * much more portable. */ #ifndef NPAGBUF #define NPAGBUF 16 #endif #ifndef NOBUFFER #ifdef _IOFBF -static of_t pagbuf[NPAGBUF]; /* only needed if !NOBUFFER && _IOFBF */ +static of_t pagbuf[NPAGBUF];/* only needed if !NOBUFFER && _IOFBF */ #endif #endif @@ -289,54 +284,53 @@ static of_t pagbuf[NPAGBUF]; /* only needed if !NOBUFFER && _IOFBF */ #define SHISTBUF 64 #endif #ifdef _IOFBF -static char basebuf[SHISTBUF]; /* only needed if _IOFBF exists */ +static char basebuf[SHISTBUF]; /* only needed if _IOFBF exists */ #endif /* * Data structure for recording info about searches. */ struct searcher { - of_t place; /* current location in file */ - int tabno; /* which table we're in */ - int run; /* how long we'll stay in this table */ -# ifndef MAXRUN -# define MAXRUN 100 -# endif - long hash; /* the key's hash code (for optimization) */ - of_t tag; /* tag we are looking for */ - int seen; /* have we examined current location? */ - int aborted; /* has i/o error aborted search? */ + of_t place; /* current location in file */ + int tabno; /* which table we're in */ + int run; /* how long we'll stay in this table */ +#ifndef MAXRUN +#define MAXRUN 100 +#endif + long hash; /* the key's hash code (for optimization) */ + of_t tag; /* tag we are looking for */ + int seen; /* have we examined current location? */ + int aborted; /* has i/o error aborted search? */ }; -static void start(); +static void start(); #define FRESH ((struct searcher *)NULL) -static of_t search(); +static of_t search(); #define NOTFOUND ((of_t)-1) -static int okayvalue(); -static int set(); +static int okayvalue(); +static int set(); /* - * Arguably the searcher struct for a given routine ought to be local to - * it, but a fetch() is very often immediately followed by a store(), and - * in some circumstances it is a useful performance win to remember where - * the fetch() completed. So we use a global struct and remember whether - * it is current. + * Arguably the searcher struct for a given routine ought to be local to it, + * but a fetch() is very often immediately followed by a store(), and in some + * circumstances it is a useful performance win to remember where the fetch() + * completed. So we use a global struct and remember whether it is current. */ static struct searcher srch; static struct searcher *prevp; /* &srch or FRESH */ /* byte-ordering stuff */ -static int mybmap[SOF]; /* my byte order (see mybytemap()) */ -static int bytesame; /* is database order same as mine? */ +static int mybmap[SOF]; /* my byte order (see mybytemap()) */ +static int bytesame; /* is database order same as mine? */ #define MAPIN(o) ((bytesame) ? (o) : bytemap((o), conf.bytemap, mybmap)) #define MAPOUT(o) ((bytesame) ? (o) : bytemap((o), mybmap, conf.bytemap)) /* * The double parentheses needed to make this work are ugly, but the - * alternative (under most compilers) is to pack around 2K of unused - * strings -- there's just no way to get rid of them. + * alternative (under most compilers) is to pack around 2K of unused strings + * -- there's just no way to get rid of them. */ #ifdef DBZDEBUG -static int debug; /* controlled by dbzdebug() */ +static int debug; /* controlled by dbzdebug() */ #define DEBUG(args) if (debug) { (void) printf args ; } else #else #define DEBUG(args) ; @@ -344,1409 +338,1382 @@ static int debug; /* controlled by dbzdebug() */ /* externals used */ #if 0 -extern char *memcpy(); -extern char *memchr(); -extern char *malloc(); -extern char *calloc(); -extern void free(); /* ANSI C; some old implementations say int */ -#endif /* 0 */ -extern int atoi(); -extern long atol(); -extern void CloseOnExec(); +extern char *memcpy(); +extern char *memchr(); +extern char *malloc(); +extern char *calloc(); +extern void free(); /* ANSI C; some old implementations say int */ +#endif /* 0 */ +extern int atoi(); +extern long atol(); +extern void CloseOnExec(); /* misc. forwards */ -static long hash(); -static void crcinit(); -static char *cipoint(); -static char *mapcase(); -static int isprime(); -static FILE *latebase(); +static long hash(); +static void crcinit(); +static char *cipoint(); +static char *mapcase(); +static int isprime(); +static FILE *latebase(); /* file-naming stuff */ -static char dir[] = ".dir"; -static char pag[] = ".pag"; -static char *enstring(); +static char dir[] = ".dir"; +static char pag[] = ".pag"; +static char *enstring(); /* central data structures */ -static FILE *basef; /* descriptor for base file */ -static char *basefname; /* name for not-yet-opened base file */ -static FILE *dirf; /* descriptor for .dir file */ -static int dirronly; /* dirf open read-only? */ -static FILE *pagf = NULL; /* descriptor for .pag file */ -static of_t pagpos; /* posn in pagf; only search may set != -1 */ -static int pagronly; /* pagf open read-only? */ -static of_t *corepag; /* incore version of .pag file, if any */ -static FILE *bufpagf; /* well-buffered pagf, for incore rewrite */ -static of_t *getcore(); +static FILE *basef; /* descriptor for base file */ +static char *basefname; /* name for not-yet-opened base file */ +static FILE *dirf; /* descriptor for .dir file */ +static int dirronly; /* dirf open read-only? */ +static FILE *pagf = NULL; /* descriptor for .pag file */ +static of_t pagpos; /* posn in pagf; only search may set != -1 */ +static int pagronly; /* pagf open read-only? */ +static of_t *corepag; /* incore version of .pag file, if any */ +static FILE *bufpagf; /* well-buffered pagf, for incore rewrite */ +static of_t *getcore(); #ifndef MMAP -static int putcore(); +static int putcore(); #endif -static int written; /* has a store() been done? */ +static int written; /* has a store() been done? */ /* - - dbzfresh - set up a new database, no historical info + * - dbzfresh - set up a new database, no historical info */ int /* 0 success, -1 failure */ dbzfresh(name, size, fs, cmap, tagmask) -char *name; /* base name; .dir and .pag must exist */ -long size; /* table size (0 means default) */ -int fs; /* field-separator character in base file */ -int cmap; /* case-map algorithm (0 means default) */ -of_t tagmask; /* 0 default, 1 no tags */ + char *name; /* base name; .dir and .pag must exist */ + long size; /* table size (0 means default) */ + int fs; /* field-separator character in base file */ + int cmap; /* case-map algorithm (0 means default) */ + of_t tagmask; /* 0 default, 1 no tags */ { - register char *fn; - struct dbzconfig c; - register of_t m; - register FILE *f; - - if (pagf != NULL) { - DEBUG(("dbzfresh: database already open\n")); - return(-1); - } - if (size != 0 && size < 2) { - DEBUG(("dbzfresh: preposterous size (%ld)\n", size)); - return(-1); - } - - /* get default configuration */ - if (getconf((FILE *)NULL, (FILE *)NULL, &c) < 0) - return(-1); /* "can't happen" */ - - /* and mess with it as specified */ - if (size != 0) - c.tsize = size; - c.fieldsep = fs; - switch (cmap) { - case 0: - case '0': - case 'B': /* 2.10 compat */ - c.casemap = '0'; /* '\0' nicer, but '0' printable! */ - break; - case '=': - case 'b': /* 2.11 compat */ - c.casemap = '='; - break; - case 'C': - c.casemap = 'C'; - break; - case '?': - c.casemap = DEFCASE; - break; - default: - DEBUG(("dbzfresh case map `%c' unknown\n", cmap)); - return(-1); - } - switch ((int)tagmask) { - case 0: /* default */ - break; - case 1: /* no tags */ - c.tagshift = 0; - c.tagmask = 0; - c.tagenb = 0; - break; - default: - m = tagmask; - c.tagshift = 0; - while (!(m&01)) { - m >>= 1; - c.tagshift++; - } - c.tagmask = m; - c.tagenb = (m << 1) & ~m; - break; - } - - /* write it out */ - fn = enstring(name, dir); - if (fn == NULL) - return(-1); - f = fopen(fn, "w"); - free((POINTER)fn); - if (f == NULL) { - DEBUG(("dbzfresh: unable to write config\n")); - return(-1); - } - if (putconf(f, &c) < 0) { - (void) fclose(f); - return(-1); - } - if (fclose(f) == EOF) { - DEBUG(("dbzfresh: fclose failure\n")); - return(-1); - } - - /* create/truncate .pag */ - fn = enstring(name, pag); - if (fn == NULL) - return(-1); - f = fopen(fn, "w"); - free((POINTER)fn); - if (f == NULL) { - DEBUG(("dbzfresh: unable to create/truncate .pag file\n")); - return(-1); - } else - (void) fclose(f); - - /* and punt to dbminit for the hard work */ - return(dbminit(name)); + register char *fn; + struct dbzconfig c; + register of_t m; + register FILE *f; + + if (pagf != NULL) { + DEBUG(("dbzfresh: database already open\n")); + return (-1); + } + if (size != 0 && size < 2) { + DEBUG(("dbzfresh: preposterous size (%ld)\n", size)); + return (-1); + } + /* get default configuration */ + if (getconf((FILE *) NULL, (FILE *) NULL, &c) < 0) + return (-1); /* "can't happen" */ + + /* and mess with it as specified */ + if (size != 0) + c.tsize = size; + c.fieldsep = fs; + switch (cmap) { + case 0: + case '0': + case 'B': /* 2.10 compat */ + c.casemap = '0'; /* '\0' nicer, but '0' printable! */ + break; + case '=': + case 'b': /* 2.11 compat */ + c.casemap = '='; + break; + case 'C': + c.casemap = 'C'; + break; + case '?': + c.casemap = DEFCASE; + break; + default: + DEBUG(("dbzfresh case map `%c' unknown\n", cmap)); + return (-1); + } + switch ((int)tagmask) { + case 0: /* default */ + break; + case 1: /* no tags */ + c.tagshift = 0; + c.tagmask = 0; + c.tagenb = 0; + break; + default: + m = tagmask; + c.tagshift = 0; + while (!(m & 01)) { + m >>= 1; + c.tagshift++; + } + c.tagmask = m; + c.tagenb = (m << 1) & ~m; + break; + } + + /* write it out */ + fn = enstring(name, dir); + if (fn == NULL) + return (-1); + f = fopen(fn, "w"); + free((POINTER) fn); + if (f == NULL) { + DEBUG(("dbzfresh: unable to write config\n")); + return (-1); + } + if (putconf(f, &c) < 0) { + (void)fclose(f); + return (-1); + } + if (fclose(f) == EOF) { + DEBUG(("dbzfresh: fclose failure\n")); + return (-1); + } + /* create/truncate .pag */ + fn = enstring(name, pag); + if (fn == NULL) + return (-1); + f = fopen(fn, "w"); + free((POINTER) fn); + if (f == NULL) { + DEBUG(("dbzfresh: unable to create/truncate .pag file\n")); + return (-1); + } else + (void)fclose(f); + + /* and punt to dbminit for the hard work */ + return (dbminit(name)); } /* - - dbzsize - what's a good table size to hold this many entries? + * - dbzsize - what's a good table size to hold this many entries? */ long dbzsize(contents) -long contents; /* 0 means what's the default */ + long contents; /* 0 means what's the default */ { - register long n; - - if (contents <= 0) { /* foulup or default inquiry */ - DEBUG(("dbzsize: preposterous input (%ld)\n", contents)); - return(DEFSIZE); - } - n = (contents/2)*3; /* try to keep table at most 2/3 full */ - if (!(n&01)) /* make it odd */ - n++; - DEBUG(("dbzsize: tentative size %ld\n", n)); - while (!isprime(n)) /* and look for a prime */ - n += 2; - DEBUG(("dbzsize: final size %ld\n", n)); - - return(n); + register long n; + + if (contents <= 0) { /* foulup or default inquiry */ + DEBUG(("dbzsize: preposterous input (%ld)\n", contents)); + return (DEFSIZE); + } + n = (contents / 2) * 3; /* try to keep table at most 2/3 full */ + if (!(n & 01)) /* make it odd */ + n++; + DEBUG(("dbzsize: tentative size %ld\n", n)); + while (!isprime(n)) /* and look for a prime */ + n += 2; + DEBUG(("dbzsize: final size %ld\n", n)); + + return (n); } /* - - isprime - is a number prime? - * + * - isprime - is a number prime? + * * This is not a terribly efficient approach. */ static int /* predicate */ isprime(x) -register long x; + register long x; { - static int quick[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 0 }; - register int *ip; - register long div; - register long stop; - - /* hit the first few primes quickly to eliminate easy ones */ - /* this incidentally prevents ridiculously small tables */ - for (ip = quick; (div = *ip) != 0; ip++) - if (x%div == 0) { - DEBUG(("isprime: quick result on %ld\n", (long)x)); - return(0); - } - - /* approximate square root of x */ - for (stop = x; x/stop < stop; stop >>= 1) - continue; - stop <<= 1; - - /* try odd numbers up to stop */ - for (div = *--ip; div < stop; div += 2) - if (x%div == 0) - return(0); - - return(1); + static int quick[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 0}; + register int *ip; + register long div; + register long stop; + + /* hit the first few primes quickly to eliminate easy ones */ + /* this incidentally prevents ridiculously small tables */ + for (ip = quick; (div = *ip) != 0; ip++) + if (x % div == 0) { + DEBUG(("isprime: quick result on %ld\n", (long)x)); + return (0); + } + /* approximate square root of x */ + for (stop = x; x / stop < stop; stop >>= 1) + continue; + stop <<= 1; + + /* try odd numbers up to stop */ + for (div = *--ip; div < stop; div += 2) + if (x % div == 0) + return (0); + + return (1); } /* - - dbzagain - set up a new database to be a rebuild of an old one + * - dbzagain - set up a new database to be a rebuild of an old one */ int /* 0 success, -1 failure */ dbzagain(name, oldname) -char *name; /* base name; .dir and .pag must exist */ -char *oldname; /* base name; all must exist */ + char *name; /* base name; .dir and .pag must exist */ + char *oldname; /* base name; all must exist */ { - register char *fn; - struct dbzconfig c; - register int i; - register long top; - register FILE *f; - register int newtable; - register of_t newsize; - struct stat sb; - register of_t m; - - if (pagf != NULL) { - DEBUG(("dbzagain: database already open\n")); - return(-1); - } - - /* pick up the old configuration */ - fn = enstring(oldname, dir); - if (fn == NULL) - return(-1); - f = fopen(fn, "r"); - free((POINTER)fn); - if (f == NULL) { - DEBUG(("dbzagain: cannot open old .dir file\n")); - return(-1); - } - i = getconf(f, (FILE *)NULL, &c); - (void) fclose(f); - if (i < 0) { - DEBUG(("dbzagain: getconf failed\n")); - return(-1); - } - - /* calculate tagging from old file */ - if (stat(oldname, &sb) != -1) { - for (m = 1, i = 0; m < sb.st_size; i++, m <<= 1) - continue; - - /* if we had more tags than the default, use the new data */ - if ((c.tagmask | c.tagenb) && m > (1 << TAGSHIFT)) { - c.tagshift = i; - c.tagmask = (~(unsigned long)0) >> (i + 1); - c.tagenb = (c.tagmask << 1) & ~c.tagmask; - } - } - - /* tinker with it */ - top = 0; - newtable = 0; - for (i = 0; i < NUSEDS; i++) { - if (top < c.used[i]) - top = c.used[i]; - if (c.used[i] == 0) - newtable = 1; /* hasn't got full usage history yet */ - } - if (top == 0) { - DEBUG(("dbzagain: old table has no contents!\n")); - newtable = 1; - } - for (i = NUSEDS-1; i > 0; i--) - c.used[i] = c.used[i-1]; - c.used[0] = 0; - newsize = dbzsize(top); - if (!newtable || newsize > c.tsize) /* don't shrink new table */ - c.tsize = newsize; - - /* write it out */ - fn = enstring(name, dir); - if (fn == NULL) - return(-1); - f = fopen(fn, "w"); - free((POINTER)fn); - if (f == NULL) { - DEBUG(("dbzagain: unable to write new .dir\n")); - return(-1); - } - i = putconf(f, &c); - (void) fclose(f); - if (i < 0) { - DEBUG(("dbzagain: putconf failed\n")); - return(-1); - } - - /* create/truncate .pag */ - fn = enstring(name, pag); - if (fn == NULL) - return(-1); - f = fopen(fn, "w"); - free((POINTER)fn); - if (f == NULL) { - DEBUG(("dbzagain: unable to create/truncate .pag file\n")); - return(-1); - } else - (void) fclose(f); - - /* and let dbminit do the work */ - return(dbminit(name)); + register char *fn; + struct dbzconfig c; + register int i; + register long top; + register FILE *f; + register int newtable; + register of_t newsize; + struct stat sb; + register of_t m; + + if (pagf != NULL) { + DEBUG(("dbzagain: database already open\n")); + return (-1); + } + /* pick up the old configuration */ + fn = enstring(oldname, dir); + if (fn == NULL) + return (-1); + f = fopen(fn, "r"); + free((POINTER) fn); + if (f == NULL) { + DEBUG(("dbzagain: cannot open old .dir file\n")); + return (-1); + } + i = getconf(f, (FILE *) NULL, &c); + (void)fclose(f); + if (i < 0) { + DEBUG(("dbzagain: getconf failed\n")); + return (-1); + } + /* calculate tagging from old file */ + if (stat(oldname, &sb) != -1) { + for (m = 1, i = 0; m < sb.st_size; i++, m <<= 1) + continue; + + /* if we had more tags than the default, use the new data */ + if ((c.tagmask | c.tagenb) && m > (1 << TAGSHIFT)) { + c.tagshift = i; + c.tagmask = (~(unsigned long)0) >> (i + 1); + c.tagenb = (c.tagmask << 1) & ~c.tagmask; + } + } + /* tinker with it */ + top = 0; + newtable = 0; + for (i = 0; i < NUSEDS; i++) { + if (top < c.used[i]) + top = c.used[i]; + if (c.used[i] == 0) + newtable = 1; /* hasn't got full usage history yet */ + } + if (top == 0) { + DEBUG(("dbzagain: old table has no contents!\n")); + newtable = 1; + } + for (i = NUSEDS - 1; i > 0; i--) + c.used[i] = c.used[i - 1]; + c.used[0] = 0; + newsize = dbzsize(top); + if (!newtable || newsize > c.tsize) /* don't shrink new table */ + c.tsize = newsize; + + /* write it out */ + fn = enstring(name, dir); + if (fn == NULL) + return (-1); + f = fopen(fn, "w"); + free((POINTER) fn); + if (f == NULL) { + DEBUG(("dbzagain: unable to write new .dir\n")); + return (-1); + } + i = putconf(f, &c); + (void)fclose(f); + if (i < 0) { + DEBUG(("dbzagain: putconf failed\n")); + return (-1); + } + /* create/truncate .pag */ + fn = enstring(name, pag); + if (fn == NULL) + return (-1); + f = fopen(fn, "w"); + free((POINTER) fn); + if (f == NULL) { + DEBUG(("dbzagain: unable to create/truncate .pag file\n")); + return (-1); + } else + (void)fclose(f); + + /* and let dbminit do the work */ + return (dbminit(name)); } /* - - dbminit - open a database, creating it (using defaults) if necessary - * - * We try to leave errno set plausibly, to the extent that underlying - * functions permit this, since many people consult it if dbminit() fails. + * - dbminit - open a database, creating it (using defaults) if necessary + * + * We try to leave errno set plausibly, to the extent that underlying functions + * permit this, since many people consult it if dbminit() fails. */ -int /* 0 success, -1 failure */ +int /* 0 success, -1 failure */ dbminit(name) -char *name; + char *name; { - register int i; - register size_t s; - register char *dirfname; - register char *pagfname; - - if (pagf != NULL) { - DEBUG(("dbminit: dbminit already called once\n")); - errno = 0; - return(-1); - } - - /* open the .dir file */ - dirfname = enstring(name, dir); - if (dirfname == NULL) - return(-1); - dirf = fopen(dirfname, "r+"); - if (dirf == NULL) { - dirf = fopen(dirfname, "r"); - dirronly = 1; - } else - dirronly = 0; - free((POINTER)dirfname); - if (dirf == NULL) { - DEBUG(("dbminit: can't open .dir file\n")); - return(-1); - } - CloseOnExec((int)fileno(dirf), 1); - - /* open the .pag file */ - pagfname = enstring(name, pag); - if (pagfname == NULL) { - (void) fclose(dirf); - return(-1); - } - pagf = fopen(pagfname, "r+b"); + register int i; + register size_t s; + register char *dirfname; + register char *pagfname; + + if (pagf != NULL) { + DEBUG(("dbminit: dbminit already called once\n")); + errno = 0; + return (-1); + } + /* open the .dir file */ + dirfname = enstring(name, dir); + if (dirfname == NULL) + return (-1); + dirf = fopen(dirfname, "r+"); + if (dirf == NULL) { + dirf = fopen(dirfname, "r"); + dirronly = 1; + } else + dirronly = 0; + free((POINTER) dirfname); + if (dirf == NULL) { + DEBUG(("dbminit: can't open .dir file\n")); + return (-1); + } + CloseOnExec((int)fileno(dirf), 1); + + /* open the .pag file */ + pagfname = enstring(name, pag); + if (pagfname == NULL) { + (void)fclose(dirf); + return (-1); + } + pagf = fopen(pagfname, "r+b"); + if (pagf == NULL) { + pagf = fopen(pagfname, "rb"); if (pagf == NULL) { - pagf = fopen(pagfname, "rb"); - if (pagf == NULL) { - DEBUG(("dbminit: .pag open failed\n")); - (void) fclose(dirf); - free((POINTER)pagfname); - return(-1); - } - pagronly = 1; - } else if (dirronly) - pagronly = 1; - else - pagronly = 0; - if (pagf != NULL) - CloseOnExec((int)fileno(pagf), 1); + DEBUG(("dbminit: .pag open failed\n")); + (void)fclose(dirf); + free((POINTER) pagfname); + return (-1); + } + pagronly = 1; + } else if (dirronly) + pagronly = 1; + else + pagronly = 0; + if (pagf != NULL) + CloseOnExec((int)fileno(pagf), 1); #ifdef NOBUFFER - /* - * B News does not do adequate locking on its database accesses. - * Why it doesn't get into trouble using dbm is a mystery. In any - * case, doing unbuffered i/o does not cure the problem, but does - * enormously reduce its incidence. - */ - (void) setbuf(pagf, (char *)NULL); + /* + * B News does not do adequate locking on its database accesses. Why it + * doesn't get into trouble using dbm is a mystery. In any case, doing + * unbuffered i/o does not cure the problem, but does enormously reduce + * its incidence. + */ + (void)setbuf(pagf, (char *)NULL); #else #ifdef _IOFBF - (void) setvbuf(pagf, (char *)pagbuf, _IOFBF, sizeof(pagbuf)); + (void)setvbuf(pagf, (char *)pagbuf, _IOFBF, sizeof(pagbuf)); #endif #endif - pagpos = -1; - /* don't free pagfname, need it below */ - - /* open the base file */ - basef = fopen(name, "r"); - if (basef == NULL) { - DEBUG(("dbminit: basefile open failed\n")); - basefname = enstring(name, ""); - if (basefname == NULL) { - (void) fclose(pagf); - (void) fclose(dirf); - free((POINTER)pagfname); - pagf = NULL; - return(-1); - } - } else - basefname = NULL; - if (basef != NULL) - CloseOnExec((int)fileno(basef), 1); + pagpos = -1; + /* don't free pagfname, need it below */ + + /* open the base file */ + basef = fopen(name, "r"); + if (basef == NULL) { + DEBUG(("dbminit: basefile open failed\n")); + basefname = enstring(name, ""); + if (basefname == NULL) { + (void)fclose(pagf); + (void)fclose(dirf); + free((POINTER) pagfname); + pagf = NULL; + return (-1); + } + } else + basefname = NULL; + if (basef != NULL) + CloseOnExec((int)fileno(basef), 1); #ifdef _IOFBF - if (basef != NULL) - (void) setvbuf(basef, basebuf, _IOFBF, sizeof(basebuf)); + if (basef != NULL) + (void)setvbuf(basef, basebuf, _IOFBF, sizeof(basebuf)); #endif - /* pick up configuration */ - if (getconf(dirf, pagf, &conf) < 0) { - DEBUG(("dbminit: getconf failure\n")); - (void) fclose(basef); - (void) fclose(pagf); - (void) fclose(dirf); - free((POINTER)pagfname); - pagf = NULL; - errno = EDOM; /* kind of a kludge, but very portable */ - return(-1); - } - tagbits = conf.tagmask << conf.tagshift; - taghere = conf.tagenb << conf.tagshift; - tagboth = tagbits | taghere; - mybytemap(mybmap); - bytesame = 1; - for (i = 0; i < SOF; i++) - if (mybmap[i] != conf.bytemap[i]) - bytesame = 0; - - /* get first table into core, if it looks desirable and feasible */ - s = (size_t)conf.tsize * SOF; - if (incore && (of_t)(s/SOF) == conf.tsize) { - bufpagf = fopen(pagfname, (pagronly) ? "rb" : "r+b"); - if (bufpagf != NULL) { - corepag = getcore(bufpagf); - CloseOnExec((int)fileno(bufpagf), 1); - } - } else { - bufpagf = NULL; - corepag = NULL; - } - free((POINTER)pagfname); - - /* misc. setup */ - crcinit(); - written = 0; - prevp = FRESH; - DEBUG(("dbminit: succeeded\n")); - return(0); + /* pick up configuration */ + if (getconf(dirf, pagf, &conf) < 0) { + DEBUG(("dbminit: getconf failure\n")); + (void)fclose(basef); + (void)fclose(pagf); + (void)fclose(dirf); + free((POINTER) pagfname); + pagf = NULL; + errno = EDOM; /* kind of a kludge, but very portable */ + return (-1); + } + tagbits = conf.tagmask << conf.tagshift; + taghere = conf.tagenb << conf.tagshift; + tagboth = tagbits | taghere; + mybytemap(mybmap); + bytesame = 1; + for (i = 0; i < SOF; i++) + if (mybmap[i] != conf.bytemap[i]) + bytesame = 0; + + /* get first table into core, if it looks desirable and feasible */ + s = (size_t) conf.tsize * SOF; + if (incore && (of_t) (s / SOF) == conf.tsize) { + bufpagf = fopen(pagfname, (pagronly) ? "rb" : "r+b"); + if (bufpagf != NULL) { + corepag = getcore(bufpagf); + CloseOnExec((int)fileno(bufpagf), 1); + } + } else { + bufpagf = NULL; + corepag = NULL; + } + free((POINTER) pagfname); + + /* misc. setup */ + crcinit(); + written = 0; + prevp = FRESH; + DEBUG(("dbminit: succeeded\n")); + return (0); } /* - - enstring - concatenate two strings into a malloced area + * - enstring - concatenate two strings into a malloced area */ -static char * /* NULL if malloc fails */ +static char * /* NULL if malloc fails */ enstring(s1, s2) -char *s1; -char *s2; + char *s1; + char *s2; { - register char *p; - - p = malloc((size_t)strlen(s1) + (size_t)strlen(s2) + 1); - if (p != NULL) { - (void) strcpy(p, s1); - (void) strcat(p, s2); - } else { - DEBUG(("enstring(%s, %s) out of memory\n", s1, s2)); - } - return(p); + register char *p; + + p = malloc((size_t) strlen(s1) + (size_t) strlen(s2) + 1); + if (p != NULL) { + (void)strcpy(p, s1); + (void)strcat(p, s2); + } else { + DEBUG(("enstring(%s, %s) out of memory\n", s1, s2)); + } + return (p); } /* - - dbmclose - close a database + * - dbmclose - close a database */ int dbmclose() { - register int ret = 0; - - if (pagf == NULL) { - DEBUG(("dbmclose: not opened!\n")); - return(-1); - } - - if (fclose(pagf) == EOF) { - DEBUG(("dbmclose: fclose(pagf) failed\n")); - ret = -1; - } - pagf = basef; /* ensure valid pointer; dbzsync checks it */ - if (dbzsync() < 0) - ret = -1; - if (bufpagf != NULL && fclose(bufpagf) == EOF) { - DEBUG(("dbmclose: fclose(bufpagf) failed\n")); - ret = -1; - } - if (corepag != NULL) + register int ret = 0; + + if (pagf == NULL) { + DEBUG(("dbmclose: not opened!\n")); + return (-1); + } + if (fclose(pagf) == EOF) { + DEBUG(("dbmclose: fclose(pagf) failed\n")); + ret = -1; + } + pagf = basef; /* ensure valid pointer; dbzsync checks it */ + if (dbzsync() < 0) + ret = -1; + if (bufpagf != NULL && fclose(bufpagf) == EOF) { + DEBUG(("dbmclose: fclose(bufpagf) failed\n")); + ret = -1; + } + if (corepag != NULL) #ifdef MMAP - if (munmap((caddr_t)corepag, (int)conf.tsize * SOF) == -1) { - DEBUG(("dbmclose: munmap failed\n")); - ret = -1; - } + if (munmap((caddr_t) corepag, (int)conf.tsize * SOF) == -1) { + DEBUG(("dbmclose: munmap failed\n")); + ret = -1; + } #else - free((POINTER)corepag); + free((POINTER) corepag); #endif - corepag = NULL; - if (basef) { - if (fclose(basef) == EOF) { - DEBUG(("dbmclose: fclose(basef) failed\n")); - ret = -1; - } - } - if (basefname != NULL) - free((POINTER)basefname); - basef = NULL; - pagf = NULL; - if (fclose(dirf) == EOF) { - DEBUG(("dbmclose: fclose(dirf) failed\n")); - ret = -1; - } - - DEBUG(("dbmclose: %s\n", (ret == 0) ? "succeeded" : "failed")); - return(ret); + corepag = NULL; + if (basef) { + if (fclose(basef) == EOF) { + DEBUG(("dbmclose: fclose(basef) failed\n")); + ret = -1; + } + } + if (basefname != NULL) + free((POINTER) basefname); + basef = NULL; + pagf = NULL; + if (fclose(dirf) == EOF) { + DEBUG(("dbmclose: fclose(dirf) failed\n")); + ret = -1; + } + DEBUG(("dbmclose: %s\n", (ret == 0) ? "succeeded" : "failed")); + return (ret); } /* - - dbzsync - push all in-core data out to disk + * - dbzsync - push all in-core data out to disk */ int dbzsync() { - register int ret = 0; + register int ret = 0; - if (pagf == NULL) { - DEBUG(("dbzsync: not opened!\n")); - return(-1); - } - if (!written) - return(0); + if (pagf == NULL) { + DEBUG(("dbzsync: not opened!\n")); + return (-1); + } + if (!written) + return (0); #ifndef MMAP - if (corepag != NULL && !writethrough) { - if (putcore(corepag, bufpagf) < 0) { - DEBUG(("dbzsync: putcore failed\n")); - ret = -1; - } + if (corepag != NULL && !writethrough) { + if (putcore(corepag, bufpagf) < 0) { + DEBUG(("dbzsync: putcore failed\n")); + ret = -1; } + } #endif - if (!conf.olddbz) - if (putconf(dirf, &conf) < 0) - ret = -1; + if (!conf.olddbz) + if (putconf(dirf, &conf) < 0) + ret = -1; - DEBUG(("dbzsync: %s\n", (ret == 0) ? "succeeded" : "failed")); - return(ret); + DEBUG(("dbzsync: %s\n", (ret == 0) ? "succeeded" : "failed")); + return (ret); } /* - - dbzcancel - cancel writing of in-core data - * Mostly for use from child processes. - * Note that we don't need to futz around with stdio buffers, because we - * always fflush them immediately anyway and so they never have stale data. + * - dbzcancel - cancel writing of in-core data Mostly for use from child + * processes. Note that we don't need to futz around with stdio buffers, + * because we always fflush them immediately anyway and so they never have + * stale data. */ int dbzcancel() { - if (pagf == NULL) { - DEBUG(("dbzcancel: not opened!\n")); - return(-1); - } - - written = 0; - return(0); + if (pagf == NULL) { + DEBUG(("dbzcancel: not opened!\n")); + return (-1); + } + written = 0; + return (0); } /* - - dbzfetch - fetch() with case mapping built in + * - dbzfetch - fetch() with case mapping built in */ datum dbzfetch(key) -datum key; + datum key; { - char buffer[DBZMAXKEY + 1]; - datum mappedkey; - register size_t keysize; - - DEBUG(("dbzfetch: (%s)\n", key.dptr)); - - /* Key is supposed to be less than DBZMAXKEY */ - keysize = key.dsize; - if (keysize >= DBZMAXKEY) { - keysize = DBZMAXKEY; - DEBUG(("keysize is %d - truncated to %d\n", key.dsize, DBZMAXKEY)); - } - - mappedkey.dptr = mapcase(buffer, key.dptr, keysize); - buffer[keysize] = '\0'; /* just a debug aid */ - mappedkey.dsize = keysize; - - return(fetch(mappedkey)); + char buffer[DBZMAXKEY + 1]; + datum mappedkey; + register size_t keysize; + + DEBUG(("dbzfetch: (%s)\n", key.dptr)); + + /* Key is supposed to be less than DBZMAXKEY */ + keysize = key.dsize; + if (keysize >= DBZMAXKEY) { + keysize = DBZMAXKEY; + DEBUG(("keysize is %d - truncated to %d\n", key.dsize, DBZMAXKEY)); + } + mappedkey.dptr = mapcase(buffer, key.dptr, keysize); + buffer[keysize] = '\0'; /* just a debug aid */ + mappedkey.dsize = keysize; + + return (fetch(mappedkey)); } /* - - fetch - get an entry from the database - * - * Disgusting fine point, in the name of backward compatibility: if the - * last character of "key" is a NUL, that character is (effectively) not - * part of the comparison against the stored keys. + * - fetch - get an entry from the database + * + * Disgusting fine point, in the name of backward compatibility: if the last + * character of "key" is a NUL, that character is (effectively) not part of + * the comparison against the stored keys. */ datum /* dptr NULL, dsize 0 means failure */ fetch(key) -datum key; + datum key; { - char buffer[DBZMAXKEY + 1]; - static of_t key_ptr; /* return value points here */ - datum output; - register size_t keysize; - register size_t cmplen; - register char *sepp; - - DEBUG(("fetch: (%s)\n", key.dptr)); - output.dptr = NULL; - output.dsize = 0; - prevp = FRESH; - - /* Key is supposed to be less than DBZMAXKEY */ - keysize = key.dsize; - if (keysize >= DBZMAXKEY) { - keysize = DBZMAXKEY; - DEBUG(("keysize is %d - truncated to %d\n", key.dsize, DBZMAXKEY)); - } - - if (pagf == NULL) { - DEBUG(("fetch: database not open!\n")); - return(output); - } else if (basef == NULL) { /* basef didn't exist yet */ - basef = latebase(); - if (basef == NULL) - return(output); - } - - cmplen = keysize; - sepp = &conf.fieldsep; - if (key.dptr[keysize-1] == '\0') { - cmplen--; - sepp = &buffer[keysize-1]; - } - start(&srch, &key, FRESH); - while ((key_ptr = search(&srch)) != NOTFOUND) { - DEBUG(("got 0x%lx\n", key_ptr)); - - /* fetch the key */ - if (fseek(basef, key_ptr, SEEK_SET) != 0) { - DEBUG(("fetch: seek failed\n")); - return(output); - } - if (fread((POINTER)buffer, 1, keysize, basef) != keysize) { - DEBUG(("fetch: read failed\n")); - return(output); - } - - /* try it */ - buffer[keysize] = '\0'; /* terminated for DEBUG */ - (void) mapcase(buffer, buffer, keysize); - DEBUG(("fetch: buffer (%s) looking for (%s) size = %d\n", - buffer, key.dptr, keysize)); - if (memcmp((POINTER)key.dptr, (POINTER)buffer, cmplen) == 0 && - (*sepp == conf.fieldsep || *sepp == '\0')) { - /* we found it */ - output.dptr = (char *)&key_ptr; - output.dsize = SOF; - DEBUG(("fetch: successful\n")); - return(output); - } - } - - /* we didn't find it */ - DEBUG(("fetch: failed\n")); - prevp = &srch; /* remember where we stopped */ - return(output); + char buffer[DBZMAXKEY + 1]; + static of_t key_ptr; /* return value points here */ + datum output; + register size_t keysize; + register size_t cmplen; + register char *sepp; + + DEBUG(("fetch: (%s)\n", key.dptr)); + output.dptr = NULL; + output.dsize = 0; + prevp = FRESH; + + /* Key is supposed to be less than DBZMAXKEY */ + keysize = key.dsize; + if (keysize >= DBZMAXKEY) { + keysize = DBZMAXKEY; + DEBUG(("keysize is %d - truncated to %d\n", key.dsize, DBZMAXKEY)); + } + if (pagf == NULL) { + DEBUG(("fetch: database not open!\n")); + return (output); + } else if (basef == NULL) { /* basef didn't exist yet */ + basef = latebase(); + if (basef == NULL) + return (output); + } + cmplen = keysize; + sepp = &conf.fieldsep; + if (key.dptr[keysize - 1] == '\0') { + cmplen--; + sepp = &buffer[keysize - 1]; + } + start(&srch, &key, FRESH); + while ((key_ptr = search(&srch)) != NOTFOUND) { + DEBUG(("got 0x%lx\n", key_ptr)); + + /* fetch the key */ + if (fseek(basef, key_ptr, SEEK_SET) != 0) { + DEBUG(("fetch: seek failed\n")); + return (output); + } + if (fread((POINTER) buffer, 1, keysize, basef) != keysize) { + DEBUG(("fetch: read failed\n")); + return (output); + } + /* try it */ + buffer[keysize] = '\0'; /* terminated for DEBUG */ + (void)mapcase(buffer, buffer, keysize); + DEBUG(("fetch: buffer (%s) looking for (%s) size = %d\n", + buffer, key.dptr, keysize)); + if (memcmp((POINTER) key.dptr, (POINTER) buffer, cmplen) == 0 && + (*sepp == conf.fieldsep || *sepp == '\0')) { + /* we found it */ + output.dptr = (char *)&key_ptr; + output.dsize = SOF; + DEBUG(("fetch: successful\n")); + return (output); + } + } + + /* we didn't find it */ + DEBUG(("fetch: failed\n")); + prevp = &srch; /* remember where we stopped */ + return (output); } /* - - latebase - try to open a base file that wasn't there at the start + * - latebase - try to open a base file that wasn't there at the start */ -static FILE * +static FILE * latebase() { - register FILE *it; - - if (basefname == NULL) { - DEBUG(("latebase: name foulup\n")); - return(NULL); - } - it = fopen(basefname, "r"); - if (it == NULL) { - DEBUG(("latebase: still can't open base\n")); - } else { - DEBUG(("latebase: late open succeeded\n")); - free((POINTER)basefname); - basefname = NULL; + register FILE *it; + + if (basefname == NULL) { + DEBUG(("latebase: name foulup\n")); + return (NULL); + } + it = fopen(basefname, "r"); + if (it == NULL) { + DEBUG(("latebase: still can't open base\n")); + } else { + DEBUG(("latebase: late open succeeded\n")); + free((POINTER) basefname); + basefname = NULL; #ifdef _IOFBF - (void) setvbuf(it, basebuf, _IOFBF, sizeof(basebuf)); + (void)setvbuf(it, basebuf, _IOFBF, sizeof(basebuf)); #endif - } - if (it != NULL) - CloseOnExec((int)fileno(it), 1); - return(it); + } + if (it != NULL) + CloseOnExec((int)fileno(it), 1); + return (it); } /* - - dbzstore - store() with case mapping built in + * - dbzstore - store() with case mapping built in */ int dbzstore(key, data) -datum key; -datum data; + datum key; + datum data; { - char buffer[DBZMAXKEY + 1]; - datum mappedkey; - register size_t keysize; - - DEBUG(("dbzstore: (%s)\n", key.dptr)); - - /* Key is supposed to be less than DBZMAXKEY */ - keysize = key.dsize; - if (keysize >= DBZMAXKEY) { - DEBUG(("dbzstore: key size too big (%d)\n", key.dsize)); - return(-1); - } - - mappedkey.dptr = mapcase(buffer, key.dptr, keysize); - buffer[keysize] = '\0'; /* just a debug aid */ - mappedkey.dsize = keysize; - - return(store(mappedkey, data)); + char buffer[DBZMAXKEY + 1]; + datum mappedkey; + register size_t keysize; + + DEBUG(("dbzstore: (%s)\n", key.dptr)); + + /* Key is supposed to be less than DBZMAXKEY */ + keysize = key.dsize; + if (keysize >= DBZMAXKEY) { + DEBUG(("dbzstore: key size too big (%d)\n", key.dsize)); + return (-1); + } + mappedkey.dptr = mapcase(buffer, key.dptr, keysize); + buffer[keysize] = '\0'; /* just a debug aid */ + mappedkey.dsize = keysize; + + return (store(mappedkey, data)); } /* - - store - add an entry to the database + * - store - add an entry to the database */ int /* 0 success, -1 failure */ store(key, data) -datum key; -datum data; + datum key; + datum data; { - of_t value; - - if (pagf == NULL) { - DEBUG(("store: database not open!\n")); - return(-1); - } else if (basef == NULL) { /* basef didn't exist yet */ - basef = latebase(); - if (basef == NULL) - return(-1); - } - if (pagronly) { - DEBUG(("store: database open read-only\n")); - return(-1); - } - if (data.dsize != SOF) { - DEBUG(("store: value size wrong (%d)\n", data.dsize)); - return(-1); - } - if (key.dsize >= DBZMAXKEY) { - DEBUG(("store: key size too big (%d)\n", key.dsize)); - return(-1); - } - - /* copy the value in to ensure alignment */ - (void) memcpy((POINTER)&value, (POINTER)data.dptr, SOF); - DEBUG(("store: (%s, %ld)\n", key.dptr, (long)value)); - if (!okayvalue(value)) { - DEBUG(("store: reserved bit or overflow in 0x%lx\n", value)); - return(-1); - } - - /* find the place, exploiting previous search if possible */ - start(&srch, &key, prevp); - while (search(&srch) != NOTFOUND) - continue; - - prevp = FRESH; - conf.used[0]++; - DEBUG(("store: used count %ld\n", conf.used[0])); - written = 1; - return(set(&srch, value)); + of_t value; + + if (pagf == NULL) { + DEBUG(("store: database not open!\n")); + return (-1); + } else if (basef == NULL) { /* basef didn't exist yet */ + basef = latebase(); + if (basef == NULL) + return (-1); + } + if (pagronly) { + DEBUG(("store: database open read-only\n")); + return (-1); + } + if (data.dsize != SOF) { + DEBUG(("store: value size wrong (%d)\n", data.dsize)); + return (-1); + } + if (key.dsize >= DBZMAXKEY) { + DEBUG(("store: key size too big (%d)\n", key.dsize)); + return (-1); + } + /* copy the value in to ensure alignment */ + (void)memcpy((POINTER) & value, (POINTER) data.dptr, SOF); + DEBUG(("store: (%s, %ld)\n", key.dptr, (long)value)); + if (!okayvalue(value)) { + DEBUG(("store: reserved bit or overflow in 0x%lx\n", value)); + return (-1); + } + /* find the place, exploiting previous search if possible */ + start(&srch, &key, prevp); + while (search(&srch) != NOTFOUND) + continue; + + prevp = FRESH; + conf.used[0]++; + DEBUG(("store: used count %ld\n", conf.used[0])); + written = 1; + return (set(&srch, value)); } /* - - dbzincore - control attempts to keep .pag file in core + * - dbzincore - control attempts to keep .pag file in core */ int /* old setting */ dbzincore(value) -int value; + int value; { - register int old = incore; + register int old = incore; #ifndef MMAP - incore = value; + incore = value; #endif - return(old); + return (old); } /* - - dbzwritethrough - write through the pag file in core + * - dbzwritethrough - write through the pag file in core */ int /* old setting */ dbzwritethrough(value) -int value; + int value; { - register int old = writethrough; + register int old = writethrough; - writethrough = value; - return(old); + writethrough = value; + return (old); } /* - - dbztagmask - calculate the correct tagmask for the given base file size + * - dbztagmask - calculate the correct tagmask for the given base file size */ long dbztagmask(size) -register long size; + register long size; { - register long m; - register long tagmask; - register int i; + register long m; + register long tagmask; + register int i; - if (size <= 0) - return(0L); /* silly size */ + if (size <= 0) + return (0L); /* silly size */ - for (m = 1, i = 0; m < size; i++, m <<= 1) - continue; + for (m = 1, i = 0; m < size; i++, m <<= 1) + continue; - if (m < (1 << TAGSHIFT)) - return(0L); /* not worth tagging */ + if (m < (1 << TAGSHIFT)) + return (0L); /* not worth tagging */ - tagmask = (~(unsigned long)0) >> (i + 1); - tagmask = tagmask << i; - return(tagmask); + tagmask = (~(unsigned long)0) >> (i + 1); + tagmask = tagmask << i; + return (tagmask); } /* - - getconf - get configuration from .dir file + * - getconf - get configuration from .dir file */ static int /* 0 success, -1 failure */ getconf(df, pf, cp) -register FILE *df; /* NULL means just give me the default */ -register FILE *pf; /* NULL means don't care about .pag */ -register struct dbzconfig *cp; + register FILE *df; /* NULL means just give me the default */ + register FILE *pf; /* NULL means don't care about .pag */ + register struct dbzconfig *cp; { - register int c; - register int i; - int err = 0; - - c = (df != NULL) ? getc(df) : EOF; - if (c == EOF) { /* empty file, no configuration known */ - cp->olddbz = 0; - if (df != NULL && pf != NULL && getc(pf) != EOF) - cp->olddbz = 1; - cp->tsize = DEFSIZE; - cp->fieldsep = '\t'; - for (i = 0; i < NUSEDS; i++) - cp->used[i] = 0; - cp->valuesize = SOF; - mybytemap(cp->bytemap); - cp->casemap = DEFCASE; - cp->tagenb = TAGENB; - cp->tagmask = TAGMASK; - cp->tagshift = TAGSHIFT; - DEBUG(("getconf: defaults (%ld, %c, (0x%lx/0x%lx<<%d))\n", - cp->tsize, cp->casemap, cp->tagenb, - cp->tagmask, cp->tagshift)); - return(0); - } - (void) ungetc(c, df); - - /* first line, the vital stuff */ - if (getc(df) != 'd' || getc(df) != 'b' || getc(df) != 'z') - err = -1; - if (getno(df, &err) != dbzversion) - err = -1; - cp->tsize = getno(df, &err); - cp->fieldsep = (int)getno(df, &err); - while ((c = getc(df)) == ' ') - continue; - cp->casemap = c; - cp->tagenb = getno(df, &err); - cp->tagmask = getno(df, &err); - cp->tagshift = getno(df, &err); - cp->valuesize = getno(df, &err); - if (cp->valuesize != SOF) { - DEBUG(("getconf: wrong of_t size (%d)\n", cp->valuesize)); - err = -1; - cp->valuesize = SOF; /* to protect the loops below */ - } - for (i = 0; i < cp->valuesize; i++) - cp->bytemap[i] = getno(df, &err); - if (getc(df) != '\n') - err = -1; + register int c; + register int i; + int err = 0; + + c = (df != NULL) ? getc(df) : EOF; + if (c == EOF) { /* empty file, no configuration known */ + cp->olddbz = 0; + if (df != NULL && pf != NULL && getc(pf) != EOF) + cp->olddbz = 1; + cp->tsize = DEFSIZE; + cp->fieldsep = '\t'; + for (i = 0; i < NUSEDS; i++) + cp->used[i] = 0; + cp->valuesize = SOF; + mybytemap(cp->bytemap); + cp->casemap = DEFCASE; + cp->tagenb = TAGENB; + cp->tagmask = TAGMASK; + cp->tagshift = TAGSHIFT; + DEBUG(("getconf: defaults (%ld, %c, (0x%lx/0x%lx<<%d))\n", + cp->tsize, cp->casemap, cp->tagenb, + cp->tagmask, cp->tagshift)); + return (0); + } + (void)ungetc(c, df); + + /* first line, the vital stuff */ + if (getc(df) != 'd' || getc(df) != 'b' || getc(df) != 'z') + err = -1; + if (getno(df, &err) != dbzversion) + err = -1; + cp->tsize = getno(df, &err); + cp->fieldsep = (int)getno(df, &err); + while ((c = getc(df)) == ' ') + continue; + cp->casemap = c; + cp->tagenb = getno(df, &err); + cp->tagmask = getno(df, &err); + cp->tagshift = getno(df, &err); + cp->valuesize = getno(df, &err); + if (cp->valuesize != SOF) { + DEBUG(("getconf: wrong of_t size (%d)\n", cp->valuesize)); + err = -1; + cp->valuesize = SOF; /* to protect the loops below */ + } + for (i = 0; i < cp->valuesize; i++) + cp->bytemap[i] = getno(df, &err); + if (getc(df) != '\n') + err = -1; #ifdef DBZDEBUG - DEBUG(("size %ld, sep %d, cmap %c, tags 0x%lx/0x%lx<<%d, ", cp->tsize, - cp->fieldsep, cp->casemap, cp->tagenb, cp->tagmask, - cp->tagshift)); - DEBUG(("bytemap (%d)", cp->valuesize)); - for (i = 0; i < cp->valuesize; i++) { - DEBUG((" %d", cp->bytemap[i])); - } - DEBUG(("\n")); + DEBUG(("size %ld, sep %d, cmap %c, tags 0x%lx/0x%lx<<%d, ", cp->tsize, + cp->fieldsep, cp->casemap, cp->tagenb, cp->tagmask, + cp->tagshift)); + DEBUG(("bytemap (%d)", cp->valuesize)); + for (i = 0; i < cp->valuesize; i++) { + DEBUG((" %d", cp->bytemap[i])); + } + DEBUG(("\n")); #endif - /* second line, the usages */ - for (i = 0; i < NUSEDS; i++) - cp->used[i] = getno(df, &err); - if (getc(df) != '\n') - err = -1; - DEBUG(("used %ld %ld %ld...\n", cp->used[0], cp->used[1], cp->used[2])); - - if (err < 0) { - DEBUG(("getconf error\n")); - return(-1); - } - return(0); + /* second line, the usages */ + for (i = 0; i < NUSEDS; i++) + cp->used[i] = getno(df, &err); + if (getc(df) != '\n') + err = -1; + DEBUG(("used %ld %ld %ld...\n", cp->used[0], cp->used[1], cp->used[2])); + + if (err < 0) { + DEBUG(("getconf error\n")); + return (-1); + } + return (0); } /* - - getno - get a long + * - getno - get a long */ static long getno(f, ep) -FILE *f; -int *ep; + FILE *f; + int *ep; { - register char *p; -# define MAXN 50 - char getbuf[MAXN]; - register int c; - - while ((c = getc(f)) == ' ') - continue; - if (c == EOF || c == '\n') { - DEBUG(("getno: missing number\n")); - *ep = -1; - return(0); - } - p = getbuf; - *p++ = c; - while ((c = getc(f)) != EOF && c != '\n' && c != ' ') - if (p < &getbuf[MAXN-1]) - *p++ = c; - if (c == EOF) { - DEBUG(("getno: EOF\n")); - *ep = -1; - } else - (void) ungetc(c, f); - *p = '\0'; - - if (strspn(getbuf, "-1234567890") != strlen(getbuf)) { - DEBUG(("getno: `%s' non-numeric\n", getbuf)); - *ep = -1; - } - return(atol(getbuf)); + register char *p; +#define MAXN 50 + char getbuf[MAXN]; + register int c; + + while ((c = getc(f)) == ' ') + continue; + if (c == EOF || c == '\n') { + DEBUG(("getno: missing number\n")); + *ep = -1; + return (0); + } + p = getbuf; + *p++ = c; + while ((c = getc(f)) != EOF && c != '\n' && c != ' ') + if (p < &getbuf[MAXN - 1]) + *p++ = c; + if (c == EOF) { + DEBUG(("getno: EOF\n")); + *ep = -1; + } else + (void)ungetc(c, f); + *p = '\0'; + + if (strspn(getbuf, "-1234567890") != strlen(getbuf)) { + DEBUG(("getno: `%s' non-numeric\n", getbuf)); + *ep = -1; + } + return (atol(getbuf)); } /* - - putconf - write configuration to .dir file + * - putconf - write configuration to .dir file */ static int /* 0 success, -1 failure */ putconf(f, cp) -register FILE *f; -register struct dbzconfig *cp; + register FILE *f; + register struct dbzconfig *cp; { - register int i; - register int ret = 0; - - if (fseek(f, (of_t)0, SEEK_SET) != 0) { - DEBUG(("fseek failure in putconf\n")); - ret = -1; - } - (void) fprintf(f, "dbz %d %ld %d %c %ld %ld %d %d", dbzversion, cp->tsize, - cp->fieldsep, cp->casemap, cp->tagenb, - cp->tagmask, cp->tagshift, cp->valuesize); - for (i = 0; i < cp->valuesize; i++) - (void) fprintf(f, " %d", cp->bytemap[i]); - (void) fprintf(f, "\n"); - for (i = 0; i < NUSEDS; i++) - (void) fprintf(f, "%ld%c", cp->used[i], (i < NUSEDS-1) ? ' ' : '\n'); - - (void) fflush(f); - if (ferror(f)) - ret = -1; - - DEBUG(("putconf status %d\n", ret)); - return(ret); + register int i; + register int ret = 0; + + if (fseek(f, (of_t) 0, SEEK_SET) != 0) { + DEBUG(("fseek failure in putconf\n")); + ret = -1; + } + (void)fprintf(f, "dbz %d %ld %d %c %ld %ld %d %d", dbzversion, cp->tsize, + cp->fieldsep, cp->casemap, cp->tagenb, + cp->tagmask, cp->tagshift, cp->valuesize); + for (i = 0; i < cp->valuesize; i++) + (void)fprintf(f, " %d", cp->bytemap[i]); + (void)fprintf(f, "\n"); + for (i = 0; i < NUSEDS; i++) + (void)fprintf(f, "%ld%c", cp->used[i], (i < NUSEDS - 1) ? ' ' : '\n'); + + (void)fflush(f); + if (ferror(f)) + ret = -1; + + DEBUG(("putconf status %d\n", ret)); + return (ret); } /* - - getcore - try to set up an in-core copy of .pag file + * - getcore - try to set up an in-core copy of .pag file */ -static of_t * /* pointer to copy, or NULL */ +static of_t * /* pointer to copy, or NULL */ getcore(f) -FILE *f; + FILE *f; { - register of_t *p; - register size_t i; - register size_t nread; - register char *it; + register of_t *p; + register size_t i; + register size_t nread; + register char *it; #ifdef MMAP - struct stat st; - - if (fstat(fileno(f), &st) == -1) { - DEBUG(("getcore: fstat failed\n")); - return(NULL); - } - if (((size_t)conf.tsize * SOF) > st.st_size) { - /* file too small; extend it */ - if (ftruncate((int)fileno(f), conf.tsize * SOF) == -1) { - DEBUG(("getcore: ftruncate failed\n")); - return(NULL); - } - } - it = mmap((caddr_t)0, (size_t)conf.tsize * SOF, - pagronly ? PROT_READ : PROT_WRITE | PROT_READ, MAP__ARG, - (int)fileno(f), (off_t)0); - if (it == (char *)-1) { - DEBUG(("getcore: mmap failed\n")); - return(NULL); - } + struct stat st; + + if (fstat(fileno(f), &st) == -1) { + DEBUG(("getcore: fstat failed\n")); + return (NULL); + } + if (((size_t) conf.tsize * SOF) > st.st_size) { + /* file too small; extend it */ + if (ftruncate((int)fileno(f), conf.tsize * SOF) == -1) { + DEBUG(("getcore: ftruncate failed\n")); + return (NULL); + } + } + it = mmap((caddr_t) 0, (size_t) conf.tsize * SOF, + pagronly ? PROT_READ : PROT_WRITE | PROT_READ, MAP__ARG, + (int)fileno(f), (off_t) 0); + if (it == (char *)-1) { + DEBUG(("getcore: mmap failed\n")); + return (NULL); + } #ifdef MC_ADVISE - /* not present in all versions of mmap() */ - madvise(it, (size_t)conf.tsize * SOF, MADV_RANDOM); + /* not present in all versions of mmap() */ + madvise(it, (size_t) conf.tsize * SOF, MADV_RANDOM); #endif #else - it = malloc((size_t)conf.tsize * SOF); - if (it == NULL) { - DEBUG(("getcore: malloc failed\n")); - return(NULL); - } - - nread = fread((POINTER)it, SOF, (size_t)conf.tsize, f); - if (ferror(f)) { - DEBUG(("getcore: read failed\n")); - free((POINTER)it); - return(NULL); - } - - /* NOSTRICT *//* Possible pointer alignment problem */ - p = (of_t *)it + nread; - i = (size_t)conf.tsize - nread; - while (i-- > 0) - *p++ = VACANT; + it = malloc((size_t) conf.tsize * SOF); + if (it == NULL) { + DEBUG(("getcore: malloc failed\n")); + return (NULL); + } + nread = fread((POINTER) it, SOF, (size_t) conf.tsize, f); + if (ferror(f)) { + DEBUG(("getcore: read failed\n")); + free((POINTER) it); + return (NULL); + } + /* NOSTRICT *//* Possible pointer alignment problem */ + p = (of_t *) it + nread; + i = (size_t) conf.tsize - nread; + while (i-- > 0) + *p++ = VACANT; #endif - /* NOSTRICT *//* Possible pointer alignment problem */ - return((of_t *)it); + /* NOSTRICT *//* Possible pointer alignment problem */ + return ((of_t *) it); } #ifndef MMAP /* - - putcore - try to rewrite an in-core table + * - putcore - try to rewrite an in-core table */ static int /* 0 okay, -1 fail */ putcore(tab, f) -of_t *tab; -FILE *f; + of_t *tab; + FILE *f; { - if (fseek(f, (of_t)0, SEEK_SET) != 0) { - DEBUG(("fseek failure in putcore\n")); - return(-1); - } - (void) fwrite((POINTER)tab, SOF, (size_t)conf.tsize, f); - (void) fflush(f); - return((ferror(f)) ? -1 : 0); + if (fseek(f, (of_t) 0, SEEK_SET) != 0) { + DEBUG(("fseek failure in putcore\n")); + return (-1); + } + (void)fwrite((POINTER) tab, SOF, (size_t) conf.tsize, f); + (void)fflush(f); + return ((ferror(f)) ? -1 : 0); } #endif /* - - start - set up to start or restart a search + * - start - set up to start or restart a search */ static void start(sp, kp, osp) -register struct searcher *sp; -register datum *kp; -register struct searcher *osp; /* may be FRESH, i.e. NULL */ + register struct searcher *sp; + register datum *kp; + register struct searcher *osp; /* may be FRESH, i.e. NULL */ { - register long h; - - h = hash(kp->dptr, kp->dsize); - if (osp != FRESH && osp->hash == h) { - if (sp != osp) - *sp = *osp; - DEBUG(("search restarted\n")); - } else { - sp->hash = h; - sp->tag = MKTAG(h / conf.tsize); - DEBUG(("tag 0x%lx\n", sp->tag)); - sp->place = h % conf.tsize; - sp->tabno = 0; - sp->run = (conf.olddbz) ? conf.tsize : MAXRUN; - sp->aborted = 0; - } - sp->seen = 0; + register long h; + + h = hash(kp->dptr, kp->dsize); + if (osp != FRESH && osp->hash == h) { + if (sp != osp) + *sp = *osp; + DEBUG(("search restarted\n")); + } else { + sp->hash = h; + sp->tag = MKTAG(h / conf.tsize); + DEBUG(("tag 0x%lx\n", sp->tag)); + sp->place = h % conf.tsize; + sp->tabno = 0; + sp->run = (conf.olddbz) ? conf.tsize : MAXRUN; + sp->aborted = 0; + } + sp->seen = 0; } /* - - search - conduct part of a search + * - search - conduct part of a search */ -static of_t /* NOTFOUND if we hit VACANT or error */ +static of_t /* NOTFOUND if we hit VACANT or error */ search(sp) -register struct searcher *sp; + register struct searcher *sp; { - register of_t dest; - register of_t value; - of_t val; /* buffer for value (can't fread register) */ - register of_t place; - - if (sp->aborted) - return(NOTFOUND); - - for (;;) { - /* determine location to be examined */ - place = sp->place; - if (sp->seen) { - /* go to next location */ - if (--sp->run <= 0) { - sp->tabno++; - sp->run = MAXRUN; - } - place = (place+1)%conf.tsize + sp->tabno*conf.tsize; - sp->place = place; - } else - sp->seen = 1; /* now looking at current location */ - DEBUG(("search @ %ld\n", place)); - - /* get the tagged value */ - if (corepag != NULL && place < conf.tsize) { - DEBUG(("search: in core\n")); - value = MAPIN(corepag[place]); - } else { - /* seek, if necessary */ - dest = place * SOF; - if (pagpos != dest) { - if (fseek(pagf, dest, SEEK_SET) != 0) { - DEBUG(("search: seek failed\n")); - pagpos = -1; - sp->aborted = 1; - return(NOTFOUND); - } - pagpos = dest; - } - - /* read it */ - if (fread((POINTER)&val, sizeof(val), 1, pagf) == 1) - value = MAPIN(val); - else if (ferror(pagf)) { - DEBUG(("search: read failed\n")); - pagpos = -1; - sp->aborted = 1; - return(NOTFOUND); - } else - value = VACANT; - - /* and finish up */ - pagpos += sizeof(val); - } + register of_t dest; + register of_t value; + of_t val; /* buffer for value (can't fread register) */ + register of_t place; + + if (sp->aborted) + return (NOTFOUND); + + for (;;) { + /* determine location to be examined */ + place = sp->place; + if (sp->seen) { + /* go to next location */ + if (--sp->run <= 0) { + sp->tabno++; + sp->run = MAXRUN; + } + place = (place + 1) % conf.tsize + sp->tabno * conf.tsize; + sp->place = place; + } else + sp->seen = 1; /* now looking at current location */ + DEBUG(("search @ %ld\n", place)); - /* vacant slot is always cause to return */ - if (value == VACANT) { - DEBUG(("search: empty slot\n")); - return(NOTFOUND); - }; - - /* check the tag */ - value = UNBIAS(value); - DEBUG(("got 0x%lx\n", value)); - if (!HASTAG(value)) { - DEBUG(("tagless\n")); - return(value); - } else if (TAG(value) == sp->tag) { - DEBUG(("match\n")); - return(NOTAG(value)); - } else { - DEBUG(("mismatch 0x%lx\n", TAG(value))); + /* get the tagged value */ + if (corepag != NULL && place < conf.tsize) { + DEBUG(("search: in core\n")); + value = MAPIN(corepag[place]); + } else { + /* seek, if necessary */ + dest = place * SOF; + if (pagpos != dest) { + if (fseek(pagf, dest, SEEK_SET) != 0) { + DEBUG(("search: seek failed\n")); + pagpos = -1; + sp->aborted = 1; + return (NOTFOUND); } + pagpos = dest; + } + /* read it */ + if (fread((POINTER) & val, sizeof(val), 1, pagf) == 1) + value = MAPIN(val); + else if (ferror(pagf)) { + DEBUG(("search: read failed\n")); + pagpos = -1; + sp->aborted = 1; + return (NOTFOUND); + } else + value = VACANT; + + /* and finish up */ + pagpos += sizeof(val); + } + + /* vacant slot is always cause to return */ + if (value == VACANT) { + DEBUG(("search: empty slot\n")); + return (NOTFOUND); + }; + + /* check the tag */ + value = UNBIAS(value); + DEBUG(("got 0x%lx\n", value)); + if (!HASTAG(value)) { + DEBUG(("tagless\n")); + return (value); + } else if (TAG(value) == sp->tag) { + DEBUG(("match\n")); + return (NOTAG(value)); + } else { + DEBUG(("mismatch 0x%lx\n", TAG(value))); } - /* NOTREACHED */ + } + /* NOTREACHED */ } /* - - okayvalue - check that a value can be stored + * - okayvalue - check that a value can be stored */ static int /* predicate */ okayvalue(value) -of_t value; + of_t value; { - if (HASTAG(value)) - return(0); + if (HASTAG(value)) + return (0); #ifdef OVERFLOW - if (value == LONG_MAX) /* BIAS() and UNBIAS() will overflow */ - return(0); + if (value == LONG_MAX) /* BIAS() and UNBIAS() will overflow */ + return (0); #endif - return(1); + return (1); } /* - - set - store a value into a location previously found by search + * - set - store a value into a location previously found by search */ static int /* 0 success, -1 failure */ set(sp, value) -register struct searcher *sp; -of_t value; + register struct searcher *sp; + of_t value; { - register of_t place = sp->place; - register of_t v = value; + register of_t place = sp->place; + register of_t v = value; - if (sp->aborted) - return(-1); + if (sp->aborted) + return (-1); - if (CANTAG(v) && !conf.olddbz) { - v |= sp->tag | taghere; - if (v != UNBIAS(VACANT)) /* BIAS(v) won't look VACANT */ + if (CANTAG(v) && !conf.olddbz) { + v |= sp->tag | taghere; + if (v != UNBIAS(VACANT))/* BIAS(v) won't look VACANT */ #ifdef OVERFLOW - if (v != LONG_MAX) /* and it won't overflow */ + if (v != LONG_MAX) /* and it won't overflow */ #endif - value = v; - } - DEBUG(("tagged value is 0x%lx\n", value)); - value = BIAS(value); - value = MAPOUT(value); - - /* If we have the index file in memory, use it */ - if (corepag != NULL && place < conf.tsize) { - corepag[place] = value; - DEBUG(("set: incore\n")); + value = v; + } + DEBUG(("tagged value is 0x%lx\n", value)); + value = BIAS(value); + value = MAPOUT(value); + + /* If we have the index file in memory, use it */ + if (corepag != NULL && place < conf.tsize) { + corepag[place] = value; + DEBUG(("set: incore\n")); #ifdef MMAP - return(0); + return (0); #else - if (!writethrough) - return(0); + if (!writethrough) + return (0); #endif - } - - /* seek to spot */ - pagpos = -1; /* invalidate position memory */ - if (fseek(pagf, (of_t)(place * SOF), SEEK_SET) != 0) { - DEBUG(("set: seek failed\n")); - sp->aborted = 1; - return(-1); - } - - /* write in data */ - if (fwrite((POINTER)&value, SOF, 1, pagf) != 1) { - DEBUG(("set: write failed\n")); - sp->aborted = 1; - return(-1); - } - /* fflush improves robustness, and buffer re-use is rare anyway */ - if (fflush(pagf) == EOF) { - DEBUG(("set: fflush failed\n")); - sp->aborted = 1; - return(-1); - } - - DEBUG(("set: succeeded\n")); - return(0); + } + /* seek to spot */ + pagpos = -1; /* invalidate position memory */ + if (fseek(pagf, (of_t) (place * SOF), SEEK_SET) != 0) { + DEBUG(("set: seek failed\n")); + sp->aborted = 1; + return (-1); + } + /* write in data */ + if (fwrite((POINTER) & value, SOF, 1, pagf) != 1) { + DEBUG(("set: write failed\n")); + sp->aborted = 1; + return (-1); + } + /* fflush improves robustness, and buffer re-use is rare anyway */ + if (fflush(pagf) == EOF) { + DEBUG(("set: fflush failed\n")); + sp->aborted = 1; + return (-1); + } + DEBUG(("set: succeeded\n")); + return (0); } /* - - mybytemap - determine this machine's byte map - * - * A byte map is an array of ints, sizeof(of_t) of them. The 0th int - * is the byte number of the high-order byte in my of_t, and so forth. + * - mybytemap - determine this machine's byte map + * + * A byte map is an array of ints, sizeof(of_t) of them. The 0th int is the + * byte number of the high-order byte in my of_t, and so forth. */ static void mybytemap(map) -int map[]; /* -> int[SOF] */ + int map[]; /* -> int[SOF] */ { - union { - of_t o; - char c[SOF]; - } u; - register int *mp = &map[SOF]; - register int ntodo; - register int i; - - u.o = 1; - for (ntodo = (int)SOF; ntodo > 0; ntodo--) { - for (i = 0; i < SOF; i++) - /* SUPPRESS 112 *//* Retrieving char where long is stored */ - if (u.c[i] != 0) - break; - if (i == SOF) { - /* trouble -- set it to *something* consistent */ - DEBUG(("mybytemap: nonexistent byte %d!!!\n", ntodo)); - for (i = 0; i < SOF; i++) - map[i] = i; - return; - } - DEBUG(("mybytemap: byte %d\n", i)); - *--mp = i; - /* SUPPRESS 112 *//* Retrieving char where long is stored */ - while (u.c[i] != 0) - u.o <<= 1; - } + union { + of_t o; + char c[SOF]; + } u; + register int *mp = &map[SOF]; + register int ntodo; + register int i; + + u.o = 1; + for (ntodo = (int)SOF; ntodo > 0; ntodo--) { + for (i = 0; i < SOF; i++) + /* SUPPRESS 112 *//* Retrieving char where long is stored */ + if (u.c[i] != 0) + break; + if (i == SOF) { + /* trouble -- set it to *something* consistent */ + DEBUG(("mybytemap: nonexistent byte %d!!!\n", ntodo)); + for (i = 0; i < SOF; i++) + map[i] = i; + return; + } + DEBUG(("mybytemap: byte %d\n", i)); + *--mp = i; + /* SUPPRESS 112 *//* Retrieving char where long is stored */ + while (u.c[i] != 0) + u.o <<= 1; + } } /* - - bytemap - transform an of_t from byte ordering map1 to map2 + * - bytemap - transform an of_t from byte ordering map1 to map2 */ -static of_t /* transformed result */ +static of_t /* transformed result */ bytemap(ino, map1, map2) -of_t ino; -int *map1; -int *map2; + of_t ino; + int *map1; + int *map2; { - union oc { - of_t o; - char c[SOF]; - }; - union oc in; - union oc out; - register int i; - - in.o = ino; - for (i = 0; i < SOF; i++) - out.c[map2[i]] = in.c[map1[i]]; - return(out.o); + union oc { + of_t o; + char c[SOF]; + }; + union oc in; + union oc out; + register int i; + + in.o = ino; + for (i = 0; i < SOF; i++) + out.c[map2[i]] = in.c[map1[i]]; + return (out.o); } /* - * This is a simplified version of the pathalias hashing function. - * Thanks to Steve Belovin and Peter Honeyman - * - * hash a string into a long int. 31 bit crc (from andrew appel). - * the crc table is computed at run time by crcinit() -- we could - * precompute, but it takes 1 clock tick on a 750. - * - * This fast table calculation works only if POLY is a prime polynomial - * in the field of integers modulo 2. Since the coefficients of a - * 32-bit polynomial won't fit in a 32-bit word, the high-order bit is - * implicit. IT MUST ALSO BE THE CASE that the coefficients of orders - * 31 down to 25 are zero. Happily, we have candidates, from - * E. J. Watson, "Primitive Polynomials (Mod 2)", Math. Comp. 16 (1962): - * x^32 + x^7 + x^5 + x^3 + x^2 + x^1 + x^0 - * x^31 + x^3 + x^0 - * - * We reverse the bits to get: - * 111101010000000000000000000000001 but drop the last 1 - * f 5 0 0 0 0 0 0 - * 010010000000000000000000000000001 ditto, for 31-bit crc - * 4 8 0 0 0 0 0 0 + * This is a simplified version of the pathalias hashing function. Thanks to + * Steve Belovin and Peter Honeyman + * + * hash a string into a long int. 31 bit crc (from andrew appel). the crc table + * is computed at run time by crcinit() -- we could precompute, but it takes + * 1 clock tick on a 750. + * + * This fast table calculation works only if POLY is a prime polynomial in the + * field of integers modulo 2. Since the coefficients of a 32-bit polynomial + * won't fit in a 32-bit word, the high-order bit is implicit. IT MUST ALSO + * BE THE CASE that the coefficients of orders 31 down to 25 are zero. + * Happily, we have candidates, from E. J. Watson, "Primitive Polynomials + * (Mod 2)", Math. Comp. 16 (1962): x^32 + x^7 + x^5 + x^3 + x^2 + x^1 + x^0 + * x^31 + x^3 + x^0 + * + * We reverse the bits to get: 111101010000000000000000000000001 but drop the + * last 1 f 5 0 0 0 0 0 0 010010000000000000000000000000001 + * ditto, for 31-bit crc 4 8 0 0 0 0 0 0 */ #define POLY 0x48000000L /* 31-bit polynomial (avoids sign problems) */ -static long CrcTable[128]; +static long CrcTable[128]; /* - - crcinit - initialize tables for hash function + * - crcinit - initialize tables for hash function */ static void crcinit() { - register int i, j; - register long sum; - - for (i = 0; i < 128; ++i) { - sum = 0L; - for (j = 7 - 1; j >= 0; --j) - if (i & (1 << j)) - sum ^= POLY >> j; - CrcTable[i] = sum; - } - DEBUG(("crcinit: done\n")); + register int i, j; + register long sum; + + for (i = 0; i < 128; ++i) { + sum = 0L; + for (j = 7 - 1; j >= 0; --j) + if (i & (1 << j)) + sum ^= POLY >> j; + CrcTable[i] = sum; + } + DEBUG(("crcinit: done\n")); } /* - - hash - Honeyman's nice hashing function + * - hash - Honeyman's nice hashing function */ static long hash(name, size) -register char *name; -register int size; + register char *name; + register int size; { - register long sum = 0L; + register long sum = 0L; - while (size--) { - sum = (sum >> 7) ^ CrcTable[(sum ^ (*name++)) & 0x7f]; - } - DEBUG(("hash: returns (%ld)\n", sum)); - return(sum); + while (size--) { + sum = (sum >> 7) ^ CrcTable[(sum ^ (*name++)) & 0x7f]; + } + DEBUG(("hash: returns (%ld)\n", sum)); + return (sum); } /* * case-mapping stuff - * + * * Borrowed from C News, by permission of the authors. Somewhat modified. - * - * We exploit the fact that we are dealing only with headers here, and - * headers are limited to the ASCII characters by RFC822. It is barely - * possible that we might be dealing with a translation into another - * character set, but in particular it's very unlikely for a header - * character to be outside -128..255. - * - * Life would be a whole lot simpler if tolower() could safely and portably - * be applied to any char. + * + * We exploit the fact that we are dealing only with headers here, and headers + * are limited to the ASCII characters by RFC822. It is barely possible that + * we might be dealing with a translation into another character set, but in + * particular it's very unlikely for a header character to be outside + * -128..255. + * + * Life would be a whole lot simpler if tolower() could safely and portably be + * applied to any char. */ #define OFFSET 128 /* avoid trouble with negative chars */ @@ -1760,159 +1727,159 @@ register int size; (TOLOW((a)[0]) == TOLOW((b)[0]) && casencmp(a, b, n) == 0) #define MAPSIZE (256+OFFSET) -static char cmap[MAPSIZE]; /* relies on init to '\0' */ -static int mprimed = 0; /* has cmap been set up? */ +static char cmap[MAPSIZE]; /* relies on init to '\0' */ +static int mprimed = 0; /* has cmap been set up? */ /* - - mapprime - set up case-mapping stuff + * - mapprime - set up case-mapping stuff */ static void mapprime() { - register char *lp; - register char *up; - register int c; - register int i; - static char lower[] = "abcdefghijklmnopqrstuvwxyz"; - static char upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - - for (lp = lower, up = upper; *lp != '\0'; lp++, up++) { - c = *lp; - cmap[c+OFFSET] = c; - cmap[*up+OFFSET] = c; - } - for (i = 0; i < MAPSIZE; i++) - if (cmap[i] == '\0') - cmap[i] = (char)(i-OFFSET); - mprimed = 1; + register char *lp; + register char *up; + register int c; + register int i; + static char lower[] = "abcdefghijklmnopqrstuvwxyz"; + static char upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + for (lp = lower, up = upper; *lp != '\0'; lp++, up++) { + c = *lp; + cmap[c + OFFSET] = c; + cmap[*up + OFFSET] = c; + } + for (i = 0; i < MAPSIZE; i++) + if (cmap[i] == '\0') + cmap[i] = (char)(i - OFFSET); + mprimed = 1; } /* - - casencmp - case-independent strncmp + * - casencmp - case-independent strncmp */ static int /* < == > 0 */ casencmp(s1, s2, len) -char *s1; -char *s2; -int len; + char *s1; + char *s2; + int len; { - register char *p1; - register char *p2; - register int n; - - if (!mprimed) - mapprime(); - - p1 = s1; - p2 = s2; - n = len; - while (--n >= 0 && *p1 != '\0' && TOLOW(*p1) == TOLOW(*p2)) { - p1++; - p2++; - } - if (n < 0) - return(0); - - /* - * The following case analysis is necessary so that characters - * which look negative collate low against normal characters but - * high against the end-of-string NUL. - */ - if (*p1 == '\0' && *p2 == '\0') - return(0); - else if (*p1 == '\0') - return(-1); - else if (*p2 == '\0') - return(1); - else - return(TOLOW(*p1) - TOLOW(*p2)); + register char *p1; + register char *p2; + register int n; + + if (!mprimed) + mapprime(); + + p1 = s1; + p2 = s2; + n = len; + while (--n >= 0 && *p1 != '\0' && TOLOW(*p1) == TOLOW(*p2)) { + p1++; + p2++; + } + if (n < 0) + return (0); + + /* + * The following case analysis is necessary so that characters which look + * negative collate low against normal characters but high against the + * end-of-string NUL. + */ + if (*p1 == '\0' && *p2 == '\0') + return (0); + else if (*p1 == '\0') + return (-1); + else if (*p2 == '\0') + return (1); + else + return (TOLOW(*p1) - TOLOW(*p2)); } /* - - mapcase - do case-mapped copy + * - mapcase - do case-mapped copy */ -static char * /* returns src or dst */ +static char * /* returns src or dst */ mapcase(dst, src, siz) -char *dst; /* destination, used only if mapping needed */ -char *src; /* source; src == dst is legal */ -size_t siz; + char *dst; /* destination, used only if mapping needed */ + char *src; /* source; src == dst is legal */ + size_t siz; { - register char *s; - register char *d; - register char *c; /* case break */ - register char *e; /* end of source */ + register char *s; + register char *d; + register char *c; /* case break */ + register char *e; /* end of source */ - c = cipoint(src, siz); - if (c == NULL) - return(src); + c = cipoint(src, siz); + if (c == NULL) + return (src); - if (!mprimed) - mapprime(); - s = src; - e = s + siz; - d = dst; + if (!mprimed) + mapprime(); + s = src; + e = s + siz; + d = dst; - while (s < c) - *d++ = *s++; - while (s < e) - *d++ = TOLOW(*s++); + while (s < c) + *d++ = *s++; + while (s < e) + *d++ = TOLOW(*s++); - return(dst); + return (dst); } /* - - cipoint - where in this message-ID does it become case-insensitive? - * + * - cipoint - where in this message-ID does it become case-insensitive? + * * The RFC822 code is not quite complete. Absolute, total, full RFC822 - * compliance requires a horrible parsing job, because of the arcane - * quoting conventions -- abc"def"ghi is not equivalent to abc"DEF"ghi, - * for example. There are three or four things that might occur in the - * domain part of a message-id that are case-sensitive. They don't seem - * to ever occur in real news, thank Cthulhu. (What? You were expecting - * a merciful and forgiving deity to be invoked in connection with RFC822? - * Forget it; none of them would come near it.) + * compliance requires a horrible parsing job, because of the arcane quoting + * conventions -- abc"def"ghi is not equivalent to abc"DEF"ghi, for example. + * There are three or four things that might occur in the domain part of a + * message-id that are case-sensitive. They don't seem to ever occur in real + * news, thank Cthulhu. (What? You were expecting a merciful and forgiving + * deity to be invoked in connection with RFC822? Forget it; none of them + * would come near it.) */ -static char * /* pointer into s, or NULL for "nowhere" */ +static char * /* pointer into s, or NULL for "nowhere" */ cipoint(s, siz) -char *s; -size_t siz; + char *s; + size_t siz; { - register char *p; - static char post[] = "postmaster"; - static int plen = sizeof(post)-1; - - switch (conf.casemap) { - case '0': /* unmapped, sensible */ - return(NULL); - case 'C': /* C News, RFC 822 conformant (approx.) */ - p = memchr((POINTER)s, '@', siz); - if (p == NULL) /* no local/domain split */ - return(NULL); /* assume all local */ - if (p - (s+1) == plen && CISTREQN(s+1, post, plen)) { - /* crazy -- "postmaster" is case-insensitive */ - return(s); - } - return(p); - case '=': /* 2.11, neither sensible nor conformant */ - return(s); /* all case-insensitive */ - } - - DEBUG(("cipoint: unknown case mapping `%c'\n", conf.casemap)); - return(NULL); /* just leave it alone */ + register char *p; + static char post[] = "postmaster"; + static int plen = sizeof(post) - 1; + + switch (conf.casemap) { + case '0': /* unmapped, sensible */ + return (NULL); + case 'C': /* C News, RFC 822 conformant (approx.) */ + p = memchr((POINTER) s, '@', siz); + if (p == NULL) /* no local/domain split */ + return (NULL); /* assume all local */ + if (p - (s + 1) == plen && CISTREQN(s + 1, post, plen)) { + /* crazy -- "postmaster" is case-insensitive */ + return (s); + } + return (p); + case '=': /* 2.11, neither sensible nor conformant */ + return (s); /* all case-insensitive */ + } + + DEBUG(("cipoint: unknown case mapping `%c'\n", conf.casemap)); + return (NULL); /* just leave it alone */ } /* - - dbzdebug - control dbz debugging at run time + * - dbzdebug - control dbz debugging at run time */ #ifdef DBZDEBUG int /* old value */ dbzdebug(value) -int value; + int value; { - register int old = debug; + register int old = debug; - debug = value; - return(old); + debug = value; + return (old); } #endif diff --git a/innbbsd/dbz.h b/innbbsd/dbz.h index 3d7e8ed7..94414012 100644 --- a/innbbsd/dbz.h +++ b/innbbsd/dbz.h @@ -1,32 +1,32 @@ /* for dbm and dbz */ typedef struct { - char *dptr; - int dsize; -} datum; + char *dptr; + int dsize; +} datum; /* standard dbm functions */ -extern int dbminit(); -extern datum fetch(); -extern int store(); -extern int delete(); /* not in dbz */ -extern datum firstkey(); /* not in dbz */ -extern datum nextkey(); /* not in dbz */ -extern int dbmclose(); /* in dbz, but not in old dbm */ +extern int dbminit(); +extern datum fetch(); +extern int store(); +extern int delete(); /* not in dbz */ +extern datum firstkey(); /* not in dbz */ +extern datum nextkey(); /* not in dbz */ +extern int dbmclose(); /* in dbz, but not in old dbm */ /* new stuff for dbz */ -extern int dbzfresh(); -extern int dbzagain(); -extern datum dbzfetch(); -extern int dbzstore(); -extern int dbzsync(); -extern long dbzsize(); -extern int dbzincore(); -extern int dbzcancel(); -extern int dbzdebug(); +extern int dbzfresh(); +extern int dbzagain(); +extern datum dbzfetch(); +extern int dbzstore(); +extern int dbzsync(); +extern long dbzsize(); +extern int dbzincore(); +extern int dbzcancel(); +extern int dbzdebug(); /* - * In principle we could handle unlimited-length keys by operating a chunk - * at a time, but it's not worth it in practice. Setting a nice large - * bound on them simplifies the code and doesn't hurt anything. + * In principle we could handle unlimited-length keys by operating a chunk at + * a time, but it's not worth it in practice. Setting a nice large bound on + * them simplifies the code and doesn't hurt anything. */ #define DBZMAXKEY 255 diff --git a/innbbsd/dbztool.c b/innbbsd/dbztool.c index 5318721b..a0a35c94 100644 --- a/innbbsd/dbztool.c +++ b/innbbsd/dbztool.c @@ -4,85 +4,90 @@ #define DEBUG 1 #undef DEBUG -static datum content, inputkey, inputvalue; -static char dboutput[1025]; -static char dbinput[1025]; -static char valueinput[100]; +static datum content, inputkey, inputvalue; +static char dboutput[1025]; +static char dbinput[1025]; +static char valueinput[100]; -enum {SUBJECT, FROM, NAME}; -char *DBfetch(key) -char *key; +enum { + SUBJECT, FROM, NAME +}; +char * +DBfetch(key) + char *key; { - int i; - char *tail, *ptr; - if (key == NULL) return NULL; - sprintf(dbinput,"%.510s",key); - inputkey.dptr = dbinput; - inputkey.dsize = strlen(dbinput); - content.dptr = dboutput; - ptr = (char*)HISfilesfor(&inputkey,&content); - if (ptr == NULL) { - return NULL; - } - return ptr; + int i; + char *tail, *ptr; + if (key == NULL) + return NULL; + sprintf(dbinput, "%.510s", key); + inputkey.dptr = dbinput; + inputkey.dsize = strlen(dbinput); + content.dptr = dboutput; + ptr = (char *)HISfilesfor(&inputkey, &content); + if (ptr == NULL) { + return NULL; + } + return ptr; } -DBstore(key,paths) -char *key; -char *paths; +DBstore(key, paths) + char *key; + char *paths; { - int i; - char *tail; - time_t now; - time(&now); - if (key == NULL) return -1; - sprintf(dbinput,"%.510s",key); - inputkey.dptr = dbinput; - inputkey.dsize = strlen(dbinput); - if (HISwrite(&inputkey, now, paths ) == FALSE) { - return -1; - } else { - return 0; - } + int i; + char *tail; + time_t now; + time(&now); + if (key == NULL) + return -1; + sprintf(dbinput, "%.510s", key); + inputkey.dptr = dbinput; + inputkey.dsize = strlen(dbinput); + if (HISwrite(&inputkey, now, paths) == FALSE) { + return -1; + } else { + return 0; + } } -int storeDB(mid,paths) -char *mid; -char *paths; +int +storeDB(mid, paths) + char *mid; + char *paths; { - char *key,*ptr; - int rel; - ptr = DBfetch(mid); - if (ptr != NULL) { - return 0; - } else { - return DBstore(mid , paths); - } + char *key, *ptr; + int rel; + ptr = DBfetch(mid); + if (ptr != NULL) { + return 0; + } else { + return DBstore(mid, paths); + } } -my_mkdir (idir,mode) -char *idir; -int mode; +my_mkdir(idir, mode) + char *idir; + int mode; { - char buffer[LEN]; - char *ptr, *dir = buffer; - struct stat st; - strncpy(dir, idir, LEN - 1); - for (;dir!=NULL && *dir;) { - ptr = (char*)strchr(dir,'/'); - if (ptr != NULL) { - *ptr = '\0'; - } - if (stat(dir,&st) != 0) { - if (mkdir(dir,mode) != 0 ) - return -1; - } - chdir(dir); - if (ptr != NULL) - dir = ptr +1; - else - dir = ptr; + char buffer[LEN]; + char *ptr, *dir = buffer; + struct stat st; + strncpy(dir, idir, LEN - 1); + for (; dir != NULL && *dir;) { + ptr = (char *)strchr(dir, '/'); + if (ptr != NULL) { + *ptr = '\0'; } - return 0; + if (stat(dir, &st) != 0) { + if (mkdir(dir, mode) != 0) + return -1; + } + chdir(dir); + if (ptr != NULL) + dir = ptr + 1; + else + dir = ptr; + } + return 0; } - diff --git a/innbbsd/echobbslib.c b/innbbsd/echobbslib.c index 2511b50a..8eb7a99b 100644 --- a/innbbsd/echobbslib.c +++ b/innbbsd/echobbslib.c @@ -1,713 +1,763 @@ #if defined( LINUX ) -# include "innbbsconf.h" -# include "bbslib.h" -# include <stdarg.h> +#include "innbbsconf.h" +#include "bbslib.h" +#include <stdarg.h> #else -# include <stdarg.h> -# include "innbbsconf.h" -# include "bbslib.h" +#include <stdarg.h> +#include "innbbsconf.h" +#include "bbslib.h" #endif -char INNBBSCONF[MAXPATHLEN]; -char INNDHOME[MAXPATHLEN]; -char HISTORY[MAXPATHLEN]; -char LOGFILE[MAXPATHLEN]; -char MYBBSID[MAXPATHLEN]; -char ECHOMAIL[MAXPATHLEN]; -char BBSFEEDS[MAXPATHLEN]; -char LOCALDAEMON[MAXPATHLEN]; - -int His_Maint_Min= HIS_MAINT_MIN; -int His_Maint_Hour= HIS_MAINT_HOUR; -int Expiredays = EXPIREDAYS; - -nodelist_t *NODELIST=NULL, **NODELIST_BYNODE=NULL; -newsfeeds_t *NEWSFEEDS=NULL, **NEWSFEEDS_BYBOARD=NULL; -static char *NODELIST_BUF, *NEWSFEEDS_BUF; -int NFCOUNT, NLCOUNT; -int LOCALNODELIST=0, NONENEWSFEEDS=0; +char INNBBSCONF[MAXPATHLEN]; +char INNDHOME[MAXPATHLEN]; +char HISTORY[MAXPATHLEN]; +char LOGFILE[MAXPATHLEN]; +char MYBBSID[MAXPATHLEN]; +char ECHOMAIL[MAXPATHLEN]; +char BBSFEEDS[MAXPATHLEN]; +char LOCALDAEMON[MAXPATHLEN]; + +int His_Maint_Min = HIS_MAINT_MIN; +int His_Maint_Hour = HIS_MAINT_HOUR; +int Expiredays = EXPIREDAYS; + +nodelist_t *NODELIST = NULL, **NODELIST_BYNODE = NULL; +newsfeeds_t *NEWSFEEDS = NULL, **NEWSFEEDS_BYBOARD = NULL; +static char *NODELIST_BUF, *NEWSFEEDS_BUF; +int NFCOUNT, NLCOUNT; +int LOCALNODELIST = 0, NONENEWSFEEDS = 0; #ifndef _PATH_BBSHOME -# define _PATH_BBSHOME "/u/staff/bbsroot/csie_util/bntpd/home" +#define _PATH_BBSHOME "/u/staff/bbsroot/csie_util/bntpd/home" #endif -static FILE *bbslogfp; +static FILE *bbslogfp; -static int -verboseFlag=0; +static int + verboseFlag = 0; -static char* -verboseFilename=NULL; -static char verbosename[MAXPATHLEN]; +static char * + verboseFilename = NULL; +static char verbosename[MAXPATHLEN]; verboseon(filename) -char *filename; + char *filename; { - verboseFlag = 1; - if ( filename != NULL ) { - if (strchr(filename,'/') == NULL) { - sprintf(verbosename,"%s/innd/%s",BBSHOME,filename); - filename = verbosename; - } - } - verboseFilename = filename; + verboseFlag = 1; + if (filename != NULL) { + if (strchr(filename, '/') == NULL) { + sprintf(verbosename, "%s/innd/%s", BBSHOME, filename); + filename = verbosename; + } + } + verboseFilename = filename; } verboseoff() { - verboseFlag = 0; + verboseFlag = 0; } setverboseon() { - verboseFlag = 1; + verboseFlag = 1; } isverboselog() { - return verboseFlag; + return verboseFlag; } setverboseoff() { - verboseoff(); - if (bbslogfp != NULL) { - fclose(bbslogfp); - bbslogfp = NULL; - } + verboseoff(); + if (bbslogfp != NULL) { + fclose(bbslogfp); + bbslogfp = NULL; + } } -verboselog(char *fmt, ...) +verboselog(char *fmt,...) { - va_list ap; - char datebuf[40]; - time_t now; + va_list ap; + char datebuf[40]; + time_t now; - if (verboseFlag == 0) return; + if (verboseFlag == 0) + return; - va_start(ap, fmt); + va_start(ap, fmt); - time(&now); - strftime(datebuf, sizeof(datebuf), "%b %d %X ", localtime(&now)); + time(&now); + strftime(datebuf, sizeof(datebuf), "%b %d %X ", localtime(&now)); - if (bbslogfp == NULL) { - if (verboseFilename != NULL) - bbslogfp = fopen(verboseFilename, "a"); - else - bbslogfp = fdopen(1, "a"); - } - if (bbslogfp == NULL) { - va_end(ap); - return; - } - fprintf(bbslogfp,"%s[%d] ",datebuf, getpid()); - vfprintf(bbslogfp, fmt, ap); - fflush(bbslogfp); + if (bbslogfp == NULL) { + if (verboseFilename != NULL) + bbslogfp = fopen(verboseFilename, "a"); + else + bbslogfp = fdopen(1, "a"); + } + if (bbslogfp == NULL) { va_end(ap); + return; + } + fprintf(bbslogfp, "%s[%d] ", datebuf, getpid()); + vfprintf(bbslogfp, fmt, ap); + fflush(bbslogfp); + va_end(ap); } #ifdef PalmBBS -xbbslog(char *fmt, ...) +xbbslog(char *fmt,...) #else -bbslog(char *fmt, ...) +bbslog(char *fmt,...) #endif { - va_list ap; - char datebuf[40]; - time_t now; + va_list ap; + char datebuf[40]; + time_t now; - va_start(ap, fmt); + va_start(ap, fmt); - time(&now); - strftime(datebuf, sizeof(datebuf), "%b %d %X ", localtime(&now)); + time(&now); + strftime(datebuf, sizeof(datebuf), "%b %d %X ", localtime(&now)); - if (bbslogfp == NULL) { - bbslogfp = fopen(LOGFILE, "a"); - } - if (bbslogfp == NULL) { - va_end(ap); - return; - } - fprintf(bbslogfp,"%s[%d] ",datebuf,getpid()); - vfprintf(bbslogfp, fmt, ap); - fflush(bbslogfp); + if (bbslogfp == NULL) { + bbslogfp = fopen(LOGFILE, "a"); + } + if (bbslogfp == NULL) { va_end(ap); + return; + } + fprintf(bbslogfp, "%s[%d] ", datebuf, getpid()); + vfprintf(bbslogfp, fmt, ap); + fflush(bbslogfp); + va_end(ap); } initial_bbs(outgoing) -char *outgoing; + char *outgoing; { - FILE* FN; - struct stat st; - int fd, i; - char *bbsnameptr=NULL; - -/* reopen bbslog */ - if (bbslogfp != NULL) { - fclose(bbslogfp); - bbslogfp = NULL; - } - + FILE *FN; + struct stat st; + int fd, i; + char *bbsnameptr = NULL; + + /* reopen bbslog */ + if (bbslogfp != NULL) { + fclose(bbslogfp); + bbslogfp = NULL; + } #ifdef WITH_ECHOMAIL - init_echomailfp(); - init_bbsfeedsfp(); + init_echomailfp(); + init_bbsfeedsfp(); #endif - LOCALNODELIST=0, NONENEWSFEEDS =0; - sprintf(INNDHOME,"%s/innd",BBSHOME); - sprintf(HISTORY, "%s/history",INNDHOME); - sprintf(LOGFILE, "%s/bbslog",INNDHOME); - sprintf(ECHOMAIL,"%s/echomail.log",BBSHOME); - sprintf(LOCALDAEMON,"%s/.innbbsd",INNDHOME); - sprintf(INNBBSCONF,"%s/innbbs.conf",INNDHOME); - sprintf(BBSFEEDS,"%s/bbsfeeds.log",INNDHOME); - - if (isfile(INNBBSCONF)) { - FILE *conf; - char buffer[MAXPATHLEN]; - conf = fopen(INNBBSCONF,"r"); - if (conf != NULL) { - while (fgets( buffer, sizeof buffer, conf) != NULL) { - char *ptr, *front=NULL, *value=NULL, *value2=NULL, *value3=NULL; - if ( buffer[0] == '#' || buffer[0] == '\n') continue; - for ( front = buffer; *front && isspace(*front); front++); - for ( ptr = front; *ptr && !isspace(*ptr) ; ptr++) ; - if (*ptr == '\0') continue; - *ptr++ = '\0'; - for ( ; *ptr && isspace(*ptr) ; ptr++) ; - if (*ptr == '\0') continue; - value = ptr++; - for ( ; *ptr && !isspace(*ptr) ; ptr++) ; - if (*ptr) { - *ptr++ = '\0'; - for ( ; *ptr && isspace(*ptr) ; ptr++) ; - value2 = ptr++; - for ( ; *ptr && !isspace(*ptr) ; ptr++) ; - if (*ptr) { - *ptr++ = '\0'; - for ( ; *ptr && isspace(*ptr) ; ptr++) ; - value3 = ptr++; - for ( ; *ptr && !isspace(*ptr) ; ptr++) ; - if (*ptr) { - *ptr++ = '\0'; - } - } - } - if ( strcasecmp(front,"expiredays") == 0) { - Expiredays = atoi(value); - if (Expiredays < 0) { - Expiredays = EXPIREDAYS; - } - } else if ( strcasecmp(front,"expiretime") == 0) { - ptr = strchr(value,':'); - if (ptr == NULL) { - fprintf(stderr, "Syntax error in innbbs.conf\n"); - } else { - *ptr++ = '\0'; - His_Maint_Hour = atoi(value); - His_Maint_Min = atoi(ptr); - if (His_Maint_Hour < 0) - His_Maint_Hour = HIS_MAINT_HOUR; - if (His_Maint_Min < 0) - His_Maint_Min = HIS_MAINT_MIN; + LOCALNODELIST = 0, NONENEWSFEEDS = 0; + sprintf(INNDHOME, "%s/innd", BBSHOME); + sprintf(HISTORY, "%s/history", INNDHOME); + sprintf(LOGFILE, "%s/bbslog", INNDHOME); + sprintf(ECHOMAIL, "%s/echomail.log", BBSHOME); + sprintf(LOCALDAEMON, "%s/.innbbsd", INNDHOME); + sprintf(INNBBSCONF, "%s/innbbs.conf", INNDHOME); + sprintf(BBSFEEDS, "%s/bbsfeeds.log", INNDHOME); + + if (isfile(INNBBSCONF)) { + FILE *conf; + char buffer[MAXPATHLEN]; + conf = fopen(INNBBSCONF, "r"); + if (conf != NULL) { + while (fgets(buffer, sizeof buffer, conf) != NULL) { + char *ptr, *front = NULL, *value = NULL, *value2 = NULL, + *value3 = NULL; + if (buffer[0] == '#' || buffer[0] == '\n') + continue; + for (front = buffer; *front && isspace(*front); front++); + for (ptr = front; *ptr && !isspace(*ptr); ptr++); + if (*ptr == '\0') + continue; + *ptr++ = '\0'; + for (; *ptr && isspace(*ptr); ptr++); + if (*ptr == '\0') + continue; + value = ptr++; + for (; *ptr && !isspace(*ptr); ptr++); + if (*ptr) { + *ptr++ = '\0'; + for (; *ptr && isspace(*ptr); ptr++); + value2 = ptr++; + for (; *ptr && !isspace(*ptr); ptr++); + if (*ptr) { + *ptr++ = '\0'; + for (; *ptr && isspace(*ptr); ptr++); + value3 = ptr++; + for (; *ptr && !isspace(*ptr); ptr++); + if (*ptr) { + *ptr++ = '\0'; + } + } } - } else if ( strcasecmp(front,"newsfeeds") == 0) { - if (strcmp(value,"none")==0) - NONENEWSFEEDS = 1; - } else if ( strcasecmp(front,"nodelist") == 0) { - if (strcmp(value,"local")==0) - LOCALNODELIST = 1; - } /*else if ( strcasecmp(front,"newsfeeds") == 0) { - printf("newsfeeds %s\n", value); - } else if ( strcasecmp(front,"nodelist") == 0) { - printf("nodelist %s\n", value); - } else if ( strcasecmp(front,"bbsname") == 0) { - printf("bbsname %s\n", value); - } */ - } - fclose(conf); - } - } - + if (strcasecmp(front, "expiredays") == 0) { + Expiredays = atoi(value); + if (Expiredays < 0) { + Expiredays = EXPIREDAYS; + } + } else if (strcasecmp(front, "expiretime") == 0) { + ptr = strchr(value, ':'); + if (ptr == NULL) { + fprintf(stderr, "Syntax error in innbbs.conf\n"); + } else { + *ptr++ = '\0'; + His_Maint_Hour = atoi(value); + His_Maint_Min = atoi(ptr); + if (His_Maint_Hour < 0) + His_Maint_Hour = HIS_MAINT_HOUR; + if (His_Maint_Min < 0) + His_Maint_Min = HIS_MAINT_MIN; + } + } else if (strcasecmp(front, "newsfeeds") == 0) { + if (strcmp(value, "none") == 0) + NONENEWSFEEDS = 1; + } else if (strcasecmp(front, "nodelist") == 0) { + if (strcmp(value, "local") == 0) + LOCALNODELIST = 1; + } /* else if ( strcasecmp(front,"newsfeeds") == + * 0) { printf("newsfeeds %s\n", value); } + * else if ( strcasecmp(front,"nodelist") == + * 0) { printf("nodelist %s\n", value); } + * else if ( strcasecmp(front,"bbsname") == + * 0) { printf("bbsname %s\n", value); } */ + } + fclose(conf); + } + } #ifdef WITH_ECHOMAIL - bbsnameptr = (char*) fileglue("%s/bbsname.bbs",INNDHOME); - if ((FN = fopen( bbsnameptr ,"r" ))==NULL) { - fprintf(stderr,"can't open file %s\n", bbsnameptr); - return 0; - } - while ( fscanf(FN,"%s", MYBBSID) != EOF); - fclose(FN); - if( ! isdir(fileglue("%s/out.going",BBSHOME)) ) { - mkdir( (char*)fileglue("%s/out.going",BBSHOME), 0750 ); - } - if (NONENEWSFEEDS == 0) - readnffile(INNDHOME); - if (LOCALNODELIST == 0) { - if (readnlfile(INNDHOME, outgoing) != 0) return 0; - } - + bbsnameptr = (char *)fileglue("%s/bbsname.bbs", INNDHOME); + if ((FN = fopen(bbsnameptr, "r")) == NULL) { + fprintf(stderr, "can't open file %s\n", bbsnameptr); + return 0; + } + while (fscanf(FN, "%s", MYBBSID) != EOF); + fclose(FN); + if (!isdir(fileglue("%s/out.going", BBSHOME))) { + mkdir((char *)fileglue("%s/out.going", BBSHOME), 0750); + } + if (NONENEWSFEEDS == 0) + readnffile(INNDHOME); + if (LOCALNODELIST == 0) { + if (readnlfile(INNDHOME, outgoing) != 0) + return 0; + } #endif - return 1; + return 1; } -static int -nf_byboardcmp(a,b) -newsfeeds_t **a, **b; +static int +nf_byboardcmp(a, b) + newsfeeds_t **a, **b; { -/* - if (!a || !*a || !(*a)->board) return -1; - if (!b || !*b || !(*b)->board) return 1; -*/ - return strcasecmp((*a)->board, (*b)->board); + /* + * if (!a || !*a || !(*a)->board) return -1; if (!b || !*b || + * !(*b)->board) return 1; + */ + return strcasecmp((*a)->board, (*b)->board); } -static int -nfcmp(a,b) -newsfeeds_t *a, *b; +static int +nfcmp(a, b) + newsfeeds_t *a, *b; { -/* - if (!a || !a->newsgroups) return -1; - if (!b || !b->newsgroups) return 1; -*/ - return strcasecmp(a->newsgroups, b->newsgroups); + /* + * if (!a || !a->newsgroups) return -1; if (!b || !b->newsgroups) return + * 1; + */ + return strcasecmp(a->newsgroups, b->newsgroups); } -static int -nlcmp(a,b) -nodelist_t *a, *b; +static int +nlcmp(a, b) + nodelist_t *a, *b; { -/* - if (!a || !a->host) return -1; - if (!b || !b->host) return 1; -*/ - return strcasecmp(a->host, b->host); + /* + * if (!a || !a->host) return -1; if (!b || !b->host) return 1; + */ + return strcasecmp(a->host, b->host); } -static int -nl_bynodecmp(a,b) -nodelist_t **a, **b; +static int +nl_bynodecmp(a, b) + nodelist_t **a, **b; { -/* - if (!a || !*a || !(*a)->node) return -1; - if (!b || !*b || !(*b)->node) return 1; -*/ - return strcasecmp((*a)->node, (*b)->node); + /* + * if (!a || !*a || !(*a)->node) return -1; if (!b || !*b || !(*b)->node) + * return 1; + */ + return strcasecmp((*a)->node, (*b)->node); } /* read in newsfeeds.bbs and nodelist.bbs */ readnlfile(inndhome, outgoing) -char *inndhome; -char *outgoing; + char *inndhome; + char *outgoing; { - FILE *fp; - char buff[1024]; - struct stat st; - int i, count, j; - char *ptr, *nodelistptr; - static lastcount=0; - - sprintf(buff,"%s/nodelist.bbs", inndhome); - fp = fopen(buff,"r"); + FILE *fp; + char buff[1024]; + struct stat st; + int i, count, j; + char *ptr, *nodelistptr; + static lastcount = 0; + + sprintf(buff, "%s/nodelist.bbs", inndhome); + fp = fopen(buff, "r"); if (fp == NULL) { - fprintf(stderr,"open fail %s",buff); - return -1; + fprintf(stderr, "open fail %s", buff); + return -1; } - if (fstat(fileno(fp),&st) != 0) { - fprintf(stderr,"stat fail %s", buff); - return -1; + if (fstat(fileno(fp), &st) != 0) { + fprintf(stderr, "stat fail %s", buff); + return -1; } if (NODELIST_BUF == NULL) { - NODELIST_BUF = (char*) mymalloc( st.st_size +1); + NODELIST_BUF = (char *)mymalloc(st.st_size + 1); } else { - NODELIST_BUF = (char*) myrealloc( NODELIST_BUF, st.st_size +1); + NODELIST_BUF = (char *)myrealloc(NODELIST_BUF, st.st_size + 1); } - i = 0, count =0; + i = 0, count = 0; while (fgets(buff, sizeof buff, fp) != NULL) { - if (buff[0] == '#') continue; - if (buff[0] == '\n') continue; - strcpy(NODELIST_BUF+i, buff); - i += strlen(buff); - count ++; + if (buff[0] == '#') + continue; + if (buff[0] == '\n') + continue; + strcpy(NODELIST_BUF + i, buff); + i += strlen(buff); + count++; } fclose(fp); if (NODELIST == NULL) { - NODELIST = (nodelist_t*) mymalloc(sizeof(nodelist_t) * (count+1)); - NODELIST_BYNODE = (nodelist_t**) mymalloc(sizeof(nodelist_t*) * (count+1)); + NODELIST = (nodelist_t *) mymalloc(sizeof(nodelist_t) * (count + 1)); + NODELIST_BYNODE = (nodelist_t **) mymalloc(sizeof(nodelist_t *) * (count + 1)); } else { - NODELIST = (nodelist_t*) myrealloc(NODELIST, sizeof(nodelist_t) * (count+1)); - NODELIST_BYNODE = (nodelist_t**) myrealloc(NODELIST_BYNODE, sizeof(nodelist_t*) * (count+1)); + NODELIST = (nodelist_t *) myrealloc(NODELIST, sizeof(nodelist_t) * (count + 1)); + NODELIST_BYNODE = (nodelist_t **) myrealloc(NODELIST_BYNODE, sizeof(nodelist_t *) * (count + 1)); } - for (i=lastcount; i< count; i++) { - NODELIST[i].feedfp = NULL; + for (i = lastcount; i < count; i++) { + NODELIST[i].feedfp = NULL; } lastcount = count; NLCOUNT = 0; - for (ptr = NODELIST_BUF; (nodelistptr = (char*)strchr(ptr,'\n')) != NULL; ptr = nodelistptr +1, NLCOUNT++) { - char *nptr , *bptr, *pptr, *tptr; + for (ptr = NODELIST_BUF; (nodelistptr = (char *)strchr(ptr, '\n')) != NULL; ptr = nodelistptr + 1, NLCOUNT++) { + char *nptr, *bptr, *pptr, *tptr; *nodelistptr = '\0'; NODELIST[NLCOUNT].host = ""; NODELIST[NLCOUNT].exclusion = ""; NODELIST[NLCOUNT].node = ""; NODELIST[NLCOUNT].protocol = "IHAVE(119)"; NODELIST[NLCOUNT].comments = ""; - NODELIST_BYNODE[NLCOUNT] = NODELIST+NLCOUNT; - for (nptr= ptr ;*nptr && isspace(*nptr); ) nptr++; + NODELIST_BYNODE[NLCOUNT] = NODELIST + NLCOUNT; + for (nptr = ptr; *nptr && isspace(*nptr);) + nptr++; if (*nptr == '\0') { - bbslog("nodelist.bbs %d entry read error\n", NLCOUNT); - return -1; - } - /*NODELIST[NLCOUNT].id = nptr;*/ - NODELIST[NLCOUNT].node = nptr; - for (nptr++; *nptr && !isspace(*nptr); ) nptr++; + bbslog("nodelist.bbs %d entry read error\n", NLCOUNT); + return -1; + } + /* NODELIST[NLCOUNT].id = nptr; */ + NODELIST[NLCOUNT].node = nptr; + for (nptr++; *nptr && !isspace(*nptr);) + nptr++; if (*nptr == '\0') { - bbslog("nodelist.bbs node %d entry read error\n", NLCOUNT); - return -1; - } - *nptr = '\0'; - if ((tptr = strchr(NODELIST[NLCOUNT].node,'/'))) { - *tptr = '\0'; - NODELIST[NLCOUNT].exclusion = tptr + 1; + bbslog("nodelist.bbs node %d entry read error\n", NLCOUNT); + return -1; + } + *nptr = '\0'; + if ((tptr = strchr(NODELIST[NLCOUNT].node, '/'))) { + *tptr = '\0'; + NODELIST[NLCOUNT].exclusion = tptr + 1; } else { - NODELIST[NLCOUNT].exclusion = ""; + NODELIST[NLCOUNT].exclusion = ""; } - for (nptr++ ;*nptr && isspace(*nptr); ) nptr++; - if (*nptr == '\0') continue; - if (*nptr=='+' || *nptr=='-') { - NODELIST[NLCOUNT].feedtype = *nptr; - if (NODELIST[NLCOUNT].feedfp != NULL) { - fclose(NODELIST[NLCOUNT].feedfp); - } - if ( NODELIST[NLCOUNT].feedtype == '+') - if (outgoing != NULL) { - NODELIST[NLCOUNT].feedfp = fopen((char*)fileglue("%s/out.going/%s.%s",BBSHOME, NODELIST[NLCOUNT].node, outgoing),"a"); - } - nptr++; + for (nptr++; *nptr && isspace(*nptr);) + nptr++; + if (*nptr == '\0') + continue; + if (*nptr == '+' || *nptr == '-') { + NODELIST[NLCOUNT].feedtype = *nptr; + if (NODELIST[NLCOUNT].feedfp != NULL) { + fclose(NODELIST[NLCOUNT].feedfp); + } + if (NODELIST[NLCOUNT].feedtype == '+') + if (outgoing != NULL) { + NODELIST[NLCOUNT].feedfp = fopen((char *)fileglue("%s/out.going/%s.%s", BBSHOME, NODELIST[NLCOUNT].node, outgoing), "a"); + } + nptr++; } else { - NODELIST[NLCOUNT].feedtype = ' '; + NODELIST[NLCOUNT].feedtype = ' '; } - NODELIST[NLCOUNT].host = nptr; - for (nptr++; *nptr && !isspace(*nptr); ) nptr++; + NODELIST[NLCOUNT].host = nptr; + for (nptr++; *nptr && !isspace(*nptr);) + nptr++; if (*nptr == '\0') { - continue; - } - *nptr = '\0'; - for (nptr++;*nptr && isspace(*nptr); ) nptr++; - if (*nptr == '\0') continue; - NODELIST[NLCOUNT].protocol = nptr; - for (nptr++; *nptr && !isspace(*nptr); ) nptr++; - if (*nptr == '\0') continue; - *nptr = '\0'; - for (nptr++;*nptr && strchr(" \t\r\n",*nptr); ) nptr++; - if (*nptr == '\0') continue; - NODELIST[NLCOUNT].comments = nptr; + continue; + } + *nptr = '\0'; + for (nptr++; *nptr && isspace(*nptr);) + nptr++; + if (*nptr == '\0') + continue; + NODELIST[NLCOUNT].protocol = nptr; + for (nptr++; *nptr && !isspace(*nptr);) + nptr++; + if (*nptr == '\0') + continue; + *nptr = '\0'; + for (nptr++; *nptr && strchr(" \t\r\n", *nptr);) + nptr++; + if (*nptr == '\0') + continue; + NODELIST[NLCOUNT].comments = nptr; } qsort(NODELIST, NLCOUNT, sizeof(nodelist_t), nlcmp); - qsort(NODELIST_BYNODE, NLCOUNT, sizeof(nodelist_t*), nl_bynodecmp); + qsort(NODELIST_BYNODE, NLCOUNT, sizeof(nodelist_t *), nl_bynodecmp); return 0; } readnffile(inndhome) -char *inndhome; + char *inndhome; { - FILE *fp; - char buff[1024]; - struct stat st; - int i, count; - char *ptr, *newsfeedsptr; - - sprintf(buff,"%s/newsfeeds.bbs", inndhome); - fp = fopen(buff,"r"); + FILE *fp; + char buff[1024]; + struct stat st; + int i, count; + char *ptr, *newsfeedsptr; + + sprintf(buff, "%s/newsfeeds.bbs", inndhome); + fp = fopen(buff, "r"); if (fp == NULL) { - fprintf(stderr,"open fail %s",buff); - return -1; + fprintf(stderr, "open fail %s", buff); + return -1; } - if (fstat(fileno(fp),&st) != 0) { - fprintf(stderr,"stat fail %s", buff); - return -1; + if (fstat(fileno(fp), &st) != 0) { + fprintf(stderr, "stat fail %s", buff); + return -1; } if (NEWSFEEDS_BUF == NULL) { - NEWSFEEDS_BUF = (char*) mymalloc( st.st_size +1); + NEWSFEEDS_BUF = (char *)mymalloc(st.st_size + 1); } else { - NEWSFEEDS_BUF = (char*) myrealloc( NEWSFEEDS_BUF, st.st_size +1); + NEWSFEEDS_BUF = (char *)myrealloc(NEWSFEEDS_BUF, st.st_size + 1); } - i = 0, count =0; + i = 0, count = 0; while (fgets(buff, sizeof buff, fp) != NULL) { - if (buff[0] == '#') continue; - if (buff[0] == '\n') continue; - strcpy(NEWSFEEDS_BUF+i, buff); - i += strlen(buff); - count ++; + if (buff[0] == '#') + continue; + if (buff[0] == '\n') + continue; + strcpy(NEWSFEEDS_BUF + i, buff); + i += strlen(buff); + count++; } fclose(fp); if (NEWSFEEDS == NULL) { - NEWSFEEDS = (newsfeeds_t*) mymalloc(sizeof(newsfeeds_t) * (count+1)); - NEWSFEEDS_BYBOARD = (newsfeeds_t**) mymalloc(sizeof(newsfeeds_t*) * (count+1)); + NEWSFEEDS = (newsfeeds_t *) mymalloc(sizeof(newsfeeds_t) * (count + 1)); + NEWSFEEDS_BYBOARD = (newsfeeds_t **) mymalloc(sizeof(newsfeeds_t *) * (count + 1)); } else { - NEWSFEEDS = (newsfeeds_t*) myrealloc(NEWSFEEDS, sizeof(newsfeeds_t) * (count+1)); - NEWSFEEDS_BYBOARD = (newsfeeds_t**) myrealloc(NEWSFEEDS_BYBOARD, sizeof(newsfeeds_t*) * (count+1)); + NEWSFEEDS = (newsfeeds_t *) myrealloc(NEWSFEEDS, sizeof(newsfeeds_t) * (count + 1)); + NEWSFEEDS_BYBOARD = (newsfeeds_t **) myrealloc(NEWSFEEDS_BYBOARD, sizeof(newsfeeds_t *) * (count + 1)); } - NFCOUNT = 0; - for (ptr = NEWSFEEDS_BUF; (newsfeedsptr = (char*)strchr(ptr,'\n')) != NULL; ptr = newsfeedsptr +1, NFCOUNT++) { - char *nptr , *bptr, *pptr; + NFCOUNT = 0; + for (ptr = NEWSFEEDS_BUF; (newsfeedsptr = (char *)strchr(ptr, '\n')) != NULL; ptr = newsfeedsptr + 1, NFCOUNT++) { + char *nptr, *bptr, *pptr; *newsfeedsptr = '\0'; NEWSFEEDS[NFCOUNT].newsgroups = ""; NEWSFEEDS[NFCOUNT].board = ""; NEWSFEEDS[NFCOUNT].path = NULL; - NEWSFEEDS_BYBOARD[NFCOUNT] = NEWSFEEDS+NFCOUNT; - for (nptr= ptr ;*nptr && isspace(*nptr); ) nptr++; - if (*nptr == '\0') continue; - NEWSFEEDS[NFCOUNT].newsgroups = nptr; - for (nptr++; *nptr && !isspace(*nptr); ) nptr++; - if (*nptr == '\0') continue; - *nptr = '\0'; - for (nptr++ ;*nptr && isspace(*nptr); ) nptr++; - if (*nptr == '\0') continue; - NEWSFEEDS[NFCOUNT].board = nptr; - for (nptr++; *nptr && !isspace(*nptr); ) nptr++; - if (*nptr == '\0') continue; - *nptr = '\0'; - for (nptr++;*nptr && isspace(*nptr); ) nptr++; - if (*nptr == '\0') continue; - NEWSFEEDS[NFCOUNT].path = nptr; - for (nptr++; *nptr && !strchr("\r\n",*nptr); ) nptr++; - /*if (*nptr == '\0') continue;*/ - *nptr = '\0'; + NEWSFEEDS_BYBOARD[NFCOUNT] = NEWSFEEDS + NFCOUNT; + for (nptr = ptr; *nptr && isspace(*nptr);) + nptr++; + if (*nptr == '\0') + continue; + NEWSFEEDS[NFCOUNT].newsgroups = nptr; + for (nptr++; *nptr && !isspace(*nptr);) + nptr++; + if (*nptr == '\0') + continue; + *nptr = '\0'; + for (nptr++; *nptr && isspace(*nptr);) + nptr++; + if (*nptr == '\0') + continue; + NEWSFEEDS[NFCOUNT].board = nptr; + for (nptr++; *nptr && !isspace(*nptr);) + nptr++; + if (*nptr == '\0') + continue; + *nptr = '\0'; + for (nptr++; *nptr && isspace(*nptr);) + nptr++; + if (*nptr == '\0') + continue; + NEWSFEEDS[NFCOUNT].path = nptr; + for (nptr++; *nptr && !strchr("\r\n", *nptr);) + nptr++; + /* if (*nptr == '\0') continue; */ + *nptr = '\0'; } qsort(NEWSFEEDS, NFCOUNT, sizeof(newsfeeds_t), nfcmp); - qsort(NEWSFEEDS_BYBOARD, NFCOUNT, sizeof(newsfeeds_t*), nf_byboardcmp); + qsort(NEWSFEEDS_BYBOARD, NFCOUNT, sizeof(newsfeeds_t *), nf_byboardcmp); } -newsfeeds_t *search_board(board) -char *board; +newsfeeds_t * +search_board(board) + char *board; { - newsfeeds_t nft, *nftptr, **find; - if (NONENEWSFEEDS) return NULL; - nft.board = board; - nftptr = &nft; - find = (newsfeeds_t**)bsearch((char*)&nftptr, NEWSFEEDS_BYBOARD, NFCOUNT, sizeof(newsfeeds_t*), nf_byboardcmp); - if (find != NULL) return *find; - return NULL; + newsfeeds_t nft, *nftptr, **find; + if (NONENEWSFEEDS) + return NULL; + nft.board = board; + nftptr = &nft; + find = (newsfeeds_t **) bsearch((char *)&nftptr, NEWSFEEDS_BYBOARD, NFCOUNT, sizeof(newsfeeds_t *), nf_byboardcmp); + if (find != NULL) + return *find; + return NULL; } -nodelist_t *search_nodelist_bynode(node) -char *node; +nodelist_t * +search_nodelist_bynode(node) + char *node; { - nodelist_t nlt, *nltptr, **find; - if (LOCALNODELIST) return NULL; - nlt.node = node; - nltptr = ≮ - find = (nodelist_t**)bsearch((char*)&nltptr, NODELIST_BYNODE, NLCOUNT, sizeof(nodelist_t*), nl_bynodecmp); - if (find != NULL) return *find; - return NULL; + nodelist_t nlt, *nltptr, **find; + if (LOCALNODELIST) + return NULL; + nlt.node = node; + nltptr = ≮ + find = (nodelist_t **) bsearch((char *)&nltptr, NODELIST_BYNODE, NLCOUNT, sizeof(nodelist_t *), nl_bynodecmp); + if (find != NULL) + return *find; + return NULL; } -nodelist_t *search_nodelist(site, identuser) -char *site; -char *identuser; +nodelist_t * +search_nodelist(site, identuser) + char *site; + char *identuser; { - nodelist_t nlt, *find; - char buffer[1024]; - if (LOCALNODELIST) return NULL; - nlt.host = site; - find = (nodelist_t*)bsearch((char*)&nlt, NODELIST, NLCOUNT, sizeof(nodelist_t), nlcmp); - if (find == NULL && identuser != NULL) { - sprintf(buffer,"%s@%s", identuser, site); - nlt.host = buffer; - find = (nodelist_t*)bsearch((char*)&nlt, NODELIST, NLCOUNT, sizeof(nodelist_t), nlcmp); - } - return find; + nodelist_t nlt, *find; + char buffer[1024]; + if (LOCALNODELIST) + return NULL; + nlt.host = site; + find = (nodelist_t *) bsearch((char *)&nlt, NODELIST, NLCOUNT, sizeof(nodelist_t), nlcmp); + if (find == NULL && identuser != NULL) { + sprintf(buffer, "%s@%s", identuser, site); + nlt.host = buffer; + find = (nodelist_t *) bsearch((char *)&nlt, NODELIST, NLCOUNT, sizeof(nodelist_t), nlcmp); + } + return find; } -newsfeeds_t *search_group(newsgroup) -char *newsgroup; +newsfeeds_t * +search_group(newsgroup) + char *newsgroup; { - newsfeeds_t nft, *find; - if (NONENEWSFEEDS) return NULL; - nft.newsgroups = newsgroup; - find = (newsfeeds_t*)bsearch((char*)&nft, NEWSFEEDS, NFCOUNT, sizeof(newsfeeds_t), nfcmp); - return find; + newsfeeds_t nft, *find; + if (NONENEWSFEEDS) + return NULL; + nft.newsgroups = newsgroup; + find = (newsfeeds_t *) bsearch((char *)&nft, NEWSFEEDS, NFCOUNT, sizeof(newsfeeds_t), nfcmp); + return find; } -char *ascii_date(now) -time_t now; +char * +ascii_date(now) + time_t now; { - static char datebuf[40]; - /*time_t now; - time(&now);*/ - strftime(datebuf, sizeof(datebuf), "%d %b %Y %X GMT", gmtime(&now)); - return datebuf; + static char datebuf[40]; + /* + * time_t now; time(&now); + */ + strftime(datebuf, sizeof(datebuf), "%d %b %Y %X GMT", gmtime(&now)); + return datebuf; } -char * +char * restrdup(ptr, string) -char *ptr; -char *string; + char *ptr; + char *string; { - int len ; - if (string == NULL) { - if (ptr != NULL) *ptr = '\0'; - return ptr; - } - len = strlen(string) + 1; - if (ptr != NULL) { - ptr = (char*)myrealloc(ptr, len); - } else - ptr = (char*)mymalloc(len); - strcpy(ptr, string); - return ptr; + int len; + if (string == NULL) { + if (ptr != NULL) + *ptr = '\0'; + return ptr; + } + len = strlen(string) + 1; + if (ptr != NULL) { + ptr = (char *)myrealloc(ptr, len); + } else + ptr = (char *)mymalloc(len); + strcpy(ptr, string); + return ptr; } -void * +void * mymalloc(size) -int size; + int size; { - char *ptr = (char*)malloc(size); + char *ptr = (char *)malloc(size); if (ptr == NULL) { - fprintf(stderr, "cant allocate memory\n"); - syslog(LOG_ERR, "cant allocate memory %m"); - exit(1); + fprintf(stderr, "cant allocate memory\n"); + syslog(LOG_ERR, "cant allocate memory %m"); + exit(1); } return ptr; } -void * +void * myrealloc(optr, size) -void *optr; -int size; + void *optr; + int size; { - char *ptr = (char*)realloc(optr, size); + char *ptr = (char *)realloc(optr, size); if (ptr == NULL) { - fprintf(stderr, "cant allocate memory\n"); - syslog(LOG_ERR, "cant allocate memory %m"); - exit(1); + fprintf(stderr, "cant allocate memory\n"); + syslog(LOG_ERR, "cant allocate memory %m"); + exit(1); } return ptr; } 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; } #ifdef BBSLIB main() { - initial_bbs("feed"); - printf("%s\n",ascii_date()); + initial_bbs("feed"); + printf("%s\n", ascii_date()); } #endif - diff --git a/innbbsd/externs.h b/innbbsd/externs.h index 2cde1141..84a59e8c 100644 --- a/innbbsd/externs.h +++ b/innbbsd/externs.h @@ -1,16 +1,16 @@ #ifndef EXTERNS_H #define EXTERNS_H -# ifndef ARG -# ifdef __STDC__ -# define ARG(x) x -# else -# define ARG(x) () -# endif -# endif +#ifndef ARG +#ifdef __STDC__ +#define ARG(x) x +#else +#define ARG(x) () +#endif +#endif -char *fileglue ARG((char *, ...)); -char *ascii_date ARG(()); -char **split ARG((char *, char *)); +char *fileglue ARG((char *,...)); +char *ascii_date ARG(()); +char **split ARG((char *, char *)); #endif diff --git a/innbbsd/file.c b/innbbsd/file.c index 7016f940..29b6384a 100644 --- a/innbbsd/file.c +++ b/innbbsd/file.c @@ -4,180 +4,202 @@ #include <stdarg.h> #define MAXARGS 100 -/* isfile is called by - * isfile(filenamecomp1, filecomp2, filecomp3, ..., (char *)0); - * extern "C" int isfile(const char *, const char *[]) ; -*/ +/* + * isfile is called by isfile(filenamecomp1, filecomp2, filecomp3, ..., + * (char *)0); extern "C" int isfile(const char *, const char *[]) ; + */ -char FILEBUF[4096]; +char FILEBUF[4096]; -static char DOLLAR_[8192]; -char *getstream(fp) -FILE *fp; +static char DOLLAR_[8192]; +char * +getstream(fp) + FILE *fp; { - return fgets(DOLLAR_, sizeof(DOLLAR_) -1 , fp); + return fgets(DOLLAR_, sizeof(DOLLAR_) - 1, fp); } /* - The same as sprintf, but return the new string - fileglue("%s/%s",home,".newsrc"); -*/ + * The same as sprintf, but return the new string + * fileglue("%s/%s",home,".newsrc"); + */ -char *fileglue(char *fmt, ...) +char * +fileglue(char *fmt,...) { - va_list ap; - static char gluebuffer[8192]; + va_list ap; + static char gluebuffer[8192]; va_start(ap, fmt); vsprintf(gluebuffer, fmt, ap); va_end(ap); return gluebuffer; } -long +long filesize(filename) -char* filename; + char *filename; { - struct stat st; + struct stat st; - if (stat(filename,&st)) return 0; - return st.st_size; + if (stat(filename, &st)) + return 0; + return st.st_size; } -int iszerofile(filename) -char* filename; +int +iszerofile(filename) + char *filename; { - struct stat st; + struct stat st; - if (stat(filename,&st)) return 0; - if (st.st_size == 0) return 1; + if (stat(filename, &st)) return 0; + if (st.st_size == 0) + return 1; + return 0; } -int isfile(filename) -char* filename; +int +isfile(filename) + char *filename; { - struct stat st; + struct stat st; - if (stat(filename,&st)) return 0; - if (!S_ISREG(st.st_mode)) return 0; - return 1; + if (stat(filename, &st)) + return 0; + if (!S_ISREG(st.st_mode)) + return 0; + return 1; } #ifdef TEST -int isfilev(va_alist) +int +isfilev(va_alist) { - va_list ap; - struct stat st; - char *p; - va_start(ap); - - FILEBUF[0]='\0'; - while ((p = va_arg(ap, char *)) != (char *)0) { - strcat(FILEBUF,p); - } - printf("file %s\n",FILEBUF); - - va_end(ap); - return isfile(FILEBUF); + va_list ap; + struct stat st; + char *p; + va_start(ap); + + FILEBUF[0] = '\0'; + while ((p = va_arg(ap, char *)) != (char *)0) { + strcat(FILEBUF, p); + } + printf("file %s\n", FILEBUF); + + va_end(ap); + return isfile(FILEBUF); } #endif -int isdir(filename) -char* filename; +int +isdir(filename) + char *filename; { - struct stat st; + struct stat st; - if (stat(filename,&st)) return 0; - if (!S_ISDIR(st.st_mode)) return 0; - return 1; + if (stat(filename, &st)) + return 0; + if (!S_ISDIR(st.st_mode)) + return 0; + return 1; } #ifdef TEST -int isdirv(va_alist) +int +isdirv(va_alist) { - va_list ap; - struct stat st; - char *p; - va_start(ap); - - FILEBUF[0]='\0'; - while ((p = va_arg(ap, char *)) != (char *)0) { - strcat(FILEBUF,p); - } - - va_end(ap); - return isdir(FILEBUF); + va_list ap; + struct stat st; + char *p; + va_start(ap); + + FILEBUF[0] = '\0'; + while ((p = va_arg(ap, char *)) != (char *)0) { + strcat(FILEBUF, p); + } + + va_end(ap); + return isdir(FILEBUF); } #endif -unsigned long mtime(filename) -char* filename; +unsigned long +mtime(filename) + char *filename; { - struct stat st; - if (stat(filename,&st)) return 0; - return st.st_mtime; + struct stat st; + if (stat(filename, &st)) + return 0; + return st.st_mtime; } #ifdef TEST -unsigned long mtimev(va_alist) +unsigned long +mtimev(va_alist) { - va_list ap; - struct stat st; - char *p; - va_start(ap); - - FILEBUF[0]='\0'; - while ((p = va_arg(ap, char *)) != (char *)0) { - strcat(FILEBUF,p); - } - - va_end(ap); - return mtime(FILEBUF); + va_list ap; + struct stat st; + char *p; + va_start(ap); + + FILEBUF[0] = '\0'; + while ((p = va_arg(ap, char *)) != (char *)0) { + strcat(FILEBUF, p); + } + + va_end(ap); + return mtime(FILEBUF); } #endif -unsigned long atime(filename) -char *filename; +unsigned long +atime(filename) + char *filename; { - struct stat st; - if (stat(filename,&st)) return 0; - return st.st_atime; + struct stat st; + if (stat(filename, &st)) + return 0; + return st.st_atime; } #ifdef TEST -unsigned long atimev(va_alist) +unsigned long +atimev(va_alist) { - va_list ap; - struct stat st; - char *p; - va_start(ap); - - FILEBUF[0]='\0'; - while ((p = va_arg(ap, char *)) != (char *)0) { - strcat(FILEBUF,p); - } - - va_end(ap); - return atime(FILEBUF); + va_list ap; + struct stat st; + char *p; + va_start(ap); + + FILEBUF[0] = '\0'; + while ((p = va_arg(ap, char *)) != (char *)0) { + strcat(FILEBUF, p); + } + + va_end(ap); + return atime(FILEBUF); } #endif -/*#undef TEST*/ +/* #undef TEST */ #ifdef TEST -main(argc,argv) -int argc; -char **argv; +main(argc, argv) + int argc; + char **argv; { - int i; - if (argc > 3) { - if (isfilev(argv[1],argv[2],(char*)0)) printf("%s %s %s is file\n",argv[1],argv[2],argv[3]); - if (isdirv(argv[1],argv[2],(char*)0)) printf("%s %s %s is dir\n",argv[1],argv[2],argv[3]); - printf("mtime %d\n",mtimev(argv[1],argv[2],(char*)0)); - printf("atime %d\n",atimev(argv[1],argv[2],(char*)0)); - } - printf("fileglue %s\n", fileglue("%s/%s","home",".test")); + int i; + if (argc > 3) { + if (isfilev(argv[1], argv[2], (char *)0)) + printf("%s %s %s is file\n", argv[1], argv[2], argv[3]); + if (isdirv(argv[1], argv[2], (char *)0)) + printf("%s %s %s is dir\n", argv[1], argv[2], argv[3]); + printf("mtime %d\n", mtimev(argv[1], argv[2], (char *)0)); + printf("atime %d\n", atimev(argv[1], argv[2], (char *)0)); + } + printf("fileglue %s\n", fileglue("%s/%s", "home", ".test")); } #endif diff --git a/innbbsd/his.c b/innbbsd/his.c index 7fe48dc3..ac9a3285 100644 --- a/innbbsd/his.c +++ b/innbbsd/his.c @@ -1,81 +1,86 @@ -/* $Revision: 1.1 $ -** -** History file routines. -*/ +/* + * $Revision: 1.1 $ * + * + * History file routines. + */ #include "innbbsconf.h" #include "bbslib.h" #include "his.h" #define STATIC static -/*STATIC char HIShistpath[] = _PATH_HISTORY;*/ -STATIC FILE *HISwritefp; -STATIC int HISreadfd; -STATIC int HISdirty; -STATIC int HISincore = XINDEX_DBZINCORE; -STATIC char *LogName = "xindexchan"; +/* STATIC char HIShistpath[] = _PATH_HISTORY; */ +STATIC FILE *HISwritefp; +STATIC int HISreadfd; +STATIC int HISdirty; +STATIC int HISincore = XINDEX_DBZINCORE; +STATIC char *LogName = "xindexchan"; #ifndef EXPIREDAYS -# define EXPIREDAYS 4 +#define EXPIREDAYS 4 #endif #ifndef DEFAULT_HIST_SIZE -# define DEFAULT_HIST_SIZE 100000 +#define DEFAULT_HIST_SIZE 100000 #endif hisincore(flag) -int flag; + int flag; { - HISincore = flag; + HISincore = flag; } makedbz(histpath, entry) -char *histpath; -long entry; + char *histpath; + long entry; { - long size; + long size; size = dbzsize(entry); - dbzfresh(histpath,size,'\t',0, 1); + dbzfresh(histpath, size, '\t', 0, 1); dbmclose(); } -void HISsetup(); -void HISclose(); +void HISsetup(); +void HISclose(); void mkhistory(srchist) -char *srchist; + char *srchist; { - FILE *hismaint ; - time_t lasthist, now; - char maintbuff[256]; - char *ptr; - hismaint= fopen(srchist, "r"); + FILE *hismaint; + time_t lasthist, now; + char maintbuff[256]; + char *ptr; + hismaint = fopen(srchist, "r"); if (hismaint == NULL) { - return; - } - { - char newhistpath[1024]; - char newhistdirpath[1024]; - char newhistpagpath[1024]; - sprintf(newhistpath,"%s.n",srchist); - sprintf(newhistdirpath,"%s.n.dir",srchist); - sprintf(newhistpagpath,"%s.n.pag",srchist); - if (!isfile(newhistdirpath) || !isfile(newhistpagpath)) { - makedbz(newhistpath, DEFAULT_HIST_SIZE); - } - myHISsetup(newhistpath); - while ( fgets(maintbuff, sizeof(maintbuff), hismaint) != NULL) { - datum key; - ptr = (char*) strchr(maintbuff,'\t'); - if (ptr != NULL) { *ptr = '\0'; ptr++;} + return; + } { + char newhistpath[1024]; + char newhistdirpath[1024]; + char newhistpagpath[1024]; + sprintf(newhistpath, "%s.n", srchist); + sprintf(newhistdirpath, "%s.n.dir", srchist); + sprintf(newhistpagpath, "%s.n.pag", srchist); + if (!isfile(newhistdirpath) || !isfile(newhistpagpath)) { + makedbz(newhistpath, DEFAULT_HIST_SIZE); + } + myHISsetup(newhistpath); + while (fgets(maintbuff, sizeof(maintbuff), hismaint) != NULL) { + datum key; + ptr = (char *)strchr(maintbuff, '\t'); + if (ptr != NULL) { + *ptr = '\0'; + ptr++; + } key.dptr = maintbuff; key.dsize = strlen(maintbuff); - myHISwrite(&key, ptr); - } - (void) HISclose(); - /*rename(newhistpath, srchist); - rename(newhistdirpath, fileglue("%s.dir", srchist)); - rename(newhistpagpath, fileglue("%s.pag", srchist));*/ + myHISwrite(&key, ptr); + } + (void)HISclose(); + /* + * rename(newhistpath, srchist); rename(newhistdirpath, + * fileglue("%s.dir", srchist)); rename(newhistpagpath, + * fileglue("%s.pag", srchist)); + */ } fclose(hismaint); } @@ -83,21 +88,21 @@ char *srchist; time_t gethisinfo() { - FILE *hismaint ; - time_t lasthist, now; - char maintbuff[4096]; - char *ptr; - hismaint= fopen(HISTORY, "r"); + FILE *hismaint; + time_t lasthist, now; + char maintbuff[4096]; + char *ptr; + hismaint = fopen(HISTORY, "r"); if (hismaint == NULL) { - return 0; + return 0; } - fgets(maintbuff,sizeof(maintbuff), hismaint); + fgets(maintbuff, sizeof(maintbuff), hismaint); fclose(hismaint); - ptr = (char*)strchr(maintbuff,'\t'); - if (ptr != NULL) { - ptr++; - lasthist = atol(ptr); - return lasthist; + ptr = (char *)strchr(maintbuff, '\t'); + if (ptr != NULL) { + ptr++; + lasthist = atol(ptr); + return lasthist; } return 0; } @@ -105,74 +110,76 @@ gethisinfo() void HISmaint() { - FILE *hismaint ; - time_t lasthist, now; - char maintbuff[4096]; - char *ptr; + FILE *hismaint; + time_t lasthist, now; + char maintbuff[4096]; + char *ptr; if (!isfile(HISTORY)) { - makedbz(HISTORY, DEFAULT_HIST_SIZE); + makedbz(HISTORY, DEFAULT_HIST_SIZE); } - hismaint= fopen(HISTORY, "r"); + hismaint = fopen(HISTORY, "r"); if (hismaint == NULL) { - return; + return; } - fgets(maintbuff,sizeof(maintbuff), hismaint); - ptr = (char*)strchr(maintbuff,'\t'); - if (ptr != NULL) { - ptr++; - lasthist = atol(ptr); - time(&now); - if ( lasthist + 86400 * Expiredays * 2 < now ) { - char newhistpath[1024]; - char newhistdirpath[1024]; - char newhistpagpath[1024]; - (void) HISclose(); - sprintf(newhistpath,"%s.n",HISTORY); - sprintf(newhistdirpath,"%s.n.dir",HISTORY); - sprintf(newhistpagpath,"%s.n.pag",HISTORY); - if (!isfile(newhistdirpath)) { - makedbz(newhistpath, DEFAULT_HIST_SIZE); - } - myHISsetup(newhistpath); - while ( fgets(maintbuff, sizeof(maintbuff), hismaint) != NULL) { - datum key; - ptr = (char*) strchr(maintbuff,'\t'); - if (ptr != NULL) { - *ptr = '\0'; ptr++; - lasthist = atol(ptr); - } else { - continue ; + fgets(maintbuff, sizeof(maintbuff), hismaint); + ptr = (char *)strchr(maintbuff, '\t'); + if (ptr != NULL) { + ptr++; + lasthist = atol(ptr); + time(&now); + if (lasthist + 86400 * Expiredays * 2 < now) { + char newhistpath[1024]; + char newhistdirpath[1024]; + char newhistpagpath[1024]; + (void)HISclose(); + sprintf(newhistpath, "%s.n", HISTORY); + sprintf(newhistdirpath, "%s.n.dir", HISTORY); + sprintf(newhistpagpath, "%s.n.pag", HISTORY); + if (!isfile(newhistdirpath)) { + makedbz(newhistpath, DEFAULT_HIST_SIZE); } - if ( lasthist + 99600 * Expiredays < now ) continue; - key.dptr = maintbuff; - key.dsize = strlen(maintbuff); - myHISwrite(&key, ptr); - } - (void) HISclose(); - rename(HISTORY, (char*)fileglue("%s.o",HISTORY)); - rename(newhistpath, HISTORY); - rename(newhistdirpath, (char*)fileglue("%s.dir", HISTORY)); - rename(newhistpagpath, (char*)fileglue("%s.pag", HISTORY)); - (void) HISsetup(); - } + myHISsetup(newhistpath); + while (fgets(maintbuff, sizeof(maintbuff), hismaint) != NULL) { + datum key; + ptr = (char *)strchr(maintbuff, '\t'); + if (ptr != NULL) { + *ptr = '\0'; + ptr++; + lasthist = atol(ptr); + } else { + continue; + } + if (lasthist + 99600 * Expiredays < now) + continue; + key.dptr = maintbuff; + key.dsize = strlen(maintbuff); + myHISwrite(&key, ptr); + } + (void)HISclose(); + rename(HISTORY, (char *)fileglue("%s.o", HISTORY)); + rename(newhistpath, HISTORY); + rename(newhistdirpath, (char *)fileglue("%s.dir", HISTORY)); + rename(newhistpagpath, (char *)fileglue("%s.pag", HISTORY)); + (void)HISsetup(); + } } fclose(hismaint); } /* -** Set up the history files. -*/ -void + * * Set up the history files. + */ +void HISsetup() { - myHISsetup(HISTORY); + myHISsetup(HISTORY); } int myHISsetup(histpath) -char *histpath; + char *histpath; { if (HISwritefp == NULL) { /* Open the history file for appending formatted I/O. */ @@ -190,7 +197,7 @@ char *histpath; CloseOnExec(HISreadfd, TRUE); /* Open the DBZ file. */ - /*(void)dbzincore(HISincore);*/ + /* (void)dbzincore(HISincore); */ (void)dbzincore(HISincore); (void)dbzwritethrough(1); if (dbminit(histpath) < 0) { @@ -202,8 +209,8 @@ char *histpath; /* -** Synchronize the in-core history file (flush it). -*/ + * * Synchronize the in-core history file (flush it). + */ void HISsync() { @@ -218,14 +225,16 @@ HISsync() /* -** Close the history files. -*/ + * * Close the history files. + */ void HISclose() { if (HISwritefp != NULL) { - /* Since dbmclose calls dbzsync we could replace this line with - * "HISdirty = 0;". Oh well, it keeps the abstraction clean. */ + /* + * Since dbmclose calls dbzsync we could replace this line with + * "HISdirty = 0;". Oh well, it keeps the abstraction clean. + */ HISsync(); if (dbmclose() < 0) syslog(LOG_ERR, "%s cant dbmclose %m", LogName); @@ -241,29 +250,27 @@ HISclose() #ifdef HISset /* -** File in the DBZ datum for a Message-ID, making sure not to copy any -** illegal characters. -*/ + * * File in the DBZ datum for a Message-ID, making sure not to copy any * + * illegal characters. + */ STATIC void HISsetkey(p, keyp) - register char *p; - datum *keyp; + register char *p; + datum *keyp; { - static BUFFER MessageID; - register char *dest; - register int i; + static BUFFER MessageID; + register char *dest; + register int i; /* Get space to hold the ID. */ i = strlen(p); if (MessageID.Data == NULL) { MessageID.Data = NEW(char, i + 1); MessageID.Size = i; - } - else if (MessageID.Size < i) { + } else if (MessageID.Size < i) { RENEW(MessageID.Data, char, i + 1); MessageID.Size = i; } - for (keyp->dptr = dest = MessageID.Data; *p; p++) if (*p == HIS_FIELDSEP || *p == '\n') *dest++ = HIS_BADCHAR; @@ -276,79 +283,77 @@ HISsetkey(p, keyp) #endif /* -** Get the list of files under which a Message-ID is stored. -*/ -char * -HISfilesfor(key,output) - datum *key; - datum *output; + * * Get the list of files under which a Message-ID is stored. + */ +char * +HISfilesfor(key, output) + datum *key; + datum *output; { - char *dest; - datum val; - long offset; - register char *p; - register int i; - int Used; + char *dest; + datum val; + long offset; + register char *p; + register int i; + int Used; /* Get the seek value into the history file. */ val = dbzfetch(*key); - if (val.dptr == NULL || val.dsize != sizeof offset){ - /*printf("fail here val.dptr %d\n",val.dptr);*/ + if (val.dptr == NULL || val.dsize != sizeof offset) { + /* printf("fail here val.dptr %d\n",val.dptr); */ return NULL; } - /* Get space. */ if (output->dptr == NULL) { - printf("fail here output->dptr null\n"); - return NULL; + printf("fail here output->dptr null\n"); + return NULL; } - /* Copy the value to an aligned spot. */ - for (p = val.dptr, dest = (char *)&offset, i = sizeof offset; --i >= 0; ) + for (p = val.dptr, dest = (char *)&offset, i = sizeof offset; --i >= 0;) *dest++ = *p++; if (lseek(HISreadfd, offset, SEEK_SET) == -1) { - printf("fail here lseek %d\n",offset); + printf("fail here lseek %d\n", offset); return NULL; } - /* Read the text until \n or EOF. */ - for (output->dsize = 0,Used=0; ; ) { - i = read(HISreadfd, - &output->dptr[output->dsize], LEN - 1); + for (output->dsize = 0, Used = 0;;) { + i = read(HISreadfd, + &output->dptr[output->dsize], LEN - 1); if (i <= 0) { - printf("fail here i %d\n",i); + printf("fail here i %d\n", i); return NULL; - } + } Used += i; output->dptr[Used] = '\0'; - if ((p = (char*)strchr(output->dptr, '\n')) != NULL) { + if ((p = (char *)strchr(output->dptr, '\n')) != NULL) { *p = '\0'; break; } } /* Move past the first two fields -- Message-ID and date info. */ - if ((p = (char*)strchr(output->dptr, HIS_FIELDSEP)) == NULL) { + if ((p = (char *)strchr(output->dptr, HIS_FIELDSEP)) == NULL) { printf("fail here no HIS_FILE\n"); return NULL; } - return p+1; - /*if ((p = (char*)strchr(p + 1, HIS_FIELDSEP)) == NULL) - return NULL;*/ + return p + 1; + /* + * if ((p = (char*)strchr(p + 1, HIS_FIELDSEP)) == NULL) return NULL; + */ /* Translate newsgroup separators to slashes, return the fieldstart. */ } /* -** Have we already seen an article? -*/ + * * Have we already seen an article? + */ #ifdef HISh BOOL HIShavearticle(MessageID) - char *MessageID; + char *MessageID; { - datum key; - datum val; + datum key; + datum val; HISsetkey(MessageID, &key); val = dbzfetch(key); @@ -358,21 +363,20 @@ HIShavearticle(MessageID) /* -** Turn a history filename entry from slashes to dots. It's a pity -** we have to do this. -*/ + * * Turn a history filename entry from slashes to dots. It's a pity * we + * have to do this. + */ STATIC void HISslashify(p) - register char *p; + register char *p; { - register char *last; + register char *last; for (last = NULL; *p; p++) { if (*p == '/') { *p = '.'; last = p; - } - else if (*p == ' ' && last != NULL) + } else if (*p == ' ' && last != NULL) *last = '/'; } if (last) @@ -381,27 +385,26 @@ HISslashify(p) IOError(error) -char *error; + char *error; { - fprintf(stderr,"%s\n",error); + fprintf(stderr, "%s\n", error); } -/*BOOL*/ +/* BOOL */ myHISwrite(key, remain) - datum *key; - char *remain; + datum *key; + char *remain; { - static char NOPATHS[] = ""; - long offset; - datum val; - int i; + static char NOPATHS[] = ""; + long offset; + datum val; + int i; val = dbzfetch(*key); - if (val.dptr != NULL){ + if (val.dptr != NULL) { return FALSE; } - - flock(fileno(HISwritefp),LOCK_EX); + flock(fileno(HISwritefp), LOCK_EX); offset = ftell(HISwritefp); i = fprintf(HISwritefp, "%s%c%s", key->dptr, HIS_FIELDSEP, remain); @@ -409,42 +412,40 @@ myHISwrite(key, remain) /* The history line is now an orphan... */ IOError("history"); syslog(LOG_ERR, "%s cant write history %m", LogName); - flock(fileno(HISwritefp),LOCK_UN); + flock(fileno(HISwritefp), LOCK_UN); return FALSE; } - /* Set up the database values and write them. */ val.dptr = (char *)&offset; val.dsize = sizeof offset; if (dbzstore(*key, val) < 0) { IOError("my history database"); syslog(LOG_ERR, "%s cant dbzstore %m", LogName); - flock(fileno(HISwritefp),LOCK_UN); + flock(fileno(HISwritefp), LOCK_UN); return FALSE; } - if (++HISdirty >= ICD_SYNC_COUNT) HISsync(); - flock(fileno(HISwritefp),LOCK_UN); + flock(fileno(HISwritefp), LOCK_UN); return TRUE; } /* -** Write a history entry. -*/ + * * Write a history entry. + */ BOOL HISwrite(key, date, paths) - datum *key; - char *paths; - long date; + datum *key; + char *paths; + long date; { - static char NOPATHS[] = ""; - long offset; - datum val; - int i; + static char NOPATHS[] = ""; + long offset; + datum val; + int i; - flock(fileno(HISwritefp),LOCK_EX); + flock(fileno(HISwritefp), LOCK_EX); offset = ftell(HISwritefp); i = fprintf(HISwritefp, "%s%c%ld%c%s\n", key->dptr, HIS_FIELDSEP, (long)date, HIS_FIELDSEP, @@ -453,22 +454,20 @@ HISwrite(key, date, paths) /* The history line is now an orphan... */ IOError("history"); syslog(LOG_ERR, "%s cant write history %m", LogName); - flock(fileno(HISwritefp),LOCK_UN); + flock(fileno(HISwritefp), LOCK_UN); return FALSE; } - /* Set up the database values and write them. */ val.dptr = (char *)&offset; val.dsize = sizeof offset; if (dbzstore(*key, val) < 0) { IOError("history database"); syslog(LOG_ERR, "%s cant dbzstore %m", LogName); - flock(fileno(HISwritefp),LOCK_UN); + flock(fileno(HISwritefp), LOCK_UN); return FALSE; } - if (++HISdirty >= ICD_SYNC_COUNT) HISsync(); - flock(fileno(HISwritefp),LOCK_UN); + flock(fileno(HISwritefp), LOCK_UN); return TRUE; } diff --git a/innbbsd/his.h b/innbbsd/his.h index f54efc01..fab0f76e 100644 --- a/innbbsd/his.h +++ b/innbbsd/his.h @@ -11,48 +11,45 @@ #include "dbz.h" #ifndef XINDEXDIR -# define XINDEXDIR "/homec/xindex" +#define XINDEXDIR "/homec/xindex" #endif #ifndef _PATH_HISTORY -# define _PATH_HISTORY "/u/staff/bbsroot/csie_util/bntpd/history" +#define _PATH_HISTORY "/u/staff/bbsroot/csie_util/bntpd/history" #endif #ifndef _PATH_COVERVIEW -# define _PATH_COVERVIEW ".coverview" +#define _PATH_COVERVIEW ".coverview" #endif #ifndef _PATH_COVERVIEWDIR -# define _PATH_COVERVIEWDIR "/homec/xindex" +#define _PATH_COVERVIEWDIR "/homec/xindex" #endif #ifndef XINDEX_DBZINCORE -# define XINDEX_DBZINCORE 1 +#define XINDEX_DBZINCORE 1 #endif #ifndef XINDEXNAME -# define XINDEXNAME ".index" +#define XINDEXNAME ".index" #endif #ifndef XINDEXDBM -# define XINDEXDBM ".dbm" +#define XINDEXDBM ".dbm" #endif #ifndef XINDEXINFO -# define XINDEXINFO ".info" +#define XINDEXINFO ".info" #endif #define LEN 1024 struct t_article { - long artnum; - char subject[LEN]; /* Subject: line from mail header */ - char from[LEN]; /* From: line from mail header (address) - */ - char name[LEN]; /* From: line from mail header (full nam -e) */ - long date; /* Date: line from header in seconds */ - char xref[LEN]; /* Xref: cross posted article reference -line */ - int lines; /* Lines: number of lines in article */ - char *archive; /* Archive-name: line from mail header */ - char *part; /* part no. of archive */ - char *patch; /* patch no. of archive */ + long artnum; + char subject[LEN]; /* Subject: line from mail header */ + char from[LEN]; /* From: line from mail header (address) */ + char name[LEN]; /* From: line from mail header (full nam e) */ + long date; /* Date: line from header in seconds */ + char xref[LEN]; /* Xref: cross posted article reference line */ + int lines; /* Lines: number of lines in article */ + char *archive; /* Archive-name: line from mail header */ + char *part; /* part no. of archive */ + char *patch; /* patch no. of archive */ }; typedef struct t_article art_t; @@ -61,12 +58,12 @@ typedef struct t_article art_t; #define HIS_FIELDSEP '\t' #define HIS_NOEXP "-" #define HIS_SUBFIELDSEP '~' -/*#define HIS_FIELDSEP2 '\034'*/ +/* #define HIS_FIELDSEP2 '\034' */ #define HIS_FIELDSEP2 'I' #ifndef TRUE -# define TRUE 1 -# define FALSE 0 +#define TRUE 1 +#define FALSE 0 #endif #ifndef BOOL @@ -74,7 +71,7 @@ typedef unsigned char BOOL; #endif #ifndef ICD_SYNC_COUNT -# define ICD_SYNC_COUNT 1 +#define ICD_SYNC_COUNT 1 #endif #endif diff --git a/innbbsd/innbbsconf.h b/innbbsd/innbbsconf.h index 6521dde6..4e068443 100644 --- a/innbbsd/innbbsconf.h +++ b/innbbsd/innbbsconf.h @@ -18,98 +18,97 @@ #include <errno.h> #include <time.h> #ifndef BSD44 -# include <malloc.h> +#include <malloc.h> #endif #include <sys/time.h> #include <sys/stat.h> #include <sys/file.h> -/*#include "bbs.h"*/ +/* #include "bbs.h" */ #if defined(AIX) -# include <sys/select.h> +#include <sys/select.h> #endif /* - BBS home directory - It has been overridden in Makefile -*/ + * BBS home directory It has been overridden in Makefile + */ #ifndef _PATH_BBSHOME -# define _PATH_BBSHOME "/u/staff/bbsroot/csie_util/bntpd/home" -/*# define _PATH_BBSHOME "/home/bbs"*/ +#define _PATH_BBSHOME "/u/staff/bbsroot/csie_util/bntpd/home" +/* # define _PATH_BBSHOME "/home/bbs" */ #endif #ifndef EXPIREDAYS -# define EXPIREDAYS 7 +#define EXPIREDAYS 7 #endif #ifndef DEFAULT_HIST_SIZE -# define DEFAULT_HIST_SIZE 100000 +#define DEFAULT_HIST_SIZE 100000 #endif /* - Maximum number of connections accepted by innbbsd -*/ + * Maximum number of connections accepted by innbbsd + */ #ifndef MAXCLIENT -# define MAXCLIENT 500 +#define MAXCLIENT 500 #endif /* - Maximum number of articles received for a newsgroup by bbsnnrp each time -*/ + * Maximum number of articles received for a newsgroup by bbsnnrp each time + */ #ifndef MAX_ARTS -# define MAX_ARTS 100 +#define MAX_ARTS 100 #endif /* - Maximum size of articles received -*/ + * Maximum size of articles received + */ #ifndef MAX_ART_SIZE -# define MAX_ART_SIZE 1000000L +#define MAX_ART_SIZE 1000000L #endif /* - Maximum number of articles stated for a newsgroup by bbsnnrp each time -*/ + * Maximum number of articles stated for a newsgroup by bbsnnrp each time + */ #ifndef MAX_STATS -# define MAX_STATS 1000 +#define MAX_STATS 1000 #endif /* - Mininum wait interval for bbsnnrp -*/ + * Mininum wait interval for bbsnnrp + */ #ifndef MIN_WAIT -# define MIN_WAIT 60 +#define MIN_WAIT 60 #endif #ifndef DefaultINNBBSPort -# define DefaultINNBBSPort "7777" +#define DefaultINNBBSPort "7777" #endif /* - time to maintain history database -*/ + * time to maintain history database + */ #ifndef HIS_MAINT -# define HIS_MAINT -# define HIS_MAINT_HOUR 4 -# define HIS_MAINT_MIN 30 +#define HIS_MAINT +#define HIS_MAINT_HOUR 4 +#define HIS_MAINT_MIN 30 #endif #ifndef ChannelSize -# define ChannelSize 4096 +#define ChannelSize 4096 #endif #ifndef ReadSize -# define ReadSize 1024 +#define ReadSize 1024 #endif #ifndef MAXPATHLEN -# define MAXPATHLEN 1024 +#define MAXPATHLEN 1024 #endif #ifndef CLX_IOCTL -# define CLX_IOCTL +#define CLX_IOCTL #endif #define DEFAULTSERVER "your.favorite.news.server" @@ -122,67 +121,62 @@ #endif /* -# ifndef ARG -# ifdef __STDC__ -# define ARG(x) (x) -# else -# define ARG(x) () -# endif -# endif -*/ + * # ifndef ARG # ifdef __STDC__ # define ARG(x) (x) # else # define + * ARG(x) () # endif # endif + */ /* machine dependend */ #if defined(__linux) -# ifndef LINUX -# define LINUX -# endif +#ifndef LINUX +#define LINUX +#endif #endif #if !defined(__svr4__) || defined(sun) -# define WITH_TM_GMTOFF +#define WITH_TM_GMTOFF #endif #if (defined(__svr4__) && defined(sun)) || defined(SOLARIS) -# ifndef SOLARIS -# define SOLARIS -# endif -# define NO_getdtablesize -# define NO_bcopy -# define NO_bzero -# define NO_flock -# define WITH_lockf +#ifndef SOLARIS +#define SOLARIS +#endif +#define NO_getdtablesize +#define NO_bcopy +#define NO_bzero +#define NO_flock +#define WITH_lockf #endif #if defined(AIX) -# define NO_flock -# define WITH_lockf +#define NO_flock +#define WITH_lockf #endif #if defined(HPUX) -# define NO_getdtablesize -# define NO_flock -# define WITH_lockf +#define NO_getdtablesize +#define NO_flock +#define WITH_lockf #endif #ifdef NO_bcopy -# ifndef bcopy -# define bcopy(a,b,c) memcpy(b,a,c) -# endif +#ifndef bcopy +#define bcopy(a,b,c) memcpy(b,a,c) +#endif #endif #ifdef NO_bzero -# ifndef bzero -# define bzero(mem, size) memset(mem,'\0',size) -# endif +#ifndef bzero +#define bzero(mem, size) memset(mem,'\0',size) +#endif #endif #ifndef LOCK_EX -# define LOCK_EX 2 /* exclusive lock */ -# define LOCK_UN 8 /* unlock */ +#define LOCK_EX 2 /* exclusive lock */ +#define LOCK_UN 8 /* unlock */ #endif #ifdef DEC_ALPHA -# define ULONG unsigned int +#define ULONG unsigned int #else -# define ULONG unsigned long +#define ULONG unsigned long #endif #ifdef PalmBBS 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); */ } diff --git a/innbbsd/innbbsd.h b/innbbsd/innbbsd.h index ba667ee6..90a019d1 100644 --- a/innbbsd/innbbsd.h +++ b/innbbsd/innbbsd.h @@ -3,7 +3,7 @@ #include "daemon.h" #ifndef ADMINUSER -# define ADMINUSER "usenet@csie.nctu.edu.tw" +#define ADMINUSER "usenet@csie.nctu.edu.tw" #endif #endif diff --git a/innbbsd/inndchannel.c b/innbbsd/inndchannel.c index b784bde4..0b1ff3aa 100644 --- a/innbbsd/inndchannel.c +++ b/innbbsd/inndchannel.c @@ -19,562 +19,572 @@ #endif #ifndef DefaultINNBBSPort -# define DefaultINNBBSPort "7777" +#define DefaultINNBBSPort "7777" #endif #ifndef HIS_MAINT -# define HIS_MAINT -# define HIS_MAINT_HOUR 5 -# define HIS_MAINT_MIN 30 +#define HIS_MAINT +#define HIS_MAINT_HOUR 5 +#define HIS_MAINT_MIN 30 #endif -int Maxclient=MAXCLIENT; -ClientType *Channel=NULL; -ClientType INNBBSD_STAT; +int Maxclient = MAXCLIENT; +ClientType *Channel = NULL; +ClientType INNBBSD_STAT; -int Max_Art_Size = MAX_ART_SIZE; +int Max_Art_Size = MAX_ART_SIZE; -int inetdstart = 0; +int inetdstart = 0; -int Junkhistory = 0; +int Junkhistory = 0; -char *REMOTEUSERNAME, *REMOTEHOSTNAME; +char *REMOTEUSERNAME, *REMOTEHOSTNAME; -static fd_set rfd,wfd,efd,orfd,owfd,oefd; +static fd_set rfd, wfd, efd, orfd, owfd, oefd; clearfdset(fd) -int fd; + int fd; { - FD_CLR(fd,&rfd); + FD_CLR(fd, &rfd); } static channelcreate(client) -ClientType *client; + ClientType *client; { - buffer_t *in, *out; - in = &client->in; - out = &client->out; - if (in->data != NULL) - free(in->data); - in->data = (char*)mymalloc( ChannelSize ); - in->left = ChannelSize; - in->used = 0; - if (out->data != NULL) - free(out->data); - out->data = (char*)mymalloc( ChannelSize ); - out->used = 0; - out->left = ChannelSize; - client->ihavecount = 0; - client->ihaveduplicate = 0; - client->ihavefail = 0; - client->ihavesize = 0; - client->statcount = 0; - client->statfail = 0; - client->begin = time(NULL); + buffer_t *in, *out; + in = &client->in; + out = &client->out; + if (in->data != NULL) + free(in->data); + in->data = (char *)mymalloc(ChannelSize); + in->left = ChannelSize; + in->used = 0; + if (out->data != NULL) + free(out->data); + out->data = (char *)mymalloc(ChannelSize); + out->used = 0; + out->left = ChannelSize; + client->ihavecount = 0; + client->ihaveduplicate = 0; + client->ihavefail = 0; + client->ihavesize = 0; + client->statcount = 0; + client->statfail = 0; + client->begin = time(NULL); } channeldestroy(client) -ClientType *client; + ClientType *client; { - if (client->in.data != NULL) { - free(client->in.data); - client->in.data = NULL; - } - if (client->out.data != NULL) { - free(client->out.data); - client->out.data = NULL; - } + if (client->in.data != NULL) { + free(client->in.data); + client->in.data = NULL; + } + if (client->out.data != NULL) { + free(client->out.data); + client->out.data = NULL; + } #if !defined(PowerBBS) && !defined(DBZSERVER) - if (client->ihavecount >0 || client->statcount >0) { - bbslog("%s@%s rec: %d dup: %d fail: %d size: %d, stat rec: %d fail: %d, time sec: %d\n", - client->username, client->hostname, client->ihavecount, - client->ihaveduplicate, client->ihavefail, client->ihavesize, - client->statcount, client->statfail, time(NULL) - client->begin); - INNBBSD_STAT.ihavecount += client->ihavecount; - INNBBSD_STAT.ihaveduplicate += client->ihaveduplicate; - INNBBSD_STAT.ihavefail += client->ihavefail; - INNBBSD_STAT.ihavesize += client->ihavesize; - INNBBSD_STAT.statcount += client->statcount; - INNBBSD_STAT.statfail += client->statfail; - } + if (client->ihavecount > 0 || client->statcount > 0) { + bbslog("%s@%s rec: %d dup: %d fail: %d size: %d, stat rec: %d fail: %d, time sec: %d\n", + client->username, client->hostname, client->ihavecount, + client->ihaveduplicate, client->ihavefail, client->ihavesize, + client->statcount, client->statfail, time(NULL) - client->begin); + INNBBSD_STAT.ihavecount += client->ihavecount; + INNBBSD_STAT.ihaveduplicate += client->ihaveduplicate; + INNBBSD_STAT.ihavefail += client->ihavefail; + INNBBSD_STAT.ihavesize += client->ihavesize; + INNBBSD_STAT.statcount += client->statcount; + INNBBSD_STAT.statfail += client->statfail; + } #endif } inndchannel(port, path) -char *port, *path; + char *port, *path; { - time_t tvec; - int i; - int bbsinnd ; - int localbbsinnd; - char obuf[4096]; - struct timeval tout; - ClientType *client = (ClientType *)mymalloc( sizeof(ClientType) * Maxclient); - int localdaemonready = 0; - Channel = client; - - bbsinnd = pmain(port); - if (bbsinnd < 0) { - perror("pmain, existing"); - docompletehalt(); - return(-1); - } - - FD_ZERO(&rfd); FD_ZERO(&wfd); FD_ZERO(&efd); - - localbbsinnd = p_unix_main(path); - if (localbbsinnd < 0) { - perror("local pmain, existing"); -/* Kaede - if (!inetdstart) - fprintf(stderr, "if no other innbbsd running, try to remove %s\n",path); -*/ - close(bbsinnd); - return(-1); - } else { - FD_SET(localbbsinnd,&rfd); - localdaemonready = 1; - } - - FD_SET(bbsinnd,&rfd); - tvec = time((time_t *)0); - for (i=0;i< Maxclient ;++i) { - client[i].fd = -1; - client[i].access=0; - client[i].buffer[0] = '\0'; - client[i].mode = 0; - client[i].in.left = 0; - client[i].in.used = 0; - client[i].in.data = NULL; - client[i].out.left = 0; - client[i].out.used = 0; - client[i].out.data = NULL; - client[i].midcheck = 1; - } - for (;;) { - int nsel,i; - -/* - When to maintain history files. -*/ - time_t now; - static int maint = 0; - struct tm *local; - - if (INNBBSDshutdown()) { - HISclose(); - bbslog(" Shutdown Complete \n"); - docompletehalt(); - exit(0); - } - - time(&now); - local = localtime(&now); - if (local != NULL & local->tm_hour == His_Maint_Hour && - local->tm_min >= His_Maint_Min ) { - if (!maint) { - bbslog(":Maint: start (%d:%d).\n",local->tm_hour,local->tm_min); - HISmaint(); - time(&now); - local = localtime(&now); - if (local != NULL) - bbslog(":Maint: end (%d:%d).\n",local->tm_hour,local->tm_min); - maint = 1; - } - } else { - maint = 0; - } -/* -*/ -/* - in order to maintain history, timeout every 60 seconds in case - no connections -*/ - tout.tv_sec = 60; - tout.tv_usec = 0; - orfd = rfd; - if ((nsel=select(FD_SETSIZE,&orfd, NULL , NULL , &tout))<0){ - continue; - } - if (localdaemonready && FD_ISSET(localbbsinnd,&orfd)) { - int ns,length; - int cc; - ns=tryaccept(localbbsinnd); - if (ns < 0) continue; - for (i=0;i< Maxclient ;++i) { - if (client[i].fd==-1) break; - } - if (i== Maxclient) { - static char msg[]="502 no free descriptors\r\n"; - printf("%s",msg); - write(ns, msg, sizeof(msg)); - close(ns); - continue; - } - client[i].fd=ns; - client[i].buffer[0] = '\0'; - client[i].mode = 0; - client[i].midcheck = 1; - channelcreate(&client[i]); - FD_SET(ns,&rfd); /*FD_SET(ns,&wfd);*/ - { - strncpy(client[i].username,"localuser",20); - strncpy(client[i].hostname,"localhost",128); - client[i].Argv.in = fdopen( ns,"r"); - client[i].Argv.out = fdopen( ns,"w"); + time_t tvec; + int i; + int bbsinnd; + int localbbsinnd; + char obuf[4096]; + struct timeval tout; + ClientType *client = (ClientType *) mymalloc(sizeof(ClientType) * Maxclient); + int localdaemonready = 0; + Channel = client; + + bbsinnd = pmain(port); + if (bbsinnd < 0) { + perror("pmain, existing"); + docompletehalt(); + return (-1); + } + FD_ZERO(&rfd); + FD_ZERO(&wfd); + FD_ZERO(&efd); + + localbbsinnd = p_unix_main(path); + if (localbbsinnd < 0) { + perror("local pmain, existing"); + /* + * Kaede if (!inetdstart) fprintf(stderr, "if no other innbbsd + * running, try to remove %s\n",path); + */ + close(bbsinnd); + return (-1); + } else { + FD_SET(localbbsinnd, &rfd); + localdaemonready = 1; + } + + FD_SET(bbsinnd, &rfd); + tvec = time((time_t *) 0); + for (i = 0; i < Maxclient; ++i) { + client[i].fd = -1; + client[i].access = 0; + client[i].buffer[0] = '\0'; + client[i].mode = 0; + client[i].in.left = 0; + client[i].in.used = 0; + client[i].in.data = NULL; + client[i].out.left = 0; + client[i].out.used = 0; + client[i].out.data = NULL; + client[i].midcheck = 1; + } + for (;;) { + int nsel, i; + + /* + * When to maintain history files. + */ + time_t now; + static int maint = 0; + struct tm *local; + + if (INNBBSDshutdown()) { + HISclose(); + bbslog(" Shutdown Complete \n"); + docompletehalt(); + exit(0); + } + time(&now); + local = localtime(&now); + if (local != NULL & local->tm_hour == His_Maint_Hour && + local->tm_min >= His_Maint_Min) { + if (!maint) { + bbslog(":Maint: start (%d:%d).\n", local->tm_hour, local->tm_min); + HISmaint(); + time(&now); + local = localtime(&now); + if (local != NULL) + bbslog(":Maint: end (%d:%d).\n", local->tm_hour, local->tm_min); + maint = 1; + } + } else { + maint = 0; + } + /* + * */ + /* + * in order to maintain history, timeout every 60 seconds in case no + * connections + */ + tout.tv_sec = 60; + tout.tv_usec = 0; + orfd = rfd; + if ((nsel = select(FD_SETSIZE, &orfd, NULL, NULL, &tout)) < 0) { + continue; + } + if (localdaemonready && FD_ISSET(localbbsinnd, &orfd)) { + int ns, length; + int cc; + ns = tryaccept(localbbsinnd); + if (ns < 0) + continue; + for (i = 0; i < Maxclient; ++i) { + if (client[i].fd == -1) + break; + } + if (i == Maxclient) { + static char msg[] = "502 no free descriptors\r\n"; + printf("%s", msg); + write(ns, msg, sizeof(msg)); + close(ns); + continue; + } + client[i].fd = ns; + client[i].buffer[0] = '\0'; + client[i].mode = 0; + client[i].midcheck = 1; + channelcreate(&client[i]); + FD_SET(ns, &rfd); /* FD_SET(ns,&wfd); */ + { + strncpy(client[i].username, "localuser", 20); + strncpy(client[i].hostname, "localhost", 128); + client[i].Argv.in = fdopen(ns, "r"); + client[i].Argv.out = fdopen(ns, "w"); #if !defined(PowerBBS) && !defined(DBZSERVER) - bbslog("connected from (%s@%s).\n",client[i].username, client[i].hostname); + bbslog("connected from (%s@%s).\n", client[i].username, client[i].hostname); #endif #ifdef INNBBSDEBUG - printf("connected from (%s@%s).\n",client[i].username, client[i].hostname); + printf("connected from (%s@%s).\n", client[i].username, client[i].hostname); #endif #ifdef DBZSERVER - fprintf(client[i].Argv.out,"200 %s InterNetNews DBZSERVER server %s (%s@%s).\r\n",MYBBSID, VERSION, client[i].username, client[i].hostname); + fprintf(client[i].Argv.out, "200 %s InterNetNews DBZSERVER server %s (%s@%s).\r\n", MYBBSID, VERSION, client[i].username, client[i].hostname); #else - fprintf(client[i].Argv.out,"200 %s InterNetNews INNBBSD server %s (%s@%s).\r\n", MYBBSID, VERSION, client[i].username, client[i].hostname ); + fprintf(client[i].Argv.out, "200 %s InterNetNews INNBBSD server %s (%s@%s).\r\n", MYBBSID, VERSION, client[i].username, client[i].hostname); #endif - fflush(client[i].Argv.out); - verboselog("UNIX Connect from %s@%s\n",client[i].username, client[i].hostname); - } - } - - if (FD_ISSET(bbsinnd,&orfd)) { - int ns=tryaccept(bbsinnd), length; - struct sockaddr_in there; - char *name; - struct hostent *hp; - int cc; - if (ns < 0) continue; - for (i=0;i< Maxclient ;++i) { - if (client[i].fd==-1) break; - } - if (i== Maxclient) { - static char msg[]="502 no free descriptors\r\n"; - printf("%s",msg); - write(ns, msg, sizeof(msg)); - close(ns); - continue; - } - client[i].fd=ns; - client[i].buffer[0] = '\0'; - client[i].mode = 0; - client[i].midcheck = 1; - channelcreate(&client[i]); - FD_SET(ns,&rfd); /*FD_SET(ns,&wfd);*/ - length = sizeof(there); - if (getpeername(ns,(struct sockaddr *)&there,&length)>=0){ - time_t now=time((time_t *)0); - name=(char*)my_rfc931_name(ns,&there); - strncpy(client[i].username,name,20); - hp = (struct hostent*)gethostbyaddr((char*)&there.sin_addr, sizeof (struct in_addr), there.sin_family); - if (hp) - strncpy(client[i].hostname,hp->h_name,128); - else - strncpy(client[i].hostname,(char*)inet_ntoa(there.sin_addr),128); - - client[i].Argv.in = fdopen( ns,"r"); - client[i].Argv.out = fdopen( ns,"w"); - if ((char*)search_nodelist(client[i].hostname,client[i].username) == NULL) { - bbslog(":Err: invalid connection (%s@%s).\n",client[i].username, client[i].hostname); - fprintf(client[i].Argv.out,"502 You are not in my access file. (%s@%s)\r\n", client[i].username, client[i].hostname); - fflush(client[i].Argv.out); - fclose(client[i].Argv.in); - fclose(client[i].Argv.out); - close(client[i].fd); - FD_CLR(client[i].fd,&rfd); - client[i].fd = -1; - continue; - } - bbslog("connected from (%s@%s).\n",client[i].username, client[i].hostname); + fflush(client[i].Argv.out); + verboselog("UNIX Connect from %s@%s\n", client[i].username, client[i].hostname); + } + } + if (FD_ISSET(bbsinnd, &orfd)) { + int ns = tryaccept(bbsinnd), length; + struct sockaddr_in there; + char *name; + struct hostent *hp; + int cc; + if (ns < 0) + continue; + for (i = 0; i < Maxclient; ++i) { + if (client[i].fd == -1) + break; + } + if (i == Maxclient) { + static char msg[] = "502 no free descriptors\r\n"; + printf("%s", msg); + write(ns, msg, sizeof(msg)); + close(ns); + continue; + } + client[i].fd = ns; + client[i].buffer[0] = '\0'; + client[i].mode = 0; + client[i].midcheck = 1; + channelcreate(&client[i]); + FD_SET(ns, &rfd); /* FD_SET(ns,&wfd); */ + length = sizeof(there); + if (getpeername(ns, (struct sockaddr *) & there, &length) >= 0) { + time_t now = time((time_t *) 0); + name = (char *)my_rfc931_name(ns, &there); + strncpy(client[i].username, name, 20); + hp = (struct hostent *) gethostbyaddr((char *)&there.sin_addr, sizeof(struct in_addr), there.sin_family); + if (hp) + strncpy(client[i].hostname, hp->h_name, 128); + else + strncpy(client[i].hostname, (char *)inet_ntoa(there.sin_addr), 128); + + client[i].Argv.in = fdopen(ns, "r"); + client[i].Argv.out = fdopen(ns, "w"); + if ((char *)search_nodelist(client[i].hostname, client[i].username) == NULL) { + bbslog(":Err: invalid connection (%s@%s).\n", client[i].username, client[i].hostname); + fprintf(client[i].Argv.out, "502 You are not in my access file. (%s@%s)\r\n", client[i].username, client[i].hostname); + fflush(client[i].Argv.out); + fclose(client[i].Argv.in); + fclose(client[i].Argv.out); + close(client[i].fd); + FD_CLR(client[i].fd, &rfd); + client[i].fd = -1; + continue; + } + bbslog("connected from (%s@%s).\n", client[i].username, client[i].hostname); #ifdef INNBBSDEBUG - printf("connected from (%s@%s).\n",client[i].username, client[i].hostname); + printf("connected from (%s@%s).\n", client[i].username, client[i].hostname); #endif #ifdef DBZSERVER - fprintf(client[i].Argv.out,"200 %s InterNetNews DBZSERVER server %s (%s@%s).\r\n",MYBBSID, VERSION, client[i].username, client[i].hostname ); + fprintf(client[i].Argv.out, "200 %s InterNetNews DBZSERVER server %s (%s@%s).\r\n", MYBBSID, VERSION, client[i].username, client[i].hostname); #else - fprintf(client[i].Argv.out,"200 %s InterNetNews INNBBSD server %s (%s@%s).\r\n",MYBBSID, VERSION, client[i].username, client[i].hostname ); + fprintf(client[i].Argv.out, "200 %s InterNetNews INNBBSD server %s (%s@%s).\r\n", MYBBSID, VERSION, client[i].username, client[i].hostname); #endif - fflush(client[i].Argv.out); - verboselog("INET Connect from %s@%s\n",client[i].username, client[i].hostname); - } else { - } - - } - for (i=0;i< Maxclient ;++i) { - int fd=client[i].fd; - if (fd < 0) { - continue; - } - if (FD_ISSET(fd,&orfd)) { - int nr; + fflush(client[i].Argv.out); + verboselog("INET Connect from %s@%s\n", client[i].username, client[i].hostname); + } else { + } + + } + for (i = 0; i < Maxclient; ++i) { + int fd = client[i].fd; + if (fd < 0) { + continue; + } + if (FD_ISSET(fd, &orfd)) { + int nr; #ifdef DEBUG - printf("before read i %d in.used %d in.left %d\n",i,client[i].in.used, client[i].in.left); + printf("before read i %d in.used %d in.left %d\n", i, client[i].in.used, client[i].in.left); #endif - nr=channelreader(client+i); + nr = channelreader(client + i); #ifdef DEBUG - printf("after read i %d in.used %d in.left %d\n",i,client[i].in.used, client[i].in.left); + printf("after read i %d in.used %d in.left %d\n", i, client[i].in.used, client[i].in.left); #endif - /*int nr=read(fd,client[i].buffer,1024);*/ - if (nr <= 0) { - FD_CLR(fd,&rfd); - fclose(client[i].Argv.in); - fclose(client[i].Argv.out); - close(fd); - client[i].fd = -1; - channeldestroy(client+i); - continue; - } + /* int nr=read(fd,client[i].buffer,1024); */ + if (nr <= 0) { + FD_CLR(fd, &rfd); + fclose(client[i].Argv.in); + fclose(client[i].Argv.out); + close(fd); + client[i].fd = -1; + channeldestroy(client + i); + continue; + } #ifdef DEBUG - printf("nr %d %.*s", nr, nr, client[i].buffer); + printf("nr %d %.*s", nr, nr, client[i].buffer); #endif - if (client[i].access==0) { - continue; - } - } - } - } + if (client[i].access == 0) { + continue; + } + } + } + } } -int channelreader(client) -ClientType *client; +int +channelreader(client) + ClientType *client; { - int len, clientlen; - char buffer1[8192], buffer2[4096]; - char *ptr; - buffer_t *in = &client->in; - - if (in->left < ReadSize+3) { - int need = in->used + in->left + ReadSize + 3; - need += need/5 ; - in->data = (char*)myrealloc(in->data, need); - in->left = need - in->used; - verboselog("channelreader realloc %d\n",need); - } - len = read(client->fd, in->data+in->used, ReadSize); - - if (len <=0) return len; - - in->data[len+in->used] = '\0'; - in->lastread = len; + int len, clientlen; + char buffer1[8192], buffer2[4096]; + char *ptr; + buffer_t *in = &client->in; + + if (in->left < ReadSize + 3) { + int need = in->used + in->left + ReadSize + 3; + need += need / 5; + in->data = (char *)myrealloc(in->data, need); + in->left = need - in->used; + verboselog("channelreader realloc %d\n", need); + } + len = read(client->fd, in->data + in->used, ReadSize); + + if (len <= 0) + return len; + + in->data[len + in->used] = '\0'; + in->lastread = len; #ifdef DEBUG - printf("after read lastread %d\n", in->lastread); - printf("len %d client %d\n", len, strlen(in->data+in->used)); + printf("after read lastread %d\n", in->lastread); + printf("len %d client %d\n", len, strlen(in->data + in->used)); #endif - REMOTEHOSTNAME = client->hostname; - REMOTEUSERNAME = client->username; - if (client->mode == 0) { - if ( (ptr=(char*)strchr(in->data,'\n')) != NULL) { - if (in->data[0] != '\r') - commandparse(client); - } - } else { - commandparse(client); - } - return len; + REMOTEHOSTNAME = client->hostname; + REMOTEUSERNAME = client->username; + if (client->mode == 0) { + if ((ptr = (char *)strchr(in->data, '\n')) != NULL) { + if (in->data[0] != '\r') + commandparse(client); + } + } else { + commandparse(client); + } + return len; } commandparse(client) -ClientType *client; + ClientType *client; { - char *ptr, *lastend; - argv_t *Argv = &client->Argv; - int (*Main)(); - char *buffer = client->in.data; - int fd = client->fd; - buffer_t *in = &client->in; - int dataused; - int dataleft; + char *ptr, *lastend; + argv_t *Argv = &client->Argv; + int (*Main) (); + char *buffer = client->in.data; + int fd = client->fd; + buffer_t *in = &client->in; + int dataused; + int dataleft; #ifdef DEBUG - printf("%s %s buffer %s",client->username, client->hostname, buffer); + printf("%s %s buffer %s", client->username, client->hostname, buffer); #endif - ptr= (char*) strchr(in->data+in->used,'\n'); - if (client->mode == 0) { - if (ptr == NULL) { - in->used += in->lastread; - in->left -= in->lastread; - return; - } else { - dataused = ptr - (in->data + in->used) + 1; - dataleft = in->lastread - dataused; - lastend = ptr + 1; - } - } else { - if (in->used >= 5) { - ptr = (char*) strstr(in->data+in->used-5,"\r\n.\r\n"); - } else if (strncmp(in->data,".\r\n",3)==0) { - ptr = in->data; - } else { - ptr = (char*) strstr(in->data+in->used,"\r\n.\r\n"); - } - if (ptr == NULL) { - in->used += in->lastread; - in->left -= in->lastread; - return; - } else { - ptr[2]='\0'; - if ( strncmp(in->data,".\r\n",3)==0) - dataused = 3; - else - dataused = ptr - (in->data + in->used) + 5; - dataleft = in->lastread - dataused; - lastend = ptr + 5; - verboselog("Get: %s@%s end of data . size %d\n", client->username, client->hostname, in->used + dataused); - client->ihavesize += in->used + dataused; - } - } - if (client->mode == 0) { - struct Daemoncmd * dp; - Argv->argc = 0, Argv->argv = NULL, - Argv->inputline= buffer; - if ( ptr != NULL) *ptr = '\0'; - verboselog("Get: %s\n",Argv->inputline); - Argv->argc = argify( in->data + in->used,&Argv->argv); - if ( ptr != NULL) *ptr = '\n'; - dp = (struct Daemoncmd *) searchcmd(Argv->argv[0]); - Argv->dc = dp; - if (Argv->dc) { + ptr = (char *)strchr(in->data + in->used, '\n'); + if (client->mode == 0) { + if (ptr == NULL) { + in->used += in->lastread; + in->left -= in->lastread; + return; + } else { + dataused = ptr - (in->data + in->used) + 1; + dataleft = in->lastread - dataused; + lastend = ptr + 1; + } + } else { + if (in->used >= 5) { + ptr = (char *)strstr(in->data + in->used - 5, "\r\n.\r\n"); + } else if (strncmp(in->data, ".\r\n", 3) == 0) { + ptr = in->data; + } else { + ptr = (char *)strstr(in->data + in->used, "\r\n.\r\n"); + } + if (ptr == NULL) { + in->used += in->lastread; + in->left -= in->lastread; + return; + } else { + ptr[2] = '\0'; + if (strncmp(in->data, ".\r\n", 3) == 0) + dataused = 3; + else + dataused = ptr - (in->data + in->used) + 5; + dataleft = in->lastread - dataused; + lastend = ptr + 5; + verboselog("Get: %s@%s end of data . size %d\n", client->username, client->hostname, in->used + dataused); + client->ihavesize += in->used + dataused; + } + } + if (client->mode == 0) { + struct Daemoncmd *dp; + Argv->argc = 0, Argv->argv = NULL, + Argv->inputline = buffer; + if (ptr != NULL) + *ptr = '\0'; + verboselog("Get: %s\n", Argv->inputline); + Argv->argc = argify(in->data + in->used, &Argv->argv); + if (ptr != NULL) + *ptr = '\n'; + dp = (struct Daemoncmd *) searchcmd(Argv->argv[0]); + Argv->dc = dp; + if (Argv->dc) { #ifdef DEBUG - printf("enter command %s\n",Argv->argv[0]); + printf("enter command %s\n", Argv->argv[0]); #endif - if (Argv->argc < dp->argc) { - fprintf(Argv->out,"%d Usage: %s\r\n",dp->errorcode,dp->usage); - fflush(Argv->out); - verboselog("Put: %d Usage: %s\n",dp->errorcode,dp->usage); - } else if (dp->argno != 0 && Argv->argc > dp->argno) { - fprintf(Argv->out,"%d Usage: %s\r\n",dp->errorcode,dp->usage); - fflush(Argv->out); - verboselog("Put: %d Usage: %s\n",dp->errorcode,dp->usage); - } else { - Main=Argv->dc->main; - if (Main) { - fflush(stdout); - (*Main)(client); - } - } - } else { - fprintf(Argv->out,"500 Syntax error or bad command\r\n"); - fflush(Argv->out); - verboselog("Put: 500 Syntax error or bad command\r\n"); - } - deargify(&Argv->argv); - } else { - if (Argv->dc) { + if (Argv->argc < dp->argc) { + fprintf(Argv->out, "%d Usage: %s\r\n", dp->errorcode, dp->usage); + fflush(Argv->out); + verboselog("Put: %d Usage: %s\n", dp->errorcode, dp->usage); + } else if (dp->argno != 0 && Argv->argc > dp->argno) { + fprintf(Argv->out, "%d Usage: %s\r\n", dp->errorcode, dp->usage); + fflush(Argv->out); + verboselog("Put: %d Usage: %s\n", dp->errorcode, dp->usage); + } else { + Main = Argv->dc->main; + if (Main) { + fflush(stdout); + (*Main) (client); + } + } + } else { + fprintf(Argv->out, "500 Syntax error or bad command\r\n"); + fflush(Argv->out); + verboselog("Put: 500 Syntax error or bad command\r\n"); + } + deargify(&Argv->argv); + } else { + if (Argv->dc) { #ifdef DEBUG - printf("enter data mode\n"); + printf("enter data mode\n"); #endif - Main=Argv->dc->main; - if (Main) { - fflush(stdout); - (*Main)(client); - } - } - } - if (client->mode == 0) { - if (dataleft > 0) { - strncpy(in->data, lastend, dataleft); + Main = Argv->dc->main; + if (Main) { + fflush(stdout); + (*Main) (client); + } + } + } + if (client->mode == 0) { + if (dataleft > 0) { + strncpy(in->data, lastend, dataleft); #ifdef INNBBSDEBUG - printf("***** try to copy %x %x %d bytes\n",in->data, lastend, dataleft); + printf("***** try to copy %x %x %d bytes\n", in->data, lastend, dataleft); #endif - } else { - dataleft = 0; - } - in->left += in->used - dataleft; - in->used = dataleft; - } + } else { + dataleft = 0; + } + in->left += in->used - dataleft; + in->used = dataleft; + } } do_command() { } -void dopipesig(s) -int s; +void +dopipesig(s) + int s; { printf("catch sigpipe\n"); signal(SIGPIPE, dopipesig); } -int standaloneinit(port) -char *port ; +int +standaloneinit(port) + char *port; { - int ndescriptors; - FILE *pf; - char pidfile[24]; - ndescriptors = getdtablesize(); -/*#ifndef NOFORK*/ - if (!inetdstart) - if (fork()) - exit(0); -/*#endif*/ - - sprintf(pidfile,"/tmp/innbbsd-%s.pid",port); -/* Kaede - if (!inetdstart) - fprintf(stderr, "PID file is in %s\n", pidfile); -*/ - { int s; - for (s = 3; s < ndescriptors; s++) - (void) close(s); - } - pf=fopen(pidfile,"w"); - if (pf != NULL) { - fprintf(pf,"%d\n",getpid()); - fclose(pf); - } + int ndescriptors; + FILE *pf; + char pidfile[24]; + ndescriptors = getdtablesize(); + /* #ifndef NOFORK */ + if (!inetdstart) + if (fork()) + exit(0); + /* #endif */ + + sprintf(pidfile, "/tmp/innbbsd-%s.pid", port); + /* + * Kaede if (!inetdstart) fprintf(stderr, "PID file is in %s\n", + * pidfile); + */ + { + int s; + for (s = 3; s < ndescriptors; s++) + (void)close(s); + } + pf = fopen(pidfile, "w"); + if (pf != NULL) { + fprintf(pf, "%d\n", getpid()); + fclose(pf); + } } -extern char *optarg; -extern int opterr, optind; +extern char *optarg; +extern int opterr, optind; innbbsusage(name) -char *name; + char *name; { - fprintf(stderr,"Usage: %s [options] [port [path]]\n",name); - fprintf(stderr," -v (verbose log)\n"); - fprintf(stderr," -h|? (help)\n"); - fprintf(stderr," -n (not to use in core dbz)\n"); - fprintf(stderr," -i (start from inetd with wait option)\n"); - fprintf(stderr," -c connections (maximum number of connections accepted)\n"); - fprintf(stderr," default=%d\n",Maxclient); - fprintf(stderr," -j (keep history of junk article, default=none)\n"); + fprintf(stderr, "Usage: %s [options] [port [path]]\n", name); + fprintf(stderr, " -v (verbose log)\n"); + fprintf(stderr, " -h|? (help)\n"); + fprintf(stderr, " -n (not to use in core dbz)\n"); + fprintf(stderr, " -i (start from inetd with wait option)\n"); + fprintf(stderr, " -c connections (maximum number of connections accepted)\n"); + fprintf(stderr, " default=%d\n", Maxclient); + fprintf(stderr, " -j (keep history of junk article, default=none)\n"); } #ifdef DEBUGNGSPLIT main() { - char **ngptr ; - char buf[1024]; - gets(buf); - ngptr = (char**)BNGsplit(buf); - printf("line %s\n",buf); - while ( *ngptr != NULL) { - printf("%s\n",*ngptr); - ngptr++; - } + char **ngptr; + char buf[1024]; + gets(buf); + ngptr = (char **)BNGsplit(buf); + printf("line %s\n", buf); + while (*ngptr != NULL) { + printf("%s\n", *ngptr); + ngptr++; + } } #endif -static time_t INNBBSDstartup; +static time_t INNBBSDstartup; innbbsdstartup() { - return INNBBSDstartup; + return INNBBSDstartup; } -main(argc,argv) -int argc; -char **argv; +main(argc, argv) + int argc; + char **argv; { - char *port, *path; - int c, errflag=0; - extern INNBBSDhalt(); -/* -woju -*/ + char *port, *path; + int c, errflag = 0; + extern INNBBSDhalt(); + /* + * woju + */ setgid(BBSGID); setuid(BBSUID); chdir(BBSHOME); @@ -587,66 +597,67 @@ woju time(&INNBBSDstartup); openlog("innbbsd", LOG_PID | LOG_ODELAY, LOG_DAEMON); - while ((c = getopt(argc,argv,"c:f:s:vhidn?j"))!= -1) - switch (c) { - case 'j': - Junkhistory = 1; - break; - case 'v': - verboseon("innbbsd.log"); - break; - case 'n': - hisincore(0); - break; - case 'c': - Maxclient = atoi(optarg); - if (Maxclient < 0) Maxclient = 0; - break; - case 'i': { - struct sockaddr_in there; - int len = sizeof(there); - int rel; - if ((rel=getsockname(0,(struct sockaddr *)&there,&len))< 0){ - fprintf(stdout,"You must run -i from inetd with inetd.conf line: \n"); - fprintf(stdout,"service-port stream tcp wait bbs /home/bbs/innbbsd innbbsd -i port\n"); - fflush(stdout); - exit(5); - } - inetdstart = 1; - startfrominetd(1); - } - break; - case 'd': - dbzdebug(1); - break; - case 's': - Max_Art_Size = atol(optarg); - if (Max_Art_Size < 0) Max_Art_Size = 0; - break; - case 'h': - case '?': - default: - errflag ++; - } + while ((c = getopt(argc, argv, "c:f:s:vhidn?j")) != -1) + switch (c) { + case 'j': + Junkhistory = 1; + break; + case 'v': + verboseon("innbbsd.log"); + break; + case 'n': + hisincore(0); + break; + case 'c': + Maxclient = atoi(optarg); + if (Maxclient < 0) + Maxclient = 0; + break; + case 'i':{ + struct sockaddr_in there; + int len = sizeof(there); + int rel; + if ((rel = getsockname(0, (struct sockaddr *) & there, &len)) < 0) { + fprintf(stdout, "You must run -i from inetd with inetd.conf line: \n"); + fprintf(stdout, "service-port stream tcp wait bbs /home/bbs/innbbsd innbbsd -i port\n"); + fflush(stdout); + exit(5); + } + inetdstart = 1; + startfrominetd(1); + } + break; + case 'd': + dbzdebug(1); + break; + case 's': + Max_Art_Size = atol(optarg); + if (Max_Art_Size < 0) + Max_Art_Size = 0; + break; + case 'h': + case '?': + default: + errflag++; + } if (errflag > 0) { - innbbsusage(argv[0]); - return(1); + innbbsusage(argv[0]); + return (1); } if (argc - optind >= 1) { - port = argv[optind]; + port = argv[optind]; } if (argc - optind >= 2) { - path = argv[optind+1]; + path = argv[optind + 1]; } - standaloneinit(port); initial_bbs("feed"); - -/* Kaede - if (!inetdstart) - fprintf(stderr, "Try to listen in port %s and path %s\n", port, path); -*/ + + /* + * Kaede if (!inetdstart) fprintf(stderr, "Try to listen in port %s and + * path %s\n", port, path); + */ HISmaint(); HISsetup(); installinnbbsd(); diff --git a/innbbsd/inntobbs.c b/innbbsd/inntobbs.c index fb854867..fb1211ee 100644 --- a/innbbsd/inntobbs.c +++ b/innbbsd/inntobbs.c @@ -7,311 +7,325 @@ #include "inntobbs.h" typedef struct Header { - char *name; - int id; -} header_t; + char *name; + int id; +} header_t; -/*enum HeaderValue { -SUBJECT_H, FROM_H, DATE_H, MID_H, NEWSGROUPS_H, -NNTPPOSTINGHOST_H, NNTPHOST_H, CONTROL_H, PATH_H, -ORGANIZATION_H, LASTHEADER, -}; -*/ +/* + * enum HeaderValue { SUBJECT_H, FROM_H, DATE_H, MID_H, NEWSGROUPS_H, + * NNTPPOSTINGHOST_H, NNTPHOST_H, CONTROL_H, PATH_H, ORGANIZATION_H, + * LASTHEADER, }; + */ #include <string.h> -header_t headertable[] = { -"Subject" ,SUBJECT_H, -"From" ,FROM_H, -"Date" ,DATE_H, -"Message-ID",MID_H, -"Newsgroups",NEWSGROUPS_H, -"NNTP-Posting-Host",NNTPPOSTINGHOST_H, -"NNTP-Host", NNTPHOST_H, -"Control", CONTROL_H, -"Path", PATH_H, -"Organization", ORGANIZATION_H, -"X-Auth-From", X_Auth_From_H, -"Approved", APPROVED_H, -"Distribution", DISTRIBUTION_H, -"Keywords", KEYWORDS_H, -"Summary", SUMMARY_H, -"References",REFERENCES_H, +header_t headertable[] = { + "Subject", SUBJECT_H, + "From", FROM_H, + "Date", DATE_H, + "Message-ID", MID_H, + "Newsgroups", NEWSGROUPS_H, + "NNTP-Posting-Host", NNTPPOSTINGHOST_H, + "NNTP-Host", NNTPHOST_H, + "Control", CONTROL_H, + "Path", PATH_H, + "Organization", ORGANIZATION_H, + "X-Auth-From", X_Auth_From_H, + "Approved", APPROVED_H, + "Distribution", DISTRIBUTION_H, + "Keywords", KEYWORDS_H, + "Summary", SUMMARY_H, + "References", REFERENCES_H, }; -char *HEADER[LASTHEADER]; -char *BODY; -char *FROM, *SUBJECT, *SITE, *DATE, *POSTHOST, - *NNTPHOST, *PATH, *GROUPS, *MSGID, *CONTROL; +char *HEADER[LASTHEADER]; +char *BODY; +char *FROM, *SUBJECT, *SITE, *DATE, *POSTHOST, *NNTPHOST, *PATH, + *GROUPS, *MSGID, *CONTROL; #ifdef PalmBBS -char **XHEADER; -char *XPATH; +char **XHEADER; +char *XPATH; #endif int isexcluded(path1, nl) -char *path1; -nodelist_t *nl; + char *path1; + nodelist_t *nl; { - char path2[1024]; - /*path2 = (char*)mymalloc(strlen(nl->node) + 3);*/ - sprintf(path2, "!%.*s!",sizeof path2 - 3, nl->node); - if (strstr(path1, path2) != NULL) return 1; - if (nl->exclusion && *nl->exclusion) { - char *exclude, *ptr; - for (exclude = nl->exclusion, ptr = strchr(exclude,','); - exclude && *exclude; ptr = strchr(exclude,',')) { - if (ptr) *ptr = '\0'; - sprintf(path2, "!%.*s!",sizeof path2 - 3, exclude); - if (strstr(path1, path2) != NULL) return 1; - if (ptr) { - *ptr = ','; - exclude = ptr+1; - } else { - break; - } + char path2[1024]; + /* path2 = (char*)mymalloc(strlen(nl->node) + 3); */ + sprintf(path2, "!%.*s!", sizeof path2 - 3, nl->node); + if (strstr(path1, path2) != NULL) + return 1; + if (nl->exclusion && *nl->exclusion) { + char *exclude, *ptr; + for (exclude = nl->exclusion, ptr = strchr(exclude, ','); + exclude && *exclude; ptr = strchr(exclude, ',')) { + if (ptr) + *ptr = '\0'; + sprintf(path2, "!%.*s!", sizeof path2 - 3, exclude); + if (strstr(path1, path2) != NULL) + return 1; + if (ptr) { + *ptr = ','; + exclude = ptr + 1; + } else { + break; + } } - } - return 0; + } + return 0; } feedfplog(nf, filepath, type) -newsfeeds_t *nf; -char *filepath; -int type; + newsfeeds_t *nf; + char *filepath; + int type; { - char *path1, *path2, *hostptr; - nodelist_t *nl; - if (nf == NULL) return; - if( nf->path != NULL ) { - char *ptr1, *ptr2; - char savech; - path1 = (char*)mymalloc(strlen(HEADER[PATH_H]) + 3); - sprintf(path1, "!%s!",HEADER[PATH_H]); - for (ptr1 = nf->path; ptr1 && *ptr1;) { - for (; *ptr1 && isspace(*ptr1); ptr1++); - if (!*ptr1) break; - for (ptr2 = ptr1; *ptr2 && !isspace(*ptr2); ptr2++); - savech = *ptr2; - *ptr2 = '\0'; - /* - bbslog("search node %s\n",ptr1); - */ - nl = (nodelist_t*) search_nodelist_bynode(ptr1); - /* - bbslog("search node node %s, host %s fp %d\n",nl->node, nl->host, nl->feedfp); - */ - *ptr2 = savech; - ptr1 = ptr2++; - if (nl == NULL) continue; - if (nl->feedfp == NULL) continue; - if (isexcluded(path1,nl)) continue; - /*path2 = (char*)mymalloc(strlen(nl->node) + 3); - sprintf(path2, "!%s!",nl->node); - free(path2); - */ - /* - bbslog("path1 %s path2 %s\n",path1, path2); - */ - /*if (strstr(path1, path2) != NULL) return;*/ - /* to conform to the bntplink batch file */ - { - char *slash = strrchr(filepath,'/'); - if (slash != NULL) *slash = '\t'; - fprintf(nl->feedfp,"%s\t%s\t\t%s\t%s\t%c\t%s\t%s!%s\n", - filepath == NULL ? "": filepath, - GROUPS, FROM, SUBJECT, type, MSGID, MYBBSID, HEADER[PATH_H]); - if (slash != NULL) *slash = '/'; - } - fflush(nl->feedfp); - if (savech == '\0') break; + char *path1, *path2, *hostptr; + nodelist_t *nl; + if (nf == NULL) + return; + if (nf->path != NULL) { + char *ptr1, *ptr2; + char savech; + path1 = (char *)mymalloc(strlen(HEADER[PATH_H]) + 3); + sprintf(path1, "!%s!", HEADER[PATH_H]); + for (ptr1 = nf->path; ptr1 && *ptr1;) { + for (; *ptr1 && isspace(*ptr1); ptr1++); + if (!*ptr1) + break; + for (ptr2 = ptr1; *ptr2 && !isspace(*ptr2); ptr2++); + savech = *ptr2; + *ptr2 = '\0'; + /* + * bbslog("search node %s\n",ptr1); + */ + nl = (nodelist_t *) search_nodelist_bynode(ptr1); + /* + * bbslog("search node node %s, host %s fp %d\n",nl->node, + * nl->host, nl->feedfp); + */ + *ptr2 = savech; + ptr1 = ptr2++; + if (nl == NULL) + continue; + if (nl->feedfp == NULL) + continue; + if (isexcluded(path1, nl)) + continue; + /* + * path2 = (char*)mymalloc(strlen(nl->node) + 3); sprintf(path2, + * "!%s!",nl->node); free(path2); + */ + /* + * bbslog("path1 %s path2 %s\n",path1, path2); + */ + /* if (strstr(path1, path2) != NULL) return; */ + /* to conform to the bntplink batch file */ + { + char *slash = strrchr(filepath, '/'); + if (slash != NULL) + *slash = '\t'; + fprintf(nl->feedfp, "%s\t%s\t\t%s\t%s\t%c\t%s\t%s!%s\n", + filepath == NULL ? "" : filepath, + GROUPS, FROM, SUBJECT, type, MSGID, MYBBSID, HEADER[PATH_H]); + if (slash != NULL) + *slash = '/'; + } + fflush(nl->feedfp); + if (savech == '\0') + break; + } + free(path1); } - free(path1); - } } -static FILE* bbsfeedsfp = NULL; -static bbsfeedson = -1; +static FILE *bbsfeedsfp = NULL; +static bbsfeedson = -1; init_bbsfeedsfp() { - if (bbsfeedsfp != NULL) { - fclose(bbsfeedsfp); - bbsfeedsfp = NULL; - } - bbsfeedson = -1; + if (bbsfeedsfp != NULL) { + fclose(bbsfeedsfp); + bbsfeedsfp = NULL; + } + bbsfeedson = -1; } -bbsfeedslog(filepath, type) -char *filepath; -int type; +bbsfeedslog(filepath, type) + char *filepath; + int type; { - char datebuf[40]; - time_t now; + char datebuf[40]; + time_t now; - if (bbsfeedson ==0) return; - if (bbsfeedson == -1) { - if (!isfile(BBSFEEDS)) { - bbsfeedson = 0; - return; + if (bbsfeedson == 0) + return; + if (bbsfeedson == -1) { + if (!isfile(BBSFEEDS)) { + bbsfeedson = 0; + return; + } + bbsfeedson = 1; } - bbsfeedson = 1; - } - - if (bbsfeedsfp == NULL) { - bbsfeedsfp = fopen(BBSFEEDS,"a"); - } - time(&now); - strftime(datebuf, sizeof(datebuf), "%b %d %X ", localtime(&now)); + if (bbsfeedsfp == NULL) { + bbsfeedsfp = fopen(BBSFEEDS, "a"); + } + time(&now); + strftime(datebuf, sizeof(datebuf), "%b %d %X ", localtime(&now)); - if( bbsfeedsfp != NULL ) { - fprintf(bbsfeedsfp,"%s %c %s %s %s %s!%s %s\n", datebuf, type, - REMOTEHOSTNAME, GROUPS, MSGID, MYBBSID, HEADER[PATH_H], filepath==NULL? "": filepath); + if (bbsfeedsfp != NULL) { + fprintf(bbsfeedsfp, "%s %c %s %s %s %s!%s %s\n", datebuf, type, + REMOTEHOSTNAME, GROUPS, MSGID, MYBBSID, HEADER[PATH_H], filepath == NULL ? "" : filepath); fflush(bbsfeedsfp); - } + } } -static FILE* echomailfp = NULL; -static echomaillogon = -1; +static FILE *echomailfp = NULL; +static echomaillogon = -1; init_echomailfp() { - if (echomailfp != NULL) { - fclose(echomailfp); - echomailfp = NULL; - } - echomaillogon = -1; + if (echomailfp != NULL) { + fclose(echomailfp); + echomailfp = NULL; + } + echomaillogon = -1; } -echomaillog() +echomaillog() { - if (echomaillogon ==0) return; - if (echomaillogon == -1) { - if (!isfile(ECHOMAIL)) { - echomaillogon = 0; - return; + if (echomaillogon == 0) + return; + if (echomaillogon == -1) { + if (!isfile(ECHOMAIL)) { + echomaillogon = 0; + return; + } + echomaillogon = 1; } - echomaillogon = 1; - } - - if (echomailfp == NULL) { - echomailfp = fopen(ECHOMAIL,"a"); - } - - if( echomailfp != NULL ) { - fprintf(echomailfp,"\n"); - fprintf(echomailfp,"發信人: %s, 信區: %s\n", FROM, GROUPS); + if (echomailfp == NULL) { + echomailfp = fopen(ECHOMAIL, "a"); + } + if (echomailfp != NULL) { + fprintf(echomailfp, "\n"); + fprintf(echomailfp, "發信人: %s, 信區: %s\n", FROM, GROUPS); str_decode_M3(SUBJECT); - fprintf(echomailfp,"標 題: %s\n", SUBJECT); - fprintf(echomailfp,"發信站: %s (%s)\n", SITE, DATE); - fprintf(echomailfp,"轉信站: %s (%s)\n", PATH, REMOTEHOSTNAME); + fprintf(echomailfp, "標 題: %s\n", SUBJECT); + fprintf(echomailfp, "發信站: %s (%s)\n", SITE, DATE); + fprintf(echomailfp, "轉信站: %s (%s)\n", PATH, REMOTEHOSTNAME); fflush(echomailfp); - } + } } -int headercmp(a,b) -header_t *a, *b; +int +headercmp(a, b) + header_t *a, *b; { - return strcasecmp(a->name, b->name); + return strcasecmp(a->name, b->name); } -int readlines(client) -ClientType *client; +int +readlines(client) + ClientType *client; { - int fd = client->fd; - char *buffer = client->buffer; - buffer_t *in = &client->in; - char *front = in->data, *ptr, *hptr; - int i; - - for (i=0; i < LASTHEADER; i++ ) - HEADER[i] = NULL; - for (ptr = (char*)strchr(in->data,'\n'); ptr != NULL && *ptr != '\0' ; front = ptr+1, ptr = (char*)strchr(front,'\n')) { + int fd = client->fd; + char *buffer = client->buffer; + buffer_t *in = &client->in; + char *front = in->data, *ptr, *hptr; + int i; + + for (i = 0; i < LASTHEADER; i++) + HEADER[i] = NULL; + for (ptr = (char *)strchr(in->data, '\n'); ptr != NULL && *ptr != '\0'; front = ptr + 1, ptr = (char *)strchr(front, '\n')) { *ptr = '\0'; - if (front[0] == '\r' || front[1] == '\n') { - BODY = front+2; - break; - } - hptr = (char*)strchr(front,':'); + if (front[0] == '\r' || front[1] == '\n') { + BODY = front + 2; + break; + } + hptr = (char *)strchr(front, ':'); if (hptr != NULL && hptr[1] == ' ') { - int value; - *hptr = '\0'; - value = headervalue(front); - if (value != -1) { - char *tp; - HEADER[value] = hptr + 2; - if ((tp = (char*)strchr(HEADER[value],'\r'))!=NULL) - *tp = '\0'; - } - *hptr = ':'; + int value; + *hptr = '\0'; + value = headervalue(front); + if (value != -1) { + char *tp; + HEADER[value] = hptr + 2; + if ((tp = (char *)strchr(HEADER[value], '\r')) != NULL) + *tp = '\0'; + } + *hptr = ':'; } /**ptr = '\n';*/ } NNTPHOST = HEADER[NNTPHOST_H]; - PATH = HEADER[PATH_H]; - FROM = HEADER[FROM_H]; - GROUPS = HEADER[NEWSGROUPS_H]; - SUBJECT = HEADER[SUBJECT_H]; - DATE = HEADER[DATE_H]; - SITE = HEADER[ORGANIZATION_H]; - MSGID = HEADER[MID_H]; - CONTROL = HEADER[CONTROL_H]; + PATH = HEADER[PATH_H]; + FROM = HEADER[FROM_H]; + GROUPS = HEADER[NEWSGROUPS_H]; + SUBJECT = HEADER[SUBJECT_H]; + DATE = HEADER[DATE_H]; + SITE = HEADER[ORGANIZATION_H]; + MSGID = HEADER[MID_H]; + CONTROL = HEADER[CONTROL_H]; POSTHOST = HEADER[NNTPPOSTINGHOST_H]; if (POSTHOST == NULL) { - if (HEADER[X_Auth_From_H] != NULL) { - POSTHOST = HEADER[X_Auth_From_H]; - HEADER[NNTPPOSTINGHOST_H] = POSTHOST; - } + if (HEADER[X_Auth_From_H] != NULL) { + POSTHOST = HEADER[X_Auth_From_H]; + HEADER[NNTPPOSTINGHOST_H] = POSTHOST; + } } #ifdef PalmBBS - XPATH = PATH; - XHEADER = HEADER; + XPATH = PATH; + XHEADER = HEADER; #endif } -int headervalue(inputheader) -char *inputheader; +int +headervalue(inputheader) + char *inputheader; { - header_t key, *findkey; - static int hasinit=0; + header_t key, *findkey; + static int hasinit = 0; - if (hasinit == 0) { - article_init(); - hasinit = 1; - } - - key.name = inputheader; - findkey = ( header_t *)bsearch ( - (char *) &key, (char *) headertable, - sizeof(headertable)/ sizeof(header_t), sizeof (key), - headercmp); - if (findkey != NULL) return findkey->id; - return -1; + if (hasinit == 0) { + article_init(); + hasinit = 1; + } + key.name = inputheader; + findkey = (header_t *) bsearch( + (char *)&key, (char *)headertable, + sizeof(headertable) / sizeof(header_t), sizeof(key), + headercmp); + if (findkey != NULL) + return findkey->id; + return -1; } article_init() { - int i; - static int article_inited = 0; + int i; + static int article_inited = 0; - if (article_inited) return; - article_inited = 1; + if (article_inited) + return; + article_inited = 1; - qsort(headertable, sizeof(headertable)/ sizeof(header_t), sizeof(header_t), - headercmp); - for (i=0; i < LASTHEADER; i++ ) - HEADER[i] = NULL; + qsort(headertable, sizeof(headertable) / sizeof(header_t), sizeof(header_t), + headercmp); + for (i = 0; i < LASTHEADER; i++) + HEADER[i] = NULL; } #ifdef INNTOBBS_MAIN main() { - int i,j,k,l,m,n,o,p,q; - article_init(); + int i, j, k, l, m, n, o, p, q; + article_init(); i = headervalue("Subject"); j = headervalue("From"); k = headervalue("Date"); diff --git a/innbbsd/inntobbs.h b/innbbsd/inntobbs.h index 1026e6d7..6d910252 100644 --- a/innbbsd/inntobbs.h +++ b/innbbsd/inntobbs.h @@ -2,36 +2,36 @@ #define INNTOBBS_H enum HeaderValue { -SUBJECT_H, FROM_H, DATE_H, MID_H, NEWSGROUPS_H, -NNTPPOSTINGHOST_H, NNTPHOST_H, CONTROL_H, PATH_H, -ORGANIZATION_H, X_Auth_From_H, APPROVED_H, DISTRIBUTION_H, -REFERENCES_H, KEYWORDS_H, SUMMARY_H, -LASTHEADER, + SUBJECT_H, FROM_H, DATE_H, MID_H, NEWSGROUPS_H, + NNTPPOSTINGHOST_H, NNTPHOST_H, CONTROL_H, PATH_H, + ORGANIZATION_H, X_Auth_From_H, APPROVED_H, DISTRIBUTION_H, + REFERENCES_H, KEYWORDS_H, SUMMARY_H, + LASTHEADER, }; #if !defined(PalmBBS) -extern char *HEADER[]; -extern char *BODY; -extern char *FROM, *SUBJECT, *SITE, *DATE, *POSTHOST, - *NNTPHOST, *PATH, *GROUPS, *MSGID, *CONTROL; -extern char *REMOTEHOSTNAME, *REMOTEUSERNAME; +extern char *HEADER[]; +extern char *BODY; +extern char *FROM, *SUBJECT, *SITE, *DATE, *POSTHOST, *NNTPHOST, *PATH, + *GROUPS, *MSGID, *CONTROL; +extern char *REMOTEHOSTNAME, *REMOTEUSERNAME; #else -extern char **XHEADER; -extern char *BODY; -extern char *FROM, *SUBJECT, *SITE, *DATE, *POSTHOST, - *NNTPHOST, *XPATH, *GROUPS, *MSGID, *CONTROL; -extern char *REMOTEHOSTNAME, *REMOTEUSERNAME; +extern char **XHEADER; +extern char *BODY; +extern char *FROM, *SUBJECT, *SITE, *DATE, *POSTHOST, *NNTPHOST, *XPATH, + *GROUPS, *MSGID, *CONTROL; +extern char *REMOTEHOSTNAME, *REMOTEUSERNAME; #endif -int receive_article(); +int receive_article(); #if defined(PalmBBS) #ifndef INNTOBBS #ifndef PATH -# define PATH XPATH +#define PATH XPATH #endif #ifndef HEADER -# define HEADER XHEADER +#define HEADER XHEADER #endif #endif #endif diff --git a/innbbsd/mkhistory.c b/innbbsd/mkhistory.c index 4be980ea..fb400adf 100644 --- a/innbbsd/mkhistory.c +++ b/innbbsd/mkhistory.c @@ -1,13 +1,13 @@ #include "innbbsconf.h" #include "bbslib.h" -main(argc,argv) -int argc; -char *argv[]; +main(argc, argv) + int argc; + char *argv[]; { if (argc < 2) { - fprintf(stderr,"Usage: %s history-file\n",argv[0]); - exit(1); + fprintf(stderr, "Usage: %s history-file\n", argv[0]); + exit(1); } initial_bbs(NULL); mkhistory(argv[1]); diff --git a/innbbsd/nntp.h b/innbbsd/nntp.h index 489f3502..78129d7c 100644 --- a/innbbsd/nntp.h +++ b/innbbsd/nntp.h @@ -1,26 +1,19 @@ -/* $Revision: 1.1 $ -** -** Here be a set of NNTP response codes as defined in RFC977 and elsewhere. -** The reponse codes are three digits, RFI, defined like this: -** R, Response: -** 1xx Informative message -** 2xx Command ok -** 3xx Command ok so far, send the rest of it. -** 4xx Command was correct, but couldn't be performed for -** some reason. -** 5xx Command unimplemented, or incorrect, or a serious -** program error occurred. -** F, Function: -** x0x Connection, setup, and miscellaneous messages -** x1x Newsgroup selection -** x2x Article selection -** x3x Distribution functions -** x4x Posting -** x8x Nonstandard extensions (AUTHINFO, XGTITLE) -** x9x Debugging output -** I, Information: -** No defined semantics -*/ +/* + * $Revision: 1.1 $ * + * + * Here be a set of NNTP response codes as defined in RFC977 and elsewhere. * + * The reponse codes are three digits, RFI, defined like this: * R, + * Response: * 1xx Informative message * 2xx + * Command ok * 3xx Command ok so far, send the rest of it. * + * xx Command was correct, but couldn't be performed for * + * ome reason. * 5xx Command unimplemented, or incorrect, + * or a serious * program error occurred. * F, + * Function: * x0x Connection, setup, and miscellaneous messages * + * 1x Newsgroup selection * x2x Article selection * + * 3x Distribution functions * x4x Posting * + * 8x Nonstandard extensions (AUTHINFO, XGTITLE) * x9x + * Debugging output * I, Information: * No defined semantics + */ #define NNTP_HELPOK_VAL 100 #define NNTP_BAD_COMMAND_VAL 500 #define NNTP_BAD_COMMAND "500 Syntax error or bad command" @@ -85,24 +78,23 @@ /* -** The first character of an NNTP reply can be used as a category class. -*/ + * * The first character of an NNTP reply can be used as a category class. + */ #define NNTP_CLASS_OK '2' #define NNTP_CLASS_ERROR '4' #define NNTP_CLASS_FATAL '5' /* -** The NNTP protocol currently has no way to say "offer me this article -** later, but don't close the connection." That will be fixed in NNTP2. -#define NNTP_RESENDIT_LATER "?" -#define NNTP_RESENDIT_LATER_VAL ? -*/ + * * The NNTP protocol currently has no way to say "offer me this article * + * later, but don't close the connection." That will be fixed in NNTP2. + * #define NNTP_RESENDIT_LATER "?" #define NNTP_RESENDIT_LATER_VAL + * */ /* -** Authentication commands from the RFC update (not official). -*/ + * * Authentication commands from the RFC update (not official). + */ #define NNTP_AUTH_NEEDED "480" #define NNTP_AUTH_NEEDED_VAL 480 #define NNTP_AUTH_BAD "481" @@ -113,33 +105,37 @@ #define NNTP_AUTH_REJECT_VAL 482 /* -** XGTITLE, from ANU news. -*/ + * * XGTITLE, from ANU news. + */ #define NNTP_XGTITLE_BAD 481 /* Yes, 481. */ #define NNTP_XGTITLE_OK 282 #define NNTP_STRLEN 512 /* -** For tin newsreader -*/ -#define OK_XINDEX 218 /* Tin style group index file follows */ -#define OK_XMOTD 217 /* Motd (message of the day) file follows */ -#define ERR_XINDEX 418 /* No tin style index file for newsgroup */ -#define ERR_XMOTD 417 /* No motd (message of the day) file */ + * * For tin newsreader + */ +#define OK_XINDEX 218 /* Tin style group index file + * follows */ +#define OK_XMOTD 217 /* Motd (message of the day) + * file follows */ +#define ERR_XINDEX 418 /* No tin style index file + * for newsgroup */ +#define ERR_XMOTD 417 /* No motd (message of the + * day) file */ /* For DBZ server */ -#define NNTP_ADDHIST_OK 283 /* addhist OK */ -#define NNTP_GREPHIST_OK 284 /* grephist OK */ -#define NNTP_MIDCHECK_OK 285 /* grephist OK */ -#define NNTP_SHUTDOWN_OK 286 /* grephist OK */ -#define NNTP_RELOAD_OK 287 /* grephist OK */ -#define NNTP_MODE_OK 101 /* grephist OK */ -#define NNTP_VERBOSELOG_OK 289 /* grephist OK */ -#define NNTP_ADDHIST_BAD 483 /* addhist fail */ -#define NNTP_GREPHIST_BAD 484 /* grephist fail */ -#define NNTP_MIDCHECK_BAD 485 /* grephist fail */ -#define NNTP_SHUTDOWN_BAD 486 /* grephist fail */ -#define NNTP_RELOAD_BAD 487 /* grephist fail */ -#define NNTP_MODE_BAD 488 /* grephist fail */ -#define NNTP_VERBOSELOG_BAD 489 /* grephist fail */ +#define NNTP_ADDHIST_OK 283 /* addhist OK */ +#define NNTP_GREPHIST_OK 284 /* grephist OK */ +#define NNTP_MIDCHECK_OK 285 /* grephist OK */ +#define NNTP_SHUTDOWN_OK 286 /* grephist OK */ +#define NNTP_RELOAD_OK 287 /* grephist OK */ +#define NNTP_MODE_OK 101 /* grephist OK */ +#define NNTP_VERBOSELOG_OK 289 /* grephist OK */ +#define NNTP_ADDHIST_BAD 483 /* addhist fail */ +#define NNTP_GREPHIST_BAD 484 /* grephist fail */ +#define NNTP_MIDCHECK_BAD 485 /* grephist fail */ +#define NNTP_SHUTDOWN_BAD 486 /* grephist fail */ +#define NNTP_RELOAD_BAD 487 /* grephist fail */ +#define NNTP_MODE_BAD 488 /* grephist fail */ +#define NNTP_VERBOSELOG_BAD 489 /* grephist fail */ diff --git a/innbbsd/pmain.c b/innbbsd/pmain.c index 39ddba22..d86dc88e 100644 --- a/innbbsd/pmain.c +++ b/innbbsd/pmain.c @@ -1,62 +1,61 @@ #include "innbbsconf.h" #include "daemon.h" -/*char *AccessFile=ACCESSFILE;*/ +/* char *AccessFile=ACCESSFILE; */ #define INNBBSDPORT1 "1904" #define INNBBSDPORT2 "1234" #define INNBBSDPATH1 ".innbbsd1" #define INNBBSDPATH2 ".innbbsd2" pmain(port) -char *port; + char *port; { if (port == NULL) { - int rel; -/* installbbstalkd(); */ - fprintf(stderr,"Trying to listen in port %s\n",INNBBSDPORT1); - rel = open_listen(INNBBSDPORT1,"tcp",NULL); + int rel; + /* installbbstalkd(); */ + fprintf(stderr, "Trying to listen in port %s\n", INNBBSDPORT1); + rel = open_listen(INNBBSDPORT1, "tcp", NULL); #ifdef DEBUG - printf("port fd %d allocated\n",rel); + printf("port fd %d allocated\n", rel); #endif - if (rel<0) { - fprintf(stderr,"Trying to listen in port %s\n",INNBBSDPORT2); - return open_listen(INNBBSDPORT2,"tcp",NULL); + if (rel < 0) { + fprintf(stderr, "Trying to listen in port %s\n", INNBBSDPORT2); + return open_listen(INNBBSDPORT2, "tcp", NULL); } return rel; } else { #ifdef DEBUG printf("start to allocate port\n"); #endif - return open_listen(port,"tcp",NULL); - } + return open_listen(port, "tcp", NULL); + } } p_unix_main(path) -char *path; + char *path; { if (path == NULL) { - int rel; -/* installbbstalkd(); */ - fprintf(stderr,"Trying to listen in port %s\n",INNBBSDPATH1); - rel = open_unix_listen(INNBBSDPATH1,"tcp",NULL); + int rel; + /* installbbstalkd(); */ + fprintf(stderr, "Trying to listen in port %s\n", INNBBSDPATH1); + rel = open_unix_listen(INNBBSDPATH1, "tcp", NULL); #ifdef DEBUG - printf("port fd %d allocated\n",rel); + printf("port fd %d allocated\n", rel); #endif - if (rel<0) { - fprintf(stderr,"Trying to listen in port %s\n",INNBBSDPATH2); - return open_listen(INNBBSDPATH2,"tcp",NULL); + if (rel < 0) { + fprintf(stderr, "Trying to listen in port %s\n", INNBBSDPATH2); + return open_listen(INNBBSDPATH2, "tcp", NULL); } return rel; } else { #ifdef DEBUG printf("start to allocate path %s\n", path); #endif - int fd = unixclient(path,"tcp"); - if (fd < 0) - unlink(path); - else - close(fd); - return open_unix_listen(path,"tcp",NULL); - } + int fd = unixclient(path, "tcp"); + if (fd < 0) + unlink(path); + else + close(fd); + return open_unix_listen(path, "tcp", NULL); + } } - diff --git a/innbbsd/port.c b/innbbsd/port.c index 65e91fa4..8962ea14 100644 --- a/innbbsd/port.c +++ b/innbbsd/port.c @@ -5,24 +5,29 @@ #include <sys/resource.h> getdtablesize() { - struct rlimit limit; - if (getrlimit(RLIMIT_NOFILE, &limit) >= 0){ - return limit.rlim_cur; - } - return -1; + struct rlimit limit; + if (getrlimit(RLIMIT_NOFILE, &limit) >= 0) { + return limit.rlim_cur; + } + return -1; } #endif #if defined(SYSV) && !defined(WITH_RECORD_O) #include <fcntl.h> flock(fd, op) -int fd,op; + int fd, op; { - switch (op) { - case LOCK_EX: op = F_LOCK; break; - case LOCK_UN: op = F_ULOCK; break; - default: return -1; - } - return lockf(fd, op, 0L); + switch (op) { + case LOCK_EX: + op = F_LOCK; + break; + case LOCK_UN: + op = F_ULOCK; + break; + default: + return -1; + } + return lockf(fd, op, 0L); } #endif diff --git a/innbbsd/receive_article.c b/innbbsd/receive_article.c index f45fda75..cd3f23e7 100644 --- a/innbbsd/receive_article.c +++ b/innbbsd/receive_article.c @@ -1,16 +1,16 @@ /* * BBS implementation dependendent part - * + * * The only two interfaces you must provide - * + * * #include "inntobbs.h" int receive_article(); 0 success not 0 fail - * + * * if (storeDB(HEADER[MID_H], hispaths) < 0) { .... fail } - * + * * int cancel_article_front( char *msgid ); 0 success not 0 fail - * + * * char *ptr = (char*)DBfetch(msgid); - * + * * 收到之文章內容 (body)在 char *BODY, 檔頭 (header)在 char *HEADER[] SUBJECT_H, * FROM_H, DATE_H, MID_H, NEWSGROUPS_H, NNTPPOSTINGHOST_H, NNTPHOST_H, * CONTROL_H, PATH_H, ORGANIZATION_H @@ -18,7 +18,7 @@ /* * Sample Implementation - * + * * receive_article() --> post_article() --> bbspost_write_post(); * cacnel_article_front(mid) --> cancel_article() --> bbspost_write_cancel(); */ @@ -31,9 +31,9 @@ #include "inntobbs.h" #include "antisplam.h" -extern int Junkhistory; +extern int Junkhistory; -char *post_article ARG((char *, char *, char *, int (*) (), char *, char *)); +char *post_article ARG((char *, char *, char *, int (*) (), char *, char *)); int cancel_article ARG((char *, char *, char *)); @@ -44,8 +44,8 @@ int cancel_article ARG((char *, char *, char *)); #else report() { - /* Function called from record.o */ - /* Please leave this function empty */ + /* Function called from record.o */ + /* Please leave this function empty */ } #endif @@ -53,712 +53,613 @@ report() #if defined(PalmBBS) #ifndef PATH -# define PATH XPATH +#define PATH XPATH #endif #ifndef HEADER -# define HEADER XHEADER +#define HEADER XHEADER #endif #endif /* process post write */ bbspost_write_post(fh, board, filename) - int fh; - char *board; - char *filename; + int fh; + char *board; + char *filename; { - char *fptr, *ptr; - FILE *fhfd = fdopen(fh, "w"); + char *fptr, *ptr; + FILE *fhfd = fdopen(fh, "w"); - if (fhfd == NULL) - { - bbslog("can't fdopen, maybe disk full\n"); - return -1; - } - - fprintf(fhfd, "發信人: %.60s, 看板: %s\n", FROM, board); - fprintf(fhfd, "標 題: %.70s\n", SUBJECT); - fprintf(fhfd, "發信站: %.43s (%s)\n", SITE, DATE); - fprintf(fhfd, "轉信站: %.70s\n", PATH); + if (fhfd == NULL) { + bbslog("can't fdopen, maybe disk full\n"); + return -1; + } + fprintf(fhfd, "發信人: %.60s, 看板: %s\n", FROM, board); + fprintf(fhfd, "標 題: %.70s\n", SUBJECT); + fprintf(fhfd, "發信站: %.43s (%s)\n", SITE, DATE); + fprintf(fhfd, "轉信站: %.70s\n", PATH); #ifndef MapleBBS - if (POSTHOST != NULL) - { - fprintf(fhfd, "Origin: %.70s\n", POSTHOST); - } + if (POSTHOST != NULL) { + fprintf(fhfd, "Origin: %.70s\n", POSTHOST); + } #endif - fprintf(fhfd, "\n"); - for (fptr = BODY, ptr = strchr(fptr, '\r'); ptr != NULL && *ptr != '\0'; fptr = ptr + 1, ptr = strchr(fptr, '\r')) - { - int ch = *ptr; - *ptr = '\0'; + fprintf(fhfd, "\n"); + for (fptr = BODY, ptr = strchr(fptr, '\r'); ptr != NULL && *ptr != '\0'; fptr = ptr + 1, ptr = strchr(fptr, '\r')) { + int ch = *ptr; + *ptr = '\0'; + fputs(fptr, fhfd); + *ptr = ch; + } fputs(fptr, fhfd); - *ptr = ch; - } - fputs(fptr, fhfd); - fflush(fhfd); - fclose(fhfd); - return 0; + fflush(fhfd); + fclose(fhfd); + return 0; } #ifdef KEEP_NETWORK_CANCEL /* process cancel write */ bbspost_write_cancel(fh, board, filename) - int fh; - char *board, *filename; + int fh; + char *board, *filename; { - char *fptr, *ptr; - FILE *fhfd = fdopen(fh, "w"), *fp; - char buffer[256]; - - if (fhfd == NULL) - { - bbslog("can't fdopen, maybe disk full\n"); - return -1; - } - - fprintf(fhfd, "發信人: %s, 信區: %s\n", FROM, board); - fprintf(fhfd, "標 題: %s\n", SUBJECT); - fprintf(fhfd, "發信站: %.43s (%s)\n", SITE, DATE); - fprintf(fhfd, "轉信站: %.70s\n", PATH); - if (HEADER[CONTROL_H] != NULL) - { - fprintf(fhfd, "Control: %s\n", HEADER[CONTROL_H]); - } - if (POSTHOST != NULL) - { - fprintf(fhfd, "Origin: %s\n", POSTHOST); - } - fprintf(fhfd, "\n"); - for (fptr = BODY, ptr = strchr(fptr, '\r'); ptr != NULL && *ptr != '\0'; fptr = ptr + 1, ptr = strchr(fptr, '\r')) - { - int ch = *ptr; - *ptr = '\0'; - fputs(fptr, fhfd); - *ptr = ch; - } - fputs(fptr, fhfd); - if (POSTHOST != NULL) - { - fprintf(fhfd, "\n * Origin: ● %.26s ● From: %.40s\n", SITE, POSTHOST); - } - fprintf(fhfd, "\n---------------------\n"); - fp = fopen(filename, "r"); - if (fp == NULL) - { - bbslog("can't open %s\n", filename); - return -1; - } - while (fgets(buffer, sizeof buffer, fp) != NULL) - { - fputs(buffer, fhfd); - } - fclose(fp); - fflush(fhfd); - fclose(fhfd); - - { - fp = fopen(filename, "w"); - if (fp == NULL) - { - bbslog("can't write %s\n", filename); - return -1; + char *fptr, *ptr; + FILE *fhfd = fdopen(fh, "w"), *fp; + char buffer[256]; + + if (fhfd == NULL) { + bbslog("can't fdopen, maybe disk full\n"); + return -1; } - fprintf(fp, "發信人: %s, 信區: %s\n", FROM, board); - fprintf(fp, "標 題: %.70s\n", SUBJECT); - fprintf(fp, "發信站: %.43s (%s)\n", SITE, DATE); - fprintf(fp, "轉信站: %.70s\n", PATH); - if (POSTHOST != NULL) - { - fprintf(fhfd, "Origin: %s\n", POSTHOST); + fprintf(fhfd, "發信人: %s, 信區: %s\n", FROM, board); + fprintf(fhfd, "標 題: %s\n", SUBJECT); + fprintf(fhfd, "發信站: %.43s (%s)\n", SITE, DATE); + fprintf(fhfd, "轉信站: %.70s\n", PATH); + if (HEADER[CONTROL_H] != NULL) { + fprintf(fhfd, "Control: %s\n", HEADER[CONTROL_H]); } - if (HEADER[CONTROL_H] != NULL) - { - fprintf(fhfd, "Control: %s\n", HEADER[CONTROL_H]); + if (POSTHOST != NULL) { + fprintf(fhfd, "Origin: %s\n", POSTHOST); } - fprintf(fp, "\n"); - for (fptr = BODY, ptr = strchr(fptr, '\r'); ptr != NULL && *ptr != '\0'; fptr = ptr + 1, ptr = strchr(fptr, '\r')) - { - *ptr = '\0'; - fputs(fptr, fp); + fprintf(fhfd, "\n"); + for (fptr = BODY, ptr = strchr(fptr, '\r'); ptr != NULL && *ptr != '\0'; fptr = ptr + 1, ptr = strchr(fptr, '\r')) { + int ch = *ptr; + *ptr = '\0'; + fputs(fptr, fhfd); + *ptr = ch; } - fputs(fptr, fp); - if (POSTHOST != NULL) - { - fprintf(fp, "\n * Origin: ● %.26s ● From: %.40s\n", SITE, POSTHOST); + fputs(fptr, fhfd); + if (POSTHOST != NULL) { + fprintf(fhfd, "\n * Origin: ● %.26s ● From: %.40s\n", SITE, POSTHOST); + } + fprintf(fhfd, "\n---------------------\n"); + fp = fopen(filename, "r"); + if (fp == NULL) { + bbslog("can't open %s\n", filename); + return -1; + } + while (fgets(buffer, sizeof buffer, fp) != NULL) { + fputs(buffer, fhfd); } fclose(fp); - } - return 0; + fflush(fhfd); + fclose(fhfd); + + { + fp = fopen(filename, "w"); + if (fp == NULL) { + bbslog("can't write %s\n", filename); + return -1; + } + fprintf(fp, "發信人: %s, 信區: %s\n", FROM, board); + fprintf(fp, "標 題: %.70s\n", SUBJECT); + fprintf(fp, "發信站: %.43s (%s)\n", SITE, DATE); + fprintf(fp, "轉信站: %.70s\n", PATH); + if (POSTHOST != NULL) { + fprintf(fhfd, "Origin: %s\n", POSTHOST); + } + if (HEADER[CONTROL_H] != NULL) { + fprintf(fhfd, "Control: %s\n", HEADER[CONTROL_H]); + } + fprintf(fp, "\n"); + for (fptr = BODY, ptr = strchr(fptr, '\r'); ptr != NULL && *ptr != '\0'; fptr = ptr + 1, ptr = strchr(fptr, '\r')) { + *ptr = '\0'; + fputs(fptr, fp); + } + fputs(fptr, fp); + if (POSTHOST != NULL) { + fprintf(fp, "\n * Origin: ● %.26s ● From: %.40s\n", SITE, POSTHOST); + } + fclose(fp); + } + return 0; } #endif bbspost_write_control(fh, board, filename) - int fh; - char *board; - char *filename; + int fh; + char *board; + char *filename; { - char *fptr, *ptr; - FILE *fhfd = fdopen(fh, "w"); - - if (fhfd == NULL) - { - bbslog("can't fdopen, maybe disk full\n"); - return -1; - } - - fprintf(fhfd, "Path: %s!%s\n", MYBBSID, HEADER[PATH_H]); - fprintf(fhfd, "From: %s\n", FROM); - fprintf(fhfd, "Newsgroups: %s\n", GROUPS); - fprintf(fhfd, "Subject: %s\n", SUBJECT); - fprintf(fhfd, "Date: %s\n", DATE); - fprintf(fhfd, "Organization: %s\n", SITE); - if (POSTHOST != NULL) - { - fprintf(fhfd, "NNTP-Posting-Host: %.70s\n", POSTHOST); - } - if (HEADER[CONTROL_H] != NULL) - { - fprintf(fhfd, "Control: %s\n", HEADER[CONTROL_H]); - } - if (HEADER[APPROVED_H] != NULL) - { - fprintf(fhfd, "Approved: %s\n", HEADER[APPROVED_H]); - } - if (HEADER[DISTRIBUTION_H] != NULL) - { - fprintf(fhfd, "Distribution: %s\n", HEADER[DISTRIBUTION_H]); - } - fprintf(fhfd, "\n"); - for (fptr = BODY, ptr = strchr(fptr, '\r'); ptr != NULL && *ptr != '\0'; fptr = ptr + 1, ptr = strchr(fptr, '\r')) - { - int ch = *ptr; - *ptr = '\0'; + char *fptr, *ptr; + FILE *fhfd = fdopen(fh, "w"); + + if (fhfd == NULL) { + bbslog("can't fdopen, maybe disk full\n"); + return -1; + } + fprintf(fhfd, "Path: %s!%s\n", MYBBSID, HEADER[PATH_H]); + fprintf(fhfd, "From: %s\n", FROM); + fprintf(fhfd, "Newsgroups: %s\n", GROUPS); + fprintf(fhfd, "Subject: %s\n", SUBJECT); + fprintf(fhfd, "Date: %s\n", DATE); + fprintf(fhfd, "Organization: %s\n", SITE); + if (POSTHOST != NULL) { + fprintf(fhfd, "NNTP-Posting-Host: %.70s\n", POSTHOST); + } + if (HEADER[CONTROL_H] != NULL) { + fprintf(fhfd, "Control: %s\n", HEADER[CONTROL_H]); + } + if (HEADER[APPROVED_H] != NULL) { + fprintf(fhfd, "Approved: %s\n", HEADER[APPROVED_H]); + } + if (HEADER[DISTRIBUTION_H] != NULL) { + fprintf(fhfd, "Distribution: %s\n", HEADER[DISTRIBUTION_H]); + } + fprintf(fhfd, "\n"); + for (fptr = BODY, ptr = strchr(fptr, '\r'); ptr != NULL && *ptr != '\0'; fptr = ptr + 1, ptr = strchr(fptr, '\r')) { + int ch = *ptr; + *ptr = '\0'; + fputs(fptr, fhfd); + *ptr = ch; + } fputs(fptr, fhfd); - *ptr = ch; - } - fputs(fptr, fhfd); - fflush(fhfd); - fclose(fhfd); - return 0; + fflush(fhfd); + fclose(fhfd); + return 0; } -time_t datevalue; +time_t datevalue; /* process cancel write */ receive_article() { - int i; - char *user, *userptr; - char *ngptr, *nngptr, *pathptr; - char **splitptr; - static char userid[32]; - static char xdate[32]; - static char xpath[180]; - newsfeeds_t *nf; - char *boardhome; - char hispaths[4096]; - char firstpath[MAXPATHLEN], *firstpathbase; - char *lesssym, *nameptrleft, *nameptrright; - static char sitebuf[80]; + int i; + char *user, *userptr; + char *ngptr, *nngptr, *pathptr; + char **splitptr; + static char userid[32]; + static char xdate[32]; + static char xpath[180]; + newsfeeds_t *nf; + char *boardhome; + char hispaths[4096]; + char firstpath[MAXPATHLEN], *firstpathbase; + char *lesssym, *nameptrleft, *nameptrright; + static char sitebuf[80]; #ifdef HMM_USE_ANTI_SPAM - char *notitle[] = + char *notitle[] = {"行銷", "業務代表", "徵", "資訊", "免費", "大贈送", "傳銷", "未滿", - "年費", "傳呼", "價", "操你媽", "未成年", "馬賽克", "信用", "賺錢", - "=?", "!!!", - "操你", "操你", "幹妳", "操妳","**","★★","**","$$","泡麵", NULL}, - *nofrom[] = - {"TaipeiNet.Net", "hotmail.com", "mt.touc.edu.tw", "ms11.hinet.net", NULL}, - *nocont[] = + "年費", "傳呼", "價", "操你媽", "未成年", "馬賽克", "信用", "賺錢", + "=?", "!!!", + "操你", "操你", "幹妳", "操妳", "**", "★★", "**", "$$", "泡麵", NULL}, + *nofrom[] = + {"TaipeiNet.Net", "hotmail.com", "mt.touc.edu.tw", "ms11.hinet.net", NULL}, + *nocont[] = {"名額有限", "優惠價", "動作要快", "訂購", "特價", "專賣", "BBC", - "幹你", "操你", "幹妳", "操妳","每片","最新目錄", "http://", "收錢", - "創業", "付款", "廣告信", "只賣", "市價", "NCg", "ICAg", NULL}; + "幹你", "操你", "幹妳", "操妳", "每片", "最新目錄", "http://", "收錢", + "創業", "付款", "廣告信", "只賣", "市價", "NCg", "ICAg", NULL}; #endif - if (FROM == NULL) - { - bbslog(":Err: article without usrid %s\n", MSGID); - return 0; - } - else - { + if (FROM == NULL) { + bbslog(":Err: article without usrid %s\n", MSGID); + return 0; + } else { #ifdef HMM_USE_ANTI_SPAM - for(i=0; nofrom[i]; i++) - if(strstr(FROM, nofrom[i])) - { - morelog_to(INNBBSD_SPAM, "spam from [%s]: %s\n", nofrom[i], FROM); - morelog_to(INNBBSD_SPAM, " %s %s %s %s\n", FROM, PATH, GROUPS, SUBJECT); - bbslog(":Ptt: spam from [%s]: %s\n", nofrom[i], FROM); - return 0; - } + for (i = 0; nofrom[i]; i++) + if (strstr(FROM, nofrom[i])) { + morelog_to(INNBBSD_SPAM, "spam from [%s]: %s\n", nofrom[i], FROM); + morelog_to(INNBBSD_SPAM, " %s %s %s %s\n", FROM, PATH, GROUPS, SUBJECT); + bbslog(":Ptt: spam from [%s]: %s\n", nofrom[i], FROM); + return 0; + } #endif - } + } - if(!BODY) - { - bbslog(":Err: article without body %s\n", MSGID); - return 0; - } - else - { + if (!BODY) { + bbslog(":Err: article without body %s\n", MSGID); + return 0; + } else { #ifdef HMM_USE_ANTI_SPAM - for(i=0; nocont[i]; i++) - if(strstr(BODY, nocont[i])) - { - morelog_to(INNBBSD_SPAM, "spam body [%s]: %s\n", nocont[i]); - morelog_to(INNBBSD_SPAM, " %s %s %s %s\n", FROM, PATH, GROUPS, SUBJECT); - bbslog(":Ptt: spam body [%s]: %s\n", nocont[i]); - return 0; - } + for (i = 0; nocont[i]; i++) + if (strstr(BODY, nocont[i])) { + morelog_to(INNBBSD_SPAM, "spam body [%s]: %s\n", nocont[i]); + morelog_to(INNBBSD_SPAM, " %s %s %s %s\n", FROM, PATH, GROUPS, SUBJECT); + bbslog(":Ptt: spam body [%s]: %s\n", nocont[i]); + return 0; + } #endif - } + } - if(!SUBJECT) - { - bbslog(":Err: article without subject %s\n", MSGID); - return 0; - } - else - { + if (!SUBJECT) { + bbslog(":Err: article without subject %s\n", MSGID); + return 0; + } else { #ifdef HMM_USE_ANTI_SPAM - for(i=0; notitle[i]; i++) - if(strstr(SUBJECT, notitle[i])) - { - morelog_to(INNBBSD_SPAM, "spam title [%s]: %s\n", notitle[i], SUBJECT); - morelog_to(INNBBSD_SPAM, " %s %s %s %s\n", FROM, PATH, GROUPS, SUBJECT); - bbslog(":Ptt: spam title [%s]: %s\n", notitle[i], SUBJECT); - return 0; - } + for (i = 0; notitle[i]; i++) + if (strstr(SUBJECT, notitle[i])) { + morelog_to(INNBBSD_SPAM, "spam title [%s]: %s\n", notitle[i], SUBJECT); + morelog_to(INNBBSD_SPAM, " %s %s %s %s\n", FROM, PATH, GROUPS, SUBJECT); + bbslog(":Ptt: spam title [%s]: %s\n", notitle[i], SUBJECT); + return 0; + } #endif - } - - - user = (char *) strchr(FROM, '@'); - lesssym = (char *) strchr(FROM, '<'); - nameptrleft = NULL, nameptrright = NULL; - if (lesssym == NULL || lesssym >= user) - { - lesssym = FROM; - nameptrleft = strchr(FROM, '('); - if (nameptrleft != NULL) - nameptrleft++; - nameptrright = strrchr(FROM, ')'); - } - else - { - nameptrleft = FROM; - nameptrright = strrchr(FROM, '<'); - lesssym++; - } - if (user != NULL) - { - *user = '\0'; - userptr = (char *) strchr(FROM, '.'); - if (userptr != NULL) - { - *userptr = '\0'; - strncpy(userid, lesssym, sizeof userid); - *userptr = '.'; } - else + + + user = (char *)strchr(FROM, '@'); + lesssym = (char *)strchr(FROM, '<'); + nameptrleft = NULL, nameptrright = NULL; + if (lesssym == NULL || lesssym >= user) { + lesssym = FROM; + nameptrleft = strchr(FROM, '('); + if (nameptrleft != NULL) + nameptrleft++; + nameptrright = strrchr(FROM, ')'); + } else { + nameptrleft = FROM; + nameptrright = strrchr(FROM, '<'); + lesssym++; + } + if (user != NULL) { + *user = '\0'; + userptr = (char *)strchr(FROM, '.'); + if (userptr != NULL) { + *userptr = '\0'; + strncpy(userid, lesssym, sizeof userid); + *userptr = '.'; + } else { + strncpy(userid, lesssym, sizeof userid); + } + *user = '@'; + } else { + strncpy(userid, lesssym, sizeof userid); + } + strcat(userid, "."); + { - strncpy(userid, lesssym, sizeof userid); + struct tm tmbuf; + + strptime(DATE, "%d %b %Y %X GMT", &tmbuf); + datevalue = timegm(&tmbuf); } - *user = '@'; - } - else - { - strncpy(userid, lesssym, sizeof userid); - } - strcat(userid, "."); - - { - struct tm tmbuf; - - strptime(DATE, "%d %b %Y %X GMT", &tmbuf); - datevalue = timegm(&tmbuf); - } - - if (datevalue > 0) - { - char *p; - strncpy(xdate, ctime(&datevalue), sizeof(xdate)); - p = (char *) strchr(xdate, '\n'); - if (p != NULL) - *p = '\0'; - DATE = xdate; - } + if (datevalue > 0) { + char *p; + strncpy(xdate, ctime(&datevalue), sizeof(xdate)); + p = (char *)strchr(xdate, '\n'); + if (p != NULL) + *p = '\0'; + DATE = xdate; + } #ifndef MapleBBS - if (SITE == NULL || *SITE == '\0') - { - if (nameptrleft != NULL && nameptrright != NULL) - { - char savech = *nameptrright; - *nameptrright = '\0'; - strncpy(sitebuf, nameptrleft, sizeof sitebuf); - *nameptrright = savech; - SITE = sitebuf; + if (SITE == NULL || *SITE == '\0') { + if (nameptrleft != NULL && nameptrright != NULL) { + char savech = *nameptrright; + *nameptrright = '\0'; + strncpy(sitebuf, nameptrleft, sizeof sitebuf); + *nameptrright = savech; + SITE = sitebuf; + } else + /* SITE = "(Unknown)"; */ + SITE = ""; + } + if (strlen(MYBBSID) > 70) { + bbslog(" :Err: your bbsid %s too long\n", MYBBSID); + return 0; } - else - /* SITE = "(Unknown)"; */ - SITE = ""; - } - if (strlen(MYBBSID) > 70) - { - bbslog(" :Err: your bbsid %s too long\n", MYBBSID); - return 0; - } #endif - sprintf(xpath, "%s!%.*s", MYBBSID, sizeof(xpath) - strlen(MYBBSID) - 2, PATH); - PATH = xpath; - for (pathptr = PATH; pathptr != NULL && (pathptr = strstr(pathptr, ".edu.tw")) != NULL;) - { - if (pathptr != NULL) - { - strcpy(pathptr, pathptr + 7); + sprintf(xpath, "%s!%.*s", MYBBSID, sizeof(xpath) - strlen(MYBBSID) - 2, PATH); + PATH = xpath; + for (pathptr = PATH; pathptr != NULL && (pathptr = strstr(pathptr, ".edu.tw")) != NULL;) { + if (pathptr != NULL) { + strcpy(pathptr, pathptr + 7); + } } - } - xpath[71] = '\0'; + xpath[71] = '\0'; #ifndef MapleBBS - echomaillog(); + echomaillog(); #endif - *hispaths = '\0'; - splitptr = (char **) BNGsplit(GROUPS); - firstpath[0] = '\0'; - firstpathbase = firstpath; + *hispaths = '\0'; + splitptr = (char **)BNGsplit(GROUPS); + firstpath[0] = '\0'; + firstpathbase = firstpath; - for (ngptr = *splitptr; ngptr != NULL; ngptr = *(++splitptr)) - { - char *boardptr, *nboardptr; + for (ngptr = *splitptr; ngptr != NULL; ngptr = *(++splitptr)) { + char *boardptr, *nboardptr; - if (*ngptr == '\0') - continue; - nf = (newsfeeds_t *) search_group(ngptr); - if (nf == NULL) - { - bbslog("unwanted \'%s\'\n", ngptr); - continue; + if (*ngptr == '\0') + continue; + nf = (newsfeeds_t *) search_group(ngptr); + if (nf == NULL) { + bbslog("unwanted \'%s\'\n", ngptr); + continue; + } + if (nf->board == NULL || !*nf->board) + continue; + if (nf->path == NULL || !*nf->path) + continue; + for (boardptr = nf->board, nboardptr = (char *)strchr(boardptr, ','); boardptr != NULL && *boardptr != '\0'; nboardptr = (char *)strchr(boardptr, ',')) { + if (nboardptr != NULL) { + *nboardptr = '\0'; + } + if (*boardptr == '\t') { + goto boardcont; + } + boardhome = (char *)fileglue("%s/boards/%c/%s", BBSHOME, boardptr[0], boardptr); + if (!isdir(boardhome)) { + bbslog(":Err: unable to write %s\n", boardhome); + } else { + char *fname; + /* + * if ( !isdir( boardhome )) { bbslog( ":Err: unable to write + * %s\n",boardhome); testandmkdir(boardhome); } + */ + fname = (char *)post_article(boardhome, userid, boardptr, + bbspost_write_post, NULL, firstpath); + if (fname != NULL) { + fname = (char *)fileglue("%s/%s", boardptr, fname); + if (firstpath[0] == '\0') { + sprintf(firstpath, "%s/boards/%c, %s", BBSHOME, fname[0], fname); + firstpathbase = firstpath + strlen(BBSHOME) + strlen("/boards/x/"); + } + if (strlen(fname) + strlen(hispaths) + 1 < sizeof(hispaths)) { + strcat(hispaths, fname); + strcat(hispaths, " "); + } + } else { + bbslog("fname is null %s\n", boardhome); + return -1; + } + } + + boardcont: + if (nboardptr != NULL) { + *nboardptr = ','; + boardptr = nboardptr + 1; + } else + break; + + } /* for board1,board2,... */ + /* + * if (nngptr != NULL) ngptr = nngptr + 1; else break; + */ + if (*firstpathbase) + feedfplog(nf, firstpathbase, 'P'); } - if (nf->board == NULL || !*nf->board) - continue; - if (nf->path == NULL || !*nf->path) - continue; - for (boardptr = nf->board, nboardptr = (char *) strchr(boardptr, ','); boardptr != NULL && *boardptr != '\0'; nboardptr = (char *) strchr(boardptr, ',')) - { - if (nboardptr != NULL) - { - *nboardptr = '\0'; - } - if (*boardptr == '\t') - { - goto boardcont; - } - boardhome = (char *) fileglue("%s/boards/%c/%s", BBSHOME, boardptr[0], boardptr); - if (!isdir(boardhome)) - { - bbslog(":Err: unable to write %s\n", boardhome); - } - else - { - char *fname; - /* - * if ( !isdir( boardhome )) { bbslog( ":Err: unable to write - * %s\n",boardhome); testandmkdir(boardhome); } - */ - fname = (char *) post_article(boardhome, userid, boardptr, - bbspost_write_post, NULL, firstpath); - if (fname != NULL) - { - fname = (char *) fileglue("%s/%s", boardptr, fname); - if (firstpath[0] == '\0') - { - sprintf(firstpath, "%s/boards/%c, %s", BBSHOME, fname[0], fname); - firstpathbase = firstpath + strlen(BBSHOME) + strlen("/boards/x/"); - } - if (strlen(fname) + strlen(hispaths) + 1 < sizeof(hispaths)) - { - strcat(hispaths, fname); - strcat(hispaths, " "); - } - } - else - { - bbslog("fname is null %s\n", boardhome); - return -1; - } - } - - boardcont: - if (nboardptr != NULL) - { - *nboardptr = ','; - boardptr = nboardptr + 1; - } - else - break; - - } /* for board1,board2,... */ - /* - * if (nngptr != NULL) ngptr = nngptr + 1; else break; - */ - if (*firstpathbase) - feedfplog(nf, firstpathbase, 'P'); - } - if (*hispaths) - bbsfeedslog(hispaths, 'P'); - - if (Junkhistory || *hispaths) - { - if (storeDB(HEADER[MID_H], hispaths) < 0) - { - bbslog("store DB fail\n"); - /* I suspect here will introduce duplicated articles */ - /* return -1; */ + if (*hispaths) + bbsfeedslog(hispaths, 'P'); + + if (Junkhistory || *hispaths) { + if (storeDB(HEADER[MID_H], hispaths) < 0) { + bbslog("store DB fail\n"); + /* I suspect here will introduce duplicated articles */ + /* return -1; */ + } } - } - return 0; + return 0; } receive_control() { - char *boardhome, *fname; - char firstpath[MAXPATHLEN], *firstpathbase; - char **splitptr, *ngptr; - newsfeeds_t *nf; - - bbslog("control post %s\n", HEADER[CONTROL_H]); - boardhome = (char *) fileglue("%s/boards/c/control", BBSHOME); - testandmkdir(boardhome); - *firstpath = '\0'; - if (isdir(boardhome)) - { - fname = (char *) post_article(boardhome, FROM, "control", bbspost_write_control, NULL, firstpath); - if (fname != NULL) - { - if (firstpath[0] == '\0') - sprintf(firstpath, "%s/boards/c/control/%s", BBSHOME, fname); - if (storeDB(HEADER[MID_H], (char *) fileglue("control/%s", fname)) < 0) - { - } - bbsfeedslog(fileglue("control/%s", fname), 'C'); - firstpathbase = firstpath + strlen(BBSHOME) + strlen("/boards/x/"); - splitptr = (char **) BNGsplit(GROUPS); - for (ngptr = *splitptr; ngptr != NULL; ngptr = *(++splitptr)) - { - if (*ngptr == '\0') - continue; - nf = (newsfeeds_t *) search_group(ngptr); - if (nf == NULL) - continue; - if (nf->board == NULL) - continue; - if (nf->path == NULL) - continue; - feedfplog(nf, firstpathbase, 'C'); - } + char *boardhome, *fname; + char firstpath[MAXPATHLEN], *firstpathbase; + char **splitptr, *ngptr; + newsfeeds_t *nf; + + bbslog("control post %s\n", HEADER[CONTROL_H]); + boardhome = (char *)fileglue("%s/boards/c/control", BBSHOME); + testandmkdir(boardhome); + *firstpath = '\0'; + if (isdir(boardhome)) { + fname = (char *)post_article(boardhome, FROM, "control", bbspost_write_control, NULL, firstpath); + if (fname != NULL) { + if (firstpath[0] == '\0') + sprintf(firstpath, "%s/boards/c/control/%s", BBSHOME, fname); + if (storeDB(HEADER[MID_H], (char *)fileglue("control/%s", fname)) < 0) { + } + bbsfeedslog(fileglue("control/%s", fname), 'C'); + firstpathbase = firstpath + strlen(BBSHOME) + strlen("/boards/x/"); + splitptr = (char **)BNGsplit(GROUPS); + for (ngptr = *splitptr; ngptr != NULL; ngptr = *(++splitptr)) { + if (*ngptr == '\0') + continue; + nf = (newsfeeds_t *) search_group(ngptr); + if (nf == NULL) + continue; + if (nf->board == NULL) + continue; + if (nf->path == NULL) + continue; + feedfplog(nf, firstpathbase, 'C'); + } + } } - } - return 0; + return 0; } cancel_article_front(msgid) - char *msgid; + char *msgid; { - char *ptr = (char *) DBfetch(msgid); - char *filelist, filename[2048]; - char histent[4096]; - char firstpath[MAXPATHLEN], *firstpathbase; - if (ptr == NULL) - { - bbslog("cancel failed(DBfetch): %s\n", msgid); - return 0; - } - strncpy(histent, ptr, sizeof histent); - ptr = histent; + char *ptr = (char *)DBfetch(msgid); + char *filelist, filename[2048]; + char histent[4096]; + char firstpath[MAXPATHLEN], *firstpathbase; + if (ptr == NULL) { + bbslog("cancel failed(DBfetch): %s\n", msgid); + return 0; + } + strncpy(histent, ptr, sizeof histent); + ptr = histent; #ifdef DEBUG - printf("**** try to cancel %s *****\n", ptr); + printf("**** try to cancel %s *****\n", ptr); #endif - filelist = strchr(ptr, '\t'); - if (filelist != NULL) - { - filelist++; - } - *firstpath = '\0'; - for (ptr = filelist; ptr && *ptr;) - { - char *file; - for (; *ptr && isspace(*ptr); ptr++); - if (*ptr == '\0') - break; - file = ptr; - for (ptr++; *ptr && !isspace(*ptr); ptr++); - if (*ptr != '\0') - { - *ptr++ = '\0'; + filelist = strchr(ptr, '\t'); + if (filelist != NULL) { + filelist++; } - sprintf(filename, "%s/boards/%c/%s", BBSHOME, file[0], file); - bbslog("cancel post %s\n", filename); - if (isfile(filename)) - { - FILE *fp = fopen(filename, "r"); - char buffer[1024]; - char xfrom0[100], xfrom[100], xpath[1024], *boardhome; - - if (fp == NULL) - continue; - strncpy(xfrom0, HEADER[FROM_H], 99); - xfrom0[99] = 0; - strtok(xfrom0, ", "); - while (fgets(buffer, sizeof buffer, fp) != NULL) - { - char *hptr; - if (buffer[0] == '\n') - break; - hptr = strchr(buffer, '\n'); - if (hptr != NULL) - *hptr = '\0'; - if (strncmp(buffer, "發信人: ", 8) == 0) - { - strncpy(xfrom, buffer + 8, 99); - xfrom[99] = 0; - strtok(xfrom, ", "); - } - else if (strncmp(buffer, "轉信站: ", 8) == 0) - { - strcpy(xpath, buffer + 8); - } - } - fclose(fp); - if (strcmp(xfrom0, xfrom)) - { - bbslog("Invalid cancel %s, path: %s!%s, [`%s` != `%s`]\n", - FROM, MYBBSID, PATH, xfrom0, xfrom); - return 0; - } - -#ifdef KEEP_NETWORK_CANCEL - bbslog("cancel post %s\n", filename); - boardhome = (char *) fileglue("%s/boards/d/deleted", BBSHOME); - testandmkdir(boardhome); - if (isdir(boardhome)) - { - char subject[1024]; - char *fname; - if (POSTHOST) - { - sprintf(subject, "cancel by: %.1000s", POSTHOST); - } - else - { - char *body, *body2; - body = strchr(BODY, '\r'); - if (body != NULL) - *body = '\0'; - body2 = strchr(BODY, '\n'); - if (body2 != NULL) - *body = '\0'; - sprintf(subject, "%.1000s", BODY); - if (body != NULL) - *body = '\r'; - if (body2 != NULL) - *body = '\n'; - } - if (*subject){ - SUBJECT = subject; + *firstpath = '\0'; + for (ptr = filelist; ptr && *ptr;) { + char *file; + for (; *ptr && isspace(*ptr); ptr++); + if (*ptr == '\0') + break; + file = ptr; + for (ptr++; *ptr && !isspace(*ptr); ptr++); + if (*ptr != '\0') { + *ptr++ = '\0'; } - fname = (char *) post_article(boardhome, FROM, "deleted", bbspost_write_cancel, filename, firstpath); - if (fname != NULL) - { - if (firstpath[0] == '\0') - { - sprintf(firstpath, "%s/boards/d/deleted/%s", BBSHOME, fname); - firstpathbase = firstpath + strlen(BBSHOME) + strlen("/boards/x/"); - } - if (storeDB(HEADER[MID_H], (char *) fileglue("deleted/%s", fname)) < 0) - { - /* should do something */ - bbslog("store DB fail\n"); - /* return -1; */ - } - bbsfeedslog(fileglue("deleted/%s", fname), 'D'); + sprintf(filename, "%s/boards/%c/%s", BBSHOME, file[0], file); + bbslog("cancel post %s\n", filename); + if (isfile(filename)) { + FILE *fp = fopen(filename, "r"); + char buffer[1024]; + char xfrom0[100], xfrom[100], xpath[1024], *boardhome; + + if (fp == NULL) + continue; + strncpy(xfrom0, HEADER[FROM_H], 99); + xfrom0[99] = 0; + strtok(xfrom0, ", "); + while (fgets(buffer, sizeof buffer, fp) != NULL) { + char *hptr; + if (buffer[0] == '\n') + break; + hptr = strchr(buffer, '\n'); + if (hptr != NULL) + *hptr = '\0'; + if (strncmp(buffer, "發信人: ", 8) == 0) { + strncpy(xfrom, buffer + 8, 99); + xfrom[99] = 0; + strtok(xfrom, ", "); + } else if (strncmp(buffer, "轉信站: ", 8) == 0) { + strcpy(xpath, buffer + 8); + } + } + fclose(fp); + if (strcmp(xfrom0, xfrom)) { + bbslog("Invalid cancel %s, path: %s!%s, [`%s` != `%s`]\n", + FROM, MYBBSID, PATH, xfrom0, xfrom); + return 0; + } +#ifdef KEEP_NETWORK_CANCEL + bbslog("cancel post %s\n", filename); + boardhome = (char *)fileglue("%s/boards/d/deleted", BBSHOME); + testandmkdir(boardhome); + if (isdir(boardhome)) { + char subject[1024]; + char *fname; + if (POSTHOST) { + sprintf(subject, "cancel by: %.1000s", POSTHOST); + } else { + char *body, *body2; + body = strchr(BODY, '\r'); + if (body != NULL) + *body = '\0'; + body2 = strchr(BODY, '\n'); + if (body2 != NULL) + *body = '\0'; + sprintf(subject, "%.1000s", BODY); + if (body != NULL) + *body = '\r'; + if (body2 != NULL) + *body = '\n'; + } + if (*subject) { + SUBJECT = subject; + } + fname = (char *)post_article(boardhome, FROM, "deleted", bbspost_write_cancel, filename, firstpath); + if (fname != NULL) { + if (firstpath[0] == '\0') { + sprintf(firstpath, "%s/boards/d/deleted/%s", BBSHOME, fname); + firstpathbase = firstpath + strlen(BBSHOME) + strlen("/boards/x/"); + } + if (storeDB(HEADER[MID_H], (char *)fileglue("deleted/%s", fname)) < 0) { + /* should do something */ + bbslog("store DB fail\n"); + /* return -1; */ + } + bbsfeedslog(fileglue("deleted/%s", fname), 'D'); #ifdef OLDDISPATCH - { - char board[256]; - newsfeeds_t *nf; - char *filebase = filename + strlen(BBSHOME) + strlen("/boards/x/"); - char *filetail = strrchr(filename, '/'); - if (filetail != NULL) - { - strncpy(board, filebase, filetail - filebase); - nf = (newsfeeds_t *) search_board(board); - if (nf != NULL && nf->board && nf->path) - { - feedfplog(nf, firstpathbase, 'D'); - } - } - } + { + char board[256]; + newsfeeds_t *nf; + char *filebase = filename + strlen(BBSHOME) + strlen("/boards/x/"); + char *filetail = strrchr(filename, '/'); + if (filetail != NULL) { + strncpy(board, filebase, filetail - filebase); + nf = (newsfeeds_t *) search_board(board); + if (nf != NULL && nf->board && nf->path) { + feedfplog(nf, firstpathbase, 'D'); + } + } + } #endif - } - else - { - bbslog(" fname is null %s %s\n", boardhome, filename); - return -1; - } - } + } else { + bbslog(" fname is null %s %s\n", boardhome, filename); + return -1; + } + } #else - /* bbslog("**** %s should be removed\n", filename); */ -/* - unlink(filename); -*/ + /* bbslog("**** %s should be removed\n", filename); */ + /* + * unlink(filename); + */ #endif - { - char *fp = strrchr(file, '/'); - if (fp != NULL) - { - *fp = '\0'; - cancel_article(BBSHOME, file, fp + 1); - *fp = '/'; - } - } + { + char *fp = strrchr(file, '/'); + if (fp != NULL) { + *fp = '\0'; + cancel_article(BBSHOME, file, fp + 1); + *fp = '/'; + } + } + } } - } - if (*firstpath) - { - char **splitptr, *ngptr; - newsfeeds_t *nf; - splitptr = (char **) BNGsplit(GROUPS); - for (ngptr = *splitptr; ngptr != NULL; ngptr = *(++splitptr)) - { - if (*ngptr == '\0') - continue; - nf = (newsfeeds_t *) search_group(ngptr); - if (nf == NULL) - continue; - if (nf->board == NULL) - continue; - if (nf->path == NULL) - continue; - feedfplog(nf, firstpathbase, 'D'); + if (*firstpath) { + char **splitptr, *ngptr; + newsfeeds_t *nf; + splitptr = (char **)BNGsplit(GROUPS); + for (ngptr = *splitptr; ngptr != NULL; ngptr = *(++splitptr)) { + if (*ngptr == '\0') + continue; + nf = (newsfeeds_t *) search_group(ngptr); + if (nf == NULL) + continue; + if (nf->board == NULL) + continue; + if (nf->path == NULL) + continue; + feedfplog(nf, firstpathbase, 'D'); + } } - } - return 0; + return 0; } @@ -767,156 +668,144 @@ cancel_article_front(msgid) #include "config.h" -char * +char * post_article(homepath, userid, board, writebody, pathname, firstpath) - char *homepath; - char *userid, *board; - int (*writebody) (); -char *pathname, *firstpath; + char *homepath; + char *userid, *board; + int (*writebody) (); + char *pathname, *firstpath; { - struct userec_t record; - struct fileheader_t header; - char *subject = SUBJECT; - char index[MAXPATHLEN]; - static char name[MAXPATHLEN]; - char article[MAXPATHLEN]; - char buf[MAXPATHLEN], *ptr; - FILE *fidx; - int fh, bid; - time_t now; - int linkflag; -/* Ptt - if(bad_subject(subject)) return NULL; -*/ - sprintf(index, "%s/.DIR", homepath); - if ((fidx = fopen(index, "r")) == NULL) - { - if ((fidx = fopen(index, "w")) == NULL) - { - bbslog(":Err: Unable to post in %s.\n", homepath); - return NULL; + struct userec_t record; + struct fileheader_t header; + char *subject = SUBJECT; + char index[MAXPATHLEN]; + static char name[MAXPATHLEN]; + char article[MAXPATHLEN]; + char buf[MAXPATHLEN], *ptr; + FILE *fidx; + int fh, bid; + time_t now; + int linkflag; + /* + * Ptt if(bad_subject(subject)) return NULL; + */ + sprintf(index, "%s/.DIR", homepath); + if ((fidx = fopen(index, "r")) == NULL) { + if ((fidx = fopen(index, "w")) == NULL) { + bbslog(":Err: Unable to post in %s.\n", homepath); + return NULL; + } } - } - fclose(fidx); - - now = time(NULL); - while (1) - { - sprintf(name, "M.%d.A", ++now); - sprintf(article, "%s/%s", homepath, name); - fh = open(article, O_CREAT | O_EXCL | O_WRONLY, 0644); - if (fh >= 0) - break; - if (errno != EEXIST) - { - bbslog(" Err: can't writable or other errors\n"); - return NULL; + fclose(fidx); + + now = time(NULL); + while (1) { + sprintf(name, "M.%d.A", ++now); + sprintf(article, "%s/%s", homepath, name); + fh = open(article, O_CREAT | O_EXCL | O_WRONLY, 0644); + if (fh >= 0) + break; + if (errno != EEXIST) { + bbslog(" Err: can't writable or other errors\n"); + return NULL; + } } - } #ifdef DEBUG - printf("post to %s\n", article); + printf("post to %s\n", article); #endif - linkflag = 1; - if (firstpath && *firstpath) - { - close(fh); - unlink(article); + linkflag = 1; + if (firstpath && *firstpath) { + close(fh); + unlink(article); #ifdef DEBUGLINK - bbslog("try to link %s to %s", firstpath, article); + bbslog("try to link %s to %s", firstpath, article); #endif - linkflag = link(firstpath, article); - if (linkflag) - { - fh = open(article, O_CREAT | O_EXCL | O_WRONLY, 0644); - } - } - if (linkflag) - { - if (writebody) - { - if ((*writebody) (fh, board, pathname) < 0) - return NULL; + linkflag = link(firstpath, article); + if (linkflag) { + fh = open(article, O_CREAT | O_EXCL | O_WRONLY, 0644); + } } - else - { - if (bbspost_write_post(fh, board, pathname) < 0) - return NULL; + if (linkflag) { + if (writebody) { + if ((*writebody) (fh, board, pathname) < 0) + return NULL; + } else { + if (bbspost_write_post(fh, board, pathname) < 0) + return NULL; + } + close(fh); } - close(fh); - } - - bzero((void *) &header, sizeof(header)); + bzero((void *)&header, sizeof(header)); #ifndef MapleBBS - strcpy(header.filename, name); - strncpy(header.owner, userid, IDLEN); - strncpy(header.title, subject, STRLEN); - header.filename[STRLEN - 1] = 'M'; + strcpy(header.filename, name); + strncpy(header.owner, userid, IDLEN); + strncpy(header.title, subject, STRLEN); + header.filename[STRLEN - 1] = 'M'; #else - strcpy(header.filename, name); - if (userid[IDLEN]) - strcpy(&userid[IDLEN], "."); - strcpy(header.owner, userid); - strncpy(header.title, subject, TTLEN); - header.filemode |= FILE_MULTI; - { - struct tm *ptime; - ptime = localtime(&datevalue); - sprintf(header.date, "%2d/%02d", ptime->tm_mon + 1, ptime->tm_mday); - } + strcpy(header.filename, name); + if (userid[IDLEN]) + strcpy(&userid[IDLEN], "."); + strcpy(header.owner, userid); + strncpy(header.title, subject, TTLEN); + header.filemode |= FILE_MULTI; + { + struct tm *ptime; + ptime = localtime(&datevalue); + sprintf(header.date, "%2d/%02d", ptime->tm_mon + 1, ptime->tm_mday); + } #endif - append_record(index, &header, sizeof(header)); - - if((bid = getbnum(board)) > 0){ - touchbtotal(bid); + append_record(index, &header, sizeof(header)); + + if ((bid = getbnum(board)) > 0) { + touchbtotal(bid); touchdircache(bid); - } - return name; + } + return name; } /* -woju -Cross-fs rename() -*/ + * woju Cross-fs rename() + */ -Rename(char* src, char* dst) +Rename(char *src, char *dst) { - char cmd[200]; + char cmd[200]; - bbslog("Rename: %s -> %s\n", src, dst); - if (rename(src, dst) == 0) - return 0; + bbslog("Rename: %s -> %s\n", src, dst); + if (rename(src, dst) == 0) + return 0; - sprintf(cmd, "/bin/mv %s %s", src, dst); - return system(cmd); + sprintf(cmd, "/bin/mv %s %s", src, dst); + return system(cmd); } -cancelpost(fileheader_t *fhdr, char* boardname) +cancelpost(fileheader_t * fhdr, char *boardname) { - int fd; - char fpath[MAXPATHLEN]; - - sprintf(fpath, BBSHOME "/boards/%c/%s/%s", boardname[0], boardname, fhdr->filename); - if ((fd = open(fpath, O_RDONLY)) >= 0) { - fileheader_t postfile; - char fn2[MAXPATHLEN] = BBSHOME "/boards/d/deleted", *junkdir; - - stampfile(fn2, &postfile); - memcpy(postfile.owner, fhdr->owner, IDLEN + TTLEN + 10); - close(fd); - Rename(fpath, fn2); - strcpy(strrchr(fn2, '/') + 1, ".DIR"); - append_record(fn2, &postfile, sizeof(postfile)); - } - else - bbslog("cancelpost: %s opened error\n", fpath); + int fd; + char fpath[MAXPATHLEN]; + + sprintf(fpath, BBSHOME "/boards/%c/%s/%s", boardname[0], boardname, fhdr->filename); + if ((fd = open(fpath, O_RDONLY)) >= 0) { + fileheader_t postfile; + char fn2[MAXPATHLEN] = BBSHOME "/boards/d/deleted", + *junkdir; + + stampfile(fn2, &postfile); + memcpy(postfile.owner, fhdr->owner, IDLEN + TTLEN + 10); + close(fd); + Rename(fpath, fn2); + strcpy(strrchr(fn2, '/') + 1, ".DIR"); + append_record(fn2, &postfile, sizeof(postfile)); + } else + bbslog("cancelpost: %s opened error\n", fpath); } @@ -924,22 +813,21 @@ cancelpost(fileheader_t *fhdr, char* boardname) /* new/old/lock file processing */ /* ---------------------------- */ -typedef struct -{ - char newfn[MAXPATHLEN]; - char oldfn[MAXPATHLEN]; - char lockfn[MAXPATHLEN]; -} nol; +typedef struct { + char newfn[MAXPATHLEN]; + char oldfn[MAXPATHLEN]; + char lockfn[MAXPATHLEN]; +} nol; static void nolfilename(n, fpath) - nol *n; - char *fpath; + nol *n; + char *fpath; { - sprintf(n->newfn, "%s.new", fpath); - sprintf(n->oldfn, "%s.old", fpath); - sprintf(n->lockfn, "%s.lock", fpath); + sprintf(n->newfn, "%s.new", fpath); + sprintf(n->oldfn, "%s.old", fpath); + sprintf(n->lockfn, "%s.lock", fpath); } @@ -947,245 +835,230 @@ nolfilename(n, fpath) int delete_record(char *fpath, int size, int id) { - nol my; - char abuf[512]; - int fdr, fdw, fd; - int count; - fileheader_t fhdr; + nol my; + char abuf[512]; + int fdr, fdw, fd; + int count; + fileheader_t fhdr; - nolfilename(&my, fpath); + nolfilename(&my, fpath); - if ((fd = open(my.lockfn, O_RDWR | O_CREAT | O_APPEND, 0644)) == -1) - return -1; - flock(fd, LOCK_EX); + if ((fd = open(my.lockfn, O_RDWR | O_CREAT | O_APPEND, 0644)) == -1) + return -1; + flock(fd, LOCK_EX); - if ((fdr = open(fpath, O_RDONLY, 0)) == -1) - { + if ((fdr = open(fpath, O_RDONLY, 0)) == -1) { #ifdef HAVE_REPORT - report("delete_record failed!!! (open)"); + report("delete_record failed!!! (open)"); #endif - flock(fd, LOCK_UN); - close(fd); - return -1; - } - if ((fdw = open(my.newfn, O_WRONLY | O_CREAT | O_EXCL, 0644)) == -1) - { - flock(fd, LOCK_UN); + flock(fd, LOCK_UN); + close(fd); + return -1; + } + if ((fdw = open(my.newfn, O_WRONLY | O_CREAT | O_EXCL, 0644)) == -1) { + flock(fd, LOCK_UN); #ifdef HAVE_REPORT - report("delete_record failed!!! (open tmpfile)"); + report("delete_record failed!!! (open tmpfile)"); #endif - close(fd); - close(fdr); - return -1; - } - count = 1; - while (read(fdr, abuf, size) == size) - { - if (id == count) { - memcpy(&fhdr, abuf, sizeof(fhdr)); - bbslog("delete_record: %d, %s, %s\n", count, fhdr.owner, fhdr.title); + close(fd); + close(fdr); + return -1; } - if (id != count++ && (write(fdw, abuf, size) == -1)) - { + count = 1; + while (read(fdr, abuf, size) == size) { + if (id == count) { + memcpy(&fhdr, abuf, sizeof(fhdr)); + bbslog("delete_record: %d, %s, %s\n", count, fhdr.owner, fhdr.title); + } + if (id != count++ && (write(fdw, abuf, size) == -1)) { - bbslog("delete_record: %s failed!!! (write)\n", fpath); + bbslog("delete_record: %s failed!!! (write)\n", fpath); #ifdef HAVE_REPORT - report("delete_record failed!!! (write)"); + report("delete_record failed!!! (write)"); #endif - unlink(my.newfn); - close(fdr); - close(fdw); - flock(fd, LOCK_UN); - close(fd); - return -1; + unlink(my.newfn); + close(fdr); + close(fdw); + flock(fd, LOCK_UN); + close(fd); + return -1; + } } - } - close(fdr); - close(fdw); - if (Rename(fpath, my.oldfn) == -1 || Rename(my.newfn, fpath) == -1) - { + close(fdr); + close(fdw); + if (Rename(fpath, my.oldfn) == -1 || Rename(my.newfn, fpath) == -1) { #ifdef HAVE_REPORT - report("delete_record failed!!! (Rename)"); + report("delete_record failed!!! (Rename)"); #endif + flock(fd, LOCK_UN); + close(fd); + return -1; + } flock(fd, LOCK_UN); close(fd); - return -1; - } - flock(fd, LOCK_UN); - close(fd); - return 0; + return 0; } cancel_article(homepath, board, file) - char *homepath; - char *board, *file; + char *homepath; + char *board, *file; { - struct fileheader_t header; - struct stat state; - char dirname[MAXPATHLEN]; - char buf[MAXPATHLEN]; - long numents, size, time, now; - int fd, lower, ent; - - - if (file == NULL || file[0] != 'M' || file[1] != '.' || - (time = atoi(file + 2)) <= 0) { - bbslog("cancel_article: invalid filename `%s`\n", file); - return 0; - } - size = sizeof(header); - sprintf(dirname, "%s/boards/%c/%s/.DIR", homepath, board[0], board); - if ((fd = open(dirname, O_RDONLY)) == -1) { - bbslog("cancel_article: open `%s` error\n", dirname); - return 0; - } - fstat(fd, &state); - ent = ((long) state.st_size) / size; - lower = 0; - while (1) - { - ent -= 8; - if (ent <= 0 || lower >= 2) - break; - lseek(fd, size * ent, SEEK_SET); - if (read(fd, &header, size) != size) - { - ent = 0; - break; + struct fileheader_t header; + struct stat state; + char dirname[MAXPATHLEN]; + char buf[MAXPATHLEN]; + long numents, size, time, now; + int fd, lower, ent; + + + if (file == NULL || file[0] != 'M' || file[1] != '.' || + (time = atoi(file + 2)) <= 0) { + bbslog("cancel_article: invalid filename `%s`\n", file); + return 0; } - now = atoi(header.filename + 2); - lower = (now < time) ? lower + 1 : 0; - } - if (ent < 0) - ent = 0; - while (read(fd, &header, size) == size) - { - if (strcmp(file, header.filename) == 0) - { - if ((header.filemode & FILE_MARKED) - || (header.filemode & FILE_DIGEST) || (header.owner[0] == '-')) - break; - delete_record(dirname, sizeof(fileheader_t), lseek(fd, 0, SEEK_CUR) / size); - cancelpost(&header, board); - break; + size = sizeof(header); + sprintf(dirname, "%s/boards/%c/%s/.DIR", homepath, board[0], board); + if ((fd = open(dirname, O_RDONLY)) == -1) { + bbslog("cancel_article: open `%s` error\n", dirname); + return 0; + } + fstat(fd, &state); + ent = ((long)state.st_size) / size; + lower = 0; + while (1) { + ent -= 8; + if (ent <= 0 || lower >= 2) + break; + lseek(fd, size * ent, SEEK_SET); + if (read(fd, &header, size) != size) { + ent = 0; + break; + } + now = atoi(header.filename + 2); + lower = (now < time) ? lower + 1 : 0; + } + if (ent < 0) + ent = 0; + while (read(fd, &header, size) == size) { + if (strcmp(file, header.filename) == 0) { + if ((header.filemode & FILE_MARKED) + || (header.filemode & FILE_DIGEST) || (header.owner[0] == '-')) + break; + delete_record(dirname, sizeof(fileheader_t), lseek(fd, 0, SEEK_CUR) / size); + cancelpost(&header, board); + break; + } + now = atoi(header.filename + 2); + if (now > time) + break; } - now = atoi(header.filename + 2); - if (now > time) - break; - } - close(fd); - return 0; + close(fd); + return 0; } #elif defined(PalmBBS) -# undef PATH XPATH -# undef HEADER XHEADER +#undef PATH XPATH +#undef HEADER XHEADER #include "server.h" -char * +char * post_article(homepath, userid, board, writebody, pathname, firstpath) - char *homepath; - char *userid, *board; - int (*writebody) (); -char *pathname, *firstpath; + char *homepath; + char *userid, *board; + int (*writebody) (); + char *pathname, *firstpath; { - PATH msgdir, msgfile; - static PATH name; - - READINFO readinfo; - SHORT fileid; - char buf[MAXPATHLEN]; - struct stat stbuf; - int fh; - - strcpy(msgdir, homepath); - if (stat(msgdir, &stbuf) == -1 || !S_ISDIR(stbuf.st_mode)) - { - /* A directory is missing! */ - bbslog(":Err: Unable to post in %s.\n", msgdir); - return NULL; - } - get_filelist_ids(msgdir, &readinfo); - - for (fileid = 1; fileid <= BBS_MAX_FILES; fileid++) - { - int oumask; - if (test_readbit(&readinfo, fileid)) - continue; - fileid_to_fname(msgdir, fileid, msgfile); - sprintf(name, "%04x", fileid); + PATH msgdir, msgfile; + static PATH name; + + READINFO readinfo; + SHORT fileid; + char buf[MAXPATHLEN]; + struct stat stbuf; + int fh; + + strcpy(msgdir, homepath); + if (stat(msgdir, &stbuf) == -1 || !S_ISDIR(stbuf.st_mode)) { + /* A directory is missing! */ + bbslog(":Err: Unable to post in %s.\n", msgdir); + return NULL; + } + get_filelist_ids(msgdir, &readinfo); + + for (fileid = 1; fileid <= BBS_MAX_FILES; fileid++) { + int oumask; + if (test_readbit(&readinfo, fileid)) + continue; + fileid_to_fname(msgdir, fileid, msgfile); + sprintf(name, "%04x", fileid); #ifdef DEBUG - printf("post to %s\n", msgfile); + printf("post to %s\n", msgfile); #endif - if (firstpath && *firstpath) - { + if (firstpath && *firstpath) { #ifdef DEBUGLINK - bbslog("try to link %s to %s", firstpath, msgfile); + bbslog("try to link %s to %s", firstpath, msgfile); #endif - if (link(firstpath, msgfile) == 0) - break; - } - oumask = umask(0); - fh = open(msgfile, O_CREAT | O_EXCL | O_WRONLY, 0664); - umask(oumask); - if (writebody) - { - if ((*writebody) (fh, board, pathname) < 0) - return NULL; - } - else - { - if (bbspost_write_post(fh, board, pathname) < 0) - return NULL; + if (link(firstpath, msgfile) == 0) + break; + } + oumask = umask(0); + fh = open(msgfile, O_CREAT | O_EXCL | O_WRONLY, 0664); + umask(oumask); + if (writebody) { + if ((*writebody) (fh, board, pathname) < 0) + return NULL; + } else { + if (bbspost_write_post(fh, board, pathname) < 0) + return NULL; + } + close(fh); + break; } - close(fh); - break; - } #ifdef CACHED_OPENBOARD - { - char *bname; - bname = strrchr(msgdir, '/'); - if (bname) - notify_new_post(++bname, 1, fileid, stbuf.st_mtime); - } + { + char *bname; + bname = strrchr(msgdir, '/'); + if (bname) + notify_new_post(++bname, 1, fileid, stbuf.st_mtime); + } #endif - return name; + return name; } cancel_article(homepath, board, file) - char *homepath; - char *board, *file; + char *homepath; + char *board, *file; { - PATH fname; + PATH fname; #ifdef CACHED_OPENBOARD - PATH bdir; - struct stat stbuf; + PATH bdir; + struct stat stbuf; - sprintf(bdir, "%s/boards/%c/%s", homepath, board[0], board); - stat(bdir, &stbuf); + sprintf(bdir, "%s/boards/%c/%s", homepath, board[0], board); + stat(bdir, &stbuf); #endif - sprintf(fname, "%s/boards/%c/%s/%s", homepath, board[0], board, file); - unlink(fname); - /* kill it now! the function is far small then original.. :) */ - /* because it won't make system load heavy like before */ + sprintf(fname, "%s/boards/%c/%s/%s", homepath, board[0], board, file); + unlink(fname); + /* kill it now! the function is far small then original.. :) */ + /* because it won't make system load heavy like before */ #ifdef CACHED_OPENBOARD - notify_new_post(board, -1, hex2SHORT(file), stbuf.st_mtime); + notify_new_post(board, -1, hex2SHORT(file), stbuf.st_mtime); #endif } @@ -1200,7 +1073,7 @@ receive_article() } cancel_article_front(msgid) - char *msgid; + char *msgid; { } #endif diff --git a/innbbsd/rfc931.c b/innbbsd/rfc931.c index 0d59d771..d8428119 100644 --- a/innbbsd/rfc931.c +++ b/innbbsd/rfc931.c @@ -1,19 +1,19 @@ - /* - * rfc931_user() speaks a common subset of the RFC 931, AUTH, TAP and IDENT - * protocols. It consults an RFC 931 etc. compatible daemon on the client - * host to look up the remote user name. The information should not be used - * for authentication purposes. - * - * Diagnostics are reported through syslog(3). - * - * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands. - * - * Inspired by the authutil package (comp.sources.unix volume 22) by Dan - * Bernstein (brnstnd@kramden.acf.nyu.edu). - */ +/* + * rfc931_user() speaks a common subset of the RFC 931, AUTH, TAP and IDENT + * protocols. It consults an RFC 931 etc. compatible daemon on the client + * host to look up the remote user name. The information should not be used + * for authentication purposes. + * + * Diagnostics are reported through syslog(3). + * + * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands. + * + * Inspired by the authutil package (comp.sources.unix volume 22) by Dan + * Bernstein (brnstnd@kramden.acf.nyu.edu). + */ #ifndef lint -static char sccsid[] = "@(#) rfc931.c 1.4 93/03/07 22:47:52"; +static char sccsid[] = "@(#) rfc931.c 1.4 93/03/07 22:47:52"; #endif #include <stdio.h> @@ -24,44 +24,46 @@ static char sccsid[] = "@(#) rfc931.c 1.4 93/03/07 22:47:52"; #include <setjmp.h> #include <signal.h> -/*#include "log_tcp.h"*/ +/* #include "log_tcp.h" */ -#define RFC931_PORT 113 /* Semi-well-known port */ +#define RFC931_PORT 113 /* Semi-well-known port */ #ifndef RFC931_TIMEOUT -#define RFC931_TIMEOUT 30 /* wait for at most 30 seconds */ +#define RFC931_TIMEOUT 30 /* wait for at most 30 seconds */ #endif -extern char *strchr(); -extern char *inet_ntoa(); +extern char *strchr(); +extern char *inet_ntoa(); -static jmp_buf timebuf; +static jmp_buf timebuf; /* timeout - handle timeouts */ -static void timeout(sig) -int sig; +static void +timeout(sig) + int sig; { longjmp(timebuf, sig); } /* rfc931_name - return remote user name */ -char *my_rfc931_name(herefd,there) -int herefd; -struct sockaddr_in *there; /* remote link information */ +char * +my_rfc931_name(herefd, there) + int herefd; + struct sockaddr_in *there; /* remote link information */ { struct sockaddr_in here; /* local link information */ - struct sockaddr_in sin; /* for talking to RFC931 daemon */ - int length; - int s; - unsigned remote; - unsigned local; - static char user[256]; /* XXX */ - char buffer[512]; /* YYY */ - FILE *fp; - char *cp; - char *result = "unknown"; + struct sockaddr_in sin; /* for talking to RFC931 daemon */ + int length; + int s; + unsigned remote; + unsigned local; + static char user[256]; /* XXX */ + char buffer[512];/* YYY */ + FILE *fp; + char *cp; + char *result = "unknown"; /* Find out local address and port number of stdin. */ @@ -70,7 +72,6 @@ struct sockaddr_in *there; /* remote link information */ syslog(LOG_ERR, "getsockname: %m"); return (result); } - /* * The socket that will be used for user name lookups should be bound to * the same local IP address as stdin. This will automagically happen on @@ -91,7 +92,7 @@ struct sockaddr_in *there; /* remote link information */ signal(SIGALRM, timeout); if (setjmp(timebuf)) { - close(s); /* not: fclose(fp) */ + close(s); /* not: fclose(fp) */ return (result); } alarm(RFC931_TIMEOUT); @@ -106,14 +107,13 @@ struct sockaddr_in *there; /* remote link information */ alarm(0); return (result); } - /* * Use unbuffered I/O or we may read back our own query. setbuf() must be * called before doing any I/O on the stream. Thanks for the reminder, * Paul Kranenburg <pk@cs.few.eur.nl>! */ - setbuf(fp, (char *) 0); + setbuf(fp, (char *)0); /* Query the RFC 931 server. Would 13-byte writes ever be broken up? */ diff --git a/innbbsd/str_decode.c b/innbbsd/str_decode.c index 73ad5f64..38851527 100644 --- a/innbbsd/str_decode.c +++ b/innbbsd/str_decode.c @@ -1,9 +1,12 @@ -/* 使用方法大致如下: innbbsd 中 - 在 SUBJECT 從 news 讀進來後, 呼叫 str_decode_M3(SUBJECT) 就行了 */ +/* + * 使用方法大致如下: innbbsd 中 在 SUBJECT 從 news 讀進來後, 呼叫 + * str_decode_M3(SUBJECT) 就行了 + */ -/* bsd 底下使用要編譯時要加 -I/usr/local/include -L/usr/local/lib -liconv - 並安裝 libiconv, - 若真的沒有iconv就把底下的 #define USE_ICONV 1 刪了 */ +/* + * bsd 底下使用要編譯時要加 -I/usr/local/include -L/usr/local/lib -liconv + * 並安裝 libiconv, 若真的沒有iconv就把底下的 #define USE_ICONV 1 刪了 + */ /*-------------------------------------------------------*/ /* lib/str_decode.c ( NTHU CS MapleBBS Ver 3.00 ) */ @@ -23,14 +26,17 @@ #include <string.h> #define USE_ICONV 1 -/* bsd 底下使用要編譯時要加 -I/usr/local/include -L/usr/local/lib -liconv - 若真的沒有iconv就把上面這行 #define 刪了 */ +/* + * bsd 底下使用要編譯時要加 -I/usr/local/include -L/usr/local/lib -liconv + * 若真的沒有iconv就把上面這行 #define 刪了 + */ #ifdef USE_ICONV #include <iconv.h> #endif -static int qp_code(int x) +static int +qp_code(int x) { if (x >= '0' && x <= '9') return x - '0'; @@ -48,7 +54,8 @@ static int qp_code(int x) /* ------------------------------------------------------------------ */ -static int base64_code(int x) +static int +base64_code(int x) { if (x >= 'A' && x <= 'Z') return x - 'A'; @@ -68,132 +75,139 @@ static int base64_code(int x) /* judge & decode QP / BASE64 */ /* ----------------------------------------------------- */ -static inline int isreturn(unsigned char c) +static inline int +isreturn(unsigned char c) { return c == '\r' || c == '\n'; } -static inline int isspace(unsigned char c) +static inline int +isspace(unsigned char c) { return c == ' ' || c == '\t' || isreturn(c); } /* static inline */ -int mmdecode(unsigned char *src, unsigned char encode, unsigned char *dst) +int +mmdecode(unsigned char *src, unsigned char encode, unsigned char *dst) { /* Thor.980901: src和dst可相同, 但src 一定有?或\0結束 */ /* Thor.980901: 注意, decode出的結果不會自己加上 \0 */ - unsigned char *t = dst; - int pattern = 0, bits = 0; - encode |= 0x20; /* Thor: to lower */ - switch(encode) - { - case 'q': /* Thor: quoted-printable */ - while(*src && *src != '?') /* Thor: delimiter */ - { /* Thor.980901: 0 算是 delimiter */ - if(*src == '=') - { - int x = *++src, y = x ? *++src : 0; - if(isreturn(x)) continue; - if( (x = qp_code(x)) < 0 || ( y = qp_code(y)) < 0) return -1; - *t++ = (x << 4) + y , src++; - } - else if(*src == '_') - *t++ = ' ', src++; -#if 0 - else if(!*src) /* Thor: no delimiter is not successful */ + unsigned char *t = dst; + int pattern = 0, bits = 0; + encode |= 0x20; /* Thor: to lower */ + switch (encode) { + case 'q': /* Thor: quoted-printable */ + while (*src && *src != '?') { /* Thor: delimiter *//* Thor.980901: + * 0 算是 delimiter */ + if (*src == '=') { + int x = *++src, y = x ? *++src : 0; + if (isreturn(x)) + continue; + if ((x = qp_code(x)) < 0 || (y = qp_code(y)) < 0) return -1; + *t++ = (x << 4) + y, src++; + } else if (*src == '_') + *t++ = ' ', src++; +#if 0 + else if (!*src) /* Thor: no delimiter is not successful */ + return -1; #endif - else /* Thor: *src != '=' '_' */ - *t++ = *src++; - } - return t - dst; - case 'b': /* Thor: base 64 */ - while(*src && *src != '?') /* Thor: delimiter */ /* Thor.980901: 0也算 */ - { /* Thor: pattern & bits are cleared outside */ - int x; + else /* Thor: *src != '=' '_' */ + *t++ = *src++; + } + return t - dst; + case 'b': /* Thor: base 64 */ + while (*src && *src != '?') { /* Thor: delimiter */ + /* + * Thor.980901: 0也算 *//* Thor: pattern & bits are cleared + * outside + */ + int x; #if 0 - if (!*src) return -1; /* Thor: no delimiter is not successful */ + if (!*src) + return -1; /* Thor: no delimiter is not successful */ #endif - x = base64_code(*src++); - if(x < 0) continue; /* Thor: ignore everything not in the base64,=,.. */ - pattern = (pattern << 6) | x; - bits += 6; /* Thor: 1 code gains 6 bits */ - if(bits >= 8) /* Thor: enough to form a byte */ - { - bits -= 8; - *t++ = (pattern >> bits) & 0xff; - } + x = base64_code(*src++); + if (x < 0) + continue; /* Thor: ignore everything not in the + * base64,=,.. */ + pattern = (pattern << 6) | x; + bits += 6; /* Thor: 1 code gains 6 bits */ + if (bits >= 8) { /* Thor: enough to form a byte */ + bits -= 8; + *t++ = (pattern >> bits) & 0xff; } - return t - dst; + } + return t - dst; } return -1; } #ifdef USE_ICONV -int str_iconv( - const char *fromcode, /* charset of source string*/ - const char *tocode, /* charset of destination string */ - char *src, /* source string */ - int srclen, /* source string length */ - char *dst, /* destination string */ - int dstlen) /* destination string length */ -/* 這個函式會將一個字串 (src) 從 charset=fromcode 轉成 charset=tocode, - srclen 是 src 的長度, dst 是輸出的buffer, dstlen 則指定了 - dst 的大小, 最後會補 '\0', 所以要留一個byte給'\0'. - 如果遇到 src 中有非字集的字, 或是 src 中有未完整的 byte, - 都會砍掉. - */ -{ - iconv_t iconv_descriptor; - int iconv_ret,dstlen_old; +int +str_iconv( + const char *fromcode, /* charset of source string */ + const char *tocode, /* charset of destination string */ + char *src, /* source string */ + int srclen, /* source string length */ + char *dst, /* destination string */ + int dstlen) +{ /* destination string length */ + /* + * 這個函式會將一個字串 (src) 從 charset=fromcode 轉成 charset=tocode, + * srclen 是 src 的長度, dst 是輸出的buffer, dstlen 則指定了 dst 的大小, + * 最後會補 '\0', 所以要留一個byte給'\0'. 如果遇到 src 中有非字集的字, + * 或是 src 中有未完整的 byte, 都會砍掉. + */ + iconv_t iconv_descriptor; + int iconv_ret, dstlen_old; - dstlen--; /* keep space for '\0' */ + dstlen--; /* keep space for '\0' */ dstlen_old = dstlen; /* Open a descriptor for iconv */ iconv_descriptor = iconv_open(tocode, fromcode); - if (iconv_descriptor == ((iconv_t)(-1)) ) /* if open fail */ - { - strncpy(dst,src,dstlen); + if (iconv_descriptor == ((iconv_t) (-1))) { /* if open fail */ + strncpy(dst, src, dstlen); return dstlen; } - /* Start translation */ - while (srclen > 0 && dstlen > 0) - { - iconv_ret = iconv(iconv_descriptor, (const char* *)&src, &srclen, - &dst, &dstlen); - if (iconv_ret != 0) - { - switch(errno) - { + while (srclen > 0 && dstlen > 0) { + iconv_ret = iconv(iconv_descriptor, (const char **)&src, &srclen, + &dst, &dstlen); + if (iconv_ret != 0) { + switch (errno) { /* invalid multibyte happened */ - case EILSEQ: - /* forward that byte */ - *dst = *src; - src++; srclen--; - dst++; dstlen--; - break; - /* incomplete multibyte happened */ - case EINVAL: - /* forward that byte (maybe wrong)*/ - *dst = *src; - src++; srclen--; - dst++; dstlen--; - break; - /* dst no rooms */ - case E2BIG: - /* break out the while loop */ - srclen = 0; - break; + case EILSEQ: + /* forward that byte */ + *dst = *src; + src++; + srclen--; + dst++; + dstlen--; + break; + /* incomplete multibyte happened */ + case EINVAL: + /* forward that byte (maybe wrong) */ + *dst = *src; + src++; + srclen--; + dst++; + dstlen--; + break; + /* dst no rooms */ + case E2BIG: + /* break out the while loop */ + srclen = 0; + break; } } } *dst = '\0'; - /* close descriptor of iconv*/ + /* close descriptor of iconv */ iconv_close(iconv_descriptor); return (dstlen_old - dstlen); @@ -201,78 +215,71 @@ int str_iconv( #endif -void str_decode_M3(unsigned char *str) +void +str_decode_M3(unsigned char *str) { - int adj; - int i; - unsigned char *src, *dst; - unsigned char buf[512]; - unsigned char charset[512],dst1[512]; + int adj; + int i; + unsigned char *src, *dst; + unsigned char buf[512]; + unsigned char charset[512], dst1[512]; src = str; dst = buf; adj = 0; - while (*src && (dst - buf) < sizeof(buf) - 1) - { - if (*src != '=') - { /* Thor: not coded */ - unsigned char *tmp = src; - while(adj && *tmp && isspace(*tmp)) tmp++; - if(adj && *tmp=='=') - { /* Thor: jump over space */ + while (*src && (dst - buf) < sizeof(buf) - 1) { + if (*src != '=') { /* Thor: not coded */ + unsigned char *tmp = src; + while (adj && *tmp && isspace(*tmp)) + tmp++; + if (adj && *tmp == '=') { /* Thor: jump over space */ adj = 0; src = tmp; - } - else + } else *dst++ = *src++; - /* continue;*/ /* Thor: take out */ - } - else /* Thor: *src == '=' */ - { - unsigned char *tmp = src + 1; - if(*tmp == '?') /* Thor: =? coded */ - { + /* continue; *//* Thor: take out */ + } else { /* Thor: *src == '=' */ + unsigned char *tmp = src + 1; + if (*tmp == '?') { /* Thor: =? coded */ /* "=?%s?Q?" for QP, "=?%s?B?" for BASE64 */ - tmp ++; - i=0; - while(*tmp && *tmp != '?') - { - if (i+1<sizeof(charset)) - { + tmp++; + i = 0; + while (*tmp && *tmp != '?') { + if (i + 1 < sizeof(charset)) { charset[i] = *tmp; - charset[i+1]='\0'; + charset[i + 1] = '\0'; i++; } tmp++; } - if(*tmp && tmp[1] && tmp[2]=='?') /* Thor: *tmp == '?' */ - { + if (*tmp && tmp[1] && tmp[2] == '?') { /* Thor: *tmp == '?' */ #ifdef USE_ICONV - int i = mmdecode(tmp + 3, tmp[1], dst1); - i = str_iconv(charset,"big5",dst1,i,dst, - sizeof(buf)-((int)(dst-buf)) ); + int i = mmdecode(tmp + 3, tmp[1], dst1); + i = str_iconv(charset, "big5", dst1, i, dst, + sizeof(buf) - ((int)(dst - buf))); #else - int i = mmdecode(tmp + 3, tmp[1], dst); + int i = mmdecode(tmp + 3, tmp[1], dst); #endif - if (i >= 0) - { - tmp += 3; /* Thor: decode's src */ + if (i >= 0) { + tmp += 3; /* Thor: decode's src */ #if 0 - while(*tmp++ != '?'); /* Thor: no ? end, mmdecode -1 */ + while (*tmp++ != '?'); /* Thor: no ? end, mmdecode + * -1 */ #endif - while(*tmp && *tmp++ != '?'); /* Thor: no ? end, mmdecode -1 */ + while (*tmp && *tmp++ != '?'); /* Thor: no ? end, + * mmdecode -1 */ /* Thor.980901: 0 也算 decode 結束 */ - if(*tmp == '=') tmp++; - src = tmp; /* Thor: decode over */ + if (*tmp == '=') + tmp++; + src = tmp; /* Thor: decode over */ dst += i; - adj = 1; /* Thor: adjcent */ + adj = 1;/* Thor: adjcent */ } } } - - while(src != tmp) /* Thor: not coded */ + while (src != tmp) /* Thor: not coded */ *dst++ = *src++; } } |