Blame


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