summaryrefslogtreecommitdiff
path: root/source4/libcli/raw/rawrequest.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2004-04-14 01:09:41 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:51:16 -0500
commit763c4bc9acc0e9162bcb7c8e487522fa62aedae6 (patch)
treeffae228aeff71474e37b484c1cfd61b5213c5a01 /source4/libcli/raw/rawrequest.c
parent6f47ce8b6c2e78d02d08b975488242ba93e52a4b (diff)
downloadsamba-763c4bc9acc0e9162bcb7c8e487522fa62aedae6.tar.gz
samba-763c4bc9acc0e9162bcb7c8e487522fa62aedae6.tar.bz2
samba-763c4bc9acc0e9162bcb7c8e487522fa62aedae6.zip
r204: Turns out that the string in the SEARCH unix_info level is that
rare thing, a non-length string (ie. not a WIRE_STRING) but a null terminated char string. There wasn't a good interface to pull that out of a blob (all the string interfaces assumed WIRE_STRINGS). Added a new one, only used for this call. Sucks, I know - but the alternatives suck more. Added tests for some of the unix info returned. Jeremy. (This used to be commit 4d0ed04c54b105789ffd32334c3b0e544f02418c)
Diffstat (limited to 'source4/libcli/raw/rawrequest.c')
-rw-r--r--source4/libcli/raw/rawrequest.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/source4/libcli/raw/rawrequest.c b/source4/libcli/raw/rawrequest.c
index f03cc5cf16..321d43f220 100644
--- a/source4/libcli/raw/rawrequest.c
+++ b/source4/libcli/raw/rawrequest.c
@@ -1008,6 +1008,52 @@ size_t cli_blob_pull_string(struct cli_session *session,
}
/*
+ pull a string from a blob, returning a talloced char *
+
+ Currently only used by the UNIX search info level.
+
+ the string length is limited by 2 things:
+ - the data size in the blob
+ - the end of string (null termination)
+
+ on failure zero is returned and dest->s is set to NULL, otherwise the number
+ of bytes consumed in the blob is returned
+*/
+size_t cli_blob_pull_unix_string(struct cli_session *session,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB *blob,
+ const char **dest,
+ uint16 str_offset,
+ unsigned flags)
+{
+ int extra = 0;
+ *dest = NULL;
+
+ if (!(flags & STR_ASCII) &&
+ ((flags & STR_UNICODE) ||
+ (session->transport->negotiate.capabilities & CAP_UNICODE))) {
+ int align = 0;
+ if ((str_offset&1) && !(flags & STR_NOALIGN)) {
+ align = 1;
+ }
+ if (flags & STR_LEN_NOTERM) {
+ extra = 2;
+ }
+ return align + extra + cli_blob_pull_ucs2(mem_ctx, blob, dest,
+ blob->data+str_offset+align,
+ -1, flags);
+ }
+
+ if (flags & STR_LEN_NOTERM) {
+ extra = 1;
+ }
+
+ return extra + cli_blob_pull_ascii(mem_ctx, blob, dest,
+ blob->data+str_offset, -1, flags);
+}
+
+
+/*
append a string into a blob
*/
size_t cli_blob_append_string(struct cli_session *session,