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.
24 work out how many bytes on the wire a ea list will consume.
25 This assumes the names are strict ascii, which should be a
28 uint_t ea_list_size(uint_t num_eas, struct ea_struct *eas)
32 for (i=0;i<num_eas;i++) {
33 total += 4 + strlen(eas[i].name.s)+1 + eas[i].value.length;
39 put a ea_list into a pre-allocated buffer - buffer must be at least
40 of size ea_list_size()
42 void ea_put_list(char *data, uint_t num_eas, struct ea_struct *eas)
47 ea_size = ea_list_size(num_eas, eas);
49 SIVAL(data, 0, ea_size);
52 for (i=0;i<num_eas;i++) {
53 uint_t nlen = strlen(eas[i].name.s);
54 SCVAL(data, 0, eas[i].flags);
56 SSVAL(data, 2, eas[i].value.length);
57 memcpy(data+4, eas[i].name.s, nlen+1);
58 memcpy(data+4+nlen+1, eas[i].value.data, eas[i].value.length);
59 data += 4+nlen+1+eas[i].value.length;
65 pull a ea_struct from a buffer. Return the number of bytes consumed
67 uint_t ea_pull_struct(const DATA_BLOB *blob,
74 if (blob->length < 6) {
78 ea->flags = CVAL(blob->data, 0);
79 nlen = CVAL(blob->data, 1);
80 vlen = SVAL(blob->data, 2);
82 if (nlen+1+vlen > blob->length-4) {
86 ea->name.s = talloc_strndup(mem_ctx, blob->data+4, nlen);
87 ea->name.private_length = nlen;
88 ea->value = data_blob_talloc(mem_ctx, NULL, vlen+1);
89 if (!ea->value.data) return 0;
91 memcpy(ea->value.data, blob->data+4+nlen+1, vlen);
93 ea->value.data[vlen] = 0;
96 return 4 + nlen+1 + vlen;
101 pull a ea_list from a buffer
103 NTSTATUS ea_pull_list(const DATA_BLOB *blob,
105 uint_t *num_eas, struct ea_struct **eas)
108 uint32_t ea_size, ofs;
110 if (blob->length < 4) {
111 return NT_STATUS_INFO_LENGTH_MISMATCH;
114 ea_size = IVAL(blob->data, 0);
115 if (ea_size > blob->length) {
116 return NT_STATUS_INVALID_PARAMETER;
124 while (ofs < ea_size) {
128 blob2.data = blob->data + ofs;
129 blob2.length = ea_size - ofs;
131 *eas = talloc_realloc(mem_ctx, *eas, sizeof(**eas) * (n+1));
132 if (! *eas) return NT_STATUS_NO_MEMORY;
134 len = ea_pull_struct(&blob2, mem_ctx, &(*eas)[n]);
136 return NT_STATUS_INVALID_PARAMETER;