Skip to content

Commit

Permalink
os-posix.c: create and export os_set_runas()
Browse files Browse the repository at this point in the history
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-ID: <20230901101302.3618955-3-mjt@tls.msk.ru>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
  • Loading branch information
Michael Tokarev authored and bonzini committed Sep 1, 2023
1 parent b21bdbb commit 22d0251
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 7 deletions.
1 change: 1 addition & 0 deletions include/sysemu/os-posix.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ void os_setup_signal_handling(void);
int os_set_daemonize(bool d);
bool is_daemonized(void);
void os_daemonize(void);
bool os_set_runas(const char *optarg);
void os_setup_post(void);
int os_mlock(void);

Expand Down
23 changes: 16 additions & 7 deletions os-posix.c
Original file line number Diff line number Diff line change
Expand Up @@ -102,15 +102,28 @@ void os_set_proc_name(const char *s)
#endif
}


static bool os_parse_runas_uid_gid(const char *optarg)
/*
* Prepare to change user ID. optarg can be one of 3 forms:
* - a username, in which case user ID will be changed to its uid,
* with primary and supplementary groups set up too;
* - a numeric uid, in which case only the uid will be set;
* - a pair of numeric uid:gid.
*/
bool os_set_runas(const char *optarg)
{
unsigned long lv;
const char *ep;
uid_t got_uid;
gid_t got_gid;
int rc;

user_pwd = getpwnam(optarg);
if (user_pwd) {
user_uid = -1;
user_gid = -1;
return true;
}

rc = qemu_strtoul(optarg, &ep, 0, &lv);
got_uid = lv; /* overflow here is ID in C99 */
if (rc || *ep != ':' || got_uid != lv || got_uid == (uid_t)-1) {
Expand All @@ -137,11 +150,7 @@ int os_parse_cmd_args(int index, const char *optarg)
{
switch (index) {
case QEMU_OPTION_runas:
user_pwd = getpwnam(optarg);
if (user_pwd) {
user_uid = -1;
user_gid = -1;
} else if (!os_parse_runas_uid_gid(optarg)) {
if (!os_set_runas(optarg)) {
error_report("User \"%s\" doesn't exist"
" (and is not <uid>:<gid>)",
optarg);
Expand Down

0 comments on commit 22d0251

Please sign in to comment.