diff options
Diffstat (limited to 'extension')
-rw-r--r-- | extension/ChangeLog | 6 | ||||
-rw-r--r-- | extension/select.c | 28 |
2 files changed, 25 insertions, 9 deletions
diff --git a/extension/ChangeLog b/extension/ChangeLog index 9218c744..d1ef7b4a 100644 --- a/extension/ChangeLog +++ b/extension/ChangeLog @@ -1,3 +1,9 @@ +2013-07-02 Andrew J. Schorr <aschorr@telemetry-investments.com> + + * select.c (set_non_blocking): New helper function to call fcntl. + (do_set_non_blocking): Add support for the case where there's a single + integer fd argument. + 2013-07-01 Andrew J. Schorr <aschorr@telemetry-investments.com> * select.c (do_set_non_blocking): Implement new set_non_blocking 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")); |