/** * read the machine list file from file. */ linkedlist* read_machinelist(linkedlist * machinelist, const char * listfile, const char*alternatelistfile) { FILE * f; size_t bufferlen = 1024; char * buf = malloc_with_error(bufferlen); if ((f = fopen (listfile, "r")) || ((NULL != alternatelistfile) && (f=fopen(alternatelistfile, "r")))) { while (-1 != getline (&buf, &bufferlen, f)) { const char * strippedstring = stripwhitespace(buf); if (strippedstring) machinelist=machinelist_lladd(machinelist,strippedstring); } fclose(f); } else { if (alternatelistfile) fprintf (stderr, _("%s: File %s nor %s could not be opened for read\n"), PACKAGE, listfile, alternatelistfile); else fprintf (stderr, _("%s: File %s could not be opened for read\n"), PACKAGE, listfile); exit (1); /* It should fail on error */ } free (buf); return machinelist; }
//******************************************************* // Take supplied filename and open it, then parse the contents. // Upon return following set: // // OR we failed -1. int readConfig(char *configFileName) { char linein[256]; int len; const char delimiters[] = "="; char *lefttoken, *righttoken; char *cp; // Used if building white/blacklist struct in6_addr listEntry; strncpy( interfacestr, NPDAEMON_WAN_IF_NAME, sizeof(interfacestr)); flog(LOG_INFO, "Supplied interface is %s", interfacestr); listType = NOLIST; if (tRoot != NULL) { tdestroy(tRoot, free); tEntries = 0; } tRoot = NULL; collectTargets = 100; naLinkOptFlag = 0; nsIgnoreLocal = 1; naRouter = 1; maxHops = 255; interfaceIdx = if_nametoindex(interfacestr); if (!interfaceIdx) { flog(LOG_ERR, "Could not get ifIndex for interface %s", interfacestr); return 1; } while (getLinkaddress( interfacestr, linkAddr) ) { flog(LOG_ERR, "failed to convert interface specified to a link-level address continue."); sleep(1); } return 0; if ((configFileFD = fopen(configFileName, "r")) == NULL) { fprintf(stderr, "Can't open %s: %s\n", configFileName, strerror(errno)); flog(LOG_ERR, "Can't open config file %s: %s", configFileName, strerror(errno)); } // This is real simple config file parsing... do { int strToken, strIdx; len = 0; if (fgets(linein, 128, configFileFD) == NULL) break; // Tidy it up stripwhitespace(linein); // Special mega-hacky thing for blank lines: len = strlen(linein); if (len==0) { len=1; continue; } // Tokenize cp = strdupa(linein); lefttoken = strtok(cp, delimiters); righttoken = strtok(NULL, delimiters); if ( (lefttoken == NULL) || (righttoken == NULL) ) { continue; } // Match token strIdx = -1; for(strToken = 0; strToken < CONFIGTOTAL; strToken++) { if( !strcmp(lefttoken, configStrs[strToken]) ) { strIdx = strToken; // Matched, so drop to next step break; } } flog(LOG_DEBUG2, "Matched config item index: %d", strIdx); // If config params are being added, it should only be required // to update the strings in npd6config.h and then insert a // case XXXXXXX: here with self-contined code inside. switch (strIdx) { case NOMATCH: flog(LOG_DEBUG2, "Found noise in config file. Skipping."); continue; case NPD6PREFIX: strncpy( prefixaddrstr, righttoken, sizeof(prefixaddrstr)); flog(LOG_DEBUG, "Raw prefix: %s", prefixaddrstr); // We need to pad it up and record the length in bits prefixaddrlen = prefixset(prefixaddrstr); flog(LOG_INFO, "Padded prefix: %s, length = %d", prefixaddrstr, prefixaddrlen); if ( prefixaddrlen <= 0 ) { flog(LOG_ERR, "Invalid prefix."); } // Build a binary image of it build_addr(prefixaddrstr, &prefixaddr); break; case NPD6INTERFACE: if ( strlen( righttoken) > INTERFACE_STRLEN ) { flog(LOG_ERR, "Invalid length interface name"); return 1; } strncpy( interfacestr, righttoken, sizeof(interfacestr)); flog(LOG_INFO, "Supplied interface is %s", interfacestr); break; case NPD6OPTFLAG: if ( !strcmp( righttoken, SET ) ) { flog(LOG_INFO, "linkOption flag SET"); naLinkOptFlag = 1; } else if ( !strcmp( righttoken, UNSET ) ) { flog(LOG_INFO, "linkOption flag UNSET"); naLinkOptFlag = 0; } else { flog(LOG_ERR, "linkOption flag - Bad value"); return 1; } break; case NPD6LOCALIG: if ( !strcmp( righttoken, SET ) ) { flog(LOG_INFO, "ignoreLocal flag SET"); nsIgnoreLocal = 1; } else if ( !strcmp( righttoken, UNSET ) ) { flog(LOG_INFO, "ignoreLocal flag UNSET"); nsIgnoreLocal = 0; } else { flog(LOG_ERR, "ignoreLocal flag - Bad value"); return 1; } break; case NPD6ROUTERNA: if ( !strcmp( righttoken, SET ) ) { flog(LOG_INFO, "routerNA flag SET"); naRouter = 1; } else if ( !strcmp( righttoken, UNSET ) ) { flog(LOG_INFO, "routerNA flag UNSET"); naRouter = 0; } else { flog(LOG_ERR, "routerNA flag - Bad value"); return 1; } break; case NPD6MAXHOPS: maxHops = -1; maxHops = atoi(righttoken); if ( (maxHops < 0) || (maxHops > MAXMAXHOPS) ) { flog(LOG_ERR, "maxHops - invalid value specified in config."); return 1; } else { flog(LOG_INFO, "maxHops set to %d", maxHops); } break; case NPD6TARGETS: // If we arrive here and the tRoot tree already exists, // then we're re-reading the config and so need to zap // the tRoot data first. if (tRoot != NULL) { tdestroy(tRoot, free); tEntries = 0; } collectTargets = -1; tRoot = NULL; collectTargets = atoi(righttoken); if ( (collectTargets < 0) || (collectTargets > MAXTARGETS) ) { flog(LOG_ERR, "collectTargets - invalid value specified in config."); return 1; } else { flog(LOG_INFO, "collectTargets set to %d", collectTargets); } break; case NPD6LISTTYPE: if ( !strcmp( righttoken, NPD6NONE ) ) { flog(LOG_INFO, "List-type = NONE"); listType = NOLIST; } else if ( !strcmp( righttoken, NPD6BLACK ) ) { flog(LOG_INFO, "List-type = BLACK"); listType = BLACKLIST; } else if( !strcmp( righttoken, NPD6WHITE ) ) { flog(LOG_INFO, "List-type = WHITE"); listType = WHITELIST; } else { flog(LOG_ERR, "List-type = <invalid value> - Setting to NONE"); listType = NOLIST; } break; case NPD6LISTADDR: if (build_addr( righttoken, &listEntry) ) { flog(LOG_DEBUG, "Address %s valid.", righttoken); storeListEntry(&listEntry); } else { flog(LOG_ERR, "Address %s invalid.", righttoken); } break; } } while (len); // Now do some final checks to ensure all required params were supplied if ( ! strcmp(prefixaddrstr, NULLSTR) ) { flog(LOG_ERR, "Prefix not defined in config file."); return 1; } if ( ! strcmp(interfacestr, NULLSTR) ) { flog(LOG_ERR, "interface not defined in config file."); return 1; } // Work out the interface index interfaceIdx = if_nametoindex(interfacestr); if (!interfaceIdx) { flog(LOG_ERR, "Could not get ifIndex for interface %s", interfacestr); return 1; } if (getLinkaddress( interfacestr, linkAddr) ) { flog(LOG_ERR, "failed to convert interface specified to a link-level address."); return 1; } return 0; }
static char *url_replying_to(struct emailinfo *email, char *line1, /* first line of quoted text, with html */ const char *line2, /* first line of quoted text, w/o html */ const struct body *bp, int quote_num, int *quoting_msgnum, int count_quoted_lines, int maybe_reply) { String_Match match_info; char *p; int subjmatch = 0; char *anchor; struct emailinfo *ep; int statusnum = hashreplynumlookup(*quoting_msgnum, email->inreplyto, email->subject, &subjmatch); hashnumlookup(*quoting_msgnum, &ep); trio_asprintf(&anchor, "%.4dqlink%d", *quoting_msgnum, quote_num); if (statusnum != -1) { struct emailinfo *ep2; hashnumlookup(statusnum, &ep2); if (add_anchor(statusnum, *quoting_msgnum, quote_num, anchor, line1, 0, count_quoted_lines, NULL)) { char *path = get_path(ep, ep2); char *buf; trio_asprintf(&buf, "%s%.4d.%s#%s", path, statusnum, set_htmlsuffix, anchor); if (maybe_reply) set_new_reply_to(statusnum, strlen(line2)); if (*path) free(path); free(anchor); return buf; } if (strlen(line2) > 6 && (p = strstr(line2, "..."))) { char *parsed; char *tptr = (char *)emalloc(p - line2 + 1 + strlen(p + 3)); /* AUDIT biege: IOF unlikely */ strncpy(tptr, line2, p - line2); strcpy(tptr + (p - line2), p + 3); parsed = ConvURLsString(tptr, email->msgid, email->subject, email->charset); free(tptr); tptr = stripwhitespace(parsed ? parsed : ""); if (parsed) free(parsed); if (add_anchor(statusnum, *quoting_msgnum, quote_num, anchor, tptr, 1, count_quoted_lines, NULL)) { char *path = get_path(ep, ep2); char *buf; trio_asprintf(&buf, "%s%.4d.%s#%s", path, statusnum, set_htmlsuffix, anchor); free(tptr); if (maybe_reply) set_new_reply_to(statusnum, strlen(buf)); if (*path) free(path); free(anchor); return buf; } free(tptr); } } { int i; struct Push full_line; struct Push exact_line; INIT_PUSH(full_line); INIT_PUSH(exact_line); PushString(&full_line, p = stripwhitespace(line2)); free(p); PushString(&exact_line, line2); for (i = 1; i < count_quoted_lines && (bp = bp->next); ++i) { char *stripped = unquote_and_strip(bp->line); PushByte(&full_line, '\n'); PushString(&full_line, p = stripwhitespace(stripped)); free(p); free(stripped); PushString(&exact_line, unquote(bp->line)); } search_for_quote(PUSH_STRING(full_line), PUSH_STRING(exact_line), *quoting_msgnum, &match_info); free(PUSH_STRING(full_line)); free(PUSH_STRING(exact_line)); } if (match_info.msgnum >= 0) { char *parsed = ConvURLsString(match_info.last_matched_string, email->msgid, email->subject, email->charset); if (parsed) { char *parsed2 = stripwhitespace(parsed); free(parsed); if (add_anchor(match_info.msgnum, *quoting_msgnum, quote_num, anchor, parsed2, 1, count_quoted_lines, &match_info)) { struct emailinfo *ep2; char *path; char *buf; hashnumlookup(match_info.msgnum, &ep2); path = get_path(ep, ep2); trio_asprintf(&buf, "%s%.4d.%s#%s", path, match_info.msgnum, set_htmlsuffix, anchor); set_new_reply_to(match_info.msgnum, match_info.match_len_bytes); free(parsed2); if (*path) free(path); free(anchor); return buf; } free(parsed2); } if (match_info.last_matched_string) free(match_info.last_matched_string); } if (count_quoted_lines < 3 && strcmp(get_quote_prefix(), ">") && strcmp(get_quote_prefix(), " >")) /* was quote_prefix guess shaky? */ *quoting_msgnum = -1; /* msg probably doesn't have any quotes */ free(anchor); return NULL; }