int sts_mx_validate(struct sts_id *id, const char *domainname) { char *field; open_policy(id); while ((field=next_policy_field(id)) != 0) { if (strcmp(field, "mx")) continue; field=strtok(NULL, " \r\n"); if (strncmp(field, "*.", 2) == 0) ++field; /* config_domaincmp convention */ if (config_domaincmp(domainname, field, strlen(field)) == 0) return 0; } return -1; }
static char *fetch_smtproutes(const char *domain) { char *buf=get_control_smtproutes(); const char *p=buf; if (!buf) { struct dbobj d; char *p, *q; size_t l; p=config_search("esmtproutes.dat"); dbobj_init(&d); if (dbobj_open(&d, p, "R")) { free(p); return (0); } free(p); p=strcpy(courier_malloc(strlen(domain)+1), domain); for (q=p; *q; q++) *q=tolower(*q); q=dbobj_fetch(&d, p, strlen(p), &l, "D"); free(p); dbobj_close(&d); if (!q) return (0); p=courier_malloc(l+1); memcpy(p, q, l); p[l]=0; free(q); return (p); } while (*p) { unsigned i; for (i=0; p[i] && p[i] != '\n' && p[i] != '\r' && p[i] != ':'; ++i) ; if (p[i] == ':' && (i == 0 || config_domaincmp(domain, p, i) == 0)) { char *q; p += i; ++p; for (i=0; p[i] && p[i] != '\n' && p[i] != '\r'; i++) ; while (i && isspace((int)(unsigned char)p[i-1])) --i; while (i && isspace((int)(unsigned char)*p)) { ++p; --i; } if (i == 0) { free(buf); return (0); } q=courier_malloc(i+1); memcpy(q, p, i); q[i]=0; free(buf); return (q); } while (p[i]) { if (p[i] == '\n' || p[i] == '\r') { ++i; break; } ++i; } p += i; } free(buf); return (0); }