diff options
Diffstat (limited to 'src/retrace/worker.c')
-rw-r--r-- | src/retrace/worker.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/retrace/worker.c b/src/retrace/worker.c new file mode 100644 index 00000000..2020627d --- /dev/null +++ b/src/retrace/worker.c @@ -0,0 +1,51 @@ +#include <stdio.h> +#include <ctype.h> +#include <stdlib.h> +#include <unistd.h> + +/* + Launches Retrace Server worker (worker.py) with root permissions. + Binary needs to be owned by root and needs to set SUID bit. +*/ + +int main(int argc, char **argv) +{ + char command[256]; + FILE *pipe; + int i; + + if (argc != 2) + { + fprintf(stderr, "Usage: %s task_id\n", argv[0]); + return 1; + } + + if (setuid(0) != 0) + { + fprintf(stderr, "You must run %s with root permissions.\n", argv[0]); + return 2; + } + + for (i = 0; argv[1][i]; ++i) + if (!isdigit(argv[1][i])) + { + fputs("Task ID may only contain digits.", stderr); + return 3; + } + + /* needs to be set to make mock work properly */ + setenv("SUDO_USER", "root", 1); + setenv("SUDO_UID", "0", 1); + setenv("SUDO_GID", "0", 1); + + /* launch worker.py */ + sprintf(command, "/usr/bin/python /usr/share/abrt-retrace/worker.py \"%s\"", argv[1]); + pipe = popen(command, "r"); + if (pipe == NULL) + { + fputs("Unable to run 'worker.py'.", stderr); + return 4; + } + + return pclose(pipe) >> 8; +} |