diff options
Diffstat (limited to 'packages/gsm')
-rw-r--r-- | packages/gsm/gsmd.inc | 8 | ||||
-rw-r--r-- | packages/gsm/libgsmd-devel_svn.bb | 1 | ||||
-rw-r--r-- | packages/gsm/pty/.mtn2git_empty | 0 | ||||
-rw-r--r-- | packages/gsm/pty/pty.c | 163 | ||||
-rw-r--r-- | packages/gsm/pty_0.0.bb | 16 |
5 files changed, 184 insertions, 4 deletions
diff --git a/packages/gsm/gsmd.inc b/packages/gsm/gsmd.inc index 8b3fe8fb82..4fe36b9616 100644 --- a/packages/gsm/gsmd.inc +++ b/packages/gsm/gsmd.inc @@ -3,9 +3,9 @@ HOMEPAGE = "http://www.openmoko.org" LICENSE = "GPL LGPL" SECTION = "libs/gsm" PROVIDES += "gsmd" -RPROVIDES_${PN} = "libgsmd0 gsmd" +RPROVIDES_${PN} = "libgsmd0 libgsmd gsmd gsmd-devel" PV = "0.1+svnr${SRCREV}" -PR = "r34" +PR = "r37" SRC_URI = "svn://svn.openmoko.org/trunk/src/target;module=gsm;proto=http \ file://gsmd \ @@ -49,8 +49,8 @@ RDEPENDS_${BASEPN}-plugins = "${BASEPN}-plugin-machine-generic \ ${BASEPN}-plugin-vendor-tihtc \ " -RDEPENDS_${BASEPN} = "update-rc.d initscripts" -RRECOMMENDS_${BASEPN} = "${BASEPN}-plugins" +RDEPENDS_${PN} += "update-rc.d initscripts" +RRECOMMENDS_${PN} += "${BASEPN}-plugins" FILES_${PN}-dbg += "${libdir}/gsmd/.debug/*" FILES_${PN}-tools = "${bindir}/*" diff --git a/packages/gsm/libgsmd-devel_svn.bb b/packages/gsm/libgsmd-devel_svn.bb index 0d5b90a990..d584e88d38 100644 --- a/packages/gsm/libgsmd-devel_svn.bb +++ b/packages/gsm/libgsmd-devel_svn.bb @@ -4,6 +4,7 @@ CONFLICTNAME = "gsmd" require gsmd.inc PROVIDES += "libgsmd" +RPROVIDES_${PN}-tools = "lib${CONFLICTNAME}-tools" SRC_URI += " file://024_sms-text-in-bracket.patch;patch=1;minrev=2957;maxrev=3199 \ file://025_sms-status-report.patch;patch=1;minrev=2957;maxrev=3200 \ diff --git a/packages/gsm/pty/.mtn2git_empty b/packages/gsm/pty/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/gsm/pty/.mtn2git_empty diff --git a/packages/gsm/pty/pty.c b/packages/gsm/pty/pty.c new file mode 100644 index 0000000000..4a33d0efd3 --- /dev/null +++ b/packages/gsm/pty/pty.c @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2007 OpenedHand, Ltd. + * Contact: <andrew@o-hand.com> + * + * This file is licensed under the terms of GNU GPL v2. + * + * $ pty [<hostname|ip> <port>] + * Opens a new pseudo terminal and forwards data between standard input + * and the pty and between the pty and standard output. If a hostname and + * port number are given, reads and writes to the socket instead of + * standard input or output. Path to the slave pty is printed on standard + * error. + */ +#include <unistd.h> +#include <stdlib.h> +#include <fcntl.h> +#include <errno.h> +#include <stdio.h> +#include <string.h> +#include <sys/ioctl.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <netdb.h> +#include <poll.h> + +#define CHECK(val, name) \ + if (val == -1) { \ + fprintf(stderr, #name ": %s (%i)\n", strerror(errno), errno);\ + return -errno; \ + } + +#define min(a, b) ((a) < (b) ? (a) : (b)) +#define max(a, b) ((a) > (b) ? (a) : (b)) + +static int forward2(int in0, int out0, int in1, int out1, + int (*closed)(int fd)) { + int inpos = 0, inlen = 0, outpos = 0, outlen = 0, ret, n; + fd_set rfds, wfds; + char in[0x100], out[0x100]; + + n = max(max(in0, in1), max(out0, out1)) + 1; + while (1) { + FD_ZERO(&rfds); + FD_ZERO(&wfds); + if (inlen < sizeof(in)) + FD_SET(in0, &rfds); + if (outlen < sizeof(out)) + FD_SET(in1, &rfds); + if (inlen) + FD_SET(out0, &wfds); + if (outlen) + FD_SET(out1, &wfds); + CHECK(select(n, &rfds, &wfds, 0, 0), select); + + if (FD_ISSET(in0, &rfds)) { + ret = (inpos + inlen) & (sizeof(in) - 1); + ret = read(in0, in + ret, + sizeof(in) - max(ret, inlen)); + CHECK(ret, read(0)); + if (!ret) + return 0; + inlen += ret; + } + if (FD_ISSET(in1, &rfds)) { + ret = (outpos + outlen) & (sizeof(out) - 1); + ret = read(in1, out + ret, + sizeof(out) - max(ret, outlen)); + if (ret > 0) + outlen += ret; + if (ret < 0 && errno == EIO && closed) { + in1 = out0 = closed(in1); + if (in1 < 0) + return in1; + n = max(max(in0, in1), max(out0, out1)) + 1; + continue; + } + } + if (FD_ISSET(out0, &wfds)) { + ret = write(out0, in + inpos, + min(sizeof(in) - inpos, inlen)); + CHECK(ret, write(pty)); + inlen -= ret; + inpos += ret; + inpos &= sizeof(in) - 1; + } + if (FD_ISSET(out1, &wfds)) { + ret = write(out1, out + outpos, + min(sizeof(out) - outpos, outlen)); + CHECK(ret, write(1)); + outlen -= ret; + outpos += ret; + outpos &= sizeof(out) - 1; + } + } + + return pause(); +} + +static int reopen(int fd) { + const char *name = ttyname(fd); + + CHECK(close(fd), close(pty)); + fd = open(name, O_RDWR | O_NOCTTY); + CHECK(fd, open); + CHECK(grantpt(fd), grantpt); + CHECK(unlockpt(fd), unlockpt); + + fprintf(stderr, "%s\n", ptsname(fd)); + return fd; +} + +int main(int argc, char *argv[], char **envp) { + int sock, fd; + struct sockaddr_in sa; + struct hostent *hi; + + fd = posix_openpt(O_RDWR | O_NOCTTY); + CHECK(fd, open); + CHECK(grantpt(fd), grantpt); + CHECK(unlockpt(fd), unlockpt); + + fprintf(stderr, "%s\n", ptsname(fd)); +#if 0 + /* Connect stdin & stdout with a pty */ + CHECK(close(0), close(0)); + CHECK(close(1), close(1)); + CHECK(dup(fd), dup(0)); + CHECK(dup(fd), dup(1)); + return pause(); +#endif + if (argc != 3) + return forward2(0, fd, fd, 1, reopen); + +#if 0 + /* Connect a sub-process with a pty */ + for (len = 0, i = 1; i < argc; i ++) + len += strlen(argv[i]) + 4; + param = malloc(len); + strcpy(param, argv[1]); + for (i = 2; i < argc; i ++) + sprintf(param + strlen(param), " \"%s\"", argv[i]); + i = fileno(popen(param, O_RDWR)); + CHECK(i, popen); + free(param); + return forward2(i, fd, fd, i, reopen); +#endif + + /* Connect a TCP socket with a pty */ + hi = gethostbyname(argv[1]); + if (!hi) { + errno = h_errno; + CHECK(-1, gethostbyname); + } + sa.sin_family = hi->h_addrtype; + memcpy(&sa.sin_addr.s_addr, hi->h_addr_list[0], hi->h_length); + sa.sin_port = htons(strtol(argv[2], 0, 0)); + sock = socket(AF_INET, SOCK_STREAM, 0); + + CHECK(sock, socket); + CHECK(connect(sock, (struct sockaddr *) &sa, sizeof(sa)), connect); + return forward2(sock, fd, fd, sock, reopen); +} diff --git a/packages/gsm/pty_0.0.bb b/packages/gsm/pty_0.0.bb new file mode 100644 index 0000000000..39592a90a1 --- /dev/null +++ b/packages/gsm/pty_0.0.bb @@ -0,0 +1,16 @@ +DESCRIPTION = "Forwards a socket to a tty" +LICENSE = "GPLv2" +PR = "r1" + +SRC_URI = "file://pty.c" + +do_compile() { + cp ${WORKDIR}/*.c ${S}/ + ${CC} pty.c -o pty -I${STAGING_INCDIR} -L${STAGING_LIBDIR} +} + +do_install() { + install -d ${D}${bindir} + install -m 0755 pty ${D}${bindir}/ +} + |