add uid and gid URL param to specify alternate uid and/or gid
authorPeter Lieven <pl@kamp.de>
Mon, 23 Dec 2013 12:35:31 +0000 (13:35 +0100)
committerPeter Lieven <pl@kamp.de>
Mon, 23 Dec 2013 13:03:26 +0000 (14:03 +0100)
This allows to connect with an alternate uid or gid than that
of the current user.

Example:
 examples/nfs-ls nfs://10.0.0.1/export?uid=1000&gid=33

Signed-off-by: Peter Lieven <pl@kamp.de>
include/libnfs-private.h
include/nfsc/libnfs.h
lib/init.c
lib/libnfs.c

index 6b64033c6af13c1046ca90f45374e152680687cc..a2f3e1a2a09bc8cebba77132ba1f8bdc6850c1d7 100644 (file)
@@ -97,6 +97,8 @@ struct rpc_context {
        
        /* parameters passable via URL */
        int tcp_syncnt;
+       int uid;
+       int gid;
 };
 
 struct rpc_pdu {
@@ -140,6 +142,8 @@ void rpc_set_autoreconnect(struct rpc_context *rpc);
 void rpc_unset_autoreconnect(struct rpc_context *rpc);
 
 void rpc_set_tcp_syncnt(struct rpc_context *rpc, int v);
+void rpc_set_uid(struct rpc_context *rpc, int uid);
+void rpc_set_gid(struct rpc_context *rpc, int gid);
 
 int rpc_add_fragment(struct rpc_context *rpc, char *data, uint64_t size);
 void rpc_free_all_fragments(struct rpc_context *rpc);
index 10358100f889a878388a18f840fdcb03b8ff80d4..1ea756181ba79e2b5e5c8ec8c71c3641adbdb0a5 100644 (file)
@@ -77,7 +77,6 @@ EXTERN int nfs_queue_length(struct nfs_context *nfs);
 struct AUTH;
 EXTERN void nfs_set_auth(struct nfs_context *nfs, struct AUTH *auth);
 
-
 /*
  * When an operation failed, this function can extract a detailed error string.
  */
index bb2fe17bd00ef48306cb716df5b2f37d09580a81..df3c2aa2bd90cc25a7302907428c362648f7b85e 100644 (file)
@@ -74,6 +74,13 @@ struct rpc_context *rpc_init_context(void)
        salt += 0x01000000;
        rpc->fd = -1;
        rpc->tcp_syncnt = RPC_PARAM_UNDEFINED;
+#ifdef WIN32
+       rpc->uid = 65534;
+       rpc->gid = 65534;
+#else
+       rpc->uid = getuid();
+       rpc->gid = getgid();
+#endif
 
        return rpc;
 }
@@ -101,6 +108,24 @@ void rpc_set_auth(struct rpc_context *rpc, struct AUTH *auth)
        rpc->auth = auth;
 }
 
+static void rpc_set_uid_gid(struct rpc_context *rpc, int uid, int gid) {
+       if (uid != rpc->uid || gid != rpc->gid) {
+               struct AUTH *auth = libnfs_authunix_create("libnfs", uid, gid, 0, NULL);
+               if (auth != NULL) {
+                       rpc_set_auth(rpc, auth);
+                       rpc->uid = uid;
+                       rpc->gid = gid;
+               }
+       }
+}
+
+void rpc_set_uid(struct rpc_context *rpc, int uid) {
+       rpc_set_uid_gid(rpc, uid, rpc->gid);
+}
+
+void rpc_set_gid(struct rpc_context *rpc, int gid) {
+       rpc_set_uid_gid(rpc, rpc->uid, gid);
+}
 
 void rpc_set_error(struct rpc_context *rpc, char *error_string, ...)
 {
index cd15fb01eabe0bcc4fa722f33d322d6ad719ba38..f7a2bf07ea4698f8f152e1b6e6a05b446b0db5f5 100644 (file)
@@ -282,6 +282,10 @@ flags:
                        strp2++;
                        if (!strncmp(strp, "tcp-syncnt", 10)) {
                                rpc_set_tcp_syncnt(nfs->rpc, atoi(strp2));
+                       } else if (!strncmp(strp, "uid", 3)) {
+                               rpc_set_uid(nfs->rpc, atoi(strp2));
+                       } else if (!strncmp(strp, "gid", 3)) {
+                               rpc_set_gid(nfs->rpc, atoi(strp2));
                        }
                }
        }