1 /***************************************************************************
2  * File request support
3  ***************************************************************************/
4 /*
5  * $Id: freq.c,v 1.7 2005/05/17 18:17:42 mitry Exp $
6  *
7  * $Log: freq.c,v $
8  * Revision 1.7  2005/05/17 18:17:42  mitry
9  * Removed system basename() usage.
10  * Added qbasename() implementation.
11  *
12  * Revision 1.6  2005/05/11 13:22:40  mitry
13  * Snapshot
14  *
15  * Revision 1.5  2005/03/28 17:02:52  mitry
16  * Pre non-blocking i/o update. Mostly non working.
17  *
18  * Revision 1.4  2005/02/12 18:54:16  mitry
19  * Fixing lost /tmp/qrep.xxxx files.
20  *
21  */
22 
23 #include "headers.h"
24 #include "nodelist.h"
25 
freq_ifextrp(slist_t * reqs)26 int freq_ifextrp(slist_t *reqs)
27 {
28     FILE *f, *g, *r;
29     char s[MAX_PATH], fn[MAX_PATH], sfn[MAX_PATH], *ss;
30     char priv = 'a', *p, *sprt = "UNPROTEC", *slst = "UNLIS";
31     int got = 0, wz = cfgs( CFG_EXTRP ) ? 1 : 0, kil;
32     long tpid = (long) getpid();
33     ftnaddr_t *ma = akamatch( &rnode->addrs->addr, cfgal( CFG_ADDRESS ));
34 
35     DEBUG(('R',1,"Freq received"));
36 
37     if ( rnode->options & O_LST ) {
38         priv = 'l';
39         slst += 2;
40     }
41     if( rnode->options & O_PWD ) {
42         priv = 'p';
43         sprt += 2;
44     }
45 
46     snprintf( fn, MAX_PATH, "/tmp/qreq.%04lx", tpid );
47     if( !( f = fopen( fn, "wt" ))) {
48         write_log( "can't open '%s' for writing: %s", fn, strerror( errno ));
49         return 0;
50     }
51 
52     while( reqs ) {
53         if ( cfgs( CFG_MAPIN ) && strchr( ccs, 'r' ))
54             recode_to_local( reqs->str );
55         DEBUG(('R',1,"requested '%s'", reqs->str));
56         fprintf( f, "%s\n", reqs->str );
57         reqs = reqs->next;
58     }
59     fclose( f );
60     if(!wz) {
61         falist_t *ra;
62         snprintf(sfn,MAX_PATH,"/tmp/qsrif.%04lx",tpid);
63         if(!(r=fopen(sfn,"wt"))){write_log("can't open '%s' for writing: %s",sfn,strerror(errno));return 0;}
64         fprintf(r,"SessionType %s\n",bink?"OTHER":"EMSI");
65         fprintf(r,"Sysop %s\n",rnode->sysop);
66         for(ra=rnode->addrs;ra;ra=ra->next)fprintf(r,"AKA %s\n",ftnaddrtoa(&ra->addr));
67         if(!is_ip)fprintf(r,"Baud %d\n",rnode->realspeed);
68         fprintf(r,"Time -1\n");
69         fprintf(r,"RemoteStatus %sTED\n",sprt);
70         fprintf(r,"SystemStatus %sTED\n",slst);
71         fprintf(r,"RequestList /tmp/qreq.%04lx\n",tpid);
72         fprintf(r,"ResponseList /tmp/qfls.%04lx\n",tpid);
73         fprintf(r,"Location %s\n",rnode->place);
74         if(rnode->phone&&*rnode->phone)fprintf(r,"Phone %s\n",rnode->phone);
75         if(rnode->options&O_PWD)fprintf(r,"Password %s\n",rnode->pwd);
76         fprintf(r,"Mailer %s\n",rnode->mailer);
77         fprintf(r,"Site %s\n",rnode->name);
78         if(!is_ip&&(ss=getenv("CALLER_ID"))&&strcasecmp(ss,"none")&&strlen(ss)>3)fprintf(r,"CallerID %s\n",ss);
79         fprintf(r,"OurAKA %s\n",ftnaddrtoa(ma));
80         fprintf(r,"TRANX %08lu\n",time(NULL));
81         fclose(r);
82         snprintf(s,MAX_PATH,"%s %s",cfgs(CFG_SRIFRP),sfn);
83     } else snprintf(s,MAX_PATH,"%s -wazoo -%c -s%d %s /tmp/qreq.%04lx /tmp/qfls.%04lx /tmp/qrep.%04lx",
84             cfgs(CFG_EXTRP),priv,rnode->realspeed,ftnaddrtoa(&rnode->addrs->addr),tpid,tpid,tpid);
85     write_log("exec '%s' returned rc=%d",s,execsh(s));
86     lunlink(fn);lunlink(sfn);
87     snprintf(fn,MAX_PATH,"/tmp/qfls.%04lx",tpid);
88     if(!(f=fopen(fn,"rt"))) {
89         snprintf(fn,MAX_PATH,"/tmp/qrep.%04lx",tpid);
90         lunlink(fn);
91         snprintf(fn,MAX_PATH,"/tmp/qfls.%04lx",tpid);
92         lunlink(fn);
93         write_log("can't open '%s' for reading",fn);
94         return 0;
95     }
96     while(fgets(s,MAX_PATH-1,f)) {
97         if(*s=='\n'||*s=='\r'||*s==' '||!*s)continue;
98         ss=s;kil=0;got=1;
99         if(*s=='='||*s=='-'){ss++;kil=1;}
100             else if(*s=='+')ss++;
101         p=ss+strlen(ss)-1;
102         while(*p=='\r'||*p=='\n')*p--=0;
103         p=strrchr(ss,' ');
104         if(p)*p++=0;else p=ss;
105         DEBUG(('R',1,"sending '%s' as '%s'%s",ss,qbasename((p!=ss)?p:ss),kil?" and kill":""));
106         addflist(&fl,xstrdup(ss),xstrdup(qbasename((p!=ss)?p:ss)),kil?'^':' ',0,NULL,0);
107     }
108     fclose(f);lunlink(fn);
109     snprintf(fn,MAX_PATH,"/tmp/qrep.%04lx",tpid);
110     if(!(f=fopen(fn,"rt"))&&wz)write_log("can't open '%s' for reading",fn);
111     snprintf(fn,MAX_PATH,"/tmp/qpkt.%04lx%02x",tpid,++freq_pktcount);
112     g=openpktmsg(ma,&rnode->addrs->addr,cfgs(CFG_FREQFROM),rnode->sysop,cfgs(CFG_FREQSUBJ),NULL,fn,1);
113     if(!g) {
114         write_log("can't open '%s' for writing: %s",fn,strerror(errno));
115         if(f)fclose(f);
116         freq_pktcount--;
117     }
118     if(f&&g) {
119         while(fgets(s,MAX_PATH-1,f)) {
120             p=s+strlen(s)-1;
121             while(*p=='\r'||*p=='\n')*p--=0;
122             if(cfgi(CFG_RECODEPKTS))recode_to_remote(s);
123             fputs(s,g);fputc('\r',g);
124         }
125         fclose(f);
126         closeqpkt(g,ma);
127         snprintf(s,MAX_PATH,"/tmp/qpkt.%04lx%02x",tpid,freq_pktcount);
128         p=xstrdup(s);
129         snprintf(s,MAX_PATH,"%08lx.pkt",sequencer());
130         addflist(&fl,p,xstrdup(s),'^',0,NULL,1);
131     }
132     snprintf(fn,MAX_PATH,"/tmp/qrep.%04lx",tpid);
133     lunlink(fn);
134     return got;
135 }
136 
freq_recv(char * fn)137 int freq_recv(char *fn)
138 {
139     FILE *f;
140     char s[MAX_PATH],*p;
141     slist_t *reqs=NULL;
142     f=fopen(fn,"rt");
143     if(!f){write_log("can't open '%s' for reading: %s",fn,strerror(errno));return 0;}
144     while(fgets(s,MAX_PATH-1,f)) {
145         p=s+strlen(s)-1;
146         while(*p=='\r'||*p=='\n')*p--=0;
147         slist_add(&reqs,s);
148     }
149     fclose(f);
150     freq_ifextrp(reqs);
151     slist_kill(&reqs);
152     got_req=1;
153     return 1;
154 }
155 
156 /* Checks if our system can process FREQs
157    Returns:
158       -1 - FREQs are not handled at all
159        0 - FREQs are handled but not at this time
160        1 - Remote can do FREQs
161  */
is_freq_available(void)162 int is_freq_available( void )
163 {
164     if ( !cfgs( CFG_EXTRP ) && !cfgs( CFG_SRIFRP ))
165         return FR_NOTHANDLED;
166 
167     return (( cfgs( CFG_EXTRP ) || cfgs( CFG_SRIFRP ))
168             && checktimegaps( cfgs( CFG_FREQTIME )));
169 }
170