/* * sendsys: deal with forwarding messages to other systems */ #include #include #include "news.h" char *strchr(); char *strtok(); FILE *fopen(); /* * the systems we're connected to, set up by first call to sendsys */ struct forward *systems = (struct forward *)0; sendsys(sys, path, file) register char *sys, *path; char *file; { register siz = strlen(sys); char *strchr(); register FILE *list; register char listfile[128]; while (isspace(*path)) ++path; while (path) { if (strncmp(path, sys, siz) == 0 && (path[siz] == '!' || path[siz] == 0)) return; if (path=strchr(path, '!')) path++; } if (list=fopen(makepath(listfile, SYSTEMS, sys), "a")) { fprintf(list, "%s\n", file); fclose(list); } } /* * advance scans the network list for systems to send a message in `group' * to. */ advance(group, path, file) register char *group, *path; char *file; { FILE *sys; struct foward *malloc(); char *strchr(); register char *p; char *q; register struct forward *tmp; register struct pat *pp; char system[40], groups[160]; char textline[160]; register count; if (!systems) { if (sys=fopen(makepath(textline, NETDIR, SYSTEMS), "r")) { while (fgets(textline, 160, sys)) { count=sscanf(textline, "%40[^:]:%160[^:\n]", system, groups); if (count > 0) { tmp = malloc(sizeof(struct forward)+strlen(system)); if (tmp == 0) panic("out of memory"); strcpy(tmp->system, system); tmp->nextsys = systems; systems = tmp; tmp->sendpat = NULL; for (p=groups; p; p=q) { if (q=strchr(p, ',')) *q++ = 0; pp = (struct pat *)malloc(sizeof(struct pat)+strlen(p)); if (pp = 0) panic("out of memory"); if (pp->pat_excl = (*p == '!')) ++p; strcpy(pp->pattern, p); pp->nextpat = tmp->sendpat; tmp->sendpat = pp; p = q; } } } fclose(sys); } } for (tmp=systems; tmp; tmp=tmp->nextsys) { if (tmp->sendpat == NULL) sendsys(tmp->system, path); else for (pp=tmp->sendpat; pp; pp=pp->nextpat) if (strnicmp(pp->pattern, group, strlen(pp->pattern)) == 0) { if (pp->pat_excl == 0) sendsys(tmp->system, path, file); break; } } } /* advance */