svn commit: samba r16402 - in
branches/SAMBA_4_0/source/smb_server/smb: .
metze at samba.org
metze at samba.org
Tue Jun 20 06:20:06 GMT 2006
Author: metze
Date: 2006-06-20 06:20:05 +0000 (Tue, 20 Jun 2006)
New Revision: 16402
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=16402
Log:
start to remove the dependecy to smbsrv_request from the parsing functions
metze
Modified:
branches/SAMBA_4_0/source/smb_server/smb/trans2.c
Changeset:
Modified: branches/SAMBA_4_0/source/smb_server/smb/trans2.c
===================================================================
--- branches/SAMBA_4_0/source/smb_server/smb/trans2.c 2006-06-20 06:05:10 UTC (rev 16401)
+++ branches/SAMBA_4_0/source/smb_server/smb/trans2.c 2006-06-20 06:20:05 UTC (rev 16402)
@@ -133,17 +133,19 @@
STR_NO_RANGE_CHECK | flags);
}
+#define TRANS2_REQ_DEFAULT_STR_FLAGS(req) (((req)->flags2 & FLAGS2_UNICODE_STRINGS) ? STR_UNICODE : STR_ASCII)
+
/*
push a string into the data section of a trans2 request
return the number of bytes consumed in the output
*/
-static size_t trans2_push_data_string(struct smbsrv_request *req,
- TALLOC_CTX *mem_ctx,
+static size_t trans2_push_data_string(TALLOC_CTX *mem_ctx,
DATA_BLOB *blob,
uint32_t len_offset,
uint32_t offset,
- const struct smb_wire_string *str,
+ const char *str,
int dest_len,
+ int default_flags,
int flags)
{
int alignment = 0, ret = 0, pkt_len;
@@ -151,7 +153,7 @@
/* we use STR_NO_RANGE_CHECK because the params are allocated
separately in a DATA_BLOB, so we need to do our own range
checking */
- if (!str->s || offset >= blob->length) {
+ if (!str || offset >= blob->length) {
if (flags & STR_LEN8BIT) {
SCVAL(blob->data, len_offset, 0);
} else {
@@ -167,17 +169,17 @@
}
if (!(flags & (STR_ASCII|STR_UNICODE))) {
- flags |= (req->flags2 & FLAGS2_UNICODE_STRINGS) ? STR_UNICODE : STR_ASCII;
+ flags |= default_flags;
}
if ((offset&1) && (flags & STR_UNICODE) && !(flags & STR_NOALIGN)) {
alignment = 1;
if (dest_len > 0) {
SCVAL(blob->data + offset, 0, 0);
- ret = push_string(blob->data + offset + 1, str->s, dest_len-1, flags);
+ ret = push_string(blob->data + offset + 1, str, dest_len-1, flags);
}
} else {
- ret = push_string(blob->data + offset, str->s, dest_len, flags);
+ ret = push_string(blob->data + offset, str, dest_len, flags);
}
/* sometimes the string needs to be terminated, but the length
@@ -207,11 +209,11 @@
len_offset points to the place in the packet where the length field
should go
*/
-static NTSTATUS trans2_append_data_string(struct smbsrv_request *req,
- TALLOC_CTX *mem_ctx,
+static NTSTATUS trans2_append_data_string(TALLOC_CTX *mem_ctx,
DATA_BLOB *blob,
- const struct smb_wire_string *str,
+ const char *str,
uint_t len_offset,
+ int default_flags,
int flags)
{
size_t ret;
@@ -219,8 +221,8 @@
const int max_bytes_per_char = 3;
offset = blob->length;
- TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, offset + (2+strlen_m(str->s))*max_bytes_per_char));
- ret = trans2_push_data_string(req, mem_ctx, blob, len_offset, offset, str, -1, flags);
+ TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, offset + (2+strlen_m(str))*max_bytes_per_char));
+ ret = trans2_push_data_string(mem_ctx, blob, len_offset, offset, str, -1, default_flags, flags);
if (ret < 0) {
return NT_STATUS_FOOBAR;
}
@@ -265,9 +267,10 @@
SIVAL(blob->data, 0, fsinfo->volume.out.serial_number);
/* w2k3 implements this incorrectly for unicode - it
* leaves the last byte off the string */
- TRANS2_CHECK(trans2_append_data_string(req, mem_ctx, blob,
- &fsinfo->volume.out.volume_name,
- 4, STR_LEN8BIT|STR_NOALIGN));
+ TRANS2_CHECK(trans2_append_data_string(mem_ctx, blob,
+ fsinfo->volume.out.volume_name.s,
+ 4, TRANS2_REQ_DEFAULT_STR_FLAGS(req),
+ STR_LEN8BIT|STR_NOALIGN));
return NT_STATUS_OK;
@@ -278,9 +281,10 @@
push_nttime(blob->data, 0, fsinfo->volume_info.out.create_time);
SIVAL(blob->data, 8, fsinfo->volume_info.out.serial_number);
SSVAL(blob->data, 16, 0); /* padding */
- TRANS2_CHECK(trans2_append_data_string(req, mem_ctx, blob,
- &fsinfo->volume_info.out.volume_name,
- 12, STR_UNICODE));
+ TRANS2_CHECK(trans2_append_data_string(mem_ctx, blob,
+ fsinfo->volume_info.out.volume_name.s,
+ 12, TRANS2_REQ_DEFAULT_STR_FLAGS(req),
+ STR_UNICODE));
return NT_STATUS_OK;
@@ -313,9 +317,10 @@
/* this must not be null terminated or win98 gets
confused! also note that w2k3 returns this as
unicode even when ascii is negotiated */
- TRANS2_CHECK(trans2_append_data_string(req, mem_ctx, blob,
- &fsinfo->attribute_info.out.fs_type,
- 8, STR_UNICODE));
+ TRANS2_CHECK(trans2_append_data_string(mem_ctx, blob,
+ fsinfo->attribute_info.out.fs_type.s,
+ 8, TRANS2_REQ_DEFAULT_STR_FLAGS(req),
+ STR_UNICODE));
return NT_STATUS_OK;
@@ -740,27 +745,30 @@
SCVAL(blob->data, 61, st->all_info.out.directory);
SSVAL(blob->data, 62, 0); /* padding */
SIVAL(blob->data, 64, st->all_info.out.ea_size);
- TRANS2_CHECK(trans2_append_data_string(req, mem_ctx, blob,
- &st->all_info.out.fname,
- 68, STR_UNICODE));
+ TRANS2_CHECK(trans2_append_data_string(mem_ctx, blob,
+ st->all_info.out.fname.s,
+ 68, TRANS2_REQ_DEFAULT_STR_FLAGS(req),
+ STR_UNICODE));
return NT_STATUS_OK;
case RAW_FILEINFO_NAME_INFO:
case RAW_FILEINFO_NAME_INFORMATION:
TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, 4));
- TRANS2_CHECK(trans2_append_data_string(req, mem_ctx, blob,
- &st->name_info.out.fname,
- 0, STR_UNICODE));
+ TRANS2_CHECK(trans2_append_data_string(mem_ctx, blob,
+ st->name_info.out.fname.s,
+ 0, TRANS2_REQ_DEFAULT_STR_FLAGS(req),
+ STR_UNICODE));
return NT_STATUS_OK;
case RAW_FILEINFO_ALT_NAME_INFO:
case RAW_FILEINFO_ALT_NAME_INFORMATION:
TRANS2_CHECK(trans2_grow_data(mem_ctx, blob, 4));
- TRANS2_CHECK(trans2_append_data_string(req, mem_ctx, blob,
- &st->alt_name_info.out.fname,
- 0, STR_UNICODE));
+ TRANS2_CHECK(trans2_append_data_string(mem_ctx, blob,
+ st->alt_name_info.out.fname.s,
+ 0, TRANS2_REQ_DEFAULT_STR_FLAGS(req),
+ STR_UNICODE));
return NT_STATUS_OK;
case RAW_FILEINFO_STREAM_INFO:
@@ -773,9 +781,10 @@
data = blob->data + data_size;
SBVAL(data, 8, st->stream_info.out.streams[i].size);
SBVAL(data, 16, st->stream_info.out.streams[i].alloc_size);
- TRANS2_CHECK(trans2_append_data_string(req, mem_ctx, blob,
- &st->stream_info.out.streams[i].stream_name,
- data_size + 4, STR_UNICODE));
+ TRANS2_CHECK(trans2_append_data_string(mem_ctx, blob,
+ st->stream_info.out.streams[i].stream_name.s,
+ data_size + 4, TRANS2_REQ_DEFAULT_STR_FLAGS(req),
+ STR_UNICODE));
if (i == st->stream_info.out.num_streams - 1) {
SIVAL(blob->data, data_size, 0);
} else {
@@ -1137,8 +1146,9 @@
SIVAL(data, 12, file->standard.size);
SIVAL(data, 16, file->standard.alloc_size);
SSVAL(data, 20, file->standard.attrib);
- trans2_append_data_string(req, trans, &trans->out.data, &file->standard.name,
- ofs + 22, STR_LEN8BIT | STR_TERMINATE | STR_LEN_NOTERM);
+ trans2_append_data_string(trans, &trans->out.data, file->standard.name.s,
+ ofs + 22, TRANS2_REQ_DEFAULT_STR_FLAGS(req),
+ STR_LEN8BIT | STR_TERMINATE | STR_LEN_NOTERM);
break;
case RAW_SEARCH_EA_SIZE:
@@ -1157,8 +1167,9 @@
SIVAL(data, 16, file->ea_size.alloc_size);
SSVAL(data, 20, file->ea_size.attrib);
SIVAL(data, 22, file->ea_size.ea_size);
- trans2_append_data_string(req, trans, &trans->out.data, &file->ea_size.name,
- ofs + 26, STR_LEN8BIT | STR_NOALIGN);
+ trans2_append_data_string(trans, &trans->out.data, file->ea_size.name.s,
+ ofs + 26, TRANS2_REQ_DEFAULT_STR_FLAGS(req),
+ STR_LEN8BIT | STR_NOALIGN);
trans2_grow_data(trans, &trans->out.data, trans->out.data.length + 1);
trans->out.data.data[trans->out.data.length-1] = 0;
break;
@@ -1184,8 +1195,9 @@
SIVAL(data, 16, file->ea_list.alloc_size);
SSVAL(data, 20, file->ea_list.attrib);
ea_put_list(data+22, file->ea_list.eas.num_eas, file->ea_list.eas.eas);
- trans2_append_data_string(req, trans, &trans->out.data, &file->ea_list.name,
- ofs + 22 + ea_size, STR_LEN8BIT | STR_NOALIGN);
+ trans2_append_data_string(trans, &trans->out.data, file->ea_list.name.s,
+ ofs + 22 + ea_size, TRANS2_REQ_DEFAULT_STR_FLAGS(req),
+ STR_LEN8BIT | STR_NOALIGN);
trans2_grow_data(trans, &trans->out.data, trans->out.data.length + 1);
trans->out.data.data[trans->out.data.length-1] = 0;
break;
@@ -1201,8 +1213,9 @@
SBVAL(data, 40, file->directory_info.size);
SBVAL(data, 48, file->directory_info.alloc_size);
SIVAL(data, 56, file->directory_info.attrib);
- trans2_append_data_string(req, trans, &trans->out.data, &file->directory_info.name,
- ofs + 60, STR_TERMINATE_ASCII);
+ trans2_append_data_string(trans, &trans->out.data, file->directory_info.name.s,
+ ofs + 60, TRANS2_REQ_DEFAULT_STR_FLAGS(req),
+ STR_TERMINATE_ASCII);
data = trans->out.data.data + ofs;
SIVAL(data, 0, trans->out.data.length - ofs);
break;
@@ -1219,8 +1232,9 @@
SBVAL(data, 48, file->full_directory_info.alloc_size);
SIVAL(data, 56, file->full_directory_info.attrib);
SIVAL(data, 64, file->full_directory_info.ea_size);
- trans2_append_data_string(req, trans, &trans->out.data, &file->full_directory_info.name,
- ofs + 60, STR_TERMINATE_ASCII);
+ trans2_append_data_string(trans, &trans->out.data, file->full_directory_info.name.s,
+ ofs + 60, TRANS2_REQ_DEFAULT_STR_FLAGS(req),
+ STR_TERMINATE_ASCII);
data = trans->out.data.data + ofs;
SIVAL(data, 0, trans->out.data.length - ofs);
break;
@@ -1229,8 +1243,9 @@
trans2_grow_data(trans, &trans->out.data, ofs + 12);
data = trans->out.data.data + ofs;
SIVAL(data, 4, file->name_info.file_index);
- trans2_append_data_string(req, trans, &trans->out.data, &file->name_info.name,
- ofs + 8, STR_TERMINATE_ASCII);
+ trans2_append_data_string(trans, &trans->out.data, file->name_info.name.s,
+ ofs + 8, TRANS2_REQ_DEFAULT_STR_FLAGS(req),
+ STR_TERMINATE_ASCII);
data = trans->out.data.data + ofs;
SIVAL(data, 0, trans->out.data.length - ofs);
break;
@@ -1249,12 +1264,14 @@
SIVAL(data, 64, file->both_directory_info.ea_size);
SCVAL(data, 69, 0); /* reserved */
memset(data+70,0,24);
- trans2_push_data_string(req, trans, &trans->out.data,
+ trans2_push_data_string(trans, &trans->out.data,
68 + ofs, 70 + ofs,
- &file->both_directory_info.short_name,
- 24, STR_UNICODE | STR_LEN8BIT);
- trans2_append_data_string(req, trans, &trans->out.data, &file->both_directory_info.name,
- ofs + 60, STR_TERMINATE_ASCII);
+ file->both_directory_info.short_name.s,
+ 24, TRANS2_REQ_DEFAULT_STR_FLAGS(req),
+ STR_UNICODE | STR_LEN8BIT);
+ trans2_append_data_string(trans, &trans->out.data, file->both_directory_info.name.s,
+ ofs + 60, TRANS2_REQ_DEFAULT_STR_FLAGS(req),
+ STR_TERMINATE_ASCII);
trans2_align_data(trans);
data = trans->out.data.data + ofs;
SIVAL(data, 0, trans->out.data.length - ofs);
@@ -1274,8 +1291,9 @@
SIVAL(data, 64, file->id_full_directory_info.ea_size);
SIVAL(data, 68, 0); /* padding */
SBVAL(data, 72, file->id_full_directory_info.file_id);
- trans2_append_data_string(req, trans, &trans->out.data, &file->id_full_directory_info.name,
- ofs + 60, STR_TERMINATE_ASCII);
+ trans2_append_data_string(trans, &trans->out.data, file->id_full_directory_info.name.s,
+ ofs + 60, TRANS2_REQ_DEFAULT_STR_FLAGS(req),
+ STR_TERMINATE_ASCII);
data = trans->out.data.data + ofs;
SIVAL(data, 0, trans->out.data.length - ofs);
break;
@@ -1294,13 +1312,15 @@
SIVAL(data, 64, file->id_both_directory_info.ea_size);
SCVAL(data, 69, 0); /* reserved */
memset(data+70,0,26);
- trans2_push_data_string(req, trans, &trans->out.data,
+ trans2_push_data_string(trans, &trans->out.data,
68 + ofs, 70 + ofs,
- &file->id_both_directory_info.short_name,
- 24, STR_UNICODE | STR_LEN8BIT);
+ file->id_both_directory_info.short_name.s,
+ 24, TRANS2_REQ_DEFAULT_STR_FLAGS(req),
+ STR_UNICODE | STR_LEN8BIT);
SBVAL(data, 96, file->id_both_directory_info.file_id);
- trans2_append_data_string(req, trans, &trans->out.data, &file->id_both_directory_info.name,
- ofs + 60, STR_TERMINATE_ASCII);
+ trans2_append_data_string(trans, &trans->out.data, file->id_both_directory_info.name.s,
+ ofs + 60, TRANS2_REQ_DEFAULT_STR_FLAGS(req),
+ STR_TERMINATE_ASCII);
data = trans->out.data.data + ofs;
SIVAL(data, 0, trans->out.data.length - ofs);
break;
More information about the samba-cvs
mailing list