From a440bd520cef45673b7f9c3cc15f0fa3de48f767 Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Sun, 13 Dec 2015 21:40:43 +0100 Subject: [PATCH] - clean up sockaddr types - use memcpy instead of struct copy in sendto_port otherwise copied struct is damaged, arm gcc 4.5.4 broken? --- dddvb | 1 - octoserve/octoserve.c | 10 +++++----- octoserve/octoserve.h | 4 ++-- octoserve/ssdp.c | 34 ++++++++++++++++++++++------------ 4 files changed, 29 insertions(+), 20 deletions(-) delete mode 160000 dddvb diff --git a/dddvb b/dddvb deleted file mode 160000 index 829929a..0000000 --- a/dddvb +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 829929a41f8c926ad59704eb712630b7fe0803a1 diff --git a/octoserve/octoserve.c b/octoserve/octoserve.c index af04e8c..895e419 100644 --- a/octoserve/octoserve.c +++ b/octoserve/octoserve.c @@ -2447,7 +2447,7 @@ static void os_serve(struct octoserve *os) die("Error in sigaction"); os->rtsp_sock = streamsock("554", AF_INET, &os->rtsp_sadr); - sockname(&os->rtsp_sadr, os->rtsp_ip); + sockname((struct sockaddr *) &os->rtsp_sadr, os->rtsp_ip); dbgprintf(DEBUG_SYS, "rtsp_ip: %s, %d\n", os->rtsp_ip, os->rtsp_sock); if (listen(os->rtsp_sock, 20) < 0) { dbgprintf(DEBUG_SYS, "listen error"); @@ -2580,14 +2580,14 @@ static struct octoserve *os_init(char *ifname, int nossdp, int nodms, int nodvbt os->ifname = ifname; os->sessionid = random(); - if (get_ifa(ifname, AF_INET, &os->ssdp.sadr) < 0) { + if (get_ifa(ifname, AF_INET, (struct sockaddr *) &os->ssdp.sadr) < 0) { perror("no such interface:"); free(os); return NULL; } - get_ifa(ifname, AF_INET6, &os->ssdp.sadr6); - sockname(&os->ssdp.sadr, os->ssdp.ip); - sockname(&os->ssdp.sadr6, os->ssdp.ip6); + get_ifa(ifname, AF_INET6, (struct sockaddr *) &os->ssdp.sadr6); + sockname((struct sockaddr *) &os->ssdp.sadr, os->ssdp.ip); + sockname((struct sockaddr *) &os->ssdp.sadr6, os->ssdp.ip6); strcpy(ifr.ifr_name, os->ifname); s = socket(AF_INET, SOCK_DGRAM, 0); diff --git a/octoserve/octoserve.h b/octoserve/octoserve.h index e7afaec..e9ca5b0 100644 --- a/octoserve/octoserve.h +++ b/octoserve/octoserve.h @@ -388,11 +388,11 @@ struct os_ssdp { pthread_t pt; int sock; - struct sockaddr sadr; + struct sockaddr_in sadr; char ip[INET6_ADDRSTRLEN]; int sock6; - struct sockaddr sadr6; + struct sockaddr_in6 sadr6; char ip6[INET6_ADDRSTRLEN]; uint8_t uuid[16]; diff --git a/octoserve/ssdp.c b/octoserve/ssdp.c index 71d4465..6f012ab 100644 --- a/octoserve/ssdp.c +++ b/octoserve/ssdp.c @@ -132,12 +132,19 @@ static int ssdp_msg(struct os_ssdp *ss, char *buf, int n, int notify, int nr, in } static int sendto_port(int sock, const void *buf, size_t len, - struct sockaddr_in *cadr, uint16_t port) + struct sockaddr *cadr, uint16_t port) { - struct sockaddr_in adr = *cadr; + struct sockaddr_in adr; + struct sockaddr_in sadr = *cadr; + int r; + /*adr = *((struct sockaddr_in *) cadr); */ + /* struct assignment seem to be broken in arm gcc 4.5.4?!? */5B + memcpy(&adr, cadr, sizeof(adr)); adr.sin_port = htons(port); - return sendto(sock, buf, len, 0, (struct sockaddr *) &adr, sizeof(adr)); + r = sendto(sock, buf, len, 0, (struct sockaddr *) &adr, sizeof(adr)); + //dbgprintf(DEBUG_SSDP, "sent to port %u, family %u, ret=%d errno=%d\n", port, adr.sin_family, r, errno); + return r; } static int send_ssdp_msg(struct os_ssdp *ss, int nr, int notify) @@ -260,8 +267,8 @@ static int send_reply_msearch(struct os_ssdp *ss, int mc, int send_id, int nr) insadr.sin_addr.s_addr = inet_addr("239.255.255.250"); res = sendto(s, buf, len, 0, (struct sockaddr *) &insadr, sizeof(insadr)); } else - res = sendto(s, buf, len, 0, &ss->cadr, sizeof(struct sockaddr)); - //res = sendto_port(ss->sock, buf, len, &ss->cadr, ss->csport); + //res = sendto(s, buf, len, 0, &ss->cadr, sizeof(struct sockaddr)); + res = sendto_port(s, buf, len, &ss->cadr, ss->csport); return res; } @@ -396,7 +403,7 @@ static void handle_ssdp(struct octoserve *os, char *m, int ml) host, hport, type, htype, mx); /* M-SEARCH */ if (ss->setup) { - if (type == 1 && mx > 0) { + if (type == 1 && mx > 0 && st != NULL) { //ssdp_msearch(ss, htype == 2 ? 0 : 1, st); ssdp_msearch(ss, 0, st); } @@ -646,19 +653,22 @@ int init_ssdp(struct octoserve *os, struct os_ssdp *ss, uint32_t d, int nossdp, ss->bootid = id + 1; write_id("boot", ss->bootid); + dbgprintf(DEBUG_SSDP, "DEVID = %u\n", ss->devid); + + ss->configid = 1; - get_ifa(os->ifname, AF_INET, &os->ssdp.sadr); - get_ifa(os->ifname, AF_INET6, &os->ssdp.sadr6); - sockname(&os->ssdp.sadr, os->ssdp.ip); - sockname(&os->ssdp.sadr6, os->ssdp.ip6); + get_ifa(os->ifname, AF_INET, (struct sockaddr *) &os->ssdp.sadr); + get_ifa(os->ifname, AF_INET6, (struct sockaddr *) &os->ssdp.sadr6); + sockname((struct sockaddr *) &os->ssdp.sadr, os->ssdp.ip); + sockname((struct sockaddr *) &os->ssdp.sadr6, os->ssdp.ip6); if (!nossdp) { - ss->sock = ssdpsock(os->ifname, AF_INET, &os->ssdp.sadr); + ss->sock = ssdpsock(os->ifname, AF_INET, (struct sockaddr *) &os->ssdp.sadr); if (ss->sock < 0) return -1; - ss->sock6 = ssdpsock(os->ifname, AF_INET6, &os->ssdp.sadr); + ss->sock6 = ssdpsock(os->ifname, AF_INET6, (struct sockaddr *) &os->ssdp.sadr); if (ss->sock6 < 0) return -1;