aboutsummaryrefslogtreecommitdiffstats
path: root/linux-uml/linux-uml-2.6.7/Add_os_make_pty_raw.patch
diff options
context:
space:
mode:
Diffstat (limited to 'linux-uml/linux-uml-2.6.7/Add_os_make_pty_raw.patch')
-rw-r--r--linux-uml/linux-uml-2.6.7/Add_os_make_pty_raw.patch114
1 files changed, 114 insertions, 0 deletions
diff --git a/linux-uml/linux-uml-2.6.7/Add_os_make_pty_raw.patch b/linux-uml/linux-uml-2.6.7/Add_os_make_pty_raw.patch
index e69de29bb2..0cb2518722 100644
--- a/linux-uml/linux-uml-2.6.7/Add_os_make_pty_raw.patch
+++ b/linux-uml/linux-uml-2.6.7/Add_os_make_pty_raw.patch
@@ -0,0 +1,114 @@
+
+Fixes raw() and uses it in check_one_sigio; also fixes a silly panic (EINTR returned by call).
+
+Signed-off-by: Paolo 'Blaisorblade' Giarrusso <blaisorblade_spam@yahoo.it>
+---
+
+ uml-linux-2.6.7-paolo/arch/um/include/user_util.h | 4 ++-
+ uml-linux-2.6.7-paolo/arch/um/kernel/sigio_user.c | 11 +++-----
+ uml-linux-2.6.7-paolo/arch/um/kernel/user_util.c | 29 ++++++++++++++++++----
+ 3 files changed, 31 insertions(+), 13 deletions(-)
+
+diff -puN arch/um/kernel/sigio_user.c~Add_os_make_pty_raw arch/um/kernel/sigio_user.c
+--- uml-linux-2.6.7/arch/um/kernel/sigio_user.c~Add_os_make_pty_raw 2004-06-29 21:03:03.157157408 +0200
++++ uml-linux-2.6.7-paolo/arch/um/kernel/sigio_user.c 2004-06-29 21:03:03.161156800 +0200
+@@ -16,6 +16,7 @@
+ #include "init.h"
+ #include "user.h"
+ #include "kern_util.h"
++#include "user_util.h"
+ #include "sigio.h"
+ #include "helper.h"
+ #include "os.h"
+@@ -50,7 +51,6 @@ static void openpty_cb(void *arg)
+ 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 +68,9 @@ void __init check_one_sigio(void (*proc)
+ 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 = __raw(master, 1, 0); //Not now, but complain so we now where we failed.
++ if (err < 0)
++ panic("check_sigio : __raw failed, errno = %d\n", -err);
+
+ err = os_sigio_async(master, slave);
+ if(err < 0)
+diff -puN arch/um/kernel/user_util.c~Add_os_make_pty_raw arch/um/kernel/user_util.c
+--- uml-linux-2.6.7/arch/um/kernel/user_util.c~Add_os_make_pty_raw 2004-06-29 21:03:03.158157256 +0200
++++ uml-linux-2.6.7-paolo/arch/um/kernel/user_util.c 2004-06-29 21:03:03.162156648 +0200
+@@ -119,18 +119,37 @@ int wait_for_stop(int pid, int sig, int
+ }
+ }
+
+-int raw(int fd, int complain)
++int __raw(int fd, int complain, int now)
+ {
+ struct termios tt;
+ int err;
++ int when;
++
++ while (((err = tcgetattr(fd, &tt)) < 0) && errno == EINTR)
++ ;
++
++ if (err < 0) {
++ if (complain)
++ printk("tcgetattr failed, errno = %d\n", errno);
++ return(-errno);
++ }
+
+- tcgetattr(fd, &tt);
+ cfmakeraw(&tt);
+- err = tcsetattr(fd, TCSANOW, &tt);
+- if((err < 0) && complain){
+- printk("tcsetattr failed, errno = %d\n", errno);
++
++ if (now)
++ when = TCSANOW;
++ else
++ when = TCSADRAIN;
++
++ while (((err = tcsetattr(fd, when, &tt)) < 0) && errno == EINTR)
++ ;
++ if (err < 0) {
++ if (complain)
++ printk("tcsetattr failed, errno = %d\n", errno);
+ return(-errno);
+ }
++ /*XXX: tcsetattr could have applied only some changes
++ * (and cfmakeraw() is a set of changes) */
+ return(0);
+ }
+
+diff -puN arch/um/include/user_util.h~Add_os_make_pty_raw arch/um/include/user_util.h
+--- uml-linux-2.6.7/arch/um/include/user_util.h~Add_os_make_pty_raw 2004-06-29 21:03:03.159157104 +0200
++++ uml-linux-2.6.7-paolo/arch/um/include/user_util.h 2004-06-29 21:03:03.162156648 +0200
+@@ -62,7 +62,6 @@ extern void set_cmdline(char *cmd);
+ extern void input_cb(void (*proc)(void *), void *arg, int arg_len);
+ extern int get_pty(void);
+ extern void *um_kmalloc(int size);
+-extern int raw(int fd, int complain);
+ extern int switcheroo(int fd, int prot, void *from, void *to, int size);
+ extern void setup_machinename(char *machine_out);
+ extern void setup_hostinfo(void);
+@@ -90,6 +89,9 @@ extern void forward_pending_sigio(int ta
+ extern int can_do_skas(void);
+ extern void arch_init_thread(void);
+
++extern int __raw(int fd, int complain, int now);
++#define raw(fd, complain) __raw((fd), (complain), 1)
++
+ #endif
+
+ /*
+_