/** pull a string from a request packet, returning a talloced string the string length is limited by the 3 things: - the data size in the request (end of packet) - the passed 'byte_len' if it is not -1 - the end of string (null termination) Note that 'byte_len' is the number of bytes in the packet on failure zero is returned and *dest is set to NULL, otherwise the number of bytes consumed in the packet is returned */ size_t smbcli_req_pull_string(struct request_bufinfo *bufinfo, TALLOC_CTX *mem_ctx, char **dest, const uint8_t *src, int byte_len, unsigned int flags) { if (!(flags & STR_ASCII) && (((flags & STR_UNICODE) || (bufinfo->flags & BUFINFO_FLAG_UNICODE)))) { return smbcli_req_pull_ucs2(bufinfo, mem_ctx, dest, src, byte_len, flags); } return smbcli_req_pull_ascii(bufinfo, mem_ctx, dest, src, byte_len, flags); }
/**************************************************************************** Old style search backend - process output. ****************************************************************************/ static void smb_raw_search_backend(struct smbcli_request *req, TALLOC_CTX *mem_ctx, uint16_t count, void *private_data, smbcli_search_callback callback) { union smb_search_data search_data; int i; uint8_t *p; if (req->in.data_size < 3 + count*43) { req->status = NT_STATUS_INVALID_PARAMETER; return; } p = req->in.data + 3; for (i=0; i < count; i++) { char *name; search_data.search.id.reserved = CVAL(p, 0); memcpy(search_data.search.id.name, p+1, 11); search_data.search.id.handle = CVAL(p, 12); search_data.search.id.server_cookie = IVAL(p, 13); search_data.search.id.client_cookie = IVAL(p, 17); search_data.search.attrib = CVAL(p, 21); search_data.search.write_time = raw_pull_dos_date(req->transport, p + 22); search_data.search.size = IVAL(p, 26); smbcli_req_pull_ascii(&req->in.bufinfo, mem_ctx, &name, p+30, 13, STR_ASCII); search_data.search.name = name; if (!callback(private_data, &search_data)) { break; } p += 43; } }