diff options
Diffstat (limited to 'backends/libmmbackend.c')
| -rw-r--r-- | backends/libmmbackend.c | 74 | 
1 files changed, 69 insertions, 5 deletions
| diff --git a/backends/libmmbackend.c b/backends/libmmbackend.c index b9513ac..2bbc226 100644 --- a/backends/libmmbackend.c +++ b/backends/libmmbackend.c @@ -1,6 +1,70 @@  #include "libmmbackend.h"  #define LOGPF(format, ...) fprintf(stderr, "libmmbe\t" format "\n", __VA_ARGS__) +#define LOG(message) fprintf(stderr, "libmmbe\t%s\n", (message)) + +int mmbackend_strdup(char** dest, char* src){ +	if(*dest){ +		free(*dest); +	} + +	*dest = strdup(src); + +	if(!*dest){ +		LOG("Failed to allocate memory"); +		return 1; +	} +	return 0; +} + +char* mmbackend_socket_strerror(int err_no){ +	#ifdef _WIN32 +	static char error[2048] = ""; +	FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, WSAGetLastError(), +			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), error, sizeof(error), NULL); +	return error; +	#else +	return strerror(err_no); +	#endif +} + +const char* mmbackend_sockaddr_ntop(struct sockaddr* peer, char* buffer, size_t length){ +	union { +		struct sockaddr* in; +		struct sockaddr_in* in4; +		struct sockaddr_in6* in6; +	} addr; +	addr.in = peer; +	#ifdef _WIN32 +	uint8_t* data = NULL; +	#endif + +	switch(addr.in->sa_family){ +		//inet_ntop has become available in the winapi with vista, but eh. +		#ifdef _WIN32 +		case AF_INET6: +			data = addr.in6->sin6_addr.s6_addr; +			snprintf(buffer, length, "%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X", +					data[0], data[1], data[2], data[3], +					data[4], data[5], data[6], data[7], +					data[8], data[9], data[10], data[11], +					data[12], data[13], data[14], data[15]); +			return buffer; +		case AF_INET: +			data = (uint8_t*) &(addr.in4->sin_addr.s_addr); +			snprintf(buffer, length, "%d.%d.%d.%d", data[0], data[1], data[2], data[3]); +			return buffer; +		#else +		case AF_INET6: +			return inet_ntop(addr.in->sa_family, &(addr.in6->sin6_addr), buffer, length); +		case AF_INET: +			return inet_ntop(addr.in->sa_family, &(addr.in4->sin_addr), buffer, length); +		#endif +		default: +			snprintf(buffer, length, "Socket family not implemented"); +			return buffer; +	} +}  void mmbackend_parse_hostspec(char* spec, char** host, char** port, char** options){  	size_t u = 0; @@ -92,18 +156,18 @@ int mmbackend_socket(char* host, char* port, int socktype, uint8_t listener, uin  		//set required socket options  		yes = 1;  		if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void*)&yes, sizeof(yes)) < 0){ -			LOGPF("Failed to enable SO_REUSEADDR on socket: %s", strerror(errno)); +			LOGPF("Failed to enable SO_REUSEADDR on socket: %s", mmbackend_socket_strerror(errno));  		}  		if(mcast){  			yes = 1;  			if(setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (void*)&yes, sizeof(yes)) < 0){ -				LOGPF("Failed to enable SO_BROADCAST on socket: %s", strerror(errno)); +				LOGPF("Failed to enable SO_BROADCAST on socket: %s", mmbackend_socket_strerror(errno));  			}  			yes = 0;  			if(setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, (void*)&yes, sizeof(yes)) < 0){ -				LOGPF("Failed to disable IP_MULTICAST_LOOP on socket: %s", strerror(errno)); +				LOGPF("Failed to disable IP_MULTICAST_LOOP on socket: %s", mmbackend_socket_strerror(errno));  			}  		} @@ -141,7 +205,7 @@ int mmbackend_socket(char* host, char* port, int socktype, uint8_t listener, uin  	#else  	int flags = fcntl(fd, F_GETFL, 0);  	if(fcntl(fd, F_SETFL, flags | O_NONBLOCK) < 0){ -		LOGPF("Failed to set socket nonblocking: %s", strerror(errno)); +		LOGPF("Failed to set socket nonblocking: %s", mmbackend_socket_strerror(errno));  		close(fd);  		return -1;  	} @@ -159,7 +223,7 @@ int mmbackend_send(int fd, uint8_t* data, size_t length){  		sent = send(fd, data + total, 1, 0);  		#endif  		if(sent < 0){ -			LOGPF("Failed to send: %s", strerror(errno)); +			LOGPF("Failed to send: %s", mmbackend_socket_strerror(errno));  			return 1;  		}  		total += sent; | 
