summaryrefslogtreecommitdiff
path: root/boot/boot.c
diff options
context:
space:
mode:
Diffstat (limited to 'boot/boot.c')
-rw-r--r--boot/boot.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/boot/boot.c b/boot/boot.c
index a0b5db84..883e5db6 100644
--- a/boot/boot.c
+++ b/boot/boot.c
@@ -593,12 +593,26 @@ init_termstate ()
ioctl (0, TIOCSETN, &sgb);
}
+#include <termios.h>
+#undef tcgetattr
+#undef tcsetattr
+
kern_return_t
S_tioctl_tiocgeta (mach_port_t port,
int modes[],
char ccs[],
int speeds[])
{
+#if 1
+ union { struct termios t;
+ struct { int modes[4]; char cc[20]; int speed[2]; } s; } u;
+ if (tcgetattr (0, &u.t))
+ return errno;
+ bcopy (u.s.modes, modes, sizeof u.s.modes);
+ bcopy (u.s.cc, ccs, sizeof u.s.cc);
+ bcopy (u.s.speed, speeds, sizeof u.s.speed);
+ return 0;
+#else
/* Emacs reads the terminal state in one of two cases:
1) Checking whether or not a preceding tiocseta succeeded;
2) Finding out what the state of the terminal was on startup.
@@ -615,14 +629,23 @@ S_tioctl_tiocgeta (mach_port_t port,
speeds[0] = term_speeds[0];
speeds[1] = term_speeds[1];
return 0;
+#endif
}
kern_return_t
S_tioctl_tiocseta (mach_port_t port,
- int modes[],
- char ccs[],
- int speeds[])
+ int modes[],
+ char ccs[],
+ int speeds[])
{
+#if 1
+ union { struct termios t;
+ struct { int modes[4]; char cc[20]; int speed[2]; } s; } u;
+ memcpy (u.s.modes, modes, sizeof u.s.modes);
+ memcpy (u.s.cc, ccs, sizeof u.s.cc);
+ memcpy (u.s.speed, speeds, sizeof u.s.speed);
+ return tcsetattr (0, 0, &u.t) ? errno : 0;
+#else
/* Emacs sets the termanal stet in one of two cases:
1) Putting the terminal into raw mode for running;
2) Restoring the terminal to its original state.
@@ -658,6 +681,7 @@ S_tioctl_tiocseta (mach_port_t port,
term_speeds[0] = speeds[0];
term_speeds[1] = speeds[1];
return 0;
+#endif
}
kern_return_t