16 #include <sys/types.h>
23 #include "lirc/lirc_log.h"
32 int group_cnt =
sizeof(groups)/
sizeof(gid_t);
33 char groupnames[256] = {0};
40 user = getenv(
"SUDO_USER");
45 logperror(LIRC_ERROR,
"Can't run getpwnam() for %s", user);
48 r = getgrouplist(user, pw->pw_gid, groups, &group_cnt);
50 logperror(LIRC_WARNING,
"Cannot get supplementary groups");
53 r = setgroups(group_cnt, groups);
55 logperror(LIRC_WARNING,
"Cannot set supplementary groups");
58 r = setgid(pw->pw_gid);
60 logperror(LIRC_WARNING,
"Cannot set GID");
63 r = set_some_uid(pw->pw_uid);
65 logperror(LOG_WARNING,
"Cannot change UID to %d", pw->pw_uid);
68 setenv(
"HOME", pw->pw_dir, 1);
69 logprintf(LIRC_NOTICE,
"Running as user %s", user);
70 for (i = 0; i < group_cnt; i += 1) {
71 snprintf(buff, 5,
" %d", groups[i]);
72 strcat(groupnames, buff);
74 logprintf(LIRC_DEBUG,
"Groups: [%d]:%s", pw->pw_gid, groupnames);
85 if (strcmp(
"root", new_user) == 0)
86 puts(
"Warning: Running as root.");
87 else if (strlen(new_user) == 0)
88 puts(
"Warning: Cannot change uid.");
90 printf(
"Running as regular user %s\n", new_user);
void drop_root_cli(int(*set_some_uid)(uid_t))
const char * drop_sudo_root(int(*set_some_uid)(uid_t))
void logperror(loglevel_t prio, const char *fmt,...)