#include #include "daemon.h" #include "bbslib.h" #include #define INNTOBBS #include "inntobbs.h" typedef struct Header { 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, }; */ #include 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; #ifdef PalmBBS char **XHEADER; char *XPATH; #endif int isexcluded(path1, 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; } } } return 0; } feedfplog(nf, filepath, 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; } free(path1); } } static FILE *bbsfeedsfp = NULL; static bbsfeedson = -1; init_bbsfeedsfp() { if (bbsfeedsfp != NULL) { fclose(bbsfeedsfp); bbsfeedsfp = NULL; } bbsfeedson = -1; } bbsfeedslog(filepath, type) char *filepath; int type; { char datebuf[40]; time_t now; if (bbsfeedson == 0) return; if (bbsfeedson == -1) { if (!isfile(BBSFEEDS)) { bbsfeedson = 0; return; } bbsfeedson = 1; } 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); fflush(bbsfeedsfp); } } static FILE *echomailfp = NULL; static echomaillogon = -1; init_echomailfp() { if (echomailfp != NULL) { fclose(echomailfp); echomailfp = NULL; } echomaillogon = -1; } echomaillog() { if (echomaillogon == 0) return; if (echomaillogon == -1) { if (!isfile(ECHOMAIL)) { echomaillogon = 0; return; } echomaillogon = 1; } 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); fflush(echomailfp); } } int headercmp(a, b) header_t *a, *b; { return strcasecmp(a->name, b->name); } 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')) { *ptr = '\0'; 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 = ':'; } /**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]; POSTHOST = HEADER[NNTPPOSTINGHOST_H]; if (POSTHOST == NULL) { if (HEADER[X_Auth_From_H] != NULL) { POSTHOST = HEADER[X_Auth_From_H]; HEADER[NNTPPOSTINGHOST_H] = POSTHOST; } } #ifdef PalmBBS XPATH = PATH; XHEADER = HEADER; #endif } int headervalue(inputheader) char *inputheader; { 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; } article_init() { int i; static int article_inited = 0; 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; } #ifdef INNTOBBS_MAIN main() { int i, j, k, l, m, n, o, p, q; article_init(); i = headervalue("Subject"); j = headervalue("From"); k = headervalue("Date"); l = headervalue("NNTP-Posting-Host"); m = headervalue("Newsgroups"); n = headervalue("Message-ID"); } #endif