]> xenbits.xensource.com Git - xen.git/commitdiff
tools/console: introduce --start-notify-fd option for console client
authorWei Liu <wei.liu2@citrix.com>
Fri, 29 Jul 2016 17:24:25 +0000 (18:24 +0100)
committerWei Liu <wei.liu2@citrix.com>
Mon, 8 Aug 2016 10:41:27 +0000 (11:41 +0100)
The console client will write 0x00 to that fd before entering console
loop to indicate its readiness.

Signed-off-by: Wei Liu <wei.liu2@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/console/client/main.c

index be3970030a65fb1892844c9020c92270eaa33997..977779f034ad5c464184f3157b240f4e423fed9b 100644 (file)
@@ -77,6 +77,7 @@ static void usage(const char *program) {
               "  -h, --help       display this help and exit\n"
               "  -n, --num N      use console number N\n"
               "  --type TYPE      console type. must be 'pv' or 'serial'\n"
+              "  --start-notify-fd N file descriptor used to notify parent\n"
               , program);
 }
 
@@ -327,10 +328,12 @@ int main(int argc, char **argv)
        int ch;
        unsigned int num = 0;
        int opt_ind=0;
+       int start_notify_fd = -1;
        struct option lopt[] = {
                { "type",     1, 0, 't' },
                { "num",     1, 0, 'n' },
                { "help",    0, 0, 'h' },
+               { "start-notify-fd", 1, 0, 's' },
                { 0 },
 
        };
@@ -364,6 +367,9 @@ int main(int argc, char **argv)
                                exit(EINVAL);
                        }
                        break;
+               case 's':
+                       start_notify_fd = atoi(optarg);
+                       break;
                default:
                        fprintf(stderr, "Invalid argument\n");
                        fprintf(stderr, "Try `%s --help' for more information.\n", 
@@ -462,6 +468,22 @@ int main(int argc, char **argv)
                init_term(STDIN_FILENO, &stdin_old_attr);
                atexit(restore_term_stdin); /* if this fails, oh dear */
        }
+
+       if (start_notify_fd != -1) {
+               /* Write 0x00 to notify parent about client's readiness */
+               static const char msg[] = { 0x00 };
+               int r;
+
+               do {
+                       r = write(start_notify_fd, msg, 1);
+               } while ((r == -1 && errno == EINTR) || r == 0);
+
+               if (r == -1)
+                       err(errno, "Could not notify parent with fd %d",
+                           start_notify_fd);
+               close(start_notify_fd);
+       }
+
        console_loop(spty, xs, path, interactive);
 
        free(path);