From dc8d50bd8d382505ca7a34d501097ce7c181803b Mon Sep 17 00:00:00 2001 From: lns Date: Thu, 26 Apr 2018 15:31:31 +0200 Subject: POTD skeleton #30. Signed-off-by: lns --- src/utils.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'src/utils.c') diff --git a/src/utils.c b/src/utils.c index 996a8a7..ada3c13 100644 --- a/src/utils.c +++ b/src/utils.c @@ -5,6 +5,8 @@ #include #include #include +#include +#include #include #include #include @@ -153,6 +155,8 @@ int redirect_devnull_to(int fds, ...) if (null_fd < 0) null_fd = open("/dev/null", O_RDWR); + if (null_fd < 0) + return -1; assert(null_fd >= 0); va_start(ap, fds); @@ -169,5 +173,27 @@ int redirect_devnull_to(int fds, ...) int change_user_group(const char *user, const char *group) { + struct passwd *pwd = NULL; + struct group *grp = NULL; + gid_t gid; + + pwd = getpwnam(user); + if (!pwd) + return 1; + + if (!group) { + gid = pwd->pw_gid; + } else { + grp = getgrnam(group); + if (!grp) + return 1; + gid = grp->gr_gid; + } + + if (setregid(gid, gid)) + return 1; + if (setreuid(pwd->pw_uid, pwd->pw_uid)) + return 1; + return 0; } -- cgit v1.2.3