Finish removal of iconv_convenience in public API's.
[samba.git] / source4 / smb_server / blob.c
index 8834c4483c1e2b2562d1ff8c6ca1c0848454ec45..c17cde070d6b53845105edabc8088e5f8c435230 100644 (file)
 */
 
 #include "includes.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 "libcli/raw/raw_proto.h"
-#include "param/param.h"
 
 #define BLOB_CHECK(cmd) do { \
        NTSTATUS _status; \
@@ -35,7 +32,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)
 
@@ -140,10 +137,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
@@ -176,7 +173,7 @@ size_t smbsrv_blob_push_string(TALLOC_CTX *mem_ctx,
 NTSTATUS smbsrv_blob_append_string(TALLOC_CTX *mem_ctx,
                                   DATA_BLOB *blob,
                                   const char *str,
-                                  uint_t len_offset,
+                                  unsigned int len_offset,
                                   int default_flags,
                                   int flags)
 {
@@ -200,7 +197,7 @@ NTSTATUS smbsrv_push_passthru_fsinfo(TALLOC_CTX *mem_ctx,
                                     union smb_fsinfo *fsinfo,
                                     int default_str_flags)
 {
-       uint_t i;
+       unsigned int i;
        DATA_BLOB guid_blob;
 
        switch (level) {
@@ -275,15 +272,13 @@ NTSTATUS smbsrv_push_passthru_fsinfo(TALLOC_CTX *mem_ctx,
                return NT_STATUS_OK;
 
        case RAW_QFS_OBJECTID_INFORMATION: {
-               enum ndr_err_code ndr_err;
+               NTSTATUS status;
 
                BLOB_CHECK(smbsrv_blob_grow_data(mem_ctx, blob, 64));
 
-               ndr_err = ndr_push_struct_blob(&guid_blob, mem_ctx, NULL, 
-                                              &fsinfo->objectid_information.out.guid,
-                                              (ndr_push_flags_fn_t)ndr_push_GUID);
-               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-                       BLOB_CHECK(ndr_map_error2ntstatus(ndr_err));
+               status = GUID_to_ndr_blob(&fsinfo->objectid_information.out.guid, mem_ctx, &guid_blob);
+               if (!NT_STATUS_IS_OK(status)) {
+                       BLOB_CHECK(status);
                }
 
                memcpy(blob->data, guid_blob.data, guid_blob.length);
@@ -307,7 +302,7 @@ NTSTATUS smbsrv_push_passthru_fileinfo(TALLOC_CTX *mem_ctx,
                                       union smb_fileinfo *st,
                                       int default_str_flags)
 {
-       uint_t i;
+       unsigned int i;
        size_t list_size;
 
        switch (level) {
@@ -476,12 +471,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:
@@ -503,7 +498,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,
@@ -529,13 +525,14 @@ NTSTATUS smbsrv_pull_passthru_sfileinfo(TALLOC_CTX *mem_ctx,
 
        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;
 
@@ -580,6 +577,27 @@ NTSTATUS smbsrv_pull_passthru_sfileinfo(TALLOC_CTX *mem_ctx,
 
                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) {
@@ -632,7 +650,7 @@ NTSTATUS smbsrv_push_passthru_search(TALLOC_CTX *mem_ctx,
                                     int default_str_flags)
 {
        uint8_t *data;
-       uint_t ofs = blob->length;
+       unsigned int ofs = blob->length;
 
        switch (level) {
        case RAW_SEARCH_DATA_DIRECTORY_INFO: