]> err.no Git - util-linux/commitdiff
libmount: add mnt_optstr_fix_user
authorKarel Zak <kzak@redhat.com>
Mon, 27 Sep 2010 10:14:41 +0000 (12:14 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 3 Jan 2011 11:28:43 +0000 (12:28 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
shlibs/mount/src/mount.h.in
shlibs/mount/src/mount.sym
shlibs/mount/src/optstr.c

index ac69ac55706bda634fe9c722dec27d1effd0e067..37ff33666c87a1c2279c116fb20088d39585c049 100644 (file)
@@ -177,6 +177,7 @@ extern int mnt_optstr_apply_flags(char **optstr, unsigned long flags,
 extern int mnt_optstr_fix_gid(char **optstr, char *value, size_t valsz, char **next);
 extern int mnt_optstr_fix_uid(char **optstr, char *value, size_t valsz, char **next);
 extern int mnt_optstr_fix_secontext(char **optstr, char *value, size_t valsz, char **next);
+extern int mnt_optstr_fix_user(char **optstr, char *value, size_t valsz, char **next);
 
 /* iter.c */
 enum {
index 308abcde986b30181fe017e48e9f9023831e5122..bb3ac24211ec28c6ed32d686aee750f72dc3fe65 100644 (file)
@@ -82,6 +82,7 @@ global:
        mnt_optstr_fix_gid;
        mnt_optstr_fix_selinux;
        mnt_optstr_fix_uid;
+       mnt_optstr_fix_user;
        mnt_optstr_apply_flags;
        mnt_optstr_get_flags;
        mnt_parse_version_string;
index 0cfcd513b623f2c74629d2d914869d5f9ebedc78..dd8b54517c680c779a302199ede5ae39fd6a627a 100644 (file)
@@ -849,6 +849,43 @@ int mnt_optstr_fix_gid(char **optstr, char *value, size_t valsz, char **next)
        return rc;
 }
 
+/**
+ * mnt_optstr_fix_user:
+ * @optstr: string with comma separated list of options
+ * @value: pointer to place where has to start the value
+ * @valsz: size of the value or zero if value not define
+ * @next: returns pointer to the next option (optional argument)
+
+ * Add/replace username. This is usually used to convert "user" (without value)
+ * to to "user=<username>" -- in this case the @value has to pointer behind the
+ * "user" option name; in case you want to replace already defined <username>
+ * then the @valsz must be greater than zero.
+ *
+ * Returns: 0 on success, negative number in case of error.
+ */
+int mnt_optstr_fix_user(char **optstr, char *value, size_t valsz, char **next)
+{
+       char *username;
+       int rc = 0;
+
+       if (!optstr || !value)
+               return -EINVAL;
+
+       username = mnt_get_username(getuid());
+       if (!username)
+               return -ENOMEM;
+
+       if (!valsz || strncmp(value, username, valsz)) {
+               if (valsz)
+                       /* remove old value */
+                       mnt_optstr_remove_option_at(optstr, value, value + valsz);
+
+               rc = insert_substring(optstr, value, username, next);
+       }
+
+       free(username);
+       return rc;
+}
 
 #ifdef TEST_PROGRAM
 
@@ -1061,6 +1098,9 @@ int test_fix(struct mtest *ts, int argc, char *argv[])
                        rc = mnt_optstr_fix_gid(&optstr, val, valsz, &next);
                else if (!strncmp(name, "context", 7))
                        rc = mnt_optstr_fix_secontext(&optstr, val, valsz, &next);
+               else if (!strncmp(name, "user", 4))
+                       rc = mnt_optstr_fix_user(&optstr,
+                                       val ? val : name + namesz, valsz, &next);
                if (rc)
                        break;
        }
@@ -1083,7 +1123,7 @@ int main(int argc, char *argv[])
                { "--split",  test_split,  "<optstr>                   split into FS, VFS and userspace" },
                { "--flags",  test_flags,  "<optstr>                   convert options to MS_* flags" },
                { "--apply",  test_apply,  "--{linux,user} <optstr> <mask>    apply mask to optstr" },
-               { "--fix",    test_fix,    "<optstr>                   fix uid=, gid= and context=" },
+               { "--fix",    test_fix,    "<optstr>                   fix uid=, gid=, user, and context=" },
 
                { NULL }
        };