source: trunk/include/smb_deps.h @ 30

Last change on this file since 30 was 30, checked in by tim, 19 years ago

Added initial version of regfio interface, borrowed from Samba project.

Library has all write capability stripped, and all Samba dependency has
either been removed, or included in the smb_deps code.

  • Property svn:keywords set to Id
File size: 12.2 KB
Line 
1/*
2 * This file contains miscellaneous pieces of code which regfio.c
3 * depends upon, from the Samba Subversion tree.  See:
4 *   http://websvn.samba.org/cgi-bin/viewcvs.cgi/trunk/source/
5 *
6 * Copyright (C) 2005 Timothy D. Morgan
7 * Copyright (C) 1992-2005 Samba development team
8 *               (see individual files under Subversion for details.)
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; version 2 of the License.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 *
23 * $Id: smb_deps.h 30 2005-07-16 14:31:27Z tim $
24 */
25
26#include <stdbool.h>
27#include <stdio.h>
28#include <errno.h>
29#include <fcntl.h>
30#include <sys/stat.h>
31#include <sys/types.h>
32#include <unistd.h>
33
34#include "byteorder.h"
35
36#define DEBUG(lvl,body) 0
37
38void* zalloc(size_t size);
39void* zcalloc(size_t size, unsigned int count);
40void zerop(void* p);
41
42
43/* From includes.h */
44
45#define uint8 unsigned char
46#define int16 short
47#define uint16 unsigned short
48#define int32 int
49#define uint32 unsigned int
50
51#define SMB_STRUCT_STAT struct stat
52#define QSORT_CAST (int (*)(const void *, const void *))
53
54#define MIN(a,b) ((a)<(b)?(a):(b))
55#define MAX(a,b) ((a)>(b)?(a):(b))
56
57extern int DEBUGLEVEL;
58
59#define DLIST_ADD(list, p) \
60{ \
61        if (!(list)) { \
62                (list) = (p); \
63                (p)->next = (p)->prev = NULL; \
64        } else { \
65                (list)->prev = (p); \
66                (p)->next = (list); \
67                (p)->prev = NULL; \
68                (list) = (p); \
69        }\
70}
71
72/* End of stuff from includes.h */
73
74/* From smb.h */
75
76#define MAXSUBAUTHS 15
77
78typedef struct sid_info
79{
80  uint8  sid_rev_num;             /**< SID revision number */
81  uint8  num_auths;               /**< Number of sub-authorities */
82  uint8  id_auth[6];              /**< Identifier Authority */
83  /*
84   *  Pointer to sub-authorities.
85   *
86   * @note The values in these uint32's are in *native* byteorder, not
87   * neccessarily little-endian...... JRA.
88   */
89  /* '15' was previously the #define MAXSUBAUTHS */
90  uint32 sub_auths[15];
91
92} DOM_SID;
93
94typedef struct nttime_info
95{
96  uint32 low;
97  uint32 high;
98} NTTIME;
99
100/* End of stuff from smb.h */
101
102/* From smb_macros.h */
103
104#define TALLOC_ZERO_P(ctx, type) (type *)_talloc_zero(ctx, sizeof(type), #type)
105#define SMB_MALLOC_P(type) (type *)malloc_(sizeof(type))
106#define TALLOC_ARRAY(ctx, type, count) (type *)_talloc_array(ctx, sizeof(type), count, #type)
107#define TALLOC_ZERO_ARRAY(ctx, type, count) (type *)_talloc_zero_array(ctx, sizeof(type), count, #type)
108#define SAFE_FREE(x) do { if ((x) != NULL) {free(x); x=NULL;} } while(0)
109
110/* End of stuff from smb_macros.h */
111
112/* From ntdomain.h */
113
114struct uuid {
115       uint32 time_low;
116       uint16 time_mid;
117       uint16 time_hi_and_version;
118       uint8  clock_seq[2];
119       uint8  node[6];
120};
121
122typedef struct _prs_struct {
123        bool io; /* parsing in or out of data stream */
124        /*
125         * If the (incoming) data is big-endian. On output we are
126          * always little-endian.
127           */ 
128           bool bigendian_data;
129           uint8 align; /* data alignment */
130           bool is_dynamic; /* Do we own this memory or not ? */
131           uint32 data_offset; /* Current working offset into data. */
132           uint32 buffer_size; /* Current allocated size of the buffer. */
133           uint32 grow_size; /* size requested via prs_grow() calls */
134           char *data_p; /* The buffer itself. */
135           void *mem_ctx; /* When unmarshalling, use this.... */
136} prs_struct;
137
138#define MARSHALL 0
139#define UNMARSHALL 1
140
141#define RPC_LITTLE_ENDIAN  0
142#define RPC_PARSE_ALIGN    4
143
144
145/* End of stuff from ntdomain.h */
146
147/* From nt_status.h */
148
149typedef uint32 NTSTATUS;
150typedef uint32 WERROR;
151
152/* End of stuff from nt_status.h */
153
154/* From lib/time.c */
155
156#define CHAR_BIT 8
157#define TIME_T_MIN ((time_t)0 < (time_t) -1 ? (time_t) 0 \
158                    : ~ (time_t) 0 << (sizeof (time_t) * CHAR_BIT - 1))
159#define TIME_T_MAX (~ (time_t) 0 - TIME_T_MIN)
160#define TIME_FIXUP_CONSTANT (369.0*365.25*24*60*60-(3.0*24*60*60+6.0*60*60))
161
162void unix_to_nt_time(NTTIME *nt, time_t t);
163
164/* End of stuff from lib/time.c */
165
166/* From rpc_dce.h */
167
168#define MAX_PDU_FRAG_LEN 0x10b8 /* this is what w2k sets */
169
170/* End of stuff from rpc_dce.h */
171
172/* From parse_prs.h */
173
174bool prs_grow(prs_struct *ps, uint32 extra_space);
175bool prs_align(prs_struct *ps);
176bool prs_init(prs_struct *ps, uint32 size, void *ctx, bool io);
177char *prs_mem_get(prs_struct *ps, uint32 extra_size);
178bool prs_uint32(const char *name, prs_struct *ps, int depth, uint32 *data32);
179bool prs_uint32s(bool charmode, const char *name, prs_struct *ps, 
180                 int depth, uint32 *data32s, int len);
181bool prs_uint16(const char *name, prs_struct *ps, int depth, uint16 *data16);
182bool prs_uint16_pre(const char *name, prs_struct *ps, int depth, 
183                    uint16 *data16, uint32 *offset);
184bool prs_uint16_post(const char *name, prs_struct *ps, int depth, 
185                     uint16 *data16, uint32 ptr_uint16, uint32 start_offset);
186bool prs_uint8(const char *name, prs_struct *ps, int depth, uint8 *data8);
187bool prs_uint8s(bool charmode, const char *name, prs_struct *ps, int depth, uint8 *data8s, int len);
188bool prs_set_offset(prs_struct *ps, uint32 offset);
189
190/* End of stuff from parse_prs.h */
191
192
193
194/* buffer used by \winreg\ calls to fill in arbitrary REG_XXX values.
195   It *may* look like a UNISTR2 but it is *not*.  This is not a goof
196   by the winreg developers.  It is a generic buffer.  buffer length
197   is stored in bytes (not # of uint16's) */
198
199typedef struct {
200        uint32 buf_max_len;
201        uint32 offset;
202        uint32 buf_len;
203        uint16 *buffer;
204} REGVAL_BUFFER;
205
206typedef struct {
207        uint32 buf_len;
208        uint16 *buffer; /* data */
209} BUFFER5;
210
211
212/**********************************************************************
213 * UNICODE string variations
214 **********************************************************************/
215
216
217typedef struct {                /* UNISTR - unicode string size and buffer */
218        uint16 *buffer;         /* unicode characters. ***MUST*** be
219                                   little-endian. ***MUST*** be null-terminated */
220} UNISTR;
221
222typedef struct {                /* UNISTR2 - unicode string size (in
223                                   uint16 unicode chars) and buffer */
224        uint32 uni_max_len;
225        uint32 offset;
226        uint32 uni_str_len;
227        uint16 *buffer;         /* unicode characters. ***MUST*** be little-endian.
228                                  **must** be null-terminated and the uni_str_len
229                                  should include the NULL character */
230} UNISTR2;
231
232/* i think this is the same as a BUFFER5 used in the spoolss code --jerry */
233/* not sure about how the termination matches between the uint16 buffers thought */
234
235typedef struct {                /* UNISTR3 - XXXX not sure about this structure */
236        uint32 uni_str_len;
237        UNISTR str;
238} UNISTR3;
239
240typedef struct {                /* Buffer wrapped around a UNISTR2 */
241        uint16 length;          /* number of bytes not counting NULL terminatation */
242        uint16 size;            /* number of bytes including NULL terminatation */
243        UNISTR2 *string;
244} UNISTR4;
245
246typedef struct {
247        uint32 count;
248        UNISTR4 *strings;
249} UNISTR4_ARRAY;
250
251
252/**********************************************************************
253 * String variations
254 **********************************************************************/
255
256typedef struct {                /* STRING2 - string size (in uint8 chars) and buffer */
257        uint32 str_max_len;
258        uint32 offset;
259        uint32 str_str_len;
260        uint8  *buffer;         /* uint8 characters. **NOT** necessarily null-terminated */
261} STRING2;
262
263
264/* From rpc_secdesc.h */
265
266typedef struct security_info_info
267{
268        uint32 mask;
269
270} SEC_ACCESS;
271
272typedef struct security_ace_info
273{
274        uint8 type;  /* xxxx_xxxx_ACE_TYPE - e.g allowed / denied etc */
275        uint8 flags; /* xxxx_INHERIT_xxxx - e.g OBJECT_INHERIT_ACE */
276        uint16 size;
277
278        SEC_ACCESS info;
279
280        /* this stuff may be present when type is XXXX_TYPE_XXXX_OBJECT */
281        uint32  obj_flags; /* xxxx_ACE_OBJECT_xxxx e.g present/inherited present etc */
282        struct uuid obj_guid;  /* object GUID */
283        struct uuid inh_guid;  /* inherited object GUID */             
284        /* eof object stuff */
285
286        DOM_SID trustee;
287
288} SEC_ACE;
289
290typedef struct security_acl_info
291{
292        uint16 revision; /* 0x0003 */
293        uint16 size; /* size in bytes of the entire ACL structure */
294        uint32 num_aces; /* number of Access Control Entries */
295
296        SEC_ACE *ace;
297
298} SEC_ACL;
299
300typedef struct security_descriptor_info
301{
302        uint16 revision; /* 0x0001 */
303        uint16 type;     /* SEC_DESC_xxxx flags */
304
305        uint32 off_owner_sid; /* offset to owner sid */
306        uint32 off_grp_sid  ; /* offset to group sid */
307        uint32 off_sacl     ; /* offset to system list of permissions */
308        uint32 off_dacl     ; /* offset to list of permissions */
309
310        SEC_ACL *dacl; /* user ACL */
311        SEC_ACL *sacl; /* system ACL */
312        DOM_SID *owner_sid; 
313        DOM_SID *grp_sid;
314
315} SEC_DESC;
316
317/* End of stuff from rpc_secdesc.h */
318
319
320/* From pstring.h */
321
322#define PSTRING_LEN 1024
323#define FSTRING_LEN 256
324
325typedef char pstring[PSTRING_LEN];
326typedef char fstring[FSTRING_LEN];
327
328/* End of stuff from pstring.h */
329
330/* From reg_objects.h */
331
332typedef struct _REGISTRY_VALUE {
333        fstring         valuename;
334        uint16          type;
335        /* this should be encapsulated in an RPC_DATA_BLOB */
336        uint32          size;   /* in bytes */
337        uint8           *data_p;
338} REGISTRY_VALUE;
339
340/* container for registry values */
341typedef struct {
342        void      *ctx;
343        uint32          num_values;
344        REGISTRY_VALUE  **values;
345} REGVAL_CTR;
346
347/* container for registry subkey names */
348typedef struct {
349        void    *ctx;
350        uint32          num_subkeys;
351        char            **subkeys;
352} REGSUBKEY_CTR;
353
354/* represent a registry key with all its subkeys and values */
355struct _regobj_key;
356
357typedef struct _regobj_key {
358        void *ctx;
359
360        char *name;
361
362        REGVAL_CTR values;
363        REGSUBKEY_CTR subkeys;
364} REGOBJ_KEY;
365
366/* End of stuff from reg_objects.h */
367
368/* From rpc_reg.h */
369
370/* Registry data types */
371
372#define REG_NONE                       0
373#define REG_SZ                         1
374#define REG_EXPAND_SZ                  2
375#define REG_BINARY                     3
376#define REG_DWORD                      4
377#define REG_DWORD_LE                   4        /* DWORD, little endian */
378#define REG_DWORD_BE                   5        /* DWORD, big endian */
379#define REG_LINK                       6
380#define REG_MULTI_SZ                   7
381#define REG_RESOURCE_LIST              8
382#define REG_FULL_RESOURCE_DESCRIPTOR   9
383#define REG_RESOURCE_REQUIREMENTS_LIST 10
384
385/* End of stuff from rpc_reg.h */
386
387/* From rpc_secdes.h */
388
389#define SEC_DESC_DACL_PRESENT           0x0004
390#define SEC_DESC_SACL_PRESENT           0x0010
391#define  SEC_DESC_HEADER_SIZE (2 * sizeof(uint16) + 4 * sizeof(uint32))
392   /* thanks for Jim McDonough <jmcd@us.ibm.com> */
393#define SEC_ACE_OBJECT_PRESENT        0x00000001
394#define SEC_ACE_OBJECT_INHERITED_PRESENT 0x00000002
395
396#define SEC_ACE_TYPE_ACCESS_ALLOWED_OBJECT      0x5
397#define SEC_ACE_TYPE_ACCESS_DENIED_OBJECT       0x6
398#define SEC_ACE_TYPE_SYSTEM_AUDIT_OBJECT        0x7
399#define SEC_ACE_TYPE_SYSTEM_ALARM_OBJECT        0x8
400
401/* End of stuff from rpc_secdes.h */
402
403/* From rpc_parse/parse_misc.c */
404
405bool smb_io_uuid(const char *desc, struct uuid *uuid, 
406                 prs_struct *ps, int depth);
407bool smb_io_time(const char *desc, NTTIME *nttime, prs_struct *ps, int depth);
408bool smb_io_dom_sid(const char *desc, DOM_SID *sid, prs_struct *ps, int depth);
409
410/* End of stuff from rpc_parse/parse_misc.c */
411
412/* From lib/util_sid.c */
413
414size_t sid_size(const DOM_SID *sid);
415static int sid_compare_auth(const DOM_SID *sid1, const DOM_SID *sid2);
416int sid_compare(const DOM_SID *sid1, const DOM_SID *sid2);
417bool sid_equal(const DOM_SID *sid1, const DOM_SID *sid2);
418
419/* End of stuff from lib/util_sid.c */
420
421/* From lib/secace.c */
422
423bool sec_ace_object(uint8 type);
424
425/* End of stuff from lib/secace.c */
426
427/* From rpc_parse/parse_sec.c */
428
429bool sec_io_access(const char *desc, SEC_ACCESS *t, prs_struct *ps, int depth);
430bool sec_io_ace(const char *desc, SEC_ACE *psa, prs_struct *ps, int depth);
431bool sec_io_acl(const char *desc, SEC_ACL **ppsa, prs_struct *ps, int depth);
432bool sec_io_desc(const char *desc, SEC_DESC **ppsd, prs_struct *ps, int depth);
433
434/* End of stuff from rpc_parse/parse_sec.c */
435
436/* From lib/secace.c */
437
438bool sec_ace_equal(SEC_ACE *s1, SEC_ACE *s2);
439
440/* End of stuff from lib/secace.c */
441
442/* From lib/secacl.c */
443
444bool sec_acl_equal(SEC_ACL *s1, SEC_ACL *s2);
445
446/* End of stuff from lib/secacl.c */
447
448/* From lib/secdesc.c */
449
450bool sec_desc_equal(SEC_DESC *s1, SEC_DESC *s2);
451
452/* End of stuff from lib/secdesc.c */
Note: See TracBrowser for help on using the repository browser.