]> git.proxmox.com Git - mirror_lxc.git/commitdiff
tty.h: Ship our own minimal openpty.h
authorStéphane Graber <stgraber@ubuntu.com>
Thu, 3 Jan 2013 17:24:11 +0000 (12:24 -0500)
committerStéphane Graber <stgraber@ubuntu.com>
Wed, 9 Jan 2013 15:10:32 +0000 (10:10 -0500)
bionic is missing an openpty() function, so ship our own and only
build it and use it on bionic.

Signed-off-by: Stéphane Graber <stgraber@ubuntu.com>
Acked-by: Serge E. Hallyn <serge.hallyn@ubuntu.com>
configure.ac
src/include/openpty.c [new file with mode: 0644]
src/include/openpty.h [new file with mode: 0644]
src/lxc/Makefile.am
src/lxc/conf.c
src/lxc/console.c

index 4793573140f2437b4e651b30e2c434cba9796eec..1957687fdbb0a073605f3f51e53745ab8d90fda1 100644 (file)
@@ -213,9 +213,11 @@ AM_CONDITIONAL([IS_BIONIC], [test "x$is_bionic" = "xyes"])
 # Some systems lack PR_CAPBSET_DROP definition => HAVE_DECL_PR_CAPBSET_DROP
 AC_CHECK_DECLS([PR_CAPBSET_DROP], [], [], [#include <sys/prctl.h>])
 
-# Check for optional headers
-AC_CHECK_HEADERS([sys/signalfd.h])
+# Check for some headers
+AC_CHECK_HEADERS([sys/signalfd.h pty.h])
 
+# Check for some functions
+AC_CHECK_FUNCS([openpty])
 AC_CHECK_FUNCS([getline],
        AM_CONDITIONAL(HAVE_GETLINE, true)
        AC_DEFINE(HAVE_GETLINE,1,[Have getline]),
diff --git a/src/include/openpty.c b/src/include/openpty.c
new file mode 100644 (file)
index 0000000..0c1fecc
--- /dev/null
@@ -0,0 +1,72 @@
+/* Copyright (C) 1998, 1999, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Zack Weinberg <zack@rabi.phys.columbia.edu>, 1998.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#define _XOPEN_SOURCE       /* See feature_test_macros(7) */
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <termios.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+
+#define _PATH_DEVPTMX "/dev/ptmx"
+
+int openpty (int *amaster, int *aslave, char *name, struct termios *termp,
+       struct winsize *winp)
+{
+   char buf[PATH_MAX];
+   int master, slave;
+
+   master = open(_PATH_DEVPTMX, O_RDWR);
+   if (master == -1)
+       return -1;
+
+   if (grantpt(master))
+       goto fail;
+
+   if (unlockpt(master))
+       goto fail;
+
+   if (ptsname_r(master, buf, sizeof buf))
+       goto fail;
+
+   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;
+}
diff --git a/src/include/openpty.h b/src/include/openpty.h
new file mode 100644 (file)
index 0000000..f5fa152
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef _openpty_h
+#define _openpty_h
+
+#include <termios.h>
+#include <sys/ioctl.h>
+
+/* Create pseudo tty master slave pair with NAME and set terminal
+   attributes according to TERMP and WINP and return handles for both
+   ends in AMASTER and ASLAVE.  */
+extern int openpty (int *__amaster, int *__aslave, char *__name,
+                   const struct termios *__termp,
+                   const struct winsize *__winp);
+
+#endif
index 4dec533db6502caa4ac48174500cb3806ec106f6..134c3f2c9de4660e477544b4055985c1da0d7860 100644 (file)
@@ -17,6 +17,11 @@ pkginclude_HEADERS = \
                lxccontainer.h \
                lxclock.h
 
+if IS_BIONIC
+pkginclude_HEADERS += \
+       ../include/openpty.h
+endif
+
 if !HAVE_GETLINE
 if HAVE_FGETLN
 pkginclude_HEADERS += ../include/getline.h
@@ -67,6 +72,11 @@ liblxc_so_SOURCES = \
        lxclock.h lxclock.c \
        lxccontainer.c lxccontainer.h
 
+if IS_BIONIC
+liblxc_so_SOURCES += \
+       ../include/openpty.c ../include/openpty.h
+endif
+
 if !HAVE_GETLINE
 if HAVE_FGETLN
 liblxc_so_SOURCES += ../include/getline.c ../include/getline.h
index ab1c994abeb9a407b3961d77a95a69fd32c979b2..d69bfe1105eb89884d390f18cb42035007e312ca 100644 (file)
 #include <mntent.h>
 #include <unistd.h>
 #include <sys/wait.h>
+
+#if HAVE_PTY_H
 #include <pty.h>
+#else
+#include <../include/openpty.h>
+#endif
 
 #include <linux/loop.h>
 
index 58738270e80c912b8fcbbc515eb8e1219ac089ad..88aac846213875216697c71b177384d1d107be4a 100644 (file)
 #include <unistd.h>
 #include <fcntl.h>
 #include <errno.h>
-#include <pty.h>
 #include <sys/types.h>
 #include <termios.h>
 
 #include "log.h"
 #include "conf.h"
+#include "config.h"
 #include "start.h"     /* for struct lxc_handler */
 #include "caps.h"
 #include "commands.h"
 #include "mainloop.h"
 #include "af_unix.h"
 
+#if HAVE_PTY_H
+#include <pty.h>
+#else
+#include <../include/openpty.h>
+#endif
+
 lxc_log_define(lxc_console, lxc);
 
 extern int lxc_console(const char *name, int ttynum, int *fd)