1 # include <stdio.h> 2 # include "sendmail.h" 3 # include <ctype.h> 4 5 static char SccsId[] = "@(#)readcf.c 3.3 03/28/81"; 6 7 /* 8 ** READCF -- read control file. 9 ** 10 ** This routine reads the control file and builds the internal 11 ** form. 12 ** 13 ** Parameters: 14 ** cfname -- control file name. 15 ** 16 ** Returns: 17 ** none. 18 ** 19 ** Side Effects: 20 ** Builds several internal tables. 21 */ 22 23 struct rewrite *RewriteRules; 24 25 26 readcf(cfname) 27 char *cfname; 28 { 29 FILE *cf; 30 char buf[MAXLINE]; 31 register char *p; 32 struct rewrite *rwp = NULL; 33 extern char *xalloc(); 34 extern char **prescan(); 35 extern char **copyplist(); 36 extern char *rindex(); 37 extern char *newstr(); 38 39 cf = fopen(cfname, "r"); 40 if (cf == NULL) 41 { 42 syserr("cannot open %s", cfname); 43 exit(EX_OSFILE); 44 } 45 46 while (fgets(buf, sizeof buf, cf) != NULL) 47 { 48 p = rindex(buf, '\n'); 49 if (p != NULL) 50 *p = '\0'; 51 52 switch (buf[0]) 53 { 54 case '\n': 55 case '\0': 56 case ' ': 57 case '\t': 58 case '#': /* comment */ 59 break; 60 61 case 'R': /* rewriting rule */ 62 for (p = &buf[1]; *p != '\0' && *p != '\t'; p++) 63 continue; 64 65 if (*p == '\0') 66 syserr("invalid rewrite line \"%s\"", buf); 67 else 68 { 69 if (rwp == NULL) 70 RewriteRules = rwp = (struct rewrite *) xalloc(sizeof *rwp); 71 else 72 { 73 rwp->r_next = (struct rewrite *) xalloc(sizeof *rwp); 74 rwp = rwp->r_next; 75 } 76 rwp->r_next = NULL; 77 78 rwp->r_lhs = prescan(&buf[1], '\t'); 79 if (rwp->r_lhs != NULL) 80 rwp->r_lhs = copyplist(rwp->r_lhs, TRUE); 81 while (*p == '\t') 82 p++; 83 rwp->r_rhs = prescan(p, '\t'); 84 if (rwp->r_rhs != NULL) 85 rwp->r_rhs = copyplist(rwp->r_rhs, TRUE); 86 } 87 break; 88 89 case 'D': /* macro definition */ 90 define(buf[1], newstr(&buf[2])); 91 break; 92 93 case 'H': /* required header line */ 94 chompheader(&buf[1], TRUE); 95 break; 96 97 default: 98 syserr("unknown control line \"%s\"", buf); 99 } 100 } 101 102 /* 103 printrules(); 104 */ 105 } 106 /* 107 ** RWCRACK -- crack rewrite line. 108 ** 109 ** Parameters: 110 ** l -- line to crack. 111 ** 112 ** Returns: 113 ** local copy of cracked line. 114 ** 115 ** Side Effects: 116 ** none. 117 */ 118 119 char ** 120 rwcrack(l) 121 register char *l; 122 { 123 char *av[MAXATOM]; 124 int ac = 0; 125 register char **avp; 126 char buf[MAXNAME]; 127 register char *b; 128 bool wasdelim = FALSE; 129 char *delims = ":@!^."; 130 extern char *index(); 131 bool tchange; 132 extern char *newstr(), *xalloc(); 133 134 for (avp = av; *l != '\0' && *l != '\n'; avp++) 135 { 136 b = buf; 137 tchange = FALSE; 138 while (!tchange) 139 { 140 if (*l != '$') 141 { 142 if (wasdelim || index(delims, *l) != NULL) 143 tchange = TRUE; 144 wasdelim = (index(delims, *l) != NULL); 145 if (wasdelim) 146 tchange = TRUE; 147 *b++ = *l++; 148 continue; 149 } 150 151 tchange = TRUE; 152 switch (*++l) 153 { 154 case '$': /* literal $ */ 155 *b++ = *l; 156 break; 157 158 case '+': /* match anything */ 159 *b++ = MATCHANY; 160 *b++ = *++l; 161 break; 162 163 case '-': /* match one token */ 164 *b++ = MATCHONE; 165 *b++ = *++l; 166 break; 167 168 case '#': /* canonical net name */ 169 *b++ = CANONNET; 170 break; 171 172 case '@': /* canonical host name */ 173 *b++ = CANONHOST; 174 break; 175 176 case ':': /* canonical user name */ 177 *b++ = CANONUSER; 178 break; 179 180 default: 181 *b++ = '$'; 182 l--; 183 break; 184 } 185 l++; 186 } 187 188 /* save the argument we have collected */ 189 *b = '\0'; 190 *avp = newstr(buf); 191 ac++; 192 } 193 194 /* allocate new space for vector */ 195 ac++; 196 *avp = NULL; 197 avp = (char **) xalloc(ac * sizeof *av); 198 bmove(av, avp, ac * sizeof *av); 199 200 return (avp); 201 } 202 /* 203 ** PRINTRULES -- print rewrite rules (for debugging) 204 ** 205 ** Parameters: 206 ** none. 207 ** 208 ** Returns: 209 ** none. 210 ** 211 ** Side Effects: 212 ** prints rewrite rules. 213 */ 214 215 printrules() 216 { 217 register struct rewrite *rwp; 218 219 for (rwp = RewriteRules; rwp != NULL; rwp = rwp->r_next) 220 { 221 register char **av; 222 223 printf("\n"); 224 for (av = rwp->r_lhs; *av != NULL; av++) 225 { 226 xputs(*av); 227 putchar('_'); 228 } 229 printf("\n\t"); 230 for (av = rwp->r_rhs; *av != NULL; av++) 231 { 232 xputs(*av); 233 putchar('_'); 234 } 235 printf("\n"); 236 } 237 } 238