Commit e827ff7e by Stéphane Graber

tty.h: Ship our own minimal openpty.h

bionic is missing an openpty() function, so ship our own and only build it and use it on bionic. Signed-off-by: 's avatarStéphane Graber <stgraber@ubuntu.com> Acked-by: 's avatarSerge E. Hallyn <serge.hallyn@ubuntu.com>
parent 1f1665e6
......@@ -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]),
......
/* 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;
}
#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
......@@ -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
......
......@@ -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>
......
......@@ -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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment