Remove unused include param/param.h.
[bbaumbach/samba-autobuild/.git] / source4 / smb_server / blob.c
index 2b870118ba6cfa154441796d47ebf825133969c5..f72074898af2d46845279eaa77969e7aac7836dc 100644 (file)
 */
 
 #include "includes.h"
-#include "lib/util/dlinklist.h"
+#include "../lib/util/dlinklist.h"
 #include "smb_server/smb_server.h"
 #include "librpc/gen_ndr/ndr_misc.h"
 #include "ntvfs/ntvfs.h"
 #include "libcli/raw/libcliraw.h"
-#include "param/param.h"
+#include "libcli/raw/raw_proto.h"
 
 #define BLOB_CHECK(cmd) do { \
        NTSTATUS _status; \
@@ -34,7 +34,7 @@
 
 #define BLOB_CHECK_MIN_SIZE(blob, size) do { \
        if ((blob)->length < (size)) { \
-               return NT_STATUS_INFO_LENGTH_MISMATCH; \
+               return NT_STATUS_INVALID_PARAMETER; \
        } \
 } while (0)
 
@@ -78,7 +78,7 @@ NTSTATUS smbsrv_blob_fill_data(TALLOC_CTX *mem_ctx,
 /*
   pull a string from a blob in a trans2 request
 */
-size_t smbsrv_blob_pull_string(struct smbsrv_request *req
+size_t smbsrv_blob_pull_string(struct request_bufinfo *bufinfo
                               const DATA_BLOB *blob,
                               uint16_t offset,
                               const char **str,
@@ -92,7 +92,7 @@ size_t smbsrv_blob_pull_string(struct smbsrv_request *req,
                return 0;
        }
        
-       return req_pull_string(req, str, 
+       return req_pull_string(bufinfo, str, 
                               blob->data + offset, 
                               blob->length - offset,
                               STR_NO_RANGE_CHECK | flags);
@@ -139,10 +139,10 @@ size_t smbsrv_blob_push_string(TALLOC_CTX *mem_ctx,
                alignment = 1;
                if (dest_len > 0) {
                        SCVAL(blob->data + offset, 0, 0);
-                       ret = push_string(lp_iconv_convenience(global_loadparm), blob->data + offset + 1, str, dest_len-1, flags);
+                       ret = push_string(blob->data + offset + 1, str, dest_len-1, flags);
                }
        } else {
-               ret = push_string(lp_iconv_convenience(global_loadparm), blob->data + offset, str, dest_len, flags);
+               ret = push_string(blob->data + offset, str, dest_len, flags);
        }
 
        /* sometimes the string needs to be terminated, but the length
@@ -475,12 +475,12 @@ NTSTATUS smbsrv_push_passthru_fileinfo(TALLOC_CTX *mem_ctx,
                }
 
                list_size = ea_list_size_chained(st->all_eas.out.num_eas,
-                                                st->all_eas.out.eas);
+                                                st->all_eas.out.eas, 4);
                BLOB_CHECK(smbsrv_blob_grow_data(mem_ctx, blob, list_size));
 
                ea_put_list_chained(blob->data,
                                    st->all_eas.out.num_eas,
-                                   st->all_eas.out.eas);
+                                   st->all_eas.out.eas, 4);
                return NT_STATUS_OK;
 
        case RAW_FILEINFO_SMB2_ALL_INFORMATION:
@@ -502,7 +502,8 @@ NTSTATUS smbsrv_push_passthru_fileinfo(TALLOC_CTX *mem_ctx,
                SIVAL(blob->data,       0x48, st->all_info2.out.ea_size);
                SIVAL(blob->data,       0x4C, st->all_info2.out.access_mask);
                SBVAL(blob->data,       0x50, st->all_info2.out.position);
-               SBVAL(blob->data,       0x58, st->all_info2.out.mode);
+               SIVAL(blob->data,       0x58, st->all_info2.out.mode);
+               SIVAL(blob->data,       0x5C, st->all_info2.out.alignment_requirement);
                BLOB_CHECK(smbsrv_blob_append_string(mem_ctx, blob,
                                                     st->all_info2.out.fname.s,
                                                     0x60, default_str_flags,
@@ -521,20 +522,21 @@ NTSTATUS smbsrv_pull_passthru_sfileinfo(TALLOC_CTX *mem_ctx,
                                        union smb_setfileinfo *st,
                                        const DATA_BLOB *blob,
                                        int default_str_flags,
-                                       struct smbsrv_request *req)
+                                       struct request_bufinfo *bufinfo)
 {
-       uint32_t len;
+       uint32_t len, ofs;
        DATA_BLOB str_blob;
 
        switch (level) {
        case SMB_SFILEINFO_BASIC_INFORMATION:
-               BLOB_CHECK_MIN_SIZE(blob, 36);
+               BLOB_CHECK_MIN_SIZE(blob, 40);
 
                st->basic_info.in.create_time = pull_nttime(blob->data,  0);
                st->basic_info.in.access_time = pull_nttime(blob->data,  8);
                st->basic_info.in.write_time =  pull_nttime(blob->data, 16);
                st->basic_info.in.change_time = pull_nttime(blob->data, 24);
-               st->basic_info.in.attrib =      IVAL(blob->data,        32);
+               st->basic_info.in.attrib      = IVAL(blob->data,        32);
+               st->basic_info.in.reserved    = IVAL(blob->data,        36);
 
                return NT_STATUS_OK;
 
@@ -560,21 +562,59 @@ NTSTATUS smbsrv_pull_passthru_sfileinfo(TALLOC_CTX *mem_ctx,
                return NT_STATUS_OK;
 
        case RAW_SFILEINFO_RENAME_INFORMATION:
-               if (!req) {
-                       /* 
-                        * TODO: get rid of smbsrv_request argument of
-                        * smbsrv_blob_pull_string()
-                        */
-                       return NT_STATUS_NOT_IMPLEMENTED;
+               if (!bufinfo) {
+                       return NT_STATUS_INTERNAL_ERROR;
                }
                BLOB_CHECK_MIN_SIZE(blob, 12);
-
                st->rename_information.in.overwrite = CVAL(blob->data, 0);
                st->rename_information.in.root_fid  = IVAL(blob->data, 4);
                len                                 = IVAL(blob->data, 8);
-               str_blob.data = blob->data+12;
-               str_blob.length = MIN(blob->length, len);
-               smbsrv_blob_pull_string(req, &str_blob, 0,
+               ofs                                 = 12;
+               str_blob = *blob;
+               str_blob.length = MIN(str_blob.length, ofs+len);
+               smbsrv_blob_pull_string(bufinfo, &str_blob, ofs,
+                                       &st->rename_information.in.new_name,
+                                       STR_UNICODE);
+               if (st->rename_information.in.new_name == NULL) {
+                       return NT_STATUS_FOOBAR;
+               }
+
+               return NT_STATUS_OK;
+
+
+       case RAW_SFILEINFO_LINK_INFORMATION:
+               if (!bufinfo) {
+                       return NT_STATUS_INTERNAL_ERROR;
+               }
+               BLOB_CHECK_MIN_SIZE(blob, 20);
+               st->link_information.in.overwrite = CVAL(blob->data, 0);
+               st->link_information.in.root_fid  = IVAL(blob->data, 8);
+               len                                 = IVAL(blob->data, 16);
+               ofs                                 = 20;
+               str_blob = *blob;
+               str_blob.length = MIN(str_blob.length, ofs+len);
+               smbsrv_blob_pull_string(bufinfo, &str_blob, ofs,
+                                       &st->link_information.in.new_name,
+                                       STR_UNICODE);
+               if (st->link_information.in.new_name == NULL) {
+                       return NT_STATUS_FOOBAR;
+               }
+
+               return NT_STATUS_OK;
+
+       case RAW_SFILEINFO_RENAME_INFORMATION_SMB2:
+               /* SMB2 uses a different format for rename information */
+               if (!bufinfo) {
+                       return NT_STATUS_INTERNAL_ERROR;
+               }
+               BLOB_CHECK_MIN_SIZE(blob, 20);
+               st->rename_information.in.overwrite = CVAL(blob->data, 0);
+               st->rename_information.in.root_fid  = BVAL(blob->data, 8);
+               len                                 = IVAL(blob->data,16);
+               ofs                                 = 20;                       
+               str_blob = *blob;
+               str_blob.length = MIN(str_blob.length, ofs+len);
+               smbsrv_blob_pull_string(bufinfo, &str_blob, ofs,
                                        &st->rename_information.in.new_name,
                                        STR_UNICODE);
                if (st->rename_information.in.new_name == NULL) {