[libvirt] [PATCH 1/1] lxc: use our own hand-rolled code in place of unlockpt and grantpt
Eli Qiao
taget at linux.vnet.ibm.com
Mon Oct 17 03:54:15 UTC 2011
hi Serge :
I checked the code , only in lxc_controller.c call virFileOpenTtyAt().
I didn't test the path, but my suggestion is that modify the
utility function in /src/util/util.c instead of adding a new function.
> The glibc ones cannot handle ptys opened in a devpts not mounted at
> /dev/pts.
>
> Signed-off-by: Serge Hallyn<serge.hallyn at canonical.com>
> ---
> src/lxc/lxc_controller.c | 82 +++++++++++++++++++++++++++++++++++++++++++--
> 1 files changed, 78 insertions(+), 4 deletions(-)
>
> diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
> index 89ce7f5..d79f5ba 100644
> --- a/src/lxc/lxc_controller.c
> +++ b/src/lxc/lxc_controller.c
> @@ -41,6 +41,8 @@
> #include<locale.h>
> #include<linux/loop.h>
> #include<dirent.h>
> +#include<grp.h>
> +#include<sys/stat.h>
>
> #if HAVE_CAPNG
> # include<cap-ng.h>
> @@ -781,6 +783,81 @@ static int lxcSetPersonality(virDomainDefPtr def)
> #endif
>
> static int
> +lxcGetTtyGid(void) {
> + char *grtmpbuf;
> + struct group grbuf;
> + size_t grbuflen = sysconf(_SC_GETGR_R_SIZE_MAX);
> + struct group *p;
> + int ret;
> + gid_t tty_gid = -1;
> +
> + /* Get the group ID of the special `tty' group. */
> + if (grbuflen == (size_t) -1L)
> + /* `sysconf' does not support _SC_GETGR_R_SIZE_MAX.
> + Try a moderate value. */
> + grbuflen = 1024;
> +
> + grtmpbuf = (char *) alloca (grbuflen);
use this macro VIR_ALLOC_N(ptr, count) to allocate memory and you should
also check if it is valid.
> + ret = getgrnam_r("tty",&grbuf, grtmpbuf, grbuflen,&p);
> + if (ret || p != NULL)
> + tty_gid = p->gr_gid;
> +
> + return tty_gid == -1 ? getgid() : tty_gid;
> +}
> +
> +#define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) /* 0777 */
> +
> +/* heavily borrowed from glibc, but don't assume devpts == "/dev/pts" */
> +static int
> +lxcCreateTty(char *ptmx, int *ttymaster, char **ttyName)
> +{
> + int rc = -1;
> + int ret;
> + int ptyno;
> + uid_t uid;
> + gid_t gid;
> + struct stat st;
> + int unlock = 0;
> +
> + if ((*ttymaster = open(ptmx, O_RDWR|O_NOCTTY|O_NONBLOCK))< 0)
> + goto cleanup;
> +
> + if (ioctl(*ttymaster, TIOCSPTLCK,&unlock)< 0)
> + goto cleanup;
> +
> + ret = ioctl(*ttymaster, TIOCGPTN,&ptyno);
> + if (ret< 0)
> + goto cleanup;
if (ioctl(*ttymaster, TIOCGPTN, &ptyno) < 0)
goto clearup;
> +
> + ret = fstat(*ttymaster,&st);
> +
> + uid = getuid();
> + gid = lxcGetTtyGid();
> + if (st.st_uid != uid || st.st_gid != gid)
> + if (fchown(*ttymaster, uid, gid)< 0)
> + goto cleanup;
> +
> + if ((st.st_mode& ACCESSPERMS) != (S_IRUSR|S_IWUSR|S_IWGRP))
> + if (fchmod(*ttymaster, S_IRUSR|S_IWUSR|S_IWGRP)< 0)
> + goto cleanup;
> +
> + if (VIR_ALLOC_N(*ttyName, PATH_MAX)< 0) {
> + errno = ENOMEM;
> + goto cleanup;
> + }
> +
> + snprintf(*ttyName, PATH_MAX, "/dev/pts/%d", ptyno);
> +
> + rc = 0;
> +
> +cleanup:
> + if (rc != 0)
> + VIR_FORCE_CLOSE(*ttymaster);
> +
> + return rc;
> +}
> +
> +static int
> lxcControllerRun(virDomainDefPtr def,
> unsigned int nveths,
> char **veths,
> @@ -894,10 +971,7 @@ lxcControllerRun(virDomainDefPtr def,
>
> if (devptmx) {
> VIR_DEBUG("Opening tty on private %s", devptmx);
> - if (virFileOpenTtyAt(devptmx,
> -&containerPty,
> -&containerPtyPath,
> - 0)< 0) {
> + if (lxcCreateTty(devptmx,&containerPty,&containerPtyPath)< 0) {
> virReportSystemError(errno, "%s",
> _("Failed to allocate tty"));
> goto cleanup;
> -- 1.7.5.4 -- libvir-list mailing list libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
--
best regards
eli
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20111017/bd8af892/attachment-0001.htm>
More information about the libvir-list
mailing list