s3:passdb: add sid_check_object_is_for_passdb()
[kai/samba.git] / source3 / registry / reg_parse.h
1 /*
2  * Samba Unix/Linux SMB client library
3  *
4  * Copyright (C) Gregor Beck 2010
5  *
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 3 of the License, or
9  * (at your option) any later version.
10  *
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.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 /**
21  * @brief  Parser for registration entries (.reg) files.
22  * A parser is a talloced incarnation of an opaque struct reg_parse.
23  * It is fed with the (.reg) file line by line calling @ref reg_parse_line
24  * and emits output by calling functions from its reg_parse_callback.
25  * @file   reg_parse.h
26  * @author Gregor Beck <gb@sernet.de>
27  * @date   Jun 2010
28  */
29
30 #ifndef REG_PARSE_H
31 #define REG_PARSE_H
32
33 #include <stdint.h>
34 #include <stdbool.h>
35
36 /**
37  * Protoype for function called on key found.
38  * The usual action to take is delete the key if del==true, open it if
39  * already existing or create a new one.
40  *
41  * @param private_data
42  * @param key
43  * @param klen number of elements in key
44  * @param del whether to delete the key
45  *
46  * @retval >=0 on success
47  *
48  * @see reg_format_key
49  */
50 typedef int (*reg_parse_callback_key_t) (void* private_data,
51                                          const char* key[],
52                                          size_t klen,
53                                          bool del);
54
55 /**
56  * Protoype for function called on value found.
57  * The usual action to take is set the value of the last opened key.
58  *
59  * @param private_data
60  * @param name the values name
61  * @param type the values type
62  * @param data the values value
63  * @param len  the number of bytes of data
64  *
65  * @retval >=0 on success
66  *
67  * @see reg_format_value
68  */
69 typedef int (*reg_parse_callback_val_t) (void*  private_data,
70                                          const char* name,
71                                          uint32_t type,
72                                          const uint8_t* data,
73                                          uint32_t len);
74
75 /**
76  * Protoype for function called on value delete found.
77  * Delete value from the last opened key. It is usually no error if
78  * no such value exist.
79  *
80  * @param private_data
81  * @param name
82  *
83  * @retval >=0 on success
84  *
85  * @see reg_format_value_delete
86  */
87 typedef int (*reg_parse_callback_val_del_t) (void* private_data,
88                                              const char* name);
89
90
91 /**
92  * Protoype for function called on comment found.
93  *
94  * @param private_data
95  * @param line comment with marker removed.
96  *
97  * @retval  >=0 on success
98  *
99  * @see reg_format_comment
100  */
101 typedef int (*reg_parse_callback_comment_t) (void* private_data,
102                                              const char* line);
103
104 /**
105  * Type handling the output of a reg_parse object.
106  * It containes the functions to call and an opaque data pointer.
107  */
108 typedef struct reg_parse_callback {
109         reg_parse_callback_key_t key; /**< Function called on key found */
110         reg_parse_callback_val_t val; /**< Function called on value found */
111         /** Function called on value delete found */
112         reg_parse_callback_val_del_t val_del;
113         /** Function called on comment found */
114         reg_parse_callback_comment_t comment;
115         void* data; /**< Private data passed to callback function */
116 } reg_parse_callback;
117
118 /**
119  * A Parser for a registration entries (.reg) file.
120  *
121  * It may be used as a reg_format_callback, so the following is valid:
122  * @code
123  * reg_format* f = reg_format_new(mem_ctx,
124  *                                (reg_format_callback)reg_parse_new(mem_ctx, cb, NULL, 0),
125  *                                NULL, 0, "\\");
126  * @endcode
127  * @see reg_format
128  */
129 typedef struct reg_parse reg_parse;
130
131 /**
132  * Create a new reg_parse object.
133  *
134  * @param talloc_ctx the talloc parent
135  * @param cb         the output handler
136  * @param str_enc    the charset of hex encoded strings (REG_MULTI_SZ, REG_EXAND_SZ) if not UTF-16
137  * @param flags
138  *
139  * @return a talloc'ed reg_parse object, NULL on error
140  */
141 reg_parse* reg_parse_new(const void* talloc_ctx,
142                          reg_parse_callback cb,
143                          const char* str_enc,
144                          unsigned flags);
145
146 /**
147  * Feed one line to the parser.
148  *
149  * @param parser
150  * @param line one line from a (.reg) file, in UNIX charset
151  *
152  * @return 0 on success
153  *
154  * @see reg_format_callback_writeline_t
155  */
156 int reg_parse_line(struct reg_parse* parser, const char* line);
157
158
159 /**
160  * Parse a (.reg) file, read from a file descriptor.
161  *
162  * @param fd the file descriptor
163  * @param cb the output handler
164  * @param opts
165  *
166  * @return 0 on success
167  */
168 int reg_parse_fd(int fd,
169                  const reg_parse_callback* cb,
170                  const char* opts);
171
172 /**
173  * Parse a (.reg) file
174  *
175  * @param filename the file to open
176  * @param cb the output handler
177  * @param opts
178  *
179  * @return 0 on success
180  */
181 int reg_parse_file(const char* filename,
182                    const reg_parse_callback* cb,
183                    const char* opts);
184
185 int reg_parse_set_options(reg_parse* parser, const char* opt);
186
187 /******************************************************************************/
188
189
190 #endif /* REG_PARSE_H */