1*7dd7cddfSDavid du Colombier #include "common.h"
2*7dd7cddfSDavid du Colombier #include "send.h"
3*7dd7cddfSDavid du Colombier
4*7dd7cddfSDavid du Colombier #define isspace(c) ((c)==' ' || (c)=='\t' || (c)=='\n')
5*7dd7cddfSDavid du Colombier
6*7dd7cddfSDavid du Colombier /*
7*7dd7cddfSDavid du Colombier * skip past all systems in equivlist
8*7dd7cddfSDavid du Colombier */
9*7dd7cddfSDavid du Colombier extern char*
skipequiv(char * base)10*7dd7cddfSDavid du Colombier skipequiv(char *base)
11*7dd7cddfSDavid du Colombier {
12*7dd7cddfSDavid du Colombier char *sp;
13*7dd7cddfSDavid du Colombier static Biobuf *fp;
14*7dd7cddfSDavid du Colombier
15*7dd7cddfSDavid du Colombier while(*base){
16*7dd7cddfSDavid du Colombier sp = strchr(base, '!');
17*7dd7cddfSDavid du Colombier if(sp==0)
18*7dd7cddfSDavid du Colombier break;
19*7dd7cddfSDavid du Colombier *sp = '\0';
20*7dd7cddfSDavid du Colombier if(lookup(base, "equivlist", &fp, 0, 0)==1){
21*7dd7cddfSDavid du Colombier /* found or us, forget this system */
22*7dd7cddfSDavid du Colombier *sp='!';
23*7dd7cddfSDavid du Colombier base=sp+1;
24*7dd7cddfSDavid du Colombier } else {
25*7dd7cddfSDavid du Colombier /* no files or system is not found, and not us */
26*7dd7cddfSDavid du Colombier *sp='!';
27*7dd7cddfSDavid du Colombier break;
28*7dd7cddfSDavid du Colombier }
29*7dd7cddfSDavid du Colombier }
30*7dd7cddfSDavid du Colombier return base;
31*7dd7cddfSDavid du Colombier }
32*7dd7cddfSDavid du Colombier
33*7dd7cddfSDavid du Colombier static int
okfile(char * cp,Biobuf * fp)34*7dd7cddfSDavid du Colombier okfile(char *cp, Biobuf *fp)
35*7dd7cddfSDavid du Colombier {
36*7dd7cddfSDavid du Colombier char *buf;
37*7dd7cddfSDavid du Colombier int len;
38*7dd7cddfSDavid du Colombier char *bp, *ep;
39*7dd7cddfSDavid du Colombier int c;
40*7dd7cddfSDavid du Colombier
41*7dd7cddfSDavid du Colombier len = strlen(cp);
42*7dd7cddfSDavid du Colombier Bseek(fp, 0, 0);
43*7dd7cddfSDavid du Colombier
44*7dd7cddfSDavid du Colombier /* one iteration per system name in the file */
45*7dd7cddfSDavid du Colombier while(buf = Brdline(fp, '\n')) {
46*7dd7cddfSDavid du Colombier ep = &buf[Blinelen(fp)];
47*7dd7cddfSDavid du Colombier for(bp=buf; bp < ep;){
48*7dd7cddfSDavid du Colombier while(isspace(*bp) || *bp==',')
49*7dd7cddfSDavid du Colombier bp++;
50*7dd7cddfSDavid du Colombier if(strncmp(bp, cp, len) == 0) {
51*7dd7cddfSDavid du Colombier c = *(bp+len);
52*7dd7cddfSDavid du Colombier if(isspace(c) || c==',')
53*7dd7cddfSDavid du Colombier return 1;
54*7dd7cddfSDavid du Colombier }
55*7dd7cddfSDavid du Colombier while(bp < ep && (!isspace(*bp)) && *bp!=',')
56*7dd7cddfSDavid du Colombier bp++;
57*7dd7cddfSDavid du Colombier }
58*7dd7cddfSDavid du Colombier }
59*7dd7cddfSDavid du Colombier
60*7dd7cddfSDavid du Colombier /* didn't find it, prohibit forwarding */
61*7dd7cddfSDavid du Colombier return 0;
62*7dd7cddfSDavid du Colombier }
63*7dd7cddfSDavid du Colombier
64*7dd7cddfSDavid du Colombier /* return 1 if name found in one of the files
65*7dd7cddfSDavid du Colombier * 0 if name not found in one of the files
66*7dd7cddfSDavid du Colombier * -1 if neither file exists
67*7dd7cddfSDavid du Colombier */
68*7dd7cddfSDavid du Colombier extern int
lookup(char * cp,char * local,Biobuf ** lfpp,char * global,Biobuf ** gfpp)69*7dd7cddfSDavid du Colombier lookup(char *cp, char *local, Biobuf **lfpp, char *global, Biobuf **gfpp)
70*7dd7cddfSDavid du Colombier {
71*7dd7cddfSDavid du Colombier static String *file = 0;
72*7dd7cddfSDavid du Colombier
73*7dd7cddfSDavid du Colombier if (local) {
74*7dd7cddfSDavid du Colombier if (file == 0)
75*7dd7cddfSDavid du Colombier file = s_new();
76*7dd7cddfSDavid du Colombier abspath(local, UPASLIB, s_restart(file));
77*7dd7cddfSDavid du Colombier if (*lfpp != 0 || (*lfpp = sysopen(s_to_c(file), "r", 0)) != 0) {
78*7dd7cddfSDavid du Colombier if (okfile(cp, *lfpp))
79*7dd7cddfSDavid du Colombier return 1;
80*7dd7cddfSDavid du Colombier } else
81*7dd7cddfSDavid du Colombier local = 0;
82*7dd7cddfSDavid du Colombier }
83*7dd7cddfSDavid du Colombier if (global) {
84*7dd7cddfSDavid du Colombier abspath(global, UPASLIB, s_restart(file));
85*7dd7cddfSDavid du Colombier if (*gfpp != 0 || (*gfpp = sysopen(s_to_c(file), "r", 0)) != 0) {
86*7dd7cddfSDavid du Colombier if (okfile(cp, *gfpp))
87*7dd7cddfSDavid du Colombier return 1;
88*7dd7cddfSDavid du Colombier } else
89*7dd7cddfSDavid du Colombier global = 0;
90*7dd7cddfSDavid du Colombier }
91*7dd7cddfSDavid du Colombier return (local || global)? 0 : -1;
92*7dd7cddfSDavid du Colombier }
93