2 Unix SMB/CIFS implementation.
3 parsing of EA (extended attribute) lists
4 Copyright (C) Andrew Tridgell 2003
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #include "libcli/raw/libcliraw.h"
25 work out how many bytes on the wire a ea list will consume.
26 This assumes the names are strict ascii, which should be a
29 uint_t ea_list_size(uint_t num_eas, struct ea_struct *eas)
33 for (i=0;i<num_eas;i++) {
34 total += 4 + strlen(eas[i].name.s)+1 + eas[i].value.length;
40 put a ea_list into a pre-allocated buffer - buffer must be at least
41 of size ea_list_size()
43 void ea_put_list(char *data, uint_t num_eas, struct ea_struct *eas)
48 ea_size = ea_list_size(num_eas, eas);
50 SIVAL(data, 0, ea_size);
53 for (i=0;i<num_eas;i++) {
54 uint_t nlen = strlen(eas[i].name.s);
55 SCVAL(data, 0, eas[i].flags);
57 SSVAL(data, 2, eas[i].value.length);
58 memcpy(data+4, eas[i].name.s, nlen+1);
59 memcpy(data+4+nlen+1, eas[i].value.data, eas[i].value.length);
60 data += 4+nlen+1+eas[i].value.length;
66 pull a ea_struct from a buffer. Return the number of bytes consumed
68 uint_t ea_pull_struct(const DATA_BLOB *blob,
75 if (blob->length < 6) {
79 ea->flags = CVAL(blob->data, 0);
80 nlen = CVAL(blob->data, 1);
81 vlen = SVAL(blob->data, 2);
83 if (nlen+1+vlen > blob->length-4) {
87 ea->name.s = talloc_strndup(mem_ctx, blob->data+4, nlen);
88 ea->name.private_length = nlen;
89 ea->value = data_blob_talloc(mem_ctx, NULL, vlen+1);
90 if (!ea->value.data) return 0;
92 memcpy(ea->value.data, blob->data+4+nlen+1, vlen);
94 ea->value.data[vlen] = 0;
97 return 4 + nlen+1 + vlen;
102 pull a ea_list from a buffer
104 NTSTATUS ea_pull_list(const DATA_BLOB *blob,
106 uint_t *num_eas, struct ea_struct **eas)
109 uint32_t ea_size, ofs;
111 if (blob->length < 4) {
112 return NT_STATUS_INFO_LENGTH_MISMATCH;
115 ea_size = IVAL(blob->data, 0);
116 if (ea_size > blob->length) {
117 return NT_STATUS_INVALID_PARAMETER;
125 while (ofs+6 < ea_size) {
129 blob2.data = blob->data + ofs;
130 blob2.length = ea_size - ofs;
132 *eas = talloc_realloc(mem_ctx, *eas, sizeof(**eas) * (n+1));
133 if (! *eas) return NT_STATUS_NO_MEMORY;
135 len = ea_pull_struct(&blob2, mem_ctx, &(*eas)[n]);
137 return NT_STATUS_INVALID_PARAMETER;