From 2044012d19ee809300163f831399af7066b6b09c Mon Sep 17 00:00:00 2001 From: Fredrik Fornwall Date: Sat, 12 Sep 2015 17:36:00 -0400 Subject: [PATCH] Add libutil as disabled package --- disabled-packages/libutil/build.sh | 11 ++++++ disabled-packages/libutil/pty.c | 68 ++++++++++++++++++++++++++++++++++++++ disabled-packages/libutil/pty.h | 12 +++++++ 3 files changed, 91 insertions(+) create mode 100644 disabled-packages/libutil/build.sh create mode 100644 disabled-packages/libutil/pty.c create mode 100644 disabled-packages/libutil/pty.h diff --git a/disabled-packages/libutil/build.sh b/disabled-packages/libutil/build.sh new file mode 100644 index 00000000..5640a57b --- /dev/null +++ b/disabled-packages/libutil/build.sh @@ -0,0 +1,11 @@ +TERMUX_PKG_HOMEPAGE=https://refspecs.linuxbase.org/LSB_2.1.0/LSB-generic/LSB-generic/libutil.html +TERMUX_PKG_DESCRIPTION="Library with terminal functions" +TERMUX_PKG_VERSION=0.1 +TERMUX_PKG_BUILD_IN_SRC=yes + +termux_step_make_install () { + CFLAGS+=" -std=c11" + $CC $CFLAGS -c -fPIC $TERMUX_PKG_BUILDER_DIR/pty.c -o pty.o + $CC -shared -fPIC $LDFLAGS -o $TERMUX_PREFIX/lib/libutil.so pty.o + cp $TERMUX_PKG_BUILDER_DIR/pty.h $TERMUX_PREFIX/include/ +} diff --git a/disabled-packages/libutil/pty.c b/disabled-packages/libutil/pty.c new file mode 100644 index 00000000..a2b89580 --- /dev/null +++ b/disabled-packages/libutil/pty.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include +#include +#include + + +int openpty(int* amaster, int* aslave, char* name, struct termios* termp, struct winsize* winp) +{ + char buf[512]; + + int master = open("/dev/ptmx", O_RDWR); + if (master == -1) return -1; + if (grantpt(master) || unlockpt(master) || ptsname_r(master, buf, sizeof buf)) goto fail; + + int slave = open(buf, O_RDWR | O_NOCTTY); + if (slave == -1) goto fail; + + /* XXX Should we ignore errors here? */ + if (termp) tcsetattr(slave, TCSAFLUSH, termp); + if (winp) ioctl(slave, TIOCSWINSZ, winp); + + *amaster = master; + *aslave = slave; + if (name != NULL) strcpy(name, buf); + return 0; + +fail: + close(master); + return -1; +} + + +int login_tty(int fd) +{ + setsid(); + if (ioctl(fd, TIOCSCTTY, NULL) == -1) return -1; + dup2(fd, 0); + dup2(fd, 1); + dup2(fd, 2); + if (fd > 2) close(fd); + return 0; +} + + +int forkpty(int* amaster, char* name, struct termios* termp, struct winsize* winp) +{ + int master, slave; + if (openpty(&master, &slave, name, termp, winp) == -1) { + return -1; + } + + int pid; + switch (pid = fork()) { + case -1: + return -1; + case 0: + close(master); + if (login_tty(slave)) _exit(1); + return 0; + default: + *amaster = master; + close (slave); + return pid; + } +} diff --git a/disabled-packages/libutil/pty.h b/disabled-packages/libutil/pty.h new file mode 100644 index 00000000..899e17d3 --- /dev/null +++ b/disabled-packages/libutil/pty.h @@ -0,0 +1,12 @@ +#ifndef _PTY_H +#define _PTY_H + +#include + +int openpty(int* amaster, int* aslave, char* name, struct termios* termp, struct winsize* winp); + +int login_tty(int fd); + +int forkpty(int* amaster, char* name, struct termios* termp, struct winsize* winp); + +#endif -- 2.11.0