#include #include #include #include #define TCPREMOTEIP "TCPREMOTEIP=" #define RELAYCLIENT "RELAYCLIENT=" #define USAGE "usage: relaycheck
[,...] [...]\n" void usage () { write(2, USAGE, strlen(USAGE)); exit(1); } char *realloc_or_die (char *p, size_t len) { p = realloc(p, len); if (!p) exit(255); return p; } int main (int argc, char **argv, char **env) { char **c = env, **newenv = NULL, *ip, *left, *right; int envlen = 1, i = 0; if (argc < 3) usage(); if (!*argv[1] || !*argv[2]) usage(); for (;; ++c, ++envlen) { newenv = (char**) realloc_or_die((char*) newenv, envlen * sizeof(char*)); *(newenv + envlen - 1) = *c; if (!*c) break; if (i) continue; if (strncmp(*c, TCPREMOTEIP, strlen(TCPREMOTEIP))) continue; ip = strchr(*c, '='); if (!*++ip) continue; for (left = argv[1];; left = right) { right = strchr(left, ','); if (right) i = right - left; else i = strlen(left); if (i) if (!strncmp(ip, left, i)) { newenv = (char**) realloc_or_die((char*) newenv, ++envlen * sizeof(char*)); left = realloc_or_die(NULL, strlen(RELAYCLIENT) + 1); strcpy(left, RELAYCLIENT); *(newenv + envlen - 1) = left; break; } i ^= i; if (!right) break; if (!*++right) break; } } execve(argv[2], &argv[2], newenv); return 1; }