diff options
author | Karel Zak | 2010-09-24 13:04:35 +0200 |
---|---|---|
committer | Karel Zak | 2011-01-03 12:28:43 +0100 |
commit | 188dc15a639d8b298229dc718361ac9c3adf5e5f (patch) | |
tree | ab8515d9218a9f84d73432725862bb323445a37f /shlibs/mount/src/utils.c | |
parent | libmount: implement mnt_context_subst_optstr() (diff) | |
download | kernel-qcow2-util-linux-188dc15a639d8b298229dc718361ac9c3adf5e5f.tar.gz kernel-qcow2-util-linux-188dc15a639d8b298229dc718361ac9c3adf5e5f.tar.xz kernel-qcow2-util-linux-188dc15a639d8b298229dc718361ac9c3adf5e5f.zip |
libmount: rewrite optstr translation
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'shlibs/mount/src/utils.c')
-rw-r--r-- | shlibs/mount/src/utils.c | 53 |
1 files changed, 49 insertions, 4 deletions
diff --git a/shlibs/mount/src/utils.c b/shlibs/mount/src/utils.c index 108bb2eb6..3aa8d9b82 100644 --- a/shlibs/mount/src/utils.c +++ b/shlibs/mount/src/utils.c @@ -319,11 +319,14 @@ char *mnt_get_username(const uid_t uid) int mnt_get_uid(const char *username, uid_t *uid) { + int rc = -1; struct passwd pwd; struct passwd *pw; size_t sz = sysconf(_SC_GETPW_R_SIZE_MAX); char *buf; + if (!username || !uid) + return -EINVAL; if (sz <= 0) sz = 16384; /* Should be more than enough */ @@ -331,20 +334,28 @@ int mnt_get_uid(const char *username, uid_t *uid) if (!buf) return -ENOMEM; - if (!getpwnam_r(username, &pwd, buf, sz, &pw) && pw) + if (!getpwnam_r(username, &pwd, buf, sz, &pw) && pw) { *uid= pw->pw_uid; + rc = 0; + } else { + DBG(UTILS, mnt_debug( + "cannot convert '%s' username to UID", username)); + } free(buf); - return 0; + return rc; } int mnt_get_gid(const char *groupname, gid_t *gid) { + int rc = -1; struct group grp; struct group *gr; size_t sz = sysconf(_SC_GETGR_R_SIZE_MAX); char *buf; + if (!groupname || !gid) + return -EINVAL; if (sz <= 0) sz = 16384; /* Should be more than enough */ @@ -352,11 +363,45 @@ int mnt_get_gid(const char *groupname, gid_t *gid) if (!buf) return -ENOMEM; - if (!getgrnam_r(groupname, &grp, buf, sz, &gr) && gr) + if (!getgrnam_r(groupname, &grp, buf, sz, &gr) && gr) { *gid= gr->gr_gid; + rc = 0; + } else { + DBG(UTILS, mnt_debug( + "cannot convert '%s' groupname to GID", groupname)); + } free(buf); - return 0; + return rc; +} + +int mnt_in_group(gid_t gid) +{ + int rc = 0, n, i; + gid_t *grps = NULL; + + if (getgid() == gid) + return 1; + + n = getgroups(0, NULL); + if (n <= 0) + goto done; + + grps = malloc(n * sizeof(*grps)); + if (!grps) + goto done; + + if (getgroups(n, grps) == n) { + for (i = 0; i < n; i++) { + if (grps[i] == gid) { + rc = 1; + break; + } + } + } +done: + free(grps); + return rc; } /* |