2
* srif.c -- Create flags or run external programs on mail events
4
* srif.c is a part of binkd project
6
* Copyright (C) 1996-1997 Dima Maloff, 5047/13
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License as published by
10
* the Free Software Foundation; either version 2 of the License, or
11
* (at your option) any later version. See COPYING.
15
* $Id: srif.c,v 2.0 2001/01/10 12:12:39 gul Exp $
18
* Revision 2.0 2001/01/10 12:12:39 gul
19
* Binkd is under CVS again
21
* Revision 1.4 1997/06/16 05:40:33 mff
22
* Binkd will not complain about missing .rsp files when running
23
* programms with "exec" statement without using of *S macro.
25
* Revision 1.3 1997/03/28 06:12:48 mff
26
* Changes to support SRIF: + evt_run(), etc.
28
* Revision 1.2 1997/02/09 04:17:30 mff
31
* Revision 1.1 1997/01/08 03:57:54 mff
49
EVT_FLAG *evt_flags = 0;
52
* Tests if filename matches any of EVT_FLAG's patterns.
54
int evt_test (char *filename0)
57
char filename[MAXPATHLEN + 1];
60
strnzcpy (filename, filename0, MAXPATHLEN);
62
for (curr = evt_flags; curr; curr = curr->next)
64
if (pmatch (curr->pattern, filename))
70
Log (4, "got %s, creating %s", curr->pattern, curr->path);
71
create_empty_sem_file (curr->path);
79
else if ((curr->command) && (curr->imm))
81
Log (4, "got %s, starting %s", curr->pattern, curr->command);
90
* Sets flags for all matched with evt_test events
96
for (curr = evt_flags; curr; curr = curr->next)
100
Log (4, "got %s (%i), creating %s",
101
curr->pattern, curr->flag, curr->path);
103
create_empty_sem_file (curr->path);
108
/* Makes SRIF request and SRIF response names from FTN address of a node */
109
static int mksrifpaths (FTN_ADDR *fa, char *srf, char *rsp)
111
ftnaddress_to_filename (srf, fa);
114
strnzcpy (rsp, srf, MAXPATHLEN);
115
strnzcat (srf, ".srf", MAXPATHLEN);
116
strnzcat (rsp, ".rsp", MAXPATHLEN);
123
static int srif_fill (char *path, FTN_ADDR *fa, int nfa,
124
char *req, char *rsp,
125
int prot, int listed, char *peer_name)
130
if ((out = fopen (path, "w")) != 0)
132
fprintf (out, "Sysop sysop\n");
133
for (i = 0; i < nfa; ++i)
135
char adr[FTN_ADDR_SZ + 1];
137
ftnaddress_to_str (adr, fa + i);
138
fprintf (out, "AKA %s\n", adr);
140
fprintf (out, "Baud 115200\n");
141
fprintf (out, "Time -1\n");
142
fprintf (out, "RequestList %s\n", req);
143
fprintf (out, "ResponseList %s\n", rsp);
144
fprintf (out, "RemoteStatus %s\n", prot ? "PROTECTED" : "UNPROTECTED");
145
fprintf (out, "SystemStatus %s\n", listed ? "LISTED" : "UNLISTED");
146
fprintf (out, "CallerID %s\n", peer_name);
147
fprintf (out, "SessionType OTHER\n");
154
static FTNQ *parse_response (FTNQ *q, char *rsp, FTN_ADDR *fa)
156
FILE *in = fopen (rsp, "r");
160
char buf[MAXPATHLEN + 1];
165
if (!fgets (buf, MAXPATHLEN, in))
167
for (i = 0; i < sizeof (buf) - 1 && !isspace (buf[i]); ++i);
172
q = q_add_file (q, buf + 1, fa, 'h', 'd', 0);
175
q = q_add_file (q, buf + 1, fa, 'h', 0, 0);
178
q = q_add_file (q, buf + 1, fa, 'h', 'a', 0);
187
Log (1, "parse_response: %s: %s", rsp, strerror (errno));
191
static char valid_filename_chars[]=".\\-_:/@";
192
static void run_args(char *cmd, char *filename0, FTN_ADDR *fa,
193
int nfa, int prot, int listed, char *peer_name, STATE *st)
197
char *pn=peer_name?peer_name:"";
200
char adr[FTN_ADDR_SZ + 2];
203
unsigned int sw=1024;
207
if((!isalnum(fn[i])) && (!strchr(valid_filename_chars, fn[i])))
210
Log(4, "Invalid filename (%s) received!", filename0);
214
if((!isalnum(pn[i])) && (!strchr(valid_filename_chars, pn[i])))
221
struct sockaddr_in sin;
222
i=sizeof(struct sockaddr_in);
223
if((!st) || (getpeername (st->s, (struct sockaddr *) &sin, &i) == -1))
225
else /* We don't like inet_ntoa ;-) */
227
sin.sin_addr.s_addr=htonl(sin.sin_addr.s_addr);
228
sprintf(ipaddr, "%d.%d.%d.%d",
229
(int)(sin.sin_addr.s_addr>>24),
230
(int)((sin.sin_addr.s_addr>>16)&0xFF),
231
(int)((sin.sin_addr.s_addr>>8)&0xFF),
232
(int)(sin.sin_addr.s_addr&0xFF));
237
if(sw<=strlen(cmd)) sw=strlen(cmd)+1;
243
for(l=0;(l<strlen(w)) && ((sp=strchr(w+l, '*'))!=NULL); l++)
246
switch(toupper(sp[1]))
248
case 'N': /* short filename for win32 */
251
char ts[MAXPATHLEN+1];
252
i=GetShortPathName(filename0, ts, sizeof(ts));
253
if((i<1) || (i>MAXPATHLEN))
255
Log(2, "GetShortPathName() fails %d", GetLastError());
259
w = ed (w, "*N", ts, &sw);
264
w = ed (w, "*N", fn, &sw);
266
case 'F': /* filename */
268
w = ed (w, "*F", fn, &sw);
271
i=isdigit(sp[2])?(sp[2]-'0'):0;
273
ftnaddress_to_str (adr, fa+i);
277
if(!isdigit(sp[2])) /* If you will remove it, *A *A1 may not work */
283
w = ed (w, aka, adr, &sw);
285
case 'P': /* protected ? */
286
w = ed (w, "*P", prot?"1":"0", &sw);
288
case 'L': /* listed ? */
289
w = ed (w, "*L", listed?"1":"0", &sw);
291
case 'H': /* hostname or IP */
292
w = ed (w, "*H", pn, &sw);
297
if((fn!=filename0) && (use_fn))
298
Log(1, "Security problem. Execution aborted...");
305
* Runs external programs using S.R.I.F. interface
306
* if the name matches one of our "exec"'s
308
FTNQ *evt_run (FTNQ *q, char *filename0,
309
FTN_ADDR *fa, int nfa,
310
int prot, int listed, char *peer_name, STATE *st)
313
char filename[MAXPATHLEN + 1];
315
strnzcpy (filename, filename0, MAXPATHLEN);
317
for (curr = evt_flags; curr; curr = curr->next)
319
if (curr->command && pmatch (curr->pattern, filename) &&
320
((!st && !curr->imm) || (curr->imm && st)) )
322
char srf[MAXPATHLEN + 1], rsp[MAXPATHLEN + 1];
324
if (strstr (curr->command, "*S") || strstr (curr->command, "*s"))
326
if (mksrifpaths (fa, srf, rsp))
328
char *w = ed (curr->command, "*S", srf, NULL);
330
if (srif_fill (srf, fa, nfa, filename0, rsp, prot, listed, peer_name))
332
run_args (w, filename0, fa, nfa, prot, listed, peer_name, st);
335
Log (1, "srif_fill: error");
337
q = parse_response (q, rsp, fa);
342
Log (1, "mksrifpaths: error");
345
run_args (curr->command, filename0, fa, nfa, prot, listed, peer_name, st);