X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=vserver-start%2Fdefaulttty.c;fp=vserver-start%2Fdefaulttty.c;h=8b71080773f07ec93e847d3b5b85cd8da21fe6d3;hb=3f3cf95f755f3ef1c31ad8e38153deb4ee214c66;hp=0000000000000000000000000000000000000000;hpb=bfa4b37aaa195007a09bc166e8c8563d5a3c2ef1;p=util-vserver.git diff --git a/vserver-start/defaulttty.c b/vserver-start/defaulttty.c new file mode 100644 index 0000000..8b71080 --- /dev/null +++ b/vserver-start/defaulttty.c @@ -0,0 +1,80 @@ +// $Id: defaulttty.c,v 1.2 2005/01/26 15:30:40 ensc Exp $ --*- c -*-- + +// Copyright (C) 2004 Enrico Scholz +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; version 2 of the License. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "vserver-start.h" +#include + +#include + +#include +#include +#include +#include + +#define ENSC_WRAPPERS_UNISTD 1 +#define ENSC_WRAPPERS_FCNTL 1 +#include + + +inline static bool +checkTTY(char const /*@null@*/ *p) +{ + return p!=0 && access(p, R_OK|W_OK)==0; +} + +void +setDefaultTTY(PathInfo const *cfgdir, char const *dflt) +{ + PathInfo subpath = ENSC_STRING_FIXED("/apps/init/tty"); + char buf[ENSC_PI_APPSZ(*cfgdir, subpath)]; + char const * new_tty = 0; + + do { + PathInfo ttypath = *cfgdir; + + PathInfo_append(&ttypath, &subpath, buf); + new_tty = String_c_str(&ttypath, buf); + if (checkTTY(new_tty)) break; + + new_tty = CONFDIR "/.defaults/apps/init/tty"; + if (checkTTY(new_tty)) break; + + new_tty = dflt; + if (checkTTY(new_tty)) break; + + new_tty = "/dev/null"; + } while (false); + + int fd_in = Eopen(new_tty, O_RDONLY, 0); + if (fd_in!=0) { + Edup2(fd_in, 0); + Eclose(fd_in); + } + + int fd_out = Eopen(new_tty, O_WRONLY, 0600); + if (fd_out!=1) { + Edup2(fd_out, 1); + Eclose(fd_out); + } + + Edup2(1, 2); +}