[b7d3cc34] | 1 | |
---|
| 2 | #include <string.h> |
---|
| 3 | #include <stdlib.h> |
---|
| 4 | #include <sys/types.h> |
---|
| 5 | #include <stdio.h> |
---|
| 6 | #include <setjmp.h> |
---|
| 7 | #include <sys/stat.h> |
---|
| 8 | #include <fcntl.h> |
---|
| 9 | #include <errno.h> |
---|
| 10 | #include <signal.h> |
---|
| 11 | #include <stdarg.h> |
---|
| 12 | #include <ctype.h> |
---|
| 13 | #include <time.h> |
---|
| 14 | |
---|
| 15 | #include "xmlparse.h" |
---|
| 16 | |
---|
| 17 | int j_strcmp(const char *a, const char *b); |
---|
| 18 | |
---|
| 19 | /* |
---|
| 20 | ** Arrange to use either varargs or stdargs |
---|
| 21 | */ |
---|
| 22 | |
---|
| 23 | #define MAXSHORTSTR 203 /* max short string length */ |
---|
| 24 | #define QUAD_T unsigned long long |
---|
| 25 | |
---|
| 26 | #if defined(__STDC__) || defined(_WIN32) |
---|
| 27 | |
---|
| 28 | #include <stdarg.h> |
---|
| 29 | |
---|
| 30 | # define VA_LOCAL_DECL va_list ap; |
---|
| 31 | # define VA_START(f) va_start(ap, f) |
---|
| 32 | # define VA_END va_end(ap) |
---|
| 33 | |
---|
| 34 | #else /* __STDC__ */ |
---|
| 35 | |
---|
| 36 | # include <varargs.h> |
---|
| 37 | |
---|
| 38 | # define VA_LOCAL_DECL va_list ap; |
---|
| 39 | # define VA_START(f) va_start(ap) |
---|
| 40 | # define VA_END va_end(ap) |
---|
| 41 | |
---|
| 42 | #endif /* __STDC__ */ |
---|
| 43 | |
---|
| 44 | |
---|
| 45 | #ifndef INCL_LIB_H |
---|
| 46 | #define INCL_LIB_H |
---|
| 47 | |
---|
| 48 | #ifdef __cplusplus |
---|
| 49 | extern "C" { |
---|
| 50 | #endif |
---|
| 51 | |
---|
| 52 | /* --------------------------------------------------------- */ |
---|
| 53 | /* */ |
---|
| 54 | /* Pool-based memory management routines */ |
---|
| 55 | /* */ |
---|
| 56 | /* --------------------------------------------------------- */ |
---|
| 57 | |
---|
| 58 | #undef POOL_DEBUG |
---|
| 59 | /* |
---|
| 60 | flip these, this should be a prime number for top # of pools debugging |
---|
| 61 | #define POOL_DEBUG 40009 |
---|
| 62 | */ |
---|
| 63 | |
---|
| 64 | /* pheap - singular allocation of memory */ |
---|
| 65 | struct pheap |
---|
| 66 | { |
---|
| 67 | void *block; |
---|
| 68 | int size, used; |
---|
| 69 | }; |
---|
| 70 | |
---|
| 71 | /* pool_cleaner - callback type which is associated |
---|
| 72 | with a pool entry; invoked when the pool entry is |
---|
| 73 | free'd */ |
---|
| 74 | typedef void (*pool_cleaner)(void *arg); |
---|
| 75 | |
---|
| 76 | /* pfree - a linked list node which stores an |
---|
| 77 | allocation chunk, plus a callback */ |
---|
| 78 | struct pfree |
---|
| 79 | { |
---|
| 80 | pool_cleaner f; |
---|
| 81 | void *arg; |
---|
| 82 | struct pheap *heap; |
---|
| 83 | struct pfree *next; |
---|
| 84 | }; |
---|
| 85 | |
---|
| 86 | /* pool - base node for a pool. Maintains a linked list |
---|
| 87 | of pool entries (pfree) */ |
---|
| 88 | typedef struct pool_struct |
---|
| 89 | { |
---|
| 90 | int size; |
---|
| 91 | struct pfree *cleanup; |
---|
| 92 | struct pheap *heap; |
---|
| 93 | #ifdef POOL_DEBUG |
---|
| 94 | char name[8], zone[32]; |
---|
| 95 | int lsize; |
---|
| 96 | } _pool, *pool; |
---|
| 97 | #define pool_new() _pool_new(ZONE) |
---|
| 98 | #define pool_heap(i) _pool_new_heap(i,ZONE) |
---|
| 99 | #else |
---|
| 100 | } _pool, *pool; |
---|
| 101 | #define pool_heap(i) _pool_new_heap(i,NULL) |
---|
| 102 | #define pool_new() _pool_new(NULL) |
---|
| 103 | #endif |
---|
| 104 | |
---|
| 105 | pool _pool_new(char *zone); /* new pool :) */ |
---|
| 106 | pool _pool_new_heap(int size, char *zone); /* creates a new memory pool with an initial heap size */ |
---|
| 107 | void *pmalloc(pool p, int size); /* wrapper around malloc, takes from the pool, cleaned up automatically */ |
---|
| 108 | void *pmalloc_x(pool p, int size, char c); /* Wrapper around pmalloc which prefils buffer with c */ |
---|
| 109 | void *pmalloco(pool p, int size); /* YAPW for zeroing the block */ |
---|
| 110 | char *pstrdup(pool p, const char *src); /* wrapper around strdup, gains mem from pool */ |
---|
| 111 | void pool_stat(int full); /* print to stderr the changed pools and reset */ |
---|
| 112 | void pool_cleanup(pool p, pool_cleaner f, void *arg); /* calls f(arg) before the pool is freed during cleanup */ |
---|
| 113 | void pool_free(pool p); /* calls the cleanup functions, frees all the data on the pool, and deletes the pool itself */ |
---|
| 114 | |
---|
| 115 | |
---|
| 116 | |
---|
| 117 | |
---|
| 118 | /* --------------------------------------------------------- */ |
---|
| 119 | /* */ |
---|
| 120 | /* Socket helper stuff */ |
---|
| 121 | /* */ |
---|
| 122 | /* --------------------------------------------------------- */ |
---|
| 123 | #ifndef MAXHOSTNAMELEN |
---|
| 124 | #define MAXHOSTNAMELEN 64 |
---|
| 125 | #endif |
---|
| 126 | |
---|
| 127 | #define NETSOCKET_SERVER 0 |
---|
| 128 | #define NETSOCKET_CLIENT 1 |
---|
| 129 | #define NETSOCKET_UDP 2 |
---|
| 130 | |
---|
| 131 | #ifndef WIN32 |
---|
| 132 | int make_netsocket(u_short port, char *host, int type); |
---|
| 133 | struct in_addr *make_addr(char *host); |
---|
| 134 | int set_fd_close_on_exec(int fd, int flag); |
---|
| 135 | #endif |
---|
| 136 | |
---|
| 137 | |
---|
| 138 | /* --------------------------------------------------------- */ |
---|
| 139 | /* */ |
---|
| 140 | /* Hashtable functions */ |
---|
| 141 | /* */ |
---|
| 142 | /* --------------------------------------------------------- */ |
---|
| 143 | typedef struct xhn_struct |
---|
| 144 | { |
---|
| 145 | struct xhn_struct *next; |
---|
| 146 | const char *key; |
---|
| 147 | void *val; |
---|
| 148 | } *xhn, _xhn; |
---|
| 149 | |
---|
| 150 | char *strescape(pool p, char *); |
---|
| 151 | |
---|
| 152 | |
---|
| 153 | /* --------------------------------------------------------- */ |
---|
| 154 | /* */ |
---|
| 155 | /* String pools (spool) functions */ |
---|
| 156 | /* */ |
---|
| 157 | /* --------------------------------------------------------- */ |
---|
| 158 | struct spool_node |
---|
| 159 | { |
---|
| 160 | char *c; |
---|
| 161 | struct spool_node *next; |
---|
| 162 | }; |
---|
| 163 | |
---|
| 164 | typedef struct spool_struct |
---|
| 165 | { |
---|
| 166 | pool p; |
---|
| 167 | int len; |
---|
| 168 | struct spool_node *last; |
---|
| 169 | struct spool_node *first; |
---|
| 170 | } *spool; |
---|
| 171 | |
---|
| 172 | spool spool_new(pool p); /* create a string pool */ |
---|
| 173 | void spooler(spool s, ...); /* append all the char * args to the pool, terminate args with s again */ |
---|
| 174 | char *spool_print(spool s); /* return a big string */ |
---|
| 175 | void spool_add(spool s, char *str); /* add a single char to the pool */ |
---|
| 176 | |
---|
| 177 | |
---|
| 178 | /* --------------------------------------------------------- */ |
---|
| 179 | /* */ |
---|
| 180 | /* xmlnodes - Document Object Model */ |
---|
| 181 | /* */ |
---|
| 182 | /* --------------------------------------------------------- */ |
---|
| 183 | #define NTYPE_TAG 0 |
---|
| 184 | #define NTYPE_ATTRIB 1 |
---|
| 185 | #define NTYPE_CDATA 2 |
---|
| 186 | |
---|
| 187 | #define NTYPE_LAST 2 |
---|
| 188 | #define NTYPE_UNDEF -1 |
---|
| 189 | |
---|
| 190 | /* -------------------------------------------------------------------------- |
---|
| 191 | Node structure. Do not use directly! Always use accessor macros |
---|
| 192 | and methods! |
---|
| 193 | -------------------------------------------------------------------------- */ |
---|
| 194 | typedef struct xmlnode_t |
---|
| 195 | { |
---|
| 196 | char* name; |
---|
| 197 | unsigned short type; |
---|
| 198 | char* data; |
---|
| 199 | int data_sz; |
---|
| 200 | int complete; |
---|
| 201 | pool p; |
---|
| 202 | struct xmlnode_t* parent; |
---|
| 203 | struct xmlnode_t* firstchild; |
---|
| 204 | struct xmlnode_t* lastchild; |
---|
| 205 | struct xmlnode_t* prev; |
---|
| 206 | struct xmlnode_t* next; |
---|
| 207 | struct xmlnode_t* firstattrib; |
---|
| 208 | struct xmlnode_t* lastattrib; |
---|
| 209 | } _xmlnode, *xmlnode; |
---|
| 210 | |
---|
| 211 | /* Node creation routines */ |
---|
| 212 | xmlnode xmlnode_wrap(xmlnode x,const char* wrapper); |
---|
| 213 | xmlnode xmlnode_new_tag(const char* name); |
---|
| 214 | xmlnode xmlnode_new_tag_pool(pool p, const char* name); |
---|
| 215 | xmlnode xmlnode_insert_tag(xmlnode parent, const char* name); |
---|
| 216 | xmlnode xmlnode_insert_cdata(xmlnode parent, const char* CDATA, unsigned int size); |
---|
| 217 | xmlnode xmlnode_insert_tag_node(xmlnode parent, xmlnode node); |
---|
| 218 | xmlnode xmlnode_str(char *str, int len); |
---|
| 219 | xmlnode xmlnode_dup(xmlnode x); /* duplicate x */ |
---|
| 220 | xmlnode xmlnode_dup_pool(pool p, xmlnode x); |
---|
| 221 | |
---|
| 222 | /* Node Memory Pool */ |
---|
| 223 | pool xmlnode_pool(xmlnode node); |
---|
| 224 | |
---|
| 225 | /* Node editing */ |
---|
| 226 | void xmlnode_hide(xmlnode child); |
---|
| 227 | void xmlnode_hide_attrib(xmlnode parent, const char *name); |
---|
| 228 | |
---|
| 229 | /* Node deletion routine, also frees the node pool! */ |
---|
| 230 | void xmlnode_free(xmlnode node); |
---|
| 231 | |
---|
| 232 | /* Locates a child tag by name and returns it */ |
---|
| 233 | xmlnode xmlnode_get_tag(xmlnode parent, const char* name); |
---|
| 234 | char* xmlnode_get_tag_data(xmlnode parent, const char* name); |
---|
| 235 | |
---|
| 236 | /* Attribute accessors */ |
---|
| 237 | void xmlnode_put_attrib(xmlnode owner, const char* name, const char* value); |
---|
| 238 | char* xmlnode_get_attrib(xmlnode owner, const char* name); |
---|
| 239 | void xmlnode_put_expat_attribs(xmlnode owner, const char** atts); |
---|
| 240 | |
---|
| 241 | /* Bastard am I, but these are fun for internal use ;-) */ |
---|
| 242 | void xmlnode_put_vattrib(xmlnode owner, const char* name, void *value); |
---|
| 243 | void* xmlnode_get_vattrib(xmlnode owner, const char* name); |
---|
| 244 | |
---|
| 245 | /* Node traversal routines */ |
---|
| 246 | xmlnode xmlnode_get_firstchild(xmlnode parent); |
---|
| 247 | xmlnode xmlnode_get_lastchild(xmlnode parent); |
---|
| 248 | xmlnode xmlnode_get_nextsibling(xmlnode sibling); |
---|
| 249 | xmlnode xmlnode_get_prevsibling(xmlnode sibling); |
---|
| 250 | xmlnode xmlnode_get_parent(xmlnode node); |
---|
| 251 | |
---|
| 252 | /* Node information routines */ |
---|
| 253 | char* xmlnode_get_name(xmlnode node); |
---|
| 254 | char* xmlnode_get_data(xmlnode node); |
---|
| 255 | |
---|
| 256 | int xmlnode_has_children(xmlnode node); |
---|
| 257 | |
---|
| 258 | /* Node-to-string translation */ |
---|
| 259 | char* xmlnode2str(xmlnode node); |
---|
| 260 | |
---|
| 261 | /********** END OLD libxode.h BEGIN OLD jabber.h *************/ |
---|
| 262 | |
---|
| 263 | |
---|
| 264 | // #define KARMA_DEBUG |
---|
| 265 | // default to disable karma |
---|
| 266 | #define KARMA_READ_MAX(k) (abs(k)*100) /* how much you are allowed to read off the sock */ |
---|
| 267 | #define KARMA_INIT 5 /* internal "init" value */ |
---|
| 268 | #define KARMA_HEARTBEAT 2 /* seconds to register for heartbeat */ |
---|
| 269 | #define KARMA_MAX 10 /* total max karma you can have */ |
---|
| 270 | #define KARMA_INC 1 /* how much to increment every KARMA_HEARTBEAT seconds */ |
---|
| 271 | #define KARMA_DEC 0 /* how much to penalize for reading KARMA_READ_MAX in |
---|
| 272 | KARMA_HEARTBEAT seconds */ |
---|
| 273 | #define KARMA_PENALTY -5 /* where you go when you hit 0 karma */ |
---|
| 274 | #define KARMA_RESTORE 5 /* where you go when you payed your penelty or INIT */ |
---|
| 275 | #define KARMA_RESETMETER 0 /* Reset byte meter on restore default is falst */ |
---|
| 276 | |
---|
| 277 | struct karma |
---|
| 278 | { |
---|
| 279 | int init; /* struct initialized */ |
---|
| 280 | int reset_meter; /* reset the byte meter on restore */ |
---|
| 281 | int val; /* current karma value */ |
---|
| 282 | long bytes; /* total bytes read (in that time period) */ |
---|
| 283 | int max; /* max karma you can have */ |
---|
| 284 | int inc,dec; /* how much to increment/decrement */ |
---|
| 285 | int penalty,restore; /* what penalty (<0) or restore (>0) */ |
---|
| 286 | time_t last_update; /* time this was last incremented */ |
---|
| 287 | }; |
---|
| 288 | |
---|
| 289 | struct karma *karma_new(pool p); /* creates a new karma object, with default values */ |
---|
| 290 | void karma_copy(struct karma *new, struct karma *old); /* makes a copy of old in new */ |
---|
| 291 | void karma_increment(struct karma *k); /* inteligently increments karma */ |
---|
| 292 | void karma_decrement(struct karma *k, long bytes_read); /* inteligently decrements karma */ |
---|
| 293 | int karma_check(struct karma *k,long bytes_read); /* checks to see if we have good karma */ |
---|
| 294 | |
---|
| 295 | |
---|
| 296 | |
---|
| 297 | /* --------------------------------------------------------- */ |
---|
| 298 | /* */ |
---|
| 299 | /* Namespace constants */ |
---|
| 300 | /* */ |
---|
| 301 | /* --------------------------------------------------------- */ |
---|
| 302 | #define NSCHECK(x,n) (j_strcmp(xmlnode_get_attrib(x,"xmlns"),n) == 0) |
---|
| 303 | |
---|
| 304 | #define NS_CLIENT "jabber:client" |
---|
| 305 | #define NS_SERVER "jabber:server" |
---|
| 306 | #define NS_AUTH "jabber:iq:auth" |
---|
| 307 | #define NS_REGISTER "jabber:iq:register" |
---|
| 308 | #define NS_ROSTER "jabber:iq:roster" |
---|
| 309 | #define NS_OFFLINE "jabber:x:offline" |
---|
| 310 | #define NS_AGENT "jabber:iq:agent" |
---|
| 311 | #define NS_AGENTS "jabber:iq:agents" |
---|
| 312 | #define NS_DELAY "jabber:x:delay" |
---|
| 313 | #define NS_VERSION "jabber:iq:version" |
---|
| 314 | #define NS_TIME "jabber:iq:time" |
---|
| 315 | #define NS_VCARD "vcard-temp" |
---|
| 316 | #define NS_PRIVATE "jabber:iq:private" |
---|
| 317 | #define NS_SEARCH "jabber:iq:search" |
---|
| 318 | #define NS_OOB "jabber:iq:oob" |
---|
| 319 | #define NS_XOOB "jabber:x:oob" |
---|
| 320 | #define NS_ADMIN "jabber:iq:admin" |
---|
| 321 | #define NS_FILTER "jabber:iq:filter" |
---|
| 322 | #define NS_AUTH_0K "jabber:iq:auth:0k" |
---|
| 323 | #define NS_BROWSE "jabber:iq:browse" |
---|
| 324 | #define NS_EVENT "jabber:x:event" |
---|
| 325 | #define NS_CONFERENCE "jabber:iq:conference" |
---|
| 326 | #define NS_SIGNED "jabber:x:signed" |
---|
| 327 | #define NS_ENCRYPTED "jabber:x:encrypted" |
---|
| 328 | #define NS_GATEWAY "jabber:iq:gateway" |
---|
| 329 | #define NS_LAST "jabber:iq:last" |
---|
| 330 | #define NS_ENVELOPE "jabber:x:envelope" |
---|
| 331 | #define NS_EXPIRE "jabber:x:expire" |
---|
| 332 | #define NS_XHTML "http://www.w3.org/1999/xhtml" |
---|
| 333 | |
---|
| 334 | #define NS_XDBGINSERT "jabber:xdb:ginsert" |
---|
| 335 | #define NS_XDBNSLIST "jabber:xdb:nslist" |
---|
| 336 | |
---|
| 337 | |
---|
| 338 | |
---|
| 339 | #ifdef __cplusplus |
---|
| 340 | } |
---|
| 341 | #endif |
---|
| 342 | |
---|
| 343 | #endif /* INCL_LIB_H */ |
---|