aboutsummaryrefslogtreecommitdiffstats
path: root/extension/select.c
diff options
context:
space:
mode:
authorAndrew J. Schorr <aschorr@telemetry-investments.com>2013-07-02 12:20:56 -0400
committerAndrew J. Schorr <aschorr@telemetry-investments.com>2013-07-02 12:20:56 -0400
commit1f647aac9fa3e412c63a966535de8ee4fec855f2 (patch)
tree1d6fb3994907a16df69ad694dcef0d539211078d /extension/select.c
parent27e1e910147465ad240a3e4393bbd4312937fed5 (diff)
downloadegawk-1f647aac9fa3e412c63a966535de8ee4fec855f2.tar.gz
egawk-1f647aac9fa3e412c63a966535de8ee4fec855f2.tar.bz2
egawk-1f647aac9fa3e412c63a966535de8ee4fec855f2.zip
Enhance getline to return -2 when an I/O operation should be retried.
Diffstat (limited to 'extension/select.c')
-rw-r--r--extension/select.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/extension/select.c b/extension/select.c
index 91898a20..c1b706fc 100644
--- a/extension/select.c
+++ b/extension/select.c
@@ -364,26 +364,36 @@ do_select(int nargs, awk_value_t *result)
return make_number(rc, result);
}
+static int
+set_non_blocking(int fd)
+{
+ int flags = fcntl(fd, F_GETFL);
+ int rc = fcntl(fd, F_SETFL, (flags|O_NONBLOCK));
+ if (rc < 0)
+ update_ERRNO_int(errno);
+ return rc;
+}
+
/* do_set_non_blocking --- Set a file to be non-blocking */
static awk_value_t *
do_set_non_blocking(int nargs, awk_value_t *result)
{
awk_value_t cmd, cmdtype;
+ int fd;
if (do_lint && nargs > 2)
lintwarn(ext_id, _("set_non_blocking: called with too many arguments"));
- if (get_argument(0, AWK_STRING, & cmd) &&
+ if (get_argument(0, AWK_NUMBER, & cmd) &&
+ (cmd.num_value == (fd = cmd.num_value)) &&
+ ! get_argument(1, AWK_STRING, & cmdtype))
+ return make_number(set_non_blocking(fd), result);
+ else if (get_argument(0, AWK_STRING, & cmd) &&
get_argument(1, AWK_STRING, & cmdtype)) {
const awk_input_buf_t *buf;
- if ((buf = get_file(cmd.str_value.str, cmd.str_value.len, cmdtype.str_value.str, cmdtype.str_value.len)) != NULL) {
- int flags = fcntl(buf->fd, F_GETFL);
- int rc = fcntl(buf->fd, F_SETFL, (flags|O_NONBLOCK));
- if (rc < 0)
- update_ERRNO_int(errno);
- return make_number(rc, result);
- } else
- warning(ext_id, _("set_non_blocking: get_file(`%s', `%s') failed"), cmd.str_value.str, cmdtype.str_value.str);
+ if ((buf = get_file(cmd.str_value.str, cmd.str_value.len, cmdtype.str_value.str, cmdtype.str_value.len)) != NULL)
+ return make_number(set_non_blocking(buf->fd), result);
+ warning(ext_id, _("set_non_blocking: get_file(`%s', `%s') failed"), cmd.str_value.str, cmdtype.str_value.str);
} else if (do_lint) {
if (nargs < 2)
lintwarn(ext_id, _("set_non_blocking: called with too few arguments"));