1 5cdb1798 2005-10-29 devnull #include "common.h"
2 5cdb1798 2005-10-29 devnull #include "send.h"
4 5cdb1798 2005-10-29 devnull #undef isspace
5 5cdb1798 2005-10-29 devnull #define isspace(c) ((c)==' ' || (c)=='\t' || (c)=='\n')
8 5cdb1798 2005-10-29 devnull * skip past all systems in equivlist
10 5cdb1798 2005-10-29 devnull extern char*
11 5cdb1798 2005-10-29 devnull skipequiv(char *base)
13 5cdb1798 2005-10-29 devnull char *sp;
14 5cdb1798 2005-10-29 devnull static Biobuf *fp;
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)
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 */
24 5cdb1798 2005-10-29 devnull base=sp+1;
26 5cdb1798 2005-10-29 devnull /* no files or system is not found, and not us */
31 5cdb1798 2005-10-29 devnull return base;
34 5cdb1798 2005-10-29 devnull static int
35 5cdb1798 2005-10-29 devnull okfile(char *cp, Biobuf *fp)
37 5cdb1798 2005-10-29 devnull char *buf;
39 5cdb1798 2005-10-29 devnull char *bp, *ep;
42 5cdb1798 2005-10-29 devnull len = strlen(cp);
43 5cdb1798 2005-10-29 devnull Bseek(fp, 0, 0);
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==',')
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;
56 5cdb1798 2005-10-29 devnull while(bp < ep && (!isspace(*bp)) && *bp!=',')
61 5cdb1798 2005-10-29 devnull /* didn't find it, prohibit forwarding */
62 5cdb1798 2005-10-29 devnull return 0;
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
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)
72 5cdb1798 2005-10-29 devnull static String *file = 0;
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;
82 5cdb1798 2005-10-29 devnull local = 0;
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;
90 5cdb1798 2005-10-29 devnull global = 0;
92 5cdb1798 2005-10-29 devnull return (local || global)? 0 : -1;