#include #include #include #include #include #include int main(int argc, char* argv[]) { if (argc < 4) { fprintf(stderr, "usage: %s USERNAME PID SIGNAL\n", argv[0]); return 1; } // switch user (requires root or "setcap cap_setuid,cap_setgid+ep") char const* username = argv[1]; struct passwd const* pw = getpwnam(username); if (!pw) { fprintf(stderr, "no such user: %s\n", username); return 1; } int ret = 0; if ((ret = setuid(pw->pw_uid)) != 0) fprintf(stderr, "setuid returned %d\n", ret); if ((ret = setgid(pw->pw_gid)) != 0) fprintf(stderr, "setgid returned %d\n", ret); pid_t pid = atol(argv[2]); int signum = atoi(argv[3]); kill(pid, signum); return 0; }