libratbox sync - r25796

This commit is contained in:
Valery Yatsko 2008-07-30 02:41:27 +04:00
parent ea3ab4a938
commit a9fb3ed0f9
24 changed files with 1064 additions and 1756 deletions

View file

@ -1,3 +1,157 @@
androsyn 2008/07/29 15:26:55 UTC (25795)
Log:
some sanity checks in the rb_open path
Modified:
libratbox/trunk/src/commio.c (File Modified)
androsyn 2008/07/29 14:47:48 UTC (25793)
Log:
pass new_F along to rb_ssl_accept_setup instead of the fd itself
Modified:
libratbox/trunk/include/commio-ssl.h (File Modified)
libratbox/trunk/src/commio.c (File Modified)
libratbox/trunk/src/gnutls.c (File Modified)
libratbox/trunk/src/nossl.c (File Modified)
libratbox/trunk/src/openssl.c (File Modified)
androsyn 2008/07/28 23:14:29 UTC (25791)
Log:
log if rb_open returns NULL on accept and close the fd..this shouldn't happen and the real cause needs to be found
Modified:
libratbox/trunk/src/commio.c (File Modified)
androsyn 2008/07/11 18:21:57 UTC (25705)
Log:
add a newline at the end of arc4random.c
Modified:
libratbox/trunk/src/arc4random.c (File Modified)
androsyn 2008/07/10 18:34:03 UTC (25699)
Log:
i'm doing good today..move the ifdefs down
Modified:
libratbox/trunk/src/arc4random.c (File Modified)
androsyn 2008/07/10 18:32:34 UTC (25697)
Log:
remove some debugging code
Modified:
libratbox/trunk/src/arc4random.c (File Modified)
libratbox/trunk/src/nossl.c (File Modified)
androsyn 2008/07/10 18:30:19 UTC (25695)
Log:
add a missing ; and add arc4random.h too
Modified:
libratbox/trunk/include/arc4random.h (File Added)
libratbox/trunk/src/openssl.c (File Modified)
androsyn 2008/07/10 18:27:23 UTC (25693)
Log:
forgot a prototype for rb_get_pseudo_random
Modified:
libratbox/trunk/include/rb_commio.h (File Modified)
androsyn 2008/07/10 18:05:43 UTC (25691)
Log:
fix a typo
Modified:
libratbox/trunk/src/nossl.c (File Modified)
androsyn 2008/07/10 17:13:27 UTC (25689)
Log:
- Add arc4random as a source for random bytes in the nossl.c case.
- Add in a pseudo random source function as well. This is really only different on OpenSSL.
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.am (File Modified)
libratbox/trunk/src/Makefile.in (File Modified)
libratbox/trunk/src/arc4random.c (File Added)
libratbox/trunk/src/export-syms.txt (File Modified)
libratbox/trunk/src/gnutls.c (File Modified)
libratbox/trunk/src/nossl.c (File Modified)
libratbox/trunk/src/openssl.c (File Modified)
androsyn 2008/07/06 18:57:15 UTC (25683)
Log:
change a rb_uint8_t to uint8_t
Modified:
libratbox/trunk/configure (File Modified)
libratbox/trunk/configure.ac (File Modified)
androsyn 2008/07/06 05:15:22 UTC (25681)
Log:
fix the socklen_t stuff
Modified:
libratbox/trunk/configure (File Modified)
libratbox/trunk/configure.ac (File Modified)
libratbox/trunk/include/libratbox_config.h.in (File Modified)
androsyn 2008/07/06 04:33:03 UTC (25679)
Log:
get rid of some testing code that snuck into the last commit
Modified:
libratbox/trunk/configure (File Modified)
libratbox/trunk/configure.ac (File Modified)
androsyn 2008/07/06 04:13:05 UTC (25675)
Log:
remove the rb_uint/rb_int stuff as we require a C99 compiler and this is standard now. Also add a better check for socklen_t
Modified:
libratbox/trunk/acinclude.m4 (File Modified)
libratbox/trunk/configure (File Modified)
libratbox/trunk/configure.ac (File Modified)
libratbox/trunk/include/commio-int.h (File Modified)
libratbox/trunk/include/libratbox_config.h.in (File Modified)
libratbox/trunk/include/rb_commio.h (File Modified)
libratbox/trunk/include/rb_linebuf.h (File Modified)
libratbox/trunk/src/Makefile.in (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/epoll.c (File Modified)
libratbox/trunk/src/rawbuf.c (File Modified)
androsyn 2008/07/06 03:10:23 UTC (25673)
Log:
a few minor cleanups
Modified:
libratbox/trunk/src/commio.c (File Modified)
androsyn 2008/06/24 14:04:50 UTC (25588)
Log:
move some of the common accept code into a function

View file

@ -22,84 +22,6 @@ AC_DEFUN([AC_SUBST_DIR], [
])
# RB_TYPE_INTMAX_T
# -----------------
AC_DEFUN([RB_TYPE_INTMAX_T],
[
AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
AC_CHECK_TYPE([intmax_t],
[AC_DEFINE([HAVE_INTMAX_T], 1,
[Define to 1 if the system has the type `intmax_t'.]) ac_cv_c_intmax_t=yes],
[test $ac_cv_type_long_long_int = yes \
&& ac_type='long long int' \
|| ac_type='long int'
AC_DEFINE_UNQUOTED([intmax_t], [$ac_type],
[Define to the widest signed integer type
if <stdint.h> and <inttypes.h> do not define.]) ac_cv_c_intmax_t="$ac_type"])
])
# RB_TYPE_UINTMAX_T
# -----------------
AC_DEFUN([RB_TYPE_UINTMAX_T],
[
AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
AC_CHECK_TYPE([uintmax_t],
[AC_DEFINE([HAVE_UINTMAX_T], 1,
[Define to 1 if the system has the type `uintmax_t'.]) ac_cv_c_uintmax_t=yes],
[test $ac_cv_type_unsigned_long_long_int = yes \
&& ac_type='unsigned long long int' \
|| ac_type='unsigned long int'
AC_DEFINE_UNQUOTED([uintmax_t], [$ac_type],
[Define to the widest unsigned integer type
if <stdint.h> and <inttypes.h> do not define.]) ac_cv_c_uintmax_t="$ac_type"])
])
# RB_TYPE_INTPTR_T
# -----------------
AC_DEFUN([RB_TYPE_INTPTR_T],
[
AC_CHECK_TYPE([intptr_t],
[AC_DEFINE([HAVE_INTPTR_T], 1,
[Define to 1 if the system has the type `intptr_t'.]) ac_cv_c_intptr_t=yes],
[for ac_type in 'int' 'long int' 'long long int'; do
AC_COMPILE_IFELSE(
[AC_LANG_BOOL_COMPILE_TRY(
[AC_INCLUDES_DEFAULT],
[[sizeof (void *) <= sizeof ($ac_type)]])],
[AC_DEFINE_UNQUOTED([intptr_t], [$ac_type],
[Define to the type of a signed integer type wide enough to
hold a pointer, if such a type exists, and if the system
does not define it.]) ac_cv_c_intptr_t="$ac_type"
ac_type=])
test -z "$ac_type" && break
done])
])
# RB_TYPE_UINTPTR_T
# -----------------
AC_DEFUN([RB_TYPE_UINTPTR_T],
[
AC_CHECK_TYPE([uintptr_t],
[AC_DEFINE([HAVE_UINTPTR_T], 1,
[Define to 1 if the system has the type `uintptr_t'.]) ac_cv_c_uintptr_t=yes],
[for ac_type in 'unsigned int' 'unsigned long int' \
'unsigned long long int'; do
AC_COMPILE_IFELSE(
[AC_LANG_BOOL_COMPILE_TRY(
[AC_INCLUDES_DEFAULT],
[[sizeof (void *) <= sizeof ($ac_type)]])],
[AC_DEFINE_UNQUOTED([uintptr_t], [$ac_type],
[Define to the type of an unsigned integer type wide enough to
hold a pointer, if such a type exists, and if the system
does not define it.]) ac_cv_c_uintptr_t="$ac_type"
ac_type=])
test -z "$ac_type" && break
done])
])
dnl IPv6 support macros..pretty much swiped from wget
dnl RB_PROTO_INET6

1482
libratbox/configure vendored

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,4 @@
dnl $Id: configure.ac 25574 2008-06-20 21:49:06Z androsyn $
dnl $Id: configure.ac 25689 2008-07-10 17:13:27Z androsyn $
dnl Process this file with autoconf to produce a configure script.
dnl TODO: clean up all the OpenSSL and shared module checking stuff;
@ -8,7 +8,7 @@ dnl said functions need to be just about as complex as they already are.
AC_PREREQ(2.60)
AUTOMAKE_OPTIONS = 1.10
dnl Sneaky way to get an Id tag into the configure script
AC_COPYRIGHT([$Id: configure.ac 25574 2008-06-20 21:49:06Z androsyn $])
AC_COPYRIGHT([$Id: configure.ac 25689 2008-07-10 17:13:27Z androsyn $])
AC_INIT([libratbox],[devel])
AM_INIT_AUTOMAKE(AC_PACKAGE_TARNAME, AC_PACKAGE_VERSION, -)
@ -99,20 +99,6 @@ if test "$libexecdir" = '${exec_prefix}/libexec' &&
localstatedir='${prefix}'
fi
AC_TYPE_INT8_T
AC_TYPE_INT16_T
AC_TYPE_INT32_T
AC_TYPE_INT64_T
AC_TYPE_UINT8_T
AC_TYPE_UINT16_T
AC_TYPE_UINT32_T
AC_TYPE_UINT64_T
RB_TYPE_INTPTR_T
RB_TYPE_INTMAX_T
RB_TYPE_UINTMAX_T
RB_TYPE_UINTPTR_T
AC_TYPE_PID_T
AC_TYPE_SIZE_T
AC_TYPE_SSIZE_T
@ -144,21 +130,41 @@ member.])],,[[
#endif
]])
AC_CHECK_TYPE(socklen_t, ,
[AC_DEFINE([socklen_t], [unsigned int],
[If we don't have a real socklen_t, unsigned int is good enough.])],
AC_CHECK_TYPE([socklen_t], rb_socklen_t=socklen_t,[
AC_MSG_CHECKING([for socklen_t equivalent])
AC_CACHE_VAL([rb_socklen_t],
[
#ifdef HAVE_SYS_TYPES_H
# Systems have either "struct sockaddr *" or
# "void *" as the second argument to getpeername
rb_socklen_t=
for arg2 in "struct sockaddr" void; do
for t in int size_t unsigned long "unsigned long"; do
AC_TRY_COMPILE([
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#ifdef HAVE_WINSOCK2_H
#include <winsock2.h>
#endif
int getpeername (int, $arg2 *, $t *);
],[
$t len;
getpeername(0,0,&len);
],[
rb_socklen_t="$t"
break
])
done
done
if test "x$rb_socklen_t" = x; then
AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
fi
])
AC_MSG_RESULT($rb_socklen_t)],
[#include <sys/types.h>
#include <sys/socket.h>])
AC_ARG_ENABLE(ipv6,AC_HELP_STRING([--disable-ipv6],[Disable IPv6 support]),[ipv6=$enableval],[ipv6=yes])
@ -218,7 +224,7 @@ AC_CHECK_TYPE([sa_family_t], [],
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])
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_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]))
@ -457,17 +463,6 @@ fi
AC_SUBST(RB_PREFIX)
for dtype in uint64_t uint32_t uint16_t uint8_t int64_t int32_t int16_t int8_t intmax_t intptr_t uintmax_t uintptr_t
do
var="\$ac_cv_c_${dtype}"
t_type=$(eval echo $var);
if test "x$t_type" = "xyes"; then
eval rb_$dtype="\"$dtype\""
else
eval rb_$dtype="\"$t_type\""
fi
done
AC_CONFIG_COMMANDS([include/librb-config.h],
[
outfile=include/librb-config.h.tmp
@ -552,28 +547,17 @@ if test "x$rb_errno_h" = "xyes"; then
echo '#include <errno.h>' >> $outfile
fi
echo "typedef $rb_socklen_t rb_socklen_t;" >> $outfile
if test "x$rb_sockaddr_sa_len" = "xyes"; then
echo '#define RB_SOCKADDR_HAS_SA_LEN 1' >> $outfile
fi
echo "typedef $rb_uint64_t rb_uint64_t;" >> $outfile
echo "typedef $rb_uint32_t rb_uint32_t;" >> $outfile
echo "typedef $rb_uint16_t rb_uint16_t;" >> $outfile
echo "typedef $rb_uint8_t rb_uint8_t;" >> $outfile
echo "typedef $rb_int64_t rb_int64_t;" >> $outfile
echo "typedef $rb_int32_t rb_int32_t;" >> $outfile
echo "typedef $rb_int16_t rb_int16_t;" >> $outfile
echo "typedef $rb_int8_t rb_int8_t;" >> $outfile
echo "typedef $rb_intmax_t rb_intmax_t;" >> $outfile
echo "typedef $rb_intptr_t rb_intptr_t;" >> $outfile
echo "typedef $rb_uintmax_t rb_uintmax_t;" >> $outfile
echo "typedef $rb_uintptr_t rb_uintptr_t;" >> $outfile
echo "typedef $rb_socklen_t rb_socklen_t;" >> $outfile
if test "x$rb_sockaddr_storage" = "xyes"; then
echo '#define rb_sockaddr_storage sockaddr_storage' >> $outfile
else
echo 'struct rb_sockaddr_storage { rb_uint8_t _padding[128]; };' >> $outfile
echo 'struct rb_sockaddr_storage { uint8_t _padding[128]; };' >> $outfile
fi
cat >> $outfile <<\_______EOF
@ -588,18 +572,6 @@ else
fi
],[
rb_uint64_t="$rb_uint64_t"
rb_uint32_t="$rb_uint32_t"
rb_uint16_t="$rb_uint16_t"
rb_uint8_t="$rb_uint8_t"
rb_int64_t="$rb_int64_t"
rb_int32_t="$rb_int32_t"
rb_int16_t="$rb_int16_t"
rb_int8_t="$rb_int8_t"
rb_intmax_t="$rb_intmax_t"
rb_intptr_t="$rb_intptr_t"
rb_uintmax_t="$rb_uintmax_t"
rb_uintptr_t="$rb_uintptr_t"
if test x$ac_cv_header_stdc = xyes; then
rb_header_stdc=yes
fi
@ -661,11 +633,9 @@ fi
if test x$ac_cv_header_winsock2_h = xyes; then
rb_winsock2_h=yes
fi
if test x$ac_cv_type_socklen_t = xyes; then
rb_socklen_t="socklen_t"
else
rb_socklen_t="unsigned int"
fi
rb_socklen_t=$rb_socklen_t
if test "x$rb_have_sockaddr_storage" = "xyes"; then
rb_sockaddr_storage="yes"
else

View file

@ -0,0 +1,7 @@
#if !defined(HAVE_OPENSSL) && !defined(HAVE_GNUTLS) && !defined(HAVE_ARC4RANDOM)
void arc4random_stir(void);
uint32_t arc4random(void);
void arc4random_addrandom(uint8_t *dat, int datlen);
#endif

View file

@ -103,8 +103,8 @@ struct _fde
*/
rb_dlink_node node;
int fd; /* So we can use the rb_fde_t as a callback ptr */
rb_uint8_t flags;
rb_uint8_t type;
uint8_t flags;
uint8_t type;
int pflags;
char *desc;
PF *read_handler;

View file

@ -9,7 +9,7 @@ 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_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_ssl_accept_setup(rb_fde_t *F, int new_fd, 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);
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);

View file

@ -18,6 +18,9 @@
*/
#undef HAVE_ALLOCA_H
/* Define to 1 if you have the `arc4random' function. */
#undef HAVE_ARC4RANDOM
/* Define to 1 if you have the <arpa/inet.h> header file. */
#undef HAVE_ARPA_INET_H
@ -45,6 +48,9 @@
/* Define to 1 if you have the `getpagesize' function. */
#undef HAVE_GETPAGESIZE
/* Define to 1 if you have the `getrusage' function. */
#undef HAVE_GETRUSAGE
/* Define to 1 if you have the `gettimeofday' function. */
#undef HAVE_GETTIMEOFDAY
@ -54,21 +60,12 @@
/* Has GnuTLS */
#undef HAVE_GNUTLS
/* Define to 1 if the system has the type `intmax_t'. */
#undef HAVE_INTMAX_T
/* Define to 1 if the system has the type `intptr_t'. */
#undef HAVE_INTPTR_T
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
/* Define to 1 if you have the `kevent' function. */
#undef HAVE_KEVENT
/* Define to 1 if the system has the type `long long int'. */
#undef HAVE_LONG_LONG_INT
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
@ -183,18 +180,9 @@
/* Define to 1 if you have the <time.h> header file. */
#undef HAVE_TIME_H
/* Define to 1 if the system has the type `uintmax_t'. */
#undef HAVE_UINTMAX_T
/* Define to 1 if the system has the type `uintptr_t'. */
#undef HAVE_UINTPTR_T
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* Define to 1 if the system has the type `unsigned long long int'. */
#undef HAVE_UNSIGNED_LONG_LONG_INT
/* Define to 1 if you have the `usleep' function. */
#undef HAVE_USLEEP
@ -280,21 +268,6 @@
# undef _GNU_SOURCE
#endif
/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
<pthread.h>, or <semaphore.h> is not used. If the typedef was allowed, the
#define below would cause a syntax error. */
#undef _UINT32_T
/* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>,
<pthread.h>, or <semaphore.h> is not used. If the typedef was allowed, the
#define below would cause a syntax error. */
#undef _UINT64_T
/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>,
<pthread.h>, or <semaphore.h> is not used. If the typedef was allowed, the
#define below would cause a syntax error. */
#undef _UINT8_T
/* Define to empty if `const' does not conform to ANSI C. */
#undef const
@ -307,30 +280,6 @@
#undef inline
#endif
/* Define to the type of a signed integer type of width exactly 16 bits if
such a type exists and the standard includes do not define it. */
#undef int16_t
/* Define to the type of a signed integer type of width exactly 32 bits if
such a type exists and the standard includes do not define it. */
#undef int32_t
/* Define to the type of a signed integer type of width exactly 64 bits if
such a type exists and the standard includes do not define it. */
#undef int64_t
/* Define to the type of a signed integer type of width exactly 8 bits if such
a type exists and the standard includes do not define it. */
#undef int8_t
/* Define to the widest signed integer type if <stdint.h> and <inttypes.h> do
not define. */
#undef intmax_t
/* Define to the type of a signed integer type wide enough to hold a pointer,
if such a type exists, and if the system does not define it. */
#undef intptr_t
/* Define to `int' if <sys/types.h> does not define. */
#undef pid_t
@ -340,38 +289,11 @@
/* Define to `unsigned int' if <sys/types.h> does not define. */
#undef size_t
/* If we don't have a real socklen_t, unsigned int is good enough. */
#undef socklen_t
/* Define to `int' if <sys/types.h> does not define. */
#undef ssize_t
/* Define to `int' if <sys/types.h> doesn't define. */
#undef uid_t
/* Define to the type of an unsigned integer type of width exactly 16 bits if
such a type exists and the standard includes do not define it. */
#undef uint16_t
/* Define to the type of an unsigned integer type of width exactly 32 bits if
such a type exists and the standard includes do not define it. */
#undef uint32_t
/* Define to the type of an unsigned integer type of width exactly 64 bits if
such a type exists and the standard includes do not define it. */
#undef uint64_t
/* Define to the type of an unsigned integer type of width exactly 8 bits if
such a type exists and the standard includes do not define it. */
#undef uint8_t
/* Define to the widest unsigned integer type if <stdint.h> and <inttypes.h>
do not define. */
#undef uintmax_t
/* Define to the type of an unsigned integer type wide enough to hold a
pointer, if such a type exists, and if the system does not define it. */
#undef uintptr_t
/* Define as `fork' if `vfork' does not work. */
#undef vfork

View file

@ -0,0 +1,374 @@
/* include/libratbox_config.h.in. Generated from configure.ac by autoheader. */
/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
systems. This function is required for `alloca.c' support on those systems.
*/
#undef CRAY_STACKSEG_END
/* This is a Cygwin system */
#undef CYGWIN
/* Define to 1 if using `alloca.c'. */
#undef C_ALLOCA
/* Define to 1 if you have `alloca', as a function or macro. */
#define HAVE_ALLOCA 1
/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
*/
#undef HAVE_ALLOCA_H
/* Define to 1 if you have the <arpa/inet.h> header file. */
#define HAVE_ARPA_INET_H 1
/* Define to 1 if you have the <crypt.h> header file. */
#undef HAVE_CRYPT_H
/* Define to 1 if you have devpoll */
#undef HAVE_DEVPOLL
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
/* Define to 1 if you have the `epoll_ctl' function. */
#undef HAVE_EPOLL_CTL
/* Define to 1 if you have the <errno.h> header file. */
#define HAVE_ERRNO_H 1
/* Define to 1 if you have the `fork' function. */
#undef HAVE_FORK
/* Define to 1 if you have the `fstat' function. */
#define HAVE_FSTAT 1
/* Define to 1 if you have the `getpagesize' function. */
#define HAVE_GETPAGESIZE 1
/* Define to 1 if you have the `gettimeofday' function. */
#define HAVE_GETTIMEOFDAY 1
/* Define to 1 if you have the `gmtime_r' function. */
#define HAVE_GMTIME_R 1
/* Define to 1 if the system has the type `intmax_t'. */
#define HAVE_INTMAX_T 1
/* Define to 1 if the system has the type `intptr_t'. */
#define HAVE_INTPTR_T 1
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
/* Define to 1 if you have the `kevent' function. */
#undef HAVE_KEVENT
/* Define to 1 if the system has the type `long long int'. */
#define HAVE_LONG_LONG_INT 1
/* Define to 1 if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1
/* Define to 1 if you have a working `mmap' system call. */
#define HAVE_MMAP 1
/* Define if you have nanosleep */
#define HAVE_NANOSLEEP 1
/* Define to 1 if you have the <netinet/in.h> header file. */
#define HAVE_NETINET_IN_H 1
/* Has OpenSSL */
#undef HAVE_OPENSSL
/* Define to 1 if you have the `poll' function. */
#define HAVE_POLL 1
/* Define to 1 if you have the `port_create' function. */
#undef HAVE_PORT_CREATE
/* Define to 1 if you have the <port.h> header file. */
#undef HAVE_PORT_H
/* Define to 1 if you have the `posix_spawn' function. */
#define HAVE_POSIX_SPAWN 1
/* Define to 1 if you have the `select' function. */
#define HAVE_SELECT 1
/* Define to 1 if you have the `sendmsg' function. */
#define HAVE_SENDMSG 1
/* Define to 1 if you have the `signalfd' function. */
#undef HAVE_SIGNALFD
/* Define to 1 if you have the <signal.h> header file. */
#define HAVE_SIGNAL_H 1
/* Define to 1 if you have the `socketpair' function. */
#define HAVE_SOCKETPAIR 1
/* Define to 1 if you have the <spawn.h> header file. */
#undef HAVE_SPAWN_H
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
/* Define to 1 if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
/* Define to 1 if you have the <strings.h> header file. */
#define HAVE_STRINGS_H 1
/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define to 1 if you have the `strlcat' function. */
#undef HAVE_STRLCAT
/* Define to 1 if you have the `strlcpy' function. */
#undef HAVE_STRLCPY
/* Define to 1 if you have the `strnlen' function. */
#define HAVE_STRNLEN 1
/* Define to 1 if you have the `strtok_r' function. */
#define HAVE_STRTOK_R 1
/* Define to 1 if the system has the type `struct sockaddr_in6'. */
#define HAVE_STRUCT_SOCKADDR_IN6 1
/* Define to 1 if the system has the type `struct sockaddr_storage'. */
#define HAVE_STRUCT_SOCKADDR_STORAGE 1
/* Define to 1 if you have the <sys/devpoll.h> header file. */
#undef HAVE_SYS_DEVPOLL_H
/* Define to 1 if you have the <sys/epoll.h> header file. */
#undef HAVE_SYS_EPOLL_H
/* Define to 1 if you have the <sys/event.h> header file. */
#undef HAVE_SYS_EVENT_H
/* Define to 1 if you have the <sys/poll.h> header file. */
#undef HAVE_SYS_POLL_H
/* Define to 1 if you have the <sys/select.h> header file. */
#define HAVE_SYS_SELECT_H 1
/* Define to 1 if you have the <sys/signalfd.h> header file. */
#undef HAVE_SYS_SIGNALFD_H
/* Define to 1 if you have the <sys/socket.h> header file. */
#define HAVE_SYS_SOCKET_H 1
/* Define to 1 if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define to 1 if you have the <sys/time.h> header file. */
#define HAVE_SYS_TIME_H 1
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define to 1 if you have the <sys/uio.h> header file. */
#define HAVE_SYS_UIO_H 1
/* Define if you have timer_create */
#undef HAVE_TIMER_CREATE
/* Define to 1 if you have the <time.h> header file. */
#define HAVE_TIME_H 1
/* Define to 1 if the system has the type `uintmax_t'. */
#define HAVE_UINTMAX_T 1
/* Define to 1 if the system has the type `uintptr_t'. */
#define HAVE_UINTPTR_T 1
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Define to 1 if the system has the type `unsigned long long int'. */
#define HAVE_UNSIGNED_LONG_LONG_INT 1
/* Define to 1 if you have the `usleep' function. */
#define HAVE_USLEEP 1
/* Define to 1 if you have the `vfork' function. */
#define HAVE_VFORK 1
/* Define to 1 if you have the <vfork.h> header file. */
#undef HAVE_VFORK_H
/* Define to 1 if you are on windows */
#undef HAVE_WIN32
/* Define to 1 if `fork' works. */
#undef HAVE_WORKING_FORK
/* Define to 1 if `vfork' works. */
#define HAVE_WORKING_VFORK 1
/* Define to 1 if you have the `writev' function. */
#define HAVE_WRITEV 1
/* This is a MinGW system */
#undef MINGW
/* Define this to disable debugging support. */
#undef NDEBUG
/* Define if your system needs crypt. */
#undef NEED_CRYPT
/* Define to 1 if you wish to disable the block allocator. */
#undef NOBALLOC
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
/* Define to the full name of this package. */
#undef PACKAGE_NAME
/* Define to the full name and version of this package. */
#undef PACKAGE_STRING
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME
/* Define to the version of this package. */
#undef PACKAGE_VERSION
/* Defined to mark profiling is enabled */
#undef RATBOX_PROFILE
/* Prefix where libratbox is installed. */
#define RB_PREFIX "/ratbox"
/* Define to 1 if sockaddr has a 'sa_len' member. */
#undef SOCKADDR_IN_HAS_LEN
/* Define this to enable soft asserts. */
#undef SOFT_ASSERT
/* If using the C implementation of alloca, define if you know the
direction of stack growth for your system; otherwise it will be
automatically deduced at runtime.
STACK_DIRECTION > 0 => grows toward higher addresses
STACK_DIRECTION < 0 => grows toward lower addresses
STACK_DIRECTION = 0 => direction of growth unknown */
#undef STACK_DIRECTION
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
#define TIME_WITH_SYS_TIME 1
/* Define to 1 if we can use timer_create(CLOCK_REALTIME,...) */
#undef USE_TIMER_CREATE
/* This is a Windows system */
#undef WINDOWS
/* Enable GNU extensions on systems that have them. */
#ifndef _GNU_SOURCE
# undef _GNU_SOURCE
#endif
/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
<pthread.h>, or <semaphore.h> is not used. If the typedef was allowed, the
#define below would cause a syntax error. */
#undef _UINT32_T
/* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>,
<pthread.h>, or <semaphore.h> is not used. If the typedef was allowed, the
#define below would cause a syntax error. */
#undef _UINT64_T
/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>,
<pthread.h>, or <semaphore.h> is not used. If the typedef was allowed, the
#define below would cause a syntax error. */
#undef _UINT8_T
/* Define to empty if `const' does not conform to ANSI C. */
#undef const
/* Define to `int' if <sys/types.h> doesn't define. */
#undef gid_t
/* Define to `__inline__' or `__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
#define inline inline
#endif
/* Define to the type of a signed integer type of width exactly 16 bits if
such a type exists and the standard includes do not define it. */
#undef int16_t
/* Define to the type of a signed integer type of width exactly 32 bits if
such a type exists and the standard includes do not define it. */
#undef int32_t
/* Define to the type of a signed integer type of width exactly 64 bits if
such a type exists and the standard includes do not define it. */
#undef int64_t
/* Define to the type of a signed integer type of width exactly 8 bits if such
a type exists and the standard includes do not define it. */
#undef int8_t
/* Define to the widest signed integer type if <stdint.h> and <inttypes.h> do
not define. */
#undef intmax_t
/* Define to the type of a signed integer type wide enough to hold a pointer,
if such a type exists, and if the system does not define it. */
#undef intptr_t
/* Define to `int' if <sys/types.h> does not define. */
#undef pid_t
/* If system does not define sa_family_t, define it here. */
#undef sa_family_t
/* Define to `unsigned int' if <sys/types.h> does not define. */
#undef size_t
/* If we don't have a real socklen_t, unsigned int is good enough. */
#undef socklen_t
/* Define to `int' if <sys/types.h> does not define. */
#undef ssize_t
/* Define to `int' if <sys/types.h> doesn't define. */
#undef uid_t
/* Define to the type of an unsigned integer type of width exactly 16 bits if
such a type exists and the standard includes do not define it. */
#undef uint16_t
/* Define to the type of an unsigned integer type of width exactly 32 bits if
such a type exists and the standard includes do not define it. */
#undef uint32_t
/* Define to the type of an unsigned integer type of width exactly 64 bits if
such a type exists and the standard includes do not define it. */
#undef uint64_t
/* Define to the type of an unsigned integer type of width exactly 8 bits if
such a type exists and the standard includes do not define it. */
#undef uint8_t
/* Define to the widest unsigned integer type if <stdint.h> and <inttypes.h>
do not define. */
#undef uintmax_t
/* Define to the type of an unsigned integer type wide enough to hold a
pointer, if such a type exists, and if the system does not define it. */
#undef uintptr_t
/* Define as `fork' if `vfork' does not work. */
#define vfork fork

View file

@ -21,7 +21,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*
* $Id: rb_commio.h 25327 2008-05-08 19:32:13Z androsyn $
* $Id: rb_commio.h 25693 2008-07-10 18:27:23Z androsyn $
*/
#ifndef RB_LIB_H
@ -88,7 +88,7 @@ struct rb_iovec
void rb_fdlist_init(int closeall, int maxfds, size_t heapsize);
rb_fde_t * rb_open(int, rb_uint8_t, const char *);
rb_fde_t * rb_open(int, uint8_t, const char *);
void rb_close(rb_fde_t *);
void rb_dump_fd(DUMPCB *, void *xdata);
void rb_note(rb_fde_t *, const char *);
@ -148,8 +148,8 @@ 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_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, rb_uint8_t type);
rb_uint8_t rb_get_type(rb_fde_t *F);
void rb_set_type(rb_fde_t *F, uint8_t type);
uint8_t rb_get_type(rb_fde_t *F);
const char *rb_get_iotype(void);
@ -164,6 +164,7 @@ typedef enum {
int rb_init_prng(const char *path, prng_seed_t seed_type);
int rb_get_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_connected(rb_fde_t *F, CNCB *callback, void *data, int timeout);
int rb_supports_ssl(void);

View file

@ -21,7 +21,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*
* $Id: rb_linebuf.h 25227 2008-04-12 22:20:43Z jilles $
* $Id: rb_linebuf.h 25675 2008-07-06 04:13:05Z androsyn $
*/
#ifndef RB_LIB_H
@ -45,8 +45,8 @@ struct _buf_head;
typedef struct _buf_line
{
char buf[BUF_DATA_SIZE + 2];
rb_uint8_t terminated; /* Whether we've terminated the buffer */
rb_uint8_t raw; /* Whether this linebuf may hold 8-bit data */
uint8_t terminated; /* Whether we've terminated the buffer */
uint8_t raw; /* Whether this linebuf may hold 8-bit data */
int len; /* How much data we've got */
int refcount; /* how many linked lists are we in? */
} buf_line_t;

View file

@ -1,4 +1,4 @@
# $Id: Makefile.am 25532 2008-06-11 14:40:44Z androsyn $
# $Id: Makefile.am 25689 2008-07-10 17:13:27Z androsyn $
AUTOMAKE_OPTIONS = foreign
@ -28,10 +28,11 @@ libratbox_la_SOURCES = \
select.c \
kqueue.c \
rawbuf.c \
patricia.c
patricia.c \
arc4random.c
libratbox_la_LDFLAGS = -version-info 3:0:0 -no-undefined -export-symbols export-syms.txt
libratbox_la_LDFLAGS = -avoid-version -no-undefined -export-symbols export-syms.txt
libratbox_la_LIBADD = @CRYPT_LIB@ @SSL_LIBS@ @GNUTLS_LIBS@
lib_LTLIBRARIES = libratbox.la

View file

@ -14,7 +14,7 @@
@SET_MAKE@
# $Id: Makefile.am 25532 2008-06-11 14:40:44Z androsyn $
# $Id: Makefile.am 25689 2008-07-10 17:13:27Z androsyn $
VPATH = @srcdir@
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 \
rb_memory.lo linebuf.lo snprintf.lo tools.lo helper.lo \
devpoll.lo epoll.lo poll.lo ports.lo sigio.lo select.lo \
kqueue.lo rawbuf.lo patricia.lo
kqueue.lo rawbuf.lo patricia.lo arc4random.lo
libratbox_la_OBJECTS = $(am_libratbox_la_OBJECTS)
libratbox_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
@ -233,9 +233,10 @@ libratbox_la_SOURCES = \
select.c \
kqueue.c \
rawbuf.c \
patricia.c
patricia.c \
arc4random.c
libratbox_la_LDFLAGS = -version-info 3:0:0 -no-undefined -export-symbols export-syms.txt
libratbox_la_LDFLAGS = -avoid-version -no-undefined -export-symbols export-syms.txt
libratbox_la_LIBADD = @CRYPT_LIB@ @SSL_LIBS@ @GNUTLS_LIBS@
lib_LTLIBRARIES = libratbox.la
all: all-am
@ -307,6 +308,7 @@ mostlyclean-compile:
distclean-compile:
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arc4random.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/balloc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commio.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypt.Plo@am__quote@

200
libratbox/src/arc4random.c Normal file
View file

@ -0,0 +1,200 @@
/* $Id: arc4random.c 25705 2008-07-11 18:21:57Z androsyn $ */
/* $$$: arc4random.c 2005/02/08 robert */
/* $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 $ */
/*
* Arc4 random number generator for OpenBSD.
* Copyright 1996 David Mazieres <dm@lcs.mit.edu>.
*
* Modification and redistribution in source and binary forms is
* permitted provided that due credit is given to the author and the
* OpenBSD project by leaving this copyright notice intact.
*/
/*
* This code is derived from section 17.1 of Applied Cryptography,
* second edition, which describes a stream cipher allegedly
* compatible with RSA Labs "RC4" cipher (the actual description of
* which is a trade secret). The same algorithm is used as a stream
* cipher called "arcfour" in Tatu Ylonen's ssh package.
*
* Here the stream cipher has been modified always to include the time
* when initializing the state. That makes it impossible to
* regenerate the same random sequence twice, so this can't be used
* for encryption, but will generate good random numbers.
*
* RC4 is a registered trademark of RSA Laboratories.
*/
#include <libratbox_config.h>
#include <ratbox_lib.h>
#if !defined(HAVE_OPENSSL) && !defined(HAVE_GNUTLS) && !defined(HAVE_ARC4RANDOM)
#include "arc4random.h"
#ifdef HAVE_GETRUSAGE
#include <sys/resource.h>
#endif
struct arc4_stream {
uint8_t i;
uint8_t j;
uint8_t s[256];
};
static int rs_initialized;
static struct arc4_stream rs;
static inline void arc4_init(struct arc4_stream *);
static inline void arc4_addrandom(struct arc4_stream *, uint8_t *, int);
static void arc4_stir(struct arc4_stream *);
static inline uint8_t arc4_getbyte(struct arc4_stream *);
static inline uint32_t arc4_getword(struct arc4_stream *);
static inline void
arc4_init(struct arc4_stream *as)
{
int n;
for (n = 0; n < 256; n++)
as->s[n] = n;
as->i = 0;
as->j = 0;
}
static inline void
arc4_addrandom(struct arc4_stream *as, uint8_t *dat, int datlen)
{
int n;
uint8_t si;
as->i--;
for (n = 0; n < 256; n++) {
as->i = (as->i + 1);
si = as->s[as->i];
as->j = (as->j + si + dat[n % datlen]);
as->s[as->i] = as->s[as->j];
as->s[as->j] = si;
}
as->j = as->i;
}
static void
arc4_stir(struct arc4_stream *as)
{
struct timeval tv;
pid_t pid;
int n;
/* XXX this doesn't support egd sources or similiar */
pid = getpid();
arc4_addrandom(as, (void *)&pid, sizeof(pid));
rb_gettimeofday(&tv, NULL);
arc4_addrandom(as, (void *)&tv.tv_sec, sizeof(&tv.tv_sec));
arc4_addrandom(as, (void *)&tv.tv_usec, sizeof(&tv.tv_usec));
rb_gettimeofday(&tv, NULL);
arc4_addrandom(as, (void *)&tv.tv_usec, sizeof(&tv.tv_usec));
#if defined(HAVE_GETRUSAGE) && RUSAGE_SELF
{
struct rusage buf;
getrusage(RUSAGE_SELF, &buf);
arc4_addrandom(as, (void *)&buf, sizeof(buf));
memset(&buf, 0, sizeof(buf))
}
#endif
#if !defined(WIN32)
{
uint8_t rnd[128];
int fd;
fd = open("/dev/urandom", O_RDONLY);
if (fd != -1)
{
read(fd, rnd, sizeof(rnd));
close(fd);
arc4_addrandom(as, (void *)rnd, sizeof(rnd));
}
}
#else
{
LARGE_INTEGER performanceCount;
if (QueryPerformanceCounter (&performanceCount))
{
arc4_addrandom(as, (void *)&performanceCount, sizeof(performanceCount));
}
}
#endif
/*
* Throw away the first N words of output, as suggested in the
* paper "Weaknesses in the Key Scheduling Algorithm of RC4"
* by Fluher, Mantin, and Shamir.
* http://www.wisdom.weizmann.ac.il/~itsik/RC4/Papers/Rc4_ksa.ps
* N = 256 in our case.
*/
for (n = 0; n < 256 * 4; n++)
arc4_getbyte(as);
}
static inline uint8_t
arc4_getbyte(struct arc4_stream *as)
{
uint8_t si, sj;
as->i = (as->i + 1);
si = as->s[as->i];
as->j = (as->j + si);
sj = as->s[as->j];
as->s[as->i] = sj;
as->s[as->j] = si;
return (as->s[(si + sj) & 0xff]);
}
static inline uint32_t
arc4_getword(struct arc4_stream *as)
{
uint32_t val;
val = arc4_getbyte(as) << 24;
val |= arc4_getbyte(as) << 16;
val |= arc4_getbyte(as) << 8;
val |= arc4_getbyte(as);
return val;
}
void
arc4random_stir(void)
{
if (!rs_initialized) {
arc4_init(&rs);
rs_initialized = 1;
}
arc4_stir(&rs);
}
void
arc4random_addrandom(uint8_t *dat, int datlen)
{
if (!rs_initialized)
arc4random_stir();
arc4_addrandom(&rs, dat, datlen);
}
uint32_t
arc4random(void)
{
if (!rs_initialized)
arc4random_stir();
return arc4_getword(&rs);
}
#endif

View file

@ -28,7 +28,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*
* $Id: balloc.c 25375 2008-05-16 15:19:51Z androsyn $
* $Id: balloc.c 25675 2008-07-06 04:13:05Z androsyn $
*/
/*
@ -225,7 +225,7 @@ newblock(rb_bh * bh)
{
rb_heap_block *b;
unsigned long i;
rb_uintptr_t offset;
uintptr_t offset;
/* Setup the initial data structure. */
b = rb_malloc(sizeof(rb_heap_block));
@ -237,7 +237,7 @@ newblock(rb_bh * bh)
{
return (1);
}
offset = (rb_uintptr_t)b->elems;
offset = (uintptr_t)b->elems;
/* Setup our blocks now */
for (i = 0; i < bh->elemsPerBlock; i++, offset += (bh->elemSize + sizeof(rb_heap_block *)))
{

View file

@ -21,7 +21,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*
* $Id: commio.c 25375 2008-05-16 15:19:51Z androsyn $
* $Id: commio.c 25795 2008-07-29 15:26:55Z androsyn $
*/
#include <libratbox_config.h>
#include <ratbox_lib.h>
@ -80,7 +80,6 @@ static inline rb_fde_t *
add_fd(int fd)
{
rb_fde_t *F = rb_find_fd(fd);
rb_dlink_list *list;
/* look up to see if we have it already */
if(F != NULL)
@ -88,21 +87,17 @@ add_fd(int fd)
F = rb_bh_alloc(fd_heap);
F->fd = fd;
list = &rb_fd_table[rb_hash_fd(fd)];
rb_dlinkAdd(F, &F->node, list);
rb_dlinkAdd(F, &F->node, &rb_fd_table[rb_hash_fd(fd)]);
return(F);
}
static inline void
remove_fd(rb_fde_t *F)
{
rb_dlink_list *list;
if(F == NULL || !IsFDOpen(F))
return;
list = &rb_fd_table[rb_hash_fd(F->fd)];
rb_dlinkMoveNode(&F->node, list, &closed_list);
rb_dlinkMoveNode(&F->node, &rb_fd_table[rb_hash_fd(F->fd)], &closed_list);
}
static void
@ -368,6 +363,13 @@ rb_accept_tryaccept(rb_fde_t *F, void *data)
new_F = rb_open(new_fd, RB_FD_SOCKET, "Incoming Connection");
if(new_F == NULL)
{
rb_lib_log("rb_accept: new_F == NULL on incoming connection. Closing new_fd == %d\n", new_fd);
close(new_fd);
continue;
}
if(rb_unlikely(!rb_set_nb(new_F)))
{
rb_get_errno();
@ -387,7 +389,7 @@ rb_accept_tryaccept(rb_fde_t *F, void *data)
#ifdef HAVE_SSL
if(F->type & RB_FD_SSL)
{
rb_ssl_accept_setup(F, new_fd, (struct sockaddr *)&st, addrlen);
rb_ssl_accept_setup(F, new_F, (struct sockaddr *)&st, addrlen);
}
else
#endif /* HAVE_SSL */
@ -715,8 +717,11 @@ rb_socket(int family, int sock_type, int proto, const char *note)
F = rb_open(fd, RB_FD_SOCKET, note);
if(F == NULL)
{
rb_lib_log("rb_socket: rb_open returns NULL on FD %d: %s, closing fd", fd, strerror(errno));
close(fd);
return NULL;
}
/* Set the socket non-blocking, and other wonderful bits */
if(rb_unlikely(!rb_set_nb(F)))
{
@ -747,7 +752,7 @@ mangle_mapped_sockaddr(struct sockaddr *in)
memset(&in4, 0, sizeof(struct sockaddr_in));
in4.sin_family = AF_INET;
in4.sin_port = in6->sin6_port;
in4.sin_addr.s_addr = ((rb_uint32_t *) & in6->sin6_addr)[3];
in4.sin_addr.s_addr = ((uint32_t *) & in6->sin6_addr)[3];
memcpy(in, &in4, sizeof(struct sockaddr_in));
}
return;
@ -796,16 +801,24 @@ rb_fdlist_init(int closeall, int maxfds, size_t heapsize)
/* Called to open a given filedescriptor */
rb_fde_t *
rb_open(int fd, rb_uint8_t type, const char *desc)
rb_open(int fd, uint8_t type, const char *desc)
{
rb_fde_t *F = add_fd(fd);
rb_fde_t *F;
lrb_assert(fd >= 0);
F = add_fd(fd);
lrb_assert(!IsFDOpen(F));
if(rb_unlikely(IsFDOpen(F)))
{
const char *fdesc;
if(F != NULL && F->desc != NULL)
fdesc = F->desc;
else
fdesc = "NULL";
rb_lib_log("Trying to rb_open an already open FD: %d desc: %d", fd, fdesc);
return NULL;
}
lrb_assert(!IsFDOpen(F));
F->fd = fd;
F->type = type;
SetFDOpen(F);
@ -913,14 +926,14 @@ rb_note(rb_fde_t *F, const char *string)
}
void
rb_set_type(rb_fde_t *F, rb_uint8_t type)
rb_set_type(rb_fde_t *F, uint8_t type)
{
/* if the caller is calling this, lets assume they have a clue */
F->type = type;
return;
}
rb_uint8_t
uint8_t
rb_get_type(rb_fde_t *F)
{
return F->type;
@ -2002,7 +2015,7 @@ rb_recv_fd_buf(rb_fde_t *F, void *data, size_t datasize, rb_fde_t **xF, int nfds
struct cmsghdr *cmsg;
struct iovec iov[1];
struct stat st;
rb_uint8_t stype = RB_FD_UNKNOWN;
uint8_t stype = RB_FD_UNKNOWN;
const char *desc;
int fd, len, x, rfds;

View file

@ -110,7 +110,7 @@ rb_crypt(const char *key, const char *salt)
*
* ARCHITECTURE ASSUMPTIONS:
* It is assumed that the 8-byte arrays passed by reference can be
* addressed as arrays of rb_uint32_t's (ie. the CPU is not picky about
* addressed as arrays of uint32_t's (ie. the CPU is not picky about
* alignment).
*/
@ -121,15 +121,15 @@ static u_char inv_key_perm[64];
static u_char inv_comp_perm[56];
static u_char u_sbox[8][64];
static u_char un_pbox[32];
static rb_uint32_t en_keysl[16], en_keysr[16];
static rb_uint32_t de_keysl[16], de_keysr[16];
static rb_uint32_t ip_maskl[8][256], ip_maskr[8][256];
static rb_uint32_t fp_maskl[8][256], fp_maskr[8][256];
static rb_uint32_t key_perm_maskl[8][128], key_perm_maskr[8][128];
static rb_uint32_t comp_maskl[8][128], comp_maskr[8][128];
static rb_uint32_t saltbits;
static rb_uint32_t old_salt;
static rb_uint32_t old_rawkey0, old_rawkey1;
static uint32_t en_keysl[16], en_keysr[16];
static uint32_t de_keysl[16], de_keysr[16];
static uint32_t ip_maskl[8][256], ip_maskr[8][256];
static uint32_t fp_maskl[8][256], fp_maskr[8][256];
static uint32_t key_perm_maskl[8][128], key_perm_maskr[8][128];
static uint32_t comp_maskl[8][128], comp_maskr[8][128];
static uint32_t saltbits;
static uint32_t old_salt;
static uint32_t old_rawkey0, old_rawkey1;
/* Static stuff that stays resident and doesn't change after
@ -137,7 +137,7 @@ static rb_uint32_t old_rawkey0, old_rawkey1;
* reentrant. */
static u_char init_perm[64], final_perm[64];
static u_char m_sbox[4][4096];
static rb_uint32_t psbox[4][256];
static uint32_t psbox[4][256];
@ -230,7 +230,7 @@ static const u_char pbox[32] = {
2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25
};
static const rb_uint32_t bits32[32] =
static const uint32_t bits32[32] =
{
0x80000000, 0x40000000, 0x20000000, 0x10000000,
0x08000000, 0x04000000, 0x02000000, 0x01000000,
@ -243,7 +243,7 @@ static const rb_uint32_t bits32[32] =
};
static const u_char bits8[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
static const rb_uint32_t *bits28, *bits24;
static const uint32_t *bits28, *bits24;
static int
@ -268,7 +268,7 @@ static void
des_init(void)
{
int i, j, b, k, inbit, obit;
rb_uint32_t *p, *il, *ir, *fl, *fr;
uint32_t *p, *il, *ir, *fl, *fr;
static int des_initialised = 0;
if (des_initialised==1)
@ -401,7 +401,7 @@ des_init(void)
static void
setup_salt(long salt)
{
rb_uint32_t obit, saltbit;
uint32_t obit, saltbit;
int i;
if (salt == (long)old_salt)
@ -423,13 +423,13 @@ setup_salt(long salt)
static int
des_setkey(const char *key)
{
rb_uint32_t k0, k1, rawkey0, rawkey1;
uint32_t k0, k1, rawkey0, rawkey1;
int shifts, round;
des_init();
rawkey0 = ntohl(*(const rb_uint32_t *) key);
rawkey1 = ntohl(*(const rb_uint32_t *) (key + 4));
rawkey0 = ntohl(*(const uint32_t *) key);
rawkey1 = ntohl(*(const uint32_t *) (key + 4));
if ((rawkey0 | rawkey1)
&& rawkey0 == old_rawkey0
@ -469,7 +469,7 @@ des_setkey(const char *key)
*/
shifts = 0;
for (round = 0; round < 16; round++) {
rb_uint32_t t0, t1;
uint32_t t0, t1;
shifts += key_shifts[round];
@ -501,13 +501,13 @@ des_setkey(const char *key)
static int
do_des( rb_uint32_t l_in, rb_uint32_t r_in, rb_uint32_t *l_out, rb_uint32_t *r_out, int count)
do_des( uint32_t l_in, uint32_t r_in, uint32_t *l_out, uint32_t *r_out, int count)
{
/*
* l_in, r_in, l_out, and r_out are in pseudo-"big-endian" format.
*/
rb_uint32_t l, r, *kl, *kr, *kl1, *kr1;
rb_uint32_t f, r48l, r48r;
uint32_t l, r, *kl, *kr, *kl1, *kr1;
uint32_t f, r48l, r48r;
int round;
if (count == 0) {
@ -619,12 +619,12 @@ do_des( rb_uint32_t l_in, rb_uint32_t r_in, rb_uint32_t *l_out, rb_uint32_t *r_o
#if 0
static int
des_cipher(const char *in, char *out, rb_uint32_t salt, int count)
des_cipher(const char *in, char *out, uint32_t salt, int count)
{
rb_uint32_t l_out, r_out, rawl, rawr;
uint32_t l_out, r_out, rawl, rawr;
int retval;
union {
rb_uint32_t *ui32;
uint32_t *ui32;
const char *c;
} trans;
@ -650,7 +650,7 @@ void
setkey(const char *key)
{
int i, j;
rb_uint32_t packed_keys[2];
uint32_t packed_keys[2];
u_char *p;
p = (u_char *) packed_keys;
@ -668,7 +668,7 @@ setkey(const char *key)
void
encrypt(char *block, int flag)
{
rb_uint32_t io[2];
uint32_t io[2];
u_char *p;
int i, j;
@ -692,7 +692,7 @@ encrypt(char *block, int flag)
static char *
__des_crypt(const char *key, const char *setting)
{
rb_uint32_t count, salt, l, r0, r1, keybuf[2];
uint32_t count, salt, l, r0, r1, keybuf[2];
u_char *p, *q;
static char output[21];
@ -885,8 +885,8 @@ __des_crypt(const char *key, const char *setting)
/* MD5 context. */
struct MD5Context {
rb_uint32_t state[4]; /* state (ABCD) */
rb_uint32_t count[2]; /* number of bits, modulo 2^64 (lsb first) */
uint32_t state[4]; /* state (ABCD) */
uint32_t count[2]; /* number of bits, modulo 2^64 (lsb first) */
unsigned char buffer[64]; /* input buffer */
};
@ -894,7 +894,7 @@ static void __md5_Init (struct MD5Context *);
static void __md5_Update (struct MD5Context *, const char *, unsigned int);
static void __md5_Pad (struct MD5Context *);
static void __md5_Final (char [16], struct MD5Context *);
static void __md5_Transform (rb_uint32_t [4], const unsigned char [64]);
static void __md5_Transform (uint32_t [4], const unsigned char [64]);
static const char __md5__magic[] = "$1$"; /* This string is magic for this algorithm. Having
@ -910,12 +910,12 @@ static const unsigned char __md5_itoa64[] = /* 0 ... 63 => ascii - 64 */
#else /* i386 */
/*
* __md5_Encodes input (rb_uint32_t) into output (unsigned char). Assumes len is
* __md5_Encodes input (uint32_t) into output (unsigned char). Assumes len is
* a multiple of 4.
*/
static void
__md5_Encode (unsigned char *output, rb_uint32_t *input, unsigned int len)
__md5_Encode (unsigned char *output, uint32_t *input, unsigned int len)
{
unsigned int i, j;
@ -928,18 +928,18 @@ __md5_Encode (unsigned char *output, rb_uint32_t *input, unsigned int len)
}
/*
* __md5_Decodes input (unsigned char) into output (rb_uint32_t). Assumes len is
* __md5_Decodes input (unsigned char) into output (uint32_t). Assumes len is
* a multiple of 4.
*/
static void
__md5_Decode (rb_uint32_t *output, const unsigned char *input, unsigned int len)
__md5_Decode (uint32_t *output, const unsigned char *input, unsigned int len)
{
unsigned int i, j;
for (i = 0, j = 0; j < len; i++, j += 4)
output[i] = ((rb_uint32_t)input[j]) | (((rb_uint32_t)input[j+1]) << 8) |
(((rb_uint32_t)input[j+2]) << 16) | (((rb_uint32_t)input[j+3]) << 24);
output[i] = ((uint32_t)input[j]) | (((uint32_t)input[j+1]) << 8) |
(((uint32_t)input[j+2]) << 16) | (((uint32_t)input[j+3]) << 24);
}
#endif /* i386 */
@ -957,22 +957,22 @@ __md5_Decode (rb_uint32_t *output, const unsigned char *input, unsigned int len)
* Rotation is separate from addition to prevent recomputation.
*/
#define FF(a, b, c, d, x, s, ac) { \
(a) += F ((b), (c), (d)) + (x) + (rb_uint32_t)(ac); \
(a) += F ((b), (c), (d)) + (x) + (uint32_t)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define GG(a, b, c, d, x, s, ac) { \
(a) += G ((b), (c), (d)) + (x) + (rb_uint32_t)(ac); \
(a) += G ((b), (c), (d)) + (x) + (uint32_t)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define HH(a, b, c, d, x, s, ac) { \
(a) += H ((b), (c), (d)) + (x) + (rb_uint32_t)(ac); \
(a) += H ((b), (c), (d)) + (x) + (uint32_t)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define II(a, b, c, d, x, s, ac) { \
(a) += I ((b), (c), (d)) + (x) + (rb_uint32_t)(ac); \
(a) += I ((b), (c), (d)) + (x) + (uint32_t)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
@ -1004,10 +1004,10 @@ static void __md5_Update ( struct MD5Context *context, const char *xinput, unsig
lindex = (unsigned int)((context->count[0] >> 3) & 0x3F);
/* Update number of bits */
if ((context->count[0] += ((rb_uint32_t)inputLen << 3))
< ((rb_uint32_t)inputLen << 3))
if ((context->count[0] += ((uint32_t)inputLen << 3))
< ((uint32_t)inputLen << 3))
context->count[1]++;
context->count[1] += ((rb_uint32_t)inputLen >> 29);
context->count[1] += ((uint32_t)inputLen >> 29);
partLen = 64 - lindex;
@ -1077,13 +1077,13 @@ static void __md5_Final ( char xdigest[16], struct MD5Context *context)
static void
__md5_Transform (state, block)
rb_uint32_t state[4];
uint32_t state[4];
const unsigned char block[64];
{
rb_uint32_t a, b, c, d, x[16];
uint32_t a, b, c, d, x[16];
#if MD5_SIZE_OVER_SPEED > 1
rb_uint32_t temp;
uint32_t temp;
const char *ps;
static const char S[] = {
@ -1095,11 +1095,11 @@ __md5_Transform (state, block)
#endif /* MD5_SIZE_OVER_SPEED > 1 */
#if MD5_SIZE_OVER_SPEED > 0
const rb_uint32_t *pc;
const uint32_t *pc;
const char *pp;
int i;
static const rb_uint32_t C[] = {
static const uint32_t C[] = {
/* round 1 */
0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,

10
libratbox/src/descrip.mms Normal file
View file

@ -0,0 +1,10 @@
CFLAGS= /INCLUDE=([-.INCLUDE])/ERROR_LIMIT=5/DEFINE=(_XOPEN_SOURCE_EXTENDED)/NOANSI_ALIAS
OBJECTS= balloc.obj, commio.obj, crypt.obj, event.obj, -
helper.obj, linebuf.obj, nossl.obj, patricia.obj, -
poll.obj, ratbox_lib.obj, rawbuf.obj, rb_memory.obj, -
snprintf.obj, tools.obj, unix.obj
DEFAULT : RATBOX.OLB($(OBJECTS))
CLEAN :
- DELETE *.OBJ;*, *.OLB;*

View file

@ -23,7 +23,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*
* $Id: epoll.c 25038 2008-01-23 16:03:08Z androsyn $
* $Id: epoll.c 25675 2008-07-06 04:13:05Z androsyn $
*/
#define _GNU_SOURCE 1
@ -282,23 +282,23 @@ rb_epoll_supports_event(void)
/* bleh..work around a glibc header bug on 32bit systems */
struct our_signalfd_siginfo {
rb_uint32_t signo;
rb_int32_t err;
rb_int32_t code;
rb_uint32_t pid;
rb_uint32_t uid;
rb_int32_t fd;
rb_uint32_t tid;
rb_uint32_t band;
rb_uint32_t overrun;
rb_uint32_t trapno;
rb_int32_t status;
rb_int32_t svint;
rb_uint64_t svptr;
rb_uint64_t utime;
rb_uint64_t stime;
rb_uint64_t addr;
rb_uint8_t pad[48];
uint32_t signo;
int32_t err;
int32_t code;
uint32_t pid;
uint32_t uid;
int32_t fd;
uint32_t tid;
uint32_t band;
uint32_t overrun;
uint32_t trapno;
int32_t status;
int32_t svint;
uint64_t svptr;
uint64_t utime;
uint64_t stime;
uint64_t addr;
uint8_t pad[48];
};

View file

@ -145,3 +145,4 @@ rb_spawn_process
rb_supports_ssl
rb_ssl_handshake_count
rb_ssl_clear_handshake_count
rb_get_pseudo_random

View file

@ -20,7 +20,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*
* $Id: gnutls.c 25568 2008-06-20 18:46:08Z androsyn $
* $Id: gnutls.c 25793 2008-07-29 14:47:48Z androsyn $
*/
#include <libratbox_config.h>
@ -164,11 +164,8 @@ rb_ssl_start_accepted(rb_fde_t * new_F, ACCB * cb, void *data, int timeout)
void
rb_ssl_accept_setup(rb_fde_t * F, int new_fd, struct sockaddr *st, int addrlen)
rb_ssl_accept_setup(rb_fde_t * F, rb_fde_t *new_F, struct sockaddr *st, int addrlen)
{
rb_fde_t *new_F;
new_F = rb_find_fd(new_fd);
new_F->type |= RB_FD_SSL;
new_F->ssl = rb_malloc(sizeof(gnutls_session_t));
new_F->accept = rb_malloc(sizeof(struct acceptdata));
@ -183,7 +180,7 @@ rb_ssl_accept_setup(rb_fde_t * F, int new_fd, struct sockaddr *st, int addrlen)
gnutls_set_default_priority(SSL_P(new_F));
gnutls_credentials_set(SSL_P(new_F), GNUTLS_CRD_CERTIFICATE, x509);
gnutls_dh_set_prime_bits(SSL_P(new_F), 1024);
gnutls_transport_set_ptr(SSL_P(new_F), (gnutls_transport_ptr_t) (long int)new_fd);
gnutls_transport_set_ptr(SSL_P(new_F), (gnutls_transport_ptr_t) (long int)rb_get_fd(new_F));
if(do_ssl_handshake(F, rb_ssl_tryaccept))
{
struct acceptdata *ad = F->accept;
@ -485,6 +482,12 @@ rb_get_random(void *buf, size_t length)
return 1;
}
int
rb_get_pseudo_random(void *buf, size_t length)
{
gcry_randomize(buf, length, GCRY_WEAK_RANDOM);
return 1;
}
const char *
rb_get_ssl_strerror(rb_fde_t * F)

View file

@ -26,9 +26,10 @@
#include <libratbox_config.h>
#include <ratbox_lib.h>
#if !defined(HAVE_OPENSSL) && !defined(HAVE_GNUTLS)
#include "arc4random.h"
#include <commio-int.h>
#include <commio-ssl.h>
@ -54,16 +55,42 @@ rb_ssl_listen(rb_fde_t *F, int backlog)
return -1;
}
static void
rb_stir_arc4random(void *unused)
{
arc4random_stir();
}
int rb_init_prng(const char *path, prng_seed_t seed_type)
{
return -1;
/* xxx this ignores the parameters above */
arc4random_stir();
rb_event_addish("rb_stir_arc4random", rb_stir_arc4random, NULL, 300);
return 1;
}
int
rb_get_random(void *buf, size_t length)
{
return -1;
uint32_t rnd = 0, i;
uint8_t *xbuf = buf;
for (i = 0; i < sizeof(length); i++)
{
if(i % 4 == 0)
rnd = arc4random();
xbuf[i] = rnd;
rnd >>= 8;
}
return 1;
}
int
rb_get_pseudo_random(void *buf, size_t length)
{
return rb_get_random(buf, length);
}
const char *
rb_get_ssl_strerror(rb_fde_t *F)
@ -104,7 +131,7 @@ rb_ssl_shutdown(rb_fde_t * F)
}
void
rb_ssl_accept_setup(rb_fde_t * F, int new_fd, struct sockaddr *st, int addrlen)
rb_ssl_accept_setup(rb_fde_t * F, rb_fde_t *new_F, struct sockaddr *st, int addrlen)
{
return;
}

View file

@ -204,13 +204,8 @@ rb_ssl_start_accepted(rb_fde_t * new_F, ACCB * cb, void *data, int timeout)
void
rb_ssl_accept_setup(rb_fde_t * F, int new_fd, struct sockaddr *st, int addrlen)
rb_ssl_accept_setup(rb_fde_t * F, rb_fde_t *new_F, struct sockaddr *st, int addrlen)
{
rb_fde_t *new_F;
new_F = rb_find_fd(new_fd);
if(new_F == NULL)
return;
new_F->type |= RB_FD_SSL;
new_F->ssl = SSL_new(ssl_server_ctx);
new_F->accept = rb_malloc(sizeof(struct acceptdata));
@ -221,7 +216,7 @@ rb_ssl_accept_setup(rb_fde_t * F, int new_fd, struct sockaddr *st, int addrlen)
memcpy(&new_F->accept->S, st, addrlen);
new_F->accept->addrlen = addrlen;
SSL_set_fd((SSL *) new_F->ssl, new_fd);
SSL_set_fd((SSL *) new_F->ssl, rb_get_fd(new_F));
rb_setup_ssl_cb(new_F);
rb_ssl_accept_common(new_F);
}
@ -578,19 +573,25 @@ rb_init_prng(const char *path, prng_seed_t seed_type)
int
rb_get_random(void *buf, size_t length)
{
if(RAND_status())
int ret;
if((ret = RAND_bytes(buf, length)) == 0)
{
if(RAND_bytes(buf, length) > 0)
return 1;
/* remove the error from the queue */
ERR_get_error();
}
else
{
if(RAND_pseudo_bytes(buf, length) >= 0)
return 1;
}
return 0;
return ret;
}
int
rb_get_pseudo_random(void *buf, size_t length)
{
int ret;
ret = RAND_pseudo_bytes(buf, length);
if(ret < 0)
return 0;
return 1;
}
const char *
rb_get_ssl_strerror(rb_fde_t * F)

View file

@ -30,9 +30,9 @@
struct _rawbuf
{
rb_dlink_node node;
rb_uint8_t data[RAWBUF_SIZE];
uint8_t data[RAWBUF_SIZE];
int len;
rb_uint8_t flushing;
uint8_t flushing;
};
struct _rawbuf_head