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

Serge Hallyn serge.hallyn at canonical.com
Thu Jan 3 20:46:51 UTC 2013


Quoting Stéphane Graber (stgraber at ubuntu.com):
> 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);

Heh, I was going to comment here, but I see that

BUGS
       Nobody  knows  how  much  space should be reserved for
       name.  So, calling openpty() or  forkpty()  with  non-
       NULL name may not be secure.

Oh well :)

Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>


> +
> +   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
> 
> 
> ------------------------------------------------------------------------------
> Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS,
> MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current
> with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft
> MVPs and experts. ON SALE this month only -- learn more at:
> http://p.sf.net/sfu/learnmore_122712
> _______________________________________________
> Lxc-devel mailing list
> Lxc-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/lxc-devel




More information about the lxc-devel mailing list