Similar to other tools, like 'tail -f', allow 'jailhosue enable' to
follow the console output when jailhouse gets enabled.

On failure, we will print the console as well (if available).

'jailhouse enable CELL -v' will print the hypervisor's console content
upon enabling jailhouse and terminate.

Signed-off-by: Ralf Ramsauer <[email protected]>
---
 tools/jailhouse.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 57 insertions(+), 7 deletions(-)

diff --git a/tools/jailhouse.c b/tools/jailhouse.c
index ab495fda..5760b087 100644
--- a/tools/jailhouse.c
+++ b/tools/jailhouse.c
@@ -62,7 +62,8 @@ static void __attribute__((noreturn)) help(char *prog, int 
exit_status)
 
        printf("Usage: %s { COMMAND | --help || --version }\n"
               "\nAvailable commands:\n"
-              "   enable SYSCONFIG\n"
+              "   enable SYSCONFIG"
+              " { [ -f | --follow ] | [ -v | --verbose] }\n"
               "   disable\n"
               "   cell create CELLCONFIG\n"
               "   cell list\n"
@@ -86,6 +87,21 @@ static bool match_opt(const char *argv, const char 
*short_opt,
                strcmp(argv, long_opt) == 0;
 }
 
+static int fd_set_nonblock(int fd)
+{
+       int ret;
+       
+       ret = fcntl(fd, F_GETFL, 0);
+       if (ret == -1)
+               return -errno;
+
+       ret |= O_NONBLOCK;
+       ret = fcntl(fd, F_SETFL, ret);
+       if (ret == -1)
+               return -errno;
+       return 0;
+}
+
 static void call_extension_script(const char *cmd, int argc, char *argv[])
 {
        const struct extension *ext;
@@ -207,21 +223,55 @@ static int enable(int argc, char *argv[])
 {
        void *config;
        int err, fd;
+       char console_buffer[128];
+       ssize_t r;
+       bool dump_console = false;
 
-       if (argc != 3)
+       fd = open_dev();
+
+       if (argc < 3 || argc > 4)
                help(argv[0], 1);
 
-       config = read_file(argv[2], NULL);
+       if (argc == 4 && match_opt(argv[3], "-f", "--follow"))
+               dump_console = true;
 
-       fd = open_dev();
+       if (argc == 4 && match_opt(argv[3], "-v", "--verbose")) {
+               dump_console = true;
+               err = fd_set_nonblock(fd);
+               if (err) {
+                       perror("FD_SET_NONBLOCK");
+                       goto fd_close;
+               }
+       }
+
+       config = read_file(argv[2], NULL);
 
        err = ioctl(fd, JAILHOUSE_ENABLE, config);
-       if (err)
+       if (err) {
                perror("JAILHOUSE_ENABLE");
+               err = fd_set_nonblock(fd);
+               if (err) {
+                       perror("FD_SET_NONBLOCK");
+                       goto config_free;
+               }
+               dump_console = true;
+       }
 
-       close(fd);
-       free(config);
+       if (dump_console) {
+               do {
+                       r = read(fd, console_buffer, sizeof(console_buffer));
+                       if (r < 0)
+                               break;
+                       r = write(STDOUT_FILENO, console_buffer, r);
+               } while(r);
+               if (r < 0)
+                       err = r;
+       }
 
+config_free:
+       free(config);
+fd_close:
+       close(fd);
        return err;
 }
 
-- 
2.11.0

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to