diff options
author | Nicholas Marriott <nicholas.marriott@gmail.com> | 2008-06-23 21:54:48 +0000 |
---|---|---|
committer | Nicholas Marriott <nicholas.marriott@gmail.com> | 2008-06-23 21:54:48 +0000 |
commit | e704d6aee2b9e8864589d1960ac15726bb0cd35c (patch) | |
tree | be4a1d78a3f9f58ee244dd407d8d1be1032f5506 /compat | |
parent | 14d7cf3878360dd47ec3e22cdf4e3d731797c9de (diff) |
IRIX fixes, sort of partly work.
Diffstat (limited to 'compat')
-rw-r--r-- | compat/asprintf.c | 35 | ||||
-rw-r--r-- | compat/forkpty-irix.c | 83 | ||||
-rw-r--r-- | compat/forkpty-sunos.c | 7 |
3 files changed, 122 insertions, 3 deletions
diff --git a/compat/asprintf.c b/compat/asprintf.c index f3ec7ef7..05e8dd24 100644 --- a/compat/asprintf.c +++ b/compat/asprintf.c @@ -1,4 +1,4 @@ -/* $Id: asprintf.c,v 1.2 2008-06-18 22:21:51 nicm Exp $ */ +/* $Id: asprintf.c,v 1.3 2008-06-23 21:54:48 nicm Exp $ */ /* * Copyright (c) 2006 Nicholas Marriott <nicm@users.sourceforge.net> @@ -16,7 +16,9 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include <stdarg.h> #include <stdio.h> +#include <stdint.h> #include <string.h> #include "tmux.h" @@ -34,6 +36,7 @@ asprintf(char **ret, const char *format, ...) return (n); } +#ifndef BROKEN_VSNPRINTF int vasprintf(char **ret, const char *format, va_list ap) { @@ -54,3 +57,33 @@ error: *ret = NULL; return (-1); } +#else +int +vasprintf(char **ret, const char *fmt, va_list ap) +{ + va_list aq; + size_t len; + char *buf; + int n; + + len = 64; + buf = xmalloc(len); + + for (;;) { + va_copy(aq, ap); + n = vsnprintf(buf, len, fmt, aq); + va_end(aq); + + if (n != -1) { + *ret = buf; + return (n); + } + + if (len > SIZE_MAX / 2) { + xfree(buf); + return (-1); + } + len *= 2; + } +} +#endif diff --git a/compat/forkpty-irix.c b/compat/forkpty-irix.c new file mode 100644 index 00000000..1e0f689e --- /dev/null +++ b/compat/forkpty-irix.c @@ -0,0 +1,83 @@ +/* $Id: forkpty-irix.c,v 1.1 2008-06-23 21:54:48 nicm Exp $ */ + +/* + * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/types.h> +#include <sys/ioctl.h> +#include <sys/stat.h> + +#include <fcntl.h> +#include <signal.h> +#include <stdlib.h> +#include <unistd.h> + +#include "tmux.h" + +pid_t +forkpty(int *master, + unused char *name, unused struct termios *tio, struct winsize *ws) +{ + int slave, fd; + char *path; + pid_t pid; + void *old; + + path = _getpty(master, O_RDWR, 0622, 0); + if (path == NULL) + goto out; + + if ((slave = open(path, O_RDWR|O_NOCTTY)) == -1) + goto out; + + switch (pid = fork()) { + case -1: + goto out; + case 0: + close(*master); + + setsid(); + + old = signal(SIGHUP, SIG_IGN); + vhangup(); + signal(SIGHUP, old); + + if ((fd = open(path, O_RDWR)) == -1) + fatal("open failed"); + close(slave); + slave = fd; + + if (ioctl(slave, TIOCSWINSZ, ws) == -1) + fatal("ioctl failed"); + + dup2(slave, 0); + dup2(slave, 1); + dup2(slave, 2); + if (slave > 2) + close(slave); + return (0); + } + + close(slave); + return (pid); + +out: + if (*master != -1) + close(*master); + if (slave != -1) + close(slave); + return (-1); +} diff --git a/compat/forkpty-sunos.c b/compat/forkpty-sunos.c index bc4fe8a3..a4b1dbdf 100644 --- a/compat/forkpty-sunos.c +++ b/compat/forkpty-sunos.c @@ -1,7 +1,7 @@ -/* $Id: forkpty-sunos.c,v 1.5 2008-06-18 22:21:51 nicm Exp $ */ +/* $Id: forkpty-sunos.c,v 1.6 2008-06-23 21:54:48 nicm Exp $ */ /* - * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> + * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -17,6 +17,7 @@ */ #include <sys/types.h> +#include <sys/ioctl.h> #include <fcntl.h> #include <stdlib.h> @@ -52,8 +53,10 @@ forkpty(int *master, close(*master); setsid(); +#ifdef TIOCSCTTY if (ioctl(slave, TIOCSCTTY, NULL) == -1) fatal("ioctl failed"); +#endif if (ioctl(slave, I_PUSH, "ptem") == -1) fatal("ioctl failed"); |