/** * This function will be invoked after `initialise_server` (if not re-exec:ing) * or after `unmarshal_server` (if re-exec:ing) * * @return Non-zero on error */ int postinitialise_server(void) { if (connected) return 0; if (reconnect_to_display()) { mds_message_destroy(&received); fail_if (1); } connected = 1; fail_if ((errno = pthread_create(&secondary_thread, NULL, secondary_loop, NULL))); return 0; fail: return 1; }
/** * Perform the server's mission * * @return Non-zero on error */ int master_loop(void) { int rc = 1, r; while (!reexecing && !terminating) { if (!(r = mds_message_read(&received, socket_fd))) if (!(r = echo_message())) continue; if (r == -2) { eprint("corrupt message received, aborting."); goto done; } else if (errno == EINTR) { continue; } else { fail_if (errno != ECONNRESET); } eprint("lost connection to server."); mds_message_destroy(&received); mds_message_initialise(&received); connected = 0; fail_if (reconnect_to_display()); connected = 1; } rc = 0; goto done; fail: xperror(*argv); done: if (rc || !reexecing) mds_message_destroy(&received); free(echo_buffer); return rc; }