summaryrefslogtreecommitdiffstats
path: root/shlibs/mount/src/utils.c
diff options
context:
space:
mode:
authorKarel Zak2010-09-24 13:04:35 +0200
committerKarel Zak2011-01-03 12:28:43 +0100
commit188dc15a639d8b298229dc718361ac9c3adf5e5f (patch)
treeab8515d9218a9f84d73432725862bb323445a37f /shlibs/mount/src/utils.c
parentlibmount: implement mnt_context_subst_optstr() (diff)
downloadkernel-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.c53
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;
}
/*