static bool setup_socket (xmmsc_connection_t *c, xmmsc_vis_udp_t *t, int32_t id, int32_t port) { struct addrinfo hints; struct addrinfo *result, *rp; char *host; char portstr[10]; char packet[1 + sizeof(int32_t)]; int32_t* packet_id = (int32_t*)&packet[1]; sprintf (portstr, "%d", port); memset (&hints, 0, sizeof (hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; hints.ai_flags = 0; hints.ai_protocol = 0; host = xmms_ipc_hostname (c->path); if (!host) { host = strdup ("localhost"); } if (xmms_getaddrinfo (host, portstr, &hints, &result) != 0) { c->error = strdup("Couldn't setup socket!"); return false; } free (host); for (rp = result; rp != NULL; rp = rp->ai_next) { if (!xmms_socket_valid (t->socket[0] = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol))) { continue; } if (connect (t->socket[0], rp->ai_addr, rp->ai_addrlen) != -1) { /* Windows doesn't support MSG_DONTWAIT. Why should it? Ripping off BSD, but without mutilating it? No! */ xmms_socket_set_nonblock (t->socket[0]); /* init fallback socket for timing stuff */ t->socket[1] = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); connect (t->socket[1], rp->ai_addr, rp->ai_addrlen); break; } else { xmms_socket_close (t->socket[0]); } } if (rp == NULL) { c->error = strdup("Could not connect!"); return false; } xmms_freeaddrinfo (result); packet[0] = 'H'; *packet_id = htonl (id); send (t->socket[0], &packet, sizeof (packet), 0); t->timediff = udp_timediff (id, t->socket[1]); /* printf ("diff: %f\n", t->timediff); */ return true; }
static void xmms_visualization_destroy (xmms_object_t *object) { XMMS_DBG ("Deactivating visualization object."); xmms_object_unref (vis->output); /* TODO: assure that the xform is already dead! */ g_mutex_clear (&vis->clientlock); xmms_log_debug ("starting cleanup of %d vis clients", vis->clientc); for (; vis->clientc > 0; --vis->clientc) { delete_client (vis->clientc - 1); } if (xmms_socket_valid (vis->socket)) { /* it seems there is no way to remove the watch */ g_io_channel_shutdown (vis->socketio, FALSE, NULL); xmms_socket_close (vis->socket); } xmms_visualization_unregister_ipc_commands (); }
void cleanup_udp (xmmsc_vis_udp_t *t) { xmms_socket_close (t->socket[0]); xmms_socket_close (t->socket[1]); }