////////////// using namespace std; #include #include #include #include #include /* for perror() */ string dirname(const string path){ size_t where = path.rfind("/"); if (where == string::npos) return "."; return path.substr(0, where); } int main(int argc, char** argv){ int uid=getuid(); int euid=geteuid(); int gid=getgid(); int egid=getegid(); int sts; int verbosity(0); if (verbosity) cout << "uid: " << uid << " euid: " << euid << " gid: " << gid << " egid: " << egid << endl; sts = setreuid(euid, euid); if (sts){ cerr << "wripper: setreuid failed: "; perror(0); } sts = setregid(egid, egid); if (sts){ cerr << "wripper: setregid failed: "; perror(0); } if (verbosity) cout << "uid: " << getuid() << " euid: " << geteuid() << " gid: " << getgid() << " egid: " << getegid() << endl; string path = dirname(*argv) + "/mailman"; *argv = (char*) path.c_str(); execv(*argv, argv); cerr << "wripper: exec failed for '" << *argv << "' : "; perror(0); }