- diff --git a/daemon/open.c b/daemon/open.c
- index c7bd412..aee931c 100644
- --- a/daemon/open.c
- +++ b/daemon/open.c
- @@ -295,6 +295,12 @@ static int parse_open(unsigned char *buffer, uint32_t length, nfs41_upcall *upca
- if (status) goto out;
- status = safe_read(&buffer, &length, &args->mode, sizeof(DWORD));
- if (status) goto out;
- +#if 1
- + status = safe_read(&buffer, &length, &args->owner_cygwin_uid, sizeof(DWORD));
- + if (status) goto out;
- + status = safe_read(&buffer, &length, &args->owner_group_cygwin_gid, sizeof(DWORD));
- + if (status) goto out;
- +#endif
- status = safe_read(&buffer, &length, &args->srv_open, sizeof(HANDLE));
- if (status) goto out;
- status = parse_abs_path(&buffer, &length, &args->symlink);
- @@ -305,9 +311,16 @@ static int parse_open(unsigned char *buffer, uint32_t length, nfs41_upcall *upca
- dprintf(1, "parsing NFS41_OPEN: filename='%s' access mask=%d "
- "access mode=%d\n\tfile attrs=0x%x create attrs=0x%x "
- "(kernel) disposition=%d\n\topen_owner_id=%d mode=%o "
- +#if 1
- + "owner_cygwin_uid=%lu owner_group_cygwin_gid=%lu "
- +#endif
- "srv_open=%p symlink=%s ea=%p\n", args->path, args->access_mask,
- args->access_mode, args->file_attrs, args->create_opts,
- - args->disposition, args->open_owner_id, args->mode, args->srv_open,
- + args->disposition, args->open_owner_id, args->mode,
- +#if 1
- + (unsigned long)args->owner_cygwin_uid, (unsigned long)args->owner_group_cygwin_gid,
- +#endif
- + args->srv_open,
- args->symlink.path, args->ea);
- print_disposition(2, args->disposition);
- print_access_mask(2, args->access_mask);
- @@ -644,6 +657,31 @@ static int handle_open(nfs41_upcall *upcall)
- nfs_to_standard_info(&info, &args->std_info);
- args->mode = info.mode;
- args->changeattr = info.change;
- +
- +#if 1
- + bitmap4 og_attr_request = { 0 };
- + nfs41_file_info og_info = { 0 };
- + char owner[NFS4_OPAQUE_LIMIT], group[NFS4_OPAQUE_LIMIT];
- + nfsacl41 acl = { 0 };
- +
- + /* gisburn: need to cache owner/group information */
- + og_attr_request.count = 2;
- + og_attr_request.arr[1] = FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP;
- + og_info.owner = owner;
- + og_info.owner_group = group;
- + status = nfs41_getattr(state->session, &state->file, &og_attr_request, &og_info);
- + if (status) {
- + eprintf("get_stat_data: nfs41_cached_getattr() failed with %d\n",
- + status);
- + }
- +
- + args->owner_cygwin_uid = atol(og_info.owner);
- + args->owner_group_cygwin_gid = atol(og_info.owner_group);
- +
- + dprintf(1, "/usr/bin/stat: owner=%lu/'%s', owner_group=%lu/'%s'\n",
- + (unsigned long)args->owner_cygwin_uid, og_info.owner,
- + (unsigned long)args->owner_group_cygwin_gid, og_info.owner_group);
- +#endif
- } else {
- nfs41_file_info createattrs = { 0 };
- uint32_t create = 0, createhowmode = 0, lookup_status = status;
- @@ -753,6 +791,12 @@ static int marshall_open(unsigned char *buffer, uint32_t *length, nfs41_upcall *
- if (status) goto out;
- status = safe_write(&buffer, length, &args->mode, sizeof(args->mode));
- if (status) goto out;
- +#if 1
- + status = safe_write(&buffer, length, &args->owner_cygwin_uid, sizeof(args->owner_cygwin_uid));
- + if (status) goto out;
- + status = safe_write(&buffer, length, &args->owner_group_cygwin_gid, sizeof(args->owner_group_cygwin_gid));
- + if (status) goto out;
- +#endif
- status = safe_write(&buffer, length, &args->changeattr, sizeof(args->changeattr));
- if (status) goto out;
- status = safe_write(&buffer, length, &args->deleg_type, sizeof(args->deleg_type));
- diff --git a/daemon/upcall.h b/daemon/upcall.h
- index d224a6d..99149be 100644
- --- a/daemon/upcall.h
- +++ b/daemon/upcall.h
- @@ -50,6 +50,8 @@ typedef struct __open_upcall_args {
- ULONG create_opts;
- LONG open_owner_id;
- DWORD mode;
- + DWORD owner_cygwin_uid; /* owner mapped into local uid */
- + DWORD owner_group_cygwin_gid; /* owner group mapped into local gid */
- ULONGLONG changeattr;
- HANDLE srv_open;
- DWORD deleg_type;
- diff --git a/sys/nfs41_driver.c b/sys/nfs41_driver.c
- index 6a8061d..7deb9ec 100644
- --- a/sys/nfs41_driver.c
- +++ b/sys/nfs41_driver.c
- @@ -200,6 +200,8 @@ typedef struct _updowncall_entry {
- ULONG cattrs;
- LONG open_owner_id;
- DWORD mode;
- + DWORD owner_cygwin_uid;
- + DWORD owner_group_cygwin_gid;
- HANDLE srv_open;
- DWORD deleg_type;
- BOOLEAN symlink_embedded;
- @@ -385,6 +387,8 @@ typedef struct _NFS41_FCB {
- BOOLEAN Renamed;
- BOOLEAN DeletePending;
- DWORD mode;
- + DWORD owner_cygwin_uid; /* owner mapped into local uid */
- + DWORD owner_group_cygwin_gid; /* owner group mapped into local gid */
- ULONGLONG changeattr;
- } NFS41_FCB, *PNFS41_FCB;
- #define NFS41GetFcbExtension(pFcb) \
- @@ -667,7 +671,11 @@ NTSTATUS marshal_nfs41_open(
- else tmp += *len;
- header_len = *len + length_as_utf8(entry->filename) +
- - 7 * sizeof(ULONG) + 2 * sizeof(HANDLE) +
- + 7 * sizeof(ULONG) +
- +#if 1
- + 2 * sizeof(DWORD) +
- +#endif
- + 2 * sizeof(HANDLE) +
- length_as_utf8(&entry->u.Open.symlink);
- if (header_len > buf_len) {
- status = STATUS_INSUFFICIENT_RESOURCES;
- @@ -692,6 +700,12 @@ NTSTATUS marshal_nfs41_open(
- tmp += sizeof(entry->u.Open.open_owner_id);
- RtlCopyMemory(tmp, &entry->u.Open.mode, sizeof(DWORD));
- tmp += sizeof(DWORD);
- +#if 1
- + RtlCopyMemory(tmp, &entry->u.Open.owner_cygwin_uid, sizeof(DWORD));
- + tmp += sizeof(DWORD);
- + RtlCopyMemory(tmp, &entry->u.Open.owner_group_cygwin_gid, sizeof(DWORD));
- + tmp += sizeof(DWORD);
- +#endif
- RtlCopyMemory(tmp, &entry->u.Open.srv_open, sizeof(HANDLE));
- tmp += sizeof(HANDLE);
- status = marshall_unicode_as_utf8(&tmp, &entry->u.Open.symlink);
- @@ -718,10 +732,17 @@ NTSTATUS marshal_nfs41_open(
- #ifdef DEBUG_MARSHAL_DETAIL
- DbgP("marshal_nfs41_open: name=%wZ mask=0x%x access=0x%x attrs=0x%x "
- - "opts=0x%x dispo=0x%x open_owner_id=0x%x mode=%o srv_open=%p ea=%p\n",
- + "opts=0x%x dispo=0x%x open_owner_id=0x%x mode=%o "
- +#if 1
- + "owner_cygwin_uid=%lu owner_group_cygwin_gid=%lu "
- +#endif
- + "srv_open=%p ea=%p\n",
- entry->filename, entry->u.Open.access_mask,
- entry->u.Open.access_mode, entry->u.Open.attrs, entry->u.Open.copts,
- entry->u.Open.disp, entry->u.Open.open_owner_id, entry->u.Open.mode,
- +#if 1
- + entry->u.Open.owner_cygwin_uid,entry->u.Open.owner_group_cygwin_gid,
- +#endif
- entry->u.Open.srv_open, entry->u.Open.EaBuffer);
- #endif
- out:
- @@ -1647,6 +1668,12 @@ NTSTATUS unmarshal_nfs41_open(
- *buf += sizeof(HANDLE);
- RtlCopyMemory(&cur->u.Open.mode, *buf, sizeof(DWORD));
- *buf += sizeof(DWORD);
- +#if 1
- + RtlCopyMemory(&cur->u.Open.owner_cygwin_uid, *buf, sizeof(DWORD));
- + *buf += sizeof(DWORD);
- + RtlCopyMemory(&cur->u.Open.owner_group_cygwin_gid, *buf, sizeof(DWORD));
- + *buf += sizeof(DWORD);
- +#endif
- RtlCopyMemory(&cur->ChangeTime, *buf, sizeof(ULONGLONG));
- *buf += sizeof(ULONGLONG);
- RtlCopyMemory(&cur->u.Open.deleg_type, *buf, sizeof(DWORD));
- @@ -1673,8 +1700,15 @@ NTSTATUS unmarshal_nfs41_open(
- #endif
- }
- #ifdef DEBUG_MARSHAL_DETAIL
- - DbgP("unmarshal_nfs41_open: open_state 0x%x mode %o changeattr %llu "
- + DbgP("unmarshal_nfs41_open: open_state 0x%x mode %o "
- +#if 1
- + "owner_cygwin_uid %u owner_group_cygwin_gid %u "
- +#endif
- + "changeattr %llu "
- "deleg_type %d\n", cur->open_state, cur->u.Open.mode,
- +#if 1
- + cur->u.Open.owner_cygwin_uid, cur->u.Open.owner_group_cygwin_gid,
- +#endif
- cur->ChangeTime, cur->u.Open.deleg_type);
- #endif
- out:
- @@ -3754,6 +3788,10 @@ retry_on_link:
- RtlCopyMemory(&nfs41_fcb->StandardInfo, &entry->u.Open.sinfo,
- sizeof(entry->u.Open.sinfo));
- nfs41_fcb->mode = entry->u.Open.mode;
- +#if 1
- + nfs41_fcb->owner_cygwin_uid = entry->u.Open.owner_cygwin_uid;
- + nfs41_fcb->owner_group_cygwin_gid = entry->u.Open.owner_group_cygwin_gid;
- +#endif
- nfs41_fcb->changeattr = entry->ChangeTime;
- if (((params->CreateOptions & FILE_DELETE_ON_CLOSE) &&
- !pVNetRootContext->read_only) || oldDeletePending)
- @@ -4502,6 +4540,8 @@ void create_nfs3_attrs(
- else
- attrs->type = NF3REG;
- attrs->mode = nfs41_fcb->mode;
- + attrs->uid = nfs41_fcb->owner_cygwin_uid;
- + attrs->gid = nfs41_fcb->owner_group_cygwin_gid;
- attrs->nlink = nfs41_fcb->StandardInfo.NumberOfLinks;
- attrs->size.QuadPart = attrs->used.QuadPart =
- nfs41_fcb->StandardInfo.EndOfFile.QuadPart;
msnfs42client: Test for Cygwin/SFU uid/gid in nfs3_attrs
Posted by Anonymous on Mon 9th Oct 2023 08:17
raw | new post
view followups (newest first): msnfs42client: Add infrastructure so Cygwin |stat()| can return local uid/gid by Anonymous
modification of post by Anonymous (view diff)
Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.