int main(int argc, char **argv) { event_init(); discover_server(); event_dispatch(); for(;;); return 0; }
void slimproto(log_level level, in_addr_t addr, u8_t mac[6], const char *name) { struct sockaddr_in serv_addr; static char fixed_cap[128], var_cap[128] = ""; bool reconnect = false; int i; wake_create(wake_e); loglevel = level; running = true; slimproto_ip = addr ? addr : discover_server(); if (!running) return; LOCK_O; sprintf(fixed_cap, ",MaxSampleRate=%u", output.max_sample_rate); for (i = 0; i < MAX_CODECS; i++) { if (codecs[i] && codecs[i]->id && strlen(fixed_cap) < 128 - 10) { strcat(fixed_cap, ","); strcat(fixed_cap, codecs[i]->types); } } UNLOCK_O; memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = slimproto_ip; serv_addr.sin_port = htons(PORT); LOG_INFO("connecting to %s:%d", inet_ntoa(serv_addr.sin_addr), ntohs(serv_addr.sin_port)); new_server = 0; while (running) { if (new_server) { slimproto_ip = serv_addr.sin_addr.s_addr = new_server; LOG_INFO("switching server to %s:%d", inet_ntoa(serv_addr.sin_addr), ntohs(serv_addr.sin_port)); new_server = 0; reconnect = false; } sock = socket(AF_INET, SOCK_STREAM, 0); if (connect(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { LOG_INFO("unable to connect to server"); sleep(5); } else { LOG_INFO("connected"); set_nosigpipe(sock); var_cap[0] = '\0'; #if !WIN // check if this is a local player now we are connected & signal to server via 'loc' format // this requires LocalPlayer server plugin to enable direct file access // not supported on windows at present as the poll in stream.c does not work for file access struct sockaddr_in our_addr; socklen_t len; len = sizeof(our_addr); getsockname(sock, (struct sockaddr *) &our_addr, &len); if (our_addr.sin_addr.s_addr == serv_addr.sin_addr.s_addr) { LOG_INFO("local player"); strcat(var_cap, ",loc"); } #endif // add on any capablity to be sent to the new server if (new_server_cap) { strcat(var_cap, new_server_cap); free(new_server_cap); new_server_cap = NULL; } sendHELO(reconnect, fixed_cap, var_cap, mac); if (name) { sendSETDName(name); name = NULL; } slimproto_run(); if (!reconnect) { reconnect = true; } usleep(100000); } closesocket(sock); } }