#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <setjmp.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <signal.h>
#include <syslog.h>
#include <strings.h>
#include <unistd.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include <stdarg.h>
#include <ctype.h>
#include <time.h>
#include <expat.h>
#define MAXSHORTSTR 203
#define QUAD_T unsigned long long
#ifdef __STDC__
#include <stdarg.h>
# define VA_LOCAL_DECL va_list ap;
# define VA_START(f) va_start(ap, f)
# define VA_END va_end(ap)
#else
# include <varargs.h>
# define VA_LOCAL_DECL va_list ap;
# define VA_START(f) va_start(ap)
# define VA_END va_end(ap)
#endif
#ifndef INCL_LIB_H
#define INCL_LIB_H
#ifdef __cplusplus
extern "C" {
#endif
#ifndef HAVE_SNPRINTF
extern int ap_snprintf(char *, size_t, const char *, ...);
#define snprintf ap_snprintf
#endif
#ifndef HAVE_VSNPRINTF
extern int ap_vsnprintf(char *, size_t, const char *, va_list ap);
#define vsnprintf ap_vsnprintf
#endif
#define ZONE zonestr(__FILE__,__LINE__)
char *zonestr(char *file, int line);
#undef POOL_DEBUG
struct pheap
{
void *block;
int size, used;
};
typedef void (*pool_cleaner)(void *arg);
struct pfree
{
pool_cleaner f;
void *arg;
struct pheap *heap;
struct pfree *next;
};
typedef struct pool_struct
{
int size;
struct pfree *cleanup;
struct pheap *heap;
#ifdef POOL_DEBUG
char name[8], zone[32];
int lsize;
} _pool, *pool;
#define pool_new() _pool_new(ZONE)
#define pool_heap(i) _pool_new_heap(i,ZONE)
#else
} _pool, *pool;
#define pool_heap(i) _pool_new_heap(i,NULL)
#define pool_new() _pool_new(NULL)
#endif
pool _pool_new(char *zone);
pool _pool_new_heap(int size, char *zone);
void *pmalloc(pool p, int size);
void *pmalloc_x(pool p, int size, char c);
void *pmalloco(pool p, int size);
char *pstrdup(pool p, const char *src);
void pool_stat(int full);
char *pstrdupx(pool p, const char *src);
void pool_cleanup(pool p, pool_cleaner f, void *arg);
void pool_free(pool p);
int pool_size(pool p);
#ifndef MAXHOSTNAMELEN
#define MAXHOSTNAMELEN 64
#endif
#define NETSOCKET_SERVER 0
#define NETSOCKET_CLIENT 1
#define NETSOCKET_UDP 2
#ifndef WIN32
int make_netsocket(u_short port, char *host, int type);
struct in_addr *make_addr(char *host);
int set_fd_close_on_exec(int fd, int flag);
#ifdef WITH_IPV6
struct in6_addr *make_addr_ipv6(char *host);
#endif
#endif
char *j_strdup(const char *str);
char *j_strcat(char *dest, char *txt);
int j_strcmp(const char *a, const char *b);
int j_strcasecmp(const char *a, const char *b);
int j_strncmp(const char *a, const char *b, int i);
int j_strncasecmp(const char *a, const char *b, int i);
int j_strlen(const char *a);
int j_atoi(const char *a, int def);
void str_b64decode(char *str);
int base64_encode(unsigned char *source, size_t sourcelen, char *target, size_t targetlen);
size_t base64_decode(char *source, unsigned char *target, size_t targetlen);
#if (SIZEOF_INT == 4)
typedef unsigned int uint32;
#elif (SIZEOF_SHORT == 4)
typedef unsigned short uint32;
#else
typedef unsigned int uint32;
#endif
char *shahash(char *str);
void shahash_r(const char* str, char hashbuf[40]);
int strprintsha(char *dest, int *hashval);
typedef struct xhn_struct
{
struct xhn_struct *next;
const char *key;
void *val;
} *xhn, _xhn;
typedef struct xht_struct
{
pool p;
int prime;
struct xhn_struct *zen;
} *xht, _xht;
xht xhash_new(int prime);
void xhash_put(xht h, const char *key, void *val);
void *xhash_get(xht h, const char *key);
void xhash_zap(xht h, const char *key);
void xhash_free(xht h);
typedef void (*xhash_walker)(xht h, const char *key, void *val, void *arg);
void xhash_walk(xht h, xhash_walker w, void *arg);
typedef int (*KEYHASHFUNC)(const void *key);
typedef int (*KEYCOMPAREFUNC)(const void *key1, const void *key2);
typedef int (*TABLEWALKFUNC)(void *user_data, const void *key, void *data);
typedef void *HASHTABLE;
HASHTABLE ghash_create(int buckets, KEYHASHFUNC hash, KEYCOMPAREFUNC cmp);
HASHTABLE ghash_create_pool(pool p, int buckets, KEYHASHFUNC hash, KEYCOMPAREFUNC cmp);
void ghash_destroy(HASHTABLE tbl);
void *ghash_get(HASHTABLE tbl, const void *key);
int ghash_put(HASHTABLE tbl, const void *key, void *value);
int ghash_remove(HASHTABLE tbl, const void *key);
int ghash_walk(HASHTABLE tbl, TABLEWALKFUNC func, void *user_data);
int str_hash_code(const char *s);
char *strescape(pool p, char *buf);
char *strunescape(pool p, char *buf);
struct spool_node
{
char *c;
struct spool_node *next;
};
typedef struct spool_struct
{
pool p;
int len;
struct spool_node *last;
struct spool_node *first;
} *spool;
spool spool_new(pool p);
void spooler(spool s, ...);
char *spool_print(spool s);
void spool_add(spool s, char *str);
char *spools(pool p, ...);
#define NTYPE_TAG 0
#define NTYPE_ATTRIB 1
#define NTYPE_CDATA 2
#define NTYPE_LAST 2
#define NTYPE_UNDEF -1
typedef struct xmlnode_t
{
char* name;
unsigned short type;
char* data;
int data_sz;
int complete;
pool p;
struct xmlnode_t* parent;
struct xmlnode_t* firstchild;
struct xmlnode_t* lastchild;
struct xmlnode_t* prev;
struct xmlnode_t* next;
struct xmlnode_t* firstattrib;
struct xmlnode_t* lastattrib;
} _xmlnode, *xmlnode;
xmlnode xmlnode_wrap(xmlnode x,const char* wrapper);
xmlnode xmlnode_new_tag(const char* name);
xmlnode xmlnode_new_tag_pool(pool p, const char* name);
xmlnode xmlnode_insert_tag(xmlnode parent, const char* name);
xmlnode xmlnode_insert_cdata(xmlnode parent, const char* CDATA, unsigned int size);
xmlnode xmlnode_insert_tag_node(xmlnode parent, xmlnode node);
void xmlnode_insert_node(xmlnode parent, xmlnode node);
xmlnode xmlnode_str(char *str, int len);
xmlnode xmlnode_file(char *file);
char* xmlnode_file_borked(char *file);
xmlnode xmlnode_dup(xmlnode x);
xmlnode xmlnode_dup_pool(pool p, xmlnode x);
pool xmlnode_pool(xmlnode node);
xmlnode _xmlnode_new(pool p, const char *name, unsigned int type);
void xmlnode_hide(xmlnode child);
void xmlnode_hide_attrib(xmlnode parent, const char *name);
void xmlnode_free(xmlnode node);
xmlnode xmlnode_get_tag(xmlnode parent, const char* name);
char* xmlnode_get_tag_data(xmlnode parent, const char* name);
void xmlnode_put_attrib(xmlnode owner, const char* name, const char* value);
char* xmlnode_get_attrib(xmlnode owner, const char* name);
void xmlnode_put_expat_attribs(xmlnode owner, const char** atts);
void xmlnode_put_vattrib(xmlnode owner, const char* name, void *value);
void* xmlnode_get_vattrib(xmlnode owner, const char* name);
xmlnode xmlnode_get_firstattrib(xmlnode parent);
xmlnode xmlnode_get_firstchild(xmlnode parent);
xmlnode xmlnode_get_lastchild(xmlnode parent);
xmlnode xmlnode_get_nextsibling(xmlnode sibling);
xmlnode xmlnode_get_prevsibling(xmlnode sibling);
xmlnode xmlnode_get_parent(xmlnode node);
char* xmlnode_get_name(xmlnode node);
char* xmlnode_get_data(xmlnode node);
int xmlnode_get_datasz(xmlnode node);
int xmlnode_get_type(xmlnode node);
int xmlnode_has_children(xmlnode node);
int xmlnode_has_attribs(xmlnode node);
char* xmlnode2str(xmlnode node);
char* xmlnode2tstr(xmlnode node);
int xmlnode_cmp(xmlnode a, xmlnode b);
int xmlnode2file(char *file, xmlnode node);
void expat_startElement(void* userdata, const char* name, const char** atts);
void expat_endElement(void* userdata, const char* name);
void expat_charData(void* userdata, const char* s, int len);
#define XSTREAM_MAXNODE 1000000
#define XSTREAM_MAXDEPTH 100
#define XSTREAM_ROOT 0
#define XSTREAM_NODE 1
#define XSTREAM_CLOSE 2
#define XSTREAM_ERR 4
typedef void (*xstream_onNode)(int type, xmlnode x, void *arg);
typedef struct xstream_struct
{
XML_Parser parser;
xmlnode node;
char *cdata;
int cdata_len;
pool p;
xstream_onNode f;
void *arg;
int status;
int depth;
} *xstream, _xstream;
xstream xstream_new(pool p, xstream_onNode f, void *arg);
int xstream_eat(xstream xs, char *buff, int len);
xmlnode xstream_header(char *namespace, char *to, char *from);
char *xstream_header_char(xmlnode x);
typedef struct {
unsigned long H[5];
unsigned long W[80];
int lenW;
unsigned long sizeHi,sizeLo;
} j_SHA_CTX;
void shaInit(j_SHA_CTX *ctx);
void shaUpdate(j_SHA_CTX *ctx, unsigned char *dataIn, int len);
void shaFinal(j_SHA_CTX *ctx, unsigned char hashout[20]);
void shaBlock(unsigned char *dataIn, int len, unsigned char hashout[20]);
#define JID_RESOURCE 1
#define JID_USER 2
#define JID_SERVER 4
typedef struct jid_struct
{
pool p;
char* resource;
char* user;
char* server;
char* full;
struct jid_struct *next;
} *jid;
jid jid_new(pool p, char *idstr);
void jid_set(jid id, char *str, int item);
char* jid_full(jid id);
int jid_cmp(jid a, jid b);
int jid_cmpx(jid a, jid b, int parts);
jid jid_append(jid a, jid b);
xmlnode jid_xres(jid id);
xmlnode jid_nodescan(jid id, xmlnode x);
jid jid_user(jid a);
#define JPACKET_UNKNOWN 0x00
#define JPACKET_MESSAGE 0x01
#define JPACKET_PRESENCE 0x02
#define JPACKET_IQ 0x04
#define JPACKET_S10N 0x08
#define JPACKET__UNKNOWN 0
#define JPACKET__NONE 1
#define JPACKET__ERROR 2
#define JPACKET__CHAT 3
#define JPACKET__GROUPCHAT 4
#define JPACKET__GET 5
#define JPACKET__SET 6
#define JPACKET__RESULT 7
#define JPACKET__SUBSCRIBE 8
#define JPACKET__SUBSCRIBED 9
#define JPACKET__UNSUBSCRIBE 10
#define JPACKET__UNSUBSCRIBED 11
#define JPACKET__AVAILABLE 12
#define JPACKET__UNAVAILABLE 13
#define JPACKET__PROBE 14
#define JPACKET__HEADLINE 15
#define JPACKET__INVISIBLE 16
typedef struct jpacket_struct
{
unsigned char type;
int subtype;
int flag;
void* aux1;
xmlnode x;
jid to;
jid from;
char* iqns;
xmlnode iq;
pool p;
} *jpacket, _jpacket;
jpacket jpacket_new(xmlnode x);
jpacket jpacket_reset(jpacket p);
int jpacket_subtype(jpacket p);
typedef struct ppdb_struct
{
jid id;
int pri;
xmlnode x;
struct ppdb_struct* user;
pool p;
struct ppdb_struct* next;
} _ppdb, *ppdb;
ppdb ppdb_insert(ppdb db, jid id, xmlnode x);
xmlnode ppdb_primary(ppdb db, jid id);
void ppdb_free(ppdb db);
xmlnode ppdb_get(ppdb db, jid id);
typedef struct jlimit_struct
{
char *key;
int start;
int points;
int maxt, maxp;
pool p;
} *jlimit, _jlimit;
jlimit jlimit_new(int maxt, int maxp);
void jlimit_free(jlimit r);
int jlimit_check(jlimit r, char *key, int points);
#define KARMA_READ_MAX(k) (abs(k)*100)
#define KARMA_INIT 5
#define KARMA_HEARTBEAT 2
#define KARMA_MAX 10
#define KARMA_INC 1
#define KARMA_DEC 0
#define KARMA_PENALTY -5
#define KARMA_RESTORE 5
#define KARMA_RESETMETER 0
struct karma
{
int init;
int reset_meter;
int val;
long bytes;
int max;
int inc,dec;
int penalty,restore;
time_t last_update;
};
struct karma *karma_new(pool p);
void karma_copy(struct karma *new, struct karma *old);
void karma_increment(struct karma *k);
void karma_decrement(struct karma *k, long bytes_read);
int karma_check(struct karma *k,long bytes_read);
typedef struct terror_struct
{
int code;
char msg[64];
} terror;
#define TERROR_BAD (terror){400,"Bad Request"}
#define TERROR_AUTH (terror){401,"Unauthorized"}
#define TERROR_PAY (terror){402,"Payment Required"}
#define TERROR_FORBIDDEN (terror){403,"Forbidden"}
#define TERROR_NOTFOUND (terror){404,"Not Found"}
#define TERROR_NOTALLOWED (terror){405,"Not Allowed"}
#define TERROR_NOTACCEPTABLE (terror){406,"Not Acceptable"}
#define TERROR_REGISTER (terror){407,"Registration Required"}
#define TERROR_REQTIMEOUT (terror){408,"Request Timeout"}
#define TERROR_CONFLICT (terror){409,"Conflict"}
#define TERROR_INTERNAL (terror){500,"Internal Server Error"}
#define TERROR_NOTIMPL (terror){501,"Not Implemented"}
#define TERROR_EXTERNAL (terror){502,"Remote Server Error"}
#define TERROR_UNAVAIL (terror){503,"Service Unavailable"}
#define TERROR_EXTTIMEOUT (terror){504,"Remote Server Timeout"}
#define TERROR_DISCONNECTED (terror){510,"Disconnected"}
#define NSCHECK(x,n) (j_strcmp(xmlnode_get_attrib(x,"xmlns"),n) == 0)
#define NS_CLIENT "jabber:client"
#define NS_SERVER "jabber:server"
#define NS_AUTH "jabber:iq:auth"
#define NS_AUTH_CRYPT "jabber:iq:auth:crypt"
#define NS_REGISTER "jabber:iq:register"
#define NS_ROSTER "jabber:iq:roster"
#define NS_OFFLINE "jabber:x:offline"
#define NS_AGENT "jabber:iq:agent"
#define NS_AGENTS "jabber:iq:agents"
#define NS_DELAY "jabber:x:delay"
#define NS_VERSION "jabber:iq:version"
#define NS_TIME "jabber:iq:time"
#define NS_VCARD "vcard-temp"
#define NS_PRIVATE "jabber:iq:private"
#define NS_SEARCH "jabber:iq:search"
#define NS_OOB "jabber:iq:oob"
#define NS_XOOB "jabber:x:oob"
#define NS_ADMIN "jabber:iq:admin"
#define NS_FILTER "jabber:iq:filter"
#define NS_AUTH_0K "jabber:iq:auth:0k"
#define NS_BROWSE "jabber:iq:browse"
#define NS_EVENT "jabber:x:event"
#define NS_CONFERENCE "jabber:iq:conference"
#define NS_SIGNED "jabber:x:signed"
#define NS_ENCRYPTED "jabber:x:encrypted"
#define NS_GATEWAY "jabber:iq:gateway"
#define NS_LAST "jabber:iq:last"
#define NS_ENVELOPE "jabber:x:envelope"
#define NS_EXPIRE "jabber:x:expire"
#define NS_XHTML "http://www.w3.org/1999/xhtml"
#define NS_XDBGINSERT "jabber:xdb:ginsert"
#define NS_XDBNSLIST "jabber:xdb:nslist"
xmlnode jutil_presnew(int type, char *to, char *status);
xmlnode jutil_iqnew(int type, char *ns);
xmlnode jutil_msgnew(char *type, char *to, char *subj, char *body);
xmlnode jutil_header(char* xmlns, char* server);
int jutil_priority(xmlnode x);
void jutil_tofrom(xmlnode x);
xmlnode jutil_iqresult(xmlnode x);
char* jutil_timestamp(void);
void jutil_error(xmlnode x, terror E);
void jutil_delay(xmlnode msg, char *reason);
char* jutil_regkey(char *key, char *seed);
#ifdef __cplusplus
}
#endif
#endif