]> code.citadel.org Git - citadel.git/blobdiff - citadel/rcit.c
fix all the <time.h> vs. <sys/time.h> issues, hopefully
[citadel.git] / citadel / rcit.c
index 5308bf3ed1f8d73a24d3785c7291fcc375973b38..c34b0769343fb8e02ed4d740ac6de1a02c773717 100644 (file)
-#define UNCOMPRESS "/usr/bin/gunzip"
-
-/* Citadel/UX rnews
- * version 2.8
+/* $Id$
  *
- * This program functions the same as the standard rnews program for
- * UseNet. It accepts standard input, and looks for rooms to post messages
- * (translated from UseNet format to the Citadel/UX binary message format)
- * in that match the names of the newsgroups. network/rnews.xref is checked
- * in case the sysop wants to cross-reference room names to newsgroup names.
- * If standard input is already in binary, the -c flag should be used.
- *   The netproc program is then called to do the processing.
+ * This program simply feeds its standard input to the networker.  It is
+ * used primarily to hook up to UUCP feeds of Citadel data.
  *
- * If you have a separate newsreader and don't want to use Citadel for news,
- * just call this program something else (rcit, for example) -- but make sure
- * to tell your Citadel network neighbors the new name of the program to call.
  * 
  * usage:
- *     rnews [-c] [-z] [-s]
+ *     rcit [-z] [-s]
  * flags:
- *     -c      Input is already in Citadel binary format
- *             (default is UseNet news format)
  *     -z      Input is compressed, run uncompress on it before processing
  *     -s      Don't run netproc now, just accept the input into spoolin
  */
 
+#define UNCOMPRESS "/usr/bin/gunzip"
 #include <stdlib.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <stdio.h>
 #include <ctype.h>
 #include <string.h>
-#include <time.h>
-#include "citadel.h"
-
-void get_config();
-struct config config;
-
-char roomlist[MAXROOMS][20];
-
-void load_roomlist() {
-       FILE *fp;
-       struct quickroom QRtemp;
-       int a;
 
-       for (a=0; a<MAXROOMS; ++a) strcpy(roomlist[a],TWITROOM);
-       fp=fopen("quickroom","r");
-       if (fp==NULL) return;
-       for (a=0; a<MAXROOMS; ++a) {
-               fread((char *)&QRtemp,sizeof(struct quickroom),1,fp);
-               if (QRtemp.QRflags & QR_INUSE)
-                       strcpy(roomlist[a],QRtemp.QRname);
-               }
-       fclose(fp);
-       }
-
-int struncmp(lstr,rstr,len)
-char lstr[],rstr[];
-int len; {
-       int pos = 0;
-       char lc,rc;
-       while (pos<len) {
-               lc=tolower(lstr[pos]);
-               rc=tolower(rstr[pos]);
-               if ((lc==0)&&(rc==0)) return(0);
-               if (lc<rc) return(-1);
-               if (lc>rc) return(1);
-               pos=pos+1;
-               }
-       return(0);
-       }
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
 
+#include "citadel.h"
 
-int rnewsxref(room,ngroup)             /* xref table */
-char room[]; 
-char ngroup[]; {
-       FILE *fp;
-       int a,b;
-       char aaa[50],bbb[50];
-       
-       strcpy(room,ngroup);
-       fp=fopen("network/rnews.xref","r");
-GNA:   strcpy(aaa,""); strcpy(bbb,"");
-       do {
-               a=getc(fp);
-               if (a==',') a=0;
-               if (a>0) { b=strlen(aaa); aaa[b]=a; aaa[b+1]=0; }
-               } while(a>0);
-       do {
-               a=getc(fp);
-               if (a==10) a=0;
-               if (a>0) { b=strlen(bbb); bbb[b]=a; bbb[b+1]=0; }
-               } while(a>0);
-       if (a<0) {
-               fclose(fp);
-               return(1);
-               }
-       if (strucmp(ngroup,aaa)) goto GNA;
-       fclose(fp);
-       strcpy(room,bbb);
-       return(0);
-       }
-
-
-void getroom(room,ngroup)
-char room[];
-char ngroup[]; {
-       char ngbuf[256];
-       char tryme[256];
-       int a,b;
-       struct quickroom qbuf;
-
-       strcpy(ngbuf,ngroup);
-       strcat(ngbuf,",");
-       for (a=0; a<strlen(ngbuf); ++a) {
-               if ((ngbuf[a]==',')||(ngbuf[a]==0)) {
-                       strcpy(tryme,ngbuf);    
-                       tryme[a]=0;
-                       if (!rnewsxref(room,tryme)) return;
-                       room[sizeof(qbuf.QRname)-1]=0;
-                       for (b=0; b<MAXROOMS; ++b) {
-                               if (!strucmp(roomlist[b],room)) return;
-                               }
-                       strcpy(ngbuf,&ngbuf[a+1]);
-                       a=(-1);
-                       }
-               }
-       }
+void get_config(void);
+struct config config;
 
-void main(argc,argv)
-int argc;
-char *argv[]; {
-       char aaa[128],bbb[128],ccc[128];
-       char author[128],recipient[128],room[128],node[128],path[512];
-       char subject[128];
-       char orgname[128];
-       long mid = 0L;
-       long now,bcount,aa;
+int main(int argc, char **argv)
+{
        int a;
        char flnm[128],tname[128];
-       FILE *minput,*mout,*mtemp;
-       char binary_input = 0;
+       FILE *minput, *mout;
        char compressed_input = 0;
        char spool_only = 0;
 
        get_config();
-       sprintf(flnm,"./network/spoolin/rnews.%d",getpid());
-       sprintf(tname,"/tmp/rnews.%d",getpid());
+       sprintf(flnm,"./network/spoolin/rcit.%ld", (long)getpid());
+       strcpy(tname, tmpnam(NULL));
 
        for (a=1; a<argc; ++a) {
-               if (!strcmp(argv[a],"-c")) binary_input = 1;
                if (!strcmp(argv[a],"-z")) compressed_input = 1;
                if (!strcmp(argv[a],"-s")) spool_only = 1;
-               }
+       }
 
        minput=stdin;
        if (compressed_input) minput=popen(UNCOMPRESS,"r");
        if (minput==NULL) fprintf(stderr,"rnews: can't open input!!!!\n");
 
        mout=fopen(flnm,"w");
-
-       /* process Citadel/UX binary format input */
-       if (binary_input) {
-               while ((a=getc(minput))>=0) putc(a,mout);
-               goto END;
-               }
-
-       /* process UseNet news input */
-       load_roomlist();
-A:     if (fgets(aaa,128,minput)==NULL) goto END;
-       aaa[strlen(aaa)-1]=0;
-       if (strncmp(aaa,"#! rnews ",9)) goto A;
-       bcount=atol(&aaa[9]);
-       mtemp=fopen(tname,"w");
-       for (aa=0L; aa<bcount; ++aa) {
-               a=getc(minput);
-               if (a<0) goto NMA;
-               if (a>=0) putc(a,mtemp);
-               }
-NMA:   fclose(mtemp);
-       if (a<0) {
-               fprintf(stderr,"rnews: EOF unexpected\n");
-               goto END;
-               }
-
-       mtemp=fopen(tname,"r");
-       strcpy(author,"");
-       strcpy(recipient,"");
-       strcpy(room,"");
-       strcpy(node,"");
-       strcpy(path,"");
-       strcpy(orgname,"");
-       strcpy(subject,"");
-
-B:     if (fgets(aaa,128,mtemp)==NULL) goto ABORT;
-       aaa[strlen(aaa)-1]=0;
-       if (strlen(aaa)==0) goto C;
-
-
-       if (!strncmp(aaa,"From: ",6)) {
-               strcpy(author,&aaa[6]);
-               while((author[0]==' ')&&(strlen(author)>0))
-                       strcpy(author,&author[1]);
-               for (a=0; a<strlen(author); ++a) {
-                       if (author[a]=='<') author[a-1]=0;
-                       if (author[a]==')') author[a]=0;
-                       if (author[a]=='(') {
-                               strcpy(author,&author[a+1]);
-                               a=0;
-                               }
-                       }
-               if (!strcmp(author,")")) {
-                       strcpy(author,&aaa[6]);
-                       for (a=0; a<strlen(author); ++a)
-                               if (author[a]=='@') author[a]=0;
-                       }
-               strcpy(node,&aaa[6]);
-               for (a=0; a<strlen(node); ++a) {
-                       if ((node[a]=='<')||(node[a]=='@')) {
-                               strcpy(node,&node[a+1]);
-                               a=0;
-                               }
-                       if (node[a]=='>') node[a]=0;
-                       if (node[a]=='(') node[a-1]=0;
-                       }
-               for (a=0; a<strlen(author); ++a)
-                       if (author[a]=='@') author[a]=0;
-               }
-
-       if (!strncmp(aaa,"Path: ",6)) strcpy(path,&aaa[6]);
-       if (!strncmp(aaa,"To: ",4)) strcpy(recipient,&aaa[4]);
-       if (!strncmp(aaa,"Subject: ",9)) strcpy(subject,&aaa[9]);
-       if (!strncmp(aaa,"Organization: ",14)) strcpy(orgname,&aaa[14]);
-
-       if (!strncmp(aaa,"Newsgroups: ",11)) {
-               strcpy(room,&aaa[12]);
-               for (a=0; a<strlen(aaa); ++a) if (aaa[a]==',') aaa[a]=0;
-               goto B;
-               }
-
-       if (!strncmp(aaa,"Message-ID: ",11)) {
-               strcpy(bbb,&aaa[13]);
-               for (a=0; a<strlen(bbb); ++a) if (bbb[a]=='@') bbb[a]=0;
-               mid=atol(bbb);
-               while((aaa[0]!='@')&&(aaa[0]!=0)) {
-                       strcpy(&aaa[0],&aaa[1]);
-                       }
-               strcpy(&aaa[0],&aaa[1]);
-               for (a=0; a<strlen(aaa); ++a) if (aaa[a]=='>') aaa[a]=0;
-               strcpy(node,aaa);
-               goto B;
-               }
-               goto B;
-
-C:     if ((author[0]==0)||(room[0]==0)||(node[0]==0)) goto ABORT;
-       putc(255,mout);                 /* start of message */
-       putc(MES_NORMAL,mout);          /* not anonymous */
-       putc(1,mout);                   /* not formatted */
-       time(&now);
-
-       fprintf(mout,"I%ld",mid); putc(0,mout);
-       fprintf(mout,"P%s",path); putc(0,mout);
-       fprintf(mout,"T%ld",now); putc(0,mout);
-       fprintf(mout,"A%s",author); putc(0,mout);
-       strcpy(ccc,room);
-       getroom(room,ccc);
-       fprintf(mout,"O%s",room); putc(0,mout);
-       fprintf(mout,"N%s",node); putc(0,mout);
-       if (orgname[0]!=0) {
-               fprintf(mout,"H%s",orgname); putc(0,mout);
-               }
-       if (recipient[0]!=0) {
-               fprintf(mout,"R%s",recipient); putc(0,mout);
-               }
-       if (subject[0]!=0) {
-               fprintf(mout,"U%s",subject); putc(0,mout);
-               }
-       fprintf(mout,"M");
-       a=0;
-       aaa[0]=0;
-
-       do {
-               a=getc(mtemp);
-               if (a>0) putc(a,mout);
-               } while (a>0);
+       while ((a=getc(minput))>=0) putc(a,mout);
        putc(0,mout);
-ABORT: fclose(mtemp);
-       unlink(tname);
-       goto A;
-
-END:   putc(0,mout);
        fclose(mout);
+
        unlink(tname);
        if (compressed_input) pclose(minput);
-       if (!spool_only) execlp("./netproc","netproc",NULL);
+       if (!spool_only) execlp("./netproc", "netproc", "-i", NULL);
        exit(0);
 }