#if defined( LINUX ) # include "innbbsconf.h" # include "bbslib.h" # include #else # include # 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; #ifndef _PATH_BBSHOME # define _PATH_BBSHOME "/u/staff/bbsroot/csie_util/bntpd/home" #endif static FILE *bbslogfp; static int verboseFlag=0; static char* verboseFilename=NULL; static char verbosename[MAXPATHLEN]; verboseon(filename) char *filename; { verboseFlag = 1; if ( filename != NULL ) { if (strchr(filename,'/') == NULL) { sprintf(verbosename,"%s/innd/%s",BBSHOME,filename); filename = verbosename; } } verboseFilename = filename; } verboseoff() { verboseFlag = 0; } setverboseon() { verboseFlag = 1; } isverboselog() { return verboseFlag; } setverboseoff() { verboseoff(); if (bbslogfp != NULL) { fclose(bbslogfp); bbslogfp = NULL; } } verboselog(char *fmt, ...) { va_list ap; char datebuf[40]; time_t now; if (verboseFlag == 0) return; va_start(ap, fmt); 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); va_end(ap); } #ifdef PalmBBS xbbslog(char *fmt, ...) #else bbslog(char *fmt, ...) #endif { va_list ap; char datebuf[40]; time_t now; va_start(ap, fmt); 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); va_end(ap); } initial_bbs(outgoing) char *outgoing; { 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(); #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; } } 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; } #endif return 1; } 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); } 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); } 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); } 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); } /* read in newsfeeds.bbs and nodelist.bbs */ readnlfile(inndhome, 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"); if (fp == NULL) { fprintf(stderr,"open 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); } else { NODELIST_BUF = (char*) myrealloc( NODELIST_BUF, st.st_size +1); } 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 ++; } fclose(fp); if (NODELIST == NULL) { 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)); } 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; *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++; 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++; 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; } else { 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++; } else { NODELIST[NLCOUNT].feedtype = ' '; } 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; } qsort(NODELIST, NLCOUNT, sizeof(nodelist_t), nlcmp); qsort(NODELIST_BYNODE, NLCOUNT, sizeof(nodelist_t*), nl_bynodecmp); return 0; } readnffile(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"); if (fp == NULL) { fprintf(stderr,"open 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); } else { NEWSFEEDS_BUF = (char*) myrealloc( NEWSFEEDS_BUF, st.st_size +1); } 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 ++; } fclose(fp); if (NEWSFEEDS == NULL) { 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)); } 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'; } qsort(NEWSFEEDS, NFCOUNT, sizeof(newsfeeds_t), nfcmp); qsort(NEWSFEEDS_BYBOARD, NFCOUNT, sizeof(newsfeeds_t*), nf_byboardcmp); } 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; } 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 *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; } 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; } 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; } char * restrdup(ptr, 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; } void * mymalloc(size) int size; { char *ptr = (char*)malloc(size); if (ptr == NULL) { fprintf(stderr, "cant allocate memory\n"); syslog(LOG_ERR, "cant allocate memory %m"); exit(1); } return ptr; } void * myrealloc(optr, size) void *optr; int 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); } return ptr; } testandmkdir(dir) char *dir; { 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; { char *p; int i; for (i=0;iboard,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 *p; int i; for (i=0;i