summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorncopa <ncopa@f176ef85-8d20-0410-844a-e957b5a1c371>2007-03-26 15:51:04 +0000
committerncopa <ncopa@f176ef85-8d20-0410-844a-e957b5a1c371>2007-03-26 15:51:04 +0000
commitf3bf41bba7d32f88dece419efd5d5a806ee68b7b (patch)
tree0bd9557123f5ce9d4642fb71d1b241b7a28b8ea4 /src
parent0a40ac61d56d4bb3c62b51e40d8216abcf2737dd (diff)
downloadalpine-baselayout-f3bf41bba7d32f88dece419efd5d5a806ee68b7b.tar.bz2
alpine-baselayout-f3bf41bba7d32f88dece419efd5d5a806ee68b7b.tar.xz
support for serial login using cttyhack. remove the needed mountoints from /etc/fstab. rc_delete should remove links even if target is missing
Diffstat (limited to 'src')
-rw-r--r--src/Makefile2
-rw-r--r--src/cttyhack.c83
2 files changed, 84 insertions, 1 deletions
diff --git a/src/Makefile b/src/Makefile
index 23d1a84..006fd76 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -2,7 +2,7 @@
CC = gcc
LD = gcc
-SBIN_TARGETS = runscript readahead
+SBIN_TARGETS = runscript readahead cttyhack
TARGET = $(BIN_TARGETS) $(SBIN_TARGETS)
.PHONY: all clean
diff --git a/src/cttyhack.c b/src/cttyhack.c
new file mode 100644
index 0000000..e54c1ec
--- /dev/null
+++ b/src/cttyhack.c
@@ -0,0 +1,83 @@
+/* This code is adapted from busybox project
+ *
+ * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
+ */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+
+/* From <linux/vt.h> */
+struct vt_stat {
+ unsigned short v_active; /* active vt */
+ unsigned short v_signal; /* signal to send */
+ unsigned short v_state; /* vt bitmask */
+};
+enum { VT_GETSTATE = 0x5603 }; /* get global vt state info */
+
+/* From <linux/serial.h> */
+struct serial_struct {
+ int type;
+ int line;
+ unsigned int port;
+ int irq;
+ int flags;
+ int xmit_fifo_size;
+ int custom_divisor;
+ int baud_base;
+ unsigned short close_delay;
+ char io_type;
+ char reserved_char[1];
+ int hub6;
+ unsigned short closing_wait; /* time to wait before closing */
+ unsigned short closing_wait2; /* no longer used... */
+ unsigned char *iomem_base;
+ unsigned short iomem_reg_shift;
+ unsigned int port_high;
+ unsigned long iomap_base; /* cookie passed into ioremap */
+ int reserved[1];
+};
+
+int main(int ergc, char **argv)
+{
+ int fd;
+ char console[sizeof(int)*3 + 16];
+ union {
+ struct vt_stat vt;
+ struct serial_struct sr;
+ char paranoia[sizeof(struct serial_struct) * 3];
+ } u;
+
+ if (!argv[1]) {
+ fprintf(stderr, "Usage: cttyhack cmd [arg1] [arg2]...\n");
+ return -1;
+ }
+
+ strcpy(console, "/dev/tty");
+ if (ioctl(0, TIOCGSERIAL, &u.sr) == 0) {
+ /* this is a serial console */
+ sprintf(console + 8, "S%d", u.sr.line);
+ } else if (ioctl(0, VT_GETSTATE, &u.vt) == 0) {
+ /* this is linux virtual tty */
+ sprintf(console + 8, "%d", u.vt.v_active);
+ }
+
+ if (console[8]) {
+ fd = open(console, O_RDWR);
+ if (fd >= 0) {
+ //fprintf(stderr, "cttyhack: switching to '%s'\n", console);
+ dup2(fd, 0);
+ dup2(fd, 1);
+ dup2(fd, 2);
+ while (fd > 2) close(fd--);
+ }
+ }
+
+ execvp(argv[1], argv + 1);
+ fprintf(stderr, "cttyhack: failed to exec %s: %s\n",
+ argv[1], strerror(errno));
+ return -1;
+}