int xmmsc_ipc_io_in_callback (xmmsc_ipc_t *ipc) { bool disco = false; x_return_val_if_fail (ipc, false); x_return_val_if_fail (!ipc->disconnect, false); while (!disco) { if (!ipc->read_msg) ipc->read_msg = xmms_ipc_msg_alloc (); if (xmms_ipc_msg_read_transport (ipc->read_msg, ipc->transport, &disco)) { xmms_ipc_msg_t *msg = ipc->read_msg; /* must unset read_msg here, because exec_msg can cause reentrancy */ ipc->read_msg = NULL; xmmsc_ipc_exec_msg (ipc, msg); } else { break; } } if (disco) xmmsc_ipc_disconnect (ipc); return !disco; }
static gboolean xmms_ipc_client_read_cb (GIOChannel *iochan, GIOCondition cond, gpointer data) { xmms_ipc_client_t *client = data; bool disconnect = FALSE; g_return_val_if_fail (client, FALSE); if (cond & G_IO_IN) { while (TRUE) { if (!client->read_msg) { client->read_msg = xmms_ipc_msg_alloc (); } if (xmms_ipc_msg_read_transport (client->read_msg, client->transport, &disconnect)) { xmms_ipc_msg_t *msg = client->read_msg; client->read_msg = NULL; process_msg (client, msg); xmms_ipc_msg_destroy (msg); } else { break; } } } if (disconnect || (cond & G_IO_HUP)) { if (client->read_msg) { xmms_ipc_msg_destroy (client->read_msg); client->read_msg = NULL; } XMMS_DBG ("disconnect was true!"); g_main_loop_quit (client->ml); return FALSE; } if (cond & G_IO_ERR) { xmms_log_error ("Client got error, maybe connection died?"); g_main_loop_quit (client->ml); return FALSE; } return TRUE; }