int main(int argc, char **argv) { GError *error = NULL; GOptionContext *context = NULL; uid_t orig_uid = -1; gid_t orig_gid = -1; EscalateHelper *helper = NULL; int exit_code = 2; clearenv(); umask(0077); context = g_option_context_new("- helper for pam_escalate.so"); if (!g_option_context_parse(context, &argc, &argv, &error)) { goto done; } if (argc > 1) { g_set_error(&error, ESCALATE_HELPER_ERROR, ESCALATE_HELPER_ERROR_EXTRA_ARGS, "Non-flag arguments are not accepted"); goto done; } orig_uid = getuid(); orig_gid = getgid(); if (orig_uid != geteuid()) { if (setuid(geteuid())) { g_error("setuid() failed: %s", g_strerror(errno)); } } if (orig_gid != getegid()) { if (setgid(getegid())) { g_error("setgid() failed: %s", g_strerror(errno)); } } helper = EscalateHelperNew(STDIN_FILENO, STDOUT_FILENO, orig_uid, orig_gid); if (!EscalateHelperHandleStart(helper, &error)) { goto done; } if (EscalateHelperDoAction(helper, &error)) { exit_code = 0; } else { exit_code = 1; } done: if (error) { g_printerr("Caught error: %s\n", error->message); g_error_free(error); } EscalateHelperFree(helper); return exit_code; }
static void CreateHelper(EscalateHelper **helper, GIOChannel **stdin_writer, GIOChannel **stdout_reader) { int stdin_fds [2]; int stdout_fds [2]; g_assert(g_unix_open_pipe(stdin_fds, 0, NULL)); g_assert(g_unix_open_pipe(stdout_fds, 0, NULL)); *helper = EscalateHelperNew(stdin_fds[0], stdout_fds[1]); *stdin_writer = g_io_channel_unix_new(stdin_fds[1]); *stdout_reader = g_io_channel_unix_new(stdout_fds[0]); g_assert(*helper); }