symlink: nfs41_create() can create symlinks

added optional symlink argument to nfs41_create(), used when type is NF4LNK
changed createttype4.u.lnk.linkdata from char[] to const char* and updated encoding in nfs41_xdr.c

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
This commit is contained in:
Casey Bodley 2010-09-23 12:49:58 -04:00 committed by unknown
parent 08c2618551
commit 8c4c98b669
4 changed files with 10 additions and 4 deletions

View file

@ -411,6 +411,7 @@ int nfs41_create(
IN nfs41_session *session, IN nfs41_session *session,
IN uint32_t type, IN uint32_t type,
IN uint32_t mode, IN uint32_t mode,
IN OPTIONAL const char *symlink,
IN nfs41_path_fh *parent, IN nfs41_path_fh *parent,
OUT nfs41_path_fh *file) OUT nfs41_path_fh *file)
{ {
@ -450,6 +451,10 @@ int nfs41_create(
compound_add_op(&compound, OP_CREATE, &create_args, &create_res); compound_add_op(&compound, OP_CREATE, &create_args, &create_res);
create_args.objtype.type = type; create_args.objtype.type = type;
if (type == NF4LNK) {
create_args.objtype.u.lnk.linkdata = symlink;
create_args.objtype.u.lnk.linkdata_len = (uint32_t)strlen(symlink);
}
create_args.name = &file->name; create_args.name = &file->name;
create_args.createattrs.info.attrmask.count = 2; create_args.createattrs.info.attrmask.count = 2;
create_args.createattrs.info.attrmask.arr[0] = 0; create_args.createattrs.info.attrmask.arr[0] = 0;

View file

@ -303,7 +303,7 @@ typedef struct __createtype4 {
/* case NF4LNK: */ /* case NF4LNK: */
struct __create_type_lnk { struct __create_type_lnk {
uint32_t linkdata_len; uint32_t linkdata_len;
char linkdata[NFS4_OPAQUE_LIMIT]; const char *linkdata;
} lnk; } lnk;
/* case NF4BLK, NF4CHR: */ /* case NF4BLK, NF4CHR: */
specdata4 devdata; specdata4 devdata;
@ -909,6 +909,7 @@ int nfs41_create(
IN nfs41_session *session, IN nfs41_session *session,
IN uint32_t type, IN uint32_t type,
IN uint32_t mode, IN uint32_t mode,
IN OPTIONAL const char *symlink,
IN nfs41_path_fh *parent, IN nfs41_path_fh *parent,
OUT nfs41_path_fh *file); OUT nfs41_path_fh *file);

View file

@ -1168,7 +1168,7 @@ static bool_t encode_createtype4(
createtype4 *ct) createtype4 *ct)
{ {
bool_t result = TRUE; bool_t result = TRUE;
char *linkdata; const char *linkdata;
if (!xdr_u_int32_t(xdr, &ct->type)) if (!xdr_u_int32_t(xdr, &ct->type))
return FALSE; return FALSE;
@ -1177,7 +1177,7 @@ static bool_t encode_createtype4(
{ {
case NF4LNK: case NF4LNK:
linkdata = ct->u.lnk.linkdata; linkdata = ct->u.lnk.linkdata;
result = xdr_bytes(xdr, &linkdata, &ct->u.lnk.linkdata_len, result = xdr_bytes(xdr, (char**)&linkdata, &ct->u.lnk.linkdata_len,
NFS4_OPAQUE_LIMIT); NFS4_OPAQUE_LIMIT);
break; break;
case NF4BLK: case NF4BLK:

View file

@ -300,7 +300,7 @@ int handle_open(nfs41_upcall *upcall)
if (create == OPEN4_CREATE && (args->create_opts & FILE_DIRECTORY_FILE)) { if (create == OPEN4_CREATE && (args->create_opts & FILE_DIRECTORY_FILE)) {
status = nfs41_create(state->session, NF4DIR, args->mode, status = nfs41_create(state->session, NF4DIR, args->mode,
&state->parent, &state->file); NULL, &state->parent, &state->file);
args->std_info.Directory = 1; args->std_info.Directory = 1;
args->created = status == NFS4_OK; args->created = status == NFS4_OK;
} else { } else {