+/* cui_server_wait_on_exit - On exit spin until the server is available.
+ *
+ * If the program exits before connecting to the server autoboot won't be
+ * cancelled even though there has been keyboard activity. This function is
+ * called by a child process which will spin until the server is connected and
+ * told to cancel autoboot.
+ *
+ * Processes exiting from this function will not carry out the cui_atexit()
+ * steps.
+ */
+static void cui_server_wait_on_exit(struct cui *cui)
+{
+ cui_detached = true;
+
+ while (!cui->client) {
+ cui->client = discover_client_init(cui->waitset,
+ &cui_client_ops, cui);
+ if (!cui->client)
+ sleep(1);
+ }
+
+ talloc_steal(cui, cui->client);
+ discover_client_cancel_default(cui->client);
+}
+
+/* cui_server_wait - Connect to the discover server.
+ * @arg: Pointer to the cui instance.
+ *
+ * A timeout callback that attempts to connect to the discover server; on
+ * failure it registers itself with a one second timeout to try again.
+ * On success the cui->client struct will be set.
+ *
+ * Since this updates the status line when called it must not be called
+ * before the UI is ready.
+ */
+static int cui_server_wait(void *arg)
+{
+ struct cui *cui = cui_from_arg(arg);
+
+ if (cui->client) {
+ pb_debug("We already have a server!\n");
+ return 0;
+ }
+
+ /* We haven't yet connected to the server */
+ pb_log("Trying to connect...\n");
+ cui->client = discover_client_init(cui->waitset,
+ &cui_client_ops, cui);
+
+ if (!cui->client) {
+ waiter_register_timeout(cui->waitset, 1000, cui_server_wait,
+ cui);
+ nc_scr_status_printf(cui->current,
+ "Info: Waiting for device discovery");
+ } else {
+ nc_scr_status_printf(cui->current,
+ "Info: Connected to pb-discover!");
+ talloc_steal(cui, cui->client);
+
+ if (cui->has_input) {
+ pb_log("Aborting default boot on pb-discover connect\n");
+ discover_client_cancel_default(cui->client);
+ }
+ }
+
+ return 0;
+}
+