summaryrefslogtreecommitdiffstats
path: root/daemon/innbbsd/inntobbs.c
diff options
context:
space:
mode:
authorpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2008-03-20 19:33:49 +0800
committerpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2008-03-20 19:33:49 +0800
commit6c7b18b32d87c2a835f7e5c48faac4a8ad44668b (patch)
treee88e1b2b1007f4ddcd348a4a1bf1d13c515c4564 /daemon/innbbsd/inntobbs.c
parentf59699c22c130373cda3cc4cb6fab5bae510bd5a (diff)
downloadpttbbs-piaip.newlayout.tar
pttbbs-piaip.newlayout.tar.gz
pttbbs-piaip.newlayout.tar.bz2
pttbbs-piaip.newlayout.tar.lz
pttbbs-piaip.newlayout.tar.xz
pttbbs-piaip.newlayout.tar.zst
pttbbs-piaip.newlayout.zip
- (internal/exp) first draft of new layoutpiaip.newlayout
git-svn-id: http://opensvn.csie.org/pttbbs/branches/piaip.newlayout@4013 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'daemon/innbbsd/inntobbs.c')
-rw-r--r--daemon/innbbsd/inntobbs.c342
1 files changed, 342 insertions, 0 deletions
diff --git a/daemon/innbbsd/inntobbs.c b/daemon/innbbsd/inntobbs.c
new file mode 100644
index 00000000..fca7c3d5
--- /dev/null
+++ b/daemon/innbbsd/inntobbs.c
@@ -0,0 +1,342 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "daemon.h"
+#include "bbslib.h"
+#include <time.h>
+#include "externs.h"
+
+#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 <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,
+};
+
+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;
+}
+
+void
+feedfplog(nf, filepath, type)
+ newsfeeds_t *nf;
+ char *filepath;
+ int type;
+{
+ char *path1;
+ 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 int bbsfeedson = -1;
+
+void
+init_bbsfeedsfp(void)
+{
+ if (bbsfeedsfp != NULL) {
+ fclose(bbsfeedsfp);
+ bbsfeedsfp = NULL;
+ }
+ bbsfeedson = -1;
+}
+
+void
+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 int echomaillogon = -1;
+
+void
+init_echomailfp(void)
+{
+ if (echomailfp != NULL) {
+ fclose(echomailfp);
+ echomailfp = NULL;
+ }
+ echomaillogon = -1;
+}
+
+void
+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);
+}
+
+void
+readlines(client)
+ ClientType *client;
+{
+ 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
+}
+
+void
+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;
+}
+
+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;
+}
+
+#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