--- ./arch/um/include/os.h.fix 2004-01-17 18:41:12.000000000 +0100 +++ ./arch/um/include/os.h 2004-01-19 20:54:48.000000000 +0100 @@ -130,6 +130,7 @@ extern int os_set_slip(int fd); extern int os_set_owner(int fd, int pid); extern int os_sigio_async(int master, int slave); +extern int os_make_pty_raw(int master); extern int os_mode_fd(int fd, int mode); extern int os_seek_file(int fd, __u64 offset); --- ./arch/um/kernel/sigio_user.c.fix 2004-01-17 18:41:14.000000000 +0100 +++ ./arch/um/kernel/sigio_user.c 2004-01-19 21:00:50.000000000 +0100 @@ -50,7 +50,6 @@ void __init check_one_sigio(void (*proc)(int, int)) { struct sigaction old, new; - struct termios tt; struct openpty_arg pty = { .master = -1, .slave = -1 }; int master, slave, err; @@ -68,12 +67,9 @@ return; } - /* XXX These can fail with EINTR */ - if(tcgetattr(master, &tt) < 0) - panic("check_sigio : tcgetattr failed, errno = %d\n", errno); - cfmakeraw(&tt); - if(tcsetattr(master, TCSADRAIN, &tt) < 0) - panic("check_sigio : tcsetattr failed, errno = %d\n", errno); + err = os_make_pty_raw(master); + if (err < 0) + panic("check_sigio : os_make_pty_raw failed, errno = %d\n", -err); err = os_sigio_async(master, slave); if(err < 0) --- ./arch/um/os-Linux/file.c.fix 2004-01-17 18:41:19.000000000 +0100 +++ ./arch/um/os-Linux/file.c 2004-01-19 21:24:27.000000000 +0100 @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -132,6 +133,32 @@ return(0); } +int os_make_pty_raw(int master) +{ + struct termios tt; + int err; + + while (((err = tcgetattr(master, &tt)) < 0) && errno == EINTR) + ; + if(err < 0) { + printk("os_make_pty_raw : tcgetattr failed, errno = %d\n", errno); + goto fail; + } + + cfmakeraw(&tt); + + while (((err = tcsetattr(master, TCSADRAIN, &tt)) < 0) && errno == EINTR) + ; + if(err < 0) { + printk("os_make_pty_raw : tcsetattr failed, errno = %d\n", errno); + goto fail; + } + + return 0; +fail: + return -errno; +} + /* FIXME: ensure namebuf in os_get_if_name is big enough */ int os_get_ifname(int fd, char* namebuf) {