diff options
author | John Denker <jsd@av8n.com> | 2012-07-22 14:43:07 -0700 |
---|---|---|
committer | John Denker <jsd@av8n.com> | 2012-07-29 15:32:35 -0700 |
commit | abb71cf6b1145588827d04de4da3bb48ecb06965 (patch) | |
tree | 1f409a70481aaf980cc917d4a45551e1725beb7d /tools/wripper.c | |
parent | 8ce08aca2410c795dfc46f37dc27402ff6de5dd1 (diff) |
set program gid (not just egid) the way mailman likes it
Diffstat (limited to 'tools/wripper.c')
-rw-r--r-- | tools/wripper.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/tools/wripper.c b/tools/wripper.c new file mode 100644 index 0000000..2a19c8b --- /dev/null +++ b/tools/wripper.c @@ -0,0 +1,53 @@ +////////////// + +using namespace std; +#include <iostream> +#include <string> +#include <unistd.h> +#include <sys/types.h> +#include <stdio.h> /* 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); +} |