add uid and gid URL param to specify alternate uid and/or gid
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>libnfs-4.0.0-vitalif
parent
1c8b4547ce
commit
9126c9c036
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
25
lib/init.c
25
lib/init.c
|
@ -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, ...)
|
||||
{
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue