Set the line file descriptor nonblocking and make it blocking again for
authornicm <nicm@openbsd.org>
Mon, 5 Oct 2015 23:15:31 +0000 (23:15 +0000)
committernicm <nicm@openbsd.org>
Mon, 5 Oct 2015 23:15:31 +0000 (23:15 +0000)
xmodem and child processes, makes xmodem work with -d. Reported by Kim
Zeitler via guenther@, tested by Jiri B. ok (and a small change) guenther

usr.bin/cu/command.c
usr.bin/cu/cu.c
usr.bin/cu/cu.h
usr.bin/cu/xmodem.c

index cb4352e..9ae8e9a 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: command.c,v 1.14 2015/10/05 17:53:56 nicm Exp $ */
+/* $OpenBSD: command.c,v 1.15 2015/10/05 23:15:31 nicm Exp $ */
 
 /*
  * Copyright (c) 2012 Nicholas Marriott <nicm@openbsd.org>
@@ -51,6 +51,7 @@ pipe_command(void)
                return;
 
        restore_termios();
+       set_blocking(line_fd, 1);
 
        switch (pid = fork()) {
        case -1:
@@ -81,6 +82,7 @@ pipe_command(void)
                break;
        }
 
+       set_blocking(line_fd, 0);
        set_termios();
 }
 
@@ -102,6 +104,7 @@ connect_command(void)
                return;
 
        restore_termios();
+       set_blocking(line_fd, 1);
 
        switch (pid = fork()) {
        case -1:
@@ -129,6 +132,7 @@ connect_command(void)
                break;
        }
 
+       set_blocking(line_fd, 0);
        set_termios();
 }
 
index ac8ddae..8bb812a 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: cu.c,v 1.22 2015/05/18 09:35:05 nicm Exp $ */
+/* $OpenBSD: cu.c,v 1.23 2015/10/05 23:15:31 nicm Exp $ */
 
 /*
  * Copyright (c) 2012 Nicholas Marriott <nicm@openbsd.org>
@@ -186,6 +186,7 @@ main(int argc, char **argv)
            NULL);
        bufferevent_enable(output_ev, EV_WRITE);
 
+       set_blocking(line_fd, 0);
        line_ev = bufferevent_new(line_fd, line_read, NULL, line_error,
            NULL);
        bufferevent_enable(line_ev, EV_READ|EV_WRITE);
@@ -208,6 +209,21 @@ signal_event(int fd, short events, void *data)
        exit(0);
 }
 
+void
+set_blocking(int fd, int state)
+{
+       int mode;
+
+       state = state ? 0 : O_NONBLOCK;
+       if ((mode = fcntl(fd, F_GETFL)) == -1)
+               cu_err(1, "fcntl");
+       if ((mode & O_NONBLOCK) != state) {
+               mode = (mode & ~O_NONBLOCK) | state;
+               if (fcntl(fd, F_SETFL, mode) == -1)
+                       cu_err(1, "fcntl");
+       }
+}
+
 void
 set_termios(void)
 {
@@ -342,7 +358,7 @@ try_remote(const char *host, const char *path, const char *entry)
 
        if (entry != NULL && cgetset(entry) != 0)
                cu_errx(1, "cgetset failed");
-       error = cgetent(&cp, (char**)paths, (char*)host);
+       error = cgetent(&cp, (char **)paths, (char *)host);
        if (error < 0) {
                switch (error) {
                case -1:
index 70510d6..10745bc 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: cu.h,v 1.6 2012/07/10 12:47:23 nicm Exp $ */
+/* $OpenBSD: cu.h,v 1.7 2015/10/05 23:15:31 nicm Exp $ */
 
 /*
  * Copyright (c) 2012 Nicholas Marriott <nicm@openbsd.org>
@@ -27,6 +27,7 @@ extern FILE                   *record_file;
 extern struct termios           saved_tio;
 extern int                      line_fd;
 extern struct bufferevent      *line_ev;
+void                            set_blocking(int, int);
 int                             set_line(int);
 void                            set_termios(void);
 void                            restore_termios(void);
index a542e6f..09f3304 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: xmodem.c,v 1.7 2014/09/21 05:29:47 daniel Exp $ */
+/* $OpenBSD: xmodem.c,v 1.8 2015/10/05 23:15:31 nicm Exp $ */
 
 /*
  * Copyright (c) 2012 Nicholas Marriott <nicm@openbsd.org>
@@ -137,8 +137,9 @@ xmodem_send(const char *file)
                if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &tio) != 0)
                        cu_err(1, "tcsetattr");
        }
-
+       set_blocking(line_fd, 1);
        tcflush(line_fd, TCIFLUSH);
+
        if (xmodem_read(&c) != 0)
                goto fail;
        if (c == XMODEM_C)
@@ -214,6 +215,7 @@ fail:
        cu_warn("%s", file);
 
 out:
+       set_blocking(line_fd, 0);
        set_termios();
 
        sigaction(SIGINT, &oact, NULL);