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

Stéphane Graber stgraber at ubuntu.com
Thu Jan 3 17:24:11 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>
---
 configure.ac          | 12 ++++-----
 src/include/openpty.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++
 src/include/openpty.h | 14 ++++++++++
 src/lxc/Makefile.am   |  8 ++++++
 src/lxc/conf.c        |  5 ++++
 src/lxc/console.c     |  8 +++++-
 6 files changed, 111 insertions(+), 8 deletions(-)
 create mode 100644 src/include/openpty.c
 create mode 100644 src/include/openpty.h

diff --git a/configure.ac b/configure.ac
index 960d610..4e4a6dd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -182,16 +182,14 @@ AC_CHECK_HEADERS([linux/unistd.h linux/netlink.h linux/genetlink.h],
 				[#include <sys/socket.h>])
 
 # Check for libcap suport
-AC_CHECK_HEADERS([sys/capability.h], [], AC_MSG_ERROR(["Please install the libcap development files."]),
-[#include <sys/types.h>
-#include <sys/capability.h>])
 AC_CHECK_LIB(cap,cap_set_proc,caplib=yes,caplib=no)
 AC_MSG_CHECKING(["linux capabilities"])
 if test "x$caplib" = "xyes" ; then
 	CAP_LIBS="-lcap"
 	AC_MSG_RESULT([$CAP_LIBS])
 else
-	AC_MSG_ERROR([not found])
+	CAP_LIBS=""
+	AC_MSG_RESULT([not found])
 fi
 AC_SUBST([CAP_LIBS])
 
@@ -212,11 +210,11 @@ AM_CONDITIONAL([IS_BIONIC], [test "x$libc_type" = "xbionic"])
 # 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 sys/capability.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 489beac..c82ee76 100644
--- a/src/lxc/Makefile.am
+++ b/src/lxc/Makefile.am
@@ -17,6 +17,10 @@ pkginclude_HEADERS = \
 		lxccontainer.h \
 		lxclock.h
 
+if IS_BIONIC
+pkginclude_HEADERS += ../include/openpty.h
+endif
+
 sodir=$(libdir)
 # use PROGRAMS to avoid complains from automake
 so_PROGRAMS = liblxc.so
@@ -61,6 +65,10 @@ liblxc_so_SOURCES = \
 	lxclock.h lxclock.c \
 	lxccontainer.c lxccontainer.h
 
+if IS_BIONIC
+liblxc_so_SOURCES += ../include/openpty.c ../include/openpty.h
+endif
+
 AM_CFLAGS=-I$(top_srcdir)/src \
 	-DLXCROOTFSMOUNT=\"$(LXCROOTFSMOUNT)\" \
 	-DLXCPATH=\"$(LXCPATH)\" \
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