1. support for compiling under AIX


On 03/25/2011 10:25 PM, Ross Mohn wrote:
>  I'm going to post a series of 6 patches for dvtm over the next several
> minutes. They all apply to the current HEAD of the dvtm git repository
> (committed 2011-01-07). I think I've teased them all apart pretty well
> so that each one is separate and complete.
>
> 1. support for compiling under AIX
> 2. support the 8 basic highlighted colors, plus a couple of color_hash fixes
> 3. fix a scrolling issue and add in "ESC #" to call interpret_esc_SCS()
> 4. support for "ESC 6 n", get cursor position, which calls a new
> function, send_curs()
> 5. support colorrules[] to match strings against window titles,
> applycolorrules(), and call madtty_set_dflt_colors()
> 6. support to backfill text from the buffer when a windows is resized
> with more rows
>
> Comments, testing, and bugfixes sincerely welcome!
>
> Cheers! -Ross
>
>
Index: madtty.c
===================================================================
--- madtty.c    (.../vendor/current)    (revision 47)
+++ madtty.c    (.../trunk)     (revision 47)
@@ -41,7 +41,7 @@
 #elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__)
 # include <util.h>
 #endif
-#ifdef __CYGWIN__
+#if defined(__CYGWIN__) || defined(_AIX)
 # include <alloca.h>
 #endif
 
@@ -1306,6 +1348,10 @@
     t->bell = !t->bell;
 }
 
+#ifdef _AIX
+# include "forkpty-aix.c"
+#endif
+
 pid_t madtty_forkpty(madtty_t *t, const char *p, const char *argv[], const 
char *env[], int *pty)
 {
     struct winsize ws;
Index: config.h
===================================================================
--- config.h    (.../vendor/current)    (revision 47)
+++ config.h    (.../trunk)     (revision 47)
@@ -53,7 +59,7 @@
        { "[ ]", fullscreen },
 };
 
-#define MOD CTRL('g')
+#define MOD CONTROL('g')
 
 /* you can at most specifiy MAX_ARGS (2) number of arguments */
 Key keys[] = {
Index: dvtm.c
===================================================================
--- dvtm.c      (.../vendor/current)    (revision 47)
+++ dvtm.c      (.../trunk)     (revision 47)
@@ -13,7 +13,11 @@
 #define _GNU_SOURCE
 #include <sys/stat.h>
 #include <sys/ioctl.h>
-#include <sys/fcntl.h>
+#ifdef _AIX
+# include <fcntl.h>
+#else
+# include <sys/fcntl.h>
+#endif
 #include <sys/wait.h>
 #include <sys/time.h>
 #include <sys/types.h>
@@ -57,10 +61,15 @@
        Client *prev;
 };
 
 #define ALT(k)      ((k) + (161 - 'a'))
-#ifndef CTRL
-  #define CTRL(k)   ((k) & 0x1F)
-#endif
+#define CONTROL(k)  ((k) & 0x1F)
 #define CTRL_ALT(k) ((k) + (129 - 'a'))
 
 #define MAX_ARGS 2
@@ -568,7 +578,8 @@
 static void
 lock(const char *args[]) {
        size_t len = 0, i = 0;
-       char buf[16], *pass = buf, c;
+       char buf[16], *pass = buf;
+       int c;
 
        erase();
        curs_set(0);
@@ -966,13 +996,14 @@
 keypress(int code) {
        Client *c;
        int len = 1;
+       int x;
        char buf[8] = { '\e' };
 
        if (code == '\e') {
                /* pass characters following escape to the underlying app */
                nodelay(stdscr, TRUE);
-               while (len < sizeof(buf) - 1 && (buf[len] = getch()) != ERR)
-                       len++;
+               while (len < sizeof(buf) - 1 && (x = getch()) != ERR)
+                       buf[len++] = x;
                buf[len] = '\0';
                nodelay(stdscr, FALSE);
        }
Index: forkpty-aix.c
===================================================================
--- forkpty-aix.c       (.../vendor/current)    (revision 0)
+++ forkpty-aix.c       (.../trunk)     (revision 47)
@@ -0,0 +1,164 @@
+/*
+ * Copyright (c) 2009 Nicholas Marriott <n...@users.sourceforge.net>
+ * Copyright (c) 2011 Ross Palmer Mohn <rpm...@waxandwane.org>
+ *
+ * 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.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
USA.
+ */
+
+#include <fcntl.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <termios.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+
+/* Open a pseudo-terminal. */
+static int
+openpty (int *amaster, int *aslave, char *name,
+         struct termios const *termp, struct winsize const *winp)
+{
+  int master;
+  char *slave_name;
+  int slave;
+
+  master = open ("/dev/ptc", O_RDWR | O_NOCTTY);
+  if (master < 0)
+    return -1;
+
+
+  if (grantpt (master))
+    goto fail;
+
+  if (unlockpt (master))
+    goto fail;
+
+  slave_name = ptsname (master);
+  if (slave_name == NULL)
+    goto fail;
+
+  slave = open (slave_name, 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, slave_name);
+
+  return 0;
+
+ fail:
+  close (master);
+  return -1;
+}
+
+/* Assign a given terminal as controlling terminal and as standard input,
+   standard output, standard error of the current process.                */
+static int
+login_tty (int slave_fd)
+{
+  int i;
+
+  /* Create a new session.  */
+  setsid ();
+
+  /* Make fd the controlling terminal for the current process.
+     On Solaris:
+       A terminal becomes the controlling terminal of a session
+       if it is being open()ed, at a moment when
+         1. it is not already the controlling terminal of some session, and
+         2. the process that open()s it is a session leader that does not have
+            a controlling terminal.
+       We assume condition 1, try to ensure condition 2, and then open() it.
+   */
+  for (i = 0; i < 3; i++)
+    if (i != slave_fd)
+      close (i);
+
+    char *slave_name;
+    int dummy_fd;
+
+    slave_name = ttyname (slave_fd);
+    if (slave_name == NULL)
+      return -1;
+    dummy_fd = open (slave_name, O_RDWR);
+    if (dummy_fd < 0)
+      return -1;
+    close (dummy_fd);
+
+  /* Assign fd to the standard input, standard output, and standard error of
+     the current process.  */
+  for (i = 0; i < 3; i++)
+    if (slave_fd != i)
+      while (dup2 (slave_fd, i) == -1 && errno == EBUSY);
+//      if (dup2 (slave_fd, i) < 0)
+//        return -1;
+  if (slave_fd >= 3)
+    close (slave_fd);
+
+  return 0;
+}
+
+/* Fork a child process attached to the slave of a pseudo-terminal. */
+static int
+forkpty (int *amaster, char *name,
+         const struct termios *termp, const struct winsize *winp)
+{
+  int master, slave, pid;
+
+  if (openpty (&master, &slave, name, termp, winp) == -1)
+    return -1;
+
+  switch (pid = fork ())
+    {
+    case -1:
+      close (master);
+      close (slave);
+      return -1;
+
+    case 0:
+      /* Child.  */
+      close (master);
+      if (login_tty (slave))
+        _exit (1);
+      return 0;
+
+    default:
+      /* Parent.  */
+      *amaster = master;
+      close (slave);
+//      sleep(1);
+      return pid;
+    }
+}

Reply via email to