Factore out the console code and encapsulate the code in
functions.

Signed-off-by: Daniel Lezcano <dlezc...@fr.ibm.com>
---
 src/lxc/lxc_console.c |   67 ++++++++++++++++++++++++++++++++------------------
 1 file changed, 43 insertions(+), 24 deletions(-)

Index: lxc/src/lxc/lxc_console.c
===================================================================
--- lxc.orig/src/lxc/lxc_console.c
+++ lxc/src/lxc/lxc_console.c
@@ -100,11 +100,43 @@ static void sigwinch(int sig)
        winsz();
 }
 
+static int setup_tios(int fd, struct termios *newtios, struct termios *oldtios)
+{
+       if (isatty(fd)) {
+               ERROR("'%d' is not a tty", fd);
+               return -1;
+       }
+
+       /* Get current termios */
+       if (tcgetattr(0, oldtios)) {
+               SYSERROR("failed to get current terminal settings");
+               return -1;
+       }
+
+       *newtios = *oldtios;
+
+       /* Remove the echo characters and signal reception, the echo
+        * will be done below with master proxying */
+       newtios->c_iflag &= ~IGNBRK;
+       newtios->c_iflag &= BRKINT;
+       newtios->c_lflag &= ~(ECHO|ICANON|ISIG);
+       newtios->c_cc[VMIN] = 1;
+       newtios->c_cc[VTIME] = 0;
+
+       /* Set new attributes */
+       if (tcsetattr(0, TCSAFLUSH, newtios)) {
+               ERROR("failed to set new terminal settings");
+               return -1;
+       }
+
+       return 0;
+}
+
 int main(int argc, char *argv[])
 {
        int wait4q = 0;
        int err;
-       struct termios tios, oldtios;
+       struct termios newtios, oldtios;
 
        err = lxc_arguments_parse(&my_args, argc, argv);
        if (err)
@@ -114,27 +146,8 @@ int main(int argc, char *argv[])
                         my_args.progname, my_args.quiet))
                return -1;
 
-       /* Get current termios */
-       if (tcgetattr(0, &tios)) {
-               ERROR("failed to get current terminal settings : %s",
-                     strerror(errno));
-               return -1;
-       }
-
-       oldtios = tios;
-
-       /* Remove the echo characters and signal reception, the echo
-        * will be done below with master proxying */
-       tios.c_iflag &= ~IGNBRK;
-       tios.c_iflag &= BRKINT;
-       tios.c_lflag &= ~(ECHO|ICANON|ISIG);
-       tios.c_cc[VMIN] = 1;
-       tios.c_cc[VTIME] = 0;
-
-       /* Set new attributes */
-       if (tcsetattr(0, TCSAFLUSH, &tios)) {
-               ERROR("failed to set new terminal settings : %s",
-                     strerror(errno));
+       if (setup_tios(0, &newtios, &oldtios)) {
+               ERROR("failed to setup tios");
                return -1;
        }
 
@@ -145,8 +158,14 @@ int main(int argc, char *argv[])
        fprintf(stderr, "\nType <Ctrl+%c q> to exit the console\n",
                 'a' + my_args.escape - 1);
 
-       setsid();
-       signal(SIGWINCH, sigwinch);
+       if (setsid())
+               INFO("already group leader");
+
+       if (signal(SIGWINCH, sigwinch) == SIG_ERR) {
+               SYSERROR("failed to set SIGWINCH handler");
+               return -1;
+       }
+
        winsz();
 
        err = 0;


------------------------------------------------------------------------------
The Planet: dedicated and managed hosting, cloud storage, colocation
Stay online with enterprise data centers and the best network in the business
Choose flexible plans and management services without long-term contracts
Personal 24x7 support from experience hosting pros just a phone call away.
http://p.sf.net/sfu/theplanet-com
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to