summaryrefslogblamecommitdiffstats
path: root/innbbsd/inntobbs.c
blob: b57d8bb184d1e1379e88bb526aff24de3f66fe1a (plain) (tree)


































































































































































































































































































































                                                                                                                            
#include <stdio.h>
#include "daemon.h"
#include "bbslib.h"
#include <time.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,
};
*/

char *strchr ARG((char*,int));
char *strrchr ARG((char*,int));
char *strstr ARG((char*,char*));

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);
    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