[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