Copied libratbox and related stuff from shadowircd upstream.
This commit is contained in:
parent
dffb83aa69
commit
3202e24921
56 changed files with 3565 additions and 2392 deletions
|
@ -1,3 +1,488 @@
|
||||||
|
androsyn 2008/11/11 00:00:12 UTC (20081111_0-26180)
|
||||||
|
Log:
|
||||||
|
fix build errors on os x leopard
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/unix.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/11/07 02:10:19 UTC (20081107_0-26178)
|
||||||
|
Log:
|
||||||
|
untested fix for building on os x -- environ is not accessible to shared libraries...
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/unix.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/10/26 20:59:07 UTC (20081026_2-26170)
|
||||||
|
Log:
|
||||||
|
add rb_basename and rb_dirname
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/include/rb_tools.h (File Modified)
|
||||||
|
libratbox/trunk/src/export-syms.txt (File Modified)
|
||||||
|
libratbox/trunk/src/tools.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/10/26 20:58:40 UTC (20081026_1-26168)
|
||||||
|
Log:
|
||||||
|
remove -O0 from configure.ac and configure
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/configure (File Modified)
|
||||||
|
libratbox/trunk/configure.ac (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/10/26 20:48:56 UTC (20081026_0-26166)
|
||||||
|
Log:
|
||||||
|
do an ERR_get_error() if opening the dhparams file fails
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/openssl.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/10/03 18:02:13 UTC (20081003_0-26126)
|
||||||
|
Log:
|
||||||
|
fix up the timerfd autoconf stuff a bit better
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/acinclude.m4 (File Modified)
|
||||||
|
libratbox/trunk/configure (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/29 22:58:42 UTC (20080929_0-26122)
|
||||||
|
Log:
|
||||||
|
fix the timerfd_create check
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/acinclude.m4 (File Modified)
|
||||||
|
libratbox/trunk/configure (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/20 01:27:19 UTC (20080920_1-26100)
|
||||||
|
Log:
|
||||||
|
properly cast a few things when doing pointer math and the like
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/balloc.c (File Modified)
|
||||||
|
libratbox/trunk/src/openssl.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/20 01:05:42 UTC (20080920_0-26096)
|
||||||
|
Log:
|
||||||
|
make rb_close_all be a no-op on win32, its not too useful there either as windows doesn't inherit sockets/files by default
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/commio.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/19 15:13:52 UTC (20080919_0-26092)
|
||||||
|
Log:
|
||||||
|
update indent.pro and rerun through indent
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/.indent.pro (File Modified)
|
||||||
|
libratbox/trunk/include/arc4random.h (File Modified)
|
||||||
|
libratbox/trunk/include/commio-int.h (File Modified)
|
||||||
|
libratbox/trunk/include/commio-ssl.h (File Modified)
|
||||||
|
libratbox/trunk/include/rb_balloc.h (File Modified)
|
||||||
|
libratbox/trunk/include/rb_commio.h (File Modified)
|
||||||
|
libratbox/trunk/include/rb_event.h (File Modified)
|
||||||
|
libratbox/trunk/include/rb_helper.h (File Modified)
|
||||||
|
libratbox/trunk/include/rb_linebuf.h (File Modified)
|
||||||
|
libratbox/trunk/include/rb_memory.h (File Modified)
|
||||||
|
libratbox/trunk/include/rb_patricia.h (File Modified)
|
||||||
|
libratbox/trunk/include/rb_rawbuf.h (File Modified)
|
||||||
|
libratbox/trunk/include/rb_snprintf.h (File Modified)
|
||||||
|
libratbox/trunk/include/rb_tools.h (File Modified)
|
||||||
|
libratbox/trunk/src/arc4random.c (File Modified)
|
||||||
|
libratbox/trunk/src/balloc.c (File Modified)
|
||||||
|
libratbox/trunk/src/commio.c (File Modified)
|
||||||
|
libratbox/trunk/src/crypt.c (File Modified)
|
||||||
|
libratbox/trunk/src/devpoll.c (File Modified)
|
||||||
|
libratbox/trunk/src/epoll.c (File Modified)
|
||||||
|
libratbox/trunk/src/event.c (File Modified)
|
||||||
|
libratbox/trunk/src/gnutls.c (File Modified)
|
||||||
|
libratbox/trunk/src/helper.c (File Modified)
|
||||||
|
libratbox/trunk/src/kqueue.c (File Modified)
|
||||||
|
libratbox/trunk/src/linebuf.c (File Modified)
|
||||||
|
libratbox/trunk/src/nossl.c (File Modified)
|
||||||
|
libratbox/trunk/src/openssl.c (File Modified)
|
||||||
|
libratbox/trunk/src/patricia.c (File Modified)
|
||||||
|
libratbox/trunk/src/poll.c (File Modified)
|
||||||
|
libratbox/trunk/src/ports.c (File Modified)
|
||||||
|
libratbox/trunk/src/ratbox_lib.c (File Modified)
|
||||||
|
libratbox/trunk/src/rawbuf.c (File Modified)
|
||||||
|
libratbox/trunk/src/rb_memory.c (File Modified)
|
||||||
|
libratbox/trunk/src/select.c (File Modified)
|
||||||
|
libratbox/trunk/src/sigio.c (File Modified)
|
||||||
|
libratbox/trunk/src/snprintf.c (File Modified)
|
||||||
|
libratbox/trunk/src/tools.c (File Modified)
|
||||||
|
libratbox/trunk/src/unix.c (File Modified)
|
||||||
|
libratbox/trunk/src/win32.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/18 18:56:55 UTC (20080918_1-26088)
|
||||||
|
Log:
|
||||||
|
on win32 add randomness from RtlGenRandom if its available
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/arc4random.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/18 18:41:19 UTC (20080918_0-26086)
|
||||||
|
Log:
|
||||||
|
add timerfd_create support on linux with glibc 2.8
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/acinclude.m4 (File Modified)
|
||||||
|
libratbox/trunk/configure (File Modified)
|
||||||
|
libratbox/trunk/configure.ac (File Modified)
|
||||||
|
libratbox/trunk/include/libratbox_config.h.in (File Modified)
|
||||||
|
libratbox/trunk/src/Makefile.in (File Modified)
|
||||||
|
libratbox/trunk/src/epoll.c (File Modified)
|
||||||
|
libratbox/trunk/src/version.c.SH (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/15 15:47:42 UTC (20080915_0-26082)
|
||||||
|
Log:
|
||||||
|
cast svptr a bit harder to deal with 32bit systems. Also use sizeof our_signalfd_siginfo.
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/epoll.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
jilles 2008/09/14 22:24:27 UTC (20080914_0-26078)
|
||||||
|
Log:
|
||||||
|
Fix infinite recursion crash on non-win32.
|
||||||
|
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/unix.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/10 01:45:22 UTC (20080910_1-26072)
|
||||||
|
Log:
|
||||||
|
fix a typo
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/select.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/10 00:23:41 UTC (20080910_0-26068)
|
||||||
|
Log:
|
||||||
|
attempt to override FD_SETSIZE for select and if rb_maxconnections is greater than FD_SETSIZE, lower rb_maxconnections. Also prefer select to win32
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/commio.c (File Modified)
|
||||||
|
libratbox/trunk/src/select.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/09 22:58:11 UTC (20080909_8-26066)
|
||||||
|
Log:
|
||||||
|
actually make that use BIO_new_file
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/openssl.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/09 22:19:14 UTC (20080909_7-26064)
|
||||||
|
Log:
|
||||||
|
avoid using FILE with openssl as this causes openssl to need OPENSSL_applink on some platforms which is annoying
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/openssl.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/09 17:08:10 UTC (20080909_6-26060)
|
||||||
|
Log:
|
||||||
|
those symbols don't exist..oops
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/export-syms.txt (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/09 17:05:19 UTC (20080909_5-26058)
|
||||||
|
Log:
|
||||||
|
move that down a little
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/unix.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/09 16:47:03 UTC (20080909_4-26052)
|
||||||
|
Log:
|
||||||
|
change ifdef WIN32 to _WIN32
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/include/commio-int.h (File Modified)
|
||||||
|
libratbox/trunk/include/ratbox_lib.h (File Modified)
|
||||||
|
libratbox/trunk/include/rb_commio.h (File Modified)
|
||||||
|
libratbox/trunk/src/balloc.c (File Modified)
|
||||||
|
libratbox/trunk/src/commio.c (File Modified)
|
||||||
|
libratbox/trunk/src/helper.c (File Modified)
|
||||||
|
libratbox/trunk/src/openssl.c (File Modified)
|
||||||
|
libratbox/trunk/src/unix.c (File Modified)
|
||||||
|
libratbox/trunk/src/win32.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/09 16:40:19 UTC (20080909_3-26048)
|
||||||
|
Log:
|
||||||
|
- Implement fd passing for win32 so that ssld will work on there.
|
||||||
|
- Add a few symbols to the library for portability issues
|
||||||
|
Note that this commit changes the API for rb_send_fd_buf as it now
|
||||||
|
also takes a pid option as this is needed on windows. This process
|
||||||
|
id should be the target process. Note that unix will just ignore
|
||||||
|
this.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/Makefile.in (File Modified)
|
||||||
|
libratbox/trunk/include/ratbox_lib.h (File Modified)
|
||||||
|
libratbox/trunk/include/rb_commio.h (File Modified)
|
||||||
|
libratbox/trunk/src/commio.c (File Modified)
|
||||||
|
libratbox/trunk/src/export-syms.txt (File Modified)
|
||||||
|
libratbox/trunk/src/helper.c (File Modified)
|
||||||
|
libratbox/trunk/src/unix.c (File Modified)
|
||||||
|
libratbox/trunk/src/win32.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/09 16:37:30 UTC (20080909_2-26046)
|
||||||
|
Log:
|
||||||
|
pass libraries to LDFLAGS as well
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/Makefile.am (File Modified)
|
||||||
|
libratbox/trunk/src/Makefile.in (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/09 16:36:15 UTC (20080909_1-26044)
|
||||||
|
Log:
|
||||||
|
make SSL_LIBS actually pass the path to the openssl libraries
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/configure (File Modified)
|
||||||
|
libratbox/trunk/configure.ac (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/09 14:40:41 UTC (20080909_0-26036)
|
||||||
|
Log:
|
||||||
|
make that an ifdef
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/commio.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/08 16:54:58 UTC (20080908_1-26034)
|
||||||
|
Log:
|
||||||
|
add a datagram socketpair for platforms that don't have it..mostly based on what is in perl for this
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/commio.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/08 16:53:53 UTC (20080908_0-26032)
|
||||||
|
Log:
|
||||||
|
make rb_strerror be char instead of const char
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/include/ratbox_lib.h (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/05 23:44:06 UTC (20080905_1-26022)
|
||||||
|
Log:
|
||||||
|
fix the define of the fake rb_sockaddr_storage so that m4 does not eat up our [ ]
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/configure (File Modified)
|
||||||
|
libratbox/trunk/configure.ac (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/05 18:19:25 UTC (20080905_0-26012)
|
||||||
|
Log:
|
||||||
|
revert part of r25994
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/configure (File Modified)
|
||||||
|
libratbox/trunk/configure.ac (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/04 21:43:03 UTC (20080904_3-26008)
|
||||||
|
Log:
|
||||||
|
change hard asserts to call both the soft assert code and the C library assert so that it gets in the ircd log files as well
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/include/ratbox_lib.h (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/04 19:32:55 UTC (20080904_2-26000)
|
||||||
|
Log:
|
||||||
|
If somebody really wants to do profiling work..they can change rb_close_all the hard way. Also stop doing the weird stderr.log hack in libratbox let callers deal with stderr on their own
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/commio.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/04 16:08:27 UTC (20080904_1-25998)
|
||||||
|
Log:
|
||||||
|
add missing rb_strerror prototypes
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/include/ratbox_lib.h (File Modified)
|
||||||
|
libratbox/trunk/src/unix.c (File Modified)
|
||||||
|
libratbox/trunk/src/win32.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/04 15:06:21 UTC (20080904_0-25994)
|
||||||
|
Log:
|
||||||
|
some portability cleanups
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/aclocal.m4 (File Modified)
|
||||||
|
libratbox/trunk/config.guess (File Modified)
|
||||||
|
libratbox/trunk/config.sub (File Modified)
|
||||||
|
libratbox/trunk/configure (File Modified)
|
||||||
|
libratbox/trunk/configure.ac (File Modified)
|
||||||
|
libratbox/trunk/include/arc4random.h (File Modified)
|
||||||
|
libratbox/trunk/include/libratbox_config.h.in (File Modified)
|
||||||
|
libratbox/trunk/include/ratbox_lib.h (File Modified)
|
||||||
|
libratbox/trunk/ltmain.sh (File Modified)
|
||||||
|
libratbox/trunk/src/Makefile.in (File Modified)
|
||||||
|
libratbox/trunk/src/commio.c (File Modified)
|
||||||
|
libratbox/trunk/src/export-syms.txt (File Modified)
|
||||||
|
libratbox/trunk/src/helper.c (File Modified)
|
||||||
|
libratbox/trunk/src/nossl.c (File Modified)
|
||||||
|
libratbox/trunk/src/unix.c (File Modified)
|
||||||
|
libratbox/trunk/src/win32.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/03 00:20:22 UTC (20080903_0-25992)
|
||||||
|
Log:
|
||||||
|
change the event stuff to just strndup the event name
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/include/event-int.h (File Modified)
|
||||||
|
libratbox/trunk/src/event.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/02 21:40:49 UTC (20080902_0-25990)
|
||||||
|
Log:
|
||||||
|
fix makefile on bsd make
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/Makefile.am (File Modified)
|
||||||
|
libratbox/trunk/src/Makefile.in (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/01 05:00:31 UTC (20080901_3-25984)
|
||||||
|
Log:
|
||||||
|
make extern not nested
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/ratbox_lib.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/01 04:59:19 UTC (20080901_2-25982)
|
||||||
|
Log:
|
||||||
|
and add version.c.SH too
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/version.c.SH (File Added)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/01 04:58:51 UTC (20080901_1-25980)
|
||||||
|
Log:
|
||||||
|
fix up version output stuff
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/Makefile.am (File Modified)
|
||||||
|
libratbox/trunk/src/Makefile.in (File Modified)
|
||||||
|
libratbox/trunk/src/ratbox_lib.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/01 04:50:17 UTC (20080901_0-25978)
|
||||||
|
Log:
|
||||||
|
test commit
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/README (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/01 03:18:34 UTC (25975)
|
||||||
|
Log:
|
||||||
|
remove NOBALLOC code from linebuf.c and fill in the rb_bh_usage stuff for NOBALLOC
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/balloc.c (File Modified)
|
||||||
|
libratbox/trunk/src/linebuf.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/01 03:12:32 UTC (25973)
|
||||||
|
Log:
|
||||||
|
remove an #if 0
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/event.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/09/01 03:07:46 UTC (25971)
|
||||||
|
Log:
|
||||||
|
change u_char to uint8_t
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/crypt.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/08/27 19:28:26 UTC (25963)
|
||||||
|
Log:
|
||||||
|
deal with rb_vsnprintf_append having a string passed to it that is longer than len, in such case we truncate the string..
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/snprintf.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/08/27 14:59:09 UTC (25961)
|
||||||
|
Log:
|
||||||
|
the way ev->name was assigned was pretty bogus and pretty much only worked because we always used strings that always were statically allocated in the executable. fix this and do it correctly
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/include/event-int.h (File Modified)
|
||||||
|
libratbox/trunk/src/event.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/08/25 19:19:35 UTC (25955)
|
||||||
|
Log:
|
||||||
|
make that a %s instead of a %d
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/commio.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/08/15 16:29:35 UTC (25897)
|
||||||
|
Log:
|
||||||
|
order of operations in C can be a real bitch sometimes
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/balloc.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/08/14 18:23:23 UTC (25885)
|
||||||
|
Log:
|
||||||
|
fix block heap garbage collection properly
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/balloc.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
|
androsyn 2008/08/12 15:43:58 UTC (25871)
|
||||||
|
Log:
|
||||||
|
fix a crash in the rb_bh_gc code
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
libratbox/trunk/src/balloc.c (File Modified)
|
||||||
|
|
||||||
|
|
||||||
androsyn 2008/08/06 19:51:44 UTC (25861)
|
androsyn 2008/08/06 19:51:44 UTC (25861)
|
||||||
Log:
|
Log:
|
||||||
put back in the pad to even pointer boundaries stuff
|
put back in the pad to even pointer boundaries stuff
|
||||||
|
|
|
@ -123,7 +123,6 @@ INSTALL_DATA = @INSTALL_DATA@
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
LD = @LD@
|
|
||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
LIBOBJS = @LIBOBJS@
|
LIBOBJS = @LIBOBJS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
|
@ -205,7 +204,6 @@ psdir = @psdir@
|
||||||
sbindir = @sbindir@
|
sbindir = @sbindir@
|
||||||
sharedstatedir = @sharedstatedir@
|
sharedstatedir = @sharedstatedir@
|
||||||
srcdir = @srcdir@
|
srcdir = @srcdir@
|
||||||
subdirs = @subdirs@
|
|
||||||
sysconfdir = @sysconfdir@
|
sysconfdir = @sysconfdir@
|
||||||
target_alias = @target_alias@
|
target_alias = @target_alias@
|
||||||
top_builddir = @top_builddir@
|
top_builddir = @top_builddir@
|
||||||
|
|
|
@ -7,5 +7,4 @@ This is libircd from ircd-ratbox. A few notes about this library:
|
||||||
discard. For some non-irc purposes, this can be a problem, but for
|
discard. For some non-irc purposes, this can be a problem, but for
|
||||||
ircd stuff its fine.
|
ircd stuff its fine.
|
||||||
3. The helper code when transmitting data between helpers, the same 512 byte
|
3. The helper code when transmitting data between helpers, the same 512 byte
|
||||||
limit applies there as we recycle the linebuf code for this.
|
limit applies there as we recycle the linebuf code for this.
|
||||||
|
|
||||||
|
|
|
@ -111,3 +111,42 @@ case $rb__cv_timer_create_works in
|
||||||
esac
|
esac
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
AC_DEFUN([RB_CHECK_TIMERFD_CREATE],
|
||||||
|
[AC_CACHE_CHECK([for a working timerfd_create(CLOCK_REALTIME)],
|
||||||
|
[rb__cv_timerfd_create_works],
|
||||||
|
[AC_TRY_RUN([
|
||||||
|
#ifdef HAVE_TIME_H
|
||||||
|
#include <time.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SIGNAL_H
|
||||||
|
#include <signal.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_TIMERFD_H
|
||||||
|
#include <sys/timerfd.h>
|
||||||
|
#endif
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
#if defined(HAVE_TIMERFD_CREATE) && defined(HAVE_SYS_TIMERFD_H)
|
||||||
|
if (timerfd_create(CLOCK_REALTIME, 0) < 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
return 1;
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[rb__cv_timerfd_create_works=yes],
|
||||||
|
[rb__cv_timerfd_create_works=no])
|
||||||
|
])
|
||||||
|
case $rb__cv_timerfd_create_works in
|
||||||
|
yes) AC_DEFINE([USE_TIMERFD_CREATE], 1,
|
||||||
|
[Define to 1 if we can use timerfd_create(CLOCK_REALTIME,...)]);;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
|
||||||
|
|
32
libratbox/config.guess
vendored
32
libratbox/config.guess
vendored
|
@ -1,10 +1,10 @@
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Attempt to guess a canonical system name.
|
# Attempt to guess a canonical system name.
|
||||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
|
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
||||||
# Inc.
|
# Free Software Foundation, Inc.
|
||||||
|
|
||||||
timestamp='2007-07-22'
|
timestamp='2008-01-23'
|
||||||
|
|
||||||
# This file is free software; you can redistribute it and/or modify it
|
# This file is free software; you can redistribute it and/or modify it
|
||||||
# under the terms of the GNU General Public License as published by
|
# under the terms of the GNU General Public License as published by
|
||||||
|
@ -56,8 +56,8 @@ version="\
|
||||||
GNU config.guess ($timestamp)
|
GNU config.guess ($timestamp)
|
||||||
|
|
||||||
Originally written by Per Bothner.
|
Originally written by Per Bothner.
|
||||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
|
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
|
||||||
Free Software Foundation, Inc.
|
2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This is free software; see the source for copying conditions. There is NO
|
This is free software; see the source for copying conditions. There is NO
|
||||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||||
|
@ -532,7 +532,7 @@ EOF
|
||||||
echo rs6000-ibm-aix3.2
|
echo rs6000-ibm-aix3.2
|
||||||
fi
|
fi
|
||||||
exit ;;
|
exit ;;
|
||||||
*:AIX:*:[45])
|
*:AIX:*:[456])
|
||||||
IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
|
IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
|
||||||
if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
|
if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
|
||||||
IBM_ARCH=rs6000
|
IBM_ARCH=rs6000
|
||||||
|
@ -799,6 +799,9 @@ EOF
|
||||||
EM64T | authenticamd)
|
EM64T | authenticamd)
|
||||||
echo x86_64-unknown-interix${UNAME_RELEASE}
|
echo x86_64-unknown-interix${UNAME_RELEASE}
|
||||||
exit ;;
|
exit ;;
|
||||||
|
IA64)
|
||||||
|
echo ia64-unknown-interix${UNAME_RELEASE}
|
||||||
|
exit ;;
|
||||||
esac ;;
|
esac ;;
|
||||||
[345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
|
[345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
|
||||||
echo i${UNAME_MACHINE}-pc-mks
|
echo i${UNAME_MACHINE}-pc-mks
|
||||||
|
@ -833,7 +836,14 @@ EOF
|
||||||
echo ${UNAME_MACHINE}-pc-minix
|
echo ${UNAME_MACHINE}-pc-minix
|
||||||
exit ;;
|
exit ;;
|
||||||
arm*:Linux:*:*)
|
arm*:Linux:*:*)
|
||||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
eval $set_cc_for_build
|
||||||
|
if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
|
||||||
|
| grep -q __ARM_EABI__
|
||||||
|
then
|
||||||
|
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||||
|
else
|
||||||
|
echo ${UNAME_MACHINE}-unknown-linux-gnueabi
|
||||||
|
fi
|
||||||
exit ;;
|
exit ;;
|
||||||
avr32*:Linux:*:*)
|
avr32*:Linux:*:*)
|
||||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||||
|
@ -954,8 +964,8 @@ EOF
|
||||||
x86_64:Linux:*:*)
|
x86_64:Linux:*:*)
|
||||||
echo x86_64-unknown-linux-gnu
|
echo x86_64-unknown-linux-gnu
|
||||||
exit ;;
|
exit ;;
|
||||||
xtensa:Linux:*:*)
|
xtensa*:Linux:*:*)
|
||||||
echo xtensa-unknown-linux-gnu
|
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||||
exit ;;
|
exit ;;
|
||||||
i*86:Linux:*:*)
|
i*86:Linux:*:*)
|
||||||
# The BFD linker knows what the default object file format is, so
|
# The BFD linker knows what the default object file format is, so
|
||||||
|
@ -1474,9 +1484,9 @@ This script, last modified $timestamp, has failed to recognize
|
||||||
the operating system you are using. It is advised that you
|
the operating system you are using. It is advised that you
|
||||||
download the most up to date version of the config scripts from
|
download the most up to date version of the config scripts from
|
||||||
|
|
||||||
http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
|
http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
|
||||||
and
|
and
|
||||||
http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
|
http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
|
||||||
|
|
||||||
If the version you run ($0) is already up to date, please
|
If the version you run ($0) is already up to date, please
|
||||||
send the following data and any information you think might be
|
send the following data and any information you think might be
|
||||||
|
|
44
libratbox/config.sub
vendored
44
libratbox/config.sub
vendored
|
@ -1,10 +1,10 @@
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Configuration validation subroutine script.
|
# Configuration validation subroutine script.
|
||||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
|
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
||||||
# Inc.
|
# Free Software Foundation, Inc.
|
||||||
|
|
||||||
timestamp='2007-06-28'
|
timestamp='2008-01-16'
|
||||||
|
|
||||||
# This file is (in principle) common to ALL GNU software.
|
# This file is (in principle) common to ALL GNU software.
|
||||||
# The presence of a machine in this file suggests that SOME GNU software
|
# The presence of a machine in this file suggests that SOME GNU software
|
||||||
|
@ -72,8 +72,8 @@ Report bugs and patches to <config-patches@gnu.org>."
|
||||||
version="\
|
version="\
|
||||||
GNU config.sub ($timestamp)
|
GNU config.sub ($timestamp)
|
||||||
|
|
||||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
|
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
|
||||||
Free Software Foundation, Inc.
|
2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This is free software; see the source for copying conditions. There is NO
|
This is free software; see the source for copying conditions. There is NO
|
||||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||||
|
@ -369,10 +369,14 @@ case $basic_machine in
|
||||||
| v850-* | v850e-* | vax-* \
|
| v850-* | v850e-* | vax-* \
|
||||||
| we32k-* \
|
| we32k-* \
|
||||||
| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
|
| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
|
||||||
| xstormy16-* | xtensa-* \
|
| xstormy16-* | xtensa*-* \
|
||||||
| ymp-* \
|
| ymp-* \
|
||||||
| z8k-*)
|
| z8k-*)
|
||||||
;;
|
;;
|
||||||
|
# Recognize the basic CPU types without company name, with glob match.
|
||||||
|
xtensa*)
|
||||||
|
basic_machine=$basic_machine-unknown
|
||||||
|
;;
|
||||||
# Recognize the various machine names and aliases which stand
|
# Recognize the various machine names and aliases which stand
|
||||||
# for a CPU type and a company and sometimes even an OS.
|
# for a CPU type and a company and sometimes even an OS.
|
||||||
386bsd)
|
386bsd)
|
||||||
|
@ -443,6 +447,14 @@ case $basic_machine in
|
||||||
basic_machine=ns32k-sequent
|
basic_machine=ns32k-sequent
|
||||||
os=-dynix
|
os=-dynix
|
||||||
;;
|
;;
|
||||||
|
blackfin)
|
||||||
|
basic_machine=bfin-unknown
|
||||||
|
os=-linux
|
||||||
|
;;
|
||||||
|
blackfin-*)
|
||||||
|
basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||||
|
os=-linux
|
||||||
|
;;
|
||||||
c90)
|
c90)
|
||||||
basic_machine=c90-cray
|
basic_machine=c90-cray
|
||||||
os=-unicos
|
os=-unicos
|
||||||
|
@ -668,6 +680,14 @@ case $basic_machine in
|
||||||
basic_machine=m68k-isi
|
basic_machine=m68k-isi
|
||||||
os=-sysv
|
os=-sysv
|
||||||
;;
|
;;
|
||||||
|
m68knommu)
|
||||||
|
basic_machine=m68k-unknown
|
||||||
|
os=-linux
|
||||||
|
;;
|
||||||
|
m68knommu-*)
|
||||||
|
basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||||
|
os=-linux
|
||||||
|
;;
|
||||||
m88k-omron*)
|
m88k-omron*)
|
||||||
basic_machine=m88k-omron
|
basic_machine=m88k-omron
|
||||||
;;
|
;;
|
||||||
|
@ -813,6 +833,14 @@ case $basic_machine in
|
||||||
basic_machine=i860-intel
|
basic_machine=i860-intel
|
||||||
os=-osf
|
os=-osf
|
||||||
;;
|
;;
|
||||||
|
parisc)
|
||||||
|
basic_machine=hppa-unknown
|
||||||
|
os=-linux
|
||||||
|
;;
|
||||||
|
parisc-*)
|
||||||
|
basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||||
|
os=-linux
|
||||||
|
;;
|
||||||
pbd)
|
pbd)
|
||||||
basic_machine=sparc-tti
|
basic_machine=sparc-tti
|
||||||
;;
|
;;
|
||||||
|
@ -1021,6 +1049,10 @@ case $basic_machine in
|
||||||
basic_machine=tic6x-unknown
|
basic_machine=tic6x-unknown
|
||||||
os=-coff
|
os=-coff
|
||||||
;;
|
;;
|
||||||
|
tile*)
|
||||||
|
basic_machine=tile-unknown
|
||||||
|
os=-linux-gnu
|
||||||
|
;;
|
||||||
tx39)
|
tx39)
|
||||||
basic_machine=mipstx39-unknown
|
basic_machine=mipstx39-unknown
|
||||||
;;
|
;;
|
||||||
|
|
502
libratbox/configure
vendored
502
libratbox/configure
vendored
|
@ -2,7 +2,7 @@
|
||||||
# Guess values for system-dependent variables and create Makefiles.
|
# Guess values for system-dependent variables and create Makefiles.
|
||||||
# Generated by GNU Autoconf 2.61 for libratbox devel.
|
# Generated by GNU Autoconf 2.61 for libratbox devel.
|
||||||
#
|
#
|
||||||
# $Id: configure.ac 25689 2008-07-10 17:13:27Z androsyn $
|
# $Id: configure.ac 26168 2008-10-26 20:58:40Z androsyn $
|
||||||
#
|
#
|
||||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
|
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
|
||||||
# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||||
|
@ -855,9 +855,6 @@ RM
|
||||||
CP
|
CP
|
||||||
MV
|
MV
|
||||||
LN
|
LN
|
||||||
AR
|
|
||||||
LD
|
|
||||||
RANLIB
|
|
||||||
TOUCH
|
TOUCH
|
||||||
build
|
build
|
||||||
build_cpu
|
build_cpu
|
||||||
|
@ -869,6 +866,8 @@ host_vendor
|
||||||
host_os
|
host_os
|
||||||
LN_S
|
LN_S
|
||||||
ECHO
|
ECHO
|
||||||
|
AR
|
||||||
|
RANLIB
|
||||||
DSYMUTIL
|
DSYMUTIL
|
||||||
NMEDIT
|
NMEDIT
|
||||||
CPP
|
CPP
|
||||||
|
@ -883,7 +882,6 @@ F77
|
||||||
FFLAGS
|
FFLAGS
|
||||||
ac_ct_F77
|
ac_ct_F77
|
||||||
LIBTOOL
|
LIBTOOL
|
||||||
subdirs
|
|
||||||
MINGW_TRUE
|
MINGW_TRUE
|
||||||
MINGW_FALSE
|
MINGW_FALSE
|
||||||
NEED_CRYPT_TRUE
|
NEED_CRYPT_TRUE
|
||||||
|
@ -919,7 +917,7 @@ FFLAGS
|
||||||
PKG_CONFIG
|
PKG_CONFIG
|
||||||
GNUTLS_CFLAGS
|
GNUTLS_CFLAGS
|
||||||
GNUTLS_LIBS'
|
GNUTLS_LIBS'
|
||||||
ac_subdirs_all='libltdl'
|
|
||||||
|
|
||||||
# Initialize some variables set by options.
|
# Initialize some variables set by options.
|
||||||
ac_init_help=
|
ac_init_help=
|
||||||
|
@ -1616,7 +1614,7 @@ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
|
||||||
This configure script is free software; the Free Software Foundation
|
This configure script is free software; the Free Software Foundation
|
||||||
gives unlimited permission to copy, distribute and modify it.
|
gives unlimited permission to copy, distribute and modify it.
|
||||||
|
|
||||||
$Id: configure.ac 25689 2008-07-10 17:13:27Z androsyn $
|
$Id: configure.ac 26168 2008-10-26 20:58:40Z androsyn $
|
||||||
_ACEOF
|
_ACEOF
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
@ -4853,126 +4851,6 @@ echo "${ECHO_T}no" >&6; }
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Extract the first word of "ar", so it can be a program name with args.
|
|
||||||
set dummy ar; ac_word=$2
|
|
||||||
{ echo "$as_me:$LINENO: checking for $ac_word" >&5
|
|
||||||
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
|
|
||||||
if test "${ac_cv_path_AR+set}" = set; then
|
|
||||||
echo $ECHO_N "(cached) $ECHO_C" >&6
|
|
||||||
else
|
|
||||||
case $AR in
|
|
||||||
[\\/]* | ?:[\\/]*)
|
|
||||||
ac_cv_path_AR="$AR" # Let the user override the test with a path.
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
|
||||||
for as_dir in $PATH
|
|
||||||
do
|
|
||||||
IFS=$as_save_IFS
|
|
||||||
test -z "$as_dir" && as_dir=.
|
|
||||||
for ac_exec_ext in '' $ac_executable_extensions; do
|
|
||||||
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
|
|
||||||
ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext"
|
|
||||||
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
|
|
||||||
break 2
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
done
|
|
||||||
IFS=$as_save_IFS
|
|
||||||
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
AR=$ac_cv_path_AR
|
|
||||||
if test -n "$AR"; then
|
|
||||||
{ echo "$as_me:$LINENO: result: $AR" >&5
|
|
||||||
echo "${ECHO_T}$AR" >&6; }
|
|
||||||
else
|
|
||||||
{ echo "$as_me:$LINENO: result: no" >&5
|
|
||||||
echo "${ECHO_T}no" >&6; }
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# Extract the first word of "ld", so it can be a program name with args.
|
|
||||||
set dummy ld; ac_word=$2
|
|
||||||
{ echo "$as_me:$LINENO: checking for $ac_word" >&5
|
|
||||||
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
|
|
||||||
if test "${ac_cv_path_LD+set}" = set; then
|
|
||||||
echo $ECHO_N "(cached) $ECHO_C" >&6
|
|
||||||
else
|
|
||||||
case $LD in
|
|
||||||
[\\/]* | ?:[\\/]*)
|
|
||||||
ac_cv_path_LD="$LD" # Let the user override the test with a path.
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
|
||||||
for as_dir in $PATH
|
|
||||||
do
|
|
||||||
IFS=$as_save_IFS
|
|
||||||
test -z "$as_dir" && as_dir=.
|
|
||||||
for ac_exec_ext in '' $ac_executable_extensions; do
|
|
||||||
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
|
|
||||||
ac_cv_path_LD="$as_dir/$ac_word$ac_exec_ext"
|
|
||||||
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
|
|
||||||
break 2
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
done
|
|
||||||
IFS=$as_save_IFS
|
|
||||||
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
LD=$ac_cv_path_LD
|
|
||||||
if test -n "$LD"; then
|
|
||||||
{ echo "$as_me:$LINENO: result: $LD" >&5
|
|
||||||
echo "${ECHO_T}$LD" >&6; }
|
|
||||||
else
|
|
||||||
{ echo "$as_me:$LINENO: result: no" >&5
|
|
||||||
echo "${ECHO_T}no" >&6; }
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# Extract the first word of "ranlib", so it can be a program name with args.
|
|
||||||
set dummy ranlib; ac_word=$2
|
|
||||||
{ echo "$as_me:$LINENO: checking for $ac_word" >&5
|
|
||||||
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
|
|
||||||
if test "${ac_cv_path_RANLIB+set}" = set; then
|
|
||||||
echo $ECHO_N "(cached) $ECHO_C" >&6
|
|
||||||
else
|
|
||||||
case $RANLIB in
|
|
||||||
[\\/]* | ?:[\\/]*)
|
|
||||||
ac_cv_path_RANLIB="$RANLIB" # Let the user override the test with a path.
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
|
||||||
for as_dir in $PATH
|
|
||||||
do
|
|
||||||
IFS=$as_save_IFS
|
|
||||||
test -z "$as_dir" && as_dir=.
|
|
||||||
for ac_exec_ext in '' $ac_executable_extensions; do
|
|
||||||
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
|
|
||||||
ac_cv_path_RANLIB="$as_dir/$ac_word$ac_exec_ext"
|
|
||||||
echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
|
|
||||||
break 2
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
done
|
|
||||||
IFS=$as_save_IFS
|
|
||||||
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
RANLIB=$ac_cv_path_RANLIB
|
|
||||||
if test -n "$RANLIB"; then
|
|
||||||
{ echo "$as_me:$LINENO: result: $RANLIB" >&5
|
|
||||||
echo "${ECHO_T}$RANLIB" >&6; }
|
|
||||||
else
|
|
||||||
{ echo "$as_me:$LINENO: result: no" >&5
|
|
||||||
echo "${ECHO_T}no" >&6; }
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# Extract the first word of "touch", so it can be a program name with args.
|
# Extract the first word of "touch", so it can be a program name with args.
|
||||||
set dummy touch; ac_word=$2
|
set dummy touch; ac_word=$2
|
||||||
{ echo "$as_me:$LINENO: checking for $ac_word" >&5
|
{ echo "$as_me:$LINENO: checking for $ac_word" >&5
|
||||||
|
@ -5617,7 +5495,7 @@ ia64-*-hpux*)
|
||||||
;;
|
;;
|
||||||
*-*-irix6*)
|
*-*-irix6*)
|
||||||
# Find out which ABI we are using.
|
# Find out which ABI we are using.
|
||||||
echo '#line 5620 "configure"' > conftest.$ac_ext
|
echo '#line 5498 "configure"' > conftest.$ac_ext
|
||||||
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
|
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
|
||||||
(eval $ac_compile) 2>&5
|
(eval $ac_compile) 2>&5
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
|
@ -8669,11 +8547,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:8672: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:8550: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>conftest.err)
|
(eval "$lt_compile" 2>conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat conftest.err >&5
|
cat conftest.err >&5
|
||||||
echo "$as_me:8676: \$? = $ac_status" >&5
|
echo "$as_me:8554: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s "$ac_outfile"; then
|
if (exit $ac_status) && test -s "$ac_outfile"; then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
# So say no if there are warnings other than the usual output.
|
# So say no if there are warnings other than the usual output.
|
||||||
|
@ -8959,11 +8837,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:8962: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:8840: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>conftest.err)
|
(eval "$lt_compile" 2>conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat conftest.err >&5
|
cat conftest.err >&5
|
||||||
echo "$as_me:8966: \$? = $ac_status" >&5
|
echo "$as_me:8844: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s "$ac_outfile"; then
|
if (exit $ac_status) && test -s "$ac_outfile"; then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
# So say no if there are warnings other than the usual output.
|
# So say no if there are warnings other than the usual output.
|
||||||
|
@ -9063,11 +8941,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:9066: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:8944: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>out/conftest.err)
|
(eval "$lt_compile" 2>out/conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat out/conftest.err >&5
|
cat out/conftest.err >&5
|
||||||
echo "$as_me:9070: \$? = $ac_status" >&5
|
echo "$as_me:8948: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
||||||
then
|
then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
|
@ -11440,7 +11318,7 @@ else
|
||||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
||||||
lt_status=$lt_dlunknown
|
lt_status=$lt_dlunknown
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 11443 "configure"
|
#line 11321 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
|
|
||||||
#if HAVE_DLFCN_H
|
#if HAVE_DLFCN_H
|
||||||
|
@ -11540,7 +11418,7 @@ else
|
||||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
||||||
lt_status=$lt_dlunknown
|
lt_status=$lt_dlunknown
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 11543 "configure"
|
#line 11421 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
|
|
||||||
#if HAVE_DLFCN_H
|
#if HAVE_DLFCN_H
|
||||||
|
@ -13941,11 +13819,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:13944: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:13822: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>conftest.err)
|
(eval "$lt_compile" 2>conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat conftest.err >&5
|
cat conftest.err >&5
|
||||||
echo "$as_me:13948: \$? = $ac_status" >&5
|
echo "$as_me:13826: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s "$ac_outfile"; then
|
if (exit $ac_status) && test -s "$ac_outfile"; then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
# So say no if there are warnings other than the usual output.
|
# So say no if there are warnings other than the usual output.
|
||||||
|
@ -14045,11 +13923,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:14048: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:13926: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>out/conftest.err)
|
(eval "$lt_compile" 2>out/conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat out/conftest.err >&5
|
cat out/conftest.err >&5
|
||||||
echo "$as_me:14052: \$? = $ac_status" >&5
|
echo "$as_me:13930: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
||||||
then
|
then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
|
@ -15643,11 +15521,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:15646: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:15524: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>conftest.err)
|
(eval "$lt_compile" 2>conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat conftest.err >&5
|
cat conftest.err >&5
|
||||||
echo "$as_me:15650: \$? = $ac_status" >&5
|
echo "$as_me:15528: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s "$ac_outfile"; then
|
if (exit $ac_status) && test -s "$ac_outfile"; then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
# So say no if there are warnings other than the usual output.
|
# So say no if there are warnings other than the usual output.
|
||||||
|
@ -15747,11 +15625,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:15750: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:15628: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>out/conftest.err)
|
(eval "$lt_compile" 2>out/conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat out/conftest.err >&5
|
cat out/conftest.err >&5
|
||||||
echo "$as_me:15754: \$? = $ac_status" >&5
|
echo "$as_me:15632: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
||||||
then
|
then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
|
@ -17967,11 +17845,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:17970: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:17848: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>conftest.err)
|
(eval "$lt_compile" 2>conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat conftest.err >&5
|
cat conftest.err >&5
|
||||||
echo "$as_me:17974: \$? = $ac_status" >&5
|
echo "$as_me:17852: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s "$ac_outfile"; then
|
if (exit $ac_status) && test -s "$ac_outfile"; then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
# So say no if there are warnings other than the usual output.
|
# So say no if there are warnings other than the usual output.
|
||||||
|
@ -18257,11 +18135,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:18260: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:18138: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>conftest.err)
|
(eval "$lt_compile" 2>conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat conftest.err >&5
|
cat conftest.err >&5
|
||||||
echo "$as_me:18264: \$? = $ac_status" >&5
|
echo "$as_me:18142: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s "$ac_outfile"; then
|
if (exit $ac_status) && test -s "$ac_outfile"; then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
# So say no if there are warnings other than the usual output.
|
# So say no if there are warnings other than the usual output.
|
||||||
|
@ -18361,11 +18239,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:18364: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:18242: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>out/conftest.err)
|
(eval "$lt_compile" 2>out/conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat out/conftest.err >&5
|
cat out/conftest.err >&5
|
||||||
echo "$as_me:18368: \$? = $ac_status" >&5
|
echo "$as_me:18246: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
||||||
then
|
then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
|
@ -21054,10 +20932,6 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool'
|
||||||
|
|
||||||
LIBTOOL="$LIBTOOL --silent"
|
LIBTOOL="$LIBTOOL --silent"
|
||||||
|
|
||||||
subdirs="$subdirs libltdl"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
case "$host_os" in
|
case "$host_os" in
|
||||||
*cygwin*)
|
*cygwin*)
|
||||||
|
|
||||||
|
@ -21350,6 +21224,16 @@ echo "$as_me: error: ** MinGW and no winsock2.h. I give up." >&2;}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define HAVE_WINSOCK2_H 1
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define HAVE_WINSOCK_H 1
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
LIBS="$LIBS -lws2_32 -liphlpapi"
|
LIBS="$LIBS -lws2_32 -liphlpapi"
|
||||||
is_mingw="yes"
|
is_mingw="yes"
|
||||||
;;
|
;;
|
||||||
|
@ -21374,7 +21258,7 @@ fi
|
||||||
|
|
||||||
|
|
||||||
# backwards support for IRC_CFLAGS
|
# backwards support for IRC_CFLAGS
|
||||||
CFLAGS="$IRC_CFLAGS $CFLAGS -O0 -Wall"
|
CFLAGS="$IRC_CFLAGS $CFLAGS -Wall"
|
||||||
|
|
||||||
if test "$libexecdir" = '${exec_prefix}/libexec' &&
|
if test "$libexecdir" = '${exec_prefix}/libexec' &&
|
||||||
test "$localstatedir" = '${prefix}/var'; then
|
test "$localstatedir" = '${prefix}/var'; then
|
||||||
|
@ -21805,7 +21689,8 @@ fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for ac_header in crypt.h unistd.h sys/socket.h sys/stat.h sys/time.h time.h netinet/in.h arpa/inet.h errno.h sys/uio.h spawn.h sys/poll.h sys/epoll.h sys/select.h sys/devpoll.h sys/event.h port.h signal.h sys/signalfd.h
|
|
||||||
|
for ac_header in crypt.h unistd.h sys/socket.h sys/stat.h sys/time.h time.h netinet/in.h arpa/inet.h errno.h sys/uio.h spawn.h sys/poll.h sys/epoll.h sys/select.h sys/devpoll.h sys/event.h port.h signal.h sys/signalfd.h sys/timerfd.h
|
||||||
do
|
do
|
||||||
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
|
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
|
||||||
if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
|
if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
|
||||||
|
@ -22293,9 +22178,15 @@ cat confdefs.h >>conftest.$ac_ext
|
||||||
cat >>conftest.$ac_ext <<_ACEOF
|
cat >>conftest.$ac_ext <<_ACEOF
|
||||||
/* end confdefs.h. */
|
/* end confdefs.h. */
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#endif
|
||||||
int getpeername (int, $arg2 *, $t *);
|
int getpeername (int, $arg2 *, $t *);
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -22342,9 +22233,9 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||||
done
|
done
|
||||||
|
|
||||||
if test "x$rb_socklen_t" = x; then
|
if test "x$rb_socklen_t" = x; then
|
||||||
{ { echo "$as_me:$LINENO: error: Cannot find a type to use in place of socklen_t" >&5
|
{ echo "$as_me:$LINENO: WARNING: Cannot find a type to use in place of socklen_t using int" >&5
|
||||||
echo "$as_me: error: Cannot find a type to use in place of socklen_t" >&2;}
|
echo "$as_me: WARNING: Cannot find a type to use in place of socklen_t using int" >&2;}
|
||||||
{ (exit 1); exit 1; }; }
|
rb_socklen_t=int
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
@ -22936,7 +22827,8 @@ fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for ac_func in socketpair gettimeofday writev sendmsg gmtime_r strtok_r usleep posix_spawn strlcpy strlcat strnlen fstat signalfd select poll kevent port_create epoll_ctl arc4random getrusage
|
|
||||||
|
for ac_func in socketpair gettimeofday writev sendmsg gmtime_r strtok_r usleep posix_spawn strlcpy strlcat strnlen fstat signalfd select poll kevent port_create epoll_ctl arc4random getrusage timerfd_create
|
||||||
do
|
do
|
||||||
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
||||||
{ echo "$as_me:$LINENO: checking for $ac_func" >&5
|
{ echo "$as_me:$LINENO: checking for $ac_func" >&5
|
||||||
|
@ -23294,6 +23186,95 @@ _ACEOF
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
{ echo "$as_me:$LINENO: checking for a working timerfd_create(CLOCK_REALTIME)" >&5
|
||||||
|
echo $ECHO_N "checking for a working timerfd_create(CLOCK_REALTIME)... $ECHO_C" >&6; }
|
||||||
|
if test "${rb__cv_timerfd_create_works+set}" = set; then
|
||||||
|
echo $ECHO_N "(cached) $ECHO_C" >&6
|
||||||
|
else
|
||||||
|
if test "$cross_compiling" = yes; then
|
||||||
|
{ { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
|
||||||
|
See \`config.log' for more details." >&5
|
||||||
|
echo "$as_me: error: cannot run test program while cross compiling
|
||||||
|
See \`config.log' for more details." >&2;}
|
||||||
|
{ (exit 1); exit 1; }; }
|
||||||
|
else
|
||||||
|
cat >conftest.$ac_ext <<_ACEOF
|
||||||
|
/* confdefs.h. */
|
||||||
|
_ACEOF
|
||||||
|
cat confdefs.h >>conftest.$ac_ext
|
||||||
|
cat >>conftest.$ac_ext <<_ACEOF
|
||||||
|
/* end confdefs.h. */
|
||||||
|
|
||||||
|
#ifdef HAVE_TIME_H
|
||||||
|
#include <time.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SIGNAL_H
|
||||||
|
#include <signal.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_TIMERFD_H
|
||||||
|
#include <sys/timerfd.h>
|
||||||
|
#endif
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
#if defined(HAVE_TIMERFD_CREATE) && defined(HAVE_SYS_TIMERFD_H)
|
||||||
|
if (timerfd_create(CLOCK_REALTIME, 0) < 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
return 1;
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
_ACEOF
|
||||||
|
rm -f conftest$ac_exeext
|
||||||
|
if { (ac_try="$ac_link"
|
||||||
|
case "(($ac_try" in
|
||||||
|
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
|
||||||
|
*) ac_try_echo=$ac_try;;
|
||||||
|
esac
|
||||||
|
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
|
||||||
|
(eval "$ac_link") 2>&5
|
||||||
|
ac_status=$?
|
||||||
|
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||||
|
(exit $ac_status); } && { ac_try='./conftest$ac_exeext'
|
||||||
|
{ (case "(($ac_try" in
|
||||||
|
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
|
||||||
|
*) ac_try_echo=$ac_try;;
|
||||||
|
esac
|
||||||
|
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
|
||||||
|
(eval "$ac_try") 2>&5
|
||||||
|
ac_status=$?
|
||||||
|
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||||
|
(exit $ac_status); }; }; then
|
||||||
|
rb__cv_timerfd_create_works=yes
|
||||||
|
else
|
||||||
|
echo "$as_me: program exited with status $ac_status" >&5
|
||||||
|
echo "$as_me: failed program was:" >&5
|
||||||
|
sed 's/^/| /' conftest.$ac_ext >&5
|
||||||
|
|
||||||
|
( exit $ac_status )
|
||||||
|
rb__cv_timerfd_create_works=no
|
||||||
|
fi
|
||||||
|
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
fi
|
||||||
|
{ echo "$as_me:$LINENO: result: $rb__cv_timerfd_create_works" >&5
|
||||||
|
echo "${ECHO_T}$rb__cv_timerfd_create_works" >&6; }
|
||||||
|
case $rb__cv_timerfd_create_works in
|
||||||
|
yes)
|
||||||
|
cat >>confdefs.h <<\_ACEOF
|
||||||
|
#define USE_TIMERFD_CREATE 1
|
||||||
|
_ACEOF
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
|
# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
|
||||||
# for constant arguments. Useless!
|
# for constant arguments. Useless!
|
||||||
|
@ -24783,7 +24764,6 @@ fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
if test "$cf_enable_openssl" != no; then
|
if test "$cf_enable_openssl" != no; then
|
||||||
CPPFLAGS="$CPPFLAGS $SSL_LIBS"
|
CPPFLAGS="$CPPFLAGS $SSL_LIBS"
|
||||||
{ echo "$as_me:$LINENO: checking for SSL_read in -lssl" >&5
|
{ echo "$as_me:$LINENO: checking for SSL_read in -lssl" >&5
|
||||||
|
@ -24848,7 +24828,7 @@ fi
|
||||||
{ echo "$as_me:$LINENO: result: $ac_cv_lib_ssl_SSL_read" >&5
|
{ echo "$as_me:$LINENO: result: $ac_cv_lib_ssl_SSL_read" >&5
|
||||||
echo "${ECHO_T}$ac_cv_lib_ssl_SSL_read" >&6; }
|
echo "${ECHO_T}$ac_cv_lib_ssl_SSL_read" >&6; }
|
||||||
if test $ac_cv_lib_ssl_SSL_read = yes; then
|
if test $ac_cv_lib_ssl_SSL_read = yes; then
|
||||||
SSL_LIBS="-lssl -lcrypto"
|
SSL_LIBS="$SSL_LIBS -lssl -lcrypto"
|
||||||
else
|
else
|
||||||
cf_enable_openssl=no
|
cf_enable_openssl=no
|
||||||
fi
|
fi
|
||||||
|
@ -26054,9 +26034,6 @@ RM!$RM$ac_delim
|
||||||
CP!$CP$ac_delim
|
CP!$CP$ac_delim
|
||||||
MV!$MV$ac_delim
|
MV!$MV$ac_delim
|
||||||
LN!$LN$ac_delim
|
LN!$LN$ac_delim
|
||||||
AR!$AR$ac_delim
|
|
||||||
LD!$LD$ac_delim
|
|
||||||
RANLIB!$RANLIB$ac_delim
|
|
||||||
TOUCH!$TOUCH$ac_delim
|
TOUCH!$TOUCH$ac_delim
|
||||||
build!$build$ac_delim
|
build!$build$ac_delim
|
||||||
build_cpu!$build_cpu$ac_delim
|
build_cpu!$build_cpu$ac_delim
|
||||||
|
@ -26065,6 +26042,9 @@ build_os!$build_os$ac_delim
|
||||||
host!$host$ac_delim
|
host!$host$ac_delim
|
||||||
host_cpu!$host_cpu$ac_delim
|
host_cpu!$host_cpu$ac_delim
|
||||||
host_vendor!$host_vendor$ac_delim
|
host_vendor!$host_vendor$ac_delim
|
||||||
|
host_os!$host_os$ac_delim
|
||||||
|
LN_S!$LN_S$ac_delim
|
||||||
|
ECHO!$ECHO$ac_delim
|
||||||
_ACEOF
|
_ACEOF
|
||||||
|
|
||||||
if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
|
if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
|
||||||
|
@ -26106,9 +26086,8 @@ _ACEOF
|
||||||
ac_delim='%!_!# '
|
ac_delim='%!_!# '
|
||||||
for ac_last_try in false false false false false :; do
|
for ac_last_try in false false false false false :; do
|
||||||
cat >conf$$subs.sed <<_ACEOF
|
cat >conf$$subs.sed <<_ACEOF
|
||||||
host_os!$host_os$ac_delim
|
AR!$AR$ac_delim
|
||||||
LN_S!$LN_S$ac_delim
|
RANLIB!$RANLIB$ac_delim
|
||||||
ECHO!$ECHO$ac_delim
|
|
||||||
DSYMUTIL!$DSYMUTIL$ac_delim
|
DSYMUTIL!$DSYMUTIL$ac_delim
|
||||||
NMEDIT!$NMEDIT$ac_delim
|
NMEDIT!$NMEDIT$ac_delim
|
||||||
CPP!$CPP$ac_delim
|
CPP!$CPP$ac_delim
|
||||||
|
@ -26123,7 +26102,6 @@ F77!$F77$ac_delim
|
||||||
FFLAGS!$FFLAGS$ac_delim
|
FFLAGS!$FFLAGS$ac_delim
|
||||||
ac_ct_F77!$ac_ct_F77$ac_delim
|
ac_ct_F77!$ac_ct_F77$ac_delim
|
||||||
LIBTOOL!$LIBTOOL$ac_delim
|
LIBTOOL!$LIBTOOL$ac_delim
|
||||||
subdirs!$subdirs$ac_delim
|
|
||||||
MINGW_TRUE!$MINGW_TRUE$ac_delim
|
MINGW_TRUE!$MINGW_TRUE$ac_delim
|
||||||
MINGW_FALSE!$MINGW_FALSE$ac_delim
|
MINGW_FALSE!$MINGW_FALSE$ac_delim
|
||||||
NEED_CRYPT_TRUE!$NEED_CRYPT_TRUE$ac_delim
|
NEED_CRYPT_TRUE!$NEED_CRYPT_TRUE$ac_delim
|
||||||
|
@ -26142,7 +26120,7 @@ LIBOBJS!$LIBOBJS$ac_delim
|
||||||
LTLIBOBJS!$LTLIBOBJS$ac_delim
|
LTLIBOBJS!$LTLIBOBJS$ac_delim
|
||||||
_ACEOF
|
_ACEOF
|
||||||
|
|
||||||
if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 34; then
|
if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 32; then
|
||||||
break
|
break
|
||||||
elif $ac_last_try; then
|
elif $ac_last_try; then
|
||||||
{ { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
|
{ { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
|
||||||
|
@ -26802,7 +26780,7 @@ fi
|
||||||
if test "x$rb_sockaddr_storage" = "xyes"; then
|
if test "x$rb_sockaddr_storage" = "xyes"; then
|
||||||
echo '#define rb_sockaddr_storage sockaddr_storage' >> $outfile
|
echo '#define rb_sockaddr_storage sockaddr_storage' >> $outfile
|
||||||
else
|
else
|
||||||
echo 'struct rb_sockaddr_storage { uint8_t _padding128; };' >> $outfile
|
echo 'struct rb_sockaddr_storage { uint8_t _padding[128]; };' >> $outfile
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cat >> $outfile <<\_______EOF
|
cat >> $outfile <<\_______EOF
|
||||||
|
@ -26850,186 +26828,6 @@ if test "$no_create" != yes; then
|
||||||
$ac_cs_success || { (exit 1); exit 1; }
|
$ac_cs_success || { (exit 1); exit 1; }
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#
|
|
||||||
# CONFIG_SUBDIRS section.
|
|
||||||
#
|
|
||||||
if test "$no_recursion" != yes; then
|
|
||||||
|
|
||||||
# Remove --cache-file and --srcdir arguments so they do not pile up.
|
|
||||||
ac_sub_configure_args=
|
|
||||||
ac_prev=
|
|
||||||
eval "set x $ac_configure_args"
|
|
||||||
shift
|
|
||||||
for ac_arg
|
|
||||||
do
|
|
||||||
if test -n "$ac_prev"; then
|
|
||||||
ac_prev=
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
case $ac_arg in
|
|
||||||
-cache-file | --cache-file | --cache-fil | --cache-fi \
|
|
||||||
| --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
|
|
||||||
ac_prev=cache_file ;;
|
|
||||||
-cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
|
|
||||||
| --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \
|
|
||||||
| --c=*)
|
|
||||||
;;
|
|
||||||
--config-cache | -C)
|
|
||||||
;;
|
|
||||||
-srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
|
|
||||||
ac_prev=srcdir ;;
|
|
||||||
-srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
|
|
||||||
;;
|
|
||||||
-prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
|
|
||||||
ac_prev=prefix ;;
|
|
||||||
-prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
case $ac_arg in
|
|
||||||
*\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
|
|
||||||
esac
|
|
||||||
ac_sub_configure_args="$ac_sub_configure_args '$ac_arg'" ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
# Always prepend --prefix to ensure using the same prefix
|
|
||||||
# in subdir configurations.
|
|
||||||
ac_arg="--prefix=$prefix"
|
|
||||||
case $ac_arg in
|
|
||||||
*\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
|
|
||||||
esac
|
|
||||||
ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args"
|
|
||||||
|
|
||||||
# Pass --silent
|
|
||||||
if test "$silent" = yes; then
|
|
||||||
ac_sub_configure_args="--silent $ac_sub_configure_args"
|
|
||||||
fi
|
|
||||||
|
|
||||||
ac_popdir=`pwd`
|
|
||||||
for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue
|
|
||||||
|
|
||||||
# Do not complain, so a configure script can configure whichever
|
|
||||||
# parts of a large source tree are present.
|
|
||||||
test -d "$srcdir/$ac_dir" || continue
|
|
||||||
|
|
||||||
ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)"
|
|
||||||
echo "$as_me:$LINENO: $ac_msg" >&5
|
|
||||||
echo "$ac_msg" >&6
|
|
||||||
{ as_dir="$ac_dir"
|
|
||||||
case $as_dir in #(
|
|
||||||
-*) as_dir=./$as_dir;;
|
|
||||||
esac
|
|
||||||
test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
|
|
||||||
as_dirs=
|
|
||||||
while :; do
|
|
||||||
case $as_dir in #(
|
|
||||||
*\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
|
|
||||||
*) as_qdir=$as_dir;;
|
|
||||||
esac
|
|
||||||
as_dirs="'$as_qdir' $as_dirs"
|
|
||||||
as_dir=`$as_dirname -- "$as_dir" ||
|
|
||||||
$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
|
||||||
X"$as_dir" : 'X\(//\)[^/]' \| \
|
|
||||||
X"$as_dir" : 'X\(//\)$' \| \
|
|
||||||
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
|
|
||||||
echo X"$as_dir" |
|
|
||||||
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)[^/].*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\).*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
s/.*/./; q'`
|
|
||||||
test -d "$as_dir" && break
|
|
||||||
done
|
|
||||||
test -z "$as_dirs" || eval "mkdir $as_dirs"
|
|
||||||
} || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
|
|
||||||
echo "$as_me: error: cannot create directory $as_dir" >&2;}
|
|
||||||
{ (exit 1); exit 1; }; }; }
|
|
||||||
ac_builddir=.
|
|
||||||
|
|
||||||
case "$ac_dir" in
|
|
||||||
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
|
|
||||||
*)
|
|
||||||
ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
|
|
||||||
# A ".." for each directory in $ac_dir_suffix.
|
|
||||||
ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
|
|
||||||
case $ac_top_builddir_sub in
|
|
||||||
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
|
|
||||||
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
|
|
||||||
esac ;;
|
|
||||||
esac
|
|
||||||
ac_abs_top_builddir=$ac_pwd
|
|
||||||
ac_abs_builddir=$ac_pwd$ac_dir_suffix
|
|
||||||
# for backward compatibility:
|
|
||||||
ac_top_builddir=$ac_top_build_prefix
|
|
||||||
|
|
||||||
case $srcdir in
|
|
||||||
.) # We are building in place.
|
|
||||||
ac_srcdir=.
|
|
||||||
ac_top_srcdir=$ac_top_builddir_sub
|
|
||||||
ac_abs_top_srcdir=$ac_pwd ;;
|
|
||||||
[\\/]* | ?:[\\/]* ) # Absolute name.
|
|
||||||
ac_srcdir=$srcdir$ac_dir_suffix;
|
|
||||||
ac_top_srcdir=$srcdir
|
|
||||||
ac_abs_top_srcdir=$srcdir ;;
|
|
||||||
*) # Relative name.
|
|
||||||
ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
|
|
||||||
ac_top_srcdir=$ac_top_build_prefix$srcdir
|
|
||||||
ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
|
|
||||||
esac
|
|
||||||
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
|
|
||||||
|
|
||||||
|
|
||||||
cd "$ac_dir"
|
|
||||||
|
|
||||||
# Check for guested configure; otherwise get Cygnus style configure.
|
|
||||||
if test -f "$ac_srcdir/configure.gnu"; then
|
|
||||||
ac_sub_configure=$ac_srcdir/configure.gnu
|
|
||||||
elif test -f "$ac_srcdir/configure"; then
|
|
||||||
ac_sub_configure=$ac_srcdir/configure
|
|
||||||
elif test -f "$ac_srcdir/configure.in"; then
|
|
||||||
# This should be Cygnus configure.
|
|
||||||
ac_sub_configure=$ac_aux_dir/configure
|
|
||||||
else
|
|
||||||
{ echo "$as_me:$LINENO: WARNING: no configuration information is in $ac_dir" >&5
|
|
||||||
echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
|
|
||||||
ac_sub_configure=
|
|
||||||
fi
|
|
||||||
|
|
||||||
# The recursion is here.
|
|
||||||
if test -n "$ac_sub_configure"; then
|
|
||||||
# Make the cache file name correct relative to the subdirectory.
|
|
||||||
case $cache_file in
|
|
||||||
[\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;;
|
|
||||||
*) # Relative name.
|
|
||||||
ac_sub_cache_file=$ac_top_build_prefix$cache_file ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
{ echo "$as_me:$LINENO: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
|
|
||||||
echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
|
|
||||||
# The eval makes quoting arguments work.
|
|
||||||
eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \
|
|
||||||
--cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" ||
|
|
||||||
{ { echo "$as_me:$LINENO: error: $ac_sub_configure failed for $ac_dir" >&5
|
|
||||||
echo "$as_me: error: $ac_sub_configure failed for $ac_dir" >&2;}
|
|
||||||
{ (exit 1); exit 1; }; }
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd "$ac_popdir"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
echo
|
echo
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
dnl $Id: configure.ac 25689 2008-07-10 17:13:27Z androsyn $
|
dnl $Id: configure.ac 26168 2008-10-26 20:58:40Z androsyn $
|
||||||
dnl Process this file with autoconf to produce a configure script.
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
dnl TODO: clean up all the OpenSSL and shared module checking stuff;
|
dnl TODO: clean up all the OpenSSL and shared module checking stuff;
|
||||||
dnl the most major changes have already been made and it looks like
|
dnl the most major changes have already been made and it looks like
|
||||||
dnl said functions need to be just about as complex as they already are.
|
dnl said functions need to be just about as complex as they already are.
|
||||||
|
|
||||||
AC_PREREQ(2.60)
|
AC_PREREQ(2.61)
|
||||||
AUTOMAKE_OPTIONS = 1.10
|
AUTOMAKE_OPTIONS = 1.10
|
||||||
dnl Sneaky way to get an Id tag into the configure script
|
dnl Sneaky way to get an Id tag into the configure script
|
||||||
AC_COPYRIGHT([$Id: configure.ac 25689 2008-07-10 17:13:27Z androsyn $])
|
AC_COPYRIGHT([$Id: configure.ac 26168 2008-10-26 20:58:40Z androsyn $])
|
||||||
AC_INIT([libratbox],[devel])
|
AC_INIT([libratbox],[devel])
|
||||||
AM_INIT_AUTOMAKE(AC_PACKAGE_TARNAME, AC_PACKAGE_VERSION, -)
|
AM_INIT_AUTOMAKE(AC_PACKAGE_TARNAME, AC_PACKAGE_VERSION, -)
|
||||||
|
|
||||||
|
@ -50,9 +50,6 @@ AC_PATH_PROG(RM, rm)
|
||||||
AC_PATH_PROG(CP, cp)
|
AC_PATH_PROG(CP, cp)
|
||||||
AC_PATH_PROG(MV, mv)
|
AC_PATH_PROG(MV, mv)
|
||||||
AC_PATH_PROG(LN, ln)
|
AC_PATH_PROG(LN, ln)
|
||||||
AC_PATH_PROG(AR, ar)
|
|
||||||
AC_PATH_PROG(LD, ld)
|
|
||||||
AC_PATH_PROG(RANLIB, ranlib)
|
|
||||||
AC_PATH_PROG(TOUCH, touch)
|
AC_PATH_PROG(TOUCH, touch)
|
||||||
AC_LANG(C)
|
AC_LANG(C)
|
||||||
|
|
||||||
|
@ -60,9 +57,6 @@ AC_PROG_LIBTOOL
|
||||||
|
|
||||||
LIBTOOL="$LIBTOOL --silent"
|
LIBTOOL="$LIBTOOL --silent"
|
||||||
|
|
||||||
AC_CONFIG_SUBDIRS(libltdl)
|
|
||||||
|
|
||||||
|
|
||||||
case "$host_os" in
|
case "$host_os" in
|
||||||
*cygwin*)
|
*cygwin*)
|
||||||
AC_DEFINE_UNQUOTED(CYGWIN,1,[This is a Cygwin system])
|
AC_DEFINE_UNQUOTED(CYGWIN,1,[This is a Cygwin system])
|
||||||
|
@ -73,6 +67,8 @@ case "$host_os" in
|
||||||
AC_DEFINE_UNQUOTED(WINDOWS,1,[This is a Windows system])
|
AC_DEFINE_UNQUOTED(WINDOWS,1,[This is a Windows system])
|
||||||
AC_CHECK_HEADER(windows.h, , [AC_MSG_ERROR([** MinGW and no windows.h. I give up.])])
|
AC_CHECK_HEADER(windows.h, , [AC_MSG_ERROR([** MinGW and no windows.h. I give up.])])
|
||||||
AC_CHECK_HEADER(winsock2.h, , [AC_MSG_ERROR([** MinGW and no winsock2.h. I give up.])])
|
AC_CHECK_HEADER(winsock2.h, , [AC_MSG_ERROR([** MinGW and no winsock2.h. I give up.])])
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_WINSOCK2_H, 1, [Have WINSOCK2_H])
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_WINSOCK_H, 1, [Have WINSOCK_H])
|
||||||
LIBS="$LIBS -lws2_32 -liphlpapi"
|
LIBS="$LIBS -lws2_32 -liphlpapi"
|
||||||
is_mingw="yes"
|
is_mingw="yes"
|
||||||
;;
|
;;
|
||||||
|
@ -90,7 +86,7 @@ AM_CONDITIONAL([MINGW], [test "$is_mingw" = "yes"])
|
||||||
|
|
||||||
|
|
||||||
# backwards support for IRC_CFLAGS
|
# backwards support for IRC_CFLAGS
|
||||||
CFLAGS="$IRC_CFLAGS $CFLAGS -O0 -Wall"
|
CFLAGS="$IRC_CFLAGS $CFLAGS -Wall"
|
||||||
|
|
||||||
dnl use directory structure of cached as default (hack)
|
dnl use directory structure of cached as default (hack)
|
||||||
if test "$libexecdir" = '${exec_prefix}/libexec' &&
|
if test "$libexecdir" = '${exec_prefix}/libexec' &&
|
||||||
|
@ -108,7 +104,7 @@ AC_TYPE_UID_T
|
||||||
dnl Checks for header files.
|
dnl Checks for header files.
|
||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
|
|
||||||
AC_CHECK_HEADERS([crypt.h unistd.h sys/socket.h sys/stat.h sys/time.h time.h netinet/in.h arpa/inet.h errno.h sys/uio.h spawn.h sys/poll.h sys/epoll.h sys/select.h sys/devpoll.h sys/event.h port.h signal.h sys/signalfd.h])
|
AC_CHECK_HEADERS([crypt.h unistd.h sys/socket.h sys/stat.h sys/time.h time.h netinet/in.h arpa/inet.h errno.h sys/uio.h spawn.h sys/poll.h sys/epoll.h sys/select.h sys/devpoll.h sys/event.h port.h signal.h sys/signalfd.h sys/timerfd.h])
|
||||||
AC_HEADER_TIME
|
AC_HEADER_TIME
|
||||||
|
|
||||||
dnl Networking Functions
|
dnl Networking Functions
|
||||||
|
@ -140,9 +136,15 @@ AC_CHECK_TYPE([socklen_t], rb_socklen_t=socklen_t,[
|
||||||
for arg2 in "struct sockaddr" void; do
|
for arg2 in "struct sockaddr" void; do
|
||||||
for t in int size_t unsigned long "unsigned long"; do
|
for t in int size_t unsigned long "unsigned long"; do
|
||||||
AC_TRY_COMPILE([
|
AC_TRY_COMPILE([
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#endif
|
||||||
int getpeername (int, $arg2 *, $t *);
|
int getpeername (int, $arg2 *, $t *);
|
||||||
],[
|
],[
|
||||||
$t len;
|
$t len;
|
||||||
|
@ -155,7 +157,8 @@ getpeername(0,0,&len);
|
||||||
done
|
done
|
||||||
|
|
||||||
if test "x$rb_socklen_t" = x; then
|
if test "x$rb_socklen_t" = x; then
|
||||||
AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
|
AC_MSG_WARN([Cannot find a type to use in place of socklen_t using int])
|
||||||
|
rb_socklen_t=int
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
AC_MSG_RESULT($rb_socklen_t)],
|
AC_MSG_RESULT($rb_socklen_t)],
|
||||||
|
@ -224,11 +227,12 @@ AC_CHECK_TYPE([sa_family_t], [],
|
||||||
|
|
||||||
|
|
||||||
dnl check for various functions...
|
dnl check for various functions...
|
||||||
AC_CHECK_FUNCS([socketpair gettimeofday writev sendmsg gmtime_r strtok_r usleep posix_spawn strlcpy strlcat strnlen fstat signalfd select poll kevent port_create epoll_ctl arc4random getrusage])
|
AC_CHECK_FUNCS([socketpair gettimeofday writev sendmsg gmtime_r strtok_r usleep posix_spawn strlcpy strlcat strnlen fstat signalfd select poll kevent port_create epoll_ctl arc4random getrusage timerfd_create])
|
||||||
|
|
||||||
AC_SEARCH_LIBS(nanosleep, rt posix4, AC_DEFINE(HAVE_NANOSLEEP, 1, [Define if you have nanosleep]))
|
AC_SEARCH_LIBS(nanosleep, rt posix4, AC_DEFINE(HAVE_NANOSLEEP, 1, [Define if you have nanosleep]))
|
||||||
AC_SEARCH_LIBS(timer_create, rt, AC_DEFINE(HAVE_TIMER_CREATE, 1, [Define if you have timer_create]))
|
AC_SEARCH_LIBS(timer_create, rt, AC_DEFINE(HAVE_TIMER_CREATE, 1, [Define if you have timer_create]))
|
||||||
RB_CHECK_TIMER_CREATE
|
RB_CHECK_TIMER_CREATE
|
||||||
|
RB_CHECK_TIMERFD_CREATE
|
||||||
|
|
||||||
AC_FUNC_ALLOCA
|
AC_FUNC_ALLOCA
|
||||||
AC_FUNC_VFORK
|
AC_FUNC_VFORK
|
||||||
|
@ -343,11 +347,10 @@ if test "$cf_enable_openssl" != no; then
|
||||||
[cf_enable_openssl=no])
|
[cf_enable_openssl=no])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
if test "$cf_enable_openssl" != no; then
|
if test "$cf_enable_openssl" != no; then
|
||||||
CPPFLAGS="$CPPFLAGS $SSL_LIBS"
|
CPPFLAGS="$CPPFLAGS $SSL_LIBS"
|
||||||
AC_CHECK_LIB(ssl, SSL_read,
|
AC_CHECK_LIB(ssl, SSL_read,
|
||||||
[SSL_LIBS="-lssl -lcrypto"],
|
[SSL_LIBS="$SSL_LIBS -lssl -lcrypto"],
|
||||||
[cf_enable_openssl=no], [-lcrypto])
|
[cf_enable_openssl=no], [-lcrypto])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -557,7 +560,7 @@ fi
|
||||||
if test "x$rb_sockaddr_storage" = "xyes"; then
|
if test "x$rb_sockaddr_storage" = "xyes"; then
|
||||||
echo '#define rb_sockaddr_storage sockaddr_storage' >> $outfile
|
echo '#define rb_sockaddr_storage sockaddr_storage' >> $outfile
|
||||||
else
|
else
|
||||||
echo 'struct rb_sockaddr_storage { uint8_t _padding[128]; };' >> $outfile
|
echo 'struct rb_sockaddr_storage { uint8_t _padding[[128]]; };' >> $outfile
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cat >> $outfile <<\_______EOF
|
cat >> $outfile <<\_______EOF
|
||||||
|
@ -656,7 +659,7 @@ fi
|
||||||
AC_CONFIG_FILES( \
|
AC_CONFIG_FILES( \
|
||||||
src/Makefile \
|
src/Makefile \
|
||||||
Makefile \
|
Makefile \
|
||||||
libratbox.pc \
|
libratbox.pc \
|
||||||
)
|
)
|
||||||
|
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
|
@ -4,4 +4,4 @@
|
||||||
void arc4random_stir(void);
|
void arc4random_stir(void);
|
||||||
uint32_t arc4random(void);
|
uint32_t arc4random(void);
|
||||||
void arc4random_addrandom(uint8_t *dat, int datlen);
|
void arc4random_addrandom(uint8_t *dat, int datlen);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
#define FD_DESC_SZ 128 /* hostlen + comment */
|
#define FD_DESC_SZ 128 /* hostlen + comment */
|
||||||
|
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef _WIN32
|
||||||
#define rb_get_errno() do { errno = WSAGetLastError(); WSASetLastError(errno); } while(0)
|
#define rb_get_errno() do { errno = WSAGetLastError(); WSASetLastError(errno); } while(0)
|
||||||
#else
|
#else
|
||||||
#define rb_get_errno()
|
#define rb_get_errno()
|
||||||
|
@ -41,31 +41,31 @@
|
||||||
#define rb_hash_fd(x) ((x ^ (x >> RB_FD_HASH_BITS) ^ (x >> (RB_FD_HASH_BITS * 2))) & RB_FD_HASH_MASK)
|
#define rb_hash_fd(x) ((x ^ (x >> RB_FD_HASH_BITS) ^ (x >> (RB_FD_HASH_BITS * 2))) & RB_FD_HASH_MASK)
|
||||||
|
|
||||||
#ifdef HAVE_WRITEV
|
#ifdef HAVE_WRITEV
|
||||||
#ifndef UIO_MAXIOV
|
#ifndef UIO_MAXIOV
|
||||||
# if defined(__FreeBSD__) || defined(__APPLE__) || defined(__NetBSD__)
|
# if defined(__FreeBSD__) || defined(__APPLE__) || defined(__NetBSD__)
|
||||||
/* FreeBSD 4.7 defines it in sys/uio.h only if _KERNEL is specified */
|
/* FreeBSD 4.7 defines it in sys/uio.h only if _KERNEL is specified */
|
||||||
# define RB_UIO_MAXIOV 1024
|
# define RB_UIO_MAXIOV 1024
|
||||||
# elif defined(__sgi)
|
# elif defined(__sgi)
|
||||||
/* IRIX 6.5 has sysconf(_SC_IOV_MAX) which might return 512 or bigger */
|
/* IRIX 6.5 has sysconf(_SC_IOV_MAX) which might return 512 or bigger */
|
||||||
# define RB_UIO_MAXIOV 512
|
# define RB_UIO_MAXIOV 512
|
||||||
# elif defined(__sun)
|
# elif defined(__sun)
|
||||||
/* Solaris (and SunOS?) defines IOV_MAX instead */
|
/* Solaris (and SunOS?) defines IOV_MAX instead */
|
||||||
# ifndef IOV_MAX
|
# ifndef IOV_MAX
|
||||||
# define RB_UIO_MAXIOV 16
|
# define RB_UIO_MAXIOV 16
|
||||||
# else
|
# else
|
||||||
# define RB_UIO_MAXIOV IOV_MAX
|
# define RB_UIO_MAXIOV IOV_MAX
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# elif defined(IOV_MAX)
|
# elif defined(IOV_MAX)
|
||||||
# define RB_UIO_MAXIOV IOV_MAX
|
# define RB_UIO_MAXIOV IOV_MAX
|
||||||
# else
|
# else
|
||||||
# define RB_UIO_MAXIOV 16
|
# define RB_UIO_MAXIOV 16
|
||||||
# endif
|
# endif
|
||||||
#else
|
|
||||||
#define RB_UIO_MAXIOV UIO_MAXIOV
|
|
||||||
#endif
|
|
||||||
#else
|
#else
|
||||||
#define RB_UIO_MAXIOV 16
|
#define RB_UIO_MAXIOV UIO_MAXIOV
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define RB_UIO_MAXIOV 16
|
||||||
#endif
|
#endif
|
||||||
struct conndata
|
struct conndata
|
||||||
{
|
{
|
||||||
|
@ -83,7 +83,7 @@ struct acceptdata
|
||||||
struct rb_sockaddr_storage S;
|
struct rb_sockaddr_storage S;
|
||||||
rb_socklen_t addrlen;
|
rb_socklen_t addrlen;
|
||||||
ACCB *callback;
|
ACCB *callback;
|
||||||
ACPRE *precb;
|
ACPRE *precb;
|
||||||
void *data;
|
void *data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -119,12 +119,13 @@ struct _fde
|
||||||
unsigned long ssl_errno;
|
unsigned long ssl_errno;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void (*comm_event_cb_t)(void *);
|
typedef void (*comm_event_cb_t) (void *);
|
||||||
|
|
||||||
#ifdef USE_TIMER_CREATE
|
#ifdef USE_TIMER_CREATE
|
||||||
typedef struct timer_data {
|
typedef struct timer_data
|
||||||
timer_t td_timer_id;
|
{
|
||||||
comm_event_cb_t td_cb;
|
timer_t td_timer_id;
|
||||||
|
comm_event_cb_t td_cb;
|
||||||
void *td_udata;
|
void *td_udata;
|
||||||
int td_repeat;
|
int td_repeat;
|
||||||
} *comm_event_id;
|
} *comm_event_id;
|
||||||
|
@ -137,7 +138,7 @@ rb_find_fd(int fd)
|
||||||
{
|
{
|
||||||
rb_dlink_list *hlist;
|
rb_dlink_list *hlist;
|
||||||
rb_dlink_node *ptr;
|
rb_dlink_node *ptr;
|
||||||
|
|
||||||
if(rb_unlikely(fd < 0))
|
if(rb_unlikely(fd < 0))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -151,7 +152,7 @@ rb_find_fd(int fd)
|
||||||
rb_fde_t *F = ptr->data;
|
rb_fde_t *F = ptr->data;
|
||||||
if(F->fd == fd)
|
if(F->fd == fd)
|
||||||
return F;
|
return F;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,7 +162,7 @@ void rb_connect_callback(rb_fde_t *F, int status);
|
||||||
|
|
||||||
|
|
||||||
int rb_io_sched_event(struct ev_entry *ev, int when);
|
int rb_io_sched_event(struct ev_entry *ev, int when);
|
||||||
void rb_io_unsched_event(struct ev_entry *ev);
|
void rb_io_unsched_event(struct ev_entry *ev);
|
||||||
int rb_io_supports_event(void);
|
int rb_io_supports_event(void);
|
||||||
void rb_io_init_event(void);
|
void rb_io_init_event(void);
|
||||||
|
|
||||||
|
@ -175,7 +176,7 @@ void rb_epoll_init_event(void);
|
||||||
int rb_epoll_sched_event(struct ev_entry *event, int when);
|
int rb_epoll_sched_event(struct ev_entry *event, int when);
|
||||||
void rb_epoll_unsched_event(struct ev_entry *event);
|
void rb_epoll_unsched_event(struct ev_entry *event);
|
||||||
int rb_epoll_supports_event(void);
|
int rb_epoll_supports_event(void);
|
||||||
|
|
||||||
|
|
||||||
/* poll versions */
|
/* poll versions */
|
||||||
void rb_setselect_poll(rb_fde_t *F, unsigned int type, PF * handler, void *client_data);
|
void rb_setselect_poll(rb_fde_t *F, unsigned int type, PF * handler, void *client_data);
|
||||||
|
@ -230,4 +231,3 @@ void rb_setselect_win32(rb_fde_t *F, unsigned int type, PF * handler, void *clie
|
||||||
int rb_init_netio_win32(void);
|
int rb_init_netio_win32(void);
|
||||||
int rb_select_win32(long);
|
int rb_select_win32(long);
|
||||||
int rb_setup_fd_win32(rb_fde_t *F);
|
int rb_setup_fd_win32(rb_fde_t *F);
|
||||||
|
|
||||||
|
|
|
@ -6,12 +6,11 @@ int rb_init_prng(const char *path, prng_seed_t seed_type);
|
||||||
|
|
||||||
int rb_get_random(void *buf, size_t length);
|
int rb_get_random(void *buf, size_t length);
|
||||||
const char *rb_get_ssl_strerror(rb_fde_t *F);
|
const char *rb_get_ssl_strerror(rb_fde_t *F);
|
||||||
void rb_ssl_start_accepted(rb_fde_t *new_F, ACCB *cb, void *data, int timeout);
|
void rb_ssl_start_accepted(rb_fde_t *new_F, ACCB * cb, void *data, int timeout);
|
||||||
void rb_ssl_start_connected(rb_fde_t *F, CNCB *callback, void *data, int timeout);
|
void rb_ssl_start_connected(rb_fde_t *F, CNCB * callback, void *data, int timeout);
|
||||||
void rb_connect_tcp_ssl(rb_fde_t *F, struct sockaddr *dest, struct sockaddr *clocal, int socklen, CNCB *callback, void *data, int timeout);
|
void rb_connect_tcp_ssl(rb_fde_t *F, struct sockaddr *dest, struct sockaddr *clocal, int socklen,
|
||||||
|
CNCB * callback, void *data, int timeout);
|
||||||
void rb_ssl_accept_setup(rb_fde_t *F, rb_fde_t *new_F, struct sockaddr *st, int addrlen);
|
void rb_ssl_accept_setup(rb_fde_t *F, rb_fde_t *new_F, struct sockaddr *st, int addrlen);
|
||||||
void rb_ssl_shutdown(rb_fde_t *F);
|
void rb_ssl_shutdown(rb_fde_t *F);
|
||||||
ssize_t rb_ssl_read(rb_fde_t *F, void *buf, size_t count);
|
ssize_t rb_ssl_read(rb_fde_t *F, void *buf, size_t count);
|
||||||
ssize_t rb_ssl_write(rb_fde_t *F, const void *buf, size_t count);
|
ssize_t rb_ssl_write(rb_fde_t *F, const void *buf, size_t count);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -20,16 +20,15 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: event-int.h 24840 2008-01-03 19:42:17Z androsyn $
|
* $Id: event-int.h 25992 2008-09-03 00:20:22Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
struct ev_entry
|
struct ev_entry
|
||||||
{
|
{
|
||||||
rb_dlink_node node;
|
rb_dlink_node node;
|
||||||
EVH *func;
|
EVH *func;
|
||||||
void *arg;
|
void *arg;
|
||||||
const char *name;
|
char *name;
|
||||||
time_t frequency;
|
time_t frequency;
|
||||||
time_t when;
|
time_t when;
|
||||||
void *data;
|
void *data;
|
||||||
|
|
|
@ -165,6 +165,9 @@
|
||||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||||
#undef HAVE_SYS_STAT_H
|
#undef HAVE_SYS_STAT_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/timerfd.h> header file. */
|
||||||
|
#undef HAVE_SYS_TIMERFD_H
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
/* Define to 1 if you have the <sys/time.h> header file. */
|
||||||
#undef HAVE_SYS_TIME_H
|
#undef HAVE_SYS_TIME_H
|
||||||
|
|
||||||
|
@ -174,6 +177,9 @@
|
||||||
/* Define to 1 if you have the <sys/uio.h> header file. */
|
/* Define to 1 if you have the <sys/uio.h> header file. */
|
||||||
#undef HAVE_SYS_UIO_H
|
#undef HAVE_SYS_UIO_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `timerfd_create' function. */
|
||||||
|
#undef HAVE_TIMERFD_CREATE
|
||||||
|
|
||||||
/* Define if you have timer_create */
|
/* Define if you have timer_create */
|
||||||
#undef HAVE_TIMER_CREATE
|
#undef HAVE_TIMER_CREATE
|
||||||
|
|
||||||
|
@ -195,6 +201,12 @@
|
||||||
/* Define to 1 if you are on windows */
|
/* Define to 1 if you are on windows */
|
||||||
#undef HAVE_WIN32
|
#undef HAVE_WIN32
|
||||||
|
|
||||||
|
/* Have WINSOCK2_H */
|
||||||
|
#undef HAVE_WINSOCK2_H
|
||||||
|
|
||||||
|
/* Have WINSOCK_H */
|
||||||
|
#undef HAVE_WINSOCK_H
|
||||||
|
|
||||||
/* Define to 1 if `fork' works. */
|
/* Define to 1 if `fork' works. */
|
||||||
#undef HAVE_WORKING_FORK
|
#undef HAVE_WORKING_FORK
|
||||||
|
|
||||||
|
@ -257,6 +269,9 @@
|
||||||
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
|
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
|
||||||
#undef TIME_WITH_SYS_TIME
|
#undef TIME_WITH_SYS_TIME
|
||||||
|
|
||||||
|
/* Define to 1 if we can use timerfd_create(CLOCK_REALTIME,...) */
|
||||||
|
#undef USE_TIMERFD_CREATE
|
||||||
|
|
||||||
/* Define to 1 if we can use timer_create(CLOCK_REALTIME,...) */
|
/* Define to 1 if we can use timer_create(CLOCK_REALTIME,...) */
|
||||||
#undef USE_TIMER_CREATE
|
#undef USE_TIMER_CREATE
|
||||||
|
|
||||||
|
|
0
libratbox/include/libratbox_config.h_vms
Executable file → Normal file
0
libratbox/include/libratbox_config.h_vms
Executable file → Normal file
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* $Id: ratbox_lib.h 25375 2008-05-16 15:19:51Z androsyn $
|
* $Id: ratbox_lib.h 26052 2008-09-09 16:47:03Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef RB_LIB_H
|
#ifndef RB_LIB_H
|
||||||
|
@ -68,20 +68,19 @@ char *alloca();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef _WIN32
|
||||||
#include <process.h>
|
#include <process.h>
|
||||||
|
|
||||||
#ifndef MAXPATHLEN
|
#ifndef MAXPATHLEN
|
||||||
#define MAXPATHLEN 128
|
#define MAXPATHLEN 128
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef strerror
|
#ifdef strerror
|
||||||
#undef strerror
|
#undef strerror
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define strerror(x) wsock_strerror(x)
|
#define strerror(x) rb_strerror(x)
|
||||||
const char *wsock_strerror(int error);
|
char *rb_strerror(int error);
|
||||||
|
|
||||||
|
|
||||||
#define ENOBUFS WSAENOBUFS
|
#define ENOBUFS WSAENOBUFS
|
||||||
|
@ -96,18 +95,13 @@ const char *wsock_strerror(int error);
|
||||||
#define pipe(x) _pipe(x, 1024, O_BINARY)
|
#define pipe(x) _pipe(x, 1024, O_BINARY)
|
||||||
#define ioctl(x,y,z) ioctlsocket(x,y, (u_long *)z)
|
#define ioctl(x,y,z) ioctlsocket(x,y, (u_long *)z)
|
||||||
|
|
||||||
int setenv(const char *, const char *, int);
|
|
||||||
int kill(int pid, int sig);
|
|
||||||
#define WNOHANG 1
|
#define WNOHANG 1
|
||||||
pid_t waitpid(pid_t pid, int *status, int options);
|
|
||||||
pid_t getpid(void);
|
|
||||||
unsigned int geteuid(void);
|
|
||||||
|
|
||||||
#ifndef SIGKILL
|
#ifndef SIGKILL
|
||||||
#define SIGKILL SIGTERM
|
#define SIGKILL SIGTERM
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* WIN32 */
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -115,9 +109,8 @@ unsigned int geteuid(void);
|
||||||
#define HOSTIPLEN 53
|
#define HOSTIPLEN 53
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SOFT_ASSERT
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
#define lrb_assert(expr) do \
|
#define slrb_assert(expr) do \
|
||||||
if(rb_unlikely(!(expr))) { \
|
if(rb_unlikely(!(expr))) { \
|
||||||
rb_lib_log( \
|
rb_lib_log( \
|
||||||
"file: %s line: %d (%s): Assertion failed: (%s)", \
|
"file: %s line: %d (%s): Assertion failed: (%s)", \
|
||||||
|
@ -125,7 +118,7 @@ unsigned int geteuid(void);
|
||||||
} \
|
} \
|
||||||
while(0)
|
while(0)
|
||||||
#else
|
#else
|
||||||
#define lrb_assert(expr) do \
|
#define slrb_assert(expr) do \
|
||||||
if(rb_unlikely(!(expr))) { \
|
if(rb_unlikely(!(expr))) { \
|
||||||
rb_lib_log(L_MAIN, \
|
rb_lib_log(L_MAIN, \
|
||||||
"file: %s line: %d: Assertion failed: (%s)", \
|
"file: %s line: %d: Assertion failed: (%s)", \
|
||||||
|
@ -133,16 +126,19 @@ unsigned int geteuid(void);
|
||||||
} \
|
} \
|
||||||
while(0)
|
while(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef SOFT_ASSERT
|
||||||
|
#define lrb_assert(expr) slrb_assert(expr)
|
||||||
#else
|
#else
|
||||||
#define lrb_assert(expr) assert(expr)
|
#define lrb_assert(expr) do { slrb_assert(expr); assert(expr); } while(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RB_SOCKADDR_HAS_SA_LEN
|
#ifdef RB_SOCKADDR_HAS_SA_LEN
|
||||||
#define ss_len sa_len
|
#define ss_len sa_len
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define GET_SS_FAMILY(x) (((struct sockaddr *)(x))->sa_family)
|
#define GET_SS_FAMILY(x) (((const struct sockaddr *)(x))->sa_family)
|
||||||
|
#define SET_SS_FAMILY(x, y) ((((struct sockaddr *)(x))->sa_family) = y)
|
||||||
#ifdef RB_SOCKADDR_HAS_SA_LEN
|
#ifdef RB_SOCKADDR_HAS_SA_LEN
|
||||||
#define SET_SS_LEN(x, y) do { \
|
#define SET_SS_LEN(x, y) do { \
|
||||||
struct sockaddr *storage; \
|
struct sockaddr *storage; \
|
||||||
|
@ -201,8 +197,15 @@ char *rb_crypt(const char *, const char *);
|
||||||
|
|
||||||
unsigned char *rb_base64_encode(const unsigned char *str, int length);
|
unsigned char *rb_base64_encode(const unsigned char *str, int length);
|
||||||
unsigned char *rb_base64_decode(const unsigned char *str, int length, int *ret);
|
unsigned char *rb_base64_decode(const unsigned char *str, int length, int *ret);
|
||||||
|
int rb_kill(pid_t, int);
|
||||||
|
char *rb_strerror(int);
|
||||||
|
|
||||||
|
int rb_setenv(const char *, const char *, int);
|
||||||
|
int rb_kill(int pid, int sig);
|
||||||
|
|
||||||
|
pid_t rb_waitpid(pid_t pid, int *status, int options);
|
||||||
|
pid_t rb_getpid(void);
|
||||||
|
//unsigned int rb_geteuid(void);
|
||||||
|
|
||||||
#include <rb_tools.h>
|
#include <rb_tools.h>
|
||||||
#include <rb_memory.h>
|
#include <rb_memory.h>
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: rb_balloc.h 24324 2007-08-31 22:05:45Z androsyn $
|
* $Id: rb_balloc.h 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef RB_LIB_H
|
#ifndef RB_LIB_H
|
||||||
|
@ -34,17 +34,18 @@
|
||||||
|
|
||||||
struct rb_bh;
|
struct rb_bh;
|
||||||
typedef struct rb_bh rb_bh;
|
typedef struct rb_bh rb_bh;
|
||||||
typedef void rb_bh_usage_cb(size_t bused, size_t bfree, size_t bmemusage, size_t heapalloc, const char *desc, void *data);
|
typedef void rb_bh_usage_cb (size_t bused, size_t bfree, size_t bmemusage, size_t heapalloc,
|
||||||
|
const char *desc, void *data);
|
||||||
|
|
||||||
|
|
||||||
int rb_bh_free(rb_bh *, void *);
|
int rb_bh_free(rb_bh *, void *);
|
||||||
void *rb_bh_alloc(rb_bh *);
|
void *rb_bh_alloc(rb_bh *);
|
||||||
|
|
||||||
rb_bh *rb_bh_create(size_t elemsize, int elemsperblock, const char *desc);
|
rb_bh *rb_bh_create(size_t elemsize, int elemsperblock, const char *desc);
|
||||||
int rb_bh_destroy(rb_bh * bh);
|
int rb_bh_destroy(rb_bh *bh);
|
||||||
int rb_bh_gc(rb_bh *bh);
|
int rb_bh_gc(rb_bh *bh);
|
||||||
void rb_init_bh(void);
|
void rb_init_bh(void);
|
||||||
void rb_bh_usage(rb_bh * bh, size_t * bused, size_t * bfree, size_t * bmemusage, const char **desc);
|
void rb_bh_usage(rb_bh *bh, size_t *bused, size_t *bfree, size_t *bmemusage, const char **desc);
|
||||||
void rb_bh_usage_all(rb_bh_usage_cb *cb, void *data);
|
void rb_bh_usage_all(rb_bh_usage_cb *cb, void *data);
|
||||||
void rb_bh_total_usage(size_t *total_alloc, size_t *total_used);
|
void rb_bh_total_usage(size_t *total_alloc, size_t *total_used);
|
||||||
|
|
||||||
|
|
|
@ -21,18 +21,18 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: rb_commio.h 25693 2008-07-10 18:27:23Z androsyn $
|
* $Id: rb_commio.h 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef RB_LIB_H
|
#ifndef RB_LIB_H
|
||||||
# error "Do not use commio.h directly"
|
# error "Do not use commio.h directly"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef INCLUDED_commio_h
|
#ifndef INCLUDED_commio_h
|
||||||
#define INCLUDED_commio_h
|
#define INCLUDED_commio_h
|
||||||
|
|
||||||
|
|
||||||
struct sockaddr;
|
struct sockaddr;
|
||||||
struct _fde;
|
struct _fde;
|
||||||
typedef struct _fde rb_fde_t;
|
typedef struct _fde rb_fde_t;
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ enum
|
||||||
#define RB_FD_NONE 0x01
|
#define RB_FD_NONE 0x01
|
||||||
#define RB_FD_FILE 0x02
|
#define RB_FD_FILE 0x02
|
||||||
#define RB_FD_SOCKET 0x04
|
#define RB_FD_SOCKET 0x04
|
||||||
#ifndef WIN32
|
#ifndef _WIN32
|
||||||
#define RB_FD_PIPE 0x08
|
#define RB_FD_PIPE 0x08
|
||||||
#else
|
#else
|
||||||
#define RB_FD_PIPE RB_FD_SOCKET
|
#define RB_FD_PIPE RB_FD_SOCKET
|
||||||
|
@ -88,7 +88,7 @@ struct rb_iovec
|
||||||
|
|
||||||
void rb_fdlist_init(int closeall, int maxfds, size_t heapsize);
|
void rb_fdlist_init(int closeall, int maxfds, size_t heapsize);
|
||||||
|
|
||||||
rb_fde_t * rb_open(int, uint8_t, const char *);
|
rb_fde_t *rb_open(int, uint8_t, const char *);
|
||||||
void rb_close(rb_fde_t *);
|
void rb_close(rb_fde_t *);
|
||||||
void rb_dump_fd(DUMPCB *, void *xdata);
|
void rb_dump_fd(DUMPCB *, void *xdata);
|
||||||
void rb_note(rb_fde_t *, const char *);
|
void rb_note(rb_fde_t *, const char *);
|
||||||
|
@ -107,17 +107,16 @@ int rb_get_sockerr(rb_fde_t *);
|
||||||
|
|
||||||
void rb_settimeout(rb_fde_t *, time_t, PF *, void *);
|
void rb_settimeout(rb_fde_t *, time_t, PF *, void *);
|
||||||
void rb_checktimeouts(void *);
|
void rb_checktimeouts(void *);
|
||||||
void rb_connect_tcp(rb_fde_t *, struct sockaddr *,
|
void rb_connect_tcp(rb_fde_t *, struct sockaddr *, struct sockaddr *, int, CNCB *, void *, int);
|
||||||
struct sockaddr *, int, CNCB *, void *, int);
|
void rb_connect_tcp_ssl(rb_fde_t *, struct sockaddr *, struct sockaddr *, int, CNCB *, void *, int);
|
||||||
void rb_connect_tcp_ssl(rb_fde_t *, struct sockaddr *,
|
|
||||||
struct sockaddr *, int, CNCB *, void *, int);
|
|
||||||
int rb_connect_sockaddr(rb_fde_t *, struct sockaddr *addr, int len);
|
int rb_connect_sockaddr(rb_fde_t *, struct sockaddr *addr, int len);
|
||||||
|
|
||||||
const char *rb_errstr(int status);
|
const char *rb_errstr(int status);
|
||||||
rb_fde_t *rb_socket(int family, int sock_type, int proto, const char *note);
|
rb_fde_t *rb_socket(int family, int sock_type, int proto, const char *note);
|
||||||
int rb_socketpair(int family, int sock_type, int proto, rb_fde_t **F1, rb_fde_t **F2, const char *note);
|
int rb_socketpair(int family, int sock_type, int proto, rb_fde_t **F1, rb_fde_t **F2,
|
||||||
|
const char *note);
|
||||||
|
|
||||||
void rb_accept_tcp(rb_fde_t *, ACPRE *precb, ACCB *callback, void *data);
|
void rb_accept_tcp(rb_fde_t *, ACPRE * precb, ACCB * callback, void *data);
|
||||||
ssize_t rb_write(rb_fde_t *, const void *buf, int count);
|
ssize_t rb_write(rb_fde_t *, const void *buf, int count);
|
||||||
ssize_t rb_writev(rb_fde_t *, struct rb_iovec *vector, int count);
|
ssize_t rb_writev(rb_fde_t *, struct rb_iovec *vector, int count);
|
||||||
|
|
||||||
|
@ -145,7 +144,7 @@ const char *rb_get_ssl_strerror(rb_fde_t *F);
|
||||||
|
|
||||||
rb_fde_t *rb_get_fde(int fd);
|
rb_fde_t *rb_get_fde(int fd);
|
||||||
|
|
||||||
int rb_send_fd_buf(rb_fde_t *xF, rb_fde_t **F, int count, void *data, size_t datasize);
|
int rb_send_fd_buf(rb_fde_t *xF, rb_fde_t **F, int count, void *data, size_t datasize, pid_t pid);
|
||||||
int rb_recv_fd_buf(rb_fde_t *F, void *data, size_t datasize, rb_fde_t **xF, int count);
|
int rb_recv_fd_buf(rb_fde_t *F, void *data, size_t datasize, rb_fde_t **xF, int count);
|
||||||
|
|
||||||
void rb_set_type(rb_fde_t *F, uint8_t type);
|
void rb_set_type(rb_fde_t *F, uint8_t type);
|
||||||
|
@ -153,10 +152,11 @@ uint8_t rb_get_type(rb_fde_t *F);
|
||||||
|
|
||||||
const char *rb_get_iotype(void);
|
const char *rb_get_iotype(void);
|
||||||
|
|
||||||
typedef enum {
|
typedef enum
|
||||||
|
{
|
||||||
RB_PRNG_EGD,
|
RB_PRNG_EGD,
|
||||||
RB_PRNG_FILE,
|
RB_PRNG_FILE,
|
||||||
#ifdef WIN32
|
#ifdef _WIN32
|
||||||
RB_PRNGWIN32,
|
RB_PRNGWIN32,
|
||||||
#endif
|
#endif
|
||||||
RB_PRNG_DEFAULT,
|
RB_PRNG_DEFAULT,
|
||||||
|
@ -165,11 +165,15 @@ typedef enum {
|
||||||
int rb_init_prng(const char *path, prng_seed_t seed_type);
|
int rb_init_prng(const char *path, prng_seed_t seed_type);
|
||||||
int rb_get_random(void *buf, size_t len);
|
int rb_get_random(void *buf, size_t len);
|
||||||
int rb_get_pseudo_random(void *buf, size_t len);
|
int rb_get_pseudo_random(void *buf, size_t len);
|
||||||
void rb_ssl_start_accepted(rb_fde_t *new_F, ACCB *cb, void *data, int timeout);
|
void rb_ssl_start_accepted(rb_fde_t *new_F, ACCB * cb, void *data, int timeout);
|
||||||
void rb_ssl_start_connected(rb_fde_t *F, CNCB *callback, void *data, int timeout);
|
void rb_ssl_start_connected(rb_fde_t *F, CNCB * callback, void *data, int timeout);
|
||||||
int rb_supports_ssl(void);
|
int rb_supports_ssl(void);
|
||||||
|
|
||||||
unsigned int rb_ssl_handshake_count(rb_fde_t *F);
|
unsigned int rb_ssl_handshake_count(rb_fde_t *F);
|
||||||
void rb_ssl_clear_handshake_count(rb_fde_t *F);
|
void rb_ssl_clear_handshake_count(rb_fde_t *F);
|
||||||
|
|
||||||
|
|
||||||
|
int rb_pass_fd_to_process(rb_fde_t *, pid_t, rb_fde_t *);
|
||||||
|
rb_fde_t *rb_recv_fd(rb_fde_t *);
|
||||||
|
|
||||||
#endif /* INCLUDED_commio_h */
|
#endif /* INCLUDED_commio_h */
|
||||||
|
|
|
@ -21,11 +21,11 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: rb_event.h 25151 2008-03-28 17:19:12Z androsyn $
|
* $Id: rb_event.h 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef RB_LIB_H
|
#ifndef RB_LIB_H
|
||||||
# error "Do not use event.h directly"
|
# error "Do not use event.h directly"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef INCLUDED_event_h
|
#ifndef INCLUDED_event_h
|
||||||
|
@ -43,7 +43,7 @@ void rb_event_delete(struct ev_entry *);
|
||||||
void rb_event_find_delete(EVH * func, void *);
|
void rb_event_find_delete(EVH * func, void *);
|
||||||
void rb_event_update(struct ev_entry *, time_t freq);
|
void rb_event_update(struct ev_entry *, time_t freq);
|
||||||
void rb_set_back_events(time_t);
|
void rb_set_back_events(time_t);
|
||||||
void rb_dump_events(void (*func)(char *, void *), void *ptr);
|
void rb_dump_events(void (*func) (char *, void *), void *ptr);
|
||||||
void rb_run_event(struct ev_entry *);
|
void rb_run_event(struct ev_entry *);
|
||||||
time_t rb_event_next(void);
|
time_t rb_event_next(void);
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: rb_helper.h 24936 2008-01-14 20:43:23Z androsyn $
|
* $Id: rb_helper.h 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef RB_LIB_H
|
#ifndef RB_LIB_H
|
||||||
|
@ -36,25 +36,28 @@ typedef void rb_helper_cb(rb_helper *);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
rb_helper *rb_helper_start(const char *name, const char *fullpath, rb_helper_cb *read_cb, rb_helper_cb *error_cb);
|
rb_helper *rb_helper_start(const char *name, const char *fullpath, rb_helper_cb * read_cb,
|
||||||
|
rb_helper_cb * error_cb);
|
||||||
|
|
||||||
rb_helper *rb_helper_child(rb_helper_cb *read_cb, rb_helper_cb *error_cb,
|
rb_helper *rb_helper_child(rb_helper_cb * read_cb, rb_helper_cb * error_cb,
|
||||||
log_cb *ilog, restart_cb *irestart, die_cb *idie,
|
log_cb * ilog, restart_cb * irestart, die_cb * idie,
|
||||||
int maxcon, size_t lb_heap_size, size_t dh_size, size_t fd_heap_size);
|
int maxcon, size_t lb_heap_size, size_t dh_size, size_t fd_heap_size);
|
||||||
|
|
||||||
void rb_helper_restart(rb_helper *helper);
|
void rb_helper_restart(rb_helper *helper);
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
void rb_helper_write(rb_helper *helper, const char *format, ...) __attribute((format(printf, 2, 3)));
|
void
|
||||||
void rb_helper_write_queue(rb_helper *helper, const char *format, ...) __attribute((format(printf, 2, 3)));
|
rb_helper_write(rb_helper *helper, const char *format, ...)
|
||||||
|
__attribute((format(printf, 2, 3)));
|
||||||
|
void rb_helper_write_queue(rb_helper *helper, const char *format, ...)
|
||||||
|
__attribute((format(printf, 2, 3)));
|
||||||
#else
|
#else
|
||||||
void rb_helper_write(rb_helper *helper, const char *format, ...);
|
void rb_helper_write(rb_helper *helper, const char *format, ...);
|
||||||
void rb_helper_write_queue(rb_helper *helper, const char *format, ...);
|
void rb_helper_write_queue(rb_helper *helper, const char *format, ...);
|
||||||
#endif
|
#endif
|
||||||
void rb_helper_write_flush(rb_helper *helper);
|
void rb_helper_write_flush(rb_helper *helper);
|
||||||
|
|
||||||
void rb_helper_run(rb_helper *helper);
|
void rb_helper_run(rb_helper *helper);
|
||||||
void rb_helper_close(rb_helper *helper);
|
void rb_helper_close(rb_helper *helper);
|
||||||
int rb_helper_read(rb_helper *helper, void *buf, size_t bufsize);
|
int rb_helper_read(rb_helper *helper, void *buf, size_t bufsize);
|
||||||
void rb_helper_loop(rb_helper *helper, long delay);
|
void rb_helper_loop(rb_helper *helper, long delay);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -21,11 +21,11 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: rb_linebuf.h 25675 2008-07-06 04:13:05Z androsyn $
|
* $Id: rb_linebuf.h 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef RB_LIB_H
|
#ifndef RB_LIB_H
|
||||||
# error "Do not use linebuf.h directly"
|
# error "Do not use linebuf.h directly"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __LINEBUF_H__
|
#ifndef __LINEBUF_H__
|
||||||
|
@ -46,7 +46,7 @@ typedef struct _buf_line
|
||||||
{
|
{
|
||||||
char buf[BUF_DATA_SIZE + 2];
|
char buf[BUF_DATA_SIZE + 2];
|
||||||
uint8_t terminated; /* Whether we've terminated the buffer */
|
uint8_t terminated; /* Whether we've terminated the buffer */
|
||||||
uint8_t raw; /* Whether this linebuf may hold 8-bit data */
|
uint8_t raw; /* Whether this linebuf may hold 8-bit data */
|
||||||
int len; /* How much data we've got */
|
int len; /* How much data we've got */
|
||||||
int refcount; /* how many linked lists are we in? */
|
int refcount; /* how many linked lists are we in? */
|
||||||
} buf_line_t;
|
} buf_line_t;
|
||||||
|
@ -74,7 +74,7 @@ int rb_linebuf_parse(buf_head_t *, char *, int, int);
|
||||||
int rb_linebuf_get(buf_head_t *, char *, int, int, int);
|
int rb_linebuf_get(buf_head_t *, char *, int, int, int);
|
||||||
void rb_linebuf_putmsg(buf_head_t *, const char *, va_list *, const char *, ...);
|
void rb_linebuf_putmsg(buf_head_t *, const char *, va_list *, const char *, ...);
|
||||||
void rb_linebuf_put(buf_head_t *, const char *, ...);
|
void rb_linebuf_put(buf_head_t *, const char *, ...);
|
||||||
void rb_linebuf_putbuf(buf_head_t *bufhead, const char *buffer);
|
void rb_linebuf_putbuf(buf_head_t * bufhead, const char *buffer);
|
||||||
void rb_linebuf_attach(buf_head_t *, buf_head_t *);
|
void rb_linebuf_attach(buf_head_t *, buf_head_t *);
|
||||||
void rb_count_rb_linebuf_memory(size_t *, size_t *);
|
void rb_count_rb_linebuf_memory(size_t *, size_t *);
|
||||||
int rb_linebuf_flush(rb_fde_t *F, buf_head_t *);
|
int rb_linebuf_flush(rb_fde_t *F, buf_head_t *);
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: rb_memory.h 25375 2008-05-16 15:19:51Z androsyn $
|
* $Id: rb_memory.h 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef RB_LIB_H
|
#ifndef RB_LIB_H
|
||||||
|
@ -62,7 +62,7 @@ rb_strndup(const char *x, size_t y)
|
||||||
if(rb_unlikely(ret == NULL))
|
if(rb_unlikely(ret == NULL))
|
||||||
rb_outofmemory();
|
rb_outofmemory();
|
||||||
rb_strlcpy(ret, x, y);
|
rb_strlcpy(ret, x, y);
|
||||||
return(ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline char *
|
static inline char *
|
||||||
|
@ -72,16 +72,15 @@ rb_strdup(const char *x)
|
||||||
if(rb_unlikely(ret == NULL))
|
if(rb_unlikely(ret == NULL))
|
||||||
rb_outofmemory();
|
rb_outofmemory();
|
||||||
strcpy(ret, x);
|
strcpy(ret, x);
|
||||||
return(ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
rb_free(void *ptr)
|
rb_free(void *ptr)
|
||||||
{
|
{
|
||||||
if(rb_likely(ptr != NULL))
|
if(rb_likely(ptr != NULL))
|
||||||
free(ptr);
|
free(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* _I_MEMORY_H */
|
#endif /* _I_MEMORY_H */
|
||||||
|
|
||||||
|
|
|
@ -32,8 +32,8 @@
|
||||||
|
|
||||||
typedef struct _rb_prefix_t
|
typedef struct _rb_prefix_t
|
||||||
{
|
{
|
||||||
unsigned short family; /* AF_INET | AF_INET6 */
|
unsigned short family; /* AF_INET | AF_INET6 */
|
||||||
unsigned short bitlen; /* same as mask? */
|
unsigned short bitlen; /* same as mask? */
|
||||||
int ref_count; /* reference count */
|
int ref_count; /* reference count */
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
|
@ -49,7 +49,7 @@ rb_prefix_t;
|
||||||
|
|
||||||
typedef struct _rb_patricia_node_t
|
typedef struct _rb_patricia_node_t
|
||||||
{
|
{
|
||||||
unsigned int bit; /* flag if this node used */
|
unsigned int bit; /* flag if this node used */
|
||||||
rb_prefix_t *prefix; /* who we are in patricia tree */
|
rb_prefix_t *prefix; /* who we are in patricia tree */
|
||||||
struct _rb_patricia_node_t *l, *r; /* left and right children */
|
struct _rb_patricia_node_t *l, *r; /* left and right children */
|
||||||
struct _rb_patricia_node_t *parent; /* may be used */
|
struct _rb_patricia_node_t *parent; /* may be used */
|
||||||
|
@ -60,35 +60,36 @@ rb_patricia_node_t;
|
||||||
typedef struct _rb_patricia_tree_t
|
typedef struct _rb_patricia_tree_t
|
||||||
{
|
{
|
||||||
rb_patricia_node_t *head;
|
rb_patricia_node_t *head;
|
||||||
unsigned int maxbits; /* for IP, 32 bit addresses */
|
unsigned int maxbits; /* for IP, 32 bit addresses */
|
||||||
int num_active_node; /* for debug purpose */
|
int num_active_node; /* for debug purpose */
|
||||||
}
|
}
|
||||||
rb_patricia_tree_t;
|
rb_patricia_tree_t;
|
||||||
|
|
||||||
|
|
||||||
rb_patricia_node_t *rb_match_ip(rb_patricia_tree_t * tree, struct sockaddr *ip);
|
rb_patricia_node_t *rb_match_ip(rb_patricia_tree_t *tree, struct sockaddr *ip);
|
||||||
rb_patricia_node_t *rb_match_ip_exact(rb_patricia_tree_t * tree, struct sockaddr *ip, unsigned int len);
|
rb_patricia_node_t *rb_match_ip_exact(rb_patricia_tree_t *tree, struct sockaddr *ip,
|
||||||
rb_patricia_node_t *rb_match_string(rb_patricia_tree_t * tree, const char *string);
|
unsigned int len);
|
||||||
rb_patricia_node_t *rb_match_exact_string(rb_patricia_tree_t * tree, const char *string);
|
rb_patricia_node_t *rb_match_string(rb_patricia_tree_t *tree, const char *string);
|
||||||
rb_patricia_node_t *rb_patricia_search_exact(rb_patricia_tree_t * patricia, rb_prefix_t * prefix);
|
rb_patricia_node_t *rb_match_exact_string(rb_patricia_tree_t *tree, const char *string);
|
||||||
rb_patricia_node_t *rb_patricia_search_best(rb_patricia_tree_t * patricia, rb_prefix_t * prefix);
|
rb_patricia_node_t *rb_patricia_search_exact(rb_patricia_tree_t *patricia, rb_prefix_t *prefix);
|
||||||
rb_patricia_node_t *rb_patricia_search_best2(rb_patricia_tree_t * patricia,
|
rb_patricia_node_t *rb_patricia_search_best(rb_patricia_tree_t *patricia, rb_prefix_t *prefix);
|
||||||
rb_prefix_t * prefix, int inclusive);
|
rb_patricia_node_t *rb_patricia_search_best2(rb_patricia_tree_t *patricia,
|
||||||
rb_patricia_node_t *rb_patricia_lookup(rb_patricia_tree_t * patricia, rb_prefix_t * prefix);
|
rb_prefix_t *prefix, int inclusive);
|
||||||
|
rb_patricia_node_t *rb_patricia_lookup(rb_patricia_tree_t *patricia, rb_prefix_t *prefix);
|
||||||
|
|
||||||
void rb_patricia_remove(rb_patricia_tree_t * patricia, rb_patricia_node_t * node);
|
void rb_patricia_remove(rb_patricia_tree_t *patricia, rb_patricia_node_t *node);
|
||||||
rb_patricia_tree_t *rb_new_patricia(int maxbits);
|
rb_patricia_tree_t *rb_new_patricia(int maxbits);
|
||||||
void rb_clear_patricia(rb_patricia_tree_t * patricia, void (*func)(void *));
|
void rb_clear_patricia(rb_patricia_tree_t *patricia, void (*func) (void *));
|
||||||
void rb_destroy_patricia(rb_patricia_tree_t * patricia, void (*func)(void *));
|
void rb_destroy_patricia(rb_patricia_tree_t *patricia, void (*func) (void *));
|
||||||
void rb_patricia_process(rb_patricia_tree_t * patricia, void (*func)(rb_prefix_t *, void *));
|
void rb_patricia_process(rb_patricia_tree_t *patricia, void (*func) (rb_prefix_t *, void *));
|
||||||
void rb_init_patricia(void);
|
void rb_init_patricia(void);
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
rb_prefix_t *ascii2prefix(int family, char *string);
|
rb_prefix_t *ascii2prefix(int family, char *string);
|
||||||
#endif
|
#endif
|
||||||
rb_patricia_node_t *make_and_lookup(rb_patricia_tree_t * tree, const char *string);
|
rb_patricia_node_t *make_and_lookup(rb_patricia_tree_t *tree, const char *string);
|
||||||
rb_patricia_node_t *make_and_lookup_ip(rb_patricia_tree_t * tree, struct sockaddr *, int bitlen);
|
rb_patricia_node_t *make_and_lookup_ip(rb_patricia_tree_t *tree, struct sockaddr *, int bitlen);
|
||||||
|
|
||||||
|
|
||||||
#define RB_PATRICIA_MAXBITS 128
|
#define RB_PATRICIA_MAXBITS 128
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef RB_LIB_H
|
#ifndef RB_LIB_H
|
||||||
# error "Do not use rawbuf.h directly"
|
# error "Do not use rawbuf.h directly"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef INCLUDED_RAWBUF_H__
|
#ifndef INCLUDED_RAWBUF_H__
|
||||||
|
@ -41,6 +41,6 @@ rawbuf_head_t *rb_new_rawbuffer(void);
|
||||||
int rb_rawbuf_get(rawbuf_head_t *, void *data, int len);
|
int rb_rawbuf_get(rawbuf_head_t *, void *data, int len);
|
||||||
void rb_rawbuf_append(rawbuf_head_t *, void *data, int len);
|
void rb_rawbuf_append(rawbuf_head_t *, void *data, int len);
|
||||||
int rb_rawbuf_flush(rawbuf_head_t *, rb_fde_t *F);
|
int rb_rawbuf_flush(rawbuf_head_t *, rb_fde_t *F);
|
||||||
int rb_rawbuf_length(rawbuf_head_t *rb);
|
int rb_rawbuf_length(rawbuf_head_t * rb);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -21,11 +21,11 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: rb_snprintf.h 24324 2007-08-31 22:05:45Z androsyn $
|
* $Id: rb_snprintf.h 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef RB_LIB_H
|
#ifndef RB_LIB_H
|
||||||
# error "Do not use snprintf.h directly"
|
# error "Do not use snprintf.h directly"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SPRINTF_IRC
|
#ifndef SPRINTF_IRC
|
||||||
|
@ -40,10 +40,14 @@
|
||||||
* rb_sprintf - optimized sprintf
|
* rb_sprintf - optimized sprintf
|
||||||
*/
|
*/
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
int rb_sprintf(char *str, const char *fmt, ...) __attribute((format(printf, 2, 3)));
|
int
|
||||||
int rb_snprintf(char *str, const size_t size, const char *, ...) __attribute__ ((format(printf, 3, 4)));
|
rb_sprintf(char *str, const char *fmt, ...)
|
||||||
int rb_sprintf_append(char *str, const char *format, ...) __attribute((format(printf, 2, 3)));
|
__attribute((format(printf, 2, 3)));
|
||||||
int rb_snprintf_append(char *str, size_t len, const char *format, ...) __attribute__ ((format(printf, 3, 4)));
|
int rb_snprintf(char *str, const size_t size, const char *, ...)
|
||||||
|
__attribute__ ((format(printf, 3, 4)));
|
||||||
|
int rb_sprintf_append(char *str, const char *format, ...) __attribute((format(printf, 2, 3)));
|
||||||
|
int rb_snprintf_append(char *str, size_t len, const char *format, ...)
|
||||||
|
__attribute__ ((format(printf, 3, 4)));
|
||||||
#else
|
#else
|
||||||
int rb_sprintf(char *str, const char *format, ...);
|
int rb_sprintf(char *str, const char *format, ...);
|
||||||
int rb_snprintf(char *str, const size_t size, const char *, ...);
|
int rb_snprintf(char *str, const size_t size, const char *, ...);
|
||||||
|
|
|
@ -21,11 +21,11 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: rb_tools.h 25042 2008-01-23 16:14:08Z androsyn $
|
* $Id: rb_tools.h 26170 2008-10-26 20:59:07Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef RB_LIB_H
|
#ifndef RB_LIB_H
|
||||||
# error "Do not use tools.h directly"
|
# error "Do not use tools.h directly"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __TOOLS_H__
|
#ifndef __TOOLS_H__
|
||||||
|
@ -34,6 +34,8 @@
|
||||||
size_t rb_strlcpy(char *dst, const char *src, size_t siz);
|
size_t rb_strlcpy(char *dst, const char *src, size_t siz);
|
||||||
size_t rb_strlcat(char *dst, const char *src, size_t siz);
|
size_t rb_strlcat(char *dst, const char *src, size_t siz);
|
||||||
size_t rb_strnlen(const char *s, size_t count);
|
size_t rb_strnlen(const char *s, size_t count);
|
||||||
|
char *rb_basename(const char *);
|
||||||
|
char *rb_dirname(const char *);
|
||||||
|
|
||||||
int rb_string_to_array(char *string, char **parv, int maxpara);
|
int rb_string_to_array(char *string, char **parv, int maxpara);
|
||||||
|
|
||||||
|
@ -59,7 +61,7 @@ struct _rb_dlink_list
|
||||||
};
|
};
|
||||||
|
|
||||||
rb_dlink_node *rb_make_rb_dlink_node(void);
|
rb_dlink_node *rb_make_rb_dlink_node(void);
|
||||||
void rb_free_rb_dlink_node(rb_dlink_node * lp);
|
void rb_free_rb_dlink_node(rb_dlink_node *lp);
|
||||||
void rb_init_rb_dlink_nodes(size_t dh_size);
|
void rb_init_rb_dlink_nodes(size_t dh_size);
|
||||||
|
|
||||||
/* This macros are basically swiped from the linux kernel
|
/* This macros are basically swiped from the linux kernel
|
||||||
|
@ -99,7 +101,7 @@ void rb_init_rb_dlink_nodes(size_t dh_size);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
rb_dlinkMoveNode(rb_dlink_node * m, rb_dlink_list * oldlist, rb_dlink_list * newlist)
|
rb_dlinkMoveNode(rb_dlink_node *m, rb_dlink_list *oldlist, rb_dlink_list *newlist)
|
||||||
{
|
{
|
||||||
/* Assumption: If m->next == NULL, then list->tail == m
|
/* Assumption: If m->next == NULL, then list->tail == m
|
||||||
* and: If m->prev == NULL, then list->head == m
|
* and: If m->prev == NULL, then list->head == m
|
||||||
|
@ -131,7 +133,7 @@ rb_dlinkMoveNode(rb_dlink_node * m, rb_dlink_list * oldlist, rb_dlink_list * new
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
rb_dlinkAdd(void *data, rb_dlink_node * m, rb_dlink_list * list)
|
rb_dlinkAdd(void *data, rb_dlink_node *m, rb_dlink_list *list)
|
||||||
{
|
{
|
||||||
assert(data != NULL);
|
assert(data != NULL);
|
||||||
assert(m != NULL);
|
assert(m != NULL);
|
||||||
|
@ -152,7 +154,7 @@ rb_dlinkAdd(void *data, rb_dlink_node * m, rb_dlink_list * list)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
rb_dlinkAddBefore(rb_dlink_node * b, void *data, rb_dlink_node * m, rb_dlink_list * list)
|
rb_dlinkAddBefore(rb_dlink_node *b, void *data, rb_dlink_node *m, rb_dlink_list *list)
|
||||||
{
|
{
|
||||||
assert(b != NULL);
|
assert(b != NULL);
|
||||||
assert(data != NULL);
|
assert(data != NULL);
|
||||||
|
@ -180,11 +182,11 @@ rb_dlinkMoveTail(rb_dlink_node *m, rb_dlink_list *list)
|
||||||
{
|
{
|
||||||
if(list->tail == m)
|
if(list->tail == m)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* From here assume that m->next != NULL as that can only
|
/* From here assume that m->next != NULL as that can only
|
||||||
* be at the tail and assume that the node is on the list
|
* be at the tail and assume that the node is on the list
|
||||||
*/
|
*/
|
||||||
|
|
||||||
m->next->prev = m->prev;
|
m->next->prev = m->prev;
|
||||||
|
|
||||||
if(m->prev != NULL)
|
if(m->prev != NULL)
|
||||||
|
@ -199,7 +201,7 @@ rb_dlinkMoveTail(rb_dlink_node *m, rb_dlink_list *list)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
rb_dlinkAddTail(void *data, rb_dlink_node * m, rb_dlink_list * list)
|
rb_dlinkAddTail(void *data, rb_dlink_node *m, rb_dlink_list *list)
|
||||||
{
|
{
|
||||||
assert(m != NULL);
|
assert(m != NULL);
|
||||||
assert(list != NULL);
|
assert(list != NULL);
|
||||||
|
@ -223,7 +225,7 @@ rb_dlinkAddTail(void *data, rb_dlink_node * m, rb_dlink_list * list)
|
||||||
* often of all non-spontaneous functions. So it had better be
|
* often of all non-spontaneous functions. So it had better be
|
||||||
* efficient. */
|
* efficient. */
|
||||||
static inline void
|
static inline void
|
||||||
rb_dlinkDelete(rb_dlink_node * m, rb_dlink_list * list)
|
rb_dlinkDelete(rb_dlink_node *m, rb_dlink_list *list)
|
||||||
{
|
{
|
||||||
assert(m != NULL);
|
assert(m != NULL);
|
||||||
assert(list != NULL);
|
assert(list != NULL);
|
||||||
|
@ -302,7 +304,7 @@ rb_dlinkFind(void *data, rb_dlink_list *list)
|
||||||
rb_dlink_node *ptr;
|
rb_dlink_node *ptr;
|
||||||
assert(list != NULL);
|
assert(list != NULL);
|
||||||
assert(data != NULL);
|
assert(data != NULL);
|
||||||
|
|
||||||
RB_DLINK_FOREACH(ptr, list->head)
|
RB_DLINK_FOREACH(ptr, list->head)
|
||||||
{
|
{
|
||||||
if(ptr->data == data)
|
if(ptr->data == data)
|
||||||
|
@ -312,7 +314,7 @@ rb_dlinkFind(void *data, rb_dlink_list *list)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
rb_dlinkMoveList(rb_dlink_list * from, rb_dlink_list * to)
|
rb_dlinkMoveList(rb_dlink_list *from, rb_dlink_list *to)
|
||||||
{
|
{
|
||||||
assert(from != NULL);
|
assert(from != NULL);
|
||||||
assert(to != NULL);
|
assert(to != NULL);
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# NOTE: Changing this file will not affect anything until you rerun configure.
|
# NOTE: Changing this file will not affect anything until you rerun configure.
|
||||||
#
|
#
|
||||||
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
|
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
|
||||||
# 2007 Free Software Foundation, Inc.
|
# 2007, 2008 Free Software Foundation, Inc.
|
||||||
# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
|
# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -43,8 +43,8 @@ EXIT_FAILURE=1
|
||||||
|
|
||||||
PROGRAM=ltmain.sh
|
PROGRAM=ltmain.sh
|
||||||
PACKAGE=libtool
|
PACKAGE=libtool
|
||||||
VERSION="1.5.24 Debian 1.5.24-1"
|
VERSION="1.5.26 Debian 1.5.26-4"
|
||||||
TIMESTAMP=" (1.1220.2.456 2007/06/24 02:25:32)"
|
TIMESTAMP=" (1.1220.2.493 2008/02/01 16:58:18)"
|
||||||
|
|
||||||
# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE).
|
# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE).
|
||||||
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
|
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
|
||||||
|
@ -113,15 +113,21 @@ esac
|
||||||
# These must not be set unconditionally because not all systems understand
|
# These must not be set unconditionally because not all systems understand
|
||||||
# e.g. LANG=C (notably SCO).
|
# e.g. LANG=C (notably SCO).
|
||||||
# We save the old values to restore during execute mode.
|
# We save the old values to restore during execute mode.
|
||||||
for lt_var in LANG LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
|
lt_env=
|
||||||
|
for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
|
||||||
do
|
do
|
||||||
eval "if test \"\${$lt_var+set}\" = set; then
|
eval "if test \"\${$lt_var+set}\" = set; then
|
||||||
save_$lt_var=\$$lt_var
|
save_$lt_var=\$$lt_var
|
||||||
|
lt_env=\"$lt_var=\$$lt_var \$lt_env\"
|
||||||
$lt_var=C
|
$lt_var=C
|
||||||
export $lt_var
|
export $lt_var
|
||||||
fi"
|
fi"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if test -n "$lt_env"; then
|
||||||
|
lt_env="env $lt_env"
|
||||||
|
fi
|
||||||
|
|
||||||
# Make sure IFS has a sensible default
|
# Make sure IFS has a sensible default
|
||||||
lt_nl='
|
lt_nl='
|
||||||
'
|
'
|
||||||
|
@ -485,7 +491,7 @@ do
|
||||||
echo "\
|
echo "\
|
||||||
$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP
|
$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc.
|
Copyright (C) 2008 Free Software Foundation, Inc.
|
||||||
This is free software; see the source for copying conditions. There is NO
|
This is free software; see the source for copying conditions. There is NO
|
||||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||||
exit $?
|
exit $?
|
||||||
|
@ -788,6 +794,7 @@ if test -z "$show_help"; then
|
||||||
*.for) xform=for ;;
|
*.for) xform=for ;;
|
||||||
*.java) xform=java ;;
|
*.java) xform=java ;;
|
||||||
*.obj) xform=obj ;;
|
*.obj) xform=obj ;;
|
||||||
|
*.sx) xform=sx ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
|
libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
|
||||||
|
@ -956,7 +963,7 @@ EOF
|
||||||
$run $rm "$lobj" "$output_obj"
|
$run $rm "$lobj" "$output_obj"
|
||||||
|
|
||||||
$show "$command"
|
$show "$command"
|
||||||
if $run eval "$command"; then :
|
if $run eval $lt_env "$command"; then :
|
||||||
else
|
else
|
||||||
test -n "$output_obj" && $run $rm $removelist
|
test -n "$output_obj" && $run $rm $removelist
|
||||||
exit $EXIT_FAILURE
|
exit $EXIT_FAILURE
|
||||||
|
@ -1028,7 +1035,7 @@ EOF
|
||||||
command="$command$suppress_output"
|
command="$command$suppress_output"
|
||||||
$run $rm "$obj" "$output_obj"
|
$run $rm "$obj" "$output_obj"
|
||||||
$show "$command"
|
$show "$command"
|
||||||
if $run eval "$command"; then :
|
if $run eval $lt_env "$command"; then :
|
||||||
else
|
else
|
||||||
$run $rm $removelist
|
$run $rm $removelist
|
||||||
exit $EXIT_FAILURE
|
exit $EXIT_FAILURE
|
||||||
|
@ -1161,6 +1168,7 @@ EOF
|
||||||
thread_safe=no
|
thread_safe=no
|
||||||
vinfo=
|
vinfo=
|
||||||
vinfo_number=no
|
vinfo_number=no
|
||||||
|
single_module="${wl}-single_module"
|
||||||
|
|
||||||
func_infer_tag $base_compile
|
func_infer_tag $base_compile
|
||||||
|
|
||||||
|
@ -1646,6 +1654,11 @@ EOF
|
||||||
continue
|
continue
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
-multi_module)
|
||||||
|
single_module="${wl}-multi_module"
|
||||||
|
continue
|
||||||
|
;;
|
||||||
|
|
||||||
-module)
|
-module)
|
||||||
module=yes
|
module=yes
|
||||||
continue
|
continue
|
||||||
|
@ -2152,7 +2165,12 @@ EOF
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
|
name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
|
||||||
for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do
|
if test "$linkmode" = lib; then
|
||||||
|
searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
|
||||||
|
else
|
||||||
|
searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
|
||||||
|
fi
|
||||||
|
for searchdir in $searchdirs; do
|
||||||
for search_ext in .la $std_shrext .so .a; do
|
for search_ext in .la $std_shrext .so .a; do
|
||||||
# Search the libtool library
|
# Search the libtool library
|
||||||
lib="$searchdir/lib${name}${search_ext}"
|
lib="$searchdir/lib${name}${search_ext}"
|
||||||
|
@ -2948,12 +2966,18 @@ EOF
|
||||||
# we do not want to link against static libs,
|
# we do not want to link against static libs,
|
||||||
# but need to link against shared
|
# but need to link against shared
|
||||||
eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
|
eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
|
||||||
|
eval deplibdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
|
||||||
if test -n "$deplibrary_names" ; then
|
if test -n "$deplibrary_names" ; then
|
||||||
for tmp in $deplibrary_names ; do
|
for tmp in $deplibrary_names ; do
|
||||||
depdepl=$tmp
|
depdepl=$tmp
|
||||||
done
|
done
|
||||||
if test -f "$path/$depdepl" ; then
|
if test -f "$deplibdir/$depdepl" ; then
|
||||||
|
depdepl="$deplibdir/$depdepl"
|
||||||
|
elif test -f "$path/$depdepl" ; then
|
||||||
depdepl="$path/$depdepl"
|
depdepl="$path/$depdepl"
|
||||||
|
else
|
||||||
|
# Can't find it, oh well...
|
||||||
|
depdepl=
|
||||||
fi
|
fi
|
||||||
# do not add paths which are already there
|
# do not add paths which are already there
|
||||||
case " $newlib_search_path " in
|
case " $newlib_search_path " in
|
||||||
|
@ -3101,9 +3125,10 @@ EOF
|
||||||
|
|
||||||
case $linkmode in
|
case $linkmode in
|
||||||
oldlib)
|
oldlib)
|
||||||
if test -n "$deplibs"; then
|
case " $deplibs" in
|
||||||
$echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2
|
*\ -l* | *\ -L*)
|
||||||
fi
|
$echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
|
if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
|
||||||
$echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
|
$echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
|
||||||
|
@ -4245,9 +4270,10 @@ EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
obj)
|
obj)
|
||||||
if test -n "$deplibs"; then
|
case " $deplibs" in
|
||||||
$echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
|
*\ -l* | *\ -L*)
|
||||||
fi
|
$echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
|
if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
|
||||||
$echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
|
$echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
|
||||||
|
@ -6486,7 +6512,7 @@ relink_command=\"$relink_command\""
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Restore saved environment variables
|
# Restore saved environment variables
|
||||||
for lt_var in LANG LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
|
for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
|
||||||
do
|
do
|
||||||
eval "if test \"\${save_$lt_var+set}\" = set; then
|
eval "if test \"\${save_$lt_var+set}\" = set; then
|
||||||
$lt_var=\$save_$lt_var; export $lt_var
|
$lt_var=\$save_$lt_var; export $lt_var
|
||||||
|
|
|
@ -1,9 +1,18 @@
|
||||||
# $Id: Makefile.am 25689 2008-07-10 17:13:27Z androsyn $
|
# $Id: Makefile.am 26046 2008-09-09 16:37:30Z androsyn $
|
||||||
|
|
||||||
AUTOMAKE_OPTIONS = foreign
|
AUTOMAKE_OPTIONS = foreign
|
||||||
|
|
||||||
INCLUDES = -I. -I../include @SSL_CFLAGS@ @GNUTLS_CFLAGS@
|
INCLUDES = -I. -I../include @SSL_CFLAGS@ @GNUTLS_CFLAGS@
|
||||||
|
|
||||||
|
BUILT_SOURCES = version.c
|
||||||
|
|
||||||
|
version.c: version.c.SH ../CREDITS
|
||||||
|
$(SHELL) ./version.c.SH
|
||||||
|
$(CP) version.c version.c.last
|
||||||
|
|
||||||
|
version.lo: version.c ../include/serno.h
|
||||||
|
$(LIBTOOL) --mode=compile $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
|
||||||
|
|
||||||
libratbox_la_SOURCES = \
|
libratbox_la_SOURCES = \
|
||||||
unix.c \
|
unix.c \
|
||||||
win32.c \
|
win32.c \
|
||||||
|
@ -29,10 +38,11 @@ libratbox_la_SOURCES = \
|
||||||
kqueue.c \
|
kqueue.c \
|
||||||
rawbuf.c \
|
rawbuf.c \
|
||||||
patricia.c \
|
patricia.c \
|
||||||
arc4random.c
|
arc4random.c \
|
||||||
|
version.c
|
||||||
|
|
||||||
|
|
||||||
libratbox_la_LDFLAGS = -avoid-version -no-undefined -export-symbols export-syms.txt
|
libratbox_la_LDFLAGS = @CRYPT_LIB@ @SSL_LIBS@ @GNUTLS_LIBS@ -avoid-version -no-undefined -export-symbols export-syms.txt
|
||||||
libratbox_la_LIBADD = @CRYPT_LIB@ @SSL_LIBS@ @GNUTLS_LIBS@
|
libratbox_la_LIBADD = @CRYPT_LIB@ @SSL_LIBS@ @GNUTLS_LIBS@
|
||||||
lib_LTLIBRARIES = libratbox.la
|
lib_LTLIBRARIES = libratbox.la
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
@SET_MAKE@
|
@SET_MAKE@
|
||||||
|
|
||||||
# $Id: Makefile.am 25689 2008-07-10 17:13:27Z androsyn $
|
# $Id: Makefile.am 26046 2008-09-09 16:37:30Z androsyn $
|
||||||
|
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
@ -58,7 +58,7 @@ am_libratbox_la_OBJECTS = unix.lo win32.lo crypt.lo balloc.lo \
|
||||||
commio.lo openssl.lo gnutls.lo nossl.lo event.lo ratbox_lib.lo \
|
commio.lo openssl.lo gnutls.lo nossl.lo event.lo ratbox_lib.lo \
|
||||||
rb_memory.lo linebuf.lo snprintf.lo tools.lo helper.lo \
|
rb_memory.lo linebuf.lo snprintf.lo tools.lo helper.lo \
|
||||||
devpoll.lo epoll.lo poll.lo ports.lo sigio.lo select.lo \
|
devpoll.lo epoll.lo poll.lo ports.lo sigio.lo select.lo \
|
||||||
kqueue.lo rawbuf.lo patricia.lo arc4random.lo
|
kqueue.lo rawbuf.lo patricia.lo arc4random.lo version.lo
|
||||||
libratbox_la_OBJECTS = $(am_libratbox_la_OBJECTS)
|
libratbox_la_OBJECTS = $(am_libratbox_la_OBJECTS)
|
||||||
libratbox_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
|
libratbox_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||||
|
@ -120,7 +120,6 @@ INSTALL_DATA = @INSTALL_DATA@
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
LD = @LD@
|
|
||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
LIBOBJS = @LIBOBJS@
|
LIBOBJS = @LIBOBJS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
|
@ -202,13 +201,13 @@ psdir = @psdir@
|
||||||
sbindir = @sbindir@
|
sbindir = @sbindir@
|
||||||
sharedstatedir = @sharedstatedir@
|
sharedstatedir = @sharedstatedir@
|
||||||
srcdir = @srcdir@
|
srcdir = @srcdir@
|
||||||
subdirs = @subdirs@
|
|
||||||
sysconfdir = @sysconfdir@
|
sysconfdir = @sysconfdir@
|
||||||
target_alias = @target_alias@
|
target_alias = @target_alias@
|
||||||
top_builddir = @top_builddir@
|
top_builddir = @top_builddir@
|
||||||
top_srcdir = @top_srcdir@
|
top_srcdir = @top_srcdir@
|
||||||
AUTOMAKE_OPTIONS = foreign
|
AUTOMAKE_OPTIONS = foreign
|
||||||
INCLUDES = -I. -I../include @SSL_CFLAGS@ @GNUTLS_CFLAGS@
|
INCLUDES = -I. -I../include @SSL_CFLAGS@ @GNUTLS_CFLAGS@
|
||||||
|
BUILT_SOURCES = version.c
|
||||||
libratbox_la_SOURCES = \
|
libratbox_la_SOURCES = \
|
||||||
unix.c \
|
unix.c \
|
||||||
win32.c \
|
win32.c \
|
||||||
|
@ -234,12 +233,14 @@ libratbox_la_SOURCES = \
|
||||||
kqueue.c \
|
kqueue.c \
|
||||||
rawbuf.c \
|
rawbuf.c \
|
||||||
patricia.c \
|
patricia.c \
|
||||||
arc4random.c
|
arc4random.c \
|
||||||
|
version.c
|
||||||
|
|
||||||
libratbox_la_LDFLAGS = -avoid-version -no-undefined -export-symbols export-syms.txt
|
libratbox_la_LDFLAGS = @CRYPT_LIB@ @SSL_LIBS@ @GNUTLS_LIBS@ -avoid-version -no-undefined -export-symbols export-syms.txt
|
||||||
libratbox_la_LIBADD = @CRYPT_LIB@ @SSL_LIBS@ @GNUTLS_LIBS@
|
libratbox_la_LIBADD = @CRYPT_LIB@ @SSL_LIBS@ @GNUTLS_LIBS@
|
||||||
lib_LTLIBRARIES = libratbox.la
|
lib_LTLIBRARIES = libratbox.la
|
||||||
all: all-am
|
all: $(BUILT_SOURCES)
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) all-am
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
.SUFFIXES: .c .lo .o .obj
|
.SUFFIXES: .c .lo .o .obj
|
||||||
|
@ -332,6 +333,7 @@ distclean-compile:
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snprintf.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snprintf.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tools.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tools.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unix.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unix.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/win32.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/win32.Plo@am__quote@
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
|
@ -435,13 +437,15 @@ distdir: $(DISTFILES)
|
||||||
fi; \
|
fi; \
|
||||||
done
|
done
|
||||||
check-am: all-am
|
check-am: all-am
|
||||||
check: check-am
|
check: $(BUILT_SOURCES)
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) check-am
|
||||||
all-am: Makefile $(LTLIBRARIES)
|
all-am: Makefile $(LTLIBRARIES)
|
||||||
installdirs:
|
installdirs:
|
||||||
for dir in "$(DESTDIR)$(libdir)"; do \
|
for dir in "$(DESTDIR)$(libdir)"; do \
|
||||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||||
done
|
done
|
||||||
install: install-am
|
install: $(BUILT_SOURCES)
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) install-am
|
||||||
install-exec: install-exec-am
|
install-exec: install-exec-am
|
||||||
install-data: install-data-am
|
install-data: install-data-am
|
||||||
uninstall: uninstall-am
|
uninstall: uninstall-am
|
||||||
|
@ -465,6 +469,7 @@ distclean-generic:
|
||||||
maintainer-clean-generic:
|
maintainer-clean-generic:
|
||||||
@echo "This command is intended for maintainers to use"
|
@echo "This command is intended for maintainers to use"
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||||
clean: clean-am
|
clean: clean-am
|
||||||
|
|
||||||
clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
|
clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
|
||||||
|
@ -540,6 +545,13 @@ uninstall-am: uninstall-libLTLIBRARIES
|
||||||
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
||||||
tags uninstall uninstall-am uninstall-libLTLIBRARIES
|
tags uninstall uninstall-am uninstall-libLTLIBRARIES
|
||||||
|
|
||||||
|
|
||||||
|
version.c: version.c.SH ../CREDITS
|
||||||
|
$(SHELL) ./version.c.SH
|
||||||
|
$(CP) version.c version.c.last
|
||||||
|
|
||||||
|
version.lo: version.c ../include/serno.h
|
||||||
|
$(LIBTOOL) --mode=compile $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
.NOEXPORT:
|
.NOEXPORT:
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: arc4random.c 25705 2008-07-11 18:21:57Z androsyn $ */
|
/* $Id: arc4random.c 26092 2008-09-19 15:13:52Z androsyn $ */
|
||||||
/* $$$: arc4random.c 2005/02/08 robert */
|
/* $$$: arc4random.c 2005/02/08 robert */
|
||||||
/* $NetBSD: arc4random.c,v 1.5.2.1 2004/03/26 22:52:50 jmc Exp $ */
|
/* $NetBSD: arc4random.c,v 1.5.2.1 2004/03/26 22:52:50 jmc Exp $ */
|
||||||
/* $OpenBSD: arc4random.c,v 1.6 2001/06/05 05:05:38 pvalchev Exp $ */
|
/* $OpenBSD: arc4random.c,v 1.6 2001/06/05 05:05:38 pvalchev Exp $ */
|
||||||
|
@ -41,14 +41,15 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct arc4_stream {
|
struct arc4_stream
|
||||||
|
{
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
uint8_t j;
|
uint8_t j;
|
||||||
uint8_t s[256];
|
uint8_t s[256];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static int rs_initialized;
|
static int rs_initialized;
|
||||||
static struct arc4_stream rs;
|
static struct arc4_stream rs;
|
||||||
|
|
||||||
static inline void arc4_init(struct arc4_stream *);
|
static inline void arc4_init(struct arc4_stream *);
|
||||||
|
@ -60,9 +61,9 @@ static inline uint32_t arc4_getword(struct arc4_stream *);
|
||||||
static inline void
|
static inline void
|
||||||
arc4_init(struct arc4_stream *as)
|
arc4_init(struct arc4_stream *as)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
for (n = 0; n < 256; n++)
|
for(n = 0; n < 256; n++)
|
||||||
as->s[n] = n;
|
as->s[n] = n;
|
||||||
as->i = 0;
|
as->i = 0;
|
||||||
as->j = 0;
|
as->j = 0;
|
||||||
|
@ -71,11 +72,12 @@ arc4_init(struct arc4_stream *as)
|
||||||
static inline void
|
static inline void
|
||||||
arc4_addrandom(struct arc4_stream *as, uint8_t *dat, int datlen)
|
arc4_addrandom(struct arc4_stream *as, uint8_t *dat, int datlen)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
uint8_t si;
|
uint8_t si;
|
||||||
|
|
||||||
as->i--;
|
as->i--;
|
||||||
for (n = 0; n < 256; n++) {
|
for(n = 0; n < 256; n++)
|
||||||
|
{
|
||||||
as->i = (as->i + 1);
|
as->i = (as->i + 1);
|
||||||
si = as->s[as->i];
|
si = as->s[as->i];
|
||||||
as->j = (as->j + si + dat[n % datlen]);
|
as->j = (as->j + si + dat[n % datlen]);
|
||||||
|
@ -94,42 +96,57 @@ arc4_stir(struct arc4_stream *as)
|
||||||
/* XXX this doesn't support egd sources or similiar */
|
/* XXX this doesn't support egd sources or similiar */
|
||||||
|
|
||||||
pid = getpid();
|
pid = getpid();
|
||||||
arc4_addrandom(as, (void *)&pid, sizeof(pid));
|
arc4_addrandom(as, (void *)&pid, sizeof(pid));
|
||||||
|
|
||||||
rb_gettimeofday(&tv, NULL);
|
rb_gettimeofday(&tv, NULL);
|
||||||
arc4_addrandom(as, (void *)&tv.tv_sec, sizeof(&tv.tv_sec));
|
arc4_addrandom(as, (void *)&tv.tv_sec, sizeof(&tv.tv_sec));
|
||||||
arc4_addrandom(as, (void *)&tv.tv_usec, sizeof(&tv.tv_usec));
|
arc4_addrandom(as, (void *)&tv.tv_usec, sizeof(&tv.tv_usec));
|
||||||
rb_gettimeofday(&tv, NULL);
|
rb_gettimeofday(&tv, NULL);
|
||||||
arc4_addrandom(as, (void *)&tv.tv_usec, sizeof(&tv.tv_usec));
|
arc4_addrandom(as, (void *)&tv.tv_usec, sizeof(&tv.tv_usec));
|
||||||
|
|
||||||
#if defined(HAVE_GETRUSAGE) && RUSAGE_SELF
|
#if defined(HAVE_GETRUSAGE) && RUSAGE_SELF
|
||||||
{
|
{
|
||||||
struct rusage buf;
|
struct rusage buf;
|
||||||
getrusage(RUSAGE_SELF, &buf);
|
getrusage(RUSAGE_SELF, &buf);
|
||||||
arc4_addrandom(as, (void *)&buf, sizeof(buf));
|
arc4_addrandom(as, (void *)&buf, sizeof(buf));
|
||||||
memset(&buf, 0, sizeof(buf))
|
memset(&buf, 0, sizeof(buf))}
|
||||||
}
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(WIN32)
|
#if !defined(_WIN32)
|
||||||
{
|
{
|
||||||
uint8_t rnd[128];
|
uint8_t rnd[128];
|
||||||
int fd;
|
int fd;
|
||||||
fd = open("/dev/urandom", O_RDONLY);
|
fd = open("/dev/urandom", O_RDONLY);
|
||||||
if (fd != -1)
|
if(fd != -1)
|
||||||
{
|
{
|
||||||
read(fd, rnd, sizeof(rnd));
|
read(fd, rnd, sizeof(rnd));
|
||||||
close(fd);
|
close(fd);
|
||||||
arc4_addrandom(as, (void *)rnd, sizeof(rnd));
|
arc4_addrandom(as, (void *)rnd, sizeof(rnd));
|
||||||
|
memset(&rnd, 0, sizeof(rnd));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
{
|
{
|
||||||
LARGE_INTEGER performanceCount;
|
LARGE_INTEGER performanceCount;
|
||||||
if (QueryPerformanceCounter (&performanceCount))
|
if(QueryPerformanceCounter(&performanceCount))
|
||||||
{
|
{
|
||||||
arc4_addrandom(as, (void *)&performanceCount, sizeof(performanceCount));
|
arc4_addrandom(as, (void *)&performanceCount, sizeof(performanceCount));
|
||||||
}
|
}
|
||||||
|
HMODULE lib = LoadLibrary("ADVAPI32.DLL");
|
||||||
|
if(lib)
|
||||||
|
{
|
||||||
|
uint8_t rnd[128];
|
||||||
|
BOOLEAN(APIENTRY * pfn) (void *, ULONG) =
|
||||||
|
(BOOLEAN(APIENTRY *) (void *, ULONG))GetProcAddress(lib,
|
||||||
|
"SystemFunction036");
|
||||||
|
if(pfn)
|
||||||
|
{
|
||||||
|
if(pfn(rnd, sizeof(rnd)) == TRUE)
|
||||||
|
arc4_addrandom(as, (void *)rnd, sizeof(rnd));
|
||||||
|
memset(&rnd, 0, sizeof(rnd));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -141,7 +158,7 @@ arc4_stir(struct arc4_stream *as)
|
||||||
* http://www.wisdom.weizmann.ac.il/~itsik/RC4/Papers/Rc4_ksa.ps
|
* http://www.wisdom.weizmann.ac.il/~itsik/RC4/Papers/Rc4_ksa.ps
|
||||||
* N = 256 in our case.
|
* N = 256 in our case.
|
||||||
*/
|
*/
|
||||||
for (n = 0; n < 256 * 4; n++)
|
for(n = 0; n < 256 * 4; n++)
|
||||||
arc4_getbyte(as);
|
arc4_getbyte(as);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,7 +190,8 @@ arc4_getword(struct arc4_stream *as)
|
||||||
void
|
void
|
||||||
arc4random_stir(void)
|
arc4random_stir(void)
|
||||||
{
|
{
|
||||||
if (!rs_initialized) {
|
if(!rs_initialized)
|
||||||
|
{
|
||||||
arc4_init(&rs);
|
arc4_init(&rs);
|
||||||
rs_initialized = 1;
|
rs_initialized = 1;
|
||||||
}
|
}
|
||||||
|
@ -183,7 +201,7 @@ arc4random_stir(void)
|
||||||
void
|
void
|
||||||
arc4random_addrandom(uint8_t *dat, int datlen)
|
arc4random_addrandom(uint8_t *dat, int datlen)
|
||||||
{
|
{
|
||||||
if (!rs_initialized)
|
if(!rs_initialized)
|
||||||
arc4random_stir();
|
arc4random_stir();
|
||||||
arc4_addrandom(&rs, dat, datlen);
|
arc4_addrandom(&rs, dat, datlen);
|
||||||
}
|
}
|
||||||
|
@ -191,10 +209,9 @@ arc4random_addrandom(uint8_t *dat, int datlen)
|
||||||
uint32_t
|
uint32_t
|
||||||
arc4random(void)
|
arc4random(void)
|
||||||
{
|
{
|
||||||
if (!rs_initialized)
|
if(!rs_initialized)
|
||||||
arc4random_stir();
|
arc4random_stir();
|
||||||
return arc4_getword(&rs);
|
return arc4_getword(&rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: balloc.c 25861 2008-08-06 19:51:44Z androsyn $
|
* $Id: balloc.c 26100 2008-09-20 01:27:19Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -59,6 +59,7 @@
|
||||||
#include <libratbox_config.h>
|
#include <libratbox_config.h>
|
||||||
#include <ratbox_lib.h>
|
#include <ratbox_lib.h>
|
||||||
|
|
||||||
|
#ifndef NOBALLOC
|
||||||
#ifdef HAVE_MMAP /* We've got mmap() that is good */
|
#ifdef HAVE_MMAP /* We've got mmap() that is good */
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
/* HP-UX sucks */
|
/* HP-UX sucks */
|
||||||
|
@ -68,6 +69,7 @@
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
static uintptr_t offset_pad;
|
static uintptr_t offset_pad;
|
||||||
|
|
||||||
|
@ -93,7 +95,7 @@ struct rb_bh
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef NOBALLOC
|
#ifndef NOBALLOC
|
||||||
static int newblock(rb_bh * bh);
|
static int newblock(rb_bh *bh);
|
||||||
static void rb_bh_gc_event(void *unused);
|
static void rb_bh_gc_event(void *unused);
|
||||||
#endif /* !NOBALLOC */
|
#endif /* !NOBALLOC */
|
||||||
static rb_dlink_list *heap_lists;
|
static rb_dlink_list *heap_lists;
|
||||||
|
@ -110,7 +112,7 @@ _rb_bh_fail(const char *reason, const char *file, int line)
|
||||||
rb_lib_log("rb_heap_blockheap failure: %s (%s:%d)", reason, file, line);
|
rb_lib_log("rb_heap_blockheap failure: %s (%s:%d)", reason, file, line);
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NOBALLOC
|
#ifndef NOBALLOC
|
||||||
/*
|
/*
|
||||||
* static inline void free_block(void *ptr, size_t size)
|
* static inline void free_block(void *ptr, size_t size)
|
||||||
|
@ -125,7 +127,7 @@ free_block(void *ptr, size_t size)
|
||||||
#ifdef HAVE_MMAP
|
#ifdef HAVE_MMAP
|
||||||
munmap(ptr, size);
|
munmap(ptr, size);
|
||||||
#else
|
#else
|
||||||
#ifdef WIN32
|
#ifdef _WIN32
|
||||||
HeapFree(block_heap, 0, ptr);
|
HeapFree(block_heap, 0, ptr);
|
||||||
#else
|
#else
|
||||||
free(ptr);
|
free(ptr);
|
||||||
|
@ -156,11 +158,11 @@ rb_init_bh(void)
|
||||||
offset_pad += __alignof__(long long);
|
offset_pad += __alignof__(long long);
|
||||||
offset_pad &= ~(__alignof__(long long) - 1);
|
offset_pad &= ~(__alignof__(long long) - 1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef NOBALLOC
|
#ifndef NOBALLOC
|
||||||
#ifdef WIN32
|
#ifdef _WIN32
|
||||||
block_heap = HeapCreate(HEAP_NO_SERIALIZE, 0, 0);
|
block_heap = HeapCreate(HEAP_NO_SERIALIZE, 0, 0);
|
||||||
#endif
|
#endif
|
||||||
rb_event_addish("rb_bh_gc_event", rb_bh_gc_event, NULL, 300);
|
rb_event_addish("rb_bh_gc_event", rb_bh_gc_event, NULL, 300);
|
||||||
#endif /* !NOBALLOC */
|
#endif /* !NOBALLOC */
|
||||||
|
@ -190,15 +192,15 @@ get_block(size_t size)
|
||||||
close(zero_fd);
|
close(zero_fd);
|
||||||
#endif /* MAP_ANON */
|
#endif /* MAP_ANON */
|
||||||
if(ptr == MAP_FAILED)
|
if(ptr == MAP_FAILED)
|
||||||
ptr = NULL;
|
ptr = NULL;
|
||||||
#else
|
#else
|
||||||
#ifdef WIN32
|
#ifdef _WIN32
|
||||||
ptr = HeapAlloc(block_heap, 0, size);
|
ptr = HeapAlloc(block_heap, 0, size);
|
||||||
#else
|
#else
|
||||||
ptr = malloc(size);
|
ptr = malloc(size);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
return(ptr);
|
return (ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -224,7 +226,7 @@ rb_bh_gc_event(void *unused)
|
||||||
/* ************************************************************************ */
|
/* ************************************************************************ */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
newblock(rb_bh * bh)
|
newblock(rb_bh *bh)
|
||||||
{
|
{
|
||||||
rb_heap_block *b;
|
rb_heap_block *b;
|
||||||
unsigned long i;
|
unsigned long i;
|
||||||
|
@ -242,14 +244,14 @@ newblock(rb_bh * bh)
|
||||||
}
|
}
|
||||||
offset = (uintptr_t)b->elems;
|
offset = (uintptr_t)b->elems;
|
||||||
/* Setup our blocks now */
|
/* Setup our blocks now */
|
||||||
for (i = 0; i < bh->elemsPerBlock; i++, offset += bh->elemSize)
|
for(i = 0; i < bh->elemsPerBlock; i++, offset += bh->elemSize)
|
||||||
{
|
{
|
||||||
*((void **)offset) = b;
|
*((void **)offset) = b;
|
||||||
node = (void *)(offset + offset_pad);
|
node = (void *)(offset + offset_pad);
|
||||||
rb_dlinkAdd((void *)offset, node, &bh->free_list);
|
rb_dlinkAdd((void *)offset, node, &bh->free_list);
|
||||||
}
|
}
|
||||||
rb_dlinkAdd(b, &b->node, &bh->block_list);
|
rb_dlinkAdd(b, &b->node, &bh->block_list);
|
||||||
b->free_count = bh->elemsPerBlock;
|
b->free_count = bh->elemsPerBlock;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
#endif /* !NOBALLOC */
|
#endif /* !NOBALLOC */
|
||||||
|
@ -281,10 +283,10 @@ rb_bh_create(size_t elemsize, int elemsperblock, const char *desc)
|
||||||
{
|
{
|
||||||
rb_bh_fail("Attempting to rb_bh_create idiotic sizes");
|
rb_bh_fail("Attempting to rb_bh_create idiotic sizes");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(elemsize < sizeof(rb_dlink_node))
|
if(elemsize < sizeof(rb_dlink_node))
|
||||||
rb_bh_fail("Attempt to rb_bh_create smaller than sizeof(rb_dlink_node)");
|
rb_bh_fail("Attempt to rb_bh_create smaller than sizeof(rb_dlink_node)");
|
||||||
|
|
||||||
/* Allocate our new rb_bh */
|
/* Allocate our new rb_bh */
|
||||||
bh = rb_malloc(sizeof(rb_bh));
|
bh = rb_malloc(sizeof(rb_bh));
|
||||||
#ifndef NOBALLOC
|
#ifndef NOBALLOC
|
||||||
|
@ -334,13 +336,13 @@ rb_bh_create(size_t elemsize, int elemsperblock, const char *desc)
|
||||||
/* ************************************************************************ */
|
/* ************************************************************************ */
|
||||||
|
|
||||||
void *
|
void *
|
||||||
rb_bh_alloc(rb_bh * bh)
|
rb_bh_alloc(rb_bh *bh)
|
||||||
{
|
{
|
||||||
#ifndef NOBALLOC
|
#ifndef NOBALLOC
|
||||||
rb_dlink_node *new_node;
|
rb_dlink_node *new_node;
|
||||||
rb_heap_block *block;
|
rb_heap_block **block;
|
||||||
void *ptr;
|
void *ptr;
|
||||||
#endif
|
#endif
|
||||||
lrb_assert(bh != NULL);
|
lrb_assert(bh != NULL);
|
||||||
if(rb_unlikely(bh == NULL))
|
if(rb_unlikely(bh == NULL))
|
||||||
{
|
{
|
||||||
|
@ -348,7 +350,7 @@ rb_bh_alloc(rb_bh * bh)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NOBALLOC
|
#ifdef NOBALLOC
|
||||||
return(rb_malloc(bh->elemSize));
|
return (rb_malloc(bh->elemSize));
|
||||||
#else
|
#else
|
||||||
if(bh->free_list.head == NULL)
|
if(bh->free_list.head == NULL)
|
||||||
{
|
{
|
||||||
|
@ -368,11 +370,12 @@ rb_bh_alloc(rb_bh * bh)
|
||||||
}
|
}
|
||||||
|
|
||||||
new_node = bh->free_list.head;
|
new_node = bh->free_list.head;
|
||||||
block = new_node->data;
|
block = (rb_heap_block **) new_node->data;
|
||||||
ptr = new_node->data + offset_pad;
|
ptr = (void *)((uintptr_t)new_node->data + (uintptr_t)offset_pad);
|
||||||
rb_dlinkDelete(new_node, &bh->free_list);
|
rb_dlinkDelete(new_node, &bh->free_list);
|
||||||
|
(*block)->free_count--;
|
||||||
memset(ptr, 0, bh->elemSize - offset_pad);
|
memset(ptr, 0, bh->elemSize - offset_pad);
|
||||||
return(ptr);
|
return (ptr);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -389,7 +392,7 @@ rb_bh_alloc(rb_bh * bh)
|
||||||
/* 0 if successful, 1 if element not contained within rb_bh. */
|
/* 0 if successful, 1 if element not contained within rb_bh. */
|
||||||
/* ************************************************************************ */
|
/* ************************************************************************ */
|
||||||
int
|
int
|
||||||
rb_bh_free(rb_bh * bh, void *ptr)
|
rb_bh_free(rb_bh *bh, void *ptr)
|
||||||
{
|
{
|
||||||
#ifndef NOBALLOC
|
#ifndef NOBALLOC
|
||||||
rb_heap_block *block;
|
rb_heap_block *block;
|
||||||
|
@ -413,14 +416,17 @@ rb_bh_free(rb_bh * bh, void *ptr)
|
||||||
#ifdef NOBALLOC
|
#ifdef NOBALLOC
|
||||||
rb_free(ptr);
|
rb_free(ptr);
|
||||||
#else
|
#else
|
||||||
data = (void *)(ptr - offset_pad);
|
data = (void *)((uintptr_t)ptr - (uintptr_t)offset_pad);
|
||||||
block = *(rb_heap_block **)data;
|
block = *(rb_heap_block **) data;
|
||||||
/* XXX */
|
/* XXX */
|
||||||
if(rb_unlikely(!((uintptr_t)ptr >= (uintptr_t)block->elems && (uintptr_t)ptr < (uintptr_t)block->elems + (uintptr_t)block->alloc_size)))
|
if(rb_unlikely
|
||||||
|
(!((uintptr_t)ptr >= (uintptr_t)block->elems
|
||||||
|
&& (uintptr_t)ptr < (uintptr_t)block->elems + (uintptr_t)block->alloc_size)))
|
||||||
{
|
{
|
||||||
rb_bh_fail("rb_bh_free() bogus pointer");
|
rb_bh_fail("rb_bh_free() bogus pointer");
|
||||||
}
|
}
|
||||||
block->free_count++;
|
block->free_count++;
|
||||||
|
|
||||||
rb_dlinkAdd(data, (rb_dlink_node *)ptr, &bh->free_list);
|
rb_dlinkAdd(data, (rb_dlink_node *)ptr, &bh->free_list);
|
||||||
#endif /* !NOBALLOC */
|
#endif /* !NOBALLOC */
|
||||||
return (0);
|
return (0);
|
||||||
|
@ -438,7 +444,7 @@ rb_bh_free(rb_bh * bh, void *ptr)
|
||||||
/* 0 if successful, 1 if bh == NULL */
|
/* 0 if successful, 1 if bh == NULL */
|
||||||
/* ************************************************************************ */
|
/* ************************************************************************ */
|
||||||
int
|
int
|
||||||
rb_bh_destroy(rb_bh * bh)
|
rb_bh_destroy(rb_bh *bh)
|
||||||
{
|
{
|
||||||
#ifndef NOBALLOC
|
#ifndef NOBALLOC
|
||||||
rb_dlink_node *ptr, *next;
|
rb_dlink_node *ptr, *next;
|
||||||
|
@ -455,7 +461,7 @@ rb_bh_destroy(rb_bh * bh)
|
||||||
rb_free(b);
|
rb_free(b);
|
||||||
}
|
}
|
||||||
#endif /* !NOBALLOC */
|
#endif /* !NOBALLOC */
|
||||||
|
|
||||||
rb_dlinkDelete(&bh->hlist, heap_lists);
|
rb_dlinkDelete(&bh->hlist, heap_lists);
|
||||||
rb_free(bh->desc);
|
rb_free(bh->desc);
|
||||||
rb_free(bh);
|
rb_free(bh);
|
||||||
|
@ -464,8 +470,9 @@ rb_bh_destroy(rb_bh * bh)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_bh_usage(rb_bh * bh, size_t * bused, size_t * bfree, size_t * bmemusage, const char **desc)
|
rb_bh_usage(rb_bh *bh, size_t *bused, size_t *bfree, size_t *bmemusage, const char **desc)
|
||||||
{
|
{
|
||||||
|
#ifndef NOBALLOC
|
||||||
size_t used, freem, memusage;
|
size_t used, freem, memusage;
|
||||||
|
|
||||||
if(bh == NULL)
|
if(bh == NULL)
|
||||||
|
@ -484,9 +491,17 @@ rb_bh_usage(rb_bh * bh, size_t * bused, size_t * bfree, size_t * bmemusage, cons
|
||||||
*bmemusage = memusage;
|
*bmemusage = memusage;
|
||||||
if(desc != NULL)
|
if(desc != NULL)
|
||||||
*desc = bh->desc;
|
*desc = bh->desc;
|
||||||
|
#else
|
||||||
|
static char *noballoc = "no blockheap";
|
||||||
|
*bused = 0;
|
||||||
|
*bfree = 0;
|
||||||
|
*bmemusage = 0;
|
||||||
|
*desc = noballoc;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void rb_bh_usage_all(rb_bh_usage_cb *cb, void *data)
|
void
|
||||||
|
rb_bh_usage_all(rb_bh_usage_cb *cb, void *data)
|
||||||
{
|
{
|
||||||
rb_dlink_node *ptr;
|
rb_dlink_node *ptr;
|
||||||
rb_bh *bh;
|
rb_bh *bh;
|
||||||
|
@ -499,14 +514,14 @@ void rb_bh_usage_all(rb_bh_usage_cb *cb, void *data)
|
||||||
|
|
||||||
RB_DLINK_FOREACH(ptr, heap_lists->head)
|
RB_DLINK_FOREACH(ptr, heap_lists->head)
|
||||||
{
|
{
|
||||||
bh = (rb_bh *)ptr->data;
|
bh = (rb_bh *)ptr->data;
|
||||||
freem = rb_dlink_list_length(&bh->free_list);
|
freem = rb_dlink_list_length(&bh->free_list);
|
||||||
used = (rb_dlink_list_length(&bh->block_list) * bh->elemsPerBlock) - freem;
|
used = (rb_dlink_list_length(&bh->block_list) * bh->elemsPerBlock) - freem;
|
||||||
memusage = used * bh->elemSize;
|
memusage = used * bh->elemSize;
|
||||||
heapalloc = (freem + used) * bh->elemSize;
|
heapalloc = (freem + used) * bh->elemSize;
|
||||||
if(bh->desc != NULL)
|
if(bh->desc != NULL)
|
||||||
desc = bh->desc;
|
desc = bh->desc;
|
||||||
cb(used, freem, memusage, heapalloc, desc, data);
|
cb(used, freem, memusage, heapalloc, desc, data);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -517,7 +532,7 @@ rb_bh_total_usage(size_t *total_alloc, size_t *total_used)
|
||||||
rb_dlink_node *ptr;
|
rb_dlink_node *ptr;
|
||||||
size_t total_memory = 0, used_memory = 0, used, freem;
|
size_t total_memory = 0, used_memory = 0, used, freem;
|
||||||
rb_bh *bh;
|
rb_bh *bh;
|
||||||
|
|
||||||
RB_DLINK_FOREACH(ptr, heap_lists->head)
|
RB_DLINK_FOREACH(ptr, heap_lists->head)
|
||||||
{
|
{
|
||||||
bh = (rb_bh *)ptr->data;
|
bh = (rb_bh *)ptr->data;
|
||||||
|
@ -526,7 +541,7 @@ rb_bh_total_usage(size_t *total_alloc, size_t *total_used)
|
||||||
used_memory += used * bh->elemSize;
|
used_memory += used * bh->elemSize;
|
||||||
total_memory += (freem + used) * bh->elemSize;
|
total_memory += (freem + used) * bh->elemSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(total_alloc != NULL)
|
if(total_alloc != NULL)
|
||||||
*total_alloc = total_memory;
|
*total_alloc = total_memory;
|
||||||
if(total_used != NULL)
|
if(total_used != NULL)
|
||||||
|
@ -535,20 +550,21 @@ rb_bh_total_usage(size_t *total_alloc, size_t *total_used)
|
||||||
|
|
||||||
#ifndef NOBALLOC
|
#ifndef NOBALLOC
|
||||||
int
|
int
|
||||||
rb_bh_gc(rb_bh * bh)
|
rb_bh_gc(rb_bh *bh)
|
||||||
{
|
{
|
||||||
rb_heap_block *b;
|
rb_heap_block *b;
|
||||||
rb_dlink_node *ptr, *next;
|
rb_dlink_node *ptr, *next;
|
||||||
unsigned long i;
|
unsigned long i;
|
||||||
uintptr_t offset;
|
uintptr_t offset;
|
||||||
|
|
||||||
if(bh == NULL)
|
if(bh == NULL)
|
||||||
{
|
{
|
||||||
/* somebody is smoking some craq..(probably lee, but don't tell him that) */
|
/* somebody is smoking some craq..(probably lee, but don't tell him that) */
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if((rb_dlink_list_length(&bh->free_list) < bh->elemsPerBlock) || rb_dlink_list_length(&bh->block_list) == 1)
|
if((rb_dlink_list_length(&bh->free_list) < bh->elemsPerBlock)
|
||||||
|
|| rb_dlink_list_length(&bh->block_list) == 1)
|
||||||
{
|
{
|
||||||
/* There couldn't possibly be an entire free block. Return. */
|
/* There couldn't possibly be an entire free block. Return. */
|
||||||
return (0);
|
return (0);
|
||||||
|
@ -559,21 +575,22 @@ rb_bh_gc(rb_bh * bh)
|
||||||
b = ptr->data;
|
b = ptr->data;
|
||||||
if(rb_dlink_list_length(&bh->block_list) == 1)
|
if(rb_dlink_list_length(&bh->block_list) == 1)
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
if(b->free_count == bh->elemsPerBlock)
|
if(b->free_count == bh->elemsPerBlock)
|
||||||
{
|
{
|
||||||
/* i'm seriously going to hell for this.. */
|
/* i'm seriously going to hell for this.. */
|
||||||
|
|
||||||
offset = (uintptr_t)b->elems;
|
offset = (uintptr_t)b->elems;
|
||||||
for (i = 0; i < bh->elemsPerBlock; i++, offset += (uintptr_t)bh->elemSize)
|
for(i = 0; i < bh->elemsPerBlock; i++, offset += (uintptr_t)bh->elemSize)
|
||||||
{
|
{
|
||||||
rb_dlinkDelete(((rb_dlink_node *)offset), &bh->free_list);
|
rb_dlinkDelete((rb_dlink_node *)(offset + offset_pad),
|
||||||
|
&bh->free_list);
|
||||||
}
|
}
|
||||||
rb_dlinkDelete(&b->node, &bh->block_list);
|
rb_dlinkDelete(&b->node, &bh->block_list);
|
||||||
free_block(b->elems, b->alloc_size);
|
free_block(b->elems, b->alloc_size);
|
||||||
rb_free(b);
|
rb_free(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -22,7 +22,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: devpoll.c 25038 2008-01-23 16:03:08Z androsyn $
|
* $Id: devpoll.c 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
#include <libratbox_config.h>
|
#include <libratbox_config.h>
|
||||||
#include <ratbox_lib.h>
|
#include <ratbox_lib.h>
|
||||||
|
@ -41,13 +41,13 @@ static void devpoll_update_events(int, short, PF *);
|
||||||
static void devpoll_write_update(int, int);
|
static void devpoll_write_update(int, int);
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_setup_fd_devpoll(rb_fde_t *F)
|
rb_setup_fd_devpoll(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Write an update to the devpoll filter.
|
* Write an update to the devpoll filter.
|
||||||
* See, we end up having to do a seperate (?) remove before we do an
|
* See, we end up having to do a seperate (?) remove before we do an
|
||||||
|
@ -68,7 +68,8 @@ devpoll_write_update(int fd, int events)
|
||||||
/* Write the thing to our poll fd */
|
/* Write the thing to our poll fd */
|
||||||
retval = write(dpfd, &pollfds[0], sizeof(struct pollfd));
|
retval = write(dpfd, &pollfds[0], sizeof(struct pollfd));
|
||||||
if(retval != sizeof(struct pollfd))
|
if(retval != sizeof(struct pollfd))
|
||||||
rb_lib_log("devpoll_write_update: dpfd write failed %d: %s", errno, strerror(errno));
|
rb_lib_log("devpoll_write_update: dpfd write failed %d: %s", errno,
|
||||||
|
strerror(errno));
|
||||||
/* Done! */
|
/* Done! */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,7 +151,7 @@ rb_init_netio_devpoll(void)
|
||||||
{
|
{
|
||||||
return errno;
|
return errno;
|
||||||
}
|
}
|
||||||
maxfd = getdtablesize() - 2; /* This makes more sense than HARD_FDLIMIT */
|
maxfd = getdtablesize() - 2; /* This makes more sense than HARD_FDLIMIT */
|
||||||
fdmask = rb_malloc(sizeof(fdmask) * maxfd + 1);
|
fdmask = rb_malloc(sizeof(fdmask) * maxfd + 1);
|
||||||
rb_open(dpfd, RB_FD_UNKNOWN, "/dev/poll file descriptor");
|
rb_open(dpfd, RB_FD_UNKNOWN, "/dev/poll file descriptor");
|
||||||
}
|
}
|
||||||
|
@ -162,8 +163,7 @@ rb_init_netio_devpoll(void)
|
||||||
* and deregister interest in a pending IO state for a given FD.
|
* and deregister interest in a pending IO state for a given FD.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
rb_setselect_devpoll(rb_fde_t *F, unsigned int type, PF * handler,
|
rb_setselect_devpoll(rb_fde_t *F, unsigned int type, PF * handler, void *client_data)
|
||||||
void *client_data)
|
|
||||||
{
|
{
|
||||||
lrb_assert(IsFDOpen(F));
|
lrb_assert(IsFDOpen(F));
|
||||||
|
|
||||||
|
@ -205,7 +205,7 @@ rb_select_devpoll(long delay)
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
for (;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
dopoll.dp_timeout = delay;
|
dopoll.dp_timeout = delay;
|
||||||
dopoll.dp_nfds = maxfd;
|
dopoll.dp_nfds = maxfd;
|
||||||
|
@ -223,14 +223,13 @@ rb_select_devpoll(long delay)
|
||||||
if(num == 0)
|
if(num == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (i = 0; i < num; i++)
|
for(i = 0; i < num; i++)
|
||||||
{
|
{
|
||||||
int fd = dopoll.dp_fds[i].fd;
|
int fd = dopoll.dp_fds[i].fd;
|
||||||
PF *hdl = NULL;
|
PF *hdl = NULL;
|
||||||
rb_fde_t *F = rb_find_fd(fd);
|
rb_fde_t *F = rb_find_fd(fd);
|
||||||
if((dopoll.dp_fds[i].
|
if((dopoll.dp_fds[i].revents & (POLLRDNORM | POLLIN | POLLHUP |
|
||||||
revents & (POLLRDNORM | POLLIN | POLLHUP |
|
POLLERR))
|
||||||
POLLERR))
|
|
||||||
&& (dopoll.dp_fds[i].events & (POLLRDNORM | POLLIN)))
|
&& (dopoll.dp_fds[i].events & (POLLRDNORM | POLLIN)))
|
||||||
{
|
{
|
||||||
if((hdl = F->read_handler) != NULL)
|
if((hdl = F->read_handler) != NULL)
|
||||||
|
@ -243,16 +242,14 @@ rb_select_devpoll(long delay)
|
||||||
* poll set *if* the handler changes state (active ->
|
* poll set *if* the handler changes state (active ->
|
||||||
* NULL or vice versa.)
|
* NULL or vice versa.)
|
||||||
*/
|
*/
|
||||||
devpoll_update_events(fd,
|
devpoll_update_events(fd, RB_SELECT_READ, F->read_handler);
|
||||||
RB_SELECT_READ, F->read_handler);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!IsFDOpen(F))
|
if(!IsFDOpen(F))
|
||||||
continue; /* Read handler closed us..go on to do something more useful */
|
continue; /* Read handler closed us..go on to do something more useful */
|
||||||
if((dopoll.dp_fds[i].
|
if((dopoll.dp_fds[i].revents & (POLLWRNORM | POLLOUT | POLLHUP |
|
||||||
revents & (POLLWRNORM | POLLOUT | POLLHUP |
|
POLLERR))
|
||||||
POLLERR))
|
|
||||||
&& (dopoll.dp_fds[i].events & (POLLWRNORM | POLLOUT)))
|
&& (dopoll.dp_fds[i].events & (POLLWRNORM | POLLOUT)))
|
||||||
{
|
{
|
||||||
if((hdl = F->write_handler) != NULL)
|
if((hdl = F->write_handler) != NULL)
|
||||||
|
@ -268,13 +265,13 @@ rb_select_devpoll(long delay)
|
||||||
}
|
}
|
||||||
return RB_OK;
|
return RB_OK;
|
||||||
}
|
}
|
||||||
while (0);
|
while(0);
|
||||||
/* XXX Get here, we broke! */
|
/* XXX Get here, we broke! */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* /dev/poll not supported */
|
#else /* /dev/poll not supported */
|
||||||
int
|
int
|
||||||
rb_init_netio_devpoll(void)
|
rb_init_netio_devpoll(void)
|
||||||
{
|
{
|
||||||
return ENOSYS;
|
return ENOSYS;
|
||||||
|
@ -301,4 +298,3 @@ rb_setup_fd_devpoll(rb_fde_t *F)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: epoll.c 25675 2008-07-06 04:13:05Z androsyn $
|
* $Id: epoll.c 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
#define _GNU_SOURCE 1
|
#define _GNU_SOURCE 1
|
||||||
|
|
||||||
|
@ -31,7 +31,6 @@
|
||||||
#include <ratbox_lib.h>
|
#include <ratbox_lib.h>
|
||||||
#include <commio-int.h>
|
#include <commio-int.h>
|
||||||
#include <event-int.h>
|
#include <event-int.h>
|
||||||
|
|
||||||
#if defined(HAVE_EPOLL_CTL) && (HAVE_SYS_EPOLL_H)
|
#if defined(HAVE_EPOLL_CTL) && (HAVE_SYS_EPOLL_H)
|
||||||
#define USING_EPOLL
|
#define USING_EPOLL
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
@ -44,6 +43,10 @@
|
||||||
#define EPOLL_SCHED_EVENT 1
|
#define EPOLL_SCHED_EVENT 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(USE_TIMERFD_CREATE)
|
||||||
|
#include <sys/timerfd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define RTSIGNAL SIGRTMIN
|
#define RTSIGNAL SIGRTMIN
|
||||||
struct epoll_info
|
struct epoll_info
|
||||||
{
|
{
|
||||||
|
@ -54,8 +57,7 @@ struct epoll_info
|
||||||
|
|
||||||
static struct epoll_info *ep_info;
|
static struct epoll_info *ep_info;
|
||||||
static int can_do_event;
|
static int can_do_event;
|
||||||
|
static int can_do_timerfd;
|
||||||
//static void setup_signalfd(void);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* rb_init_netio
|
* rb_init_netio
|
||||||
|
@ -66,7 +68,7 @@ static int can_do_event;
|
||||||
int
|
int
|
||||||
rb_init_netio_epoll(void)
|
rb_init_netio_epoll(void)
|
||||||
{
|
{
|
||||||
can_do_event = 0; /* shut up gcc */
|
can_do_event = 0; /* shut up gcc */
|
||||||
ep_info = rb_malloc(sizeof(struct epoll_info));
|
ep_info = rb_malloc(sizeof(struct epoll_info));
|
||||||
ep_info->pfd_size = getdtablesize();
|
ep_info->pfd_size = getdtablesize();
|
||||||
ep_info->ep = epoll_create(ep_info->pfd_size);
|
ep_info->ep = epoll_create(ep_info->pfd_size);
|
||||||
|
@ -81,7 +83,7 @@ rb_init_netio_epoll(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_setup_fd_epoll(rb_fde_t * F)
|
rb_setup_fd_epoll(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -94,7 +96,7 @@ rb_setup_fd_epoll(rb_fde_t * F)
|
||||||
* and deregister interest in a pending IO state for a given FD.
|
* and deregister interest in a pending IO state for a given FD.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
rb_setselect_epoll(rb_fde_t * F, unsigned int type, PF * handler, void *client_data)
|
rb_setselect_epoll(rb_fde_t *F, unsigned int type, PF * handler, void *client_data)
|
||||||
{
|
{
|
||||||
struct epoll_event ep_event;
|
struct epoll_event ep_event;
|
||||||
int old_flags = F->pflags;
|
int old_flags = F->pflags;
|
||||||
|
@ -180,7 +182,7 @@ rb_select_epoll(long delay)
|
||||||
if(num <= 0)
|
if(num <= 0)
|
||||||
return RB_OK;
|
return RB_OK;
|
||||||
|
|
||||||
for (i = 0; i < num; i++)
|
for(i = 0; i < num; i++)
|
||||||
{
|
{
|
||||||
PF *hdl;
|
PF *hdl;
|
||||||
rb_fde_t *F = ep_info->pfd[i].data.ptr;
|
rb_fde_t *F = ep_info->pfd[i].data.ptr;
|
||||||
|
@ -244,7 +246,7 @@ rb_select_epoll(long delay)
|
||||||
return RB_OK;
|
return RB_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef EPOLL_SCHED_EVENT
|
#ifdef EPOLL_SCHED_EVENT
|
||||||
int
|
int
|
||||||
rb_epoll_supports_event(void)
|
rb_epoll_supports_event(void)
|
||||||
{
|
{
|
||||||
|
@ -253,12 +255,22 @@ rb_epoll_supports_event(void)
|
||||||
struct sigevent ev;
|
struct sigevent ev;
|
||||||
int fd;
|
int fd;
|
||||||
sigset_t set;
|
sigset_t set;
|
||||||
|
|
||||||
if(can_do_event == 1)
|
if(can_do_event == 1)
|
||||||
return 1;
|
return 1;
|
||||||
if(can_do_event == -1)
|
if(can_do_event == -1)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
#ifdef USE_TIMERFD_CREATE
|
||||||
|
if((fd = timerfd_create(CLOCK_REALTIME, 0)) >= 0)
|
||||||
|
{
|
||||||
|
close(fd);
|
||||||
|
can_do_event = 1;
|
||||||
|
can_do_timerfd = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
ev.sigev_signo = SIGVTALRM;
|
ev.sigev_signo = SIGVTALRM;
|
||||||
ev.sigev_notify = SIGEV_SIGNAL;
|
ev.sigev_notify = SIGEV_SIGNAL;
|
||||||
if(timer_create(CLOCK_REALTIME, &ev, &timer) != 0)
|
if(timer_create(CLOCK_REALTIME, &ev, &timer) != 0)
|
||||||
|
@ -269,7 +281,7 @@ rb_epoll_supports_event(void)
|
||||||
timer_delete(timer);
|
timer_delete(timer);
|
||||||
sigemptyset(&set);
|
sigemptyset(&set);
|
||||||
fd = signalfd(-1, &set, 0);
|
fd = signalfd(-1, &set, 0);
|
||||||
if(fd < 0)
|
if(fd < 0)
|
||||||
{
|
{
|
||||||
can_do_event = -1;
|
can_do_event = -1;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -281,36 +293,37 @@ rb_epoll_supports_event(void)
|
||||||
|
|
||||||
|
|
||||||
/* bleh..work around a glibc header bug on 32bit systems */
|
/* bleh..work around a glibc header bug on 32bit systems */
|
||||||
struct our_signalfd_siginfo {
|
struct our_signalfd_siginfo
|
||||||
uint32_t signo;
|
{
|
||||||
int32_t err;
|
uint32_t signo;
|
||||||
int32_t code;
|
int32_t err;
|
||||||
uint32_t pid;
|
int32_t code;
|
||||||
uint32_t uid;
|
uint32_t pid;
|
||||||
int32_t fd;
|
uint32_t uid;
|
||||||
uint32_t tid;
|
int32_t fd;
|
||||||
uint32_t band;
|
uint32_t tid;
|
||||||
uint32_t overrun;
|
uint32_t band;
|
||||||
uint32_t trapno;
|
uint32_t overrun;
|
||||||
int32_t status;
|
uint32_t trapno;
|
||||||
int32_t svint;
|
int32_t status;
|
||||||
uint64_t svptr;
|
int32_t svint;
|
||||||
uint64_t utime;
|
uint64_t svptr;
|
||||||
uint64_t stime;
|
uint64_t utime;
|
||||||
uint64_t addr;
|
uint64_t stime;
|
||||||
uint8_t pad[48];
|
uint64_t addr;
|
||||||
|
uint8_t pad[48];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#define SIGFDIOV_COUNT 16
|
#define SIGFDIOV_COUNT 16
|
||||||
static void
|
static void
|
||||||
signalfd_handler(rb_fde_t *F, void *data)
|
signalfd_handler(rb_fde_t *F, void *data)
|
||||||
{
|
{
|
||||||
static struct our_signalfd_siginfo fdsig[SIGFDIOV_COUNT];
|
static struct our_signalfd_siginfo fdsig[SIGFDIOV_COUNT];
|
||||||
static struct iovec iov[SIGFDIOV_COUNT];
|
static struct iovec iov[SIGFDIOV_COUNT];
|
||||||
struct ev_entry *ev;
|
struct ev_entry *ev;
|
||||||
int ret, x;
|
int ret, x;
|
||||||
|
|
||||||
for(x = 0; x < SIGFDIOV_COUNT; x++)
|
for(x = 0; x < SIGFDIOV_COUNT; x++)
|
||||||
{
|
{
|
||||||
iov[x].iov_base = &fdsig[x];
|
iov[x].iov_base = &fdsig[x];
|
||||||
|
@ -326,15 +339,15 @@ signalfd_handler(rb_fde_t *F, void *data)
|
||||||
rb_epoll_init_event();
|
rb_epoll_init_event();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ret < 0)
|
if(ret < 0)
|
||||||
{
|
{
|
||||||
rb_setselect(F, RB_SELECT_READ, signalfd_handler, NULL);
|
rb_setselect(F, RB_SELECT_READ, signalfd_handler, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for(x = 0; x < ret / (int)sizeof(struct signalfd_siginfo); x++)
|
for(x = 0; x < ret / (int)sizeof(struct our_signalfd_siginfo); x++)
|
||||||
{
|
{
|
||||||
ev = (struct ev_entry *)fdsig[x].svptr;
|
ev = (struct ev_entry *)((uintptr_t)fdsig[x].svptr);
|
||||||
if(ev == NULL)
|
if(ev == NULL)
|
||||||
continue;
|
continue;
|
||||||
rb_run_event(ev);
|
rb_run_event(ev);
|
||||||
|
@ -345,26 +358,32 @@ signalfd_handler(rb_fde_t *F, void *data)
|
||||||
void
|
void
|
||||||
rb_epoll_init_event(void)
|
rb_epoll_init_event(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
sigset_t ss;
|
sigset_t ss;
|
||||||
rb_fde_t *F;
|
rb_fde_t *F;
|
||||||
int sfd;
|
int sfd;
|
||||||
sigemptyset(&ss);
|
rb_epoll_supports_event();
|
||||||
sigaddset(&ss, RTSIGNAL);
|
if(!can_do_timerfd)
|
||||||
sigprocmask(SIG_BLOCK, &ss, 0);
|
{
|
||||||
sigemptyset(&ss);
|
sigemptyset(&ss);
|
||||||
sigaddset(&ss, RTSIGNAL);
|
sigaddset(&ss, RTSIGNAL);
|
||||||
sfd = signalfd(-1, &ss, 0);
|
sigprocmask(SIG_BLOCK, &ss, 0);
|
||||||
if(sfd == -1) {
|
sigemptyset(&ss);
|
||||||
can_do_event = -1;
|
sigaddset(&ss, RTSIGNAL);
|
||||||
return;
|
sfd = signalfd(-1, &ss, 0);
|
||||||
|
if(sfd == -1)
|
||||||
|
{
|
||||||
|
can_do_event = -1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
F = rb_open(sfd, RB_FD_UNKNOWN, "signalfd");
|
||||||
|
rb_set_nb(F);
|
||||||
|
signalfd_handler(F, NULL);
|
||||||
}
|
}
|
||||||
F = rb_open(sfd, RB_FD_UNKNOWN, "signalfd");
|
|
||||||
rb_set_nb(F);
|
|
||||||
signalfd_handler(F, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
static int
|
||||||
rb_epoll_sched_event(struct ev_entry *event, int when)
|
rb_epoll_sched_event_signalfd(struct ev_entry *event, int when)
|
||||||
{
|
{
|
||||||
timer_t *id;
|
timer_t *id;
|
||||||
struct sigevent ev;
|
struct sigevent ev;
|
||||||
|
@ -377,7 +396,7 @@ rb_epoll_sched_event(struct ev_entry *event, int when)
|
||||||
ev.sigev_signo = RTSIGNAL;
|
ev.sigev_signo = RTSIGNAL;
|
||||||
ev.sigev_value.sival_ptr = event;
|
ev.sigev_value.sival_ptr = event;
|
||||||
|
|
||||||
if (timer_create(CLOCK_REALTIME, &ev, id) < 0)
|
if(timer_create(CLOCK_REALTIME, &ev, id) < 0)
|
||||||
{
|
{
|
||||||
rb_lib_log("timer_create: %s\n", strerror(errno));
|
rb_lib_log("timer_create: %s\n", strerror(errno));
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -387,8 +406,8 @@ rb_epoll_sched_event(struct ev_entry *event, int when)
|
||||||
ts.it_value.tv_nsec = 0;
|
ts.it_value.tv_nsec = 0;
|
||||||
if(event->frequency != 0)
|
if(event->frequency != 0)
|
||||||
ts.it_interval = ts.it_value;
|
ts.it_interval = ts.it_value;
|
||||||
|
|
||||||
if(timer_settime(*id, 0, &ts, NULL) < 0)
|
if(timer_settime(*id, 0, &ts, NULL) < 0)
|
||||||
{
|
{
|
||||||
rb_lib_log("timer_settime: %s\n", strerror(errno));
|
rb_lib_log("timer_settime: %s\n", strerror(errno));
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -396,10 +415,94 @@ rb_epoll_sched_event(struct ev_entry *event, int when)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_TIMERFD_CREATE
|
||||||
|
static void
|
||||||
|
rb_read_timerfd(rb_fde_t *F, void *data)
|
||||||
|
{
|
||||||
|
struct ev_entry *event = (struct ev_entry *)data;
|
||||||
|
int retlen;
|
||||||
|
uint64_t count;
|
||||||
|
|
||||||
|
if(event == NULL)
|
||||||
|
{
|
||||||
|
rb_close(F);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
retlen = rb_read(F, &count, sizeof(count));
|
||||||
|
if(retlen == 0 || (retlen < 0 && !rb_ignore_errno(errno)))
|
||||||
|
{
|
||||||
|
rb_close(F);
|
||||||
|
rb_lib_log("rb_read_timerfd: timerfd[%s] closed on error: %s", event->name,
|
||||||
|
strerror(errno));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
rb_setselect(F, RB_SELECT_READ, rb_read_timerfd, event);
|
||||||
|
rb_run_event(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
rb_epoll_sched_event_timerfd(struct ev_entry *event, int when)
|
||||||
|
{
|
||||||
|
struct itimerspec ts;
|
||||||
|
static char buf[FD_DESC_SZ + 8];
|
||||||
|
int fd;
|
||||||
|
rb_fde_t *F;
|
||||||
|
|
||||||
|
if((fd = timerfd_create(CLOCK_REALTIME, 0)) < 0)
|
||||||
|
{
|
||||||
|
rb_lib_log("timerfd_create: %s\n", strerror(errno));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&ts, 0, sizeof(ts));
|
||||||
|
ts.it_value.tv_sec = when;
|
||||||
|
ts.it_value.tv_nsec = 0;
|
||||||
|
if(event->frequency != 0)
|
||||||
|
ts.it_interval = ts.it_value;
|
||||||
|
|
||||||
|
if(timerfd_settime(fd, 0, &ts, NULL) < 0)
|
||||||
|
{
|
||||||
|
rb_lib_log("timerfd_settime: %s\n", strerror(errno));
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
rb_snprintf(buf, sizeof(buf), "timerfd: %s", event->name);
|
||||||
|
F = rb_open(fd, RB_FD_UNKNOWN, buf);
|
||||||
|
rb_set_nb(F);
|
||||||
|
event->comm_ptr = F;
|
||||||
|
rb_setselect(F, RB_SELECT_READ, rb_read_timerfd, event);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
rb_epoll_sched_event(struct ev_entry *event, int when)
|
||||||
|
{
|
||||||
|
#ifdef USE_TIMERFD_CREATE
|
||||||
|
if(can_do_timerfd)
|
||||||
|
{
|
||||||
|
return rb_epoll_sched_event_timerfd(event, when);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return rb_epoll_sched_event_signalfd(event, when);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_epoll_unsched_event(struct ev_entry *event)
|
rb_epoll_unsched_event(struct ev_entry *event)
|
||||||
{
|
{
|
||||||
timer_delete(*((timer_t *)event->comm_ptr));
|
#ifdef USE_TIMERFD_CREATE
|
||||||
|
if(can_do_timerfd)
|
||||||
|
{
|
||||||
|
rb_close((rb_fde_t *)event->comm_ptr);
|
||||||
|
event->comm_ptr = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
timer_delete(*((timer_t *) event->comm_ptr));
|
||||||
rb_free(event->comm_ptr);
|
rb_free(event->comm_ptr);
|
||||||
event->comm_ptr = NULL;
|
event->comm_ptr = NULL;
|
||||||
}
|
}
|
||||||
|
@ -413,7 +516,7 @@ rb_init_netio_epoll(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_setselect_epoll(rb_fde_t * F, unsigned int type, PF * handler, void *client_data)
|
rb_setselect_epoll(rb_fde_t *F, unsigned int type, PF * handler, void *client_data)
|
||||||
{
|
{
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
return;
|
return;
|
||||||
|
@ -427,7 +530,7 @@ rb_select_epoll(long delay)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_setup_fd_epoll(rb_fde_t * F)
|
rb_setup_fd_epoll(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -437,7 +540,8 @@ rb_setup_fd_epoll(rb_fde_t * F)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(USING_EPOLL) || !defined(EPOLL_SCHED_EVENT)
|
#if !defined(USING_EPOLL) || !defined(EPOLL_SCHED_EVENT)
|
||||||
void rb_epoll_init_event(void)
|
void
|
||||||
|
rb_epoll_init_event(void)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: event.c 25147 2008-03-28 17:15:47Z androsyn $
|
* $Id: event.c 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <libratbox_config.h>
|
#include <libratbox_config.h>
|
||||||
|
@ -47,24 +47,11 @@
|
||||||
#include <commio-int.h>
|
#include <commio-int.h>
|
||||||
#include <event-int.h>
|
#include <event-int.h>
|
||||||
|
|
||||||
static const char *last_event_ran = NULL;
|
#define EV_NAME_LEN 33
|
||||||
|
static char last_event_ran[EV_NAME_LEN];
|
||||||
static rb_dlink_list event_list;
|
static rb_dlink_list event_list;
|
||||||
|
|
||||||
static time_t event_time_min = -1;
|
static time_t event_time_min = -1;
|
||||||
/* The list of event processes */
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
struct ev_entry
|
|
||||||
{
|
|
||||||
rb_dlink_node node;
|
|
||||||
EVH *func;
|
|
||||||
void *arg;
|
|
||||||
const char *name;
|
|
||||||
time_t frequency;
|
|
||||||
time_t when;
|
|
||||||
void *data;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* struct ev_entry *
|
* struct ev_entry *
|
||||||
|
@ -104,7 +91,7 @@ rb_event_add(const char *name, EVH * func, void *arg, time_t when)
|
||||||
struct ev_entry *ev;
|
struct ev_entry *ev;
|
||||||
ev = rb_malloc(sizeof(struct ev_entry));
|
ev = rb_malloc(sizeof(struct ev_entry));
|
||||||
ev->func = func;
|
ev->func = func;
|
||||||
ev->name = name;
|
ev->name = rb_strndup(name, EV_NAME_LEN);
|
||||||
ev->arg = arg;
|
ev->arg = arg;
|
||||||
ev->when = rb_current_time() + when;
|
ev->when = rb_current_time() + when;
|
||||||
ev->frequency = when;
|
ev->frequency = when;
|
||||||
|
@ -117,13 +104,14 @@ rb_event_add(const char *name, EVH * func, void *arg, time_t when)
|
||||||
rb_io_sched_event(ev, when);
|
rb_io_sched_event(ev, when);
|
||||||
return ev;
|
return ev;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ev_entry *
|
struct ev_entry *
|
||||||
rb_event_addonce(const char *name, EVH * func, void *arg, time_t when)
|
rb_event_addonce(const char *name, EVH * func, void *arg, time_t when)
|
||||||
{
|
{
|
||||||
struct ev_entry *ev;
|
struct ev_entry *ev;
|
||||||
ev = rb_malloc(sizeof(struct ev_entry));
|
ev = rb_malloc(sizeof(struct ev_entry));
|
||||||
ev->func = func;
|
ev->func = func;
|
||||||
ev->name = name;
|
ev->name = rb_strndup(name, EV_NAME_LEN);
|
||||||
ev->arg = arg;
|
ev->arg = arg;
|
||||||
ev->when = rb_current_time() + when;
|
ev->when = rb_current_time() + when;
|
||||||
ev->frequency = 0;
|
ev->frequency = 0;
|
||||||
|
@ -151,6 +139,7 @@ rb_event_delete(struct ev_entry *ev)
|
||||||
|
|
||||||
rb_dlinkDelete(&ev->node, &event_list);
|
rb_dlinkDelete(&ev->node, &event_list);
|
||||||
rb_io_unsched_event(ev);
|
rb_io_unsched_event(ev);
|
||||||
|
rb_free(ev->name);
|
||||||
rb_free(ev);
|
rb_free(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,7 +151,7 @@ rb_event_delete(struct ev_entry *ev)
|
||||||
* Side Effects: Removes the event from the event list
|
* Side Effects: Removes the event from the event list
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
rb_event_find_delete(EVH *func, void *arg)
|
rb_event_find_delete(EVH * func, void *arg)
|
||||||
{
|
{
|
||||||
rb_event_delete(rb_event_find(func, arg));
|
rb_event_delete(rb_event_find(func, arg));
|
||||||
}
|
}
|
||||||
|
@ -196,7 +185,7 @@ rb_event_addish(const char *name, EVH * func, void *arg, time_t delta_ish)
|
||||||
void
|
void
|
||||||
rb_run_event(struct ev_entry *ev)
|
rb_run_event(struct ev_entry *ev)
|
||||||
{
|
{
|
||||||
last_event_ran = ev->name;
|
rb_strlcpy(last_event_ran, ev->name, sizeof(last_event_ran));
|
||||||
ev->func(ev->arg);
|
ev->func(ev->arg);
|
||||||
if(!ev->frequency)
|
if(!ev->frequency)
|
||||||
{
|
{
|
||||||
|
@ -222,7 +211,7 @@ rb_event_run(void)
|
||||||
{
|
{
|
||||||
rb_dlink_node *ptr, *next;
|
rb_dlink_node *ptr, *next;
|
||||||
struct ev_entry *ev;
|
struct ev_entry *ev;
|
||||||
|
|
||||||
if(rb_io_supports_event())
|
if(rb_io_supports_event())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -232,11 +221,11 @@ rb_event_run(void)
|
||||||
ev = ptr->data;
|
ev = ptr->data;
|
||||||
if(ev->when <= rb_current_time())
|
if(ev->when <= rb_current_time())
|
||||||
{
|
{
|
||||||
last_event_ran = ev->name;
|
rb_strlcpy(last_event_ran, ev->name, sizeof(last_event_ran));
|
||||||
ev->func(ev->arg);
|
ev->func(ev->arg);
|
||||||
|
|
||||||
/* event is scheduled more than once */
|
/* event is scheduled more than once */
|
||||||
if(ev->frequency)
|
if(ev->frequency)
|
||||||
{
|
{
|
||||||
ev->when = rb_current_time() + ev->frequency;
|
ev->when = rb_current_time() + ev->frequency;
|
||||||
if((ev->when < event_time_min) || (event_time_min == -1))
|
if((ev->when < event_time_min) || (event_time_min == -1))
|
||||||
|
@ -247,7 +236,9 @@ rb_event_run(void)
|
||||||
rb_dlinkDelete(&ev->node, &event_list);
|
rb_dlinkDelete(&ev->node, &event_list);
|
||||||
rb_free(ev);
|
rb_free(ev);
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if((ev->when < event_time_min) || (event_time_min == -1))
|
if((ev->when < event_time_min) || (event_time_min == -1))
|
||||||
event_time_min = ev->when;
|
event_time_min = ev->when;
|
||||||
}
|
}
|
||||||
|
@ -262,14 +253,15 @@ rb_event_io_register_all(void)
|
||||||
int when;
|
int when;
|
||||||
if(!rb_io_supports_event())
|
if(!rb_io_supports_event())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
RB_DLINK_FOREACH(ptr, event_list.head)
|
RB_DLINK_FOREACH(ptr, event_list.head)
|
||||||
{
|
{
|
||||||
ev = ptr->data;
|
ev = ptr->data;
|
||||||
when = ev->when - rb_current_time();
|
when = ev->when - rb_current_time();
|
||||||
rb_io_sched_event(ev, when);
|
rb_io_sched_event(ev, when);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* void rb_event_init(void)
|
* void rb_event_init(void)
|
||||||
*
|
*
|
||||||
|
@ -280,7 +272,7 @@ rb_event_io_register_all(void)
|
||||||
void
|
void
|
||||||
rb_event_init(void)
|
rb_event_init(void)
|
||||||
{
|
{
|
||||||
last_event_ran = NULL;
|
rb_strlcpy(last_event_ran, "NONE", sizeof(last_event_ran));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -291,11 +283,10 @@ rb_dump_events(void (*func) (char *, void *), void *ptr)
|
||||||
rb_dlink_node *dptr;
|
rb_dlink_node *dptr;
|
||||||
struct ev_entry *ev;
|
struct ev_entry *ev;
|
||||||
len = sizeof(buf);
|
len = sizeof(buf);
|
||||||
if(last_event_ran)
|
|
||||||
{
|
rb_snprintf(buf, len, "Last event to run: %s", last_event_ran);
|
||||||
rb_snprintf(buf, len, "Last event to run: %s", last_event_ran);
|
func(buf, ptr);
|
||||||
func(buf, ptr);
|
|
||||||
}
|
|
||||||
rb_strlcpy(buf, "Operation Next Execution", len);
|
rb_strlcpy(buf, "Operation Next Execution", len);
|
||||||
func(buf, ptr);
|
func(buf, ptr);
|
||||||
|
|
||||||
|
@ -303,7 +294,7 @@ rb_dump_events(void (*func) (char *, void *), void *ptr)
|
||||||
{
|
{
|
||||||
ev = dptr->data;
|
ev = dptr->data;
|
||||||
rb_snprintf(buf, len, "%-28s %-4ld seconds", ev->name,
|
rb_snprintf(buf, len, "%-28s %-4ld seconds", ev->name,
|
||||||
ev->when - (long) rb_current_time());
|
ev->when - (long)rb_current_time());
|
||||||
func(buf, ptr);
|
func(buf, ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -146,3 +146,10 @@ rb_supports_ssl
|
||||||
rb_ssl_handshake_count
|
rb_ssl_handshake_count
|
||||||
rb_ssl_clear_handshake_count
|
rb_ssl_clear_handshake_count
|
||||||
rb_get_pseudo_random
|
rb_get_pseudo_random
|
||||||
|
rb_strerror
|
||||||
|
rb_kill
|
||||||
|
rb_setenv
|
||||||
|
rb_getpid
|
||||||
|
rb_waitpid
|
||||||
|
rb_basename
|
||||||
|
rb_dirname
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: gnutls.c 25793 2008-07-29 14:47:48Z androsyn $
|
* $Id: gnutls.c 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <libratbox_config.h>
|
#include <libratbox_config.h>
|
||||||
|
@ -40,12 +40,12 @@ static gnutls_dh_params dh_params;
|
||||||
#define SSL_P(x) *((gnutls_session_t *)F->ssl)
|
#define SSL_P(x) *((gnutls_session_t *)F->ssl)
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_ssl_shutdown(rb_fde_t * F)
|
rb_ssl_shutdown(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
if(F == NULL || F->ssl == NULL)
|
if(F == NULL || F->ssl == NULL)
|
||||||
return;
|
return;
|
||||||
for (i = 0; i < 4; i++)
|
for(i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
if(gnutls_bye(SSL_P(F), GNUTLS_SHUT_RDWR) == GNUTLS_E_SUCCESS)
|
if(gnutls_bye(SSL_P(F), GNUTLS_SHUT_RDWR) == GNUTLS_E_SUCCESS)
|
||||||
break;
|
break;
|
||||||
|
@ -67,17 +67,18 @@ rb_ssl_clear_handshake_count(rb_fde_t *F)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rb_ssl_timeout(rb_fde_t * F, void *notused)
|
rb_ssl_timeout(rb_fde_t *F, void *notused)
|
||||||
{
|
{
|
||||||
lrb_assert(F->accept != NULL);
|
lrb_assert(F->accept != NULL);
|
||||||
F->accept->callback(F, RB_ERR_TIMEOUT, NULL, 0, F->accept->data);
|
F->accept->callback(F, RB_ERR_TIMEOUT, NULL, 0, F->accept->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int do_ssl_handshake(rb_fde_t *F, PF *callback)
|
static int
|
||||||
|
do_ssl_handshake(rb_fde_t *F, PF * callback)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int flags;
|
int flags;
|
||||||
|
|
||||||
ret = gnutls_handshake(SSL_P(F));
|
ret = gnutls_handshake(SSL_P(F));
|
||||||
if(ret < 0)
|
if(ret < 0)
|
||||||
|
@ -88,17 +89,17 @@ static int do_ssl_handshake(rb_fde_t *F, PF *callback)
|
||||||
flags = RB_SELECT_READ;
|
flags = RB_SELECT_READ;
|
||||||
else
|
else
|
||||||
flags = RB_SELECT_WRITE;
|
flags = RB_SELECT_WRITE;
|
||||||
rb_setselect(F, flags, callback, NULL);
|
rb_setselect(F, flags, callback, NULL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
F->ssl_errno = ret;
|
F->ssl_errno = ret;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 1; /* handshake is finished..go about life */
|
return 1; /* handshake is finished..go about life */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rb_ssl_tryaccept(rb_fde_t * F, void *data)
|
rb_ssl_tryaccept(rb_fde_t *F, void *data)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct acceptdata *ad;
|
struct acceptdata *ad;
|
||||||
|
@ -106,46 +107,45 @@ rb_ssl_tryaccept(rb_fde_t * F, void *data)
|
||||||
lrb_assert(F->accept != NULL);
|
lrb_assert(F->accept != NULL);
|
||||||
|
|
||||||
ret = do_ssl_handshake(F, rb_ssl_tryaccept);
|
ret = do_ssl_handshake(F, rb_ssl_tryaccept);
|
||||||
|
|
||||||
switch(ret)
|
switch (ret)
|
||||||
{
|
{
|
||||||
case -1:
|
case -1:
|
||||||
F->accept->callback(F, RB_ERROR_SSL, NULL, 0, F->accept->data);
|
F->accept->callback(F, RB_ERROR_SSL, NULL, 0, F->accept->data);
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
/* do_ssl_handshake does the rb_setselect stuff */
|
/* do_ssl_handshake does the rb_setselect stuff */
|
||||||
return;
|
return;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
rb_settimeout(F, 0, NULL, NULL);
|
rb_settimeout(F, 0, NULL, NULL);
|
||||||
rb_setselect(F, RB_SELECT_READ | RB_SELECT_WRITE, NULL, NULL);
|
rb_setselect(F, RB_SELECT_READ | RB_SELECT_WRITE, NULL, NULL);
|
||||||
|
|
||||||
ad = F->accept;
|
ad = F->accept;
|
||||||
F->accept = NULL;
|
F->accept = NULL;
|
||||||
ad->callback(F, RB_OK, (struct sockaddr *) &ad->S, ad->addrlen,
|
ad->callback(F, RB_OK, (struct sockaddr *)&ad->S, ad->addrlen, ad->data);
|
||||||
ad->data);
|
|
||||||
rb_free(ad);
|
rb_free(ad);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_ssl_start_accepted(rb_fde_t * new_F, ACCB * cb, void *data, int timeout)
|
rb_ssl_start_accepted(rb_fde_t *new_F, ACCB * cb, void *data, int timeout)
|
||||||
{
|
{
|
||||||
gnutls_session_t *ssl;
|
gnutls_session_t *ssl;
|
||||||
new_F->type |= RB_FD_SSL;
|
new_F->type |= RB_FD_SSL;
|
||||||
ssl = new_F->ssl = rb_malloc(sizeof(gnutls_session_t));
|
ssl = new_F->ssl = rb_malloc(sizeof(gnutls_session_t));
|
||||||
new_F->accept = rb_malloc(sizeof(struct acceptdata));
|
new_F->accept = rb_malloc(sizeof(struct acceptdata));
|
||||||
|
|
||||||
new_F->accept->callback = cb;
|
new_F->accept->callback = cb;
|
||||||
new_F->accept->data = data;
|
new_F->accept->data = data;
|
||||||
rb_settimeout(new_F, timeout, rb_ssl_timeout, NULL);
|
rb_settimeout(new_F, timeout, rb_ssl_timeout, NULL);
|
||||||
|
|
||||||
new_F->accept->addrlen = 0;
|
new_F->accept->addrlen = 0;
|
||||||
|
|
||||||
gnutls_init(ssl, GNUTLS_SERVER);
|
gnutls_init(ssl, GNUTLS_SERVER);
|
||||||
gnutls_set_default_priority(*ssl);
|
gnutls_set_default_priority(*ssl);
|
||||||
gnutls_credentials_set(*ssl, GNUTLS_CRD_CERTIFICATE, x509);
|
gnutls_credentials_set(*ssl, GNUTLS_CRD_CERTIFICATE, x509);
|
||||||
gnutls_dh_set_prime_bits(*ssl, 1024);
|
gnutls_dh_set_prime_bits(*ssl, 1024);
|
||||||
|
@ -154,8 +154,8 @@ rb_ssl_start_accepted(rb_fde_t * new_F, ACCB * cb, void *data, int timeout)
|
||||||
{
|
{
|
||||||
struct acceptdata *ad = new_F->accept;
|
struct acceptdata *ad = new_F->accept;
|
||||||
new_F->accept = NULL;
|
new_F->accept = NULL;
|
||||||
ad->callback(new_F, RB_OK, (struct sockaddr *) &ad->S, ad->addrlen, ad->data);
|
ad->callback(new_F, RB_OK, (struct sockaddr *)&ad->S, ad->addrlen, ad->data);
|
||||||
rb_free(ad);
|
rb_free(ad);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -164,7 +164,7 @@ rb_ssl_start_accepted(rb_fde_t * new_F, ACCB * cb, void *data, int timeout)
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_ssl_accept_setup(rb_fde_t * F, rb_fde_t *new_F, struct sockaddr *st, int addrlen)
|
rb_ssl_accept_setup(rb_fde_t *F, rb_fde_t *new_F, struct sockaddr *st, int addrlen)
|
||||||
{
|
{
|
||||||
new_F->type |= RB_FD_SSL;
|
new_F->type |= RB_FD_SSL;
|
||||||
new_F->ssl = rb_malloc(sizeof(gnutls_session_t));
|
new_F->ssl = rb_malloc(sizeof(gnutls_session_t));
|
||||||
|
@ -176,7 +176,7 @@ rb_ssl_accept_setup(rb_fde_t * F, rb_fde_t *new_F, struct sockaddr *st, int addr
|
||||||
memcpy(&new_F->accept->S, st, addrlen);
|
memcpy(&new_F->accept->S, st, addrlen);
|
||||||
new_F->accept->addrlen = addrlen;
|
new_F->accept->addrlen = addrlen;
|
||||||
|
|
||||||
gnutls_init((gnutls_session_t *)new_F->ssl, GNUTLS_SERVER);
|
gnutls_init((gnutls_session_t *) new_F->ssl, GNUTLS_SERVER);
|
||||||
gnutls_set_default_priority(SSL_P(new_F));
|
gnutls_set_default_priority(SSL_P(new_F));
|
||||||
gnutls_credentials_set(SSL_P(new_F), GNUTLS_CRD_CERTIFICATE, x509);
|
gnutls_credentials_set(SSL_P(new_F), GNUTLS_CRD_CERTIFICATE, x509);
|
||||||
gnutls_dh_set_prime_bits(SSL_P(new_F), 1024);
|
gnutls_dh_set_prime_bits(SSL_P(new_F), 1024);
|
||||||
|
@ -185,8 +185,8 @@ rb_ssl_accept_setup(rb_fde_t * F, rb_fde_t *new_F, struct sockaddr *st, int addr
|
||||||
{
|
{
|
||||||
struct acceptdata *ad = F->accept;
|
struct acceptdata *ad = F->accept;
|
||||||
F->accept = NULL;
|
F->accept = NULL;
|
||||||
ad->callback(F, RB_OK, (struct sockaddr *) &ad->S, ad->addrlen, ad->data);
|
ad->callback(F, RB_OK, (struct sockaddr *)&ad->S, ad->addrlen, ad->data);
|
||||||
rb_free(ad);
|
rb_free(ad);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,7 +194,7 @@ rb_ssl_accept_setup(rb_fde_t * F, rb_fde_t *new_F, struct sockaddr *st, int addr
|
||||||
|
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
rb_ssl_read_or_write(int r_or_w, rb_fde_t * F, void *rbuf, const void *wbuf, size_t count)
|
rb_ssl_read_or_write(int r_or_w, rb_fde_t *F, void *rbuf, const void *wbuf, size_t count)
|
||||||
{
|
{
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
gnutls_session_t *ssl = F->ssl;
|
gnutls_session_t *ssl = F->ssl;
|
||||||
|
@ -206,7 +206,7 @@ rb_ssl_read_or_write(int r_or_w, rb_fde_t * F, void *rbuf, const void *wbuf, siz
|
||||||
|
|
||||||
if(ret < 0)
|
if(ret < 0)
|
||||||
{
|
{
|
||||||
switch(ret)
|
switch (ret)
|
||||||
{
|
{
|
||||||
case GNUTLS_E_AGAIN:
|
case GNUTLS_E_AGAIN:
|
||||||
case GNUTLS_E_INTERRUPTED:
|
case GNUTLS_E_INTERRUPTED:
|
||||||
|
@ -228,13 +228,13 @@ rb_ssl_read_or_write(int r_or_w, rb_fde_t * F, void *rbuf, const void *wbuf, siz
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
rb_ssl_read(rb_fde_t * F, void *buf, size_t count)
|
rb_ssl_read(rb_fde_t *F, void *buf, size_t count)
|
||||||
{
|
{
|
||||||
return rb_ssl_read_or_write(0, F, buf, NULL, count);
|
return rb_ssl_read_or_write(0, F, buf, NULL, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
rb_ssl_write(rb_fde_t * F, const void *buf, size_t count)
|
rb_ssl_write(rb_fde_t *F, const void *buf, size_t count)
|
||||||
{
|
{
|
||||||
return rb_ssl_read_or_write(1, F, NULL, buf, count);
|
return rb_ssl_read_or_write(1, F, NULL, buf, count);
|
||||||
}
|
}
|
||||||
|
@ -249,7 +249,7 @@ int
|
||||||
rb_init_ssl(void)
|
rb_init_ssl(void)
|
||||||
{
|
{
|
||||||
gnutls_global_init();
|
gnutls_global_init();
|
||||||
|
|
||||||
if(gnutls_certificate_allocate_credentials(&x509) != GNUTLS_E_SUCCESS)
|
if(gnutls_certificate_allocate_credentials(&x509) != GNUTLS_E_SUCCESS)
|
||||||
{
|
{
|
||||||
rb_lib_log("rb_init_ssl: Unable to allocate SSL/TLS certificate credentials");
|
rb_lib_log("rb_init_ssl: Unable to allocate SSL/TLS certificate credentials");
|
||||||
|
@ -260,7 +260,7 @@ rb_init_ssl(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rb_free_datum_t(gnutls_datum_t *d)
|
rb_free_datum_t(gnutls_datum_t * d)
|
||||||
{
|
{
|
||||||
rb_free(d->data);
|
rb_free(d->data);
|
||||||
rb_free(d);
|
rb_free(d);
|
||||||
|
@ -279,15 +279,15 @@ rb_load_file_into_datum_t(const char *file)
|
||||||
|
|
||||||
datum = rb_malloc(sizeof(gnutls_datum_t));
|
datum = rb_malloc(sizeof(gnutls_datum_t));
|
||||||
|
|
||||||
if(fileinfo.st_size > 131072) /* deal with retards */
|
if(fileinfo.st_size > 131072) /* deal with retards */
|
||||||
datum->size = 131072;
|
datum->size = 131072;
|
||||||
else
|
else
|
||||||
datum->size = fileinfo.st_size;
|
datum->size = fileinfo.st_size;
|
||||||
|
|
||||||
datum->data = rb_malloc(datum->size + 1);
|
datum->data = rb_malloc(datum->size + 1);
|
||||||
fread(datum->data, datum->size, 1, f);
|
fread(datum->data, datum->size, 1, f);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
return datum;
|
return datum;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -312,16 +312,19 @@ rb_setup_ssl_server(const char *cert, const char *keyfile, const char *dhfile)
|
||||||
rb_lib_log("rb_setup_ssl_server: Error loading key: %s", strerror(errno));
|
rb_lib_log("rb_setup_ssl_server: Error loading key: %s", strerror(errno));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if((ret = gnutls_certificate_set_x509_key_mem(x509, d_cert, d_key, GNUTLS_X509_FMT_PEM)) != GNUTLS_E_SUCCESS)
|
if((ret =
|
||||||
|
gnutls_certificate_set_x509_key_mem(x509, d_cert, d_key,
|
||||||
|
GNUTLS_X509_FMT_PEM)) != GNUTLS_E_SUCCESS)
|
||||||
{
|
{
|
||||||
rb_lib_log("rb_setup_ssl_server: Error loading certificate or key file: %s", gnutls_strerror(ret));
|
rb_lib_log("rb_setup_ssl_server: Error loading certificate or key file: %s",
|
||||||
|
gnutls_strerror(ret));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
rb_free_datum_t(d_cert);
|
rb_free_datum_t(d_cert);
|
||||||
rb_free_datum_t(d_key);
|
rb_free_datum_t(d_key);
|
||||||
|
|
||||||
if(dhfile != NULL)
|
if(dhfile != NULL)
|
||||||
{
|
{
|
||||||
if(gnutls_dh_params_init(&dh_params) == GNUTLS_E_SUCCESS)
|
if(gnutls_dh_params_init(&dh_params) == GNUTLS_E_SUCCESS)
|
||||||
|
@ -331,20 +334,24 @@ rb_setup_ssl_server(const char *cert, const char *keyfile, const char *dhfile)
|
||||||
data = rb_load_file_into_datum_t(dhfile);
|
data = rb_load_file_into_datum_t(dhfile);
|
||||||
if(data != NULL)
|
if(data != NULL)
|
||||||
{
|
{
|
||||||
xret = gnutls_dh_params_import_pkcs3(dh_params, data, GNUTLS_X509_FMT_PEM);
|
xret = gnutls_dh_params_import_pkcs3(dh_params, data,
|
||||||
|
GNUTLS_X509_FMT_PEM);
|
||||||
if(xret < 0)
|
if(xret < 0)
|
||||||
rb_lib_log("rb_setup_ssl_server: Error parsing DH file: %s\n", gnutls_strerror(xret));
|
rb_lib_log
|
||||||
|
("rb_setup_ssl_server: Error parsing DH file: %s\n",
|
||||||
|
gnutls_strerror(xret));
|
||||||
rb_free_datum_t(data);
|
rb_free_datum_t(data);
|
||||||
}
|
}
|
||||||
gnutls_certificate_set_dh_params(x509, dh_params);
|
gnutls_certificate_set_dh_params(x509, dh_params);
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
rb_lib_log("rb_setup_ssl_server: Unable to setup DH parameters");
|
rb_lib_log("rb_setup_ssl_server: Unable to setup DH parameters");
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_ssl_listen(rb_fde_t * F, int backlog)
|
rb_ssl_listen(rb_fde_t *F, int backlog)
|
||||||
{
|
{
|
||||||
F->type = RB_FD_SOCKET | RB_FD_LISTEN | RB_FD_SSL;
|
F->type = RB_FD_SOCKET | RB_FD_LISTEN | RB_FD_SSL;
|
||||||
return listen(F->fd, backlog);
|
return listen(F->fd, backlog);
|
||||||
|
@ -358,7 +365,7 @@ struct ssl_connect
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rb_ssl_connect_realcb(rb_fde_t * F, int status, struct ssl_connect *sconn)
|
rb_ssl_connect_realcb(rb_fde_t *F, int status, struct ssl_connect *sconn)
|
||||||
{
|
{
|
||||||
F->connect->callback = sconn->callback;
|
F->connect->callback = sconn->callback;
|
||||||
F->connect->data = sconn->data;
|
F->connect->data = sconn->data;
|
||||||
|
@ -367,37 +374,37 @@ rb_ssl_connect_realcb(rb_fde_t * F, int status, struct ssl_connect *sconn)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rb_ssl_tryconn_timeout_cb(rb_fde_t * F, void *data)
|
rb_ssl_tryconn_timeout_cb(rb_fde_t *F, void *data)
|
||||||
{
|
{
|
||||||
rb_ssl_connect_realcb(F, RB_ERR_TIMEOUT, data);
|
rb_ssl_connect_realcb(F, RB_ERR_TIMEOUT, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rb_ssl_tryconn_cb(rb_fde_t * F, void *data)
|
rb_ssl_tryconn_cb(rb_fde_t *F, void *data)
|
||||||
{
|
{
|
||||||
struct ssl_connect *sconn = data;
|
struct ssl_connect *sconn = data;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = do_ssl_handshake(F, rb_ssl_tryconn_cb);
|
ret = do_ssl_handshake(F, rb_ssl_tryconn_cb);
|
||||||
|
|
||||||
switch(ret)
|
switch (ret)
|
||||||
{
|
{
|
||||||
case -1:
|
case -1:
|
||||||
rb_ssl_connect_realcb(F, RB_ERROR_SSL, sconn);
|
rb_ssl_connect_realcb(F, RB_ERROR_SSL, sconn);
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
/* do_ssl_handshake does the rb_setselect stuff */
|
/* do_ssl_handshake does the rb_setselect stuff */
|
||||||
return;
|
return;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
rb_ssl_connect_realcb(F, RB_OK, sconn);
|
rb_ssl_connect_realcb(F, RB_OK, sconn);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rb_ssl_tryconn(rb_fde_t * F, int status, void *data)
|
rb_ssl_tryconn(rb_fde_t *F, int status, void *data)
|
||||||
{
|
{
|
||||||
struct ssl_connect *sconn = data;
|
struct ssl_connect *sconn = data;
|
||||||
if(status != RB_OK)
|
if(status != RB_OK)
|
||||||
|
@ -408,11 +415,11 @@ rb_ssl_tryconn(rb_fde_t * F, int status, void *data)
|
||||||
|
|
||||||
F->type |= RB_FD_SSL;
|
F->type |= RB_FD_SSL;
|
||||||
|
|
||||||
|
|
||||||
rb_settimeout(F, sconn->timeout, rb_ssl_tryconn_timeout_cb, sconn);
|
rb_settimeout(F, sconn->timeout, rb_ssl_tryconn_timeout_cb, sconn);
|
||||||
F->ssl = rb_malloc(sizeof(gnutls_session_t));
|
F->ssl = rb_malloc(sizeof(gnutls_session_t));
|
||||||
gnutls_init(F->ssl, GNUTLS_CLIENT);
|
gnutls_init(F->ssl, GNUTLS_CLIENT);
|
||||||
gnutls_set_default_priority(SSL_P(F));
|
gnutls_set_default_priority(SSL_P(F));
|
||||||
gnutls_dh_set_prime_bits(SSL_P(F), 1024);
|
gnutls_dh_set_prime_bits(SSL_P(F), 1024);
|
||||||
gnutls_transport_set_ptr(SSL_P(F), (gnutls_transport_ptr_t) (long int)F->fd);
|
gnutls_transport_set_ptr(SSL_P(F), (gnutls_transport_ptr_t) (long int)F->fd);
|
||||||
|
|
||||||
|
@ -423,7 +430,7 @@ rb_ssl_tryconn(rb_fde_t * F, int status, void *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_connect_tcp_ssl(rb_fde_t * F, struct sockaddr *dest,
|
rb_connect_tcp_ssl(rb_fde_t *F, struct sockaddr *dest,
|
||||||
struct sockaddr *clocal, int socklen, CNCB * callback, void *data, int timeout)
|
struct sockaddr *clocal, int socklen, CNCB * callback, void *data, int timeout)
|
||||||
{
|
{
|
||||||
struct ssl_connect *sconn;
|
struct ssl_connect *sconn;
|
||||||
|
@ -439,7 +446,7 @@ rb_connect_tcp_ssl(rb_fde_t * F, struct sockaddr *dest,
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_ssl_start_connected(rb_fde_t * F, CNCB * callback, void *data, int timeout)
|
rb_ssl_start_connected(rb_fde_t *F, CNCB * callback, void *data, int timeout)
|
||||||
{
|
{
|
||||||
struct ssl_connect *sconn;
|
struct ssl_connect *sconn;
|
||||||
if(F == NULL)
|
if(F == NULL)
|
||||||
|
@ -454,12 +461,12 @@ rb_ssl_start_connected(rb_fde_t * F, CNCB * callback, void *data, int timeout)
|
||||||
F->connect->data = data;
|
F->connect->data = data;
|
||||||
F->type |= RB_FD_SSL;
|
F->type |= RB_FD_SSL;
|
||||||
F->ssl = rb_malloc(sizeof(gnutls_session_t));
|
F->ssl = rb_malloc(sizeof(gnutls_session_t));
|
||||||
|
|
||||||
gnutls_init(F->ssl, GNUTLS_CLIENT);
|
gnutls_init(F->ssl, GNUTLS_CLIENT);
|
||||||
gnutls_set_default_priority(SSL_P(F));
|
gnutls_set_default_priority(SSL_P(F));
|
||||||
gnutls_dh_set_prime_bits(SSL_P(F), 1024);
|
gnutls_dh_set_prime_bits(SSL_P(F), 1024);
|
||||||
gnutls_transport_set_ptr(SSL_P(F), (gnutls_transport_ptr_t) (long int)F->fd);
|
gnutls_transport_set_ptr(SSL_P(F), (gnutls_transport_ptr_t) (long int)F->fd);
|
||||||
|
|
||||||
rb_settimeout(F, sconn->timeout, rb_ssl_tryconn_timeout_cb, sconn);
|
rb_settimeout(F, sconn->timeout, rb_ssl_tryconn_timeout_cb, sconn);
|
||||||
|
|
||||||
if(do_ssl_handshake(F, rb_ssl_tryconn_cb))
|
if(do_ssl_handshake(F, rb_ssl_tryconn_cb))
|
||||||
|
@ -490,7 +497,7 @@ rb_get_pseudo_random(void *buf, size_t length)
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
rb_get_ssl_strerror(rb_fde_t * F)
|
rb_get_ssl_strerror(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
return gnutls_strerror(F->ssl_errno);
|
return gnutls_strerror(F->ssl_errno);
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: helper.c 25245 2008-04-21 18:38:23Z androsyn $
|
* $Id: helper.c 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
#include <libratbox_config.h>
|
#include <libratbox_config.h>
|
||||||
#include <ratbox_lib.h>
|
#include <ratbox_lib.h>
|
||||||
|
@ -41,31 +41,32 @@ struct _rb_helper
|
||||||
|
|
||||||
/* setup all the stuff a new child needs */
|
/* setup all the stuff a new child needs */
|
||||||
rb_helper *
|
rb_helper *
|
||||||
rb_helper_child(rb_helper_cb *read_cb, rb_helper_cb *error_cb, log_cb *ilog, restart_cb *irestart, die_cb *idie,
|
rb_helper_child(rb_helper_cb * read_cb, rb_helper_cb * error_cb, log_cb * ilog,
|
||||||
int maxcon, size_t lb_heap_size, size_t dh_size, size_t fd_heap_size)
|
restart_cb * irestart, die_cb * idie, int maxcon, size_t lb_heap_size,
|
||||||
|
size_t dh_size, size_t fd_heap_size)
|
||||||
{
|
{
|
||||||
rb_helper *helper;
|
rb_helper *helper;
|
||||||
int maxfd, x = 0;
|
int maxfd, x = 0;
|
||||||
int ifd, ofd;
|
int ifd, ofd;
|
||||||
char *tifd, *tofd, *tmaxfd;
|
char *tifd, *tofd, *tmaxfd;
|
||||||
|
|
||||||
tifd = getenv("IFD");
|
tifd = getenv("IFD");
|
||||||
tofd = getenv("OFD");
|
tofd = getenv("OFD");
|
||||||
tmaxfd = getenv("MAXFD");
|
tmaxfd = getenv("MAXFD");
|
||||||
|
|
||||||
if(tifd == NULL || tofd == NULL || tmaxfd == NULL)
|
if(tifd == NULL || tofd == NULL || tmaxfd == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
helper = rb_malloc(sizeof(rb_helper));
|
helper = rb_malloc(sizeof(rb_helper));
|
||||||
ifd = (int)strtol(tifd, NULL, 10);
|
ifd = (int)strtol(tifd, NULL, 10);
|
||||||
ofd = (int)strtol(tofd, NULL, 10);
|
ofd = (int)strtol(tofd, NULL, 10);
|
||||||
maxfd = (int)strtol(tmaxfd, NULL, 10);
|
maxfd = (int)strtol(tmaxfd, NULL, 10);
|
||||||
|
|
||||||
#ifndef WIN32
|
#ifndef _WIN32
|
||||||
for(x = 0; x < maxfd; x++)
|
for(x = 0; x < maxfd; x++)
|
||||||
{
|
{
|
||||||
if(x != ifd && x != ofd)
|
if(x != ifd && x != ofd)
|
||||||
close(x);
|
close(x);
|
||||||
}
|
}
|
||||||
x = open("/dev/null", O_RDWR);
|
x = open("/dev/null", O_RDWR);
|
||||||
if(ifd != 0 && ofd != 0)
|
if(ifd != 0 && ofd != 0)
|
||||||
|
@ -74,10 +75,10 @@ rb_helper_child(rb_helper_cb *read_cb, rb_helper_cb *error_cb, log_cb *ilog, res
|
||||||
dup2(x, 1);
|
dup2(x, 1);
|
||||||
if(ifd != 2 && ofd != 2)
|
if(ifd != 2 && ofd != 2)
|
||||||
dup2(x, 2);
|
dup2(x, 2);
|
||||||
if(x > 2) /* don't undo what we just did */
|
if(x > 2) /* don't undo what we just did */
|
||||||
close(x);
|
close(x);
|
||||||
#else
|
#else
|
||||||
x = 0; /* shut gcc up */
|
x = 0; /* shut gcc up */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rb_lib_init(ilog, irestart, idie, 0, maxfd, dh_size, fd_heap_size);
|
rb_lib_init(ilog, irestart, idie, 0, maxfd, dh_size, fd_heap_size);
|
||||||
|
@ -89,7 +90,7 @@ rb_helper_child(rb_helper_cb *read_cb, rb_helper_cb *error_cb, log_cb *ilog, res
|
||||||
helper->ofd = rb_open(ofd, RB_FD_PIPE, "outgoing connection");
|
helper->ofd = rb_open(ofd, RB_FD_PIPE, "outgoing connection");
|
||||||
rb_set_nb(helper->ifd);
|
rb_set_nb(helper->ifd);
|
||||||
rb_set_nb(helper->ofd);
|
rb_set_nb(helper->ofd);
|
||||||
|
|
||||||
helper->read_cb = read_cb;
|
helper->read_cb = read_cb;
|
||||||
helper->error_cb = error_cb;
|
helper->error_cb = error_cb;
|
||||||
return helper;
|
return helper;
|
||||||
|
@ -102,7 +103,8 @@ rb_helper_child(rb_helper_cb *read_cb, rb_helper_cb *error_cb, log_cb *ilog, res
|
||||||
*/
|
*/
|
||||||
|
|
||||||
rb_helper *
|
rb_helper *
|
||||||
rb_helper_start(const char *name, const char *fullpath, rb_helper_cb *read_cb, rb_helper_cb *error_cb)
|
rb_helper_start(const char *name, const char *fullpath, rb_helper_cb * read_cb,
|
||||||
|
rb_helper_cb * error_cb)
|
||||||
{
|
{
|
||||||
rb_helper *helper;
|
rb_helper *helper;
|
||||||
const char *parv[2];
|
const char *parv[2];
|
||||||
|
@ -111,14 +113,14 @@ rb_helper_start(const char *name, const char *fullpath, rb_helper_cb *read_cb, r
|
||||||
rb_fde_t *in_f[2];
|
rb_fde_t *in_f[2];
|
||||||
rb_fde_t *out_f[2];
|
rb_fde_t *out_f[2];
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
|
|
||||||
if(access(fullpath, X_OK) == -1)
|
if(access(fullpath, X_OK) == -1)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
helper = rb_malloc(sizeof(rb_helper));
|
helper = rb_malloc(sizeof(rb_helper));
|
||||||
|
|
||||||
rb_snprintf(buf, sizeof(buf), "%s helper - read", name);
|
rb_snprintf(buf, sizeof(buf), "%s helper - read", name);
|
||||||
if(rb_pipe(&in_f[0], &in_f[1], buf) < 0)
|
if(rb_pipe(&in_f[0], &in_f[1], buf) < 0)
|
||||||
{
|
{
|
||||||
rb_free(helper);
|
rb_free(helper);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -129,30 +131,30 @@ rb_helper_start(const char *name, const char *fullpath, rb_helper_cb *read_cb, r
|
||||||
rb_free(helper);
|
rb_free(helper);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rb_snprintf(fx, sizeof(fx), "%d", rb_get_fd(in_f[1]));
|
rb_snprintf(fx, sizeof(fx), "%d", rb_get_fd(in_f[1]));
|
||||||
rb_snprintf(fy, sizeof(fy), "%d", rb_get_fd(out_f[0]));
|
rb_snprintf(fy, sizeof(fy), "%d", rb_get_fd(out_f[0]));
|
||||||
|
|
||||||
rb_set_nb(in_f[0]);
|
rb_set_nb(in_f[0]);
|
||||||
rb_set_nb(in_f[1]);
|
rb_set_nb(in_f[1]);
|
||||||
rb_set_nb(out_f[0]);
|
rb_set_nb(out_f[0]);
|
||||||
rb_set_nb(out_f[1]);
|
rb_set_nb(out_f[1]);
|
||||||
|
|
||||||
setenv("IFD", fy, 1);
|
rb_setenv("IFD", fy, 1);
|
||||||
setenv("OFD", fx, 1);
|
rb_setenv("OFD", fx, 1);
|
||||||
setenv("MAXFD", "256", 1);
|
rb_setenv("MAXFD", "256", 1);
|
||||||
|
|
||||||
rb_snprintf(buf, sizeof(buf), "-ircd %s daemon", name);
|
rb_snprintf(buf, sizeof(buf), "-ircd %s daemon", name);
|
||||||
parv[0] = buf;
|
parv[0] = buf;
|
||||||
parv[1] = NULL;
|
parv[1] = NULL;
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef _WIN32
|
||||||
SetHandleInformation((HANDLE)rb_get_fd(in_f[1]), HANDLE_FLAG_INHERIT, 1);
|
SetHandleInformation((HANDLE) rb_get_fd(in_f[1]), HANDLE_FLAG_INHERIT, 1);
|
||||||
SetHandleInformation((HANDLE)rb_get_fd(out_f[0]), HANDLE_FLAG_INHERIT, 1);
|
SetHandleInformation((HANDLE) rb_get_fd(out_f[0]), HANDLE_FLAG_INHERIT, 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pid = rb_spawn_process(fullpath, (const char **)parv);
|
pid = rb_spawn_process(fullpath, (const char **)parv);
|
||||||
|
|
||||||
if(pid == -1)
|
if(pid == -1)
|
||||||
{
|
{
|
||||||
rb_close(in_f[0]);
|
rb_close(in_f[0]);
|
||||||
|
@ -165,14 +167,14 @@ rb_helper_start(const char *name, const char *fullpath, rb_helper_cb *read_cb, r
|
||||||
|
|
||||||
rb_close(in_f[1]);
|
rb_close(in_f[1]);
|
||||||
rb_close(out_f[0]);
|
rb_close(out_f[0]);
|
||||||
|
|
||||||
rb_linebuf_newbuf(&helper->sendq);
|
rb_linebuf_newbuf(&helper->sendq);
|
||||||
rb_linebuf_newbuf(&helper->recvq);
|
rb_linebuf_newbuf(&helper->recvq);
|
||||||
|
|
||||||
helper->ifd = in_f[0];
|
helper->ifd = in_f[0];
|
||||||
helper->ofd = out_f[1];
|
helper->ofd = out_f[1];
|
||||||
helper->read_cb = read_cb;
|
helper->read_cb = read_cb;
|
||||||
helper->error_cb = error_cb;
|
helper->error_cb = error_cb;
|
||||||
helper->fork_count = 0;
|
helper->fork_count = 0;
|
||||||
helper->pid = pid;
|
helper->pid = pid;
|
||||||
|
|
||||||
|
@ -192,12 +194,13 @@ rb_helper_write_sendq(rb_fde_t *F, void *helper_ptr)
|
||||||
{
|
{
|
||||||
rb_helper *helper = helper_ptr;
|
rb_helper *helper = helper_ptr;
|
||||||
int retlen;
|
int retlen;
|
||||||
|
|
||||||
if(rb_linebuf_len(&helper->sendq) > 0)
|
if(rb_linebuf_len(&helper->sendq) > 0)
|
||||||
{
|
{
|
||||||
while((retlen = rb_linebuf_flush(F, &helper->sendq)) > 0)
|
while((retlen = rb_linebuf_flush(F, &helper->sendq)) > 0)
|
||||||
;;
|
;;
|
||||||
if(retlen == 0 || (retlen < 0 && !rb_ignore_errno(errno))) {
|
if(retlen == 0 || (retlen < 0 && !rb_ignore_errno(errno)))
|
||||||
|
{
|
||||||
rb_helper_restart(helper);
|
rb_helper_restart(helper);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -207,7 +210,7 @@ rb_helper_write_sendq(rb_fde_t *F, void *helper_ptr)
|
||||||
rb_setselect(helper->ofd, RB_SELECT_WRITE, rb_helper_write_sendq, helper);
|
rb_setselect(helper->ofd, RB_SELECT_WRITE, rb_helper_write_sendq, helper);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_helper_write_queue(rb_helper *helper, const char *format, ...)
|
rb_helper_write_queue(rb_helper *helper, const char *format, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
@ -219,7 +222,7 @@ rb_helper_write_queue(rb_helper *helper, const char *format, ...)
|
||||||
void
|
void
|
||||||
rb_helper_write_flush(rb_helper *helper)
|
rb_helper_write_flush(rb_helper *helper)
|
||||||
{
|
{
|
||||||
rb_helper_write_sendq(helper->ofd, helper);
|
rb_helper_write_sendq(helper->ofd, helper);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -241,7 +244,7 @@ rb_helper_read_cb(rb_fde_t *F, void *data)
|
||||||
int length;
|
int length;
|
||||||
if(helper == NULL)
|
if(helper == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
while((length = rb_read(helper->ifd, buf, sizeof(buf))) > 0)
|
while((length = rb_read(helper->ifd, buf, sizeof(buf))) > 0)
|
||||||
{
|
{
|
||||||
rb_linebuf_parse(&helper->recvq, buf, length, 0);
|
rb_linebuf_parse(&helper->recvq, buf, length, 0);
|
||||||
|
@ -253,7 +256,7 @@ rb_helper_read_cb(rb_fde_t *F, void *data)
|
||||||
rb_helper_restart(helper);
|
rb_helper_restart(helper);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
rb_setselect(helper->ifd, RB_SELECT_READ, rb_helper_read_cb, helper);
|
rb_setselect(helper->ifd, RB_SELECT_READ, rb_helper_read_cb, helper);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,10 +274,10 @@ rb_helper_close(rb_helper *helper)
|
||||||
{
|
{
|
||||||
if(helper == NULL)
|
if(helper == NULL)
|
||||||
return;
|
return;
|
||||||
kill(helper->pid, SIGKILL);
|
rb_kill(helper->pid, SIGKILL);
|
||||||
rb_close(helper->ifd);
|
rb_close(helper->ifd);
|
||||||
rb_close(helper->ofd);
|
rb_close(helper->ofd);
|
||||||
rb_free(helper);
|
rb_free(helper);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -292,4 +295,3 @@ rb_helper_loop(rb_helper *helper, long delay)
|
||||||
rb_lib_loop(delay);
|
rb_lib_loop(delay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: kqueue.c 25364 2008-05-14 17:55:22Z jilles $
|
* $Id: kqueue.c 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <libratbox_config.h>
|
#include <libratbox_config.h>
|
||||||
|
@ -63,13 +63,13 @@ static int kqoff; /* offset into the buffer */
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_setup_fd_kqueue(rb_fde_t * F)
|
rb_setup_fd_kqueue(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
kq_update_events(rb_fde_t * F, short filter, PF * handler)
|
kq_update_events(rb_fde_t *F, short filter, PF * handler)
|
||||||
{
|
{
|
||||||
PF *cur_handler;
|
PF *cur_handler;
|
||||||
int kep_flags;
|
int kep_flags;
|
||||||
|
@ -103,7 +103,7 @@ kq_update_events(rb_fde_t * F, short filter, PF * handler)
|
||||||
kep_flags = EV_DELETE;
|
kep_flags = EV_DELETE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EV_SET(kep, (uintptr_t) F->fd, filter, kep_flags, 0, 0, (void *) F);
|
EV_SET(kep, (uintptr_t)F->fd, filter, kep_flags, 0, 0, (void *)F);
|
||||||
|
|
||||||
if(++kqoff == kqmax)
|
if(++kqoff == kqmax)
|
||||||
{
|
{
|
||||||
|
@ -117,13 +117,14 @@ kq_update_events(rb_fde_t * F, short filter, PF * handler)
|
||||||
* because that would also return events we cannot
|
* because that would also return events we cannot
|
||||||
* process at this point.
|
* process at this point.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < kqoff; i++)
|
for(i = 0; i < kqoff; i++)
|
||||||
{
|
{
|
||||||
ret = kevent(kq, kqlst + i, 1, NULL, 0, &zero_timespec);
|
ret = kevent(kq, kqlst + i, 1, NULL, 0, &zero_timespec);
|
||||||
/* jdc -- someone needs to do error checking... */
|
/* jdc -- someone needs to do error checking... */
|
||||||
/* EBADF is normal here -- jilles */
|
/* EBADF is normal here -- jilles */
|
||||||
if(ret == -1 && errno != EBADF)
|
if(ret == -1 && errno != EBADF)
|
||||||
rb_lib_log("kq_update_events(): kevent(): %s", strerror(errno));
|
rb_lib_log("kq_update_events(): kevent(): %s",
|
||||||
|
strerror(errno));
|
||||||
}
|
}
|
||||||
kqoff = 0;
|
kqoff = 0;
|
||||||
}
|
}
|
||||||
|
@ -167,7 +168,7 @@ rb_init_netio_kqueue(void)
|
||||||
* and deregister interest in a pending IO state for a given FD.
|
* and deregister interest in a pending IO state for a given FD.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
rb_setselect_kqueue(rb_fde_t * F, unsigned int type, PF * handler, void *client_data)
|
rb_setselect_kqueue(rb_fde_t *F, unsigned int type, PF * handler, void *client_data)
|
||||||
{
|
{
|
||||||
lrb_assert(IsFDOpen(F));
|
lrb_assert(IsFDOpen(F));
|
||||||
|
|
||||||
|
@ -209,16 +210,18 @@ rb_select_kqueue(long delay)
|
||||||
rb_fde_t *F;
|
rb_fde_t *F;
|
||||||
|
|
||||||
|
|
||||||
if(delay < 0) {
|
if(delay < 0)
|
||||||
|
{
|
||||||
pt = NULL;
|
pt = NULL;
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
pt = &poll_time;
|
pt = &poll_time;
|
||||||
poll_time.tv_sec = delay / 1000;
|
poll_time.tv_sec = delay / 1000;
|
||||||
poll_time.tv_nsec = (delay % 1000) * 1000000;
|
poll_time.tv_nsec = (delay % 1000) * 1000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
num = kevent(kq, kqlst, kqoff, kqout, kqmax, pt);
|
num = kevent(kq, kqlst, kqoff, kqout, kqmax, pt);
|
||||||
kqoff = 0;
|
kqoff = 0;
|
||||||
|
@ -241,7 +244,7 @@ rb_select_kqueue(long delay)
|
||||||
if(num == 0)
|
if(num == 0)
|
||||||
return RB_OK; /* No error.. */
|
return RB_OK; /* No error.. */
|
||||||
|
|
||||||
for (i = 0; i < num; i++)
|
for(i = 0; i < num; i++)
|
||||||
{
|
{
|
||||||
PF *hdl = NULL;
|
PF *hdl = NULL;
|
||||||
|
|
||||||
|
@ -305,7 +308,7 @@ rb_kqueue_supports_event(void)
|
||||||
ts.tv_nsec = 1000;
|
ts.tv_nsec = 1000;
|
||||||
|
|
||||||
|
|
||||||
EV_SET(&kv, (uintptr_t) 0x0, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, 1, 0);
|
EV_SET(&kv, (uintptr_t)0x0, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, 1, 0);
|
||||||
if(kevent(xkq, &kv, 1, NULL, 0, NULL) < 0)
|
if(kevent(xkq, &kv, 1, NULL, 0, NULL) < 0)
|
||||||
{
|
{
|
||||||
can_do_event = -1;
|
can_do_event = -1;
|
||||||
|
@ -326,9 +329,9 @@ rb_kqueue_sched_event(struct ev_entry *event, int when)
|
||||||
kep_flags = EV_ADD;
|
kep_flags = EV_ADD;
|
||||||
if(event->frequency == 0)
|
if(event->frequency == 0)
|
||||||
kep_flags |= EV_ONESHOT;
|
kep_flags |= EV_ONESHOT;
|
||||||
EV_SET(&kev, (uintptr_t) event, EVFILT_TIMER, kep_flags, 0, when * 1000, event);
|
EV_SET(&kev, (uintptr_t)event, EVFILT_TIMER, kep_flags, 0, when * 1000, event);
|
||||||
if(kevent(kq, &kev, 1, NULL, 0, NULL) < 0)
|
if(kevent(kq, &kev, 1, NULL, 0, NULL) < 0)
|
||||||
return 0;
|
return 0;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -336,7 +339,7 @@ void
|
||||||
rb_kqueue_unsched_event(struct ev_entry *event)
|
rb_kqueue_unsched_event(struct ev_entry *event)
|
||||||
{
|
{
|
||||||
struct kevent kev;
|
struct kevent kev;
|
||||||
EV_SET(&kev, (uintptr_t) event, EVFILT_TIMER, EV_DELETE, 0, 0, event);
|
EV_SET(&kev, (uintptr_t)event, EVFILT_TIMER, EV_DELETE, 0, 0, event);
|
||||||
kevent(kq, &kev, 1, NULL, 0, NULL);
|
kevent(kq, &kev, 1, NULL, 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -356,7 +359,7 @@ rb_init_netio_kqueue(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_setselect_kqueue(rb_fde_t * F, unsigned int type, PF * handler, void *client_data)
|
rb_setselect_kqueue(rb_fde_t *F, unsigned int type, PF * handler, void *client_data)
|
||||||
{
|
{
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
return;
|
return;
|
||||||
|
@ -370,7 +373,7 @@ rb_select_kqueue(long delay)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_setup_fd_kqueue(rb_fde_t * F)
|
rb_setup_fd_kqueue(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: linebuf.c 25375 2008-05-16 15:19:51Z androsyn $
|
* $Id: linebuf.c 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <libratbox_config.h>
|
#include <libratbox_config.h>
|
||||||
|
@ -47,20 +47,14 @@ static int bufline_count = 0;
|
||||||
void
|
void
|
||||||
rb_linebuf_init(size_t heap_size)
|
rb_linebuf_init(size_t heap_size)
|
||||||
{
|
{
|
||||||
#ifndef NOBALLOC
|
|
||||||
rb_linebuf_heap = rb_bh_create(sizeof(buf_line_t), heap_size, "librb_linebuf_heap");
|
rb_linebuf_heap = rb_bh_create(sizeof(buf_line_t), heap_size, "librb_linebuf_heap");
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static buf_line_t *
|
static buf_line_t *
|
||||||
rb_linebuf_allocate(void)
|
rb_linebuf_allocate(void)
|
||||||
{
|
{
|
||||||
buf_line_t *t;
|
buf_line_t *t;
|
||||||
#ifndef NOBALLOC
|
|
||||||
t = rb_bh_alloc(rb_linebuf_heap);
|
t = rb_bh_alloc(rb_linebuf_heap);
|
||||||
#else
|
|
||||||
t = rb_malloc(sizeof(buf_line_t));
|
|
||||||
#endif
|
|
||||||
return (t);
|
return (t);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -68,11 +62,7 @@ rb_linebuf_allocate(void)
|
||||||
static void
|
static void
|
||||||
rb_linebuf_free(buf_line_t * p)
|
rb_linebuf_free(buf_line_t * p)
|
||||||
{
|
{
|
||||||
#ifndef NOBALLOC
|
|
||||||
rb_bh_free(rb_linebuf_heap, p);
|
rb_bh_free(rb_linebuf_heap, p);
|
||||||
#else
|
|
||||||
rb_free(p);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -113,7 +103,7 @@ rb_linebuf_new_line(buf_head_t * bufhead)
|
||||||
* We've finished with the given line, so deallocate it
|
* We've finished with the given line, so deallocate it
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
rb_linebuf_done_line(buf_head_t * bufhead, buf_line_t * bufline, rb_dlink_node * node)
|
rb_linebuf_done_line(buf_head_t * bufhead, buf_line_t * bufline, rb_dlink_node *node)
|
||||||
{
|
{
|
||||||
/* Remove it from the linked list */
|
/* Remove it from the linked list */
|
||||||
rb_dlinkDestroy(node, &bufhead->list);
|
rb_dlinkDestroy(node, &bufhead->list);
|
||||||
|
@ -188,7 +178,8 @@ rb_linebuf_donebuf(buf_head_t * bufhead)
|
||||||
{
|
{
|
||||||
while(bufhead->list.head != NULL)
|
while(bufhead->list.head != NULL)
|
||||||
{
|
{
|
||||||
rb_linebuf_done_line(bufhead, (buf_line_t *) bufhead->list.head->data, bufhead->list.head);
|
rb_linebuf_done_line(bufhead, (buf_line_t *) bufhead->list.head->data,
|
||||||
|
bufhead->list.head);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -515,7 +506,8 @@ rb_linebuf_attach(buf_head_t * bufhead, buf_head_t * new)
|
||||||
* Then format/va_args is appended to the buffer.
|
* Then format/va_args is appended to the buffer.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
rb_linebuf_putmsg(buf_head_t * bufhead, const char *format, va_list * va_args, const char *prefixfmt, ...)
|
rb_linebuf_putmsg(buf_head_t * bufhead, const char *format, va_list * va_args,
|
||||||
|
const char *prefixfmt, ...)
|
||||||
{
|
{
|
||||||
buf_line_t *bufline;
|
buf_line_t *bufline;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
@ -562,7 +554,8 @@ rb_linebuf_putmsg(buf_head_t * bufhead, const char *format, va_list * va_args, c
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Chop trailing CRLF's .. */
|
/* Chop trailing CRLF's .. */
|
||||||
while((bufline->buf[len] == '\r') || (bufline->buf[len] == '\n') || (bufline->buf[len] == '\0'))
|
while((bufline->buf[len] == '\r') || (bufline->buf[len] == '\n')
|
||||||
|
|| (bufline->buf[len] == '\0'))
|
||||||
{
|
{
|
||||||
len--;
|
len--;
|
||||||
}
|
}
|
||||||
|
@ -577,7 +570,7 @@ rb_linebuf_putmsg(buf_head_t * bufhead, const char *format, va_list * va_args, c
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_linebuf_putbuf(buf_head_t *bufhead, const char *buffer)
|
rb_linebuf_putbuf(buf_head_t * bufhead, const char *buffer)
|
||||||
{
|
{
|
||||||
buf_line_t *bufline;
|
buf_line_t *bufline;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
@ -614,7 +607,8 @@ rb_linebuf_putbuf(buf_head_t *bufhead, const char *buffer)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Chop trailing CRLF's .. */
|
/* Chop trailing CRLF's .. */
|
||||||
while((bufline->buf[len] == '\r') || (bufline->buf[len] == '\n') || (bufline->buf[len] == '\0'))
|
while((bufline->buf[len] == '\r') || (bufline->buf[len] == '\n')
|
||||||
|
|| (bufline->buf[len] == '\0'))
|
||||||
{
|
{
|
||||||
len--;
|
len--;
|
||||||
}
|
}
|
||||||
|
@ -627,7 +621,7 @@ rb_linebuf_putbuf(buf_head_t *bufhead, const char *buffer)
|
||||||
bufline->len = len;
|
bufline->len = len;
|
||||||
bufhead->len += len;
|
bufhead->len += len;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -673,7 +667,8 @@ rb_linebuf_put(buf_head_t * bufhead, const char *format, ...)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Chop trailing CRLF's .. */
|
/* Chop trailing CRLF's .. */
|
||||||
while((bufline->buf[len] == '\r') || (bufline->buf[len] == '\n') || (bufline->buf[len] == '\0'))
|
while((bufline->buf[len] == '\r') || (bufline->buf[len] == '\n')
|
||||||
|
|| (bufline->buf[len] == '\0'))
|
||||||
{
|
{
|
||||||
len--;
|
len--;
|
||||||
}
|
}
|
||||||
|
@ -729,7 +724,7 @@ rb_linebuf_flush(rb_fde_t *F, buf_head_t * bufhead)
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr = bufhead->list.head;
|
ptr = bufhead->list.head;
|
||||||
|
|
||||||
bufline = ptr->data;
|
bufline = ptr->data;
|
||||||
if(!bufline->terminated)
|
if(!bufline->terminated)
|
||||||
{
|
{
|
||||||
|
@ -750,12 +745,13 @@ rb_linebuf_flush(rb_fde_t *F, buf_head_t * bufhead)
|
||||||
bufline = ptr->data;
|
bufline = ptr->data;
|
||||||
if(!bufline->terminated)
|
if(!bufline->terminated)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
vec[x].iov_base = bufline->buf;
|
vec[x].iov_base = bufline->buf;
|
||||||
vec[x].iov_len = bufline->len;
|
vec[x].iov_len = bufline->len;
|
||||||
ptr = ptr->next;
|
ptr = ptr->next;
|
||||||
|
|
||||||
} while(++x < RB_UIO_MAXIOV);
|
}
|
||||||
|
while(++x < RB_UIO_MAXIOV);
|
||||||
|
|
||||||
if(x == 0)
|
if(x == 0)
|
||||||
{
|
{
|
||||||
|
@ -780,7 +776,7 @@ rb_linebuf_flush(rb_fde_t *F, buf_head_t * bufhead)
|
||||||
rb_linebuf_done_line(bufhead, bufline, bufhead->list.head);
|
rb_linebuf_done_line(bufhead, bufline, bufhead->list.head);
|
||||||
bufhead->writeofs = 0;
|
bufhead->writeofs = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
bufhead->writeofs += xret;
|
bufhead->writeofs += xret;
|
||||||
break;
|
break;
|
||||||
|
@ -789,10 +785,10 @@ rb_linebuf_flush(rb_fde_t *F, buf_head_t * bufhead)
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* this is the non-writev case */
|
||||||
|
|
||||||
/* this is the non-writev case */
|
|
||||||
|
|
||||||
/* Check we actually have a first buffer */
|
/* Check we actually have a first buffer */
|
||||||
if(bufhead->list.head == NULL)
|
if(bufhead->list.head == NULL)
|
||||||
{
|
{
|
||||||
|
@ -839,12 +835,7 @@ rb_linebuf_flush(rb_fde_t *F, buf_head_t * bufhead)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_count_rb_linebuf_memory(size_t * count, size_t * rb_linebuf_memory_used)
|
rb_count_rb_linebuf_memory(size_t *count, size_t *rb_linebuf_memory_used)
|
||||||
{
|
{
|
||||||
#ifndef NOBALLOC
|
|
||||||
rb_bh_usage(rb_linebuf_heap, count, NULL, rb_linebuf_memory_used, NULL);
|
rb_bh_usage(rb_linebuf_heap, count, NULL, rb_linebuf_memory_used, NULL);
|
||||||
#else
|
|
||||||
*count = 0;
|
|
||||||
*rb_linebuf_memory_used = 0;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
#include <commio-int.h>
|
#include <commio-int.h>
|
||||||
#include <commio-ssl.h>
|
#include <commio-ssl.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_setup_ssl_server(const char *cert, const char *keyfile, const char *dhfile)
|
rb_setup_ssl_server(const char *cert, const char *keyfile, const char *dhfile)
|
||||||
{
|
{
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
|
@ -60,9 +60,10 @@ rb_stir_arc4random(void *unused)
|
||||||
{
|
{
|
||||||
arc4random_stir();
|
arc4random_stir();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int rb_init_prng(const char *path, prng_seed_t seed_type)
|
|
||||||
|
int
|
||||||
|
rb_init_prng(const char *path, prng_seed_t seed_type)
|
||||||
{
|
{
|
||||||
/* xxx this ignores the parameters above */
|
/* xxx this ignores the parameters above */
|
||||||
arc4random_stir();
|
arc4random_stir();
|
||||||
|
@ -74,8 +75,8 @@ int
|
||||||
rb_get_random(void *buf, size_t length)
|
rb_get_random(void *buf, size_t length)
|
||||||
{
|
{
|
||||||
uint32_t rnd = 0, i;
|
uint32_t rnd = 0, i;
|
||||||
uint8_t *xbuf = buf;
|
uint8_t *xbuf = buf;
|
||||||
for (i = 0; i < sizeof(length); i++)
|
for(i = 0; i < length; i++)
|
||||||
{
|
{
|
||||||
if(i % 4 == 0)
|
if(i % 4 == 0)
|
||||||
rnd = arc4random();
|
rnd = arc4random();
|
||||||
|
@ -88,7 +89,7 @@ rb_get_random(void *buf, size_t length)
|
||||||
int
|
int
|
||||||
rb_get_pseudo_random(void *buf, size_t length)
|
rb_get_pseudo_random(void *buf, size_t length)
|
||||||
{
|
{
|
||||||
return rb_get_random(buf, length);
|
return rb_get_random(buf, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -99,21 +100,21 @@ rb_get_ssl_strerror(rb_fde_t *F)
|
||||||
return nosupport;
|
return nosupport;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_ssl_start_accepted(rb_fde_t *new_F, ACCB *cb, void *data, int timeout)
|
rb_ssl_start_accepted(rb_fde_t *new_F, ACCB * cb, void *data, int timeout)
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
rb_ssl_start_connected(rb_fde_t *F, CNCB *callback, void *data, int timeout)
|
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_connect_tcp_ssl(rb_fde_t *F, struct sockaddr *dest,
|
rb_ssl_start_connected(rb_fde_t *F, CNCB * callback, void *data, int timeout)
|
||||||
struct sockaddr *clocal, int socklen, CNCB *callback, void *data, int timeout)
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
rb_connect_tcp_ssl(rb_fde_t *F, struct sockaddr *dest,
|
||||||
|
struct sockaddr *clocal, int socklen, CNCB * callback, void *data, int timeout)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -125,26 +126,26 @@ rb_supports_ssl(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_ssl_shutdown(rb_fde_t * F)
|
rb_ssl_shutdown(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_ssl_accept_setup(rb_fde_t * F, rb_fde_t *new_F, struct sockaddr *st, int addrlen)
|
rb_ssl_accept_setup(rb_fde_t *F, rb_fde_t *new_F, struct sockaddr *st, int addrlen)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
rb_ssl_read(rb_fde_t * F, void *buf, size_t count)
|
rb_ssl_read(rb_fde_t *F, void *buf, size_t count)
|
||||||
{
|
{
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
rb_ssl_write(rb_fde_t * F, const void *buf, size_t count)
|
rb_ssl_write(rb_fde_t *F, const void *buf, size_t count)
|
||||||
{
|
{
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -155,12 +156,11 @@ rb_ssl_handshake_count(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_ssl_clear_handshake_count(rb_fde_t *F)
|
rb_ssl_clear_handshake_count(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* !HAVE_OPENSSL */
|
|
||||||
|
|
||||||
|
#endif /* !HAVE_OPENSSL */
|
||||||
|
|
|
@ -39,13 +39,14 @@ static SSL_CTX *ssl_server_ctx;
|
||||||
static SSL_CTX *ssl_client_ctx;
|
static SSL_CTX *ssl_client_ctx;
|
||||||
static int libratbox_index = -1;
|
static int libratbox_index = -1;
|
||||||
|
|
||||||
static unsigned long get_last_err(void)
|
static unsigned long
|
||||||
|
get_last_err(void)
|
||||||
{
|
{
|
||||||
unsigned long t_err, err = 0;
|
unsigned long t_err, err = 0;
|
||||||
err = ERR_get_error();
|
err = ERR_get_error();
|
||||||
if(err == 0)
|
if(err == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
while((t_err = ERR_get_error()) > 0)
|
while((t_err = ERR_get_error()) > 0)
|
||||||
err = t_err;
|
err = t_err;
|
||||||
|
|
||||||
|
@ -53,14 +54,14 @@ static unsigned long get_last_err(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_ssl_shutdown(rb_fde_t * F)
|
rb_ssl_shutdown(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
if(F == NULL || F->ssl == NULL)
|
if(F == NULL || F->ssl == NULL)
|
||||||
return;
|
return;
|
||||||
SSL_set_shutdown((SSL *) F->ssl, SSL_RECEIVED_SHUTDOWN);
|
SSL_set_shutdown((SSL *) F->ssl, SSL_RECEIVED_SHUTDOWN);
|
||||||
|
|
||||||
for (i = 0; i < 4; i++)
|
for(i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
if(SSL_shutdown((SSL *) F->ssl))
|
if(SSL_shutdown((SSL *) F->ssl))
|
||||||
break;
|
break;
|
||||||
|
@ -82,14 +83,15 @@ rb_ssl_clear_handshake_count(rb_fde_t *F)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rb_ssl_timeout(rb_fde_t * F, void *notused)
|
rb_ssl_timeout(rb_fde_t *F, void *notused)
|
||||||
{
|
{
|
||||||
lrb_assert(F->accept != NULL);
|
lrb_assert(F->accept != NULL);
|
||||||
F->accept->callback(F, RB_ERR_TIMEOUT, NULL, 0, F->accept->data);
|
F->accept->callback(F, RB_ERR_TIMEOUT, NULL, 0, F->accept->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void rb_ssl_info_callback(SSL *ssl, int where, int ret)
|
static void
|
||||||
|
rb_ssl_info_callback(SSL * ssl, int where, int ret)
|
||||||
{
|
{
|
||||||
if(where & SSL_CB_HANDSHAKE_START)
|
if(where & SSL_CB_HANDSHAKE_START)
|
||||||
{
|
{
|
||||||
|
@ -97,18 +99,18 @@ static void rb_ssl_info_callback(SSL *ssl, int where, int ret)
|
||||||
if(F == NULL)
|
if(F == NULL)
|
||||||
return;
|
return;
|
||||||
F->handshake_count++;
|
F->handshake_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rb_setup_ssl_cb(rb_fde_t *F)
|
rb_setup_ssl_cb(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
SSL_set_ex_data(F->ssl, libratbox_index, (char *)F);
|
SSL_set_ex_data(F->ssl, libratbox_index, (char *)F);
|
||||||
SSL_set_info_callback((SSL *)F->ssl, (void *)rb_ssl_info_callback);
|
SSL_set_info_callback((SSL *) F->ssl, (void (*)(const SSL *,int,int))rb_ssl_info_callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rb_ssl_tryaccept(rb_fde_t * F, void *data)
|
rb_ssl_tryaccept(rb_fde_t *F, void *data)
|
||||||
{
|
{
|
||||||
int ssl_err;
|
int ssl_err;
|
||||||
lrb_assert(F->accept != NULL);
|
lrb_assert(F->accept != NULL);
|
||||||
|
@ -143,11 +145,10 @@ rb_ssl_tryaccept(rb_fde_t * F, void *data)
|
||||||
}
|
}
|
||||||
rb_settimeout(F, 0, NULL, NULL);
|
rb_settimeout(F, 0, NULL, NULL);
|
||||||
rb_setselect(F, RB_SELECT_READ | RB_SELECT_WRITE, NULL, NULL);
|
rb_setselect(F, RB_SELECT_READ | RB_SELECT_WRITE, NULL, NULL);
|
||||||
|
|
||||||
ad = F->accept;
|
ad = F->accept;
|
||||||
F->accept = NULL;
|
F->accept = NULL;
|
||||||
ad->callback(F, RB_OK, (struct sockaddr *) &ad->S, ad->addrlen,
|
ad->callback(F, RB_OK, (struct sockaddr *)&ad->S, ad->addrlen, ad->data);
|
||||||
ad->data);
|
|
||||||
rb_free(ad);
|
rb_free(ad);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -184,7 +185,7 @@ rb_ssl_accept_common(rb_fde_t *new_F)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_ssl_start_accepted(rb_fde_t * new_F, ACCB * cb, void *data, int timeout)
|
rb_ssl_start_accepted(rb_fde_t *new_F, ACCB * cb, void *data, int timeout)
|
||||||
{
|
{
|
||||||
new_F->type |= RB_FD_SSL;
|
new_F->type |= RB_FD_SSL;
|
||||||
new_F->ssl = SSL_new(ssl_server_ctx);
|
new_F->ssl = SSL_new(ssl_server_ctx);
|
||||||
|
@ -204,7 +205,7 @@ rb_ssl_start_accepted(rb_fde_t * new_F, ACCB * cb, void *data, int timeout)
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_ssl_accept_setup(rb_fde_t * F, rb_fde_t *new_F, struct sockaddr *st, int addrlen)
|
rb_ssl_accept_setup(rb_fde_t *F, rb_fde_t *new_F, struct sockaddr *st, int addrlen)
|
||||||
{
|
{
|
||||||
new_F->type |= RB_FD_SSL;
|
new_F->type |= RB_FD_SSL;
|
||||||
new_F->ssl = SSL_new(ssl_server_ctx);
|
new_F->ssl = SSL_new(ssl_server_ctx);
|
||||||
|
@ -222,16 +223,16 @@ rb_ssl_accept_setup(rb_fde_t * F, rb_fde_t *new_F, struct sockaddr *st, int addr
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
rb_ssl_read_or_write(int r_or_w, rb_fde_t * F, void *rbuf, const void *wbuf, size_t count)
|
rb_ssl_read_or_write(int r_or_w, rb_fde_t *F, void *rbuf, const void *wbuf, size_t count)
|
||||||
{
|
{
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
unsigned long err;
|
unsigned long err;
|
||||||
SSL *ssl = F->ssl;
|
SSL *ssl = F->ssl;
|
||||||
|
|
||||||
if(r_or_w == 0)
|
if(r_or_w == 0)
|
||||||
ret = (ssize_t)SSL_read(ssl, rbuf, (int) count);
|
ret = (ssize_t) SSL_read(ssl, rbuf, (int)count);
|
||||||
else
|
else
|
||||||
ret = (ssize_t)SSL_write(ssl, wbuf, (int) count);
|
ret = (ssize_t) SSL_write(ssl, wbuf, (int)count);
|
||||||
|
|
||||||
if(ret < 0)
|
if(ret < 0)
|
||||||
{
|
{
|
||||||
|
@ -269,13 +270,13 @@ rb_ssl_read_or_write(int r_or_w, rb_fde_t * F, void *rbuf, const void *wbuf, siz
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
rb_ssl_read(rb_fde_t * F, void *buf, size_t count)
|
rb_ssl_read(rb_fde_t *F, void *buf, size_t count)
|
||||||
{
|
{
|
||||||
return rb_ssl_read_or_write(0, F, buf, NULL, count);
|
return rb_ssl_read_or_write(0, F, buf, NULL, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
rb_ssl_write(rb_fde_t * F, const void *buf, size_t count)
|
rb_ssl_write(rb_fde_t *F, const void *buf, size_t count)
|
||||||
{
|
{
|
||||||
return rb_ssl_read_or_write(1, F, NULL, buf, count);
|
return rb_ssl_read_or_write(1, F, NULL, buf, count);
|
||||||
}
|
}
|
||||||
|
@ -297,7 +298,7 @@ rb_init_ssl(void)
|
||||||
}
|
}
|
||||||
/* Disable SSLv2, make the client use our settings */
|
/* Disable SSLv2, make the client use our settings */
|
||||||
SSL_CTX_set_options(ssl_server_ctx, SSL_OP_NO_SSLv2 | SSL_OP_CIPHER_SERVER_PREFERENCE);
|
SSL_CTX_set_options(ssl_server_ctx, SSL_OP_NO_SSLv2 | SSL_OP_CIPHER_SERVER_PREFERENCE);
|
||||||
|
|
||||||
ssl_client_ctx = SSL_CTX_new(TLSv1_client_method());
|
ssl_client_ctx = SSL_CTX_new(TLSv1_client_method());
|
||||||
|
|
||||||
if(ssl_client_ctx == NULL)
|
if(ssl_client_ctx == NULL)
|
||||||
|
@ -313,7 +314,6 @@ rb_init_ssl(void)
|
||||||
int
|
int
|
||||||
rb_setup_ssl_server(const char *cert, const char *keyfile, const char *dhfile)
|
rb_setup_ssl_server(const char *cert, const char *keyfile, const char *dhfile)
|
||||||
{
|
{
|
||||||
FILE *param;
|
|
||||||
DH *dh;
|
DH *dh;
|
||||||
unsigned long err;
|
unsigned long err;
|
||||||
if(cert == NULL)
|
if(cert == NULL)
|
||||||
|
@ -347,28 +347,34 @@ rb_setup_ssl_server(const char *cert, const char *keyfile, const char *dhfile)
|
||||||
if(dhfile != NULL)
|
if(dhfile != NULL)
|
||||||
{
|
{
|
||||||
/* DH parameters aren't necessary, but they are nice..if they didn't pass one..that is their problem */
|
/* DH parameters aren't necessary, but they are nice..if they didn't pass one..that is their problem */
|
||||||
param = fopen(dhfile, "r");
|
BIO *bio = BIO_new_file(dhfile, "r");
|
||||||
if(param != NULL)
|
if(bio != NULL)
|
||||||
{
|
{
|
||||||
dh = PEM_read_DHparams(param, NULL, NULL, NULL);
|
dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
|
||||||
if(dh == NULL)
|
if(dh == NULL)
|
||||||
{
|
{
|
||||||
err = ERR_get_error();
|
err = ERR_get_error();
|
||||||
rb_lib_log
|
rb_lib_log
|
||||||
("rb_setup_ssl_server: Error loading DH params file [%s]: %s",
|
("rb_setup_ssl_server: Error loading DH params file [%s]: %s",
|
||||||
param, ERR_error_string(err, NULL));
|
dhfile, ERR_error_string(err, NULL));
|
||||||
fclose(param);
|
BIO_free(bio);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
BIO_free(bio);
|
||||||
SSL_CTX_set_tmp_dh(ssl_server_ctx, dh);
|
SSL_CTX_set_tmp_dh(ssl_server_ctx, dh);
|
||||||
fclose(param);
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
err = ERR_get_error();
|
||||||
|
rb_lib_log("rb_setup_ssl_server: Error loading DH params file [%s]: %s",
|
||||||
|
dhfile, ERR_error_string(err, NULL));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_ssl_listen(rb_fde_t * F, int backlog)
|
rb_ssl_listen(rb_fde_t *F, int backlog)
|
||||||
{
|
{
|
||||||
F->type = RB_FD_SOCKET | RB_FD_LISTEN | RB_FD_SSL;
|
F->type = RB_FD_SOCKET | RB_FD_LISTEN | RB_FD_SSL;
|
||||||
return listen(F->fd, backlog);
|
return listen(F->fd, backlog);
|
||||||
|
@ -382,7 +388,7 @@ struct ssl_connect
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rb_ssl_connect_realcb(rb_fde_t * F, int status, struct ssl_connect *sconn)
|
rb_ssl_connect_realcb(rb_fde_t *F, int status, struct ssl_connect *sconn)
|
||||||
{
|
{
|
||||||
F->connect->callback = sconn->callback;
|
F->connect->callback = sconn->callback;
|
||||||
F->connect->data = sconn->data;
|
F->connect->data = sconn->data;
|
||||||
|
@ -391,13 +397,13 @@ rb_ssl_connect_realcb(rb_fde_t * F, int status, struct ssl_connect *sconn)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rb_ssl_tryconn_timeout_cb(rb_fde_t * F, void *data)
|
rb_ssl_tryconn_timeout_cb(rb_fde_t *F, void *data)
|
||||||
{
|
{
|
||||||
rb_ssl_connect_realcb(F, RB_ERR_TIMEOUT, data);
|
rb_ssl_connect_realcb(F, RB_ERR_TIMEOUT, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rb_ssl_tryconn_cb(rb_fde_t * F, void *data)
|
rb_ssl_tryconn_cb(rb_fde_t *F, void *data)
|
||||||
{
|
{
|
||||||
struct ssl_connect *sconn = data;
|
struct ssl_connect *sconn = data;
|
||||||
int ssl_err;
|
int ssl_err;
|
||||||
|
@ -431,7 +437,7 @@ rb_ssl_tryconn_cb(rb_fde_t * F, void *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rb_ssl_tryconn(rb_fde_t * F, int status, void *data)
|
rb_ssl_tryconn(rb_fde_t *F, int status, void *data)
|
||||||
{
|
{
|
||||||
struct ssl_connect *sconn = data;
|
struct ssl_connect *sconn = data;
|
||||||
int ssl_err;
|
int ssl_err;
|
||||||
|
@ -473,7 +479,7 @@ rb_ssl_tryconn(rb_fde_t * F, int status, void *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_connect_tcp_ssl(rb_fde_t * F, struct sockaddr *dest,
|
rb_connect_tcp_ssl(rb_fde_t *F, struct sockaddr *dest,
|
||||||
struct sockaddr *clocal, int socklen, CNCB * callback, void *data, int timeout)
|
struct sockaddr *clocal, int socklen, CNCB * callback, void *data, int timeout)
|
||||||
{
|
{
|
||||||
struct ssl_connect *sconn;
|
struct ssl_connect *sconn;
|
||||||
|
@ -489,7 +495,7 @@ rb_connect_tcp_ssl(rb_fde_t * F, struct sockaddr *dest,
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_ssl_start_connected(rb_fde_t * F, CNCB * callback, void *data, int timeout)
|
rb_ssl_start_connected(rb_fde_t *F, CNCB * callback, void *data, int timeout)
|
||||||
{
|
{
|
||||||
struct ssl_connect *sconn;
|
struct ssl_connect *sconn;
|
||||||
int ssl_err;
|
int ssl_err;
|
||||||
|
@ -505,7 +511,7 @@ rb_ssl_start_connected(rb_fde_t * F, CNCB * callback, void *data, int timeout)
|
||||||
F->connect->data = data;
|
F->connect->data = data;
|
||||||
F->type |= RB_FD_SSL;
|
F->type |= RB_FD_SSL;
|
||||||
F->ssl = SSL_new(ssl_client_ctx);
|
F->ssl = SSL_new(ssl_client_ctx);
|
||||||
|
|
||||||
SSL_set_fd((SSL *) F->ssl, F->fd);
|
SSL_set_fd((SSL *) F->ssl, F->fd);
|
||||||
rb_setup_ssl_cb(F);
|
rb_setup_ssl_cb(F);
|
||||||
rb_settimeout(F, sconn->timeout, rb_ssl_tryconn_timeout_cb, sconn);
|
rb_settimeout(F, sconn->timeout, rb_ssl_tryconn_timeout_cb, sconn);
|
||||||
|
@ -540,7 +546,7 @@ rb_init_prng(const char *path, prng_seed_t seed_type)
|
||||||
{
|
{
|
||||||
if(seed_type == RB_PRNG_DEFAULT)
|
if(seed_type == RB_PRNG_DEFAULT)
|
||||||
{
|
{
|
||||||
#ifdef WIN32
|
#ifdef _WIN32
|
||||||
RAND_screen();
|
RAND_screen();
|
||||||
#endif
|
#endif
|
||||||
return RAND_status();
|
return RAND_status();
|
||||||
|
@ -558,7 +564,7 @@ rb_init_prng(const char *path, prng_seed_t seed_type)
|
||||||
if(RAND_load_file(path, -1) == -1)
|
if(RAND_load_file(path, -1) == -1)
|
||||||
return -1;
|
return -1;
|
||||||
break;
|
break;
|
||||||
#ifdef WIN32
|
#ifdef _WIN32
|
||||||
case RB_PRNGWIN32:
|
case RB_PRNGWIN32:
|
||||||
RAND_screen();
|
RAND_screen();
|
||||||
break;
|
break;
|
||||||
|
@ -574,11 +580,11 @@ int
|
||||||
rb_get_random(void *buf, size_t length)
|
rb_get_random(void *buf, size_t length)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if((ret = RAND_bytes(buf, length)) == 0)
|
if((ret = RAND_bytes(buf, length)) == 0)
|
||||||
{
|
{
|
||||||
/* remove the error from the queue */
|
/* remove the error from the queue */
|
||||||
ERR_get_error();
|
ERR_get_error();
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -594,7 +600,7 @@ rb_get_pseudo_random(void *buf, size_t length)
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
rb_get_ssl_strerror(rb_fde_t * F)
|
rb_get_ssl_strerror(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
return ERR_error_string(F->ssl_errno, NULL);
|
return ERR_error_string(F->ssl_errno, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
* #define NOTYET 1
|
* #define NOTYET 1
|
||||||
* #define PATRICIA_DEBUG 1
|
* #define PATRICIA_DEBUG 1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PREFIX_HEAP_COUNT 1024
|
#define PREFIX_HEAP_COUNT 1024
|
||||||
#define NODE_HEAP_COUNT 1024
|
#define NODE_HEAP_COUNT 1024
|
||||||
#define PATRICIA_HEAP_COUNT 128
|
#define PATRICIA_HEAP_COUNT 128
|
||||||
|
@ -42,12 +42,12 @@ rb_init_patricia(void)
|
||||||
* convert prefix information to bytes
|
* convert prefix information to bytes
|
||||||
*/
|
*/
|
||||||
static uint8_t *
|
static uint8_t *
|
||||||
prefix_tochar(rb_prefix_t * prefix)
|
prefix_tochar(rb_prefix_t *prefix)
|
||||||
{
|
{
|
||||||
if(prefix == NULL)
|
if(prefix == NULL)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
|
|
||||||
return ((uint8_t *) & prefix->add.sin);
|
return ((uint8_t *)&prefix->add.sin);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -59,14 +59,15 @@ comp_with_mask(void *addr, void *dest, unsigned int mask)
|
||||||
int n = mask / 8;
|
int n = mask / 8;
|
||||||
int m = ((-1) << (8 - (mask % 8)));
|
int m = ((-1) << (8 - (mask % 8)));
|
||||||
|
|
||||||
if(mask % 8 == 0 || (((uint8_t *) addr)[n] & m) == (((uint8_t *) dest)[n] & m))
|
if(mask % 8 == 0 || (((uint8_t *)addr)[n] & m) == (((uint8_t *)dest)[n] & m))
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NOTYET
|
#ifdef NOTYET
|
||||||
static char *
|
static char *
|
||||||
prefix_toa2x(rb_prefix_t * prefix, char *buf, int buf_len, int with_len)
|
prefix_toa2x(rb_prefix_t *prefix, char *buf, int buf_len, int with_len)
|
||||||
{
|
{
|
||||||
static char tmp[6];
|
static char tmp[6];
|
||||||
if(prefix == NULL)
|
if(prefix == NULL)
|
||||||
|
@ -88,12 +89,13 @@ prefix_toa2x(rb_prefix_t * prefix, char *buf, int buf_len, int with_len)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
prefix_toa2(rb_prefix_t * prefix, char *buff, int buf_len)
|
prefix_toa2(rb_prefix_t *prefix, char *buff, int buf_len)
|
||||||
{
|
{
|
||||||
return (prefix_toa2x(prefix, buff, buf_len, 0));
|
return (prefix_toa2x(prefix, buff, buf_len, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
prefix_toa(rb_prefix_t * prefix)
|
prefix_toa(rb_prefix_t *prefix)
|
||||||
{
|
{
|
||||||
#ifdef RB_IPV6
|
#ifdef RB_IPV6
|
||||||
static char buf[INET6_ADDRSTRLEN + 6];
|
static char buf[INET6_ADDRSTRLEN + 6];
|
||||||
|
@ -104,7 +106,7 @@ prefix_toa(rb_prefix_t * prefix)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
static rb_prefix_t *
|
static rb_prefix_t *
|
||||||
New_Prefix2(int family, void *dest, int bitlen, rb_prefix_t * prefix)
|
New_Prefix2(int family, void *dest, int bitlen, rb_prefix_t *prefix)
|
||||||
{
|
{
|
||||||
int dynamic_allocated = 0;
|
int dynamic_allocated = 0;
|
||||||
#ifdef RB_IPV6
|
#ifdef RB_IPV6
|
||||||
|
@ -130,7 +132,7 @@ New_Prefix2(int family, void *dest, int bitlen, rb_prefix_t * prefix)
|
||||||
{
|
{
|
||||||
if(prefix == NULL)
|
if(prefix == NULL)
|
||||||
{
|
{
|
||||||
prefix = rb_malloc(sizeof(rb_prefix_t));
|
prefix = rb_malloc(sizeof(rb_prefix_t));
|
||||||
dynamic_allocated++;
|
dynamic_allocated++;
|
||||||
}
|
}
|
||||||
memcpy(&prefix->add.sin, dest, 4);
|
memcpy(&prefix->add.sin, dest, 4);
|
||||||
|
@ -229,7 +231,7 @@ ascii2prefix(int family, const char *string)
|
||||||
}
|
}
|
||||||
|
|
||||||
static rb_prefix_t *
|
static rb_prefix_t *
|
||||||
Ref_Prefix(rb_prefix_t * prefix)
|
Ref_Prefix(rb_prefix_t *prefix)
|
||||||
{
|
{
|
||||||
if(prefix == NULL)
|
if(prefix == NULL)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
|
@ -243,7 +245,7 @@ Ref_Prefix(rb_prefix_t * prefix)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
Deref_Prefix(rb_prefix_t * prefix)
|
Deref_Prefix(rb_prefix_t *prefix)
|
||||||
{
|
{
|
||||||
if(prefix == NULL)
|
if(prefix == NULL)
|
||||||
return;
|
return;
|
||||||
|
@ -287,7 +289,7 @@ rb_new_patricia(int maxbits)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_clear_patricia(rb_patricia_tree_t * patricia, void (*func)(void *))
|
rb_clear_patricia(rb_patricia_tree_t *patricia, void (*func) (void *))
|
||||||
{
|
{
|
||||||
assert(patricia);
|
assert(patricia);
|
||||||
if(patricia->head)
|
if(patricia->head)
|
||||||
|
@ -297,7 +299,7 @@ rb_clear_patricia(rb_patricia_tree_t * patricia, void (*func)(void *))
|
||||||
rb_patricia_node_t **Xsp = Xstack;
|
rb_patricia_node_t **Xsp = Xstack;
|
||||||
rb_patricia_node_t *Xrn = patricia->head;
|
rb_patricia_node_t *Xrn = patricia->head;
|
||||||
|
|
||||||
while (Xrn)
|
while(Xrn)
|
||||||
{
|
{
|
||||||
rb_patricia_node_t *l = Xrn->l;
|
rb_patricia_node_t *l = Xrn->l;
|
||||||
rb_patricia_node_t *r = Xrn->r;
|
rb_patricia_node_t *r = Xrn->r;
|
||||||
|
@ -333,7 +335,7 @@ rb_clear_patricia(rb_patricia_tree_t * patricia, void (*func)(void *))
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Xrn = (rb_patricia_node_t *) 0;
|
Xrn = (rb_patricia_node_t *)0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -343,7 +345,7 @@ rb_clear_patricia(rb_patricia_tree_t * patricia, void (*func)(void *))
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_destroy_patricia(rb_patricia_tree_t * patricia, void (*func)(void *))
|
rb_destroy_patricia(rb_patricia_tree_t *patricia, void (*func) (void *))
|
||||||
{
|
{
|
||||||
rb_clear_patricia(patricia, func);
|
rb_clear_patricia(patricia, func);
|
||||||
num_active_patricia--;
|
num_active_patricia--;
|
||||||
|
@ -355,7 +357,7 @@ rb_destroy_patricia(rb_patricia_tree_t * patricia, void (*func)(void *))
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_patricia_process(rb_patricia_tree_t * patricia, void (*func)(rb_prefix_t *, void *))
|
rb_patricia_process(rb_patricia_tree_t *patricia, void (*func) (rb_prefix_t *, void *))
|
||||||
{
|
{
|
||||||
rb_patricia_node_t *node;
|
rb_patricia_node_t *node;
|
||||||
assert(func);
|
assert(func);
|
||||||
|
@ -368,7 +370,7 @@ rb_patricia_process(rb_patricia_tree_t * patricia, void (*func)(rb_prefix_t *, v
|
||||||
}
|
}
|
||||||
|
|
||||||
rb_patricia_node_t *
|
rb_patricia_node_t *
|
||||||
rb_patricia_search_exact(rb_patricia_tree_t * patricia, rb_prefix_t * prefix)
|
rb_patricia_search_exact(rb_patricia_tree_t *patricia, rb_prefix_t *prefix)
|
||||||
{
|
{
|
||||||
rb_patricia_node_t *node;
|
rb_patricia_node_t *node;
|
||||||
uint8_t *addr;
|
uint8_t *addr;
|
||||||
|
@ -385,7 +387,7 @@ rb_patricia_search_exact(rb_patricia_tree_t * patricia, rb_prefix_t * prefix)
|
||||||
addr = rb_prefix_touchar(prefix);
|
addr = rb_prefix_touchar(prefix);
|
||||||
bitlen = prefix->bitlen;
|
bitlen = prefix->bitlen;
|
||||||
|
|
||||||
while (node->bit < bitlen)
|
while(node->bit < bitlen)
|
||||||
{
|
{
|
||||||
|
|
||||||
if(BIT_TEST(addr[node->bit >> 3], 0x80 >> (node->bit & 0x07)))
|
if(BIT_TEST(addr[node->bit >> 3], 0x80 >> (node->bit & 0x07)))
|
||||||
|
@ -443,7 +445,7 @@ rb_patricia_search_exact(rb_patricia_tree_t * patricia, rb_prefix_t * prefix)
|
||||||
|
|
||||||
/* if inclusive != 0, "best" may be the given prefix itself */
|
/* if inclusive != 0, "best" may be the given prefix itself */
|
||||||
rb_patricia_node_t *
|
rb_patricia_node_t *
|
||||||
rb_patricia_search_best2(rb_patricia_tree_t * patricia, rb_prefix_t * prefix, int inclusive)
|
rb_patricia_search_best2(rb_patricia_tree_t *patricia, rb_prefix_t *prefix, int inclusive)
|
||||||
{
|
{
|
||||||
rb_patricia_node_t *node;
|
rb_patricia_node_t *node;
|
||||||
rb_patricia_node_t *stack[RB_PATRICIA_MAXBITS + 1];
|
rb_patricia_node_t *stack[RB_PATRICIA_MAXBITS + 1];
|
||||||
|
@ -462,7 +464,7 @@ rb_patricia_search_best2(rb_patricia_tree_t * patricia, rb_prefix_t * prefix, in
|
||||||
addr = rb_prefix_touchar(prefix);
|
addr = rb_prefix_touchar(prefix);
|
||||||
bitlen = prefix->bitlen;
|
bitlen = prefix->bitlen;
|
||||||
|
|
||||||
while (node->bit < bitlen)
|
while(node->bit < bitlen)
|
||||||
{
|
{
|
||||||
|
|
||||||
if(node->prefix)
|
if(node->prefix)
|
||||||
|
@ -522,7 +524,7 @@ rb_patricia_search_best2(rb_patricia_tree_t * patricia, rb_prefix_t * prefix, in
|
||||||
if(cnt <= 0)
|
if(cnt <= 0)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
|
|
||||||
while (--cnt >= 0)
|
while(--cnt >= 0)
|
||||||
{
|
{
|
||||||
node = stack[cnt];
|
node = stack[cnt];
|
||||||
#ifdef PATRICIA_DEBUG
|
#ifdef PATRICIA_DEBUG
|
||||||
|
@ -545,14 +547,14 @@ rb_patricia_search_best2(rb_patricia_tree_t * patricia, rb_prefix_t * prefix, in
|
||||||
|
|
||||||
|
|
||||||
rb_patricia_node_t *
|
rb_patricia_node_t *
|
||||||
rb_patricia_search_best(rb_patricia_tree_t * patricia, rb_prefix_t * prefix)
|
rb_patricia_search_best(rb_patricia_tree_t *patricia, rb_prefix_t *prefix)
|
||||||
{
|
{
|
||||||
return (rb_patricia_search_best2(patricia, prefix, 1));
|
return (rb_patricia_search_best2(patricia, prefix, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
rb_patricia_node_t *
|
rb_patricia_node_t *
|
||||||
rb_patricia_lookup(rb_patricia_tree_t * patricia, rb_prefix_t * prefix)
|
rb_patricia_lookup(rb_patricia_tree_t *patricia, rb_prefix_t *prefix)
|
||||||
{
|
{
|
||||||
rb_patricia_node_t *node, *new_node, *parent, *glue;
|
rb_patricia_node_t *node, *new_node, *parent, *glue;
|
||||||
uint8_t *addr, *test_addr;
|
uint8_t *addr, *test_addr;
|
||||||
|
@ -565,7 +567,7 @@ rb_patricia_lookup(rb_patricia_tree_t * patricia, rb_prefix_t * prefix)
|
||||||
|
|
||||||
if(patricia->head == NULL)
|
if(patricia->head == NULL)
|
||||||
{
|
{
|
||||||
node = rb_malloc(sizeof(rb_patricia_node_t));
|
node = rb_malloc(sizeof(rb_patricia_node_t));
|
||||||
node->bit = prefix->bitlen;
|
node->bit = prefix->bitlen;
|
||||||
node->prefix = Ref_Prefix(prefix);
|
node->prefix = Ref_Prefix(prefix);
|
||||||
node->parent = NULL;
|
node->parent = NULL;
|
||||||
|
@ -585,7 +587,7 @@ rb_patricia_lookup(rb_patricia_tree_t * patricia, rb_prefix_t * prefix)
|
||||||
bitlen = prefix->bitlen;
|
bitlen = prefix->bitlen;
|
||||||
node = patricia->head;
|
node = patricia->head;
|
||||||
|
|
||||||
while (node->bit < bitlen || node->prefix == NULL)
|
while(node->bit < bitlen || node->prefix == NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
if(node->bit < patricia->maxbits &&
|
if(node->bit < patricia->maxbits &&
|
||||||
|
@ -631,7 +633,7 @@ rb_patricia_lookup(rb_patricia_tree_t * patricia, rb_prefix_t * prefix)
|
||||||
/* find the first bit different */
|
/* find the first bit different */
|
||||||
check_bit = (node->bit < bitlen) ? node->bit : bitlen;
|
check_bit = (node->bit < bitlen) ? node->bit : bitlen;
|
||||||
differ_bit = 0;
|
differ_bit = 0;
|
||||||
for (i = 0; i * 8 < check_bit; i++)
|
for(i = 0; i * 8 < check_bit; i++)
|
||||||
{
|
{
|
||||||
if((r = (addr[i] ^ test_addr[i])) == 0)
|
if((r = (addr[i] ^ test_addr[i])) == 0)
|
||||||
{
|
{
|
||||||
|
@ -639,7 +641,7 @@ rb_patricia_lookup(rb_patricia_tree_t * patricia, rb_prefix_t * prefix)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
/* I know the better way, but for now */
|
/* I know the better way, but for now */
|
||||||
for (j = 0; j < 8; j++)
|
for(j = 0; j < 8; j++)
|
||||||
{
|
{
|
||||||
if(BIT_TEST(r, (0x80 >> j)))
|
if(BIT_TEST(r, (0x80 >> j)))
|
||||||
break;
|
break;
|
||||||
|
@ -656,7 +658,7 @@ rb_patricia_lookup(rb_patricia_tree_t * patricia, rb_prefix_t * prefix)
|
||||||
#endif /* PATRICIA_DEBUG */
|
#endif /* PATRICIA_DEBUG */
|
||||||
|
|
||||||
parent = node->parent;
|
parent = node->parent;
|
||||||
while (parent && parent->bit >= differ_bit)
|
while(parent && parent->bit >= differ_bit)
|
||||||
{
|
{
|
||||||
node = parent;
|
node = parent;
|
||||||
parent = node->parent;
|
parent = node->parent;
|
||||||
|
@ -689,7 +691,7 @@ rb_patricia_lookup(rb_patricia_tree_t * patricia, rb_prefix_t * prefix)
|
||||||
return (node);
|
return (node);
|
||||||
}
|
}
|
||||||
|
|
||||||
new_node = rb_malloc(sizeof(rb_patricia_node_t));
|
new_node = rb_malloc(sizeof(rb_patricia_node_t));
|
||||||
new_node->bit = prefix->bitlen;
|
new_node->bit = prefix->bitlen;
|
||||||
new_node->prefix = Ref_Prefix(prefix);
|
new_node->prefix = Ref_Prefix(prefix);
|
||||||
new_node->parent = NULL;
|
new_node->parent = NULL;
|
||||||
|
@ -797,7 +799,7 @@ rb_patricia_lookup(rb_patricia_tree_t * patricia, rb_prefix_t * prefix)
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_patricia_remove(rb_patricia_tree_t * patricia, rb_patricia_node_t * node)
|
rb_patricia_remove(rb_patricia_tree_t *patricia, rb_patricia_node_t *node)
|
||||||
{
|
{
|
||||||
rb_patricia_node_t *parent, *child;
|
rb_patricia_node_t *parent, *child;
|
||||||
|
|
||||||
|
@ -914,18 +916,18 @@ rb_patricia_remove(rb_patricia_tree_t * patricia, rb_patricia_node_t * node)
|
||||||
}
|
}
|
||||||
|
|
||||||
rb_patricia_node_t *
|
rb_patricia_node_t *
|
||||||
make_and_lookup_ip(rb_patricia_tree_t * tree, struct sockaddr *in, int bitlen)
|
make_and_lookup_ip(rb_patricia_tree_t *tree, struct sockaddr *in, int bitlen)
|
||||||
{
|
{
|
||||||
rb_prefix_t *prefix;
|
rb_prefix_t *prefix;
|
||||||
rb_patricia_node_t *node;
|
rb_patricia_node_t *node;
|
||||||
void *ipptr = NULL;
|
void *ipptr = NULL;
|
||||||
#ifdef RB_IPV6
|
#ifdef RB_IPV6
|
||||||
if(in->sa_family == AF_INET6)
|
if(in->sa_family == AF_INET6)
|
||||||
ipptr = &((struct sockaddr_in6 *)in)->sin6_addr;
|
ipptr = &((struct sockaddr_in6 *)in)->sin6_addr;
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
ipptr = &((struct sockaddr_in *)in)->sin_addr;
|
ipptr = &((struct sockaddr_in *)in)->sin_addr;
|
||||||
|
|
||||||
prefix = New_Prefix(in->sa_family, ipptr, bitlen);
|
prefix = New_Prefix(in->sa_family, ipptr, bitlen);
|
||||||
|
|
||||||
if(prefix == NULL)
|
if(prefix == NULL)
|
||||||
|
@ -941,7 +943,7 @@ make_and_lookup_ip(rb_patricia_tree_t * tree, struct sockaddr *in, int bitlen)
|
||||||
|
|
||||||
|
|
||||||
rb_patricia_node_t *
|
rb_patricia_node_t *
|
||||||
make_and_lookup(rb_patricia_tree_t * tree, const char *string)
|
make_and_lookup(rb_patricia_tree_t *tree, const char *string)
|
||||||
{
|
{
|
||||||
rb_prefix_t *prefix;
|
rb_prefix_t *prefix;
|
||||||
rb_patricia_node_t *node;
|
rb_patricia_node_t *node;
|
||||||
|
@ -968,7 +970,7 @@ make_and_lookup(rb_patricia_tree_t * tree, const char *string)
|
||||||
|
|
||||||
#ifdef NOTYET
|
#ifdef NOTYET
|
||||||
static rb_patricia_node_t *
|
static rb_patricia_node_t *
|
||||||
try_search_exact(rb_patricia_tree_t * tree, char *string)
|
try_search_exact(rb_patricia_tree_t *tree, char *string)
|
||||||
{
|
{
|
||||||
rb_prefix_t *prefix;
|
rb_prefix_t *prefix;
|
||||||
rb_patricia_node_t *node;
|
rb_patricia_node_t *node;
|
||||||
|
@ -991,7 +993,7 @@ try_search_exact(rb_patricia_tree_t * tree, char *string)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
lookup_then_remove(rb_patricia_tree_t * tree, char *string)
|
lookup_then_remove(rb_patricia_tree_t *tree, char *string)
|
||||||
{
|
{
|
||||||
rb_patricia_node_t *node;
|
rb_patricia_node_t *node;
|
||||||
|
|
||||||
|
@ -1001,7 +1003,7 @@ lookup_then_remove(rb_patricia_tree_t * tree, char *string)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rb_patricia_node_t *
|
rb_patricia_node_t *
|
||||||
rb_match_ip(rb_patricia_tree_t * tree, struct sockaddr *ip)
|
rb_match_ip(rb_patricia_tree_t *tree, struct sockaddr *ip)
|
||||||
{
|
{
|
||||||
rb_prefix_t *prefix;
|
rb_prefix_t *prefix;
|
||||||
rb_patricia_node_t *node;
|
rb_patricia_node_t *node;
|
||||||
|
@ -1018,13 +1020,15 @@ rb_match_ip(rb_patricia_tree_t * tree, struct sockaddr *ip)
|
||||||
len = 128;
|
len = 128;
|
||||||
family = AF_INET6;
|
family = AF_INET6;
|
||||||
ipptr = &((struct sockaddr_in6 *)ip)->sin6_addr;
|
ipptr = &((struct sockaddr_in6 *)ip)->sin6_addr;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
len = 32;
|
len = 32;
|
||||||
family = AF_INET;
|
family = AF_INET;
|
||||||
ipptr = &((struct sockaddr_in *)ip)->sin_addr;
|
ipptr = &((struct sockaddr_in *)ip)->sin_addr;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if((prefix = New_Prefix(family, ipptr, len)) != NULL)
|
if((prefix = New_Prefix(family, ipptr, len)) != NULL)
|
||||||
{
|
{
|
||||||
node = rb_patricia_search_best(tree, prefix);
|
node = rb_patricia_search_best(tree, prefix);
|
||||||
|
@ -1035,7 +1039,7 @@ rb_match_ip(rb_patricia_tree_t * tree, struct sockaddr *ip)
|
||||||
}
|
}
|
||||||
|
|
||||||
rb_patricia_node_t *
|
rb_patricia_node_t *
|
||||||
rb_match_ip_exact(rb_patricia_tree_t * tree, struct sockaddr *ip, unsigned int len)
|
rb_match_ip_exact(rb_patricia_tree_t *tree, struct sockaddr *ip, unsigned int len)
|
||||||
{
|
{
|
||||||
rb_prefix_t *prefix;
|
rb_prefix_t *prefix;
|
||||||
rb_patricia_node_t *node;
|
rb_patricia_node_t *node;
|
||||||
|
@ -1054,14 +1058,16 @@ rb_match_ip_exact(rb_patricia_tree_t * tree, struct sockaddr *ip, unsigned int l
|
||||||
len = 128;
|
len = 128;
|
||||||
family = AF_INET6;
|
family = AF_INET6;
|
||||||
ipptr = &((struct sockaddr_in6 *)ip)->sin6_addr;
|
ipptr = &((struct sockaddr_in6 *)ip)->sin6_addr;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if(len > 32)
|
if(len > 32)
|
||||||
len = 32;
|
len = 32;
|
||||||
family = AF_INET;
|
family = AF_INET;
|
||||||
ipptr = &((struct sockaddr_in *)ip)->sin_addr;
|
ipptr = &((struct sockaddr_in *)ip)->sin_addr;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if((prefix = New_Prefix(family, ipptr, len)) != NULL)
|
if((prefix = New_Prefix(family, ipptr, len)) != NULL)
|
||||||
{
|
{
|
||||||
node = rb_patricia_search_exact(tree, prefix);
|
node = rb_patricia_search_exact(tree, prefix);
|
||||||
|
@ -1074,7 +1080,7 @@ rb_match_ip_exact(rb_patricia_tree_t * tree, struct sockaddr *ip, unsigned int l
|
||||||
|
|
||||||
|
|
||||||
rb_patricia_node_t *
|
rb_patricia_node_t *
|
||||||
rb_match_string(rb_patricia_tree_t * tree, const char *string)
|
rb_match_string(rb_patricia_tree_t *tree, const char *string)
|
||||||
{
|
{
|
||||||
rb_patricia_node_t *node;
|
rb_patricia_node_t *node;
|
||||||
rb_prefix_t *prefix;
|
rb_prefix_t *prefix;
|
||||||
|
@ -1098,7 +1104,7 @@ rb_match_string(rb_patricia_tree_t * tree, const char *string)
|
||||||
}
|
}
|
||||||
|
|
||||||
rb_patricia_node_t *
|
rb_patricia_node_t *
|
||||||
rb_match_exact_string(rb_patricia_tree_t * tree, const char *string)
|
rb_match_exact_string(rb_patricia_tree_t *tree, const char *string)
|
||||||
{
|
{
|
||||||
rb_prefix_t *prefix;
|
rb_prefix_t *prefix;
|
||||||
rb_patricia_node_t *node;
|
rb_patricia_node_t *node;
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: poll.c 25375 2008-05-16 15:19:51Z androsyn $
|
* $Id: poll.c 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
#include <libratbox_config.h>
|
#include <libratbox_config.h>
|
||||||
#include <ratbox_lib.h>
|
#include <ratbox_lib.h>
|
||||||
|
@ -52,7 +52,7 @@ typedef struct _pollfd_list pollfd_list_t;
|
||||||
static pollfd_list_t pollfd_list;
|
static pollfd_list_t pollfd_list;
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_setup_fd_poll(rb_fde_t * F)
|
rb_setup_fd_poll(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -70,7 +70,7 @@ rb_init_netio_poll(void)
|
||||||
int fd;
|
int fd;
|
||||||
pollfd_list.pollfds = rb_malloc(rb_getmaxconnect() * (sizeof(struct pollfd)));
|
pollfd_list.pollfds = rb_malloc(rb_getmaxconnect() * (sizeof(struct pollfd)));
|
||||||
pollfd_list.allocated = rb_getmaxconnect();
|
pollfd_list.allocated = rb_getmaxconnect();
|
||||||
for (fd = 0; fd < rb_getmaxconnect(); fd++)
|
for(fd = 0; fd < rb_getmaxconnect(); fd++)
|
||||||
{
|
{
|
||||||
pollfd_list.pollfds[fd].fd = -1;
|
pollfd_list.pollfds[fd].fd = -1;
|
||||||
}
|
}
|
||||||
|
@ -89,7 +89,7 @@ resize_pollarray(int fd)
|
||||||
rb_realloc(pollfd_list.pollfds,
|
rb_realloc(pollfd_list.pollfds,
|
||||||
pollfd_list.allocated * (sizeof(struct pollfd)));
|
pollfd_list.allocated * (sizeof(struct pollfd)));
|
||||||
memset(&pollfd_list.pollfds[old_value + 1], 0, sizeof(struct pollfd) * 1024);
|
memset(&pollfd_list.pollfds[old_value + 1], 0, sizeof(struct pollfd) * 1024);
|
||||||
for (x = old_value + 1; x < pollfd_list.allocated; x++)
|
for(x = old_value + 1; x < pollfd_list.allocated; x++)
|
||||||
{
|
{
|
||||||
pollfd_list.pollfds[x].fd = -1;
|
pollfd_list.pollfds[x].fd = -1;
|
||||||
}
|
}
|
||||||
|
@ -103,7 +103,7 @@ resize_pollarray(int fd)
|
||||||
* and deregister interest in a pending IO state for a given FD.
|
* and deregister interest in a pending IO state for a given FD.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
rb_setselect_poll(rb_fde_t * F, unsigned int type, PF * handler, void *client_data)
|
rb_setselect_poll(rb_fde_t *F, unsigned int type, PF * handler, void *client_data)
|
||||||
{
|
{
|
||||||
if(F == NULL)
|
if(F == NULL)
|
||||||
return;
|
return;
|
||||||
|
@ -134,8 +134,8 @@ rb_setselect_poll(rb_fde_t * F, unsigned int type, PF * handler, void *client_da
|
||||||
pollfd_list.pollfds[F->fd].fd = -1;
|
pollfd_list.pollfds[F->fd].fd = -1;
|
||||||
if(F->fd == pollfd_list.maxindex)
|
if(F->fd == pollfd_list.maxindex)
|
||||||
{
|
{
|
||||||
while (pollfd_list.maxindex >= 0
|
while(pollfd_list.maxindex >= 0
|
||||||
&& pollfd_list.pollfds[pollfd_list.maxindex].fd == -1)
|
&& pollfd_list.pollfds[pollfd_list.maxindex].fd == -1)
|
||||||
pollfd_list.maxindex--;
|
pollfd_list.maxindex--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -175,7 +175,7 @@ rb_select_poll(long delay)
|
||||||
int revents;
|
int revents;
|
||||||
|
|
||||||
num = poll(pollfd_list.pollfds, pollfd_list.maxindex + 1, delay);
|
num = poll(pollfd_list.pollfds, pollfd_list.maxindex + 1, delay);
|
||||||
rb_set_time();
|
rb_set_time();
|
||||||
if(num < 0)
|
if(num < 0)
|
||||||
{
|
{
|
||||||
if(!rb_ignore_errno(errno))
|
if(!rb_ignore_errno(errno))
|
||||||
|
@ -184,23 +184,23 @@ rb_select_poll(long delay)
|
||||||
return RB_ERROR;
|
return RB_ERROR;
|
||||||
}
|
}
|
||||||
if(num == 0)
|
if(num == 0)
|
||||||
return RB_OK;
|
return RB_OK;
|
||||||
|
|
||||||
/* XXX we *could* optimise by falling out after doing num fds ... */
|
/* XXX we *could* optimise by falling out after doing num fds ... */
|
||||||
for (ci = 0; ci < pollfd_list.maxindex + 1; ci++)
|
for(ci = 0; ci < pollfd_list.maxindex + 1; ci++)
|
||||||
{
|
{
|
||||||
rb_fde_t *F;
|
rb_fde_t *F;
|
||||||
pfd = &pollfd_list.pollfds[ci];
|
pfd = &pollfd_list.pollfds[ci];
|
||||||
|
|
||||||
revents = pfd->revents;
|
revents = pfd->revents;
|
||||||
fd = pfd->fd;
|
fd = pfd->fd;
|
||||||
if(revents == 0 || fd == -1)
|
if(revents == 0 || fd == -1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
F = rb_find_fd(fd);
|
F = rb_find_fd(fd);
|
||||||
if(F == NULL)
|
if(F == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(revents & (POLLRDNORM | POLLIN | POLLHUP | POLLERR))
|
if(revents & (POLLRDNORM | POLLIN | POLLHUP | POLLERR))
|
||||||
{
|
{
|
||||||
hdl = F->read_handler;
|
hdl = F->read_handler;
|
||||||
|
@ -217,7 +217,7 @@ rb_select_poll(long delay)
|
||||||
data = F->write_data;
|
data = F->write_data;
|
||||||
F->write_handler = NULL;
|
F->write_handler = NULL;
|
||||||
F->write_data = NULL;
|
F->write_data = NULL;
|
||||||
if(hdl)
|
if(hdl)
|
||||||
hdl(F, data);
|
hdl(F, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -225,7 +225,7 @@ rb_select_poll(long delay)
|
||||||
rb_setselect_poll(F, RB_SELECT_READ, NULL, NULL);
|
rb_setselect_poll(F, RB_SELECT_READ, NULL, NULL);
|
||||||
if(F->write_handler == NULL)
|
if(F->write_handler == NULL)
|
||||||
rb_setselect_poll(F, RB_SELECT_WRITE, NULL, NULL);
|
rb_setselect_poll(F, RB_SELECT_WRITE, NULL, NULL);
|
||||||
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -239,7 +239,7 @@ rb_init_netio_poll(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_setselect_poll(rb_fde_t * F, unsigned int type, PF * handler, void *client_data)
|
rb_setselect_poll(rb_fde_t *F, unsigned int type, PF * handler, void *client_data)
|
||||||
{
|
{
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
return;
|
return;
|
||||||
|
@ -253,7 +253,7 @@ rb_select_poll(long delay)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_setup_fd_poll(rb_fde_t * F)
|
rb_setup_fd_poll(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: ports.c 25038 2008-01-23 16:03:08Z androsyn $
|
* $Id: ports.c 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <libratbox_config.h>
|
#include <libratbox_config.h>
|
||||||
|
@ -44,26 +44,26 @@ static struct timespec zero_timespec;
|
||||||
static port_event_t *pelst; /* port buffer */
|
static port_event_t *pelst; /* port buffer */
|
||||||
static int pemax; /* max structs to buffer */
|
static int pemax; /* max structs to buffer */
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_setup_fd_ports(rb_fde_t *F)
|
rb_setup_fd_ports(int fd)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
pe_update_events(rb_fde_t * F, short filter, PF * handler)
|
pe_update_events(rb_fde_t *F, short filter, PF * handler)
|
||||||
{
|
{
|
||||||
PF *cur_handler = NULL;
|
PF *cur_handler = NULL;
|
||||||
|
|
||||||
if (filter == POLLRDNORM)
|
if(filter == POLLRDNORM)
|
||||||
cur_handler = F->read_handler;
|
cur_handler = F->read_handler;
|
||||||
else if (filter == POLLWRNORM)
|
else if(filter == POLLWRNORM)
|
||||||
cur_handler = F->write_handler;
|
cur_handler = F->write_handler;
|
||||||
|
|
||||||
if (!cur_handler && handler)
|
if(!cur_handler && handler)
|
||||||
port_associate(pe, PORT_SOURCE_FD, F->fd, filter, F);
|
port_associate(pe, PORT_SOURCE_FD, F->fd, filter, F);
|
||||||
else if (cur_handler && !handler)
|
else if(cur_handler && !handler)
|
||||||
port_dissociate(pe, PORT_SOURCE_FD, F->fd);
|
port_dissociate(pe, PORT_SOURCE_FD, F->fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,7 +80,8 @@ pe_update_events(rb_fde_t * F, short filter, PF * handler)
|
||||||
int
|
int
|
||||||
rb_init_netio_ports(void)
|
rb_init_netio_ports(void)
|
||||||
{
|
{
|
||||||
if((pe = port_create()) < 0) {
|
if((pe = port_create()) < 0)
|
||||||
|
{
|
||||||
return errno;
|
return errno;
|
||||||
}
|
}
|
||||||
pemax = getdtablesize();
|
pemax = getdtablesize();
|
||||||
|
@ -96,18 +97,19 @@ rb_init_netio_ports(void)
|
||||||
* and deregister interest in a pending IO state for a given FD.
|
* and deregister interest in a pending IO state for a given FD.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
rb_setselect_ports(rb_fde_t *F, unsigned int type, PF * handler,
|
rb_setselect_ports(rb_fde_t *F, unsigned int type, PF * handler, void *client_data)
|
||||||
void *client_data)
|
|
||||||
{
|
{
|
||||||
lrb_assert(IsFDOpen(F));
|
lrb_assert(IsFDOpen(F));
|
||||||
|
|
||||||
/* Update the list, even though we're not using it .. */
|
/* Update the list, even though we're not using it .. */
|
||||||
if(type & RB_SELECT_READ) {
|
if(type & RB_SELECT_READ)
|
||||||
|
{
|
||||||
pe_update_events(F, POLLRDNORM, handler);
|
pe_update_events(F, POLLRDNORM, handler);
|
||||||
F->read_handler = handler;
|
F->read_handler = handler;
|
||||||
F->read_data = client_data;
|
F->read_data = client_data;
|
||||||
}
|
}
|
||||||
if(type & RB_SELECT_WRITE) {
|
if(type & RB_SELECT_WRITE)
|
||||||
|
{
|
||||||
pe_update_events(F, POLLWRNORM, handler);
|
pe_update_events(F, POLLWRNORM, handler);
|
||||||
F->write_handler = handler;
|
F->write_handler = handler;
|
||||||
F->write_data = client_data;
|
F->write_data = client_data;
|
||||||
|
@ -126,10 +128,10 @@ rb_setselect_ports(rb_fde_t *F, unsigned int type, PF * handler,
|
||||||
int
|
int
|
||||||
rb_select_ports(long delay)
|
rb_select_ports(long delay)
|
||||||
{
|
{
|
||||||
int i, fd;
|
int i, fd;
|
||||||
uint nget = 1;
|
uint nget = 1;
|
||||||
struct timespec poll_time;
|
struct timespec poll_time;
|
||||||
struct timer_data *tdata;
|
struct timer_data *tdata;
|
||||||
|
|
||||||
poll_time.tv_sec = delay / 1000;
|
poll_time.tv_sec = delay / 1000;
|
||||||
poll_time.tv_nsec = (delay % 1000) * 1000000;
|
poll_time.tv_nsec = (delay % 1000) * 1000000;
|
||||||
|
@ -137,21 +139,25 @@ struct timer_data *tdata;
|
||||||
i = port_getn(pe, pelst, pemax, &nget, &poll_time);
|
i = port_getn(pe, pelst, pemax, &nget, &poll_time);
|
||||||
rb_set_time();
|
rb_set_time();
|
||||||
|
|
||||||
if (i == -1)
|
if(i == -1)
|
||||||
return RB_OK;
|
return RB_OK;
|
||||||
|
|
||||||
for (i = 0; i < nget; i++) {
|
for(i = 0; i < nget; i++)
|
||||||
switch(pelst[i].portev_source) {
|
{
|
||||||
|
switch (pelst[i].portev_source)
|
||||||
|
{
|
||||||
case PORT_SOURCE_FD:
|
case PORT_SOURCE_FD:
|
||||||
fd = pelst[i].portev_object;
|
fd = pelst[i].portev_object;
|
||||||
PF *hdl = NULL;
|
PF *hdl = NULL;
|
||||||
rb_fde_t *F = rb_find_fd(fd);
|
rb_fde_t *F = rb_find_fd(fd);
|
||||||
|
|
||||||
if ((pelst[i].portev_events & POLLRDNORM) && (hdl = F->read_handler)) {
|
if((pelst[i].portev_events & POLLRDNORM) && (hdl = F->read_handler))
|
||||||
|
{
|
||||||
F->read_handler = NULL;
|
F->read_handler = NULL;
|
||||||
hdl(F, F->read_data);
|
hdl(F, F->read_data);
|
||||||
}
|
}
|
||||||
if ((pelst[i].portev_events & POLLWRNORM) && (hdl = F->write_handler)) {
|
if((pelst[i].portev_events & POLLWRNORM) && (hdl = F->write_handler))
|
||||||
|
{
|
||||||
F->write_handler = NULL;
|
F->write_handler = NULL;
|
||||||
hdl(F, F->write_data);
|
hdl(F, F->write_data);
|
||||||
}
|
}
|
||||||
|
@ -162,7 +168,7 @@ struct timer_data *tdata;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* ports not supported */
|
#else /* ports not supported */
|
||||||
int
|
int
|
||||||
rb_init_netio_ports(void)
|
rb_init_netio_ports(void)
|
||||||
{
|
{
|
||||||
return ENOSYS;
|
return ENOSYS;
|
||||||
|
@ -171,23 +177,23 @@ rb_init_netio_ports(void)
|
||||||
void
|
void
|
||||||
rb_setselect_ports(rb_fde_t *F, unsigned int type, PF * handler, void *client_data)
|
rb_setselect_ports(rb_fde_t *F, unsigned int type, PF * handler, void *client_data)
|
||||||
{
|
{
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_select_ports(long delay)
|
rb_select_ports(long delay)
|
||||||
{
|
{
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_setup_fd_ports(rb_fde_t *F)
|
rb_setup_fd_ports(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: ratbox_lib.c 25375 2008-05-16 15:19:51Z androsyn $
|
* $Id: ratbox_lib.c 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <libratbox_config.h>
|
#include <libratbox_config.h>
|
||||||
|
@ -37,20 +37,20 @@ static char errbuf[512];
|
||||||
/* this doesn't do locales...oh well i guess */
|
/* this doesn't do locales...oh well i guess */
|
||||||
|
|
||||||
static const char *months[] = {
|
static const char *months[] = {
|
||||||
"January", "February", "March", "April",
|
"January", "February", "March", "April",
|
||||||
"May", "June", "July", "August",
|
"May", "June", "July", "August",
|
||||||
"September", "October", "November", "December"
|
"September", "October", "November", "December"
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *weekdays[] = {
|
static const char *weekdays[] = {
|
||||||
"Sunday", "Monday", "Tuesday", "Wednesday",
|
"Sunday", "Monday", "Tuesday", "Wednesday",
|
||||||
"Thursday", "Friday", "Saturday"
|
"Thursday", "Friday", "Saturday"
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *s_month[] = {
|
static const char *s_month[] = {
|
||||||
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
|
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
|
||||||
"Aug", "Sep", "Oct", "Nov", "Dec"
|
"Aug", "Sep", "Oct", "Nov", "Dec"
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *s_weekdays[] = {
|
static const char *s_weekdays[] = {
|
||||||
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
|
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
|
||||||
|
@ -72,23 +72,24 @@ rb_ctime(const time_t t, char *buf, size_t len)
|
||||||
if(rb_unlikely(tp == NULL))
|
if(rb_unlikely(tp == NULL))
|
||||||
{
|
{
|
||||||
strcpy(buf, "");
|
strcpy(buf, "");
|
||||||
return(buf);
|
return (buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(buf == NULL)
|
if(buf == NULL)
|
||||||
{
|
{
|
||||||
p = timex;
|
p = timex;
|
||||||
tlen = sizeof(timex);
|
tlen = sizeof(timex);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
p = buf;
|
p = buf;
|
||||||
tlen = len;
|
tlen = len;
|
||||||
}
|
}
|
||||||
|
|
||||||
rb_snprintf(p, tlen, "%s %s %d %02u:%02u:%02u %d",
|
rb_snprintf(p, tlen, "%s %s %d %02u:%02u:%02u %d",
|
||||||
s_weekdays[tp->tm_wday], s_month[tp->tm_mon],
|
s_weekdays[tp->tm_wday], s_month[tp->tm_mon],
|
||||||
tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec,
|
tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec, tp->tm_year + 1900);
|
||||||
tp->tm_year + 1900);
|
return (p);
|
||||||
return(p);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -106,14 +107,14 @@ rb_date(const time_t t, char *buf, size_t len)
|
||||||
|
|
||||||
if(rb_unlikely(gm == NULL))
|
if(rb_unlikely(gm == NULL))
|
||||||
{
|
{
|
||||||
rb_strlcpy(buf, "", len);
|
rb_strlcpy(buf, "", len);
|
||||||
return(buf);
|
return (buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
rb_snprintf(buf, len, "%s %s %d %d -- %02u:%02u:%02u +00:00",
|
rb_snprintf(buf, len, "%s %s %d %d -- %02u:%02u:%02u +00:00",
|
||||||
weekdays[gm->tm_wday], months[gm->tm_mon], gm->tm_mday,
|
weekdays[gm->tm_wday], months[gm->tm_mon], gm->tm_mday,
|
||||||
gm->tm_year + 1900, gm->tm_hour, gm->tm_min, gm->tm_sec);
|
gm->tm_year + 1900, gm->tm_hour, gm->tm_min, gm->tm_sec);
|
||||||
return(buf);
|
return (buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
time_t
|
time_t
|
||||||
|
@ -135,7 +136,7 @@ rb_lib_log(const char *format, ...)
|
||||||
if(rb_log == NULL)
|
if(rb_log == NULL)
|
||||||
return;
|
return;
|
||||||
va_start(args, format);
|
va_start(args, format);
|
||||||
rb_vsnprintf(errbuf, sizeof(errbuf), format, args);
|
rb_vsnprintf(errbuf, sizeof(errbuf), format, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
rb_log(errbuf);
|
rb_log(errbuf);
|
||||||
}
|
}
|
||||||
|
@ -147,7 +148,7 @@ rb_lib_die(const char *format, ...)
|
||||||
if(rb_die == NULL)
|
if(rb_die == NULL)
|
||||||
abort();
|
abort();
|
||||||
va_start(args, format);
|
va_start(args, format);
|
||||||
rb_vsnprintf(errbuf, sizeof(errbuf), format, args);
|
rb_vsnprintf(errbuf, sizeof(errbuf), format, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
rb_die(errbuf);
|
rb_die(errbuf);
|
||||||
}
|
}
|
||||||
|
@ -159,7 +160,7 @@ rb_lib_restart(const char *format, ...)
|
||||||
if(rb_restart == NULL)
|
if(rb_restart == NULL)
|
||||||
abort();
|
abort();
|
||||||
va_start(args, format);
|
va_start(args, format);
|
||||||
rb_vsnprintf(errbuf, sizeof(errbuf), format, args);
|
rb_vsnprintf(errbuf, sizeof(errbuf), format, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
rb_restart(errbuf);
|
rb_restart(errbuf);
|
||||||
}
|
}
|
||||||
|
@ -181,15 +182,17 @@ rb_set_time(void)
|
||||||
memcpy(&rb_time, &newtime, sizeof(struct timeval));
|
memcpy(&rb_time, &newtime, sizeof(struct timeval));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern const char *libratbox_serno;
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
rb_lib_version(void)
|
rb_lib_version(void)
|
||||||
{
|
{
|
||||||
static const char *id = "$Rev: 25375 $";
|
return libratbox_serno;
|
||||||
return id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_lib_init(log_cb *ilog, restart_cb *irestart, die_cb *idie, int closeall, int maxcon, size_t dh_size, size_t fd_heap_size)
|
rb_lib_init(log_cb * ilog, restart_cb * irestart, die_cb * idie, int closeall, int maxcon,
|
||||||
|
size_t dh_size, size_t fd_heap_size)
|
||||||
{
|
{
|
||||||
rb_set_time();
|
rb_set_time();
|
||||||
rb_log = ilog;
|
rb_log = ilog;
|
||||||
|
@ -219,24 +222,25 @@ rb_lib_loop(long delay)
|
||||||
while(1)
|
while(1)
|
||||||
rb_select(-1);
|
rb_select(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
if(delay == 0)
|
if(delay == 0)
|
||||||
{
|
{
|
||||||
if((next = rb_event_next()) > 0)
|
if((next = rb_event_next()) > 0)
|
||||||
{
|
{
|
||||||
next -= rb_current_time();
|
next -= rb_current_time();
|
||||||
if(next <= 0)
|
if(next <= 0)
|
||||||
next = 1000;
|
next = 1000;
|
||||||
else
|
else
|
||||||
next *= 1000;
|
next *= 1000;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
next = -1;
|
next = -1;
|
||||||
rb_select(next);
|
rb_select(next);
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
rb_select(delay);
|
rb_select(delay);
|
||||||
rb_event_run();
|
rb_event_run();
|
||||||
}
|
}
|
||||||
|
@ -244,17 +248,17 @@ rb_lib_loop(long delay)
|
||||||
|
|
||||||
#ifndef HAVE_STRTOK_R
|
#ifndef HAVE_STRTOK_R
|
||||||
char *
|
char *
|
||||||
rb_strtok_r (char *s, const char *delim, char **save)
|
rb_strtok_r(char *s, const char *delim, char **save)
|
||||||
{
|
{
|
||||||
char *token;
|
char *token;
|
||||||
|
|
||||||
if (s == NULL)
|
if(s == NULL)
|
||||||
s = *save;
|
s = *save;
|
||||||
|
|
||||||
/* Scan leading delimiters. */
|
/* Scan leading delimiters. */
|
||||||
s += strspn(s, delim);
|
s += strspn(s, delim);
|
||||||
|
|
||||||
if (*s == '\0')
|
if(*s == '\0')
|
||||||
{
|
{
|
||||||
*save = s;
|
*save = s;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -262,19 +266,19 @@ rb_strtok_r (char *s, const char *delim, char **save)
|
||||||
|
|
||||||
token = s;
|
token = s;
|
||||||
s = strpbrk(token, delim);
|
s = strpbrk(token, delim);
|
||||||
|
|
||||||
if (s == NULL)
|
if(s == NULL)
|
||||||
*save = (token + strlen(token));
|
*save = (token + strlen(token));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*s = '\0';
|
*s = '\0';
|
||||||
*save = s + 1;
|
*save = s + 1;
|
||||||
}
|
}
|
||||||
return token;
|
return token;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
char
|
char *
|
||||||
*rb_strtok_r(char *s, const char *delim, char **save)
|
rb_strtok_r(char *s, const char *delim, char **save)
|
||||||
{
|
{
|
||||||
return strtok_r(s, delim, save);
|
return strtok_r(s, delim, save);
|
||||||
}
|
}
|
||||||
|
@ -283,11 +287,11 @@ char
|
||||||
|
|
||||||
static const char base64_table[] =
|
static const char base64_table[] =
|
||||||
{ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
{ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
||||||
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
|
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
|
||||||
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
|
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
|
||||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '\0'
|
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '\0'
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char base64_pad = '=';
|
static const char base64_pad = '=';
|
||||||
|
|
||||||
|
@ -296,7 +300,7 @@ static const short base64_reverse_table[256] = {
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
|
||||||
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
|
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
|
||||||
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
||||||
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
|
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
|
||||||
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
||||||
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
|
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
|
||||||
|
@ -317,31 +321,36 @@ rb_base64_encode(const unsigned char *str, int length)
|
||||||
unsigned char *p;
|
unsigned char *p;
|
||||||
unsigned char *result;
|
unsigned char *result;
|
||||||
|
|
||||||
if ((length + 2) < 0 || ((length + 2) / 3) >= (1 << (sizeof(int) * 8 - 2))) {
|
if((length + 2) < 0 || ((length + 2) / 3) >= (1 << (sizeof(int) * 8 - 2)))
|
||||||
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = rb_malloc(((length + 2) / 3) * 5);
|
result = rb_malloc(((length + 2) / 3) * 5);
|
||||||
p = result;
|
p = result;
|
||||||
|
|
||||||
while (length > 2)
|
while(length > 2)
|
||||||
{
|
{
|
||||||
*p++ = base64_table[current[0] >> 2];
|
*p++ = base64_table[current[0] >> 2];
|
||||||
*p++ = base64_table[((current[0] & 0x03) << 4) + (current[1] >> 4)];
|
*p++ = base64_table[((current[0] & 0x03) << 4) + (current[1] >> 4)];
|
||||||
*p++ = base64_table[((current[1] & 0x0f) << 2) + (current[2] >> 6)];
|
*p++ = base64_table[((current[1] & 0x0f) << 2) + (current[2] >> 6)];
|
||||||
*p++ = base64_table[current[2] & 0x3f];
|
*p++ = base64_table[current[2] & 0x3f];
|
||||||
|
|
||||||
current += 3;
|
current += 3;
|
||||||
length -= 3;
|
length -= 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (length != 0) {
|
if(length != 0)
|
||||||
|
{
|
||||||
*p++ = base64_table[current[0] >> 2];
|
*p++ = base64_table[current[0] >> 2];
|
||||||
if (length > 1) {
|
if(length > 1)
|
||||||
|
{
|
||||||
*p++ = base64_table[((current[0] & 0x03) << 4) + (current[1] >> 4)];
|
*p++ = base64_table[((current[0] & 0x03) << 4) + (current[1] >> 4)];
|
||||||
*p++ = base64_table[(current[1] & 0x0f) << 2];
|
*p++ = base64_table[(current[1] & 0x0f) << 2];
|
||||||
*p++ = base64_pad;
|
*p++ = base64_pad;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
*p++ = base64_table[(current[0] & 0x03) << 4];
|
*p++ = base64_table[(current[0] & 0x03) << 4];
|
||||||
*p++ = base64_pad;
|
*p++ = base64_pad;
|
||||||
*p++ = base64_pad;
|
*p++ = base64_pad;
|
||||||
|
@ -357,16 +366,20 @@ rb_base64_decode(const unsigned char *str, int length, int *ret)
|
||||||
const unsigned char *current = str;
|
const unsigned char *current = str;
|
||||||
int ch, i = 0, j = 0, k;
|
int ch, i = 0, j = 0, k;
|
||||||
unsigned char *result;
|
unsigned char *result;
|
||||||
|
|
||||||
result = rb_malloc(length + 1);
|
result = rb_malloc(length + 1);
|
||||||
|
|
||||||
while ((ch = *current++) != '\0' && length-- > 0) {
|
while((ch = *current++) != '\0' && length-- > 0)
|
||||||
if (ch == base64_pad) break;
|
{
|
||||||
|
if(ch == base64_pad)
|
||||||
|
break;
|
||||||
|
|
||||||
ch = base64_reverse_table[ch];
|
ch = base64_reverse_table[ch];
|
||||||
if (ch < 0) continue;
|
if(ch < 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
switch(i % 4) {
|
switch (i % 4)
|
||||||
|
{
|
||||||
case 0:
|
case 0:
|
||||||
result[j] = ch << 2;
|
result[j] = ch << 2;
|
||||||
break;
|
break;
|
||||||
|
@ -375,7 +388,7 @@ rb_base64_decode(const unsigned char *str, int length, int *ret)
|
||||||
result[j] = (ch & 0x0f) << 4;
|
result[j] = (ch & 0x0f) << 4;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
result[j++] |= ch >>2;
|
result[j++] |= ch >> 2;
|
||||||
result[j] = (ch & 0x03) << 6;
|
result[j] = (ch & 0x03) << 6;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
|
@ -387,8 +400,10 @@ rb_base64_decode(const unsigned char *str, int length, int *ret)
|
||||||
|
|
||||||
k = j;
|
k = j;
|
||||||
|
|
||||||
if (ch == base64_pad) {
|
if(ch == base64_pad)
|
||||||
switch(i % 4) {
|
{
|
||||||
|
switch (i % 4)
|
||||||
|
{
|
||||||
case 1:
|
case 1:
|
||||||
free(result);
|
free(result);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -402,5 +417,3 @@ rb_base64_decode(const unsigned char *str, int length, int *ret)
|
||||||
*ret = j;
|
*ret = j;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -125,9 +125,9 @@ rb_rawbuf_flush_writev(rawbuf_head_t * rb, rb_fde_t *F)
|
||||||
rb->len -= buf->len - rb->written;
|
rb->len -= buf->len - rb->written;
|
||||||
rb_rawbuf_done(rb, buf);
|
rb_rawbuf_done(rb, buf);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(xret >= buf->len)
|
if(xret >= buf->len)
|
||||||
{
|
{
|
||||||
xret -= buf->len;
|
xret -= buf->len;
|
||||||
|
@ -179,7 +179,7 @@ rb_rawbuf_flush(rawbuf_head_t * rb, rb_fde_t *F)
|
||||||
rb_bh_free(rawbuf_heap, buf);
|
rb_bh_free(rawbuf_heap, buf);
|
||||||
}
|
}
|
||||||
rb->len -= retval;
|
rb->len -= retval;
|
||||||
lrb_assert(rb->len >= 0);
|
lrb_assert(rb->len >= 0);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,7 +197,7 @@ rb_rawbuf_append(rawbuf_head_t * rb, void *data, int len)
|
||||||
{
|
{
|
||||||
buf = (rawbuf_t *) rb->list.tail->data;
|
buf = (rawbuf_t *) rb->list.tail->data;
|
||||||
clen = RAWBUF_SIZE - buf->len;
|
clen = RAWBUF_SIZE - buf->len;
|
||||||
ptr = (void *) (buf->data + buf->len);
|
ptr = (void *)(buf->data + buf->len);
|
||||||
if(len < clen)
|
if(len < clen)
|
||||||
clen = len;
|
clen = len;
|
||||||
|
|
||||||
|
@ -211,7 +211,7 @@ rb_rawbuf_append(rawbuf_head_t * rb, void *data, int len)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while (len > 0)
|
while(len > 0)
|
||||||
{
|
{
|
||||||
buf = rb_rawbuf_newbuf(rb);
|
buf = rb_rawbuf_newbuf(rb);
|
||||||
|
|
||||||
|
@ -241,7 +241,7 @@ rb_rawbuf_get(rawbuf_head_t * rb, void *data, int len)
|
||||||
buf = rb->list.head->data;
|
buf = rb->list.head->data;
|
||||||
|
|
||||||
if(buf->flushing)
|
if(buf->flushing)
|
||||||
ptr = (void *) (buf->data + rb->written);
|
ptr = (void *)(buf->data + rb->written);
|
||||||
else
|
else
|
||||||
ptr = buf->data;
|
ptr = buf->data;
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: rb_memory.c 25038 2008-01-23 16:03:08Z androsyn $
|
* $Id: rb_memory.c 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
#include <libratbox_config.h>
|
#include <libratbox_config.h>
|
||||||
#include <ratbox_lib.h>
|
#include <ratbox_lib.h>
|
||||||
|
@ -39,4 +39,3 @@ rb_outofmemory(void)
|
||||||
rb_lib_log("Out of memory: restarting server...");
|
rb_lib_log("Out of memory: restarting server...");
|
||||||
rb_lib_restart("Out of Memory");
|
rb_lib_restart("Out of Memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,13 +22,22 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: select.c 25038 2008-01-23 16:03:08Z androsyn $
|
* $Id: select.c 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
#define FD_SETSIZE 65535
|
||||||
#include <libratbox_config.h>
|
#include <libratbox_config.h>
|
||||||
#include <ratbox_lib.h>
|
#include <ratbox_lib.h>
|
||||||
#include <commio-int.h>
|
#include <commio-int.h>
|
||||||
|
|
||||||
#if defined(HAVE_SELECT)
|
#if defined(HAVE_SELECT) || defined(_WIN32)
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define MY_FD_SET(x, y) FD_SET((SOCKET)x, y)
|
||||||
|
#define MY_FD_CLR(x, y) FD_CLR((SOCKET)x, y)
|
||||||
|
#else
|
||||||
|
#define MY_FD_SET(x, y) FD_SET(x, y)
|
||||||
|
#define MY_FD_CLR(x, y) FD_CLR(x, y)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_SYS_SELECT_H
|
#ifdef HAVE_SYS_SELECT_H
|
||||||
#include <sys/select.h>
|
#include <sys/select.h>
|
||||||
|
@ -65,43 +74,44 @@ select_update_selectfds(rb_fde_t *F, short event, PF * handler)
|
||||||
/* Update the read / write set */
|
/* Update the read / write set */
|
||||||
if(event & RB_SELECT_READ)
|
if(event & RB_SELECT_READ)
|
||||||
{
|
{
|
||||||
if(handler)
|
if(handler)
|
||||||
{
|
{
|
||||||
FD_SET(F->fd, &select_readfds);
|
MY_FD_SET(F->fd, &select_readfds);
|
||||||
F->pflags |= RB_SELECT_READ;
|
F->pflags |= RB_SELECT_READ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
FD_CLR(F->fd, &select_readfds);
|
MY_FD_CLR(F->fd, &select_readfds);
|
||||||
F->pflags &= ~RB_SELECT_READ;
|
F->pflags &= ~RB_SELECT_READ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(event & RB_SELECT_WRITE)
|
if(event & RB_SELECT_WRITE)
|
||||||
{
|
{
|
||||||
if(handler)
|
if(handler)
|
||||||
{
|
{
|
||||||
FD_SET(F->fd, &select_writefds);
|
MY_FD_SET(F->fd, &select_writefds);
|
||||||
F->pflags |= RB_SELECT_WRITE;
|
F->pflags |= RB_SELECT_WRITE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
FD_CLR(F->fd, &select_writefds);
|
MY_FD_CLR(F->fd, &select_writefds);
|
||||||
F->pflags &= ~RB_SELECT_WRITE;
|
F->pflags &= ~RB_SELECT_WRITE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(F->pflags & (RB_SELECT_READ|RB_SELECT_WRITE))
|
if(F->pflags & (RB_SELECT_READ | RB_SELECT_WRITE))
|
||||||
{
|
{
|
||||||
if(F->fd > rb_maxfd)
|
if(F->fd > rb_maxfd)
|
||||||
{
|
{
|
||||||
rb_maxfd = F->fd;
|
rb_maxfd = F->fd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(F->fd <= rb_maxfd)
|
else if(F->fd <= rb_maxfd)
|
||||||
{
|
{
|
||||||
while(rb_maxfd >= 0 && !FD_ISSET(rb_maxfd, &select_readfds) && !FD_ISSET(rb_maxfd, &select_writefds))
|
while(rb_maxfd >= 0 && !FD_ISSET(rb_maxfd, &select_readfds)
|
||||||
rb_maxfd--;
|
&& !FD_ISSET(rb_maxfd, &select_writefds))
|
||||||
|
rb_maxfd--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,7 +122,7 @@ select_update_selectfds(rb_fde_t *F, short event, PF * handler)
|
||||||
int
|
int
|
||||||
rb_setup_fd_select(rb_fde_t *F)
|
rb_setup_fd_select(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -122,9 +132,12 @@ rb_setup_fd_select(rb_fde_t *F)
|
||||||
* This is a needed exported function which will be called to initialise
|
* This is a needed exported function which will be called to initialise
|
||||||
* the network loop code.
|
* the network loop code.
|
||||||
*/
|
*/
|
||||||
|
extern int rb_maxconnections;
|
||||||
int
|
int
|
||||||
rb_init_netio_select(void)
|
rb_init_netio_select(void)
|
||||||
{
|
{
|
||||||
|
if(rb_maxconnections > FD_SETSIZE)
|
||||||
|
rb_maxconnections = FD_SETSIZE; /* override this */
|
||||||
FD_ZERO(&select_readfds);
|
FD_ZERO(&select_readfds);
|
||||||
FD_ZERO(&select_writefds);
|
FD_ZERO(&select_writefds);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -137,8 +150,7 @@ rb_init_netio_select(void)
|
||||||
* and deregister interest in a pending IO state for a given FD.
|
* and deregister interest in a pending IO state for a given FD.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
rb_setselect_select(rb_fde_t *F, unsigned int type, PF * handler,
|
rb_setselect_select(rb_fde_t *F, unsigned int type, PF * handler, void *client_data)
|
||||||
void *client_data)
|
|
||||||
{
|
{
|
||||||
lrb_assert(IsFDOpen(F));
|
lrb_assert(IsFDOpen(F));
|
||||||
|
|
||||||
|
@ -181,7 +193,7 @@ rb_select_select(long delay)
|
||||||
memcpy(&tmpreadfds, &select_readfds, sizeof(fd_set));
|
memcpy(&tmpreadfds, &select_readfds, sizeof(fd_set));
|
||||||
memcpy(&tmpwritefds, &select_writefds, sizeof(fd_set));
|
memcpy(&tmpwritefds, &select_writefds, sizeof(fd_set));
|
||||||
|
|
||||||
for (;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
to.tv_sec = 0;
|
to.tv_sec = 0;
|
||||||
to.tv_usec = delay * 1000;
|
to.tv_usec = delay * 1000;
|
||||||
|
@ -201,7 +213,7 @@ rb_select_select(long delay)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* XXX we *could* optimise by falling out after doing num fds ... */
|
/* XXX we *could* optimise by falling out after doing num fds ... */
|
||||||
for (fd = 0; fd < rb_maxfd + 1; fd++)
|
for(fd = 0; fd < rb_maxfd + 1; fd++)
|
||||||
{
|
{
|
||||||
F = rb_find_fd(fd);
|
F = rb_find_fd(fd);
|
||||||
if(F == NULL)
|
if(F == NULL)
|
||||||
|
@ -234,7 +246,7 @@ rb_select_select(long delay)
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* select not supported..what sort of garbage is this? */
|
#else /* select not supported..what sort of garbage is this? */
|
||||||
int
|
int
|
||||||
rb_init_netio_select(void)
|
rb_init_netio_select(void)
|
||||||
{
|
{
|
||||||
return ENOSYS;
|
return ENOSYS;
|
||||||
|
@ -243,22 +255,22 @@ rb_init_netio_select(void)
|
||||||
void
|
void
|
||||||
rb_setselect_select(rb_fde_t *F, unsigned int type, PF * handler, void *client_data)
|
rb_setselect_select(rb_fde_t *F, unsigned int type, PF * handler, void *client_data)
|
||||||
{
|
{
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_select_select(long delay)
|
rb_select_select(long delay)
|
||||||
{
|
{
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_setup_fd_select(rb_fde_t *F)
|
rb_setup_fd_select(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: sigio.c 25375 2008-05-16 15:19:51Z androsyn $
|
* $Id: sigio.c 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _GNU_SOURCE
|
#ifndef _GNU_SOURCE
|
||||||
|
@ -81,7 +81,7 @@ rb_init_netio_sigio(void)
|
||||||
int fd;
|
int fd;
|
||||||
pollfd_list.pollfds = rb_malloc(rb_getmaxconnect() * (sizeof(struct pollfd)));
|
pollfd_list.pollfds = rb_malloc(rb_getmaxconnect() * (sizeof(struct pollfd)));
|
||||||
pollfd_list.allocated = rb_getmaxconnect();
|
pollfd_list.allocated = rb_getmaxconnect();
|
||||||
for (fd = 0; fd < rb_getmaxconnect(); fd++)
|
for(fd = 0; fd < rb_getmaxconnect(); fd++)
|
||||||
{
|
{
|
||||||
pollfd_list.pollfds[fd].fd = -1;
|
pollfd_list.pollfds[fd].fd = -1;
|
||||||
}
|
}
|
||||||
|
@ -111,7 +111,7 @@ resize_pollarray(int fd)
|
||||||
rb_realloc(pollfd_list.pollfds,
|
rb_realloc(pollfd_list.pollfds,
|
||||||
pollfd_list.allocated * (sizeof(struct pollfd)));
|
pollfd_list.allocated * (sizeof(struct pollfd)));
|
||||||
memset(&pollfd_list.pollfds[old_value + 1], 0, sizeof(struct pollfd) * 1024);
|
memset(&pollfd_list.pollfds[old_value + 1], 0, sizeof(struct pollfd) * 1024);
|
||||||
for (x = old_value + 1; x < pollfd_list.allocated; x++)
|
for(x = old_value + 1; x < pollfd_list.allocated; x++)
|
||||||
{
|
{
|
||||||
pollfd_list.pollfds[x].fd = -1;
|
pollfd_list.pollfds[x].fd = -1;
|
||||||
}
|
}
|
||||||
|
@ -128,7 +128,7 @@ resize_pollarray(int fd)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_setup_fd_sigio(rb_fde_t * F)
|
rb_setup_fd_sigio(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
int fd = F->fd;
|
int fd = F->fd;
|
||||||
|
@ -162,7 +162,7 @@ rb_setup_fd_sigio(rb_fde_t * F)
|
||||||
* and deregister interest in a pending IO state for a given FD.
|
* and deregister interest in a pending IO state for a given FD.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
rb_setselect_sigio(rb_fde_t * F, unsigned int type, PF * handler, void *client_data)
|
rb_setselect_sigio(rb_fde_t *F, unsigned int type, PF * handler, void *client_data)
|
||||||
{
|
{
|
||||||
if(F == NULL)
|
if(F == NULL)
|
||||||
return;
|
return;
|
||||||
|
@ -194,8 +194,8 @@ rb_setselect_sigio(rb_fde_t * F, unsigned int type, PF * handler, void *client_d
|
||||||
pollfd_list.pollfds[F->fd].fd = -1;
|
pollfd_list.pollfds[F->fd].fd = -1;
|
||||||
if(F->fd == pollfd_list.maxindex)
|
if(F->fd == pollfd_list.maxindex)
|
||||||
{
|
{
|
||||||
while (pollfd_list.maxindex >= 0
|
while(pollfd_list.maxindex >= 0
|
||||||
&& pollfd_list.pollfds[pollfd_list.maxindex].fd == -1)
|
&& pollfd_list.pollfds[pollfd_list.maxindex].fd == -1)
|
||||||
pollfd_list.maxindex--;
|
pollfd_list.maxindex--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -244,7 +244,7 @@ rb_select_sigio(long delay)
|
||||||
timeout.tv_nsec = (delay % 1000) * 1000000;
|
timeout.tv_nsec = (delay % 1000) * 1000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
if(!sigio_is_screwed)
|
if(!sigio_is_screwed)
|
||||||
{
|
{
|
||||||
|
@ -268,7 +268,7 @@ rb_select_sigio(long delay)
|
||||||
#ifdef SIGIO_SCHED_EVENT
|
#ifdef SIGIO_SCHED_EVENT
|
||||||
if(sig == RTSIGTIM && can_do_event)
|
if(sig == RTSIGTIM && can_do_event)
|
||||||
{
|
{
|
||||||
struct ev_entry *ev = (struct ev_entry *) si.si_ptr;
|
struct ev_entry *ev = (struct ev_entry *)si.si_ptr;
|
||||||
if(ev == NULL)
|
if(ev == NULL)
|
||||||
continue;
|
continue;
|
||||||
rb_run_event(ev);
|
rb_run_event(ev);
|
||||||
|
@ -335,7 +335,7 @@ rb_select_sigio(long delay)
|
||||||
return RB_OK;
|
return RB_OK;
|
||||||
|
|
||||||
/* XXX we *could* optimise by falling out after doing num fds ... */
|
/* XXX we *could* optimise by falling out after doing num fds ... */
|
||||||
for (ci = 0; ci < pollfd_list.maxindex + 1; ci++)
|
for(ci = 0; ci < pollfd_list.maxindex + 1; ci++)
|
||||||
{
|
{
|
||||||
if(((revents = pollfd_list.pollfds[ci].revents) == 0)
|
if(((revents = pollfd_list.pollfds[ci].revents) == 0)
|
||||||
|| (pollfd_list.pollfds[ci].fd) == -1)
|
|| (pollfd_list.pollfds[ci].fd) == -1)
|
||||||
|
@ -458,7 +458,7 @@ rb_init_netio_sigio(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_setselect_sigio(rb_fde_t * F, unsigned int type, PF * handler, void *client_data)
|
rb_setselect_sigio(rb_fde_t *F, unsigned int type, PF * handler, void *client_data)
|
||||||
{
|
{
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
return;
|
return;
|
||||||
|
@ -472,7 +472,7 @@ rb_select_sigio(long delay)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_setup_fd_sigio(rb_fde_t * F)
|
rb_setup_fd_sigio(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* The original headers are below..
|
* The original headers are below..
|
||||||
* Note that this implementation does not process floating point numbers so
|
* Note that this implementation does not process floating point numbers so
|
||||||
* you will likely need to fall back to using sprintf yourself to do those...
|
* you will likely need to fall back to using sprintf yourself to do those...
|
||||||
* $Id: snprintf.c 25375 2008-05-16 15:19:51Z androsyn $
|
* $Id: snprintf.c 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -27,12 +27,13 @@
|
||||||
#include <libratbox_config.h>
|
#include <libratbox_config.h>
|
||||||
#include <ratbox_lib.h>
|
#include <ratbox_lib.h>
|
||||||
|
|
||||||
static int skip_atoi(const char **s)
|
static int
|
||||||
|
skip_atoi(const char **s)
|
||||||
{
|
{
|
||||||
int i=0;
|
int i = 0;
|
||||||
|
|
||||||
while (isdigit(**s))
|
while(isdigit(**s))
|
||||||
i = i*10 + *((*s)++) - '0';
|
i = i * 10 + *((*s)++) - '0';
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,50 +47,56 @@ static int skip_atoi(const char **s)
|
||||||
/* Formats correctly any integer in [0,99999].
|
/* Formats correctly any integer in [0,99999].
|
||||||
* Outputs from one to five digits depending on input.
|
* Outputs from one to five digits depending on input.
|
||||||
* On i386 gcc 4.1.2 -O2: ~250 bytes of code. */
|
* On i386 gcc 4.1.2 -O2: ~250 bytes of code. */
|
||||||
static char* put_dec_trunc(char *buf, unsigned q)
|
static char *
|
||||||
|
put_dec_trunc(char *buf, unsigned q)
|
||||||
{
|
{
|
||||||
unsigned d3, d2, d1, d0;
|
unsigned d3, d2, d1, d0;
|
||||||
d1 = (q>>4) & 0xf;
|
d1 = (q >> 4) & 0xf;
|
||||||
d2 = (q>>8) & 0xf;
|
d2 = (q >> 8) & 0xf;
|
||||||
d3 = (q>>12);
|
d3 = (q >> 12);
|
||||||
|
|
||||||
d0 = 6*(d3 + d2 + d1) + (q & 0xf);
|
d0 = 6 * (d3 + d2 + d1) + (q & 0xf);
|
||||||
q = (d0 * 0xcd) >> 11;
|
q = (d0 * 0xcd) >> 11;
|
||||||
d0 = d0 - 10*q;
|
d0 = d0 - 10 * q;
|
||||||
*buf++ = d0 + '0'; /* least significant digit */
|
*buf++ = d0 + '0'; /* least significant digit */
|
||||||
d1 = q + 9*d3 + 5*d2 + d1;
|
d1 = q + 9 * d3 + 5 * d2 + d1;
|
||||||
if (d1 != 0) {
|
if(d1 != 0)
|
||||||
|
{
|
||||||
q = (d1 * 0xcd) >> 11;
|
q = (d1 * 0xcd) >> 11;
|
||||||
d1 = d1 - 10*q;
|
d1 = d1 - 10 * q;
|
||||||
*buf++ = d1 + '0'; /* next digit */
|
*buf++ = d1 + '0'; /* next digit */
|
||||||
|
|
||||||
d2 = q + 2*d2;
|
d2 = q + 2 * d2;
|
||||||
if ((d2 != 0) || (d3 != 0)) {
|
if((d2 != 0) || (d3 != 0))
|
||||||
|
{
|
||||||
q = (d2 * 0xd) >> 7;
|
q = (d2 * 0xd) >> 7;
|
||||||
d2 = d2 - 10*q;
|
d2 = d2 - 10 * q;
|
||||||
*buf++ = d2 + '0'; /* next digit */
|
*buf++ = d2 + '0'; /* next digit */
|
||||||
|
|
||||||
d3 = q + 4*d3;
|
d3 = q + 4 * d3;
|
||||||
if (d3 != 0) {
|
if(d3 != 0)
|
||||||
|
{
|
||||||
q = (d3 * 0xcd) >> 11;
|
q = (d3 * 0xcd) >> 11;
|
||||||
d3 = d3 - 10*q;
|
d3 = d3 - 10 * q;
|
||||||
*buf++ = d3 + '0'; /* next digit */
|
*buf++ = d3 + '0'; /* next digit */
|
||||||
if (q != 0)
|
if(q != 0)
|
||||||
*buf++ = q + '0'; /* most sign. digit */
|
*buf++ = q + '0'; /* most sign. digit */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Same with if's removed. Always emits five digits */
|
/* Same with if's removed. Always emits five digits */
|
||||||
static char* put_dec_full(char *buf, unsigned q)
|
static char *
|
||||||
|
put_dec_full(char *buf, unsigned q)
|
||||||
{
|
{
|
||||||
/* BTW, if q is in [0,9999], 8-bit ints will be enough, */
|
/* BTW, if q is in [0,9999], 8-bit ints will be enough, */
|
||||||
/* but anyway, gcc produces better code with full-sized ints */
|
/* but anyway, gcc produces better code with full-sized ints */
|
||||||
unsigned d3, d2, d1, d0;
|
unsigned d3, d2, d1, d0;
|
||||||
d1 = (q>>4) & 0xf;
|
d1 = (q >> 4) & 0xf;
|
||||||
d2 = (q>>8) & 0xf;
|
d2 = (q >> 8) & 0xf;
|
||||||
d3 = (q>>12);
|
d3 = (q >> 12);
|
||||||
|
|
||||||
/* Possible ways to approx. divide by 10 */
|
/* Possible ways to approx. divide by 10 */
|
||||||
/* gcc -O2 replaces multiply with shifts and adds */
|
/* gcc -O2 replaces multiply with shifts and adds */
|
||||||
|
@ -99,34 +106,36 @@ static char* put_dec_full(char *buf, unsigned q)
|
||||||
// (x * 0x1a) >> 8: 11010 - same
|
// (x * 0x1a) >> 8: 11010 - same
|
||||||
// (x * 0x0d) >> 7: 1101 - same, shortest code (on i386)
|
// (x * 0x0d) >> 7: 1101 - same, shortest code (on i386)
|
||||||
|
|
||||||
d0 = 6*(d3 + d2 + d1) + (q & 0xf);
|
d0 = 6 * (d3 + d2 + d1) + (q & 0xf);
|
||||||
q = (d0 * 0xcd) >> 11;
|
q = (d0 * 0xcd) >> 11;
|
||||||
d0 = d0 - 10*q;
|
d0 = d0 - 10 * q;
|
||||||
*buf++ = d0 + '0';
|
*buf++ = d0 + '0';
|
||||||
d1 = q + 9*d3 + 5*d2 + d1;
|
d1 = q + 9 * d3 + 5 * d2 + d1;
|
||||||
q = (d1 * 0xcd) >> 11;
|
q = (d1 * 0xcd) >> 11;
|
||||||
d1 = d1 - 10*q;
|
d1 = d1 - 10 * q;
|
||||||
*buf++ = d1 + '0';
|
*buf++ = d1 + '0';
|
||||||
|
|
||||||
d2 = q + 2*d2;
|
d2 = q + 2 * d2;
|
||||||
q = (d2 * 0xd) >> 7;
|
q = (d2 * 0xd) >> 7;
|
||||||
d2 = d2 - 10*q;
|
d2 = d2 - 10 * q;
|
||||||
*buf++ = d2 + '0';
|
*buf++ = d2 + '0';
|
||||||
|
|
||||||
d3 = q + 4*d3;
|
d3 = q + 4 * d3;
|
||||||
q = (d3 * 0xcd) >> 11; /* - shorter code */
|
q = (d3 * 0xcd) >> 11; /* - shorter code */
|
||||||
/* q = (d3 * 0x67) >> 10; - would also work */
|
/* q = (d3 * 0x67) >> 10; - would also work */
|
||||||
d3 = d3 - 10*q;
|
d3 = d3 - 10 * q;
|
||||||
*buf++ = d3 + '0';
|
*buf++ = d3 + '0';
|
||||||
*buf++ = q + '0';
|
*buf++ = q + '0';
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char* put_dec(char *buf, unsigned long long int num)
|
static char *
|
||||||
|
put_dec(char *buf, unsigned long long int num)
|
||||||
{
|
{
|
||||||
while (1) {
|
while(1)
|
||||||
|
{
|
||||||
unsigned rem;
|
unsigned rem;
|
||||||
if (num < 100000)
|
if(num < 100000)
|
||||||
return put_dec_trunc(buf, num);
|
return put_dec_trunc(buf, num);
|
||||||
rem = num % 100000;
|
rem = num % 100000;
|
||||||
num = num / 100000;
|
num = num / 100000;
|
||||||
|
@ -142,115 +151,140 @@ static char* put_dec(char *buf, unsigned long long int num)
|
||||||
#define SPECIAL 32 /* 0x */
|
#define SPECIAL 32 /* 0x */
|
||||||
#define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */
|
#define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */
|
||||||
|
|
||||||
static char *number(char *buf, char *end, unsigned long long int num, int base, int size, int precision, int type)
|
static char *
|
||||||
|
number(char *buf, char *end, unsigned long long int num, int base, int size, int precision,
|
||||||
|
int type)
|
||||||
{
|
{
|
||||||
char sign,tmp[66];
|
char sign, tmp[66];
|
||||||
const char *digits;
|
const char *digits;
|
||||||
/* we are called with base 8, 10 or 16, only, thus don't need "g..." */
|
/* we are called with base 8, 10 or 16, only, thus don't need "g..." */
|
||||||
static const char small_digits[] = "0123456789abcdefx"; /* "ghijklmnopqrstuvwxyz"; */
|
static const char small_digits[] = "0123456789abcdefx"; /* "ghijklmnopqrstuvwxyz"; */
|
||||||
static const char large_digits[] = "0123456789ABCDEFX"; /* "GHIJKLMNOPQRSTUVWXYZ"; */
|
static const char large_digits[] = "0123456789ABCDEFX"; /* "GHIJKLMNOPQRSTUVWXYZ"; */
|
||||||
int need_pfx = ((type & SPECIAL) && base != 10);
|
int need_pfx = ((type & SPECIAL) && base != 10);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
digits = (type & LARGE) ? large_digits : small_digits;
|
digits = (type & LARGE) ? large_digits : small_digits;
|
||||||
if (type & LEFT)
|
if(type & LEFT)
|
||||||
type &= ~ZEROPAD;
|
type &= ~ZEROPAD;
|
||||||
if (base < 2 || base > 36)
|
if(base < 2 || base > 36)
|
||||||
return NULL;
|
return NULL;
|
||||||
sign = 0;
|
sign = 0;
|
||||||
if (type & SIGN) {
|
if(type & SIGN)
|
||||||
if ((signed long long int) num < 0) {
|
{
|
||||||
|
if((signed long long int)num < 0)
|
||||||
|
{
|
||||||
sign = '-';
|
sign = '-';
|
||||||
num = - (signed long long int) num;
|
num = -(signed long long int)num;
|
||||||
size--;
|
size--;
|
||||||
} else if (type & PLUS) {
|
}
|
||||||
|
else if(type & PLUS)
|
||||||
|
{
|
||||||
sign = '+';
|
sign = '+';
|
||||||
size--;
|
size--;
|
||||||
} else if (type & SPACE) {
|
}
|
||||||
|
else if(type & SPACE)
|
||||||
|
{
|
||||||
sign = ' ';
|
sign = ' ';
|
||||||
size--;
|
size--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (need_pfx) {
|
if(need_pfx)
|
||||||
|
{
|
||||||
size--;
|
size--;
|
||||||
if (base == 16)
|
if(base == 16)
|
||||||
size--;
|
size--;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* generate full string in tmp[], in reverse order */
|
/* generate full string in tmp[], in reverse order */
|
||||||
i = 0;
|
i = 0;
|
||||||
if (num == 0)
|
if(num == 0)
|
||||||
tmp[i++] = '0';
|
tmp[i++] = '0';
|
||||||
/* Generic code, for any base:
|
/* Generic code, for any base:
|
||||||
else do {
|
else do {
|
||||||
tmp[i++] = digits[do_div(num,base)];
|
tmp[i++] = digits[do_div(num,base)];
|
||||||
} while (num != 0);
|
} while (num != 0);
|
||||||
*/
|
*/
|
||||||
else if (base != 10) { /* 8 or 16 */
|
else if(base != 10)
|
||||||
|
{ /* 8 or 16 */
|
||||||
int mask = base - 1;
|
int mask = base - 1;
|
||||||
int shift = 3;
|
int shift = 3;
|
||||||
if (base == 16) shift = 4;
|
if(base == 16)
|
||||||
do {
|
shift = 4;
|
||||||
|
do
|
||||||
|
{
|
||||||
tmp[i++] = digits[((unsigned char)num) & mask];
|
tmp[i++] = digits[((unsigned char)num) & mask];
|
||||||
num >>= shift;
|
num >>= shift;
|
||||||
} while (num);
|
}
|
||||||
} else { /* base 10 */
|
while(num);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ /* base 10 */
|
||||||
i = put_dec(tmp, num) - tmp;
|
i = put_dec(tmp, num) - tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* printing 100 using %2d gives "100", not "00" */
|
/* printing 100 using %2d gives "100", not "00" */
|
||||||
if (i > precision)
|
if(i > precision)
|
||||||
precision = i;
|
precision = i;
|
||||||
/* leading space padding */
|
/* leading space padding */
|
||||||
size -= precision;
|
size -= precision;
|
||||||
if (!(type & (ZEROPAD+LEFT))) {
|
if(!(type & (ZEROPAD + LEFT)))
|
||||||
while(--size >= 0) {
|
{
|
||||||
if (buf < end)
|
while(--size >= 0)
|
||||||
|
{
|
||||||
|
if(buf < end)
|
||||||
*buf = ' ';
|
*buf = ' ';
|
||||||
++buf;
|
++buf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* sign */
|
/* sign */
|
||||||
if (sign) {
|
if(sign)
|
||||||
if (buf < end)
|
{
|
||||||
|
if(buf < end)
|
||||||
*buf = sign;
|
*buf = sign;
|
||||||
++buf;
|
++buf;
|
||||||
}
|
}
|
||||||
/* "0x" / "0" prefix */
|
/* "0x" / "0" prefix */
|
||||||
if (need_pfx) {
|
if(need_pfx)
|
||||||
if (buf < end)
|
{
|
||||||
|
if(buf < end)
|
||||||
*buf = '0';
|
*buf = '0';
|
||||||
++buf;
|
++buf;
|
||||||
if (base == 16) {
|
if(base == 16)
|
||||||
if (buf < end)
|
{
|
||||||
*buf = digits[16]; /* for arbitrary base: digits[33]; */
|
if(buf < end)
|
||||||
|
*buf = digits[16]; /* for arbitrary base: digits[33]; */
|
||||||
++buf;
|
++buf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* zero or space padding */
|
/* zero or space padding */
|
||||||
if (!(type & LEFT)) {
|
if(!(type & LEFT))
|
||||||
|
{
|
||||||
char c = (type & ZEROPAD) ? '0' : ' ';
|
char c = (type & ZEROPAD) ? '0' : ' ';
|
||||||
while (--size >= 0) {
|
while(--size >= 0)
|
||||||
if (buf < end)
|
{
|
||||||
|
if(buf < end)
|
||||||
*buf = c;
|
*buf = c;
|
||||||
++buf;
|
++buf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* hmm even more zero padding? */
|
/* hmm even more zero padding? */
|
||||||
while (i <= --precision) {
|
while(i <= --precision)
|
||||||
if (buf < end)
|
{
|
||||||
|
if(buf < end)
|
||||||
*buf = '0';
|
*buf = '0';
|
||||||
++buf;
|
++buf;
|
||||||
}
|
}
|
||||||
/* actual digits of result */
|
/* actual digits of result */
|
||||||
while (--i >= 0) {
|
while(--i >= 0)
|
||||||
if (buf < end)
|
{
|
||||||
|
if(buf < end)
|
||||||
*buf = tmp[i];
|
*buf = tmp[i];
|
||||||
++buf;
|
++buf;
|
||||||
}
|
}
|
||||||
/* trailing space padding */
|
/* trailing space padding */
|
||||||
while (--size >= 0) {
|
while(--size >= 0)
|
||||||
if (buf < end)
|
{
|
||||||
|
if(buf < end)
|
||||||
*buf = ' ';
|
*buf = ' ';
|
||||||
++buf;
|
++buf;
|
||||||
}
|
}
|
||||||
|
@ -275,7 +309,8 @@ static char *number(char *buf, char *end, unsigned long long int num, int base,
|
||||||
* Call this function if you are already dealing with a va_list.
|
* Call this function if you are already dealing with a va_list.
|
||||||
* You probably want snprintf() instead.
|
* You probably want snprintf() instead.
|
||||||
*/
|
*/
|
||||||
int rb_vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
|
int
|
||||||
|
rb_vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
unsigned long long int num;
|
unsigned long long int num;
|
||||||
|
@ -289,13 +324,14 @@ int rb_vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
|
||||||
int precision; /* min. # of digits for integers; max
|
int precision; /* min. # of digits for integers; max
|
||||||
number of chars for from string */
|
number of chars for from string */
|
||||||
int qualifier; /* 'h', 'l', or 'L' for integer fields */
|
int qualifier; /* 'h', 'l', or 'L' for integer fields */
|
||||||
/* 'z' support added 23/7/1999 S.H. */
|
/* 'z' support added 23/7/1999 S.H. */
|
||||||
/* 'z' changed to 'Z' --davidm 1/25/99 */
|
/* 'z' changed to 'Z' --davidm 1/25/99 */
|
||||||
/* 't' added for ptrdiff_t */
|
/* 't' added for ptrdiff_t */
|
||||||
|
|
||||||
/* Reject out-of-range values early. Large positive sizes are
|
/* Reject out-of-range values early. Large positive sizes are
|
||||||
used for unknown buffer sizes. */
|
used for unknown buffer sizes. */
|
||||||
if (rb_unlikely((int) size < 0)) {
|
if(rb_unlikely((int)size < 0))
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -303,14 +339,17 @@ int rb_vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
|
||||||
end = buf + size;
|
end = buf + size;
|
||||||
|
|
||||||
/* Make sure end is always >= buf */
|
/* Make sure end is always >= buf */
|
||||||
if (end < buf) {
|
if(end < buf)
|
||||||
|
{
|
||||||
end = ((void *)-1);
|
end = ((void *)-1);
|
||||||
size = end - buf;
|
size = end - buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; *fmt ; ++fmt) {
|
for(; *fmt; ++fmt)
|
||||||
if (*fmt != '%') {
|
{
|
||||||
if (str < end)
|
if(*fmt != '%')
|
||||||
|
{
|
||||||
|
if(str < end)
|
||||||
*str = *fmt;
|
*str = *fmt;
|
||||||
++str;
|
++str;
|
||||||
continue;
|
continue;
|
||||||
|
@ -318,25 +357,38 @@ int rb_vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
|
||||||
|
|
||||||
/* process flags */
|
/* process flags */
|
||||||
flags = 0;
|
flags = 0;
|
||||||
repeat:
|
repeat:
|
||||||
++fmt; /* this also skips first '%' */
|
++fmt; /* this also skips first '%' */
|
||||||
switch (*fmt) {
|
switch (*fmt)
|
||||||
case '-': flags |= LEFT; goto repeat;
|
{
|
||||||
case '+': flags |= PLUS; goto repeat;
|
case '-':
|
||||||
case ' ': flags |= SPACE; goto repeat;
|
flags |= LEFT;
|
||||||
case '#': flags |= SPECIAL; goto repeat;
|
goto repeat;
|
||||||
case '0': flags |= ZEROPAD; goto repeat;
|
case '+':
|
||||||
}
|
flags |= PLUS;
|
||||||
|
goto repeat;
|
||||||
|
case ' ':
|
||||||
|
flags |= SPACE;
|
||||||
|
goto repeat;
|
||||||
|
case '#':
|
||||||
|
flags |= SPECIAL;
|
||||||
|
goto repeat;
|
||||||
|
case '0':
|
||||||
|
flags |= ZEROPAD;
|
||||||
|
goto repeat;
|
||||||
|
}
|
||||||
|
|
||||||
/* get field width */
|
/* get field width */
|
||||||
field_width = -1;
|
field_width = -1;
|
||||||
if (isdigit(*fmt))
|
if(isdigit(*fmt))
|
||||||
field_width = skip_atoi(&fmt);
|
field_width = skip_atoi(&fmt);
|
||||||
else if (*fmt == '*') {
|
else if(*fmt == '*')
|
||||||
|
{
|
||||||
++fmt;
|
++fmt;
|
||||||
/* it's the next argument */
|
/* it's the next argument */
|
||||||
field_width = va_arg(args, int);
|
field_width = va_arg(args, int);
|
||||||
if (field_width < 0) {
|
if(field_width < 0)
|
||||||
|
{
|
||||||
field_width = -field_width;
|
field_width = -field_width;
|
||||||
flags |= LEFT;
|
flags |= LEFT;
|
||||||
}
|
}
|
||||||
|
@ -344,26 +396,30 @@ int rb_vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
|
||||||
|
|
||||||
/* get the precision */
|
/* get the precision */
|
||||||
precision = -1;
|
precision = -1;
|
||||||
if (*fmt == '.') {
|
if(*fmt == '.')
|
||||||
++fmt;
|
{
|
||||||
if (isdigit(*fmt))
|
++fmt;
|
||||||
|
if(isdigit(*fmt))
|
||||||
precision = skip_atoi(&fmt);
|
precision = skip_atoi(&fmt);
|
||||||
else if (*fmt == '*') {
|
else if(*fmt == '*')
|
||||||
|
{
|
||||||
++fmt;
|
++fmt;
|
||||||
/* it's the next argument */
|
/* it's the next argument */
|
||||||
precision = va_arg(args, int);
|
precision = va_arg(args, int);
|
||||||
}
|
}
|
||||||
if (precision < 0)
|
if(precision < 0)
|
||||||
precision = 0;
|
precision = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get the conversion qualifier */
|
/* get the conversion qualifier */
|
||||||
qualifier = -1;
|
qualifier = -1;
|
||||||
if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' ||
|
if(*fmt == 'h' || *fmt == 'l' || *fmt == 'L' ||
|
||||||
*fmt =='Z' || *fmt == 'z' || *fmt == 't') {
|
*fmt == 'Z' || *fmt == 'z' || *fmt == 't')
|
||||||
|
{
|
||||||
qualifier = *fmt;
|
qualifier = *fmt;
|
||||||
++fmt;
|
++fmt;
|
||||||
if (qualifier == 'l' && *fmt == 'l') {
|
if(qualifier == 'l' && *fmt == 'l')
|
||||||
|
{
|
||||||
qualifier = 'L';
|
qualifier = 'L';
|
||||||
++fmt;
|
++fmt;
|
||||||
}
|
}
|
||||||
|
@ -372,144 +428,172 @@ int rb_vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
|
||||||
/* default base */
|
/* default base */
|
||||||
base = 10;
|
base = 10;
|
||||||
|
|
||||||
switch (*fmt) {
|
switch (*fmt)
|
||||||
case 'c':
|
{
|
||||||
if (!(flags & LEFT)) {
|
case 'c':
|
||||||
while (--field_width > 0) {
|
if(!(flags & LEFT))
|
||||||
if (str < end)
|
{
|
||||||
*str = ' ';
|
while(--field_width > 0)
|
||||||
++str;
|
{
|
||||||
}
|
if(str < end)
|
||||||
}
|
|
||||||
c = (unsigned char) va_arg(args, int);
|
|
||||||
if (str < end)
|
|
||||||
*str = c;
|
|
||||||
++str;
|
|
||||||
while (--field_width > 0) {
|
|
||||||
if (str < end)
|
|
||||||
*str = ' ';
|
*str = ' ';
|
||||||
++str;
|
++str;
|
||||||
}
|
}
|
||||||
continue;
|
}
|
||||||
|
c = (unsigned char)va_arg(args, int);
|
||||||
|
if(str < end)
|
||||||
|
*str = c;
|
||||||
|
++str;
|
||||||
|
while(--field_width > 0)
|
||||||
|
{
|
||||||
|
if(str < end)
|
||||||
|
*str = ' ';
|
||||||
|
++str;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
|
||||||
case 's':
|
case 's':
|
||||||
s = va_arg(args, char *);
|
s = va_arg(args, char *);
|
||||||
if (s == NULL) {
|
if(s == NULL)
|
||||||
abort(); /* prefer blowing up vs corrupt data */
|
{
|
||||||
}
|
abort(); /* prefer blowing up vs corrupt data */
|
||||||
len = rb_strnlen(s, precision);
|
}
|
||||||
|
len = rb_strnlen(s, precision);
|
||||||
|
|
||||||
if (!(flags & LEFT)) {
|
if(!(flags & LEFT))
|
||||||
while (len < field_width--) {
|
{
|
||||||
if (str < end)
|
while(len < field_width--)
|
||||||
*str = ' ';
|
{
|
||||||
++str;
|
if(str < end)
|
||||||
}
|
|
||||||
}
|
|
||||||
for (i = 0; i < len; ++i) {
|
|
||||||
if (str < end)
|
|
||||||
*str = *s;
|
|
||||||
++str; ++s;
|
|
||||||
}
|
|
||||||
while (len < field_width--) {
|
|
||||||
if (str < end)
|
|
||||||
*str = ' ';
|
*str = ' ';
|
||||||
++str;
|
++str;
|
||||||
}
|
}
|
||||||
continue;
|
}
|
||||||
|
for(i = 0; i < len; ++i)
|
||||||
case 'p':
|
{
|
||||||
if (field_width == -1) {
|
if(str < end)
|
||||||
field_width = 2*sizeof(void *);
|
*str = *s;
|
||||||
flags |= ZEROPAD;
|
|
||||||
}
|
|
||||||
str = number(str, end,
|
|
||||||
(unsigned long) va_arg(args, void *),
|
|
||||||
16, field_width, precision, flags);
|
|
||||||
continue;
|
|
||||||
|
|
||||||
|
|
||||||
case 'n':
|
|
||||||
/* FIXME:
|
|
||||||
* What does C99 say about the overflow case here? */
|
|
||||||
if (qualifier == 'l') {
|
|
||||||
long * ip = va_arg(args, long *);
|
|
||||||
*ip = (str - buf);
|
|
||||||
} else if (qualifier == 'Z' || qualifier == 'z') {
|
|
||||||
size_t * ip = va_arg(args, size_t *);
|
|
||||||
*ip = (str - buf);
|
|
||||||
} else {
|
|
||||||
int * ip = va_arg(args, int *);
|
|
||||||
*ip = (str - buf);
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case '%':
|
|
||||||
if (str < end)
|
|
||||||
*str = '%';
|
|
||||||
++str;
|
++str;
|
||||||
continue;
|
++s;
|
||||||
|
}
|
||||||
/* integer number formats - set up the flags and "break" */
|
while(len < field_width--)
|
||||||
case 'o':
|
{
|
||||||
base = 8;
|
if(str < end)
|
||||||
break;
|
*str = ' ';
|
||||||
|
|
||||||
case 'X':
|
|
||||||
flags |= LARGE;
|
|
||||||
case 'x':
|
|
||||||
base = 16;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'd':
|
|
||||||
case 'i':
|
|
||||||
flags |= SIGN;
|
|
||||||
case 'u':
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if (str < end)
|
|
||||||
*str = '%';
|
|
||||||
++str;
|
++str;
|
||||||
if (*fmt) {
|
}
|
||||||
if (str < end)
|
continue;
|
||||||
*str = *fmt;
|
|
||||||
++str;
|
case 'p':
|
||||||
} else {
|
if(field_width == -1)
|
||||||
--fmt;
|
{
|
||||||
}
|
field_width = 2 * sizeof(void *);
|
||||||
continue;
|
flags |= ZEROPAD;
|
||||||
|
}
|
||||||
|
str = number(str, end,
|
||||||
|
(unsigned long)va_arg(args, void *),
|
||||||
|
16, field_width, precision, flags);
|
||||||
|
continue;
|
||||||
|
|
||||||
|
|
||||||
|
case 'n':
|
||||||
|
/* FIXME:
|
||||||
|
* What does C99 say about the overflow case here? */
|
||||||
|
if(qualifier == 'l')
|
||||||
|
{
|
||||||
|
long *ip = va_arg(args, long *);
|
||||||
|
*ip = (str - buf);
|
||||||
|
}
|
||||||
|
else if(qualifier == 'Z' || qualifier == 'z')
|
||||||
|
{
|
||||||
|
size_t *ip = va_arg(args, size_t *);
|
||||||
|
*ip = (str - buf);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int *ip = va_arg(args, int *);
|
||||||
|
*ip = (str - buf);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case '%':
|
||||||
|
if(str < end)
|
||||||
|
*str = '%';
|
||||||
|
++str;
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* integer number formats - set up the flags and "break" */
|
||||||
|
case 'o':
|
||||||
|
base = 8;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'X':
|
||||||
|
flags |= LARGE;
|
||||||
|
case 'x':
|
||||||
|
base = 16;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'd':
|
||||||
|
case 'i':
|
||||||
|
flags |= SIGN;
|
||||||
|
case 'u':
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if(str < end)
|
||||||
|
*str = '%';
|
||||||
|
++str;
|
||||||
|
if(*fmt)
|
||||||
|
{
|
||||||
|
if(str < end)
|
||||||
|
*str = *fmt;
|
||||||
|
++str;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
--fmt;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
if (qualifier == 'L')
|
if(qualifier == 'L')
|
||||||
num = va_arg(args, long long int);
|
num = va_arg(args, long long int);
|
||||||
else if (qualifier == 'l') {
|
else if(qualifier == 'l')
|
||||||
|
{
|
||||||
num = va_arg(args, unsigned long);
|
num = va_arg(args, unsigned long);
|
||||||
if (flags & SIGN)
|
if(flags & SIGN)
|
||||||
num = (signed long) num;
|
num = (signed long)num;
|
||||||
} else if (qualifier == 'Z' || qualifier == 'z') {
|
|
||||||
num = va_arg(args, size_t);
|
|
||||||
} else if (qualifier == 't') {
|
|
||||||
num = va_arg(args, ptrdiff_t);
|
|
||||||
} else if (qualifier == 'h') {
|
|
||||||
num = (unsigned short) va_arg(args, int);
|
|
||||||
if (flags & SIGN)
|
|
||||||
num = (signed short) num;
|
|
||||||
} else {
|
|
||||||
num = va_arg(args, unsigned int);
|
|
||||||
if (flags & SIGN)
|
|
||||||
num = (signed int) num;
|
|
||||||
}
|
}
|
||||||
str = number(str, end, num, base,
|
else if(qualifier == 'Z' || qualifier == 'z')
|
||||||
field_width, precision, flags);
|
{
|
||||||
|
num = va_arg(args, size_t);
|
||||||
|
}
|
||||||
|
else if(qualifier == 't')
|
||||||
|
{
|
||||||
|
num = va_arg(args, ptrdiff_t);
|
||||||
|
}
|
||||||
|
else if(qualifier == 'h')
|
||||||
|
{
|
||||||
|
num = (unsigned short)va_arg(args, int);
|
||||||
|
if(flags & SIGN)
|
||||||
|
num = (signed short)num;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
num = va_arg(args, unsigned int);
|
||||||
|
if(flags & SIGN)
|
||||||
|
num = (signed int)num;
|
||||||
|
}
|
||||||
|
str = number(str, end, num, base, field_width, precision, flags);
|
||||||
}
|
}
|
||||||
if (size > 0) {
|
if(size > 0)
|
||||||
if (str < end)
|
{
|
||||||
|
if(str < end)
|
||||||
*str = '\0';
|
*str = '\0';
|
||||||
else
|
else
|
||||||
end[-1] = '\0';
|
end[-1] = '\0';
|
||||||
}
|
}
|
||||||
/* the trailing null byte doesn't count towards the total */
|
/* the trailing null byte doesn't count towards the total */
|
||||||
return str-buf;
|
return str - buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -524,13 +608,14 @@ int rb_vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
|
||||||
* as per ISO C99. If the return is greater than or equal to
|
* as per ISO C99. If the return is greater than or equal to
|
||||||
* @size, the resulting string is truncated.
|
* @size, the resulting string is truncated.
|
||||||
*/
|
*/
|
||||||
int rb_snprintf(char * buf, size_t size, const char *fmt, ...)
|
int
|
||||||
|
rb_snprintf(char *buf, size_t size, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
i=rb_vsnprintf(buf,size,fmt,args);
|
i = rb_vsnprintf(buf, size, fmt, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
@ -548,7 +633,8 @@ int rb_snprintf(char * buf, size_t size, const char *fmt, ...)
|
||||||
* Call this function if you are already dealing with a va_list.
|
* Call this function if you are already dealing with a va_list.
|
||||||
* You probably want sprintf() instead.
|
* You probably want sprintf() instead.
|
||||||
*/
|
*/
|
||||||
int rb_vsprintf(char *buf, const char *fmt, va_list args)
|
int
|
||||||
|
rb_vsprintf(char *buf, const char *fmt, va_list args)
|
||||||
{
|
{
|
||||||
return rb_vsnprintf(buf, INT_MAX, fmt, args);
|
return rb_vsnprintf(buf, INT_MAX, fmt, args);
|
||||||
}
|
}
|
||||||
|
@ -563,13 +649,14 @@ int rb_vsprintf(char *buf, const char *fmt, va_list args)
|
||||||
* into @buf. Use snprintf() or scnprintf() in order to avoid
|
* into @buf. Use snprintf() or scnprintf() in order to avoid
|
||||||
* buffer overflows.
|
* buffer overflows.
|
||||||
*/
|
*/
|
||||||
int rb_sprintf(char * buf, const char *fmt, ...)
|
int
|
||||||
|
rb_sprintf(char *buf, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
i=rb_vsnprintf(buf, INT_MAX, fmt, args);
|
i = rb_vsnprintf(buf, INT_MAX, fmt, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
@ -578,12 +665,12 @@ int rb_sprintf(char * buf, const char *fmt, ...)
|
||||||
* rb_vsprintf_append()
|
* rb_vsprintf_append()
|
||||||
* appends sprintf formatted string to the end of the buffer
|
* appends sprintf formatted string to the end of the buffer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_vsprintf_append(char *str, const char *format, va_list ap)
|
rb_vsprintf_append(char *str, const char *format, va_list ap)
|
||||||
{
|
{
|
||||||
size_t x = strlen(str);
|
size_t x = strlen(str);
|
||||||
return(rb_vsprintf(str+x, format, ap) + x);
|
return (rb_vsprintf(str + x, format, ap) + x);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -593,12 +680,12 @@ rb_vsprintf_append(char *str, const char *format, va_list ap)
|
||||||
int
|
int
|
||||||
rb_sprintf_append(char *str, const char *format, ...)
|
rb_sprintf_append(char *str, const char *format, ...)
|
||||||
{
|
{
|
||||||
int x;
|
int x;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
x = rb_vsprintf_append(str, format, ap);
|
x = rb_vsprintf_append(str, format, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return(x);
|
return (x);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -610,8 +697,17 @@ rb_sprintf_append(char *str, const char *format, ...)
|
||||||
int
|
int
|
||||||
rb_vsnprintf_append(char *str, size_t len, const char *format, va_list ap)
|
rb_vsnprintf_append(char *str, size_t len, const char *format, va_list ap)
|
||||||
{
|
{
|
||||||
size_t x = strlen(str);
|
size_t x;
|
||||||
return(rb_vsnprintf(str+x, len - x, format, ap) + x);
|
if(len == 0)
|
||||||
|
return 0;
|
||||||
|
x = strlen(str);
|
||||||
|
|
||||||
|
if(len < x)
|
||||||
|
{
|
||||||
|
str[len - 1] = '\0';
|
||||||
|
return len - 1;
|
||||||
|
}
|
||||||
|
return (rb_vsnprintf(str + x, len - x, format, ap) + x);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -623,11 +719,10 @@ rb_vsnprintf_append(char *str, size_t len, const char *format, va_list ap)
|
||||||
int
|
int
|
||||||
rb_snprintf_append(char *str, size_t len, const char *format, ...)
|
rb_snprintf_append(char *str, size_t len, const char *format, ...)
|
||||||
{
|
{
|
||||||
int x;
|
int x;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
x = rb_vsnprintf_append(str, len, format, ap);
|
x = rb_vsnprintf_append(str, len, format, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return(x);
|
return (x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: tools.c 25040 2008-01-23 16:11:34Z androsyn $
|
* $Id: tools.c 26170 2008-10-26 20:59:07Z androsyn $
|
||||||
*
|
*
|
||||||
* Here is the original header:
|
* Here is the original header:
|
||||||
*
|
*
|
||||||
|
@ -62,7 +62,7 @@ rb_init_rb_dlink_nodes(size_t dh_size)
|
||||||
rb_dlink_node *
|
rb_dlink_node *
|
||||||
rb_make_rb_dlink_node(void)
|
rb_make_rb_dlink_node(void)
|
||||||
{
|
{
|
||||||
return(rb_bh_alloc(dnode_heap));
|
return (rb_bh_alloc(dnode_heap));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -73,7 +73,7 @@ rb_make_rb_dlink_node(void)
|
||||||
* side effects - free given rb_dlink_node
|
* side effects - free given rb_dlink_node
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
rb_free_rb_dlink_node(rb_dlink_node * ptr)
|
rb_free_rb_dlink_node(rb_dlink_node *ptr)
|
||||||
{
|
{
|
||||||
assert(ptr != NULL);
|
assert(ptr != NULL);
|
||||||
rb_bh_free(dnode_heap, ptr);
|
rb_bh_free(dnode_heap, ptr);
|
||||||
|
@ -97,7 +97,7 @@ rb_string_to_array(char *string, char **parv, int maxpara)
|
||||||
if(string == NULL || string[0] == '\0')
|
if(string == NULL || string[0] == '\0')
|
||||||
return x;
|
return x;
|
||||||
|
|
||||||
while (*xbuf == ' ') /* skip leading spaces */
|
while(*xbuf == ' ') /* skip leading spaces */
|
||||||
xbuf++;
|
xbuf++;
|
||||||
if(*xbuf == '\0') /* ignore all-space args */
|
if(*xbuf == '\0') /* ignore all-space args */
|
||||||
return x;
|
return x;
|
||||||
|
@ -123,12 +123,12 @@ rb_string_to_array(char *string, char **parv, int maxpara)
|
||||||
else
|
else
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
while (*xbuf == ' ')
|
while(*xbuf == ' ')
|
||||||
xbuf++;
|
xbuf++;
|
||||||
if(*xbuf == '\0')
|
if(*xbuf == '\0')
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
while (x < maxpara - 1);
|
while(x < maxpara - 1);
|
||||||
|
|
||||||
if(*p == ':')
|
if(*p == ':')
|
||||||
p++;
|
p++;
|
||||||
|
@ -139,20 +139,20 @@ rb_string_to_array(char *string, char **parv, int maxpara)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef HAVE_STRLCAT
|
#ifndef HAVE_STRLCAT
|
||||||
size_t
|
size_t
|
||||||
rb_strlcat(char *dest, const char *src, size_t count)
|
rb_strlcat(char *dest, const char *src, size_t count)
|
||||||
{
|
{
|
||||||
size_t dsize = strlen(dest);
|
size_t dsize = strlen(dest);
|
||||||
size_t len = strlen(src);
|
size_t len = strlen(src);
|
||||||
size_t res = dsize + len;
|
size_t res = dsize + len;
|
||||||
|
|
||||||
dest += dsize;
|
dest += dsize;
|
||||||
count -= dsize;
|
count -= dsize;
|
||||||
if (len >= count)
|
if(len >= count)
|
||||||
len = count-1;
|
len = count - 1;
|
||||||
memcpy(dest, src, len);
|
memcpy(dest, src, len);
|
||||||
dest[len] = 0;
|
dest[len] = 0;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
size_t
|
size_t
|
||||||
|
@ -161,19 +161,20 @@ rb_strlcat(char *dest, const char *src, size_t count)
|
||||||
return strlcat(dest, src, count);
|
return strlcat(dest, src, count);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef HAVE_STRLCPY
|
#ifndef HAVE_STRLCPY
|
||||||
size_t
|
size_t
|
||||||
rb_strlcpy(char *dest, const char *src, size_t size)
|
rb_strlcpy(char *dest, const char *src, size_t size)
|
||||||
{
|
{
|
||||||
size_t ret = strlen(src);
|
size_t ret = strlen(src);
|
||||||
|
|
||||||
if (size) {
|
if(size)
|
||||||
size_t len = (ret >= size) ? size-1 : ret;
|
{
|
||||||
memcpy(dest, src, len);
|
size_t len = (ret >= size) ? size - 1 : ret;
|
||||||
dest[len] = '\0';
|
memcpy(dest, src, len);
|
||||||
}
|
dest[len] = '\0';
|
||||||
return ret;
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
size_t
|
size_t
|
||||||
|
@ -185,14 +186,14 @@ rb_strlcpy(char *dest, const char *src, size_t size)
|
||||||
|
|
||||||
|
|
||||||
#ifndef HAVE_STRNLEN
|
#ifndef HAVE_STRNLEN
|
||||||
size_t
|
size_t
|
||||||
rb_strnlen(const char *s, size_t count)
|
rb_strnlen(const char *s, size_t count)
|
||||||
{
|
{
|
||||||
const char *sc;
|
const char *sc;
|
||||||
for (sc = s; count-- && *sc != '\0'; ++sc)
|
for(sc = s; count-- && *sc != '\0'; ++sc)
|
||||||
;;
|
;;
|
||||||
return sc - s;
|
return sc - s;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
size_t
|
size_t
|
||||||
rb_strnlen(const char *s, size_t count)
|
rb_strnlen(const char *s, size_t count)
|
||||||
|
@ -201,3 +202,42 @@ rb_strnlen(const char *s, size_t count)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* rb_basename
|
||||||
|
*
|
||||||
|
* input -
|
||||||
|
* output -
|
||||||
|
* side effects -
|
||||||
|
*/
|
||||||
|
char *
|
||||||
|
rb_basename(const char *path)
|
||||||
|
{
|
||||||
|
const char *s;
|
||||||
|
|
||||||
|
if(!(s = strrchr(path, '/')))
|
||||||
|
s = path;
|
||||||
|
else
|
||||||
|
s++;
|
||||||
|
return rb_strdup(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* rb_dirname
|
||||||
|
*/
|
||||||
|
|
||||||
|
char *
|
||||||
|
rb_dirname (const char *path)
|
||||||
|
{
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
s = strrchr(path, '/');
|
||||||
|
if(s == NULL)
|
||||||
|
{
|
||||||
|
return rb_strdup(".");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* remove extra slashes */
|
||||||
|
while(s > path && *s == '/')
|
||||||
|
--s;
|
||||||
|
|
||||||
|
return rb_strndup(path, ((uintptr_t)s - (uintptr_t)path) + 2);
|
||||||
|
}
|
||||||
|
|
|
@ -21,26 +21,44 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: unix.c 25038 2008-01-23 16:03:08Z androsyn $
|
* $Id: unix.c 26180 2008-11-11 00:00:12Z androsyn $
|
||||||
*/
|
*/
|
||||||
#include <libratbox_config.h>
|
#include <libratbox_config.h>
|
||||||
#include <ratbox_lib.h>
|
#include <ratbox_lib.h>
|
||||||
|
|
||||||
#ifndef WINDOWS
|
|
||||||
|
#ifndef _WIN32
|
||||||
|
|
||||||
|
#include <sys/wait.h>
|
||||||
|
|
||||||
|
|
||||||
#if defined(HAVE_SPAWN_H) && defined(HAVE_POSIX_SPAWN)
|
#if defined(HAVE_SPAWN_H) && defined(HAVE_POSIX_SPAWN)
|
||||||
#include <spawn.h>
|
#include <spawn.h>
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#include <crt_externs.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __APPLE__
|
||||||
extern char **environ;
|
extern char **environ;
|
||||||
|
#endif
|
||||||
pid_t
|
pid_t
|
||||||
rb_spawn_process(const char *path, const char **argv)
|
rb_spawn_process(const char *path, const char **argv)
|
||||||
{
|
{
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
const void *arghack = argv;
|
const void *arghack = argv;
|
||||||
|
char **myenviron;
|
||||||
posix_spawnattr_t spattr;
|
posix_spawnattr_t spattr;
|
||||||
posix_spawnattr_init(&spattr);
|
posix_spawnattr_init(&spattr);
|
||||||
#ifdef POSIX_SPAWN_USEVFORK
|
#ifdef POSIX_SPAWN_USEVFORK
|
||||||
posix_spawnattr_setflags(&spattr, POSIX_SPAWN_USEVFORK);
|
posix_spawnattr_setflags(&spattr, POSIX_SPAWN_USEVFORK);
|
||||||
#endif
|
#endif
|
||||||
if(posix_spawn(&pid, path, NULL, &spattr, arghack, environ))
|
#ifdef __APPLE__
|
||||||
|
myenviron = *_NSGetEnviron(); /* apple needs to go fuck themselves for this */
|
||||||
|
#else
|
||||||
|
myenviron = environ;
|
||||||
|
#endif
|
||||||
|
if(posix_spawn(&pid, path, NULL, &spattr, arghack, myenviron))
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -53,10 +71,10 @@ rb_spawn_process(const char *path, const char **argv)
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
if(!(pid = vfork()))
|
if(!(pid = vfork()))
|
||||||
{
|
{
|
||||||
execv(path, (const void *)argv); /* make gcc shut up */
|
execv(path, (const void *)argv); /* make gcc shut up */
|
||||||
_exit(1); /* if we're still here, we're screwed */
|
_exit(1); /* if we're still here, we're screwed */
|
||||||
}
|
}
|
||||||
return(pid);
|
return (pid);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -78,7 +96,7 @@ rb_gettimeofday(struct timeval *tv, void *tz)
|
||||||
int
|
int
|
||||||
rb_gettimeofday(struct timeval *tv, void *tz)
|
rb_gettimeofday(struct timeval *tv, void *tz)
|
||||||
{
|
{
|
||||||
return(gettimeofday(tv, tz));
|
return (gettimeofday(tv, tz));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -90,13 +108,44 @@ rb_sleep(unsigned int seconds, unsigned int useconds)
|
||||||
tv.tv_nsec = (useconds * 1000);
|
tv.tv_nsec = (useconds * 1000);
|
||||||
tv.tv_sec = seconds;
|
tv.tv_sec = seconds;
|
||||||
nanosleep(&tv, NULL);
|
nanosleep(&tv, NULL);
|
||||||
#else
|
#else
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
tv.tv_sec = seconds;
|
tv.tv_sec = seconds;
|
||||||
tv.tv_usec = useconds;
|
tv.tv_usec = useconds;
|
||||||
select(0, NULL, NULL, NULL, &tv);
|
select(0, NULL, NULL, NULL, &tv);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif /* !WINDOWS */
|
|
||||||
|
/* this is to keep some linkers from bitching about exporting a non-existant symbol..bleh */
|
||||||
|
char *
|
||||||
|
rb_strerror(int error)
|
||||||
|
{
|
||||||
|
return strerror(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
rb_kill(pid_t pid, int sig)
|
||||||
|
{
|
||||||
|
return kill(pid, sig);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
rb_setenv(const char *name, const char *value, int overwrite)
|
||||||
|
{
|
||||||
|
return setenv(name, value, overwrite);
|
||||||
|
}
|
||||||
|
|
||||||
|
pid_t
|
||||||
|
rb_waitpid(pid_t pid, int *status, int options)
|
||||||
|
{
|
||||||
|
return waitpid(pid, status, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
pid_t
|
||||||
|
rb_getpid(void)
|
||||||
|
{
|
||||||
|
return getpid();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* !WIN32 */
|
||||||
|
|
|
@ -23,14 +23,14 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: win32.c 25038 2008-01-23 16:03:08Z androsyn $
|
* $Id: win32.c 26092 2008-09-19 15:13:52Z androsyn $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <libratbox_config.h>
|
#include <libratbox_config.h>
|
||||||
#include <ratbox_lib.h>
|
#include <ratbox_lib.h>
|
||||||
#include <commio-int.h>
|
#include <commio-int.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
static HWND hwnd;
|
static HWND hwnd;
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ typedef union
|
||||||
#define EPOCH_BIAS Const64(116444736000000000)
|
#define EPOCH_BIAS Const64(116444736000000000)
|
||||||
|
|
||||||
pid_t
|
pid_t
|
||||||
getpid()
|
rb_getpid()
|
||||||
{
|
{
|
||||||
return GetCurrentProcessId();
|
return GetCurrentProcessId();
|
||||||
}
|
}
|
||||||
|
@ -69,10 +69,10 @@ rb_gettimeofday(struct timeval *tp, void *not_used)
|
||||||
GetSystemTimeAsFileTime(&ft.ft_val);
|
GetSystemTimeAsFileTime(&ft.ft_val);
|
||||||
|
|
||||||
/* seconds since epoch */
|
/* seconds since epoch */
|
||||||
tp->tv_sec = (long) ((ft.ft_i64 - EPOCH_BIAS) / Const64(10000000));
|
tp->tv_sec = (long)((ft.ft_i64 - EPOCH_BIAS) / Const64(10000000));
|
||||||
|
|
||||||
/* microseconds remaining */
|
/* microseconds remaining */
|
||||||
tp->tv_usec = (long) ((ft.ft_i64 / Const64(10)) % Const64(1000000));
|
tp->tv_usec = (long)((ft.ft_i64 / Const64(10)) % Const64(1000000));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -94,7 +94,7 @@ rb_spawn_process(const char *path, const char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
pid_t
|
pid_t
|
||||||
waitpid(int pid, int *status, int flags)
|
rb_waitpid(int pid, int *status, int flags)
|
||||||
{
|
{
|
||||||
DWORD timeout = (flags & WNOHANG) ? 0 : INFINITE;
|
DWORD timeout = (flags & WNOHANG) ? 0 : INFINITE;
|
||||||
HANDLE hProcess;
|
HANDLE hProcess;
|
||||||
|
@ -113,7 +113,7 @@ waitpid(int pid, int *status, int flags)
|
||||||
{
|
{
|
||||||
if(GetExitCodeProcess(hProcess, &waitcode))
|
if(GetExitCodeProcess(hProcess, &waitcode))
|
||||||
{
|
{
|
||||||
*status = (int) ((waitcode & 0xff) << 8);
|
*status = (int)((waitcode & 0xff) << 8);
|
||||||
CloseHandle(hProcess);
|
CloseHandle(hProcess);
|
||||||
return pid;
|
return pid;
|
||||||
}
|
}
|
||||||
|
@ -127,7 +127,7 @@ waitpid(int pid, int *status, int flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
setenv(const char *name, const char *value, int overwrite)
|
rb_setenv(const char *name, const char *value, int overwrite)
|
||||||
{
|
{
|
||||||
char *buf;
|
char *buf;
|
||||||
int len;
|
int len;
|
||||||
|
@ -152,7 +152,7 @@ setenv(const char *name, const char *value, int overwrite)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
kill(int pid, int sig)
|
rb_kill(int pid, int sig)
|
||||||
{
|
{
|
||||||
HANDLE hProcess;
|
HANDLE hProcess;
|
||||||
hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, pid);
|
hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, pid);
|
||||||
|
@ -180,15 +180,134 @@ kill(int pid, int sig)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
/*
|
||||||
rb_pass_fd_to_process(int fd, pid_t process, rb_fde_t *F)
|
* packet format is
|
||||||
|
uint32_t magic
|
||||||
|
uint8_t protocol count
|
||||||
|
WSAPROTOCOL_INFO * count
|
||||||
|
size_t datasize
|
||||||
|
data
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int
|
||||||
|
make_wsaprotocol_info(pid_t process, rb_fde_t *F, WSAPROTOCOL_INFO * inf)
|
||||||
{
|
{
|
||||||
WSAPROTOCOL_INFO info;
|
WSAPROTOCOL_INFO info;
|
||||||
WSADuplicateSocket((SOCKET)fd, process, &info);
|
if(!WSADuplicateSocket((SOCKET) rb_get_fd(F), process, &info))
|
||||||
rb_write(F, &info, sizeof(info));
|
{
|
||||||
|
memcpy(inf, &info, sizeof(WSAPROTOCOL_INFO));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static rb_fde_t *
|
||||||
|
make_fde_from_wsaprotocol_info(void *data)
|
||||||
|
{
|
||||||
|
WSAPROTOCOL_INFO *info = data;
|
||||||
|
SOCKET t;
|
||||||
|
t = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, info, 0, 0);
|
||||||
|
if(t == INVALID_SOCKET)
|
||||||
|
{
|
||||||
|
rb_get_errno();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return rb_open(t, RB_FD_SOCKET, "remote_socket");
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t fd_buf[16384];
|
||||||
|
#define MAGIC_CONTROL 0xFF0ACAFE
|
||||||
|
|
||||||
|
int
|
||||||
|
rb_send_fd_buf(rb_fde_t *xF, rb_fde_t **F, int count, void *data, size_t datasize, pid_t pid)
|
||||||
|
{
|
||||||
|
size_t bufsize =
|
||||||
|
sizeof(uint32_t) + sizeof(uint8_t) + (sizeof(WSAPROTOCOL_INFO) * (size_t)count) +
|
||||||
|
sizeof(size_t) + datasize;
|
||||||
|
int i;
|
||||||
|
uint32_t magic = MAGIC_CONTROL;
|
||||||
|
void *ptr;
|
||||||
|
if(count > 4)
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if(bufsize > sizeof(fd_buf))
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
memset(fd_buf, 0, sizeof(fd_buf));
|
||||||
|
|
||||||
|
ptr = fd_buf;
|
||||||
|
memcpy(ptr, &magic, sizeof(magic));
|
||||||
|
ptr = (void *)((uintptr_t)ptr + (uintptr_t)sizeof(magic));
|
||||||
|
*((uint8_t *)ptr) = count;
|
||||||
|
ptr = (void *)((uintptr_t)ptr + (uintptr_t)sizeof(uint8_t));
|
||||||
|
|
||||||
|
for(i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
make_wsaprotocol_info(pid, F[i], (WSAPROTOCOL_INFO *) ptr);
|
||||||
|
ptr = (void *)((uintptr_t)ptr + (uintptr_t)sizeof(WSAPROTOCOL_INFO));
|
||||||
|
}
|
||||||
|
memcpy(ptr, &datasize, sizeof(size_t));
|
||||||
|
ptr = (void *)((uintptr_t)ptr + (uintptr_t)sizeof(size_t));
|
||||||
|
memcpy(ptr, data, datasize);
|
||||||
|
return rb_write(xF, fd_buf, bufsize);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MYMIN
|
||||||
|
#undef MYMIN
|
||||||
|
#endif
|
||||||
|
#define MYMIN(a, b) ((a) < (b) ? (a) : (b))
|
||||||
|
|
||||||
|
int
|
||||||
|
rb_recv_fd_buf(rb_fde_t *F, void *data, size_t datasize, rb_fde_t **xF, int nfds)
|
||||||
|
{
|
||||||
|
size_t minsize = sizeof(uint32_t) + sizeof(uint8_t) + sizeof(size_t);
|
||||||
|
size_t datalen;
|
||||||
|
ssize_t retlen;
|
||||||
|
uint32_t magic;
|
||||||
|
uint8_t count;
|
||||||
|
unsigned int i;
|
||||||
|
void *ptr;
|
||||||
|
ssize_t ret;
|
||||||
|
memset(fd_buf, 0, sizeof(fd_buf)); /* some paranoia here... */
|
||||||
|
ret = rb_read(F, fd_buf, sizeof(fd_buf));
|
||||||
|
if(ret <= 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
if(ret < (ssize_t) minsize)
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ptr = fd_buf;
|
||||||
|
memcpy(&magic, ptr, sizeof(uint32_t));
|
||||||
|
if(magic != MAGIC_CONTROL)
|
||||||
|
{
|
||||||
|
errno = EAGAIN;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ptr = (void *)((uintptr_t)ptr + (uintptr_t)sizeof(uint32_t));
|
||||||
|
memcpy(&count, ptr, sizeof(uint8_t));
|
||||||
|
ptr = (void *)((uintptr_t)ptr + (uintptr_t)sizeof(uint8_t));
|
||||||
|
for(i = 0; i < count && i < (unsigned int)nfds; i++)
|
||||||
|
{
|
||||||
|
rb_fde_t *tF = make_fde_from_wsaprotocol_info(ptr);
|
||||||
|
if(tF == NULL)
|
||||||
|
return -1;
|
||||||
|
xF[i] = tF;
|
||||||
|
ptr = (void *)((uintptr_t)ptr + (uintptr_t)sizeof(WSAPROTOCOL_INFO));
|
||||||
|
}
|
||||||
|
memcpy(&datalen, ptr, sizeof(size_t));
|
||||||
|
ptr = (void *)((uintptr_t)ptr + (uintptr_t)sizeof(size_t));
|
||||||
|
retlen = MYMIN(datalen, datasize);
|
||||||
|
memcpy(data, ptr, datalen);
|
||||||
|
return retlen;
|
||||||
|
}
|
||||||
|
|
||||||
static LRESULT CALLBACK
|
static LRESULT CALLBACK
|
||||||
rb_process_events(HWND nhwnd, UINT umsg, WPARAM wparam, LPARAM lparam)
|
rb_process_events(HWND nhwnd, UINT umsg, WPARAM wparam, LPARAM lparam)
|
||||||
|
@ -280,14 +399,12 @@ rb_init_netio_win32(void)
|
||||||
void
|
void
|
||||||
rb_sleep(unsigned int seconds, unsigned int useconds)
|
rb_sleep(unsigned int seconds, unsigned int useconds)
|
||||||
{
|
{
|
||||||
struct timeval tv;
|
DWORD msec = seconds * 1000;;
|
||||||
tv.tv_sec = seconds;
|
Sleep(msec);
|
||||||
tv.tv_usec = useconds;
|
|
||||||
select(0, NULL, NULL, NULL, &tv);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_setup_fd_win32(rb_fde_t * F)
|
rb_setup_fd_win32(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
if(F == NULL)
|
if(F == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -312,7 +429,7 @@ rb_setup_fd_win32(rb_fde_t * F)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_setselect_win32(rb_fde_t * F, unsigned int type, PF * handler, void *client_data)
|
rb_setselect_win32(rb_fde_t *F, unsigned int type, PF * handler, void *client_data)
|
||||||
{
|
{
|
||||||
int old_flags = F->pflags;
|
int old_flags = F->pflags;
|
||||||
|
|
||||||
|
@ -379,8 +496,8 @@ rb_select_win32(long delay)
|
||||||
#undef strerror
|
#undef strerror
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const char *
|
static const char *
|
||||||
wsock_strerror(int error)
|
_rb_strerror(int error)
|
||||||
{
|
{
|
||||||
switch (error)
|
switch (error)
|
||||||
{
|
{
|
||||||
|
@ -488,6 +605,14 @@ wsock_strerror(int error)
|
||||||
return strerror(error);
|
return strerror(error);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
char *
|
||||||
|
rb_strerror(int error)
|
||||||
|
{
|
||||||
|
static char buf[128];
|
||||||
|
rb_strlcpy(buf, _rb_strerror(error), sizeof(buf));
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
#else /* win32 not supported */
|
#else /* win32 not supported */
|
||||||
int
|
int
|
||||||
rb_init_netio_win32(void)
|
rb_init_netio_win32(void)
|
||||||
|
@ -497,7 +622,7 @@ rb_init_netio_win32(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_setselect_win32(rb_fde_t * F, unsigned int type, PF * handler, void *client_data)
|
rb_setselect_win32(rb_fde_t *F, unsigned int type, PF * handler, void *client_data)
|
||||||
{
|
{
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
return;
|
return;
|
||||||
|
@ -511,9 +636,9 @@ rb_select_win32(long delay)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_setup_fd_win32(rb_fde_t * F)
|
rb_setup_fd_win32(rb_fde_t *F)
|
||||||
{
|
{
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#endif /* WIN32 */
|
#endif /* _WIN32 */
|
||||||
|
|
314
src/sslproc.c
314
src/sslproc.c
|
@ -18,11 +18,13 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: sslproc.c 25677 2008-07-06 04:21:42Z androsyn $
|
* $Id$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <ratbox_lib.h>
|
#include <ratbox_lib.h>
|
||||||
#include "stdinc.h"
|
#include "stdinc.h"
|
||||||
|
|
||||||
|
|
||||||
#include "s_conf.h"
|
#include "s_conf.h"
|
||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
#include "listener.h"
|
#include "listener.h"
|
||||||
|
@ -37,10 +39,10 @@
|
||||||
#define ZIPSTATS_TIME 60
|
#define ZIPSTATS_TIME 60
|
||||||
|
|
||||||
static void collect_zipstats(void *unused);
|
static void collect_zipstats(void *unused);
|
||||||
static void ssl_read_ctl(rb_fde_t *F, void *data);
|
static void ssl_read_ctl(rb_fde_t * F, void *data);
|
||||||
static int ssld_count;
|
static int ssld_count;
|
||||||
|
|
||||||
static char tmpbuf[READBUF_SIZE];
|
static char tmpbuf[READBUF_SIZE];
|
||||||
static char nul = '\0';
|
static char nul = '\0';
|
||||||
|
|
||||||
#define MAXPASSFD 4
|
#define MAXPASSFD 4
|
||||||
|
@ -67,34 +69,39 @@ struct _ssl_ctl
|
||||||
uint8_t dead;
|
uint8_t dead;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void send_new_ssl_certs_one(ssl_ctl_t *ctl, const char *ssl_cert, const char *ssl_private_key, const char *ssl_dh_params);
|
static void send_new_ssl_certs_one(ssl_ctl_t * ctl, const char *ssl_cert,
|
||||||
static void send_init_prng(ssl_ctl_t *ctl, prng_seed_t seedtype, const char *path);
|
const char *ssl_private_key, const char *ssl_dh_params);
|
||||||
|
static void send_init_prng(ssl_ctl_t * ctl, prng_seed_t seedtype, const char *path);
|
||||||
|
|
||||||
|
|
||||||
static rb_dlink_list ssl_daemons;
|
static rb_dlink_list ssl_daemons;
|
||||||
|
|
||||||
static inline int32_t buf_to_int32(char *buf)
|
static inline int32_t
|
||||||
|
buf_to_int32(char *buf)
|
||||||
{
|
{
|
||||||
int32_t x;
|
int32_t x;
|
||||||
memcpy(&x, buf, sizeof(x));
|
memcpy(&x, buf, sizeof(x));
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void int32_to_buf(char *buf, int32_t x)
|
static inline void
|
||||||
|
int32_to_buf(char *buf, int32_t x)
|
||||||
{
|
{
|
||||||
memcpy(buf, &x, sizeof(x));
|
memcpy(buf, &x, sizeof(x));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline uint16_t buf_to_uint16(char *buf)
|
static inline uint16_t
|
||||||
|
buf_to_uint16(char *buf)
|
||||||
{
|
{
|
||||||
uint16_t x;
|
uint16_t x;
|
||||||
memcpy(&x, buf, sizeof(x));
|
memcpy(&x, buf, sizeof(x));
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void uint16_to_buf(char *buf, uint16_t x)
|
static inline void
|
||||||
|
uint16_to_buf(char *buf, uint16_t x)
|
||||||
{
|
{
|
||||||
memcpy(buf, &x, sizeof(x));
|
memcpy(buf, &x, sizeof(x));
|
||||||
return;
|
return;
|
||||||
|
@ -102,13 +109,13 @@ static inline void uint16_to_buf(char *buf, uint16_t x)
|
||||||
|
|
||||||
|
|
||||||
static ssl_ctl_t *
|
static ssl_ctl_t *
|
||||||
allocate_ssl_daemon(rb_fde_t *F, rb_fde_t *P, int pid)
|
allocate_ssl_daemon(rb_fde_t * F, rb_fde_t * P, int pid)
|
||||||
{
|
{
|
||||||
ssl_ctl_t *ctl;
|
ssl_ctl_t *ctl;
|
||||||
|
|
||||||
if(F == NULL || pid < 0)
|
if(F == NULL || pid < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
ctl = rb_malloc(sizeof(ssl_ctl_t));
|
ctl = rb_malloc(sizeof(ssl_ctl_t));
|
||||||
ctl->F = F;
|
ctl->F = F;
|
||||||
ctl->P = P;
|
ctl->P = P;
|
||||||
ctl->pid = pid;
|
ctl->pid = pid;
|
||||||
|
@ -118,22 +125,22 @@ allocate_ssl_daemon(rb_fde_t *F, rb_fde_t *P, int pid)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
free_ssl_daemon(ssl_ctl_t *ctl)
|
free_ssl_daemon(ssl_ctl_t * ctl)
|
||||||
{
|
{
|
||||||
rb_dlink_node *ptr;
|
rb_dlink_node *ptr;
|
||||||
ssl_ctl_buf_t *ctl_buf;
|
ssl_ctl_buf_t *ctl_buf;
|
||||||
int x;
|
int x;
|
||||||
if(ctl->cli_count)
|
if(ctl->cli_count)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
RB_DLINK_FOREACH(ptr, ctl->readq.head)
|
RB_DLINK_FOREACH(ptr, ctl->readq.head)
|
||||||
{
|
{
|
||||||
ctl_buf = ptr->data;
|
ctl_buf = ptr->data;
|
||||||
for(x = 0; x < ctl_buf->nfds; x++)
|
for(x = 0; x < ctl_buf->nfds; x++)
|
||||||
rb_close(ctl_buf->F[x]);
|
rb_close(ctl_buf->F[x]);
|
||||||
|
|
||||||
rb_free(ctl_buf->buf);
|
rb_free(ctl_buf->buf);
|
||||||
rb_free(ctl_buf);
|
rb_free(ctl_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
RB_DLINK_FOREACH(ptr, ctl->writeq.head)
|
RB_DLINK_FOREACH(ptr, ctl->writeq.head)
|
||||||
|
@ -170,26 +177,26 @@ ssl_killall(void)
|
||||||
continue;
|
continue;
|
||||||
ctl->dead = 1;
|
ctl->dead = 1;
|
||||||
ssld_count--;
|
ssld_count--;
|
||||||
kill(ctl->pid, SIGKILL);
|
rb_kill(ctl->pid, SIGKILL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ssl_dead(ssl_ctl_t *ctl)
|
ssl_dead(ssl_ctl_t * ctl)
|
||||||
{
|
{
|
||||||
if(ctl->dead)
|
if(ctl->dead)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ctl->dead = 1;
|
ctl->dead = 1;
|
||||||
ssld_count--;
|
ssld_count--;
|
||||||
kill(ctl->pid, SIGKILL); /* make sure the process is really gone */
|
rb_kill(ctl->pid, SIGKILL); /* make sure the process is really gone */
|
||||||
ilog(L_MAIN, "ssld helper died - attempting to restart");
|
ilog(L_MAIN, "ssld helper died - attempting to restart");
|
||||||
sendto_realops_snomask(SNO_GENERAL, L_ALL, "ssld helper died - attempting to restart");
|
sendto_realops_snomask(SNO_GENERAL, L_ALL, "ssld helper died - attempting to restart");
|
||||||
start_ssldaemon(1, ServerInfo.ssl_cert, ServerInfo.ssl_private_key, ServerInfo.ssl_dh_params);
|
start_ssldaemon(1, ServerInfo.ssl_cert, ServerInfo.ssl_private_key, ServerInfo.ssl_dh_params);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ssl_do_pipe(rb_fde_t *F, void *data)
|
ssl_do_pipe(rb_fde_t * F, void *data)
|
||||||
{
|
{
|
||||||
int retlen;
|
int retlen;
|
||||||
ssl_ctl_t *ctl = data;
|
ssl_ctl_t *ctl = data;
|
||||||
|
@ -222,10 +229,17 @@ start_ssldaemon(int count, const char *ssl_cert, const char *ssl_private_key, co
|
||||||
{
|
{
|
||||||
rb_fde_t *F1, *F2;
|
rb_fde_t *F1, *F2;
|
||||||
rb_fde_t *P1, *P2;
|
rb_fde_t *P1, *P2;
|
||||||
|
#ifdef _WIN32
|
||||||
|
const char *suffix = ".exe";
|
||||||
|
#else
|
||||||
|
const char *suffix = "";
|
||||||
|
#endif
|
||||||
|
|
||||||
char fullpath[PATH_MAX + 1];
|
char fullpath[PATH_MAX + 1];
|
||||||
char fdarg[6];
|
char fdarg[6];
|
||||||
const char *parv[2];
|
const char *parv[2];
|
||||||
char buf[128];
|
char buf[128];
|
||||||
|
char s_pid[10];
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int started = 0, i;
|
int started = 0, i;
|
||||||
|
|
||||||
|
@ -235,7 +249,8 @@ start_ssldaemon(int count, const char *ssl_cert, const char *ssl_private_key, co
|
||||||
if(ssld_spin_count > 20 && (rb_current_time() - last_spin < 5))
|
if(ssld_spin_count > 20 && (rb_current_time() - last_spin < 5))
|
||||||
{
|
{
|
||||||
ilog(L_MAIN, "ssld helper is spinning - will attempt to restart in 1 minute");
|
ilog(L_MAIN, "ssld helper is spinning - will attempt to restart in 1 minute");
|
||||||
sendto_realops_snomask(SNO_GENERAL, L_ALL, "ssld helper is spinning - will attempt to restart in 1 minute");
|
sendto_realops_snomask(SNO_GENERAL, L_ALL,
|
||||||
|
"ssld helper is spinning - will attempt to restart in 1 minute");
|
||||||
rb_event_add("restart_ssld_event", restart_ssld_event, NULL, 60);
|
rb_event_add("restart_ssld_event", restart_ssld_event, NULL, 60);
|
||||||
ssld_wait = 1;
|
ssld_wait = 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -243,22 +258,25 @@ start_ssldaemon(int count, const char *ssl_cert, const char *ssl_private_key, co
|
||||||
|
|
||||||
ssld_spin_count++;
|
ssld_spin_count++;
|
||||||
last_spin = rb_current_time();
|
last_spin = rb_current_time();
|
||||||
|
|
||||||
if(ssld_path == NULL)
|
if(ssld_path == NULL)
|
||||||
{
|
{
|
||||||
rb_snprintf(fullpath, sizeof(fullpath), "%s/ssld", BINPATH);
|
rb_snprintf(fullpath, sizeof(fullpath), "%s/ssld%s", BINPATH, suffix);
|
||||||
|
|
||||||
if(access(fullpath, X_OK) == -1)
|
if(access(fullpath, X_OK) == -1)
|
||||||
{
|
{
|
||||||
rb_snprintf(fullpath, sizeof(fullpath), "%s/bin/ssld", ConfigFileEntry.dpath);
|
rb_snprintf(fullpath, sizeof(fullpath), "%s/bin/ssld%s",
|
||||||
|
ConfigFileEntry.dpath, suffix);
|
||||||
if(access(fullpath, X_OK) == -1)
|
if(access(fullpath, X_OK) == -1)
|
||||||
{
|
{
|
||||||
ilog(L_MAIN, "Unable to execute ssld in %s/bin or %s", ConfigFileEntry.dpath, BINPATH);
|
ilog(L_MAIN,
|
||||||
return 0 ;
|
"Unable to execute ssld%s in %s/bin or %s",
|
||||||
|
ConfigFileEntry.dpath, suffix, BINPATH);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ssld_path = rb_strdup(fullpath);
|
ssld_path = rb_strdup(fullpath);
|
||||||
}
|
}
|
||||||
|
|
||||||
rb_strlcpy(buf, "-ircd ssld daemon helper", sizeof(buf));
|
rb_strlcpy(buf, "-ircd ssld daemon helper", sizeof(buf));
|
||||||
parv[0] = buf;
|
parv[0] = buf;
|
||||||
parv[1] = NULL;
|
parv[1] = NULL;
|
||||||
|
@ -270,12 +288,18 @@ start_ssldaemon(int count, const char *ssl_cert, const char *ssl_private_key, co
|
||||||
rb_set_buffers(F1, READBUF_SIZE);
|
rb_set_buffers(F1, READBUF_SIZE);
|
||||||
rb_set_buffers(F2, READBUF_SIZE);
|
rb_set_buffers(F2, READBUF_SIZE);
|
||||||
rb_snprintf(fdarg, sizeof(fdarg), "%d", rb_get_fd(F2));
|
rb_snprintf(fdarg, sizeof(fdarg), "%d", rb_get_fd(F2));
|
||||||
setenv("CTL_FD", fdarg, 1);
|
rb_setenv("CTL_FD", fdarg, 1);
|
||||||
rb_pipe(&P1, &P2, "SSL/TLS pipe");
|
rb_pipe(&P1, &P2, "SSL/TLS pipe");
|
||||||
rb_snprintf(fdarg, sizeof(fdarg), "%d", rb_get_fd(P1));
|
rb_snprintf(fdarg, sizeof(fdarg), "%d", rb_get_fd(P1));
|
||||||
setenv("CTL_PIPE", fdarg, 1);
|
rb_setenv("CTL_PIPE", fdarg, 1);
|
||||||
|
rb_snprintf(s_pid, sizeof(s_pid), "%d", getpid());
|
||||||
pid = rb_spawn_process(ssld_path, (const char **)parv);
|
rb_setenv("CTL_PPID", s_pid, 1);
|
||||||
|
#ifdef _WIN32
|
||||||
|
SetHandleInformation((HANDLE) rb_get_fd(F2), HANDLE_FLAG_INHERIT, 1);
|
||||||
|
SetHandleInformation((HANDLE) rb_get_fd(P1), HANDLE_FLAG_INHERIT, 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pid = rb_spawn_process(ssld_path, (const char **) parv);
|
||||||
if(pid == -1)
|
if(pid == -1)
|
||||||
{
|
{
|
||||||
ilog(L_MAIN, "Unable to create ssld: %s\n", strerror(errno));
|
ilog(L_MAIN, "Unable to create ssld: %s\n", strerror(errno));
|
||||||
|
@ -297,55 +321,57 @@ start_ssldaemon(int count, const char *ssl_cert, const char *ssl_private_key, co
|
||||||
send_init_prng(ctl, RB_PRNG_DEFAULT, NULL);
|
send_init_prng(ctl, RB_PRNG_DEFAULT, NULL);
|
||||||
}
|
}
|
||||||
if(ssl_ok && ssl_cert != NULL && ssl_private_key != NULL)
|
if(ssl_ok && ssl_cert != NULL && ssl_private_key != NULL)
|
||||||
send_new_ssl_certs_one(ctl, ssl_cert, ssl_private_key, ssl_dh_params != NULL ? ssl_dh_params : "");
|
send_new_ssl_certs_one(ctl, ssl_cert, ssl_private_key,
|
||||||
|
ssl_dh_params != NULL ? ssl_dh_params : "");
|
||||||
ssl_read_ctl(ctl->F, ctl);
|
ssl_read_ctl(ctl->F, ctl);
|
||||||
ssl_do_pipe(P2, ctl);
|
ssl_do_pipe(P2, ctl);
|
||||||
|
|
||||||
}
|
}
|
||||||
return started;
|
return started;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ssl_process_zipstats(ssl_ctl_t *ctl, ssl_ctl_buf_t *ctl_buf)
|
ssl_process_zipstats(ssl_ctl_t * ctl, ssl_ctl_buf_t * ctl_buf)
|
||||||
{
|
{
|
||||||
struct Client *server;
|
struct Client *server;
|
||||||
struct ZipStats *zips;
|
struct ZipStats *zips;
|
||||||
int parc;
|
int parc;
|
||||||
char *parv[6];
|
char *parv[6];
|
||||||
parc = rb_string_to_array(ctl_buf->buf, parv, 6);
|
parc = rb_string_to_array(ctl_buf->buf, parv, 6);
|
||||||
server = find_server(NULL, parv[1]);
|
server = find_server(NULL, parv[1]);
|
||||||
if(server == NULL || server->localClient == NULL || !IsCapable(server, CAP_ZIP))
|
if(server == NULL || server->localClient == NULL || !IsCapable(server, CAP_ZIP))
|
||||||
return;
|
return;
|
||||||
if(server->localClient->zipstats == NULL)
|
if(server->localClient->zipstats == NULL)
|
||||||
server->localClient->zipstats = rb_malloc(sizeof(struct ZipStats));
|
server->localClient->zipstats = rb_malloc(sizeof(struct ZipStats));
|
||||||
|
|
||||||
zips = server->localClient->zipstats;
|
zips = server->localClient->zipstats;
|
||||||
|
|
||||||
zips->in += strtoull(parv[2], NULL, 10);
|
zips->in += strtoull(parv[2], NULL, 10);
|
||||||
zips->in_wire += strtoull(parv[3], NULL, 10);
|
zips->in_wire += strtoull(parv[3], NULL, 10);
|
||||||
zips->out += strtoull(parv[4], NULL, 10);
|
zips->out += strtoull(parv[4], NULL, 10);
|
||||||
zips->out_wire += strtoull(parv[5], NULL, 10);
|
zips->out_wire += strtoull(parv[5], NULL, 10);
|
||||||
|
|
||||||
if(zips->in > 0)
|
if(zips->in > 0)
|
||||||
zips->in_ratio = ((double)(zips->in - zips->in_wire) / (double) zips->in) * 100.00;
|
zips->in_ratio = ((double) (zips->in - zips->in_wire) / (double) zips->in) * 100.00;
|
||||||
else
|
else
|
||||||
zips->in_ratio = 0;
|
zips->in_ratio = 0;
|
||||||
|
|
||||||
if(zips->out > 0)
|
if(zips->out > 0)
|
||||||
zips->out_ratio = ((double)(zips->out - zips->out_wire) / (double) zips->out) * 100.00;
|
zips->out_ratio = ((double) (zips->out - zips->out_wire) / (double) zips->out) * 100.00;
|
||||||
else
|
else
|
||||||
zips->out_ratio = 0;
|
zips->out_ratio = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ssl_process_dead_fd(ssl_ctl_t *ctl, ssl_ctl_buf_t *ctl_buf)
|
ssl_process_dead_fd(ssl_ctl_t * ctl, ssl_ctl_buf_t * ctl_buf)
|
||||||
{
|
{
|
||||||
struct Client *client_p;
|
struct Client *client_p;
|
||||||
char reason[256];
|
char reason[256];
|
||||||
int32_t fd;
|
int32_t fd;
|
||||||
|
|
||||||
if(ctl_buf->buflen < 6)
|
if(ctl_buf->buflen < 6)
|
||||||
return; /* bogus message..drop it.. XXX should warn here */
|
return; /* bogus message..drop it.. XXX should warn here */
|
||||||
|
|
||||||
fd = buf_to_int32(&ctl_buf->buf[1]);
|
fd = buf_to_int32(&ctl_buf->buf[1]);
|
||||||
rb_strlcpy(reason, &ctl_buf->buf[5], sizeof(reason));
|
rb_strlcpy(reason, &ctl_buf->buf[5], sizeof(reason));
|
||||||
client_p = find_cli_fd_hash(fd);
|
client_p = find_cli_fd_hash(fd);
|
||||||
|
@ -353,7 +379,7 @@ ssl_process_dead_fd(ssl_ctl_t *ctl, ssl_ctl_buf_t *ctl_buf)
|
||||||
return;
|
return;
|
||||||
if(IsAnyServer(client_p))
|
if(IsAnyServer(client_p))
|
||||||
{
|
{
|
||||||
sendto_realops_snomask(SNO_GENERAL, is_remote_connect(client_p) && !IsServer(client_p) ? L_NETWIDE : L_ALL, "ssld error for %s: %s", client_p->name, reason);
|
sendto_realops_snomask(SNO_GENERAL, L_ALL, "ssld error for %s: %s", client_p->name, reason);
|
||||||
ilog(L_SERVER, "ssld error for %s: %s", log_client_name(client_p, SHOW_IP), reason);
|
ilog(L_SERVER, "ssld error for %s: %s", log_client_name(client_p, SHOW_IP), reason);
|
||||||
}
|
}
|
||||||
exit_client(client_p, client_p, &me, reason);
|
exit_client(client_p, client_p, &me, reason);
|
||||||
|
@ -361,14 +387,14 @@ ssl_process_dead_fd(ssl_ctl_t *ctl, ssl_ctl_buf_t *ctl_buf)
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ssl_process_zip_ready(ssl_ctl_t *ctl, ssl_ctl_buf_t *ctl_buf)
|
ssl_process_zip_ready(ssl_ctl_t * ctl, ssl_ctl_buf_t * ctl_buf)
|
||||||
{
|
{
|
||||||
struct Client *client_p;
|
struct Client *client_p;
|
||||||
int32_t fd;
|
int32_t fd;
|
||||||
|
|
||||||
if(ctl_buf->buflen < 5)
|
if(ctl_buf->buflen < 5)
|
||||||
return; /* bogus message..drop it.. XXX should warn here */
|
return; /* bogus message..drop it.. XXX should warn here */
|
||||||
|
|
||||||
fd = buf_to_int32(&ctl_buf->buf[1]);
|
fd = buf_to_int32(&ctl_buf->buf[1]);
|
||||||
client_p = find_cli_fd_hash(fd);
|
client_p = find_cli_fd_hash(fd);
|
||||||
if(client_p == NULL)
|
if(client_p == NULL)
|
||||||
|
@ -383,49 +409,49 @@ ssl_process_zip_ready(ssl_ctl_t *ctl, ssl_ctl_buf_t *ctl_buf)
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ssl_process_cmd_recv(ssl_ctl_t *ctl)
|
ssl_process_cmd_recv(ssl_ctl_t * ctl)
|
||||||
{
|
{
|
||||||
static const char *cannot_setup_ssl = "ssld cannot setup ssl, check your certificates and private key";
|
static const char *cannot_setup_ssl = "ssld cannot setup ssl, check your certificates and private key";
|
||||||
static const char *no_ssl_or_zlib = "ssld has neither SSL/TLS or zlib support killing all sslds";
|
static const char *no_ssl_or_zlib = "ssld has neither SSL/TLS or zlib support killing all sslds";
|
||||||
rb_dlink_node *ptr, *next;
|
rb_dlink_node *ptr, *next;
|
||||||
ssl_ctl_buf_t *ctl_buf;
|
ssl_ctl_buf_t *ctl_buf;
|
||||||
if(ctl->dead)
|
if(ctl->dead)
|
||||||
return;
|
return;
|
||||||
RB_DLINK_FOREACH_SAFE(ptr, next, ctl->readq.head)
|
RB_DLINK_FOREACH_SAFE(ptr, next, ctl->readq.head)
|
||||||
{
|
{
|
||||||
ctl_buf = ptr->data;
|
ctl_buf = ptr->data;
|
||||||
switch(*ctl_buf->buf)
|
switch (*ctl_buf->buf)
|
||||||
{
|
{
|
||||||
case 'N':
|
case 'N':
|
||||||
ssl_ok = 0; /* ssld says it can't do ssl/tls */
|
ssl_ok = 0; /* ssld says it can't do ssl/tls */
|
||||||
break;
|
break;
|
||||||
case 'D':
|
case 'D':
|
||||||
ssl_process_dead_fd(ctl, ctl_buf);
|
ssl_process_dead_fd(ctl, ctl_buf);
|
||||||
break;
|
break;
|
||||||
case 'S':
|
case 'S':
|
||||||
ssl_process_zipstats(ctl, ctl_buf);
|
ssl_process_zipstats(ctl, ctl_buf);
|
||||||
break;
|
break;
|
||||||
case 'I':
|
case 'I':
|
||||||
ssl_ok = 0;
|
ssl_ok = 0;
|
||||||
ilog(L_MAIN, cannot_setup_ssl);
|
ilog(L_MAIN, cannot_setup_ssl);
|
||||||
sendto_realops_snomask(SNO_GENERAL, L_ALL, cannot_setup_ssl);
|
sendto_realops_snomask(SNO_GENERAL, L_ALL, cannot_setup_ssl);
|
||||||
case 'U':
|
case 'U':
|
||||||
zlib_ok = 0;
|
zlib_ok = 0;
|
||||||
ssl_ok = 0;
|
ssl_ok = 0;
|
||||||
ilog(L_MAIN, no_ssl_or_zlib);
|
ilog(L_MAIN, no_ssl_or_zlib);
|
||||||
sendto_realops_snomask(SNO_GENERAL, L_ALL, no_ssl_or_zlib);
|
sendto_realops_snomask(SNO_GENERAL, L_ALL, no_ssl_or_zlib);
|
||||||
ssl_killall();
|
ssl_killall();
|
||||||
break;
|
break;
|
||||||
case 'R':
|
case 'R':
|
||||||
ssl_process_zip_ready(ctl, ctl_buf);
|
ssl_process_zip_ready(ctl, ctl_buf);
|
||||||
break;
|
break;
|
||||||
case 'z':
|
case 'z':
|
||||||
zlib_ok = 0;
|
zlib_ok = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ilog(L_MAIN, "Received invalid command from ssld: %s", ctl_buf->buf);
|
ilog(L_MAIN, "Received invalid command from ssld: %s", ctl_buf->buf);
|
||||||
sendto_realops_snomask(SNO_GENERAL, L_ALL, "Received invalid command from ssld");
|
sendto_realops_snomask(SNO_GENERAL, L_ALL, "Received invalid command from ssld");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
rb_dlinkDelete(ptr, &ctl->readq);
|
rb_dlinkDelete(ptr, &ctl->readq);
|
||||||
rb_free(ctl_buf->buf);
|
rb_free(ctl_buf->buf);
|
||||||
|
@ -436,7 +462,7 @@ ssl_process_cmd_recv(ssl_ctl_t *ctl)
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ssl_read_ctl(rb_fde_t *F, void *data)
|
ssl_read_ctl(rb_fde_t * F, void *data)
|
||||||
{
|
{
|
||||||
ssl_ctl_buf_t *ctl_buf;
|
ssl_ctl_buf_t *ctl_buf;
|
||||||
ssl_ctl_t *ctl = data;
|
ssl_ctl_t *ctl = data;
|
||||||
|
@ -450,19 +476,21 @@ ssl_read_ctl(rb_fde_t *F, void *data)
|
||||||
ctl_buf->buf = rb_malloc(READSIZE);
|
ctl_buf->buf = rb_malloc(READSIZE);
|
||||||
retlen = rb_recv_fd_buf(ctl->F, ctl_buf->buf, READSIZE, ctl_buf->F, 4);
|
retlen = rb_recv_fd_buf(ctl->F, ctl_buf->buf, READSIZE, ctl_buf->F, 4);
|
||||||
ctl_buf->buflen = retlen;
|
ctl_buf->buflen = retlen;
|
||||||
if(retlen <= 0) {
|
if(retlen <= 0)
|
||||||
|
{
|
||||||
rb_free(ctl_buf->buf);
|
rb_free(ctl_buf->buf);
|
||||||
rb_free(ctl_buf);
|
rb_free(ctl_buf);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
rb_dlinkAddTail(ctl_buf, &ctl_buf->node, &ctl->readq);
|
rb_dlinkAddTail(ctl_buf, &ctl_buf->node, &ctl->readq);
|
||||||
} while(retlen > 0);
|
}
|
||||||
|
while(retlen > 0);
|
||||||
|
|
||||||
if(retlen == 0 || (retlen < 0 && !rb_ignore_errno(errno)))
|
if(retlen == 0 || (retlen < 0 && !rb_ignore_errno(errno)))
|
||||||
{
|
{
|
||||||
ssl_dead(ctl);
|
ssl_dead(ctl);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ssl_process_cmd_recv(ctl);
|
ssl_process_cmd_recv(ctl);
|
||||||
rb_setselect(ctl->F, RB_SELECT_READ, ssl_read_ctl, ctl);
|
rb_setselect(ctl->F, RB_SELECT_READ, ssl_read_ctl, ctl);
|
||||||
}
|
}
|
||||||
|
@ -472,24 +500,25 @@ which_ssld(void)
|
||||||
{
|
{
|
||||||
ssl_ctl_t *ctl, *lowest = NULL;
|
ssl_ctl_t *ctl, *lowest = NULL;
|
||||||
rb_dlink_node *ptr;
|
rb_dlink_node *ptr;
|
||||||
|
|
||||||
RB_DLINK_FOREACH(ptr, ssl_daemons.head)
|
RB_DLINK_FOREACH(ptr, ssl_daemons.head)
|
||||||
{
|
{
|
||||||
ctl = ptr->data;
|
ctl = ptr->data;
|
||||||
if(ctl->dead)
|
if(ctl->dead)
|
||||||
continue;
|
continue;
|
||||||
if(lowest == NULL) {
|
if(lowest == NULL)
|
||||||
|
{
|
||||||
lowest = ctl;
|
lowest = ctl;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(ctl->cli_count < lowest->cli_count)
|
if(ctl->cli_count < lowest->cli_count)
|
||||||
lowest = ctl;
|
lowest = ctl;
|
||||||
}
|
}
|
||||||
return(lowest);
|
return (lowest);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ssl_write_ctl(rb_fde_t *F, void *data)
|
ssl_write_ctl(rb_fde_t * F, void *data)
|
||||||
{
|
{
|
||||||
ssl_ctl_t *ctl = data;
|
ssl_ctl_t *ctl = data;
|
||||||
ssl_ctl_buf_t *ctl_buf;
|
ssl_ctl_buf_t *ctl_buf;
|
||||||
|
@ -503,7 +532,7 @@ ssl_write_ctl(rb_fde_t *F, void *data)
|
||||||
{
|
{
|
||||||
ctl_buf = ptr->data;
|
ctl_buf = ptr->data;
|
||||||
/* in theory unix sock_dgram shouldn't ever short write this.. */
|
/* in theory unix sock_dgram shouldn't ever short write this.. */
|
||||||
retlen = rb_send_fd_buf(ctl->F, ctl_buf->F, ctl_buf->nfds, ctl_buf->buf, ctl_buf->buflen);
|
retlen = rb_send_fd_buf(ctl->F, ctl_buf->F, ctl_buf->nfds, ctl_buf->buf, ctl_buf->buflen, ctl->pid);
|
||||||
if(retlen > 0)
|
if(retlen > 0)
|
||||||
{
|
{
|
||||||
rb_dlinkDelete(ptr, &ctl->writeq);
|
rb_dlinkDelete(ptr, &ctl->writeq);
|
||||||
|
@ -511,36 +540,38 @@ ssl_write_ctl(rb_fde_t *F, void *data)
|
||||||
rb_close(ctl_buf->F[x]);
|
rb_close(ctl_buf->F[x]);
|
||||||
rb_free(ctl_buf->buf);
|
rb_free(ctl_buf->buf);
|
||||||
rb_free(ctl_buf);
|
rb_free(ctl_buf);
|
||||||
|
|
||||||
}
|
}
|
||||||
if(retlen == 0 || (retlen < 0 && !rb_ignore_errno(errno)))
|
if(retlen == 0 || (retlen < 0 && !rb_ignore_errno(errno)))
|
||||||
{
|
{
|
||||||
ssl_dead(ctl);
|
ssl_dead(ctl);
|
||||||
return;
|
return;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
rb_setselect(ctl->F, RB_SELECT_WRITE, ssl_write_ctl, ctl);
|
rb_setselect(ctl->F, RB_SELECT_WRITE, ssl_write_ctl, ctl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ssl_cmd_write_queue(ssl_ctl_t *ctl, rb_fde_t **F, int count, const void *buf, size_t buflen)
|
ssl_cmd_write_queue(ssl_ctl_t * ctl, rb_fde_t ** F, int count, const void *buf, size_t buflen)
|
||||||
{
|
{
|
||||||
ssl_ctl_buf_t *ctl_buf;
|
ssl_ctl_buf_t *ctl_buf;
|
||||||
int x;
|
int x;
|
||||||
|
|
||||||
/* don't bother */
|
/* don't bother */
|
||||||
if(ctl->dead)
|
if(ctl->dead)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ctl_buf = rb_malloc(sizeof(ssl_ctl_buf_t));
|
ctl_buf = rb_malloc(sizeof(ssl_ctl_buf_t));
|
||||||
ctl_buf->buf = rb_malloc(buflen);
|
ctl_buf->buf = rb_malloc(buflen);
|
||||||
memcpy(ctl_buf->buf, buf, buflen);
|
memcpy(ctl_buf->buf, buf, buflen);
|
||||||
ctl_buf->buflen = buflen;
|
ctl_buf->buflen = buflen;
|
||||||
|
|
||||||
for(x = 0; x < count && x < MAXPASSFD; x++)
|
for(x = 0; x < count && x < MAXPASSFD; x++)
|
||||||
{
|
{
|
||||||
ctl_buf->F[x] = F[x];
|
ctl_buf->F[x] = F[x];
|
||||||
}
|
}
|
||||||
ctl_buf->nfds = count;
|
ctl_buf->nfds = count;
|
||||||
rb_dlinkAddTail(ctl_buf, &ctl_buf->node, &ctl->writeq);
|
rb_dlinkAddTail(ctl_buf, &ctl_buf->node, &ctl->writeq);
|
||||||
|
@ -549,26 +580,28 @@ ssl_cmd_write_queue(ssl_ctl_t *ctl, rb_fde_t **F, int count, const void *buf, si
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
send_new_ssl_certs_one(ssl_ctl_t *ctl, const char *ssl_cert, const char *ssl_private_key, const char *ssl_dh_params)
|
send_new_ssl_certs_one(ssl_ctl_t * ctl, const char *ssl_cert, const char *ssl_private_key, const char *ssl_dh_params)
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
len = strlen(ssl_cert) + strlen(ssl_private_key) + strlen(ssl_dh_params) + 5;
|
len = strlen(ssl_cert) + strlen(ssl_private_key) + strlen(ssl_dh_params) + 5;
|
||||||
if(len > sizeof(tmpbuf))
|
if(len > sizeof(tmpbuf))
|
||||||
{
|
{
|
||||||
sendto_realops_snomask(SNO_GENERAL, L_ALL,
|
sendto_realops_snomask(SNO_GENERAL, L_ALL,
|
||||||
"Parameters for send_new_ssl_certs_one too long (%zu > %zu) to pass to ssld, not sending...",
|
"Parameters for send_new_ssl_certs_one too long (%zu > %zu) to pass to ssld, not sending...",
|
||||||
len, sizeof(tmpbuf));
|
len, sizeof(tmpbuf));
|
||||||
ilog(L_MAIN, "Parameters for send_new_ssl_certs_one too long (%zu > %zu) to pass to ssld, not sending...",
|
ilog(L_MAIN,
|
||||||
len, sizeof(tmpbuf));
|
"Parameters for send_new_ssl_certs_one too long (%zu > %zu) to pass to ssld, not sending...",
|
||||||
|
len, sizeof(tmpbuf));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
len = rb_snprintf(tmpbuf, sizeof(tmpbuf), "K%c%s%c%s%c%s%c", nul, ssl_cert, nul, ssl_private_key, nul, ssl_dh_params, nul);
|
len = rb_snprintf(tmpbuf, sizeof(tmpbuf), "K%c%s%c%s%c%s%c", nul, ssl_cert, nul,
|
||||||
|
ssl_private_key, nul, ssl_dh_params, nul);
|
||||||
ssl_cmd_write_queue(ctl, NULL, 0, tmpbuf, len);
|
ssl_cmd_write_queue(ctl, NULL, 0, tmpbuf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
send_init_prng(ssl_ctl_t *ctl, prng_seed_t seedtype, const char *path)
|
send_init_prng(ssl_ctl_t * ctl, prng_seed_t seedtype, const char *path)
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
const char *s;
|
const char *s;
|
||||||
|
@ -582,14 +615,15 @@ send_init_prng(ssl_ctl_t *ctl, prng_seed_t seedtype, const char *path)
|
||||||
len = strlen(s) + 3;
|
len = strlen(s) + 3;
|
||||||
if(len > sizeof(tmpbuf))
|
if(len > sizeof(tmpbuf))
|
||||||
{
|
{
|
||||||
sendto_realops_snomask(SNO_GENERAL, L_ALL,
|
sendto_realops_snomask(SNO_GENERAL, L_ALL,
|
||||||
"Parameters for send_init_prng too long (%zd > %zd) to pass to ssld, not sending...",
|
"Parameters for send_init_prng too long (%zd > %zd) to pass to ssld, not sending...",
|
||||||
len, sizeof(tmpbuf));
|
len, sizeof(tmpbuf));
|
||||||
ilog(L_MAIN, "Parameters for send_init_prng too long (%zd > %zd) to pass to ssld, not sending...",
|
ilog(L_MAIN,
|
||||||
len, sizeof(tmpbuf));
|
"Parameters for send_init_prng too long (%zd > %zd) to pass to ssld, not sending...",
|
||||||
|
len, sizeof(tmpbuf));
|
||||||
return;
|
return;
|
||||||
|
|
||||||
}
|
}
|
||||||
len = rb_snprintf(tmpbuf, sizeof(tmpbuf), "I%c%s%c", seed, s, nul);
|
len = rb_snprintf(tmpbuf, sizeof(tmpbuf), "I%c%s%c", seed, s, nul);
|
||||||
ssl_cmd_write_queue(ctl, NULL, 0, tmpbuf, len);
|
ssl_cmd_write_queue(ctl, NULL, 0, tmpbuf, len);
|
||||||
}
|
}
|
||||||
|
@ -606,13 +640,13 @@ send_new_ssl_certs(const char *ssl_cert, const char *ssl_private_key, const char
|
||||||
RB_DLINK_FOREACH(ptr, ssl_daemons.head)
|
RB_DLINK_FOREACH(ptr, ssl_daemons.head)
|
||||||
{
|
{
|
||||||
ssl_ctl_t *ctl = ptr->data;
|
ssl_ctl_t *ctl = ptr->data;
|
||||||
send_new_ssl_certs_one(ctl, ssl_cert, ssl_private_key, ssl_dh_params);
|
send_new_ssl_certs_one(ctl, ssl_cert, ssl_private_key, ssl_dh_params);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ssl_ctl_t *
|
ssl_ctl_t *
|
||||||
start_ssld_accept(rb_fde_t *sslF, rb_fde_t *plainF, int32_t id)
|
start_ssld_accept(rb_fde_t * sslF, rb_fde_t * plainF, int32_t id)
|
||||||
{
|
{
|
||||||
rb_fde_t *F[2];
|
rb_fde_t *F[2];
|
||||||
ssl_ctl_t *ctl;
|
ssl_ctl_t *ctl;
|
||||||
|
@ -629,7 +663,7 @@ start_ssld_accept(rb_fde_t *sslF, rb_fde_t *plainF, int32_t id)
|
||||||
}
|
}
|
||||||
|
|
||||||
ssl_ctl_t *
|
ssl_ctl_t *
|
||||||
start_ssld_connect(rb_fde_t *sslF, rb_fde_t *plainF, int32_t id)
|
start_ssld_connect(rb_fde_t * sslF, rb_fde_t * plainF, int32_t id)
|
||||||
{
|
{
|
||||||
rb_fde_t *F[2];
|
rb_fde_t *F[2];
|
||||||
ssl_ctl_t *ctl;
|
ssl_ctl_t *ctl;
|
||||||
|
@ -643,11 +677,11 @@ start_ssld_connect(rb_fde_t *sslF, rb_fde_t *plainF, int32_t id)
|
||||||
ctl = which_ssld();
|
ctl = which_ssld();
|
||||||
ctl->cli_count++;
|
ctl->cli_count++;
|
||||||
ssl_cmd_write_queue(ctl, F, 2, buf, sizeof(buf));
|
ssl_cmd_write_queue(ctl, F, 2, buf, sizeof(buf));
|
||||||
return ctl;
|
return ctl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ssld_decrement_clicount(ssl_ctl_t *ctl)
|
ssld_decrement_clicount(ssl_ctl_t * ctl)
|
||||||
{
|
{
|
||||||
if(ctl == NULL)
|
if(ctl == NULL)
|
||||||
return;
|
return;
|
||||||
|
@ -671,7 +705,7 @@ ssld_decrement_clicount(ssl_ctl_t *ctl)
|
||||||
void
|
void
|
||||||
start_zlib_session(void *data)
|
start_zlib_session(void *data)
|
||||||
{
|
{
|
||||||
struct Client *server = (struct Client *)data;
|
struct Client *server = (struct Client *) data;
|
||||||
uint16_t recvqlen;
|
uint16_t recvqlen;
|
||||||
uint8_t level;
|
uint8_t level;
|
||||||
void *xbuf;
|
void *xbuf;
|
||||||
|
@ -688,25 +722,26 @@ start_zlib_session(void *data)
|
||||||
server->localClient->event = NULL;
|
server->localClient->event = NULL;
|
||||||
|
|
||||||
recvqlen = rb_linebuf_len(&server->localClient->buf_recvq);
|
recvqlen = rb_linebuf_len(&server->localClient->buf_recvq);
|
||||||
|
|
||||||
len = recvqlen + hdr;
|
len = recvqlen + hdr;
|
||||||
|
|
||||||
if(len > READBUF_SIZE)
|
if(len > READBUF_SIZE)
|
||||||
{
|
{
|
||||||
rb_free(buf);
|
sendto_realops_snomask(SNO_GENERAL, L_ALL,
|
||||||
sendto_realops_snomask(SNO_GENERAL, L_ALL, "ssld - attempted to pass message of %zd len, max len %d, giving up", len, READBUF_SIZE);
|
"ssld - attempted to pass message of %zd len, max len %d, giving up",
|
||||||
|
len, READBUF_SIZE);
|
||||||
ilog(L_MAIN, "ssld - attempted to pass message of %zd len, max len %d, giving up", len, READBUF_SIZE);
|
ilog(L_MAIN, "ssld - attempted to pass message of %zd len, max len %d, giving up", len, READBUF_SIZE);
|
||||||
exit_client(server, server, server, "ssld readbuf exceeded");
|
exit_client(server, server, server, "ssld readbuf exceeded");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = rb_malloc(len);
|
buf = rb_malloc(len);
|
||||||
level = ConfigFileEntry.compression_level;
|
level = ConfigFileEntry.compression_level;
|
||||||
|
|
||||||
int32_to_buf(&buf[1], rb_get_fd(server->localClient->F));
|
int32_to_buf(&buf[1], rb_get_fd(server->localClient->F));
|
||||||
buf[5] = (char)level;
|
buf[5] = (char) level;
|
||||||
|
|
||||||
recvq_start = &buf[6];
|
recvq_start = &buf[6];
|
||||||
server->localClient->zipstats = rb_malloc(sizeof(struct ZipStats));
|
server->localClient->zipstats = rb_malloc(sizeof(struct ZipStats));
|
||||||
|
|
||||||
xbuf = recvq_start;
|
xbuf = recvq_start;
|
||||||
|
@ -716,16 +751,17 @@ start_zlib_session(void *data)
|
||||||
{
|
{
|
||||||
cpylen = rb_linebuf_get(&server->localClient->buf_recvq, xbuf, left, LINEBUF_PARTIAL, LINEBUF_RAW);
|
cpylen = rb_linebuf_get(&server->localClient->buf_recvq, xbuf, left, LINEBUF_PARTIAL, LINEBUF_RAW);
|
||||||
left -= cpylen;
|
left -= cpylen;
|
||||||
xbuf += cpylen;
|
xbuf = (void *) (((uintptr_t) xbuf) + cpylen);
|
||||||
} while(cpylen > 0);
|
}
|
||||||
|
while(cpylen > 0);
|
||||||
|
|
||||||
/* Pass the socket to ssld. */
|
/* Pass the socket to ssld. */
|
||||||
*buf = 'Z';
|
*buf = 'Z';
|
||||||
rb_socketpair(AF_UNIX, SOCK_STREAM, 0, &xF1, &xF2, "Initial zlib socketpairs");
|
rb_socketpair(AF_UNIX, SOCK_STREAM, 0, &xF1, &xF2, "Initial zlib socketpairs");
|
||||||
|
|
||||||
F[0] = server->localClient->F;
|
F[0] = server->localClient->F;
|
||||||
F[1] = xF1;
|
F[1] = xF1;
|
||||||
del_from_cli_fd_hash(server);
|
del_from_cli_fd_hash(server);
|
||||||
server->localClient->F = xF2;
|
server->localClient->F = xF2;
|
||||||
/* need to redo as what we did before isn't valid now */
|
/* need to redo as what we did before isn't valid now */
|
||||||
int32_to_buf(&buf[1], rb_get_fd(server->localClient->F));
|
int32_to_buf(&buf[1], rb_get_fd(server->localClient->F));
|
||||||
|
@ -758,9 +794,9 @@ collect_zipstats(void *unused)
|
||||||
|
|
||||||
id = rb_get_fd(target_p->localClient->F);
|
id = rb_get_fd(target_p->localClient->F);
|
||||||
int32_to_buf(&buf[1], rb_get_fd(target_p->localClient->F));
|
int32_to_buf(&buf[1], rb_get_fd(target_p->localClient->F));
|
||||||
rb_strlcpy(odata, target_p->name, (sizeof(buf)-len));
|
rb_strlcpy(odata, target_p->name, (sizeof(buf) - len));
|
||||||
len += strlen(odata) + 1; /* Get the \0 as well */
|
len += strlen(odata) + 1; /* Get the \0 as well */
|
||||||
ssl_cmd_write_queue(target_p->localClient->ssl_ctl, NULL, 0, buf, len);
|
ssl_cmd_write_queue(target_p->localClient->ssl_ctl, NULL, 0, buf, len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -775,7 +811,7 @@ cleanup_dead_ssl(void *unused)
|
||||||
ctl = ptr->data;
|
ctl = ptr->data;
|
||||||
if(ctl->dead && !ctl->cli_count)
|
if(ctl->dead && !ctl->cli_count)
|
||||||
{
|
{
|
||||||
free_ssl_daemon(ctl);
|
free_ssl_daemon(ctl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -786,9 +822,9 @@ get_ssld_count(void)
|
||||||
return ssld_count;
|
return ssld_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_ssld(void)
|
void
|
||||||
|
init_ssld(void)
|
||||||
{
|
{
|
||||||
rb_event_addish("collect_zipstats", collect_zipstats, NULL, ZIPSTATS_TIME);
|
rb_event_addish("collect_zipstats", collect_zipstats, NULL, ZIPSTATS_TIME);
|
||||||
rb_event_addish("cleanup_dead_ssld", cleanup_dead_ssl, NULL, 1200);
|
rb_event_addish("cleanup_dead_ssld", cleanup_dead_ssl, NULL, 1200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
198
ssld/ssld.c
198
ssld/ssld.c
|
@ -18,7 +18,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: ssld.c 25677 2008-07-06 04:21:42Z androsyn $
|
* $Id$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
@ -34,33 +34,38 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void setup_signals(void);
|
static void setup_signals(void);
|
||||||
|
static pid_t ppid;
|
||||||
|
|
||||||
static inline int32_t buf_to_int32(char *buf)
|
static inline int32_t
|
||||||
|
buf_to_int32(char *buf)
|
||||||
{
|
{
|
||||||
int32_t x;
|
int32_t x;
|
||||||
memcpy(&x, buf, sizeof(x));
|
memcpy(&x, buf, sizeof(x));
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void int32_to_buf(char *buf, int32_t x)
|
static inline void
|
||||||
|
int32_to_buf(char *buf, int32_t x)
|
||||||
{
|
{
|
||||||
memcpy(buf, &x, sizeof(x));
|
memcpy(buf, &x, sizeof(x));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint16_t buf_to_uint16(char *buf)
|
static inline uint16_t
|
||||||
|
buf_to_uint16(char *buf)
|
||||||
{
|
{
|
||||||
uint16_t x;
|
uint16_t x;
|
||||||
memcpy(&x, buf, sizeof(x));
|
memcpy(&x, buf, sizeof(x));
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void uint16_to_buf(char *buf, uint16_t x)
|
static inline void
|
||||||
|
uint16_to_buf(char *buf, uint16_t x)
|
||||||
{
|
{
|
||||||
memcpy(buf, &x, sizeof(x));
|
memcpy(buf, &x, sizeof(x));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static char inbuf[READBUF_SIZE];
|
static char inbuf[READBUF_SIZE];
|
||||||
#ifdef HAVE_LIBZ
|
#ifdef HAVE_LIBZ
|
||||||
|
@ -120,8 +125,8 @@ typedef struct _conn
|
||||||
#define FLAG_ZIP 0x02
|
#define FLAG_ZIP 0x02
|
||||||
#define FLAG_CORK 0x04
|
#define FLAG_CORK 0x04
|
||||||
#define FLAG_DEAD 0x08
|
#define FLAG_DEAD 0x08
|
||||||
#define FLAG_SSL_W_WANTS_R 0x10 /* output needs to wait until input possible */
|
#define FLAG_SSL_W_WANTS_R 0x10 /* output needs to wait until input possible */
|
||||||
#define FLAG_SSL_R_WANTS_W 0x20 /* input needs to wait until output possible */
|
#define FLAG_SSL_R_WANTS_W 0x20 /* input needs to wait until output possible */
|
||||||
|
|
||||||
#define IsSSL(x) ((x)->flags & FLAG_SSL)
|
#define IsSSL(x) ((x)->flags & FLAG_SSL)
|
||||||
#define IsZip(x) ((x)->flags & FLAG_ZIP)
|
#define IsZip(x) ((x)->flags & FLAG_ZIP)
|
||||||
|
@ -157,12 +162,12 @@ typedef struct _conn
|
||||||
static rb_dlink_list connid_hash_table[CONN_HASH_SIZE];
|
static rb_dlink_list connid_hash_table[CONN_HASH_SIZE];
|
||||||
static rb_dlink_list dead_list;
|
static rb_dlink_list dead_list;
|
||||||
|
|
||||||
static void conn_mod_read_cb(rb_fde_t * fd, void *data);
|
static void conn_mod_read_cb(rb_fde_t *fd, void *data);
|
||||||
static void conn_mod_write_sendq(rb_fde_t *, void *data);
|
static void conn_mod_write_sendq(rb_fde_t *, void *data);
|
||||||
static void conn_plain_write_sendq(rb_fde_t *, void *data);
|
static void conn_plain_write_sendq(rb_fde_t *, void *data);
|
||||||
static void mod_write_ctl(rb_fde_t *, void *data);
|
static void mod_write_ctl(rb_fde_t *, void *data);
|
||||||
static void conn_plain_read_cb(rb_fde_t * fd, void *data);
|
static void conn_plain_read_cb(rb_fde_t *fd, void *data);
|
||||||
static void mod_cmd_write_queue(mod_ctl_t *ctl, const void *data, size_t len);
|
static void mod_cmd_write_queue(mod_ctl_t * ctl, const void *data, size_t len);
|
||||||
static const char *remote_closed = "Remote host closed the connection";
|
static const char *remote_closed = "Remote host closed the connection";
|
||||||
static int ssl_ok;
|
static int ssl_ok;
|
||||||
#ifdef HAVE_LIBZ
|
#ifdef HAVE_LIBZ
|
||||||
|
@ -182,7 +187,7 @@ ssld_alloc(void *unused, size_t count, size_t size)
|
||||||
static void
|
static void
|
||||||
ssld_free(void *unused, void *ptr)
|
ssld_free(void *unused, void *ptr)
|
||||||
{
|
{
|
||||||
rb_free(ptr);
|
rb_free(ptr);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -218,7 +223,7 @@ free_conn(conn_t * conn)
|
||||||
{
|
{
|
||||||
zlib_stream_t *stream = conn->stream;
|
zlib_stream_t *stream = conn->stream;
|
||||||
inflateEnd(&stream->instream);
|
inflateEnd(&stream->instream);
|
||||||
deflateEnd(&stream->outstream);
|
deflateEnd(&stream->outstream);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
rb_free(conn);
|
rb_free(conn);
|
||||||
|
@ -242,12 +247,12 @@ static void
|
||||||
close_conn(conn_t * conn, int wait_plain, const char *fmt, ...)
|
close_conn(conn_t * conn, int wait_plain, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
char reason[128]; /* must always be under 250 bytes */
|
char reason[128]; /* must always be under 250 bytes */
|
||||||
char buf[256];
|
char buf[256];
|
||||||
int len;
|
int len;
|
||||||
if(IsDead(conn))
|
if(IsDead(conn))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
rb_rawbuf_flush(conn->modbuf_out, conn->mod_fd);
|
rb_rawbuf_flush(conn->modbuf_out, conn->mod_fd);
|
||||||
rb_rawbuf_flush(conn->plainbuf_out, conn->plain_fd);
|
rb_rawbuf_flush(conn->plainbuf_out, conn->plain_fd);
|
||||||
rb_close(conn->mod_fd);
|
rb_close(conn->mod_fd);
|
||||||
|
@ -256,13 +261,13 @@ close_conn(conn_t * conn, int wait_plain, const char *fmt, ...)
|
||||||
if(!wait_plain || fmt == NULL)
|
if(!wait_plain || fmt == NULL)
|
||||||
{
|
{
|
||||||
rb_close(conn->plain_fd);
|
rb_close(conn->plain_fd);
|
||||||
|
|
||||||
if(conn->id >= 0)
|
if(conn->id >= 0)
|
||||||
rb_dlinkDelete(&conn->node, connid_hash(conn->id));
|
rb_dlinkDelete(&conn->node, connid_hash(conn->id));
|
||||||
rb_dlinkAdd(conn, &conn->node, &dead_list);
|
rb_dlinkAdd(conn, &conn->node, &dead_list);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
rb_setselect(conn->plain_fd, RB_SELECT_WRITE|RB_SELECT_READ, NULL, NULL);
|
rb_setselect(conn->plain_fd, RB_SELECT_WRITE | RB_SELECT_READ, NULL, NULL);
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
rb_vsnprintf(reason, sizeof(reason), fmt, ap);
|
rb_vsnprintf(reason, sizeof(reason), fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
@ -275,7 +280,7 @@ close_conn(conn_t * conn, int wait_plain, const char *fmt, ...)
|
||||||
}
|
}
|
||||||
|
|
||||||
static conn_t *
|
static conn_t *
|
||||||
make_conn(mod_ctl_t *ctl, rb_fde_t * mod_fd, rb_fde_t * plain_fd)
|
make_conn(mod_ctl_t * ctl, rb_fde_t *mod_fd, rb_fde_t *plain_fd)
|
||||||
{
|
{
|
||||||
conn_t *conn = rb_malloc(sizeof(conn_t));
|
conn_t *conn = rb_malloc(sizeof(conn_t));
|
||||||
conn->ctl = ctl;
|
conn->ctl = ctl;
|
||||||
|
@ -302,20 +307,18 @@ check_handshake_flood(void *unused)
|
||||||
conn = ptr->data;
|
conn = ptr->data;
|
||||||
if(!IsSSL(conn))
|
if(!IsSSL(conn))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
count = rb_ssl_handshake_count(conn->mod_fd);
|
count = rb_ssl_handshake_count(conn->mod_fd);
|
||||||
/* nothing needs to do this more than twice in ten seconds i don't think */
|
/* nothing needs to do this more than twice in ten seconds i don't think */
|
||||||
if(count > 2)
|
if(count > 2)
|
||||||
close_conn(conn, WAIT_PLAIN, "Handshake flooding");
|
close_conn(conn, WAIT_PLAIN, "Handshake flooding");
|
||||||
else
|
else
|
||||||
rb_ssl_clear_handshake_count(conn->mod_fd);
|
rb_ssl_clear_handshake_count(conn->mod_fd);
|
||||||
}
|
}
|
||||||
HASH_WALK_END
|
HASH_WALK_END}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
conn_mod_write_sendq(rb_fde_t * fd, void *data)
|
conn_mod_write_sendq(rb_fde_t *fd, void *data)
|
||||||
{
|
{
|
||||||
conn_t *conn = data;
|
conn_t *conn = data;
|
||||||
const char *err;
|
const char *err;
|
||||||
|
@ -331,7 +334,7 @@ conn_mod_write_sendq(rb_fde_t * fd, void *data)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((retlen = rb_rawbuf_flush(conn->modbuf_out, fd)) > 0)
|
while((retlen = rb_rawbuf_flush(conn->modbuf_out, fd)) > 0)
|
||||||
conn->mod_out += retlen;
|
conn->mod_out += retlen;
|
||||||
|
|
||||||
if(retlen == 0 || (retlen < 0 && !rb_ignore_errno(errno)))
|
if(retlen == 0 || (retlen < 0 && !rb_ignore_errno(errno)))
|
||||||
|
@ -401,7 +404,7 @@ static void
|
||||||
common_zlib_deflate(conn_t * conn, void *buf, size_t len)
|
common_zlib_deflate(conn_t * conn, void *buf, size_t len)
|
||||||
{
|
{
|
||||||
int ret, have;
|
int ret, have;
|
||||||
z_stream *outstream = &((zlib_stream_t *)conn->stream)->outstream;
|
z_stream *outstream = &((zlib_stream_t *) conn->stream)->outstream;
|
||||||
outstream->next_in = buf;
|
outstream->next_in = buf;
|
||||||
outstream->avail_in = len;
|
outstream->avail_in = len;
|
||||||
outstream->next_out = (Bytef *) outbuf;
|
outstream->next_out = (Bytef *) outbuf;
|
||||||
|
@ -422,7 +425,7 @@ common_zlib_deflate(conn_t * conn, void *buf, size_t len)
|
||||||
}
|
}
|
||||||
if(outstream->avail_in != 0)
|
if(outstream->avail_in != 0)
|
||||||
{
|
{
|
||||||
/* avail_in isn't empty...*/
|
/* avail_in isn't empty... */
|
||||||
close_conn(conn, WAIT_PLAIN, "error compressing data, avail_in != 0");
|
close_conn(conn, WAIT_PLAIN, "error compressing data, avail_in != 0");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -433,15 +436,15 @@ common_zlib_deflate(conn_t * conn, void *buf, size_t len)
|
||||||
static void
|
static void
|
||||||
common_zlib_inflate(conn_t * conn, void *buf, size_t len)
|
common_zlib_inflate(conn_t * conn, void *buf, size_t len)
|
||||||
{
|
{
|
||||||
int ret, have;
|
int ret, have = 0;
|
||||||
((zlib_stream_t *)conn->stream)->instream.next_in = buf;
|
((zlib_stream_t *) conn->stream)->instream.next_in = buf;
|
||||||
((zlib_stream_t *)conn->stream)->instream.avail_in = len;
|
((zlib_stream_t *) conn->stream)->instream.avail_in = len;
|
||||||
((zlib_stream_t *)conn->stream)->instream.next_out = (Bytef *) outbuf;
|
((zlib_stream_t *) conn->stream)->instream.next_out = (Bytef *) outbuf;
|
||||||
((zlib_stream_t *)conn->stream)->instream.avail_out = sizeof(outbuf);
|
((zlib_stream_t *) conn->stream)->instream.avail_out = sizeof(outbuf);
|
||||||
|
|
||||||
while (((zlib_stream_t *)conn->stream)->instream.avail_in)
|
while(((zlib_stream_t *) conn->stream)->instream.avail_in)
|
||||||
{
|
{
|
||||||
ret = inflate(&((zlib_stream_t *)conn->stream)->instream, Z_NO_FLUSH);
|
ret = inflate(&((zlib_stream_t *) conn->stream)->instream, Z_NO_FLUSH);
|
||||||
if(ret != Z_OK)
|
if(ret != Z_OK)
|
||||||
{
|
{
|
||||||
if(!strncmp("ERROR ", buf, 6))
|
if(!strncmp("ERROR ", buf, 6))
|
||||||
|
@ -452,14 +455,14 @@ common_zlib_inflate(conn_t * conn, void *buf, size_t len)
|
||||||
close_conn(conn, WAIT_PLAIN, "Inflate failed: %s", zError(ret));
|
close_conn(conn, WAIT_PLAIN, "Inflate failed: %s", zError(ret));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
have = sizeof(outbuf) - ((zlib_stream_t *)conn->stream)->instream.avail_out;
|
have = sizeof(outbuf) - ((zlib_stream_t *) conn->stream)->instream.avail_out;
|
||||||
|
|
||||||
if(((zlib_stream_t *)conn->stream)->instream.avail_in)
|
if(((zlib_stream_t *) conn->stream)->instream.avail_in)
|
||||||
{
|
{
|
||||||
conn_plain_write(conn, outbuf, have);
|
conn_plain_write(conn, outbuf, have);
|
||||||
have = 0;
|
have = 0;
|
||||||
((zlib_stream_t *)conn->stream)->instream.next_out = (Bytef *) outbuf;
|
((zlib_stream_t *) conn->stream)->instream.next_out = (Bytef *) outbuf;
|
||||||
((zlib_stream_t *)conn->stream)->instream.avail_out = sizeof(outbuf);
|
((zlib_stream_t *) conn->stream)->instream.avail_out = sizeof(outbuf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(have == 0)
|
if(have == 0)
|
||||||
|
@ -487,7 +490,7 @@ plain_check_cork(conn_t * conn)
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
conn_plain_read_cb(rb_fde_t * fd, void *data)
|
conn_plain_read_cb(rb_fde_t *fd, void *data)
|
||||||
{
|
{
|
||||||
conn_t *conn = data;
|
conn_t *conn = data;
|
||||||
int length = 0;
|
int length = 0;
|
||||||
|
@ -500,7 +503,7 @@ conn_plain_read_cb(rb_fde_t * fd, void *data)
|
||||||
if(plain_check_cork(conn))
|
if(plain_check_cork(conn))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
while (1)
|
while(1)
|
||||||
{
|
{
|
||||||
if(IsDead(conn))
|
if(IsDead(conn))
|
||||||
return;
|
return;
|
||||||
|
@ -535,7 +538,7 @@ conn_plain_read_cb(rb_fde_t * fd, void *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
conn_mod_read_cb(rb_fde_t * fd, void *data)
|
conn_mod_read_cb(rb_fde_t *fd, void *data)
|
||||||
{
|
{
|
||||||
conn_t *conn = data;
|
conn_t *conn = data;
|
||||||
const char *err = remote_closed;
|
const char *err = remote_closed;
|
||||||
|
@ -553,7 +556,7 @@ conn_mod_read_cb(rb_fde_t * fd, void *data)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (1)
|
while(1)
|
||||||
{
|
{
|
||||||
if(IsDead(conn))
|
if(IsDead(conn))
|
||||||
return;
|
return;
|
||||||
|
@ -562,7 +565,8 @@ conn_mod_read_cb(rb_fde_t * fd, void *data)
|
||||||
|
|
||||||
if(length == 0 || (length < 0 && !rb_ignore_errno(errno)))
|
if(length == 0 || (length < 0 && !rb_ignore_errno(errno)))
|
||||||
{
|
{
|
||||||
if(length == 0) {
|
if(length == 0)
|
||||||
|
{
|
||||||
close_conn(conn, WAIT_PLAIN, "%s", remote_closed);
|
close_conn(conn, WAIT_PLAIN, "%s", remote_closed);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -586,7 +590,7 @@ conn_mod_read_cb(rb_fde_t * fd, void *data)
|
||||||
}
|
}
|
||||||
conn_plain_write_sendq(conn->plain_fd, conn);
|
conn_plain_write_sendq(conn->plain_fd, conn);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
conn->mod_in += length;
|
conn->mod_in += length;
|
||||||
#ifdef HAVE_LIBZ
|
#ifdef HAVE_LIBZ
|
||||||
if(IsZip(conn))
|
if(IsZip(conn))
|
||||||
|
@ -598,7 +602,7 @@ conn_mod_read_cb(rb_fde_t * fd, void *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
conn_plain_write_sendq(rb_fde_t * fd, void *data)
|
conn_plain_write_sendq(rb_fde_t *fd, void *data)
|
||||||
{
|
{
|
||||||
conn_t *conn = data;
|
conn_t *conn = data;
|
||||||
int retlen;
|
int retlen;
|
||||||
|
@ -606,7 +610,7 @@ conn_plain_write_sendq(rb_fde_t * fd, void *data)
|
||||||
if(IsDead(conn))
|
if(IsDead(conn))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
while ((retlen = rb_rawbuf_flush(conn->plainbuf_out, fd)) > 0)
|
while((retlen = rb_rawbuf_flush(conn->plainbuf_out, fd)) > 0)
|
||||||
{
|
{
|
||||||
conn->plain_out += retlen;
|
conn->plain_out += retlen;
|
||||||
}
|
}
|
||||||
|
@ -615,7 +619,7 @@ conn_plain_write_sendq(rb_fde_t * fd, void *data)
|
||||||
close_conn(data, NO_WAIT, NULL);
|
close_conn(data, NO_WAIT, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(rb_rawbuf_length(conn->plainbuf_out) > 0)
|
if(rb_rawbuf_length(conn->plainbuf_out) > 0)
|
||||||
rb_setselect(conn->plain_fd, RB_SELECT_WRITE, conn_plain_write_sendq, conn);
|
rb_setselect(conn->plain_fd, RB_SELECT_WRITE, conn_plain_write_sendq, conn);
|
||||||
|
@ -638,7 +642,7 @@ maxconn(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ssl_process_accept_cb(rb_fde_t * F, int status, struct sockaddr *addr, rb_socklen_t len, void *data)
|
ssl_process_accept_cb(rb_fde_t *F, int status, struct sockaddr *addr, rb_socklen_t len, void *data)
|
||||||
{
|
{
|
||||||
conn_t *conn = data;
|
conn_t *conn = data;
|
||||||
if(status == RB_OK)
|
if(status == RB_OK)
|
||||||
|
@ -653,7 +657,7 @@ ssl_process_accept_cb(rb_fde_t * F, int status, struct sockaddr *addr, rb_sockle
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ssl_process_connect_cb(rb_fde_t * F, int status, void *data)
|
ssl_process_connect_cb(rb_fde_t *F, int status, void *data)
|
||||||
{
|
{
|
||||||
conn_t *conn = data;
|
conn_t *conn = data;
|
||||||
if(status == RB_OK)
|
if(status == RB_OK)
|
||||||
|
@ -686,7 +690,7 @@ ssl_process_accept(mod_ctl_t * ctl, mod_ctl_buf_t * ctlb)
|
||||||
|
|
||||||
if(rb_get_type(conn->mod_fd) & RB_FD_UNKNOWN)
|
if(rb_get_type(conn->mod_fd) & RB_FD_UNKNOWN)
|
||||||
{
|
{
|
||||||
|
|
||||||
rb_set_type(conn->mod_fd, RB_FD_SOCKET);
|
rb_set_type(conn->mod_fd, RB_FD_SOCKET);
|
||||||
}
|
}
|
||||||
if(rb_get_type(conn->mod_fd) == RB_FD_UNKNOWN)
|
if(rb_get_type(conn->mod_fd) == RB_FD_UNKNOWN)
|
||||||
|
@ -730,7 +734,7 @@ process_stats(mod_ctl_t * ctl, mod_ctl_buf_t * ctlb)
|
||||||
|
|
||||||
if(id < 0)
|
if(id < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
odata = &ctlb->buf[5];
|
odata = &ctlb->buf[5];
|
||||||
conn = conn_find_by_id(id);
|
conn = conn_find_by_id(id);
|
||||||
|
|
||||||
|
@ -748,10 +752,10 @@ process_stats(mod_ctl_t * ctl, mod_ctl_buf_t * ctlb)
|
||||||
|
|
||||||
#ifdef HAVE_LIBZ
|
#ifdef HAVE_LIBZ
|
||||||
static void
|
static void
|
||||||
zlib_send_zip_ready(mod_ctl_t *ctl, conn_t *conn)
|
zlib_send_zip_ready(mod_ctl_t * ctl, conn_t * conn)
|
||||||
{
|
{
|
||||||
char buf[5];
|
char buf[5];
|
||||||
|
|
||||||
buf[0] = 'R';
|
buf[0] = 'R';
|
||||||
int32_to_buf(&buf[1], conn->id);
|
int32_to_buf(&buf[1], conn->id);
|
||||||
mod_cmd_write_queue(conn->ctl, buf, sizeof(buf));
|
mod_cmd_write_queue(conn->ctl, buf, sizeof(buf));
|
||||||
|
@ -778,22 +782,22 @@ zlib_process(mod_ctl_t * ctl, mod_ctl_buf_t * ctlb)
|
||||||
id = buf_to_int32(&ctlb->buf[1]);
|
id = buf_to_int32(&ctlb->buf[1]);
|
||||||
conn_add_id_hash(conn, id);
|
conn_add_id_hash(conn, id);
|
||||||
|
|
||||||
level = (uint8_t) ctlb->buf[5];
|
level = (uint8_t)ctlb->buf[5];
|
||||||
|
|
||||||
recvqlen = ctlb->buflen - hdr;
|
recvqlen = ctlb->buflen - hdr;
|
||||||
recvq_start = &ctlb->buf[6];
|
recvq_start = &ctlb->buf[6];
|
||||||
|
|
||||||
SetZip(conn);
|
SetZip(conn);
|
||||||
conn->stream = rb_malloc(sizeof(zlib_stream_t));
|
conn->stream = rb_malloc(sizeof(zlib_stream_t));
|
||||||
instream = &((zlib_stream_t *)conn->stream)->instream;
|
instream = &((zlib_stream_t *) conn->stream)->instream;
|
||||||
outstream = &((zlib_stream_t *)conn->stream)->outstream;
|
outstream = &((zlib_stream_t *) conn->stream)->outstream;
|
||||||
|
|
||||||
instream->total_in = 0;
|
instream->total_in = 0;
|
||||||
instream->total_out = 0;
|
instream->total_out = 0;
|
||||||
instream->zalloc = (alloc_func) ssld_alloc;
|
instream->zalloc = (alloc_func) ssld_alloc;
|
||||||
instream->zfree = (free_func) ssld_free;
|
instream->zfree = (free_func) ssld_free;
|
||||||
instream->data_type = Z_ASCII;
|
instream->data_type = Z_ASCII;
|
||||||
inflateInit(&((zlib_stream_t *)conn->stream)->instream);
|
inflateInit(&((zlib_stream_t *) conn->stream)->instream);
|
||||||
|
|
||||||
outstream->total_in = 0;
|
outstream->total_in = 0;
|
||||||
outstream->total_out = 0;
|
outstream->total_out = 0;
|
||||||
|
@ -804,7 +808,7 @@ zlib_process(mod_ctl_t * ctl, mod_ctl_buf_t * ctlb)
|
||||||
if(level > 9)
|
if(level > 9)
|
||||||
level = Z_DEFAULT_COMPRESSION;
|
level = Z_DEFAULT_COMPRESSION;
|
||||||
|
|
||||||
deflateInit(&((zlib_stream_t *)conn->stream)->outstream, level);
|
deflateInit(&((zlib_stream_t *) conn->stream)->outstream, level);
|
||||||
if(recvqlen > 0)
|
if(recvqlen > 0)
|
||||||
common_zlib_inflate(conn, recvq_start, recvqlen);
|
common_zlib_inflate(conn, recvq_start, recvqlen);
|
||||||
zlib_send_zip_ready(ctl, conn);
|
zlib_send_zip_ready(ctl, conn);
|
||||||
|
@ -820,8 +824,8 @@ init_prng(mod_ctl_t * ctl, mod_ctl_buf_t * ctl_buf)
|
||||||
{
|
{
|
||||||
char *path;
|
char *path;
|
||||||
prng_seed_t seed_type;
|
prng_seed_t seed_type;
|
||||||
|
|
||||||
seed_type = (prng_seed_t)ctl_buf->buf[1];
|
seed_type = (prng_seed_t) ctl_buf->buf[1];
|
||||||
path = &ctl_buf->buf[2];
|
path = &ctl_buf->buf[2];
|
||||||
rb_init_prng(path, seed_type);
|
rb_init_prng(path, seed_type);
|
||||||
}
|
}
|
||||||
|
@ -847,37 +851,37 @@ ssl_new_keys(mod_ctl_t * ctl, mod_ctl_buf_t * ctl_buf)
|
||||||
const char *invalid = "I";
|
const char *invalid = "I";
|
||||||
mod_cmd_write_queue(ctl, invalid, strlen(invalid));
|
mod_cmd_write_queue(ctl, invalid, strlen(invalid));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
send_nossl_support(mod_ctl_t *ctl, mod_ctl_buf_t *ctlb)
|
send_nossl_support(mod_ctl_t * ctl, mod_ctl_buf_t * ctlb)
|
||||||
{
|
{
|
||||||
static const char *nossl_cmd = "N";
|
static const char *nossl_cmd = "N";
|
||||||
conn_t *conn;
|
conn_t *conn;
|
||||||
int32_t id;
|
int32_t id;
|
||||||
|
|
||||||
if(ctlb != NULL)
|
if(ctlb != NULL)
|
||||||
{
|
{
|
||||||
conn = make_conn(ctl, ctlb->F[0], ctlb->F[1]);
|
conn = make_conn(ctl, ctlb->F[0], ctlb->F[1]);
|
||||||
id = buf_to_int32(&ctlb->buf[1]);
|
id = buf_to_int32(&ctlb->buf[1]);
|
||||||
|
|
||||||
if(id >= 0)
|
if(id >= 0)
|
||||||
conn_add_id_hash(conn, id);
|
conn_add_id_hash(conn, id);
|
||||||
close_conn(conn, WAIT_PLAIN, "libratbox reports no SSL/TLS support");
|
close_conn(conn, WAIT_PLAIN, "libratbox reports no SSL/TLS support");
|
||||||
}
|
}
|
||||||
mod_cmd_write_queue(ctl, nossl_cmd, strlen(nossl_cmd));
|
mod_cmd_write_queue(ctl, nossl_cmd, strlen(nossl_cmd));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
send_i_am_useless(mod_ctl_t *ctl)
|
send_i_am_useless(mod_ctl_t * ctl)
|
||||||
{
|
{
|
||||||
static const char *useless = "U";
|
static const char *useless = "U";
|
||||||
mod_cmd_write_queue(ctl, useless, strlen(useless));
|
mod_cmd_write_queue(ctl, useless, strlen(useless));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
send_nozlib_support(mod_ctl_t *ctl, mod_ctl_buf_t *ctlb)
|
send_nozlib_support(mod_ctl_t * ctl, mod_ctl_buf_t * ctlb)
|
||||||
{
|
{
|
||||||
static const char *nozlib_cmd = "z";
|
static const char *nozlib_cmd = "z";
|
||||||
conn_t *conn;
|
conn_t *conn;
|
||||||
|
@ -890,7 +894,7 @@ send_nozlib_support(mod_ctl_t *ctl, mod_ctl_buf_t *ctlb)
|
||||||
if(id >= 0)
|
if(id >= 0)
|
||||||
conn_add_id_hash(conn, id);
|
conn_add_id_hash(conn, id);
|
||||||
close_conn(conn, WAIT_PLAIN, "libratbox reports no zlib support");
|
close_conn(conn, WAIT_PLAIN, "libratbox reports no zlib support");
|
||||||
}
|
}
|
||||||
mod_cmd_write_queue(ctl, nozlib_cmd, strlen(nozlib_cmd));
|
mod_cmd_write_queue(ctl, nozlib_cmd, strlen(nozlib_cmd));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -938,8 +942,8 @@ mod_process_cmd_recv(mod_ctl_t * ctl)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'I':
|
case 'I':
|
||||||
init_prng(ctl, ctl_buf);
|
init_prng(ctl, ctl_buf);
|
||||||
break;
|
break;
|
||||||
case 'S':
|
case 'S':
|
||||||
{
|
{
|
||||||
process_stats(ctl, ctl_buf);
|
process_stats(ctl, ctl_buf);
|
||||||
|
@ -957,7 +961,7 @@ mod_process_cmd_recv(mod_ctl_t * ctl)
|
||||||
case 'Z':
|
case 'Z':
|
||||||
send_nozlib_support(ctl, ctl_buf);
|
send_nozlib_support(ctl, ctl_buf);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -973,7 +977,7 @@ mod_process_cmd_recv(mod_ctl_t * ctl)
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mod_read_ctl(rb_fde_t * F, void *data)
|
mod_read_ctl(rb_fde_t *F, void *data)
|
||||||
{
|
{
|
||||||
mod_ctl_buf_t *ctl_buf;
|
mod_ctl_buf_t *ctl_buf;
|
||||||
mod_ctl_t *ctl = data;
|
mod_ctl_t *ctl = data;
|
||||||
|
@ -997,7 +1001,7 @@ mod_read_ctl(rb_fde_t * F, void *data)
|
||||||
rb_dlinkAddTail(ctl_buf, &ctl_buf->node, &ctl->readq);
|
rb_dlinkAddTail(ctl_buf, &ctl_buf->node, &ctl->readq);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (retlen > 0);
|
while(retlen > 0);
|
||||||
|
|
||||||
if(retlen == 0 || (retlen < 0 && !rb_ignore_errno(errno)))
|
if(retlen == 0 || (retlen < 0 && !rb_ignore_errno(errno)))
|
||||||
exit(0);
|
exit(0);
|
||||||
|
@ -1007,7 +1011,7 @@ mod_read_ctl(rb_fde_t * F, void *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mod_write_ctl(rb_fde_t * F, void *data)
|
mod_write_ctl(rb_fde_t *F, void *data)
|
||||||
{
|
{
|
||||||
mod_ctl_t *ctl = data;
|
mod_ctl_t *ctl = data;
|
||||||
mod_ctl_buf_t *ctl_buf;
|
mod_ctl_buf_t *ctl_buf;
|
||||||
|
@ -1018,29 +1022,29 @@ mod_write_ctl(rb_fde_t * F, void *data)
|
||||||
{
|
{
|
||||||
ctl_buf = ptr->data;
|
ctl_buf = ptr->data;
|
||||||
retlen = rb_send_fd_buf(ctl->F, ctl_buf->F, ctl_buf->nfds, ctl_buf->buf,
|
retlen = rb_send_fd_buf(ctl->F, ctl_buf->F, ctl_buf->nfds, ctl_buf->buf,
|
||||||
ctl_buf->buflen);
|
ctl_buf->buflen, ppid);
|
||||||
if(retlen > 0)
|
if(retlen > 0)
|
||||||
{
|
{
|
||||||
rb_dlinkDelete(ptr, &ctl->writeq);
|
rb_dlinkDelete(ptr, &ctl->writeq);
|
||||||
for (x = 0; x < ctl_buf->nfds; x++)
|
for(x = 0; x < ctl_buf->nfds; x++)
|
||||||
rb_close(ctl_buf->F[x]);
|
rb_close(ctl_buf->F[x]);
|
||||||
rb_free(ctl_buf->buf);
|
rb_free(ctl_buf->buf);
|
||||||
rb_free(ctl_buf);
|
rb_free(ctl_buf);
|
||||||
|
|
||||||
}
|
}
|
||||||
if(retlen == 0 || (retlen < 0 && !rb_ignore_errno(errno)))
|
if(retlen == 0 || (retlen < 0 && !rb_ignore_errno(errno)))
|
||||||
exit(0);
|
exit(0);
|
||||||
|
|
||||||
rb_setselect(ctl->F, RB_SELECT_WRITE, mod_write_ctl, ctl);
|
rb_setselect(ctl->F, RB_SELECT_WRITE, mod_write_ctl, ctl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
read_pipe_ctl(rb_fde_t * F, void *data)
|
read_pipe_ctl(rb_fde_t *F, void *data)
|
||||||
{
|
{
|
||||||
int retlen;
|
int retlen;
|
||||||
while ((retlen = rb_read(F, inbuf, sizeof(inbuf))) > 0)
|
while((retlen = rb_read(F, inbuf, sizeof(inbuf))) > 0)
|
||||||
{
|
{
|
||||||
;; /* we don't do anything with the pipe really, just care if the other process dies.. */
|
;; /* we don't do anything with the pipe really, just care if the other process dies.. */
|
||||||
}
|
}
|
||||||
|
@ -1053,29 +1057,34 @@ read_pipe_ctl(rb_fde_t * F, void *data)
|
||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
const char *s_ctlfd, *s_pipe;
|
const char *s_ctlfd, *s_pipe, *s_pid;
|
||||||
int ctlfd, pipefd, x, maxfd;
|
int ctlfd, pipefd, x, maxfd;
|
||||||
maxfd = maxconn();
|
maxfd = maxconn();
|
||||||
|
|
||||||
s_ctlfd = getenv("CTL_FD");
|
s_ctlfd = getenv("CTL_FD");
|
||||||
s_pipe = getenv("CTL_PIPE");
|
s_pipe = getenv("CTL_PIPE");
|
||||||
|
s_pid = getenv("CTL_PPID");
|
||||||
|
|
||||||
if(s_ctlfd == NULL || s_pipe == NULL)
|
if(s_ctlfd == NULL || s_pipe == NULL || s_pid == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "This is ircd-ratbox ssld. You know you aren't supposed to run me directly?\n");
|
fprintf(stderr,
|
||||||
fprintf(stderr, "You get an Id tag for this: $Id: ssld.c 25677 2008-07-06 04:21:42Z androsyn $\n");
|
"This is ircd-ratbox ssld. You know you aren't supposed to run me directly?\n");
|
||||||
|
fprintf(stderr,
|
||||||
|
"You get an Id tag for this: $Id$\n");
|
||||||
fprintf(stderr, "Have a nice life\n");
|
fprintf(stderr, "Have a nice life\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
ctlfd = atoi(s_ctlfd);
|
ctlfd = atoi(s_ctlfd);
|
||||||
pipefd = atoi(s_pipe);
|
pipefd = atoi(s_pipe);
|
||||||
|
ppid = atoi(s_pid);
|
||||||
for (x = 0; x < maxfd; x++)
|
x = 0;
|
||||||
|
#ifndef _WIN32
|
||||||
|
for(x = 0; x < maxfd; x++)
|
||||||
{
|
{
|
||||||
if(x != ctlfd && x != pipefd && x > 2)
|
if(x != ctlfd && x != pipefd && x > 2)
|
||||||
close(x);
|
close(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
x = open("/dev/null", O_RDWR);
|
x = open("/dev/null", O_RDWR);
|
||||||
if(x >= 0)
|
if(x >= 0)
|
||||||
{
|
{
|
||||||
|
@ -1088,12 +1097,11 @@ main(int argc, char **argv)
|
||||||
if(x > 2)
|
if(x > 2)
|
||||||
close(x);
|
close(x);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
setup_signals();
|
setup_signals();
|
||||||
rb_lib_init(NULL, NULL, NULL, 0, maxfd, 1024, 4096);
|
rb_lib_init(NULL, NULL, NULL, 0, maxfd, 1024, 4096);
|
||||||
rb_init_rawbuffers(1024);
|
rb_init_rawbuffers(1024);
|
||||||
ssl_ok = rb_supports_ssl();
|
ssl_ok = rb_supports_ssl();
|
||||||
|
|
||||||
mod_ctl = rb_malloc(sizeof(mod_ctl_t));
|
mod_ctl = rb_malloc(sizeof(mod_ctl_t));
|
||||||
mod_ctl->F = rb_open(ctlfd, RB_FD_SOCKET, "ircd control socket");
|
mod_ctl->F = rb_open(ctlfd, RB_FD_SOCKET, "ircd control socket");
|
||||||
mod_ctl->F_pipe = rb_open(pipefd, RB_FD_PIPE, "ircd pipe");
|
mod_ctl->F_pipe = rb_open(pipefd, RB_FD_PIPE, "ircd pipe");
|
||||||
|
@ -1108,7 +1116,7 @@ main(int argc, char **argv)
|
||||||
/* this is really useless... */
|
/* this is really useless... */
|
||||||
send_i_am_useless(mod_ctl);
|
send_i_am_useless(mod_ctl);
|
||||||
/* sleep until the ircd kills us */
|
/* sleep until the ircd kills us */
|
||||||
rb_sleep(2<<30, 0);
|
rb_sleep(2 << 30, 0);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1121,16 +1129,18 @@ main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
static void
|
static void
|
||||||
dummy_handler(int sig)
|
dummy_handler(int sig)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
setup_signals()
|
setup_signals()
|
||||||
{
|
{
|
||||||
|
#ifndef _WIN32
|
||||||
struct sigaction act;
|
struct sigaction act;
|
||||||
|
|
||||||
act.sa_flags = 0;
|
act.sa_flags = 0;
|
||||||
|
@ -1153,5 +1163,5 @@ setup_signals()
|
||||||
|
|
||||||
act.sa_handler = dummy_handler;
|
act.sa_handler = dummy_handler;
|
||||||
sigaction(SIGALRM, &act, 0);
|
sigaction(SIGALRM, &act, 0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue