Ejemplo n.º 1
0
int main(int argc, char **argv)
{
	event_init();
    discover_server();
    event_dispatch();
    
    for(;;);
    
	return 0;
}
Ejemplo n.º 2
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);
	}
}