Use default uid and gid from NFS AUTH_SYS when creating files
This commit is contained in:
@@ -122,6 +122,10 @@ static void kv_continue_create(kv_create_state *st, int state)
|
||||
st->attrobj["ctime"] = nfstime_now_str();
|
||||
if (st->attrobj.find("mtime") == st->attrobj.end())
|
||||
st->attrobj["mtime"] = st->attrobj["ctime"];
|
||||
if (st->rop->auth_sys.uid && st->attrobj.find("uid") == st->attrobj.end())
|
||||
st->attrobj["uid"] = (uint64_t)st->rop->auth_sys.uid;
|
||||
if (st->rop->auth_sys.gid && st->attrobj.find("gid") == st->attrobj.end())
|
||||
st->attrobj["gid"] = (uint64_t)st->rop->auth_sys.gid;
|
||||
st->attrs = std::move(st->attrobj);
|
||||
resume_1:
|
||||
// Generate inode ID
|
||||
|
||||
@@ -1168,6 +1168,16 @@ int nfs_client_t::handle_rpc_op(rpc_op_t *rop)
|
||||
// Incoming buffer isn't needed to handle request, so return 0
|
||||
return 0;
|
||||
}
|
||||
if (rop->in_msg.body.cbody.cred.flavor == RPC_AUTH_SYS)
|
||||
{
|
||||
// Parse authentication header
|
||||
if (!xdr_decode(rop->xdrs, rop->in_msg.body.cbody.cred.body.data, rop->in_msg.body.cbody.cred.body.size, (xdrproc_t)xdr_authsys_parms, &rop->auth_sys))
|
||||
{
|
||||
rop->out_msg.body.rbody.areply.reply_data.stat = RPC_GARBAGE_ARGS;
|
||||
rpc_queue_reply(rop);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
rop->out_msg.body.rbody.areply.reply_data.stat = RPC_SUCCESS;
|
||||
rop->reply_fn = proc_it->resp_fn;
|
||||
rop->referenced = 0;
|
||||
|
||||
@@ -133,6 +133,18 @@ struct rpc_msg {
|
||||
};
|
||||
typedef struct rpc_msg rpc_msg;
|
||||
|
||||
struct authsys_parms {
|
||||
u_int stamp;
|
||||
xdr_string_t machinename;
|
||||
u_int uid;
|
||||
u_int gid;
|
||||
struct {
|
||||
u_int gids_len;
|
||||
u_int *gids_val;
|
||||
} gids;
|
||||
};
|
||||
typedef struct authsys_parms authsys_parms;
|
||||
|
||||
/* the xdr functions */
|
||||
|
||||
|
||||
@@ -151,6 +163,7 @@ extern bool_t xdr_rpc_rejected_reply (XDR *, rpc_rejected_reply*);
|
||||
extern bool_t xdr_rpc_reply_body (XDR *, rpc_reply_body*);
|
||||
extern bool_t xdr_rpc_msg_body (XDR *, rpc_msg_body*);
|
||||
extern bool_t xdr_rpc_msg (XDR *, rpc_msg*);
|
||||
extern bool_t xdr_authsys_parms (XDR *, authsys_parms*);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -111,3 +111,11 @@ struct rpc_msg {
|
||||
u_int xid;
|
||||
rpc_msg_body body;
|
||||
};
|
||||
|
||||
struct authsys_parms {
|
||||
unsigned int stamp;
|
||||
string machinename<255>;
|
||||
unsigned int uid;
|
||||
unsigned int gid;
|
||||
unsigned int gids<16>;
|
||||
};
|
||||
|
||||
@@ -35,6 +35,7 @@ struct rpc_op_t
|
||||
void *client;
|
||||
void *buffer;
|
||||
XDR *xdrs;
|
||||
authsys_parms auth_sys;
|
||||
rpc_msg in_msg, out_msg;
|
||||
rdma_msg in_rdma_msg;
|
||||
rpc_rdma_errcode rdma_error;
|
||||
|
||||
@@ -251,3 +251,21 @@ xdr_rpc_msg (XDR *xdrs, rpc_msg *objp)
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_authsys_parms (XDR *xdrs, authsys_parms *objp)
|
||||
{
|
||||
|
||||
if (!xdr_u_int (xdrs, &objp->stamp))
|
||||
return FALSE;
|
||||
if (!xdr_string (xdrs, &objp->machinename, 255))
|
||||
return FALSE;
|
||||
if (!xdr_u_int (xdrs, &objp->uid))
|
||||
return FALSE;
|
||||
if (!xdr_u_int (xdrs, &objp->gid))
|
||||
return FALSE;
|
||||
if (!xdr_array (xdrs, (char **)&objp->gids.gids_val, (u_int *) &objp->gids.gids_len, 16,
|
||||
sizeof (u_int), (xdrproc_t) xdr_u_int))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user