diff mbox

[v2,2/6] tools/console: introduce --start-notify-fd option for console client

Message ID 1470418894-11358-3-git-send-email-wei.liu2@citrix.com (mailing list archive)
State New, archived
Headers show

Commit Message

Wei Liu Aug. 5, 2016, 5:41 p.m. UTC
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>
---
v2: properly handle write(2) errors
---
 tools/console/client/main.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

Comments

Ian Jackson Aug. 8, 2016, 10:11 a.m. UTC | #1
Wei Liu writes ("[PATCH v2 2/6] tools/console: introduce --start-notify-fd option for console client"):
> The console client will write 0x00 to that fd before entering console
> loop to indicate its readiness.

Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>

> +		do {
> +			r = write(start_notify_fd, msg, 1);
> +		} while ((r == -1 && errno == EINTR) || r == 0);

I don't think write(,,1) can return 0.  If I wrote this code I would
either call abort, or crash, in that case.  But spinning is OK too.

Ian.
diff mbox

Patch

diff --git a/tools/console/client/main.c b/tools/console/client/main.c
index be39700..977779f 100644
--- a/tools/console/client/main.c
+++ b/tools/console/client/main.c
@@ -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);