r22874: Expand the RPC-QFILEINFO-IPC test, and add a server implementation to match.
authorAndrew Bartlett <abartlet@samba.org>
Tue, 15 May 2007 01:21:20 +0000 (01:21 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:52:27 +0000 (14:52 -0500)
This should help with Vista joins.

Andrew Bartlett
(This used to be commit 8f85fb37862044d4b618e4184274bc67432af73b)

source4/ntvfs/ipc/vfs_ipc.c
source4/torture/raw/qfileinfo.c

index bb8096328791211f18324602734fd4c36198fa9a..20b70415aa13d558f44a21df2a21711b5c48c458 100644 (file)
@@ -149,7 +149,14 @@ static NTSTATUS ipc_chkpath(struct ntvfs_module_context *ntvfs,
 static NTSTATUS ipc_qpathinfo(struct ntvfs_module_context *ntvfs,
                              struct ntvfs_request *req, union smb_fileinfo *info)
 {
-       return NT_STATUS_ACCESS_DENIED;
+       switch (info->generic.level) {
+       case  RAW_FILEINFO_GENERIC:
+               return NT_STATUS_INVALID_DEVICE_REQUEST;
+       case RAW_FILEINFO_GETATTR:
+               return NT_STATUS_ACCESS_DENIED;
+       default:
+               return ntvfs_map_qpathinfo(ntvfs, req, info);
+       }
 }
 
 /*
@@ -602,6 +609,39 @@ static NTSTATUS ipc_setfileinfo(struct ntvfs_module_context *ntvfs,
 static NTSTATUS ipc_qfileinfo(struct ntvfs_module_context *ntvfs,
                              struct ntvfs_request *req, union smb_fileinfo *info)
 {
+       struct ipc_private *private = ntvfs->private_data;
+       switch (info->generic.level) {
+       case RAW_FILEINFO_GENERIC: 
+       {
+               struct pipe_state *p;
+               p = pipe_state_find(private, info->generic.in.file.ntvfs);
+               if (!p) {
+                       return NT_STATUS_INVALID_HANDLE;
+               }
+               ZERO_STRUCT(info->generic.out);
+               info->generic.out.attrib = FILE_ATTRIBUTE_NORMAL;
+               info->generic.out.fname.s = strrchr(p->pipe_name, '\\');
+               info->generic.out.alloc_size = 4096;
+               info->generic.out.nlink = 1;
+               /* What the heck?  Match Win2k3: IPC$ pipes are delete pending */
+               info->generic.out.delete_pending = 1;
+               return NT_STATUS_OK;
+       }
+       case RAW_FILEINFO_ALT_NAME_INFO:
+       case RAW_FILEINFO_ALT_NAME_INFORMATION:
+       case RAW_FILEINFO_STREAM_INFO:
+       case RAW_FILEINFO_STREAM_INFORMATION:
+       case RAW_FILEINFO_COMPRESSION_INFO:
+       case RAW_FILEINFO_COMPRESSION_INFORMATION:
+       case RAW_FILEINFO_NETWORK_OPEN_INFORMATION:
+       case RAW_FILEINFO_ATTRIBUTE_TAG_INFORMATION:
+               return NT_STATUS_INVALID_PARAMETER;
+       case  RAW_FILEINFO_ALL_EAS:
+               return NT_STATUS_ACCESS_DENIED;
+       default:
+               return ntvfs_map_qfileinfo(ntvfs, req, info);
+       }
+       
        return NT_STATUS_ACCESS_DENIED;
 }
 
index 9c3b1e6a4b05c9793525d1f90eca13ac679e8f0f..8696bb5f4d9e4e2284991997e2b315781682adfd 100644 (file)
@@ -732,6 +732,24 @@ static BOOL torture_raw_qfileinfo_internals(struct torture_context *torture, TAL
                  "ALL_INFO",      all_info,      directory);
        VAL_CHECK("STANDARD_INFO", standard_info, nlink, 
                  "ALL_INFO",      all_info,      nlink);
+       s1 = fnum_find("BASIC_INFO");
+       if (s1 && is_ipc) {
+               if (s1->basic_info.out.attrib != FILE_ATTRIBUTE_NORMAL) {
+                       printf("(%d) attrib basic_info/nlink incorrect - %d should be %d\n", __LINE__, s1->basic_info.out.attrib, FILE_ATTRIBUTE_NORMAL);
+                       ret = False;
+               }
+       }
+       s1 = fnum_find("STANDARD_INFO");
+       if (s1 && is_ipc) {
+               if (s1->standard_info.out.nlink != 1) {
+                       printf("(%d) nlinks standard_info/nlink incorrect - %d should be 1\n", __LINE__, s1->standard_info.out.nlink);
+                       ret = False;
+               }
+               if (s1->standard_info.out.delete_pending != 1) {
+                       printf("(%d) nlinks standard_info/delete_pending incorrect - %d should be 1\n", __LINE__, s1->standard_info.out.delete_pending);
+                       ret = False;
+               }
+       }
        VAL_CHECK("EA_INFO",       ea_info,       ea_size, 
                  "ALL_INFO",      all_info,      ea_size);
        if (!is_ipc) {