26 #include <sys/types.h>
30 #define snprintf _snprintf
38 #define EADDRINUSE WSAEADDRINUSE
41 #include <sys/socket.h>
46 #include <arpa/inet.h>
50 #define geterror() WSAGetLastError()
52 #define geterror() errno
60 #define LO_HOST_SIZE 1024
79 const char *port,
int proto,
94 #define GAI_STRERROR_BUFFER_SIZE 1024
96 char *WSAAPI gai_strerrorA(
int ecode)
99 static char buff[GAI_STRERROR_BUFFER_SIZE + 1];
101 dwMsgLen = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM
102 |FORMAT_MESSAGE_IGNORE_INSERTS
103 |FORMAT_MESSAGE_MAX_WIDTH_MASK,
106 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
108 GAI_STRERROR_BUFFER_SIZE,
114 static int stateWSock = -1;
120 if(stateWSock >= 0)
return stateWSock;
123 reqversion = MAKEWORD( 2, 2 );
124 if(WSAStartup(reqversion,&wsaData) != 0) {
128 else if ( LOBYTE( wsaData.wVersion ) != LOBYTE(reqversion) ||
129 HIBYTE( wsaData.wVersion ) != HIBYTE(reqversion) ) {
159 const char *port,
int proto,
163 struct addrinfo *ai = NULL, *it, *used;
164 struct addrinfo hints;
174 if (port && *port ==
'/') proto =
LO_UNIX;
182 if(!initWSock())
return NULL;
197 s->sockets_alloc = 2;
198 s->sockets = calloc(2,
sizeof(*(s->sockets)));
205 s->sockets[0].fd = -1;
207 memset(&hints, 0,
sizeof(hints));
210 hints.ai_socktype = SOCK_DGRAM;
211 }
else if (proto ==
LO_TCP) {
212 hints.ai_socktype = SOCK_STREAM;
217 struct sockaddr_un sa;
219 s->sockets[0].fd = socket(PF_UNIX, SOCK_DGRAM, 0);
220 if (s->sockets[0].fd == -1) {
223 lo_throw(s, err, strerror(err),
"socket()");
229 sa.sun_family = AF_UNIX;
230 strncpy(sa.sun_path, port,
sizeof(sa.sun_path)-1);
232 if ((ret = bind(s->sockets[0].fd,
233 (
struct sockaddr *)&sa,
sizeof(sa))) < 0) {
235 lo_throw(s, err, strerror(err),
"bind()");
241 s->path = strdup(port);
254 hints.ai_family = PF_UNSPEC;
256 hints.ai_family = PF_INET;
258 hints.ai_flags = AI_PASSIVE;
268 snprintf(pnum, 15,
"%ld", 10000 + ((
unsigned int)rand() +
269 time(NULL)) % 10000);
272 if ((ret = getaddrinfo(NULL, service, &hints, &ai))) {
273 lo_throw(s, ret, gai_strerror(ret), NULL);
281 s->sockets[0].fd = -1;
284 for (it = ai; it && s->sockets[0].fd == -1; it = it->ai_next) {
286 s->sockets[0].fd = socket(it->ai_family, hints.ai_socktype, 0);
288 if (s->sockets[0].fd == -1) {
291 lo_throw(s, err, strerror(err),
"socket()");
305 if ((ret = bind(s->sockets[0].fd, used->ai_addr, used->ai_addrlen)) < 0) {
307 if (err == EINVAL || err == EADDRINUSE) {
312 lo_throw(s, err, strerror(err),
"bind()");
318 }
while (!used && tries++ < 16);
328 listen(s->sockets[0].fd, 8);
339 lo_client_sockets.
udp = s->sockets[0].fd;
340 }
else if (proto ==
LO_TCP) {
341 lo_client_sockets.
tcp = s->sockets[0].fd;
349 for (it = ai; it; it = it->ai_next) {
350 if (getnameinfo(it->ai_addr, it->ai_addrlen, hostname,
351 sizeof(hostname), NULL, 0, NI_NAMEREQD) == 0) {
358 if (hostname[0] ==
':') {
368 gethostname(hostname,
sizeof(hostname));
369 he = gethostbyname(hostname);
371 strncpy(hostname, he->h_name,
sizeof(hostname));
377 strcpy(hostname,
"localhost");
379 s->hostname = strdup(hostname);
381 if (used->ai_family == PF_INET6) {
382 struct sockaddr_in6 *addr = (
struct sockaddr_in6 *)used->ai_addr;
384 s->port = htons(addr->sin6_port);
385 }
else if (used->ai_family == PF_INET) {
386 struct sockaddr_in *addr = (
struct sockaddr_in *)used->ai_addr;
388 s->port = htons(addr->sin_port);
391 s->port = atoi(port);
400 unsigned int yes = 1;
401 memset(&mreq, 0,
sizeof(mreq));
402 #ifdef HAVE_INET_ATON
403 if (inet_aton(group, &mreq.imr_multiaddr)==0) {
405 lo_throw(s, err, strerror(err),
"inet_aton()");
410 mreq.imr_multiaddr.s_addr = inet_addr(group);
411 if (mreq.imr_multiaddr.s_addr == INADDR_ANY
412 || mreq.imr_multiaddr.s_addr == INADDR_NONE)
415 lo_throw(s, err, strerror(err),
"inet_addr()");
420 mreq.imr_interface.s_addr=htonl(INADDR_ANY);
422 if (setsockopt(s->sockets[0].fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,
423 &mreq,
sizeof(mreq)) < 0)
426 lo_throw(s, err, strerror(err),
"setsockopt(IP_ADD_MEMBERSHIP)");
431 if (setsockopt(s->sockets[0].fd,SOL_SOCKET,SO_REUSEADDR,
432 &yes,
sizeof(yes)) < 0)
435 lo_throw(s, err, strerror(err),
"setsockopt(SO_REUSEADDR)");
441 if (setsockopt(s->sockets[0].fd,SOL_SOCKET,SO_REUSEPORT,
442 &yes,
sizeof(yes)) < 0)
445 lo_throw(s, err, strerror(err),
"setsockopt(SO_REUSEPORT)");
461 for (i=s->sockets_len-1; i >= 0; i--)
463 if (s->sockets[i].fd != -1) {
465 && s->sockets[i].fd == lo_client_sockets.
udp)
467 lo_client_sockets.
udp = -1;
469 else if (s->protocol ==
LO_TCP
470 && s->sockets[0].fd == lo_client_sockets.
tcp)
472 lo_client_sockets.
tcp = -1;
475 close(s->sockets[i].fd);
476 s->sockets[i].fd = -1;
488 if (s->protocol ==
LO_UNIX) unlink( s->path );
492 for (it = s->first; it; it = next) {
494 free((
char *)it->path);
495 free((
char *)it->typespec);
510 if(!initWSock())
return NULL;
513 s->addr_len =
sizeof(s->addr);
516 (
struct sockaddr *)&s->addr, &s->addr_len);
521 memcpy(data, buffer, ret);
523 if (size) *size = ret;
530 struct sockaddr_storage addr;
531 socklen_t addr_len =
sizeof(addr);
553 for (i=0; i < s->sockets_len; i++) {
554 s->sockets[i].events = POLLIN | POLLPRI;
555 s->sockets[i].revents = 0;
558 poll(s->sockets, s->sockets_len, -1);
560 for (i=(s->sockets_len-1); i >= 0; --i) {
561 if (s->sockets[i].revents == POLLERR
562 || s->sockets[i].revents == POLLHUP)
565 close(s->sockets[i].fd);
572 if (s->sockets[i].revents) {
573 sock = s->sockets[i].fd;
577 if(!initWSock())
return NULL;
580 for (i=(s->sockets_len-1); i >= 0; --i) {
581 FD_SET(s->sockets[i].fd, &ps);
582 if (s->sockets[i].fd > nfds)
583 nfds = s->sockets[i].fd;
586 if (select(nfds+1,&ps,NULL,NULL,NULL) == SOCKET_ERROR)
589 for (i=0; i < s->sockets_len; i++) {
590 if (FD_ISSET(s->sockets[i].fd, &ps)) {
591 sock = s->sockets[i].fd;
596 if (sock == -1 || !repeat)
600 if (sock == s->sockets[0].fd) {
601 sock = accept(sock, (
struct sockaddr *)&addr, &addr_len);
614 ret = recv(sock, &read_size,
sizeof(read_size), 0);
615 read_size = ntohl(read_size);
623 ret = recv(sock, buffer, read_size, 0);
636 memcpy(data, buffer, ret);
638 if (size) *size = ret;
650 struct timeval stimeout;
655 for (i=0; i < s->sockets_len; i++) {
656 s->sockets[i].events = POLLIN | POLLPRI | POLLERR | POLLHUP;
657 s->sockets[i].revents = 0;
660 poll(s->sockets, s->sockets_len,
661 timeout > sched_timeout ? sched_timeout : timeout);
666 for (i=0; i < s->sockets_len; i++) {
667 if (s->sockets[i].revents == POLLERR
668 || s->sockets[i].revents == POLLHUP)
670 if (s->sockets[i].revents)
677 if(!initWSock())
return 0;
679 to = timeout > sched_timeout ? sched_timeout : timeout;
680 stimeout.tv_sec = to/1000;
681 stimeout.tv_usec = (to%1000)*1000;
684 for (i=0; i < s->sockets_len; i++) {
685 FD_SET(s->sockets[i].fd,&ps);
686 if (s->sockets[i].fd > nfds)
687 nfds = s->sockets[i].fd;
690 res = select(nfds+1,&ps,NULL,NULL,&stimeout);
692 if(res == SOCKET_ERROR)
722 struct timeval stimeout;
728 if (sched_time > 0.01) {
729 if (sched_time > 10.0) {
734 for (i=0; i < s->sockets_len; i++) {
735 s->sockets[i].events = POLLIN | POLLPRI | POLLERR | POLLHUP;
736 s->sockets[i].revents = 0;
739 poll(s->sockets, s->sockets_len, (
int)(sched_time * 1000.0));
741 for (i=0; i < s->sockets_len; i++)
743 if ( s->sockets[i].revents == POLLERR
744 || s->sockets[i].revents == POLLHUP)
747 if (s->sockets[i].revents)
751 if (i >= s->sockets_len)
755 if (sched_time > 0.01)
762 if(!initWSock())
return 0;
765 for (i=0; i < s->sockets_len; i++) {
766 FD_SET(s->sockets[i].fd,&ps);
767 if (s->sockets[i].fd > nfds)
768 nfds = s->sockets[i].fd;
771 stimeout.tv_sec = sched_time;
772 stimeout.tv_usec = (sched_time-stimeout.tv_sec)*1.e6;
773 res = select(nfds+1,&ps,NULL,NULL,&stimeout);
774 if(res == SOCKET_ERROR) {
781 if (sched_time > 0.01)
791 if (s->protocol ==
LO_TCP) {
815 if ((s->sockets_len+1) > s->sockets_alloc) {
816 void *sp = realloc(s->sockets,
817 sizeof(*(s->sockets))*(s->sockets_alloc*2));
821 s->sockets_alloc *= 2;
824 s->sockets[s->sockets_len].fd = socket;
827 return s->sockets_len-1;
840 if (index < 0 && socket != -1) {
841 for (index=0; index < s->sockets_len; index++)
842 if (s->sockets[index].fd == socket)
846 if (index < 0 || index >= s->sockets_len)
849 for (i=index+1; i < s->sockets_len; i++)
850 s->sockets[i-1] = s->sockets[i];
860 lo_throw(s, -len,
"Invalid message path", NULL);
864 if (!strcmp(data,
"#bundle")) {
871 if (bundle_result < 0) {
872 lo_throw(s, -bundle_result,
"Invalid bundle", NULL);
873 return bundle_result;
875 pos = (
char *)data + len;
885 while (remain >= 4) {
887 elem_len =
lo_otoh32(*((uint32_t *)pos));
892 lo_throw(s, result,
"Invalid bundle element received", path);
914 lo_throw(s, result,
"Invalid message received", path);
933 delay = delay > 100.0 ? 100.0 : delay;
934 delay = delay < 0.0 ? 0.0 : delay;
945 char *types = msg->types + 1;
946 int argc = strlen(types);
947 lo_arg **argv = msg->argv;
951 int pattern = strpbrk(path,
" #*,?[]{}") != NULL;
960 if (s->protocol ==
LO_UDP && s->addr_len>0) {
961 err = getnameinfo((
struct sockaddr *)&s->addr,
sizeof(s->addr),
962 hostname,
sizeof(hostname), portname,
sizeof(portname),
963 NI_NUMERICHOST | NI_NUMERICSERV);
967 lo_throw(s, err,
"Try again", path);
970 lo_throw(s, err,
"Bad flags", path);
976 lo_throw(s, err,
"Cannot resolve address family", path);
979 lo_throw(s, err,
"Out of memory", path);
982 lo_throw(s, err,
"Cannot resolve", path);
986 lo_throw(s, err, strerror(err), path);
990 lo_throw(s, err,
"Unknown error", path);
1003 if (src->host) free(src->host);
1004 if (src->host) free(src->port);
1005 src->host = strdup(hostname);
1006 src->port = strdup(portname);
1007 src->protocol = s->protocol;
1009 for (it = s->first; it; it = it->next) {
1011 if (!it->path || !strcmp(path, it->path) ||
1014 if (!it->typespec || !strcmp(types, it->typespec)) {
1019 if (it->path) pptr = it->path;
1020 ret = it->handler(pptr, types, argv, argc, msg,
1026 char *ptr = msg->data;
1027 char *data_co, *data_co_ptr;
1029 argv = calloc(argc,
sizeof(
lo_arg *));
1030 for (i=0; i<argc; i++) {
1035 data_co = malloc(opsize);
1036 data_co_ptr = data_co;
1038 for (i=0; i<argc; i++) {
1039 argv[i] = (
lo_arg *)data_co_ptr;
1041 types[i], (
lo_arg *)ptr);
1042 data_co_ptr +=
lo_arg_size(it->typespec[i], data_co_ptr);
1050 if (it->path) pptr = it->path;
1051 ret = it->handler(pptr, it->typespec, argv, argc, msg,
1058 if (ret == 0 && !pattern) {
1065 if (ret == 1 && s->protocol ==
LO_UDP) {
1066 char *pos = strrchr(path,
'/');
1069 if (pos && *(pos+1) ==
'\0') {
1071 int len = strlen(path);
1072 lo_strlist *sl = NULL, *slit, *slnew, *slend;
1074 if (!strcmp(types,
"i")) {
1079 for (it = s->first; it; it = it->next) {
1081 if (it->path && !strncmp(path, it->path, len)) {
1085 tmp = malloc(strlen(it->path + len) + 1);
1086 strcpy(tmp, it->path + len);
1088 sec = strchr(tmp,
'/');
1090 sec = index(tmp,
'/');
1092 if (sec) *sec =
'\0';
1094 for (slit = sl; slit; slend = slit, slit = slit->
next) {
1095 if (!strcmp(slit->str, tmp)) {
1108 slend->
next = slnew;
1133 return s->queued != 0;
1145 ins->
path = strdup(path);
1185 disp_time = head->
ts;
1190 tailhead = head->
next;
1198 s->queued = tailhead;
1212 if (path && strpbrk(path,
" #*,?[]{}")) {
1217 m->path = strdup(path);
1223 m->typespec = strdup(typespec);
1229 m->user_data = user_data;
1237 for (it=s->first; it->next; it=it->next);
1245 const char *typespec)
1250 if (!s->first)
return;
1251 if (path) pattern = strpbrk(path,
" #*,?[]{}") != NULL;
1260 if ((it->path == path) ||
1261 (path && it->path && !strcmp(path, it->path)) ||
1264 if ((it->typespec == typespec) ||
1265 (typespec && it->typespec && !strcmp(typespec, it->typespec))
1268 if (it == s->first) {
1269 s->first = it->next;
1271 prev->next = it->next;
1274 free((
void *)it->path);
1275 free((
void *)it->typespec);
1287 if (s->protocol !=
LO_UDP &&
1295 return s->sockets[0].fd;
1327 char *proto = s->protocol ==
LO_UDP ?
"udp" :
"tcp";
1330 ret = snprintf(NULL, 0,
"osc.%s://%s:%d/", proto, s->hostname, s->port);
1336 buf = malloc((ret + 2) *
sizeof(
char));
1337 snprintf(buf, ret+1,
"osc.%s://%s:%d/", proto, s->hostname, s->port);
1342 else if (s->protocol ==
LO_UNIX) {
1343 ret = snprintf(NULL, 0,
"osc.unix:///%s", s->path);
1348 buf = malloc((ret + 2) *
sizeof(
char));
1349 snprintf(buf, ret+1,
"osc.unix:///%s", s->path);
1361 printf(
"socket: %d\n\n", s->sockets[0].fd);
1362 printf(
"Methods\n");
1363 for (it = s->first; it; it = it->next) {
1373 if (strlen(a) != strlen(b)) {
1377 for (i=0; a[i]; i++) {
1396 (*s->err_h)(errnum, message, path);