* Generic non-forking server infrastructure.
* Intended to make writing telnetd-type servers easier.
*
- * Copyright (C) 2007 Denis Vlasenko
+ * Copyright (C) 2007 Denys Vlasenko
*
- * Licensed under GPL version 2, see file LICENSE in this tarball for details.
+ * Licensed under GPLv2, see file LICENSE in this source tree.
*/
-#include "busybox.h"
+#include "libbb.h"
#include "isrv.h"
#define DEBUG 0
/* Helpers */
-/* Even if _POSIX_MONOTONIC_CLOCK is defined, this
- * may require librt */
-#if 0 /*def _POSIX_MONOTONIC_CLOCK*/
-static time_t monotonic_time(void)
-{
- struct timespec ts;
- if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0)
- time(&ts.tv_sec);
- return ts.tv_sec;
-}
-#else
-#define monotonic_time() (time(NULL))
-#endif
-
/* Opaque structure */
struct isrv_state_t {
remove_peer(state, n); /* unsuccesful peer start */
}
-void BUG_sizeof_fd_set_is_strange(void);
static void handle_fd_set(isrv_state_t *state, fd_set *fds, int (*h)(int, void **))
{
enum { LONG_CNT = sizeof(fd_set) / sizeof(long) };
/* need to know value at _the beginning_ of this routine */
int fd_cnt = FD_COUNT;
- if (LONG_CNT * sizeof(long) != sizeof(fd_set))
- BUG_sizeof_fd_set_is_strange();
+ BUILD_BUG_ON(LONG_CNT * sizeof(long) != sizeof(fd_set));
fds_pos = 0;
while (1) {
/* this peer is gone */
remove_peer(state, peer);
} else if (TIMEOUT) {
- TIMEO_TBL[peer] = monotonic_time();
+ TIMEO_TBL[peer] = monotonic_sec();
}
}
}
isrv_want_rd(state, listen_fd);
/* remember flags to make blocking<->nonblocking switch faster */
/* (suppress gcc warning "cast from ptr to int of different size") */
- PARAM_TBL[0] = (void*)(ptrdiff_t)(fcntl(listen_fd, F_GETFL, 0));
+ PARAM_TBL[0] = (void*)(ptrdiff_t)(fcntl(listen_fd, F_GETFL));
while (1) {
struct timeval tv;
break;
if (timeout) {
- time_t t = monotonic_time();
+ time_t t = monotonic_sec();
if (t != CURTIME) {
CURTIME = t;
handle_timeout(state, do_timeout);