SMB2 doesn't have NAME_INFORMATION level
[kai/samba.git] / source4 / ntvfs / posix / pvfs_qfileinfo.c
index b76cafb38a9660d5cbe6ac3aeea87f1e2a078591..b9f763c2e0f06b999d903c840824fff79d8a0dba 100644 (file)
@@ -7,7 +7,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -16,8 +16,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
@@ -179,6 +178,15 @@ static NTSTATUS pvfs_map_fileinfo(struct pvfs_state *pvfs,
        case RAW_FILEINFO_ALL_EAS:
                return pvfs_query_all_eas(pvfs, req, name, fd, &info->all_eas.out);
 
+       case RAW_FILEINFO_SMB2_ALL_EAS: {
+               NTSTATUS status = pvfs_query_all_eas(pvfs, req, name, fd, &info->all_eas.out);
+               if (NT_STATUS_IS_OK(status) &&
+                   info->all_eas.out.num_eas == 0) {
+                       return NT_STATUS_NO_EAS_ON_FILE;
+               }
+               return status;
+       }
+
        case RAW_FILEINFO_IS_NAME_VALID:
                return NT_STATUS_OK;
 
@@ -208,6 +216,10 @@ static NTSTATUS pvfs_map_fileinfo(struct pvfs_state *pvfs,
 
        case RAW_FILEINFO_NAME_INFO:
        case RAW_FILEINFO_NAME_INFORMATION:
+               if (req->ctx->protocol == PROTOCOL_SMB2) {
+                       /* strange that SMB2 doesn't have this */
+                       return NT_STATUS_NOT_SUPPORTED;
+               }
                info->name_info.out.fname.s = name->original_name;
                return NT_STATUS_OK;
 
@@ -302,7 +314,14 @@ static NTSTATUS pvfs_map_fileinfo(struct pvfs_state *pvfs,
                info->all_info2.out.access_mask    = 0; /* only set by qfileinfo */
                info->all_info2.out.position       = 0; /* only set by qfileinfo */
                info->all_info2.out.mode           = 0; /* only set by qfileinfo */
-               info->all_info2.out.fname.s        = name->original_name;
+               /* windows wants the full path on disk for this
+                  result, but I really don't want to expose that on
+                  the wire, so I'll give the path with a share
+                  prefix, which is a good approximation */
+               info->all_info2.out.fname.s = talloc_asprintf(req, "\\%s\\%s",
+                                                             pvfs->share_name, 
+                                                             name->original_name);
+               NT_STATUS_HAVE_NO_MEMORY(info->all_info2.out.fname.s);
                return NT_STATUS_OK;
        }
 
@@ -331,7 +350,7 @@ NTSTATUS pvfs_qpathinfo(struct ntvfs_module_context *ntvfs,
 
        status = pvfs_can_stat(pvfs, req, name);
        if (!NT_STATUS_IS_OK(status)) {
-               return NT_STATUS_DELETE_PENDING;
+               return status;
        }
 
        status = pvfs_access_check_simple(pvfs, req, name, 
@@ -369,7 +388,7 @@ NTSTATUS pvfs_qfileinfo(struct ntvfs_module_context *ntvfs,
        }
 
        /* update the file information */
-       status = pvfs_resolve_name_fd(pvfs, h->fd, h->name);
+       status = pvfs_resolve_name_handle(pvfs, h);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
@@ -381,7 +400,7 @@ NTSTATUS pvfs_qfileinfo(struct ntvfs_module_context *ntvfs,
        switch (info->generic.level) {
        case RAW_FILEINFO_STANDARD_INFO:
        case RAW_FILEINFO_STANDARD_INFORMATION:
-               if (pvfs_delete_on_close_set(pvfs, h, NULL, NULL)) {
+               if (pvfs_delete_on_close_set(pvfs, h)) {
                        info->standard_info.out.delete_pending = 1;
                        info->standard_info.out.nlink--;
                }
@@ -389,7 +408,7 @@ NTSTATUS pvfs_qfileinfo(struct ntvfs_module_context *ntvfs,
 
        case RAW_FILEINFO_ALL_INFO:
        case RAW_FILEINFO_ALL_INFORMATION:
-               if (pvfs_delete_on_close_set(pvfs, h, NULL, NULL)) {
+               if (pvfs_delete_on_close_set(pvfs, h)) {
                        info->all_info.out.delete_pending = 1;
                        info->all_info.out.nlink--;
                }
@@ -408,7 +427,7 @@ NTSTATUS pvfs_qfileinfo(struct ntvfs_module_context *ntvfs,
                break;
 
        case RAW_FILEINFO_SMB2_ALL_INFORMATION:
-               if (pvfs_delete_on_close_set(pvfs, h, NULL, NULL)) {
+               if (pvfs_delete_on_close_set(pvfs, h)) {
                        info->all_info2.out.delete_pending = 1;
                        info->all_info2.out.nlink--;
                }