[lxc-devel] [PATCH 10/24] tty.h: Ship our own minimal openpty.h

Stéphane Graber stgraber at ubuntu.com
Tue Jan 8 17:03:00 UTC 2013


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 at ubuntu.com>
Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>
---
 configure.ac          |  6 ++---
 src/include/openpty.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++
 src/include/openpty.h | 14 ++++++++++
 src/lxc/Makefile.am   |  6 +++--
 src/lxc/conf.c        |  5 ++++
 src/lxc/console.c     |  8 +++++-
 6 files changed, 105 insertions(+), 6 deletions(-)
 create mode 100644 src/include/openpty.c
 create mode 100644 src/include/openpty.h

diff --git a/configure.ac b/configure.ac
index 50e64ff..ea98f02 100644
--- a/configure.ac
+++ b/configure.ac
@@ -213,11 +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([getline fgetln])
+AC_CHECK_FUNCS([getline fgetln openpty])
 
 # Check for some standard binaries
 AC_PROG_GCC_TRADITIONAL
diff --git a/src/include/openpty.c b/src/include/openpty.c
new file mode 100644
index 0000000..0c1fecc
--- /dev/null
+++ b/src/include/openpty.c
@@ -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 at 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
index 0000000..f5fa152
--- /dev/null
+++ b/src/include/openpty.h
@@ -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
diff --git a/src/lxc/Makefile.am b/src/lxc/Makefile.am
index 6fbd79f..3d800d5 100644
--- a/src/lxc/Makefile.am
+++ b/src/lxc/Makefile.am
@@ -19,7 +19,8 @@ pkginclude_HEADERS = \
 
 if IS_BIONIC
 pkginclude_HEADERS += \
-	../include/getline.h
+	../include/getline.h \
+	../include/openpty.h
 endif
 
 sodir=$(libdir)
@@ -68,7 +69,8 @@ liblxc_so_SOURCES = \
 
 if IS_BIONIC
 liblxc_so_SOURCES += \
-	../include/getline.c ../include/getline.h
+	../include/getline.c ../include/getline.h \
+	../include/openpty.c ../include/openpty.h
 endif
 
 AM_CFLAGS=-I$(top_srcdir)/src \
diff --git a/src/lxc/conf.c b/src/lxc/conf.c
index 7e1d10a..49bba2a 100644
--- a/src/lxc/conf.c
+++ b/src/lxc/conf.c
@@ -31,7 +31,12 @@
 #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>
 
diff --git a/src/lxc/console.c b/src/lxc/console.c
index 5873827..88aac84 100644
--- a/src/lxc/console.c
+++ b/src/lxc/console.c
@@ -26,18 +26,24 @@
 #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)
-- 
1.8.0





More information about the lxc-devel mailing list