
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <pwd.h>

#ifndef UGADMIN_PATH
#define UGADMIN_PATH "./ugadmin"
#endif

char *requestor(void) {
	struct passwd *pwd;
	if (!(pwd = getpwuid(getuid()))) {
		perror("suid-wrapper: getpwuid");
		exit(1);
		return 0; // not needed
	}
	return strdup(pwd->pw_name);
}

void call_ugadmin(int argc, char **argv, char *req) {
	int i;
	char *env[] = {NULL};
	char **args = calloc(argc + 2, sizeof(char *));
	args[0] = (UGADMIN_PATH);
	args[1] = req;
	for (i = 1; i < argc; i++) args[i+1] = argv[i];
	args[i+1] = NULL;
	execve(args[0], args, env);
	perror("suid-wrapper: execve");
	exit(1);
}

int main(int argc, char **argv) {
	char *req = requestor();
	if (setuid(0) < 0) {
		perror("suid-wrapper: setuid");
		exit(1);
	}
	call_ugadmin(argc, argv, req);
	return 1; // should not be reached
}
