From: Pekka Riikonen Date: Sat, 30 Sep 2000 06:06:29 +0000 (+0000) Subject: Added new silc_schedule_with_fd to select() with specific fd. X-Git-Tag: 1.2.beta1~2722 X-Git-Url: http://git.silcnet.org/gitweb/?p=crypto.git;a=commitdiff_plain;h=1865d82aabc867f9d917c55a5f1d244d7515d0b8 Added new silc_schedule_with_fd to select() with specific fd. --- diff --git a/lib/silcutil/silcschedule.c b/lib/silcutil/silcschedule.c index 1d081426..efa3d20c 100644 --- a/lib/silcutil/silcschedule.c +++ b/lib/silcutil/silcschedule.c @@ -511,3 +511,48 @@ void silc_schedule() /* Start the scheduler loop */ while (silc_schedule_one(-1)) ; } + +/* Run normal select() for `fd' and return after file descriptor changes + status or timeout expires. The `event' is either SILC_TASK_READ or + SILC_TASK_WRITE. */ + +int silc_schedule_with_fd(int fd, unsigned int event, + unsigned long usecs, unsigned long secs) +{ + struct timeval *tp = NULL, timeout; + fd_set *ip = NULL, in; + fd_set *op = NULL, out; + int ret; + + if (usecs + secs > 0) { + timeout.tv_sec = secs; + timeout.tv_usec = usecs; + tp = &timeout; + } + + if (event == SILC_TASK_READ) { + FD_ZERO(&in); + FD_SET(fd, &in); + ip = ∈ + } + + if (event == SILC_TASK_WRITE) { + FD_ZERO(&out); + FD_SET(fd, &out); + op = &out; + } + + ret = select(fd + 1, ip, op, NULL, tp); + switch (ret) { + case -1: + return FALSE; + break; + case 0: + return FALSE; + break; + default: + break; + } + + return TRUE; +} diff --git a/lib/silcutil/silcschedule.h b/lib/silcutil/silcschedule.h index ce9070cf..2e68dbbf 100644 --- a/lib/silcutil/silcschedule.h +++ b/lib/silcutil/silcschedule.h @@ -120,5 +120,7 @@ void silc_schedule_set_listen_fd(int fd, unsigned int iomask); void silc_schedule_unset_listen_fd(int fd); void silc_schedule(); int silc_schedule_one(int block); +int silc_schedule_with_fd(int fd, unsigned int event, + unsigned long usecs, unsigned long secs); #endif