aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorcbdev <cb@cbcdn.com>2020-04-11 19:22:57 +0200
committercbdev <cb@cbcdn.com>2020-04-11 19:22:57 +0200
commitbac13064352234acea012de30ee36dd51748b97f (patch)
tree99c39a41be56265530e5e6750bb977c739d083a6
parentb53092ac95fa25d0e6e4e4fc3de9531f43038c4f (diff)
downloadmidimonster-bac13064352234acea012de30ee36dd51748b97f.tar.gz
midimonster-bac13064352234acea012de30ee36dd51748b97f.tar.bz2
midimonster-bac13064352234acea012de30ee36dd51748b97f.zip
Implement strerror abstraction for Windows
-rw-r--r--TODO1
-rw-r--r--backends/libmmbackend.c21
-rw-r--r--backends/libmmbackend.h1
-rw-r--r--backends/rtpmidi.c19
4 files changed, 27 insertions, 15 deletions
diff --git a/TODO b/TODO
index 900cc1b..a4a7e32 100644
--- a/TODO
+++ b/TODO
@@ -5,5 +5,4 @@ udp backends may ignore MTU
mm_managed_fd.impl is not freed currently (and is heaped most of the time anyway) -> documentation
make event collectors threadsafe to stop marshalling data...
collect & check backend API version
-windows strerror
move all connection establishment to _start to be able to hot-stop/start all backends
diff --git a/backends/libmmbackend.c b/backends/libmmbackend.c
index ab96646..1624f56 100644
--- a/backends/libmmbackend.c
+++ b/backends/libmmbackend.c
@@ -17,6 +17,17 @@ int mmbackend_strdup(char** dest, char* src){
return 0;
}
+char* mmbackend_sockstrerror(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
+}
+
void mmbackend_parse_hostspec(char* spec, char** host, char** port, char** options){
size_t u = 0;
@@ -107,18 +118,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_sockstrerror(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_sockstrerror(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_sockstrerror(errno));
}
}
@@ -156,7 +167,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_sockstrerror(errno));
close(fd);
return -1;
}
@@ -174,7 +185,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_sockstrerror(errno));
return 1;
}
total += sent;
diff --git a/backends/libmmbackend.h b/backends/libmmbackend.h
index cb211a6..f487ee1 100644
--- a/backends/libmmbackend.h
+++ b/backends/libmmbackend.h
@@ -21,6 +21,7 @@
/** Convenience functions **/
int mmbackend_strdup(char** dest, char* src);
+char* mmbackend_sockstrerror(int errno);
/** Networking functions **/
diff --git a/backends/rtpmidi.c b/backends/rtpmidi.c
index 95a50d2..581b16c 100644
--- a/backends/rtpmidi.c
+++ b/backends/rtpmidi.c
@@ -28,7 +28,6 @@
//TODO announce on mdns input
//TODO connect to discovered peers
//TODO refactor cfg.announces
-//TODO windows address discovery
//TODO for some reason, the announce packet generates an exception in the wireshark dissector
static struct /*_rtpmidi_global*/ {
@@ -325,7 +324,7 @@ static int rtpmidi_announce_addrs(){
struct ifaddrs* ifa = NULL, *iter = NULL;
if(getifaddrs(&ifa)){
- LOGPF("Failed to get adapter address information: %s", strerror(errno));
+ LOGPF("Failed to get adapter address information: %s", mmbackend_sockstrerror(errno));
return 1;
}
@@ -411,7 +410,7 @@ static int rtpmidi_bind_instance(instance* inst, rtpmidi_instance_data* data, ch
}
if(getsockname(data->fd, (struct sockaddr*) &sock_addr, &sock_len)){
- LOGPF("Failed to fetch data port information: %s", strerror(errno));
+ LOGPF("Failed to fetch data port information: %s", mmbackend_sockstrerror(errno));
return 1;
}
@@ -1242,7 +1241,7 @@ static int rtpmidi_mdns_announce(rtpmidi_instance_data* data){
offset += sizeof(dns_rr_srv);
//rfc2782 (srv) says to not compress `target`, rfc6762 (mdns) 18.14 says to
- //we dont do it because i dont want to
+ //we don't do it because i don't want to
snprintf((char*) frame + offset, sizeof(frame) - offset, "%s.local", cfg.mdns_name);
if(dns_encode_name((char*) frame + offset, &name)){
LOGPF("Failed to encode name for %s", frame + offset);
@@ -1486,11 +1485,15 @@ static int rtpmidi_handle_mdns(){
free(name.name);
free(host.name);
if(bytes <= 0){
+ #ifdef _WIN32
+ if(WSAGetLastError() == WSAEWOULDBLOCK){
+ #else
if(errno == EAGAIN){
+ #endif
return 0;
}
- LOGPF("Error reading from mDNS descriptor: %s", strerror(errno));
+ LOGPF("Error reading from mDNS descriptor: %s", mmbackend_sockstrerror(errno));
return 1;
}
@@ -1564,14 +1567,12 @@ static int rtpmidi_start_mdns(){
//join ipv4 multicast group
if(setsockopt(cfg.mdns_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (uint8_t*) &mcast_req, sizeof(mcast_req))){
- LOGPF("Failed to join IPv4 multicast group for mDNS: %s", strerror(errno));
- return 1;
+ LOGPF("Failed to join IPv4 multicast group for mDNS, discovery may be impaired: %s", mmbackend_sockstrerror(errno));
}
//join ipv6 multicast group
if(setsockopt(cfg.mdns_fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (uint8_t*) &mcast6_req, sizeof(mcast6_req))){
- LOGPF("Failed to join IPv6 multicast group for mDNS: %s", strerror(errno));
- return 1;
+ LOGPF("Failed to join IPv6 multicast group for mDNS, discovery may be impaired: %s", mmbackend_sockstrerror(errno));
}
//register mdns fd to core