5 # Basic definitions, used all over
7 # (c) 2005 Straylight/Edgeware
10 #----- Licensing notice -----------------------------------------------------
12 # This file is part of the Python interface to mLib.
14 # mLib/Python is free software; you can redistribute it and/or modify
15 # it under the terms of the GNU General Public License as published by
16 # the Free Software Foundation; either version 2 of the License, or
17 # (at your option) any later version.
19 # mLib/Python is distributed in the hope that it will be useful,
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 # GNU General Public License for more details.
24 # You should have received a copy of the GNU General Public License
25 # along with mLib/Python; if not, write to the Free Software Foundation,
26 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28 #----- C library ------------------------------------------------------------
30 cdef extern from 'errno.h':
35 cdef extern from 'limits.h':
38 cdef extern from 'math.h':
39 double modf(double x, double *i)
40 cdef extern from 'stddef.h':
42 cdef extern from 'string.h':
43 void memcpy(void *p, void *q, size_t n)
44 char *strerror(int err)
45 size_t strlen(char *p)
47 #----- Unix interface -------------------------------------------------------
49 cdef extern from 'sys/types.h':
51 cdef extern from 'sys/time.h':
56 cdef extern from 'sys/socket.h':
61 int getsockname(int fd, sockaddr *pa, size_t *psz)
62 int getpeername(int fd, sockaddr *pa, size_t *psz)
63 cdef extern from 'arpa/inet.h':
66 int inet_aton(char *rp, in_addr *ia)
67 char *inet_ntoa(in_addr ia)
68 cdef extern from 'netinet/in.h':
77 cdef extern from 'netdb.h':
87 #----- Python ---------------------------------------------------------------
89 cdef extern from 'Python.h':
91 object PyString_FromStringAndSize(char *p, int len)
92 int PyString_AsStringAndSize(obj, char **p, int *len) except -1
93 int PyObject_AsReadBuffer(obj, void **buf, int *len) except -1
94 int PyObject_TypeCheck(obj, ty)
95 object PyInt_FromLong(long i)
96 object PyLong_FromUnsignedLong(unsigned long i)
98 ctypedef struct PyObject:
100 ctypedef struct PyTypeObject:
102 void Py_INCREF(PyObject *obj)
103 void Py_DECREF(PyObject *obj)
105 #----- mLib basic stuff -----------------------------------------------------
107 cdef extern from 'mLib/alloc.h':
108 char *xstrdup(char *p)
109 void *xmalloc(size_t sz)
112 cdef extern from 'mLib/bits.h':
115 cdef extern from 'mLib/dstr.h':
116 ctypedef struct dstr:
119 void DCREATE(dstr *d)
120 void dstr_destroy(dstr *d)
122 #----- CRC32 ----------------------------------------------------------------
124 cdef extern from 'mLib/crc32.h':
125 uint32 c_crc32 "crc32" (uint32 a, void *p, int sz)
127 #----- Universal hashing ----------------------------------------------------
129 cdef extern from 'mLib/unihash.h':
130 ctypedef struct unihash_info:
132 void unihash_setkey(unihash_info *i, uint32 k)
133 uint32 UNIHASH_INIT(unihash_info *i)
134 uint32 unihash_hash(unihash_info *i, uint32 a, void *p, int sz)
135 unihash_info unihash_global
137 #----- Symbol tables --------------------------------------------------------
139 cdef extern from 'mLib/sym.h':
140 ctypedef struct sym_table:
142 ctypedef struct sym_base:
144 ctypedef struct sym_iter:
146 void sym_create(sym_table *t)
147 void sym_destroy(sym_table *t)
148 void *sym_find(sym_table *t, char *n, long l, int sz, unsigned *f)
149 void sym_remove(sym_table *t, void *b)
150 char *SYM_NAME(void *b)
152 void sym_mkiter(sym_iter *i, sym_table *t)
153 void *sym_next(sym_iter *i)
155 #----- String utilities -----------------------------------------------------
157 cdef extern from 'mLib/str.h':
160 char *str_qword(char **pp, unsigned f)
161 size_t str_qsplit(char *p, char **v, size_t c, char **rest, unsigned f)
162 int str_match(char *p, char *s)
163 void str_sanitize(char *d, char *p, size_t sz)
165 #----- Atom stuff -----------------------------------------------------------
169 # Partly written in `real' C.
171 cdef extern from 'atom.h':
172 ctypedef struct atom:
174 ctypedef struct atom_iter:
176 ctypedef struct atom_table:
178 atom_table *ATOM_GLOBAL
179 void atom_mkiter(atom_iter *i, atom_table *t)
180 atom *atom_next(atom_iter *)
185 PyTypeObject atom_pytype
187 # --- Association tables ---
189 cdef extern from 'mLib/assoc.h':
190 ctypedef struct assoc_table:
192 ctypedef struct assoc_base:
194 ctypedef struct assoc_iter:
196 void assoc_create(assoc_table *t)
197 void assoc_destroy(assoc_table *t)
198 void *assoc_find(assoc_table *t, atom *a, int sz, unsigned *f)
199 void assoc_remove(assoc_table *t, void *b)
200 atom *ASSOC_ATOM(void *b)
201 void assoc_mkiter(assoc_iter *i, assoc_table *t)
202 void *assoc_next(assoc_iter *i)
204 #----- Double-ended arrays --------------------------------------------------
206 cdef extern from 'array.h':
208 PyTypeObject da_pytype
209 PyTypeObject daiter_pytype
211 #----- Line buffer ----------------------------------------------------------
213 cdef extern from 'mLib/lbuf.h':
220 _LBUF_CRLF "LBUF_CRLF"
221 _LBUF_STRICTCRLF "LBUF_STRICTCRLF"
222 void lbuf_flush(lbuf *b, char *p, size_t len)
223 void lbuf_close(lbuf *b)
224 size_t lbuf_free(lbuf *b, char **p)
225 void lbuf_setsize(lbuf *b, size_t sz)
226 void lbuf_enable(lbuf *b)
227 void lbuf_disable(lbuf *b)
228 void lbuf_init(lbuf *b,
229 void (*func)(char *s, size_t len, void *arg), void *arg)
230 void lbuf_destroy(lbuf *b)
232 #----- Packet buffer --------------------------------------------------------
234 cdef extern from 'mLib/pkbuf.h':
235 ctypedef struct pkbuf:
240 void pkbuf_flush(pkbuf *pk, unsigned char *p, size_t len)
241 void pkbuf_close(pkbuf *pk)
242 size_t pkbuf_free(pkbuf *pk, unsigned char **p)
243 void pkbuf_want(pkbuf *pk, size_t sz)
244 void pkbuf_init(pkbuf *b,
245 void (*func)(unsigned char *s, size_t len,
246 pkbuf *pk, size_t *keep, void *arg),
248 void pkbuf_destroy(pkbuf *b)
250 #----- Select stuff ---------------------------------------------------------
254 cdef extern from 'mLib/sel.h':
255 ctypedef struct sel_state:
257 ctypedef struct sel_file:
259 ctypedef struct sel_timer:
263 _SEL_WRITE "SEL_WRITE"
265 void sel_init(sel_state *s)
266 void sel_initfile(sel_state *s, sel_file *f, int fd, unsigned mode,
267 void (*func)(int fd, unsigned mode, void *arg),
269 void sel_force(sel_file *f)
270 void sel_addfile(sel_file *f)
271 void sel_rmfile(sel_file *f)
272 void sel_addtimer(sel_state *s, sel_timer *t, timeval *tv,
273 void (*func)(timeval *tv, void *arg),
275 void sel_rmtimer(sel_timer *t)
276 int sel_select(sel_state *s) except *
278 # --- Non-blocking connection ---
280 cdef extern from 'mLib/conn.h':
281 ctypedef struct conn:
283 int conn_fd(conn *c, sel_state *s, int fd,
284 void (*func)(int fd, void *arg), void *arg)
285 void conn_kill(conn *c)
287 # --- Background name resolver ---
289 cdef extern from 'mLib/bres.h':
290 ctypedef struct bres_client:
292 void bres_byname(bres_client *r, char *name,
293 void (*func)(hostent *h, void *arg), void *arg)
294 void bres_byaddr(bres_client *r, in_addr addr,
295 void (*func)(hostent *h, void *arg), void *arg)
296 void bres_abort(bres_client *r)
297 void bres_exec(char *null)
298 void bres_init(sel_state *s)
300 # --- In-band signal handling ---
302 cdef extern from 'mLib/sig.h':
305 void sig_add(sig *s, int n, void (*func)(int n, void *arg), void *arg)
306 void sig_remove(sig *s)
307 void sig_init(sel_state *s)
309 # --- Line buffer ---
311 cdef extern from 'mLib/selbuf.h':
312 ctypedef struct selbuf:
315 void selbuf_enable(selbuf *b)
316 void selbuf_disable(selbuf *b)
317 void selbuf_setsize(selbuf *b, size_t sz)
318 void selbuf_init(selbuf *b, sel_state *s, int fd,
319 void (*func)(char *s, size_t len, void *arg), void *arg)
320 void selbuf_destroy(selbuf *b)
322 # --- Packet buffer ---
324 cdef extern from 'mLib/selpk.h':
325 ctypedef struct selpk:
328 void selpk_enable(selpk *b)
329 void selpk_disable(selpk *b)
330 void selpk_want(selpk *b, size_t sz)
331 void selpk_init(selpk *b, sel_state *s, int fd,
332 void (*func)(unsigned char *p, size_t n,
333 pkbuf *pk, size_t *keep, void *arg),
335 void selpk_destroy(selpk *b)
337 # --- Ident client ---
339 cdef extern from 'mLib/ident.h':
340 ctypedef struct ident_request:
352 ctypedef struct ident_reply:
357 void ident(ident_request *rq, sel_state *s,
358 sockaddr_in *local, sockaddr_in *remote,
359 void (*func)(ident_reply *r, void *arg),
361 void ident_abort(ident_request *rq)
363 #----- Error reporting ------------------------------------------------------
365 cdef extern from 'mLib/quis.h':
366 void _ego "ego"(char *prog)
368 cdef extern from 'mLib/report.h':
369 void _moan "moan"(char *f, char *msg)
371 #----- Internal utilities ---------------------------------------------------
373 cdef extern from 'grim.h':
376 #----- That's all, folks ----------------------------------------------------