pipentlsa.c :
[samba.git] / source / smbparse.c
1 /* 
2    Unix SMB/Netbios implementation.
3    Version 1.9.
4    Samba utility functions
5    Copyright (C) Luke Leighton 1996 - 1997  Paul Ashton 1997
6    
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #include "includes.h"
23
24 extern int DEBUGLEVEL;
25
26
27 /*******************************************************************
28 reads or writes a UTIME type.
29 ********************************************************************/
30 char* smb_io_utime(BOOL io, UTIME *t, char *q, char *base, int align, int depth)
31 {
32         if (t == NULL) return NULL;
33
34         DEBUG(5,("%s%04x smb_io_utime\n",  tab_depth(depth), PTR_DIFF(q, base)));
35         depth++;
36
37         q = align_offset(q, base, align);
38         
39         DBG_RW_IVAL ("time", depth, base, io, q, t->time); q += 4;
40
41         return q;
42 }
43
44 /*******************************************************************
45 reads or writes an NTTIME structure.
46 ********************************************************************/
47 char* smb_io_time(BOOL io, NTTIME *nttime, char *q, char *base, int align, int depth)
48 {
49         if (nttime == NULL) return NULL;
50
51         DEBUG(5,("%s%04x smb_io_time\n",  tab_depth(depth), PTR_DIFF(q, base)));
52         depth++;
53
54         q = align_offset(q, base, align);
55         
56         DBG_RW_IVAL("low ", depth, base, io, q, nttime->low ); q += 4; /* low part */
57         DBG_RW_IVAL("high", depth, base, io, q, nttime->high); q += 4; /* high part */
58
59         return q;
60 }
61
62 /*******************************************************************
63 reads or writes a DOM_SID structure.
64 ********************************************************************/
65 char* smb_io_dom_sid(BOOL io, DOM_SID *sid, char *q, char *base, int align, int depth)
66 {
67         int i;
68
69         if (sid == NULL) return NULL;
70
71         DEBUG(5,("%s%04x smb_io_dom_sid\n",  tab_depth(depth), PTR_DIFF(q, base)));
72         depth++;
73
74         q = align_offset(q, base, align);
75         
76         DBG_RW_IVAL("num_auths ", depth, base, io, q, sid->num_auths); q += 4;
77         DBG_RW_CVAL("sid_no    ", depth, base, io, q, sid->sid_no); q++; 
78         DBG_RW_CVAL("num_auths ", depth, base, io, q, sid->num_auths); q++;
79
80         for (i = 0; i < 6; i++)
81         {
82                 fstring tmp;
83                 sprintf(tmp, "id_auth[%d] ", i);
84                 DBG_RW_CVAL(tmp, depth, base, io, q, sid->id_auth[i]); q++;
85         }
86
87         /* oops! XXXX should really issue a warning here... */
88         if (sid->num_auths > MAXSUBAUTHS) sid->num_auths = MAXSUBAUTHS;
89
90         DBG_RW_PIVAL("num_auths ", depth, base, io, q, sid->sub_auths, sid->num_auths); q += sid->num_auths * 4;
91
92         return q;
93 }
94
95 /*******************************************************************
96 reads or writes a UNIHDR structure.
97 ********************************************************************/
98 char* smb_io_unihdr(BOOL io, UNIHDR *hdr, char *q, char *base, int align, int depth)
99 {
100         if (hdr == NULL) return NULL;
101
102         DEBUG(5,("%s%04x smb_io_unihdr\n",  tab_depth(depth), PTR_DIFF(q, base)));
103         depth++;
104
105         /* should be value 4, so enforce it. */
106         hdr->undoc = 4;
107
108         q = align_offset(q, base, align);
109         
110         DBG_RW_IVAL("uni_max_len", depth, base, io, q, hdr->uni_max_len); q += 4;
111         DBG_RW_IVAL("uni_str_len", depth, base, io, q, hdr->uni_str_len); q += 4;
112         DBG_RW_IVAL("undoc      ", depth, base, io, q, hdr->undoc      ); q += 4;
113
114         return q;
115 }
116
117 /*******************************************************************
118 reads or writes a UNIHDR2 structure.
119 ********************************************************************/
120 char* smb_io_unihdr2(BOOL io, UNIHDR2 *hdr2, char *q, char *base, int align, int depth)
121 {
122         if (hdr2 == NULL) return NULL;
123
124         DEBUG(5,("%s%04x smb_io_unihdr2\n",  tab_depth(depth), PTR_DIFF(q, base)));
125         depth++;
126
127         q = align_offset(q, base, align);
128
129         q = smb_io_unihdr(io, &(hdr2->unihdr), q, base, align, depth);
130         DBG_RW_IVAL("undoc_buffer", depth, base, io, q, hdr2->undoc_buffer); q += 4;
131
132         return q;
133 }
134
135 /*******************************************************************
136 reads or writes a UNISTR structure.
137 XXXX NOTE: UNISTR structures NEED to be null-terminated.
138 ********************************************************************/
139 char* smb_io_unistr(BOOL io, UNISTR *uni, char *q, char *base, int align, int depth)
140 {
141         if (uni == NULL) return NULL;
142
143         DEBUG(5,("%s%04x smb_io_unistr\n",  tab_depth(depth), PTR_DIFF(q, base)));
144         depth++;
145
146         q = align_offset(q, base, align);
147         
148         if (io)
149         {
150                 /* io True indicates read _from_ the SMB buffer into the string */
151                 q += 2 * unistrcpy((char*)uni->buffer, q);
152         }
153         else
154         {
155                 /* io True indicates copy _from_ the string into SMB buffer */
156                 q += 2 * unistrcpy(q, (char*)uni->buffer);
157         }
158         return q;
159 }
160
161 /*******************************************************************
162 reads or writes a UNISTR2 structure.
163 XXXX NOTE: UNISTR2 structures need NOT be null-terminated.
164      the uni_str_len member tells you how long the string is;
165      the uni_max_len member tells you how large the buffer is.
166 ********************************************************************/
167 char* smb_io_unistr2(BOOL io, UNISTR2 *uni2, char *q, char *base, int align, int depth)
168 {
169         if (uni2 == NULL) return NULL;
170
171         DEBUG(5,("%s%04x smb_io_unistr2\n",  tab_depth(depth), PTR_DIFF(q, base)));
172         depth++;
173
174         q = align_offset(q, base, align);
175         
176         /* should be value 0, so enforce it. */
177         uni2->undoc = 0;
178
179         DBG_RW_IVAL("uni_max_len", depth, base, io, q, uni2->uni_max_len); q += 4;
180         DBG_RW_IVAL("undoc      ", depth, base, io, q, uni2->undoc      ); q += 4;
181         DBG_RW_IVAL("uni_str_len", depth, base, io, q, uni2->uni_str_len); q += 4;
182
183         /* oops! XXXX maybe issue a warning that this is happening... */
184         if (uni2->uni_max_len > MAX_UNISTRLEN) uni2->uni_max_len = MAX_UNISTRLEN;
185         if (uni2->uni_str_len > MAX_UNISTRLEN) uni2->uni_str_len = MAX_UNISTRLEN;
186
187         /* buffer advanced by indicated length of string
188        NOT by searching for null-termination */
189         DBG_RW_PSVAL("buffer    ", depth, base, io, q, uni2->buffer, uni2->uni_max_len); q += uni2->uni_max_len * 2;
190
191         return q;
192 }
193
194 /*******************************************************************
195 reads or writes a DOM_SID2 structure.
196 ********************************************************************/
197 char* smb_io_dom_sid2(BOOL io, DOM_SID2 *sid2, char *q, char *base, int align, int depth)
198 {
199         if (sid2 == NULL) return NULL;
200
201         DEBUG(5,("%s%04x smb_io_dom_sid2\n",  tab_depth(depth), PTR_DIFF(q, base)));
202         depth++;
203
204         q = align_offset(q, base, align);
205         
206         /* should be value 5, so enforce it */
207         sid2->type = 5;
208
209         /* should be value 0, so enforce it */
210         sid2->undoc = 0;
211
212         DBG_RW_IVAL("type ", depth, base, io, q, sid2->type ); q += 4;
213         DBG_RW_IVAL("undoc", depth, base, io, q, sid2->undoc); q += 4;
214
215         q = smb_io_unihdr2(io, &(sid2->hdr), q, base, align, depth);
216         q = smb_io_unistr (io, &(sid2->str), q, base, align, depth);
217
218         return q;
219 }
220
221 /*******************************************************************
222 reads or writes a DOM_RID2 structure.
223 ********************************************************************/
224 char* smb_io_dom_rid2(BOOL io, DOM_RID2 *rid2, char *q, char *base, int align, int depth)
225 {
226         if (rid2 == NULL) return NULL;
227
228         DEBUG(5,("%s%04x smb_io_dom_rid2\n",  tab_depth(depth), PTR_DIFF(q, base)));
229         depth++;
230
231         q = align_offset(q, base, align);
232         
233         /* should be value 5, so enforce it */
234         rid2->type = 5;
235
236         /* should be value 5, so enforce it */
237         rid2->undoc = 5;
238
239         DBG_RW_IVAL("type   ", depth, base, io, q, rid2->type); q += 4;
240         DBG_RW_IVAL("undoc  ", depth, base, io, q, rid2->undoc   ); q += 4;
241         DBG_RW_IVAL("rid    ", depth, base, io, q, rid2->rid     ); q += 4;
242         DBG_RW_IVAL("rid_idx", depth, base, io, q, rid2->rid_idx ); q += 4;
243
244         return q;
245 }
246
247 /*******************************************************************
248 reads or writes a DOM_LOG_INFO structure.
249 ********************************************************************/
250 char* smb_io_log_info(BOOL io, DOM_LOG_INFO *log, char *q, char *base, int align, int depth)
251 {
252         if (log == NULL) return NULL;
253
254         DEBUG(5,("%s%04x smb_io_log_info\n",  tab_depth(depth), PTR_DIFF(q, base)));
255         depth++;
256
257         q = align_offset(q, base, align);
258         
259         DBG_RW_IVAL("undoc_buffer", depth, base, io, q, log->undoc_buffer); q += 4;
260
261         q = smb_io_unistr2(io, &(log->uni_logon_srv), q, base, align, depth);
262         q = smb_io_unistr2(io, &(log->uni_acct_name), q, base, align, depth);
263
264         DBG_RW_SVAL("sec_chan", depth, base, io, q, log->sec_chan); q += 2;
265
266         q = smb_io_unistr2(io, &(log->uni_comp_name), q, base, align, depth);
267
268         return q;
269 }
270
271 /*******************************************************************
272 reads or writes a DOM_CHAL structure.
273 ********************************************************************/
274 char* smb_io_chal(BOOL io, DOM_CHAL *chal, char *q, char *base, int align, int depth)
275 {
276         if (chal == NULL) return NULL;
277
278         DEBUG(5,("%s%04x smb_io_chal\n",  tab_depth(depth), PTR_DIFF(q, base)));
279         depth++;
280
281         q = align_offset(q, base, align);
282         
283         DBG_RW_IVAL("data[0]", depth, base, io, q, chal->data[0]); q += 4;
284         DBG_RW_IVAL("data[1]", depth, base, io, q, chal->data[1]); q += 4;
285 /*
286         DBG_RW_PCVAL("data", depth, base, io, q, chal->data, 8); q += 8;
287 */
288         return q;
289 }
290
291 /*******************************************************************
292 reads or writes a DOM_CRED structure.
293 ********************************************************************/
294 char* smb_io_cred(BOOL io, DOM_CRED *cred, char *q, char *base, int align, int depth)
295 {
296         if (cred == NULL) return NULL;
297
298         DEBUG(5,("%s%04x smb_io_cred\n",  tab_depth(depth), PTR_DIFF(q, base)));
299         depth++;
300
301         q = align_offset(q, base, align);
302         
303         q = smb_io_chal (io, &(cred->challenge), q, base, align, depth);
304         q = smb_io_utime(io, &(cred->timestamp), q, base, align, depth);
305
306         return q;
307 }
308
309 /*******************************************************************
310 reads or writes a DOM_CLNT_INFO structure.
311 ********************************************************************/
312 char* smb_io_clnt_info(BOOL io, DOM_CLNT_INFO *clnt, char *q, char *base, int align, int depth)
313 {
314         if (clnt == NULL) return NULL;
315
316         DEBUG(5,("%s%04x smb_io_clnt_info\n",  tab_depth(depth), PTR_DIFF(q, base)));
317         depth++;
318
319         q = align_offset(q, base, align);
320         
321         q = smb_io_log_info(io, &(clnt->login), q, base, align, depth);
322         q = smb_io_cred    (io, &(clnt->cred ), q, base, align, depth);
323
324         return q;
325 }
326
327 /*******************************************************************
328 reads or writes a DOM_LOGON_ID structure.
329 ********************************************************************/
330 char* smb_io_logon_id(BOOL io, DOM_LOGON_ID *log, char *q, char *base, int align, int depth)
331 {
332         if (log == NULL) return NULL;
333
334         DEBUG(5,("%s%04x smb_io_logon_id\n",  tab_depth(depth), PTR_DIFF(q, base)));
335         depth++;
336
337         q = align_offset(q, base, align);
338         
339         DBG_RW_IVAL("low ", depth, base, io, q, log->low ); q += 4;
340         DBG_RW_IVAL("high", depth, base, io, q, log->high); q += 4;
341
342         return q;
343 }
344
345 /*******************************************************************
346 reads or writes an ARC4_OWF structure.
347 ********************************************************************/
348 char* smb_io_arc4_owf(BOOL io, ARC4_OWF *hash, char *q, char *base, int align, int depth)
349 {
350         if (hash == NULL) return NULL;
351
352         DEBUG(5,("%s%04x smb_io_arc4_owf\n",  tab_depth(depth), PTR_DIFF(q, base)));
353         depth++;
354
355         q = align_offset(q, base, align);
356         
357         DBG_RW_PCVAL("data", depth, base, io, q, hash->data, 16); q += 16;
358
359         return q;
360 }
361
362 /*******************************************************************
363 reads or writes an DOM_ID_INFO_1 structure.
364 ********************************************************************/
365 char* smb_io_id_info1(BOOL io, DOM_ID_INFO_1 *id, char *q, char *base, int align, int depth)
366 {
367         if (id == NULL) return NULL;
368
369         DEBUG(5,("%s%04x smb_io_id_info1\n",  tab_depth(depth), PTR_DIFF(q, base)));
370         depth++;
371
372         q = align_offset(q, base, align);
373         
374         q = smb_io_unihdr(io, &(id->hdr_domain_name   ), q, base, align, depth);
375
376         DBG_RW_IVAL("param", depth, base, io, q, id->param); q += 4;
377         q = smb_io_logon_id(io, &(id->logon_id), q, base, align, depth);
378
379         q = smb_io_unihdr(io, &(id->hdr_user_name     ), q, base, align, depth);
380         q = smb_io_unihdr(io, &(id->hdr_workgroup_name), q, base, align, depth);
381
382         q = smb_io_arc4_owf(io, &(id->arc4_lm_owf), q, base, align, depth);
383         q = smb_io_arc4_owf(io, &(id->arc4_nt_owf), q, base, align, depth);
384
385         q = smb_io_unistr2(io, &(id->uni_domain_name   ), q, base, align, depth);
386         q = smb_io_unistr2(io, &(id->uni_user_name     ), q, base, align, depth);
387         q = smb_io_unistr2(io, &(id->uni_workgroup_name), q, base, align, depth);
388
389         return q;
390 }
391
392 /*******************************************************************
393 reads or writes a DOM_SAM_INFO structure.
394 ********************************************************************/
395 char* smb_io_sam_info(BOOL io, DOM_SAM_INFO *sam, char *q, char *base, int align, int depth)
396 {
397         if (sam == NULL) return NULL;
398
399         DEBUG(5,("%s%04x smb_io_sam_info\n",  tab_depth(depth), PTR_DIFF(q, base)));
400         depth++;
401
402         q = align_offset(q, base, align);
403         
404         q = smb_io_clnt_info(io, &(sam->client  ), q, base, align, depth);
405         q = smb_io_cred     (io, &(sam->rtn_cred), q, base, align, depth);
406
407         DBG_RW_IVAL("logon_level", depth, base, io, q, sam->logon_level); q += 4;
408         DBG_RW_SVAL("auth_level ", depth, base, io, q, sam->auth_level ); q += 4;
409
410         switch (sam->auth_level)
411         {
412                 case 1:
413                 {
414                         q = smb_io_id_info1(io, &(sam->auth.id1), q, base, align, depth);
415                         break;
416                 }
417                 default:
418                 {
419                         /* PANIC! */
420                         break;
421                 }
422         }
423         return q;
424 }
425
426 /*******************************************************************
427 reads or writes a DOM_GID structure.
428 ********************************************************************/
429 char* smb_io_gid(BOOL io, DOM_GID *gid, char *q, char *base, int align, int depth)
430 {
431         if (gid == NULL) return NULL;
432
433         DEBUG(5,("%s%04x smb_io_gid\n",  tab_depth(depth), PTR_DIFF(q, base)));
434         depth++;
435
436         q = align_offset(q, base, align);
437         
438         DBG_RW_IVAL("gid ", depth, base, io, q, gid->gid ); q += 4;
439         DBG_RW_IVAL("attr", depth, base, io, q, gid->attr); q += 4;
440
441         return q;
442 }
443
444 /*******************************************************************
445 reads or writes an RPC_HDR structure.
446 ********************************************************************/
447 char* smb_io_rpc_hdr(BOOL io, RPC_HDR *rpc, char *q, char *base, int align, int depth)
448 {
449         if (rpc == NULL) return NULL;
450
451         DEBUG(5,("%s%04x smb_io_rpc_hdr\n",  tab_depth(depth), PTR_DIFF(q, base)));
452         depth++;
453
454         /* reserved should be zero: enforce it */
455         rpc->reserved = 0;
456
457         DBG_RW_CVAL("major     ", depth, base, io, q, rpc->major); q++;
458         DBG_RW_CVAL("minor     ", depth, base, io, q, rpc->minor); q++;
459         DBG_RW_CVAL("pkt_type  ", depth, base, io, q, rpc->pkt_type); q++;
460         DBG_RW_CVAL("frag      ", depth, base, io, q, rpc->frag); q++;
461         DBG_RW_IVAL("pack_type ", depth, base, io, q, rpc->pack_type); q += 4;
462         DBG_RW_SVAL("frag_len  ", depth, base, io, q, rpc->frag_len); q += 2;
463         DBG_RW_SVAL("auth_len  ", depth, base, io, q, rpc->auth_len); q += 2;
464         DBG_RW_IVAL("call_id   ", depth, base, io, q, rpc->call_id); q += 4;
465         DBG_RW_IVAL("alloc_hint", depth, base, io, q, rpc->alloc_hint); q += 4;
466         DBG_RW_CVAL("context_id", depth, base, io, q, rpc->context_id); q++;
467         DBG_RW_CVAL("reserved  ", depth, base, io, q, rpc->reserved); q++;
468
469         return q;
470 }
471
472 /*******************************************************************
473 reads or writes an LSA_POL_HND structure.
474 ********************************************************************/
475 char* smb_io_pol_hnd(BOOL io, LSA_POL_HND *pol, char *q, char *base, int align, int depth)
476 {
477         if (pol == NULL) return NULL;
478
479         DEBUG(5,("%s%04x smb_io_pol_hnd\n",  tab_depth(depth), PTR_DIFF(q, base)));
480         depth++;
481
482         q = align_offset(q, base, align);
483         
484         DBG_RW_PCVAL("data", depth, base, io, q, pol->data, POL_HND_SIZE); q += POL_HND_SIZE;
485
486         return q;
487 }
488
489 /*******************************************************************
490 reads or writes a dom query structure.
491 ********************************************************************/
492 char* smb_io_dom_query_3(BOOL io, DOM_QUERY_3 *d_q, char *q, char *base, int align, int depth)
493 {
494         return smb_io_dom_query(io, d_q, q, base, align, depth);
495 }
496
497 /*******************************************************************
498 reads or writes a dom query structure.
499 ********************************************************************/
500 char* smb_io_dom_query_5(BOOL io, DOM_QUERY_3 *d_q, char *q, char *base, int align, int depth)
501 {
502         return smb_io_dom_query(io, d_q, q, base, align, depth);
503 }
504
505 /*******************************************************************
506 reads or writes a dom query structure.
507 ********************************************************************/
508 char* smb_io_dom_query(BOOL io, DOM_QUERY *d_q, char *q, char *base, int align, int depth)
509 {
510         if (d_q == NULL) return NULL;
511
512         DEBUG(5,("%s%04x smb_io_dom_query\n",  tab_depth(depth), PTR_DIFF(q, base)));
513         depth++;
514
515         q = align_offset(q, base, align);
516         
517         DBG_RW_SVAL("uni_dom_max_len", depth, base, io, q, d_q->uni_dom_max_len); q += 2; /* domain name string length * 2 */
518         DBG_RW_SVAL("uni_dom_str_len", depth, base, io, q, d_q->uni_dom_str_len); q += 2; /* domain name string length * 2 */
519
520         DBG_RW_IVAL("buffer_dom_name", depth, base, io, q, d_q->buffer_dom_name); q += 4; /* undocumented domain name string buffer pointer */
521         DBG_RW_IVAL("buffer_dom_sid ", depth, base, io, q, d_q->buffer_dom_sid ); q += 4; /* undocumented domain SID string buffer pointer */
522
523         if (d_q->buffer_dom_name != 0)
524         {
525                 q = smb_io_unistr2(io, &(d_q->uni_domain_name), q, base, align, depth); /* domain name (unicode string) */
526         }
527         if (d_q->buffer_dom_sid != 0)
528         {
529                 q = smb_io_dom_sid(io, &(d_q->dom_sid), q, base, align, depth); /* domain SID */
530         }
531
532         return q;
533 }
534
535 /*******************************************************************
536 reads or writes a DOM_R_REF structure.
537 ********************************************************************/
538 char* smb_io_dom_r_ref(BOOL io, DOM_R_REF *r_r, char *q, char *base, int align, int depth)
539 {
540         int i;
541
542         DEBUG(5,("%s%04x smb_io_dom_r_ref\n",  tab_depth(depth), PTR_DIFF(q, base)));
543         depth++;
544
545         if (r_r == NULL) return NULL;
546
547         q = align_offset(q, base, align);
548         
549         DBG_RW_IVAL("undoc_buffer   ", depth, base, io, q, r_r->undoc_buffer); q += 4; /* undocumented buffer pointer. */
550         DBG_RW_IVAL("num_ref_doms_1 ", depth, base, io, q, r_r->num_ref_doms_1); q += 4; /* num referenced domains? */
551         DBG_RW_IVAL("buffer_dom_name", depth, base, io, q, r_r->buffer_dom_name); q += 4; /* undocumented domain name buffer pointer. */
552         DBG_RW_IVAL("max_entries    ", depth, base, io, q, r_r->max_entries); q += 4; /* 32 - max number of entries */
553         DBG_RW_IVAL("num_ref_doms_2 ", depth, base, io, q, r_r->num_ref_doms_2); q += 4; /* 4 - num referenced domains? */
554
555         q = smb_io_unihdr2(io, &(r_r->hdr_dom_name), q, base, align, depth); /* domain name unicode string header */
556
557         for (i = 0; i < r_r->num_ref_doms_1-1; i++)
558         {
559                 q = smb_io_unihdr2(io, &(r_r->hdr_ref_dom[i]), q, base, align, depth);
560         }
561
562         q = smb_io_unistr(io, &(r_r->uni_dom_name), q, base, align, depth); /* domain name unicode string */
563
564         for (i = 0; i < r_r->num_ref_doms_2; i++)
565         {
566                 q = smb_io_dom_sid(io, &(r_r->ref_dom[i]), q, base, align, depth); /* referenced domain SIDs */
567         }
568         return q;
569 }
570
571 /*******************************************************************
572 reads or writes a DOM_NAME structure.
573 ********************************************************************/
574 char* smb_io_dom_name(BOOL io, DOM_NAME *name, char *q, char *base, int align, int depth)
575 {
576         if (name == NULL) return NULL;
577
578         DEBUG(5,("%s%04x smb_io_dom_name\n",  tab_depth(depth), PTR_DIFF(q, base)));
579         depth++;
580
581         q = align_offset(q, base, align);
582         
583         DBG_RW_IVAL("uni_str_len", depth, base, io, q, name->uni_str_len); q += 4;
584
585         /* don't know if len is specified by uni_str_len member... */
586         /* assume unicode string is unicode-null-terminated, instead */
587
588         q = smb_io_unistr(io, &(name->str), q, base, align, depth);
589
590         return q;
591 }
592
593
594 /*******************************************************************
595 reads or writes a structure.
596 ********************************************************************/
597 char* smb_io_neg_flags(BOOL io, NEG_FLAGS *neg, char *q, char *base, int align, int depth)
598 {
599         if (neg == NULL) return NULL;
600
601         DEBUG(5,("%s%04x smb_io_neg_flags\n",  tab_depth(depth), PTR_DIFF(q, base)));
602         depth++;
603
604         q = align_offset(q, base, align);
605         
606         DBG_RW_IVAL("neg_flags", depth, base, io, q, neg->neg_flags); q += 4;
607
608         return q;
609 }
610
611
612 #if 0
613 /*******************************************************************
614 reads or writes a structure.
615 ********************************************************************/
616  char* smb_io_(BOOL io, *, char *q, char *base, int align, int depth)
617 {
618         if (== NULL) return NULL;
619
620         q = align_offset(q, base, align);
621         
622         DBG_RW_IVAL("", depth, base, io, q, ); q += 4;
623
624         return q;
625 }
626 #endif
627