예제 #1
0
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);
}