2086
|
1 #include <string.h>
|
|
2 #include <stdlib.h>
|
|
3 #include <sys/types.h>
|
|
4 #include <stdio.h>
|
|
5 #include <setjmp.h>
|
|
6 #include <sys/stat.h>
|
|
7 #include <fcntl.h>
|
|
8 #include <errno.h>
|
|
9 #include <signal.h>
|
|
10 #include <syslog.h>
|
|
11 #include <strings.h>
|
|
12 #include <unistd.h>
|
|
13 #include <sys/socket.h>
|
|
14 #include <netinet/in.h>
|
|
15 #include <netdb.h>
|
|
16 #include <arpa/inet.h>
|
|
17 #include <arpa/nameser.h>
|
|
18 #include <resolv.h>
|
|
19 #include <sys/time.h>
|
|
20
|
|
21 #include "xmlparse.h"
|
|
22 #ifdef HAVE_CONFIG_H
|
|
23 #include <config.h>
|
|
24 #endif /* HAVE_CONFIG_H */
|
|
25
|
|
26 /*
|
|
27 ** Arrange to use either varargs or stdargs
|
|
28 */
|
|
29
|
|
30 #define MAXSHORTSTR 203 /* max short string length */
|
|
31 #define QUAD_T unsigned long long
|
|
32
|
|
33 #ifdef __STDC__
|
|
34
|
|
35 #include <stdarg.h>
|
|
36
|
|
37 # define VA_LOCAL_DECL va_list ap;
|
|
38 # define VA_START(f) va_start(ap, f)
|
|
39 # define VA_END va_end(ap)
|
|
40
|
|
41 #else /* __STDC__ */
|
|
42
|
|
43 # include <varargs.h>
|
|
44
|
|
45 # define VA_LOCAL_DECL va_list ap;
|
|
46 # define VA_START(f) va_start(ap)
|
|
47 # define VA_END va_end(ap)
|
|
48
|
|
49 #endif /* __STDC__ */
|
|
50
|
|
51
|
|
52 #ifndef INCL_LIBXODE_H
|
|
53 #define INCL_LIBXODE_H
|
|
54
|
|
55 #ifdef __cplusplus
|
|
56 extern "C" {
|
|
57 #endif
|
|
58
|
|
59
|
|
60 #ifndef HAVE_SNPRINTF
|
|
61 extern int ap_snprintf(char *, size_t, const char *, ...);
|
|
62 #define snprintf ap_snprintf
|
|
63 #endif
|
|
64
|
|
65 #ifndef HAVE_VSNPRINTF
|
|
66 extern int ap_vsnprintf(char *, size_t, const char *, va_list ap);
|
|
67 #define vsnprintf ap_vsnprintf
|
|
68 #endif
|
|
69
|
|
70 #define ZONE zonestr(__FILE__,__LINE__)
|
|
71 char *zonestr(char *file, int line);
|
|
72
|
|
73 /* --------------------------------------------------------- */
|
|
74 /* */
|
|
75 /* Pool-based memory management routines */
|
|
76 /* */
|
|
77 /* --------------------------------------------------------- */
|
|
78
|
|
79 #undef POOL_DEBUG
|
|
80 /*
|
|
81 flip these, this should be a prime number for top # of pools debugging
|
|
82 #define POOL_DEBUG 40009
|
|
83 */
|
|
84
|
|
85 /* pheap - singular allocation of memory */
|
|
86 struct pheap
|
|
87 {
|
|
88 void *block;
|
|
89 int size, used;
|
|
90 };
|
|
91
|
|
92 /* pool_cleaner - callback type which is associated
|
|
93 with a pool entry; invoked when the pool entry is
|
|
94 free'd */
|
|
95 typedef void (*pool_cleaner)(void *arg);
|
|
96
|
|
97 /* pfree - a linked list node which stores an
|
|
98 allocation chunk, plus a callback */
|
|
99 struct pfree
|
|
100 {
|
|
101 pool_cleaner f;
|
|
102 void *arg;
|
|
103 struct pheap *heap;
|
|
104 struct pfree *next;
|
|
105 };
|
|
106
|
|
107 /* pool - base node for a pool. Maintains a linked list
|
|
108 of pool entries (pfree) */
|
|
109 typedef struct pool_struct
|
|
110 {
|
|
111 int size;
|
|
112 struct pfree *cleanup;
|
|
113 struct pheap *heap;
|
|
114 #ifdef POOL_DEBUG
|
|
115 char name[8], zone[32];
|
|
116 int lsize;
|
|
117 } _pool, *pool;
|
|
118 #define pool_new() _pool_new(ZONE)
|
|
119 #define pool_heap(i) _pool_new_heap(i,ZONE)
|
|
120 #else
|
|
121 } _pool, *pool;
|
|
122 #define pool_heap(i) _pool_new_heap(i,NULL)
|
|
123 #define pool_new() _pool_new(NULL)
|
|
124 #endif
|
|
125
|
|
126 pool _pool_new(char *zone); /* new pool :) */
|
|
127 pool _pool_new_heap(int size, char *zone); /* creates a new memory pool with an initial heap size */
|
|
128 void *pmalloc(pool p, int size); /* wrapper around malloc, takes from the pool, cleaned up automatically */
|
|
129 void *pmalloc_x(pool p, int size, char c); /* Wrapper around pmalloc which prefils buffer with c */
|
|
130 void *pmalloco(pool p, int size); /* YAPW for zeroing the block */
|
|
131 char *pstrdup(pool p, const char *src); /* wrapper around strdup, gains mem from pool */
|
|
132 void pool_stat(int full); /* print to stderr the changed pools and reset */
|
|
133 char *pstrdupx(pool p, const char *src); /* temp stub */
|
|
134 void pool_cleanup(pool p, pool_cleaner f, void *arg); /* calls f(arg) before the pool is freed during cleanup */
|
|
135 void pool_free(pool p); /* calls the cleanup functions, frees all the data on the pool, and deletes the pool itself */
|
|
136 int pool_size(pool p); /* returns total bytes allocated in this pool */
|
|
137
|
|
138
|
|
139
|
|
140
|
|
141 /* --------------------------------------------------------- */
|
|
142 /* */
|
|
143 /* Socket helper stuff */
|
|
144 /* */
|
|
145 /* --------------------------------------------------------- */
|
|
146 #ifndef MAXHOSTNAMELEN
|
|
147 #define MAXHOSTNAMELEN 64
|
|
148 #endif
|
|
149
|
|
150 #define NETSOCKET_SERVER 0
|
|
151 #define NETSOCKET_CLIENT 1
|
|
152 #define NETSOCKET_UDP 2
|
|
153
|
|
154 #ifndef WIN32
|
|
155 int make_netsocket(u_short port, char *host, int type);
|
|
156 struct in_addr *make_addr(char *host);
|
|
157 int set_fd_close_on_exec(int fd, int flag);
|
|
158 #endif
|
|
159
|
|
160
|
|
161 /* --------------------------------------------------------- */
|
|
162 /* */
|
|
163 /* String management routines */
|
|
164 /* */
|
|
165 /* --------------------------------------------------------- */
|
|
166 char *j_strdup(const char *str); /* provides NULL safe strdup wrapper */
|
|
167 char *j_strcat(char *dest, char *txt); /* strcpy() clone */
|
|
168 int j_strcmp(const char *a, const char *b); /* provides NULL safe strcmp wrapper */
|
|
169 int j_strcasecmp(const char *a, const char *b); /* provides NULL safe strcasecmp wrapper */
|
|
170 int j_strncmp(const char *a, const char *b, int i); /* provides NULL safe strncmp wrapper */
|
|
171 int j_strncasecmp(const char *a, const char *b, int i); /* provides NULL safe strncasecmp wrapper */
|
|
172 int j_strlen(const char *a); /* provides NULL safe strlen wrapper */
|
|
173 int j_atoi(const char *a, int def); /* checks for NULL and uses default instead, convienence */
|
|
174 void str_b64decode(char *str); /* what it says */
|
|
175
|
|
176
|
|
177 /* --------------------------------------------------------- */
|
|
178 /* */
|
|
179 /* SHA calculations */
|
|
180 /* */
|
|
181 /* --------------------------------------------------------- */
|
|
182 #if (SIZEOF_INT == 4)
|
|
183 typedef unsigned int uint32;
|
|
184 #elif (SIZEOF_SHORT == 4)
|
|
185 typedef unsigned short uint32;
|
|
186 #else
|
|
187 typedef unsigned int uint32;
|
|
188 #endif /* HAVEUINT32 */
|
|
189
|
|
190 int sha_hash(int *data, int *hash);
|
|
191 int sha_init(int *hash);
|
|
192 char *shahash(char *str); /* NOT THREAD SAFE */
|
|
193 void shahash_r(const char* str, char hashbuf[40]); /* USE ME */
|
|
194
|
|
195 int strprintsha(char *dest, int *hashval);
|
|
196
|
|
197
|
|
198 /* --------------------------------------------------------- */
|
|
199 /* */
|
|
200 /* Hashtable functions */
|
|
201 /* */
|
|
202 /* --------------------------------------------------------- */
|
|
203 typedef int (*KEYHASHFUNC)(const void *key);
|
|
204 typedef int (*KEYCOMPAREFUNC)(const void *key1, const void *key2);
|
|
205 typedef int (*TABLEWALKFUNC)(void *user_data, const void *key, void *data);
|
|
206
|
|
207 typedef void *HASHTABLE;
|
|
208
|
|
209 HASHTABLE ghash_create(int buckets, KEYHASHFUNC hash, KEYCOMPAREFUNC cmp);
|
|
210 void ghash_destroy(HASHTABLE tbl);
|
|
211 void *ghash_get(HASHTABLE tbl, const void *key);
|
|
212 int ghash_put(HASHTABLE tbl, const void *key, void *value);
|
|
213 int ghash_remove(HASHTABLE tbl, const void *key);
|
|
214 int ghash_walk(HASHTABLE tbl, TABLEWALKFUNC func, void *user_data);
|
|
215 int str_hash_code(const char *s);
|
|
216
|
|
217
|
|
218 /* --------------------------------------------------------- */
|
|
219 /* */
|
|
220 /* XML escaping utils */
|
|
221 /* */
|
|
222 /* --------------------------------------------------------- */
|
|
223 char *strescape(pool p, char *buf); /* Escape <>&'" chars */
|
|
224 char *strunescape(pool p, char *buf);
|
|
225
|
|
226
|
|
227 /* --------------------------------------------------------- */
|
|
228 /* */
|
|
229 /* String pools (spool) functions */
|
|
230 /* */
|
|
231 /* --------------------------------------------------------- */
|
|
232 struct spool_node
|
|
233 {
|
|
234 char *c;
|
|
235 struct spool_node *next;
|
|
236 };
|
|
237
|
|
238 typedef struct spool_struct
|
|
239 {
|
|
240 pool p;
|
|
241 int len;
|
|
242 struct spool_node *last;
|
|
243 struct spool_node *first;
|
|
244 } *spool;
|
|
245
|
|
246 spool spool_new(pool p); /* create a string pool */
|
|
247 void spooler(spool s, ...); /* append all the char * args to the pool, terminate args with s again */
|
|
248 char *spool_print(spool s); /* return a big string */
|
|
249 void spool_add(spool s, char *str); /* add a single char to the pool */
|
|
250 char *spools(pool p, ...); /* wrap all the spooler stuff in one function, the happy fun ball! */
|
|
251
|
|
252
|
|
253 /* --------------------------------------------------------- */
|
|
254 /* */
|
|
255 /* xmlnodes - Document Object Model */
|
|
256 /* */
|
|
257 /* --------------------------------------------------------- */
|
|
258 #define NTYPE_TAG 0
|
|
259 #define NTYPE_ATTRIB 1
|
|
260 #define NTYPE_CDATA 2
|
|
261
|
|
262 #define NTYPE_LAST 2
|
|
263 #define NTYPE_UNDEF -1
|
|
264
|
|
265 /* --------------------------------------------------------------------------
|
|
266 Node structure. Do not use directly! Always use accessor macros
|
|
267 and methods!
|
|
268 -------------------------------------------------------------------------- */
|
|
269 typedef struct xmlnode_t
|
|
270 {
|
|
271 char* name;
|
|
272 unsigned short type;
|
|
273 char* data;
|
|
274 int data_sz;
|
|
275 int complete;
|
|
276 pool p;
|
|
277 struct xmlnode_t* parent;
|
|
278 struct xmlnode_t* firstchild;
|
|
279 struct xmlnode_t* lastchild;
|
|
280 struct xmlnode_t* prev;
|
|
281 struct xmlnode_t* next;
|
|
282 struct xmlnode_t* firstattrib;
|
|
283 struct xmlnode_t* lastattrib;
|
|
284 } _xmlnode, *xmlnode;
|
|
285
|
|
286 /* Node creation routines */
|
|
287 xmlnode xmlnode_wrap(xmlnode x,const char* wrapper);
|
|
288 xmlnode xmlnode_new_tag(const char* name);
|
|
289 xmlnode xmlnode_new_tag_pool(pool p, const char* name);
|
|
290 xmlnode xmlnode_insert_tag(xmlnode parent, const char* name);
|
|
291 xmlnode xmlnode_insert_cdata(xmlnode parent, const char* CDATA, unsigned int size);
|
|
292 xmlnode xmlnode_insert_tag_node(xmlnode parent, xmlnode node);
|
|
293 void xmlnode_insert_node(xmlnode parent, xmlnode node);
|
|
294 xmlnode xmlnode_str(char *str, int len);
|
|
295 xmlnode xmlnode_file(char *file);
|
|
296 xmlnode xmlnode_dup(xmlnode x); /* duplicate x */
|
|
297 xmlnode xmlnode_dup_pool(pool p, xmlnode x);
|
|
298
|
|
299 /* Node Memory Pool */
|
|
300 pool xmlnode_pool(xmlnode node);
|
|
301 xmlnode _xmlnode_new(pool p, const char *name, unsigned int type);
|
|
302
|
|
303 /* Node editing */
|
|
304 void xmlnode_hide(xmlnode child);
|
|
305 void xmlnode_hide_attrib(xmlnode parent, const char *name);
|
|
306
|
|
307 /* Node deletion routine, also frees the node pool! */
|
|
308 void xmlnode_free(xmlnode node);
|
|
309
|
|
310 /* Locates a child tag by name and returns it */
|
|
311 xmlnode xmlnode_get_tag(xmlnode parent, const char* name);
|
|
312 char* xmlnode_get_tag_data(xmlnode parent, const char* name);
|
|
313
|
|
314 /* Attribute accessors */
|
|
315 void xmlnode_put_attrib(xmlnode owner, const char* name, const char* value);
|
|
316 char* xmlnode_get_attrib(xmlnode owner, const char* name);
|
|
317 void xmlnode_put_expat_attribs(xmlnode owner, const char** atts);
|
|
318
|
|
319 /* Bastard am I, but these are fun for internal use ;-) */
|
|
320 void xmlnode_put_vattrib(xmlnode owner, const char* name, void *value);
|
|
321 void* xmlnode_get_vattrib(xmlnode owner, const char* name);
|
|
322
|
|
323 /* Node traversal routines */
|
|
324 xmlnode xmlnode_get_firstattrib(xmlnode parent);
|
|
325 xmlnode xmlnode_get_firstchild(xmlnode parent);
|
|
326 xmlnode xmlnode_get_lastchild(xmlnode parent);
|
|
327 xmlnode xmlnode_get_nextsibling(xmlnode sibling);
|
|
328 xmlnode xmlnode_get_prevsibling(xmlnode sibling);
|
|
329 xmlnode xmlnode_get_parent(xmlnode node);
|
|
330
|
|
331 /* Node information routines */
|
|
332 char* xmlnode_get_name(xmlnode node);
|
|
333 char* xmlnode_get_data(xmlnode node);
|
|
334 int xmlnode_get_datasz(xmlnode node);
|
|
335 int xmlnode_get_type(xmlnode node);
|
|
336
|
|
337 int xmlnode_has_children(xmlnode node);
|
|
338 int xmlnode_has_attribs(xmlnode node);
|
|
339
|
|
340 /* Node-to-string translation */
|
|
341 char* xmlnode2str(xmlnode node);
|
|
342
|
|
343 /* Node-to-terminated-string translation
|
|
344 -- useful for interfacing w/ scripting langs */
|
|
345 char* xmlnode2tstr(xmlnode node);
|
|
346
|
|
347 int xmlnode_cmp(xmlnode a, xmlnode b); /* compares a and b for equality */
|
|
348
|
|
349 int xmlnode2file(char *file, xmlnode node); /* writes node to file */
|
|
350
|
|
351 /* Expat callbacks */
|
|
352 void expat_startElement(void* userdata, const char* name, const char** atts);
|
|
353 void expat_endElement(void* userdata, const char* name);
|
|
354 void expat_charData(void* userdata, const char* s, int len);
|
|
355
|
|
356 /***********************
|
|
357 * XSTREAM Section
|
|
358 ***********************/
|
|
359
|
|
360 #define XSTREAM_MAXNODE 1000000
|
|
361 #define XSTREAM_MAXDEPTH 100
|
|
362
|
|
363 #define XSTREAM_ROOT 0 /* root element */
|
|
364 #define XSTREAM_NODE 1 /* normal node */
|
|
365 #define XSTREAM_CLOSE 2 /* closed </stream:stream> */
|
|
366 #define XSTREAM_ERR 4 /* parser error */
|
|
367
|
|
368 typedef void (*xstream_onNode)(int type, xmlnode x, void *arg); /* xstream event handler */
|
|
369
|
|
370 typedef struct xstream_struct
|
|
371 {
|
|
372 XML_Parser parser;
|
|
373 xmlnode node;
|
|
374 char *cdata;
|
|
375 int cdata_len;
|
|
376 pool p;
|
|
377 xstream_onNode f;
|
|
378 void *arg;
|
|
379 int status;
|
|
380 int depth;
|
|
381 } *xstream, _xstream;
|
|
382
|
|
383 xstream xstream_new(pool p, xstream_onNode f, void *arg); /* create a new xstream */
|
|
384 int xstream_eat(xstream xs, char *buff, int len); /* parse new data for this xstream, returns last XSTREAM_* status */
|
|
385
|
|
386 /* convience functions */
|
|
387 xmlnode xstream_header(char *namespace, char *to, char *from);
|
|
388 char *xstream_header_char(xmlnode x);
|
|
389
|
|
390 /* SHA.H */
|
|
391 /*
|
|
392 * The contents of this file are subject to the Mozilla Public
|
|
393 * License Version 1.1 (the "License"); you may not use this file
|
|
394 * except in compliance with the License. You may obtain a copy of
|
|
395 * the License at http://www.mozilla.org/MPL/
|
|
396 *
|
|
397 * Software distributed under the License is distributed on an "AS
|
|
398 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
399 * implied. See the License for the specific language governing
|
|
400 * rights and limitations under the License.
|
|
401 *
|
|
402 * The Original Code is SHA 180-1 Header File
|
|
403 *
|
|
404 * The Initial Developer of the Original Code is Paul Kocher of
|
|
405 * Cryptography Research. Portions created by Paul Kocher are
|
|
406 * Copyright (C) 1995-9 by Cryptography Research, Inc. All
|
|
407 * Rights Reserved.
|
|
408 *
|
|
409 * Contributor(s):
|
|
410 *
|
|
411 * Paul Kocher
|
|
412 *
|
|
413 * Alternatively, the contents of this file may be used under the
|
|
414 * terms of the GNU General Public License Version 2 or later (the
|
|
415 * "GPL"), in which case the provisions of the GPL are applicable
|
|
416 * instead of those above. If you wish to allow use of your
|
|
417 * version of this file only under the terms of the GPL and not to
|
|
418 * allow others to use your version of this file under the MPL,
|
|
419 * indicate your decision by deleting the provisions above and
|
|
420 * replace them with the notice and other provisions required by
|
|
421 * the GPL. If you do not delete the provisions above, a recipient
|
|
422 * may use your version of this file under either the MPL or the
|
|
423 * GPL.
|
|
424 */
|
|
425
|
|
426 typedef struct {
|
|
427 unsigned long H[5];
|
|
428 unsigned long W[80];
|
|
429 int lenW;
|
|
430 unsigned long sizeHi,sizeLo;
|
|
431 } SHA_CTX;
|
|
432
|
|
433
|
|
434 void shaInit(SHA_CTX *ctx);
|
|
435 void shaUpdate(SHA_CTX *ctx, unsigned char *dataIn, int len);
|
|
436 void shaFinal(SHA_CTX *ctx, unsigned char hashout[20]);
|
|
437 void shaBlock(unsigned char *dataIn, int len, unsigned char hashout[20]);
|
|
438
|
|
439
|
|
440 /* END SHA.H */
|
|
441
|
|
442 #ifdef __cplusplus
|
|
443 }
|
|
444 #endif
|
|
445
|
|
446 #endif /* INCL_LIBXODE_H */
|