diff options
| -rw-r--r-- | .travis.yml | 2 | ||||
| -rw-r--r-- | backends/maweb.c | 2 | ||||
| -rw-r--r-- | backends/winmidi.c | 39 | 
3 files changed, 37 insertions, 6 deletions
diff --git a/.travis.yml b/.travis.yml index ced21ef..ea4bd94 100644 --- a/.travis.yml +++ b/.travis.yml @@ -75,7 +75,7 @@ matrix:             - ubuntu-toolchain-r-test      - os: linux        dist: xenial -      compiler: mingw-gcc +      compiler: x86_64-w64-mingw32-gcc        env: TASK='windows'        addons:          apt: diff --git a/backends/maweb.c b/backends/maweb.c index 88f7b9a..c88ca8c 100644 --- a/backends/maweb.c +++ b/backends/maweb.c @@ -591,7 +591,7 @@ static int maweb_handle_message(instance* inst, char* payload, size_t payload_le  		fprintf(stderr, "maweb sending user credentials\n");  		snprintf(xmit_buffer, sizeof(xmit_buffer),  				"{\"requestType\":\"login\",\"username\":\"%s\",\"password\":\"%s\",\"session\":%" PRIu64 "}", -				(data->peer_type == peer_dot2) ? "remote" : data->user, data->pass, data->session); +				(data->peer_type == peer_dot2) ? "remote" : data->user, data->pass ? data->pass : MAWEB_DEFAULT_PASSWORD, data->session);  		maweb_send_frame(inst, ws_text, (uint8_t*) xmit_buffer, strlen(xmit_buffer));  	}  	if(json_obj(payload, "status") && json_obj(payload, "appType")){ diff --git a/backends/winmidi.c b/backends/winmidi.c index 2c52a22..4c72c32 100644 --- a/backends/winmidi.c +++ b/backends/winmidi.c @@ -181,6 +181,11 @@ static int winmidi_set(instance* inst, size_t num, channel** c, channel_value* v  	};  	size_t u; +	//early exit +	if(!num){ +		return 0; +	} +  	if(!data->device_out){  		fprintf(stderr, "winmidi instance %s has no output device\n", inst->name);  		return 0; @@ -433,9 +438,12 @@ static int winmidi_start(){  	int device, rv = -1;  	instance** inst = NULL;  	winmidi_instance_data* data = NULL; -	struct sockaddr_storage sockadd; +	struct sockaddr_storage sockadd = { +		0 +	};  	//this really should be a size_t but getsockname specifies int* for some reason  	int sockadd_len = sizeof(sockadd); +	char* error = NULL;  	DBGPF("winmidi main thread ID is %ld\n", GetCurrentThreadId());  	//fetch all instances @@ -457,18 +465,41 @@ static int winmidi_start(){  	}  	//open the feedback sockets -	backend_config.socket_pair[0] = mmbackend_socket(NULL, "0", SOCK_DGRAM, 1, 0); +	//for some reason this while construct fails to work on 'real' windows with ipv6 +	backend_config.socket_pair[0] = mmbackend_socket("127.0.0.1", "0", SOCK_DGRAM, 1, 0);  	if(backend_config.socket_pair[0] < 0){  		fprintf(stderr, "winmidi failed to open feedback socket\n");  		return 1;  	}  	if(getsockname(backend_config.socket_pair[0], (struct sockaddr*) &sockadd, &sockadd_len)){ -		fprintf(stderr, "winmidi failed to query feedback socket information\n"); +		FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, +			NULL, WSAGetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &error, 0, NULL); +		fprintf(stderr, "winmidi failed to query feedback socket information: %s\n", error); +		LocalFree(error);  		return 1;  	} +	//getsockname on 'real' windows may not set the adress - works on wine, though +	switch(sockadd.ss_family){ +		case AF_INET: +		case AF_INET6: +			((struct sockaddr_in*) &sockadd)->sin_family = AF_INET; +			((struct sockaddr_in*) &sockadd)->sin_addr.s_addr = htobe32(INADDR_LOOPBACK); +			break; +		//for some absurd reason 'real' windows announces the socket as AF_INET6 but rejects any connection unless its AF_INET +//		case AF_INET6: +//			((struct sockaddr_in6*) &sockadd)->sin6_addr = in6addr_any; +//			break; +		default: +			fprintf(stderr, "winmidi invalid feedback socket family\n"); +			return 1; +	} +	DBGPF("winmidi feedback socket family %d port %d\n", sockadd.ss_family, be16toh(((struct sockaddr_in*)&sockadd)->sin_port));  	backend_config.socket_pair[1] = socket(sockadd.ss_family, SOCK_DGRAM, IPPROTO_UDP);  	if(backend_config.socket_pair[1] < 0 || connect(backend_config.socket_pair[1], (struct sockaddr*) &sockadd, sockadd_len)){ -		fprintf(stderr, "winmidi failed to connect to feedback socket\n"); +		FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, +			NULL, WSAGetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &error, 0, NULL); +		fprintf(stderr, "winmidi failed to connect to feedback socket: %s\n", error); +		LocalFree(error);  		return 1;  	}  | 
