From 1865d82aabc867f9d917c55a5f1d244d7515d0b8 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Sat, 30 Sep 2000 06:06:29 +0000 Subject: [PATCH] Added new silc_schedule_with_fd to select() with specific fd. --- lib/silcutil/silcschedule.c | 45 +++++++++++++++++++++++++++++++++++++ lib/silcutil/silcschedule.h | 2 ++ 2 files changed, 47 insertions(+) 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 -- 2.43.0