xref: /plan9/sys/src/cmd/upas/send/skipequiv.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
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