diff options
-rw-r--r-- | Makefile.in | 15 | ||||
-rwxr-xr-x | configure | 2 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | send+dump/Makefile.in | 7 | ||||
-rw-r--r-- | send+dump/htmsocket.c | 551 |
5 files changed, 329 insertions, 248 deletions
diff --git a/Makefile.in b/Makefile.in index d4aa84b..f8a2a58 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,12 +1,17 @@ dirs = libOSC send+dump src all: - cd libOSC ; make - cd src ; make - cd send+dump ; make + cd libOSC && make + cd src && make -install: all - cd src ; make install +lib: all + cd src && make lib + +utils: + cd send+dump && make + +install: all lib utils + cd src && make install clean: cd libOSC && make clean @@ -4391,7 +4391,7 @@ _ACEOF # from augusts template -INCLUDES="-I../libOSC -I../../pd/src -I../../../pd/src -I." +INCLUDES="-I../libOSC -I../../pd/src -I../../../pd/src -I../src" LIBOSC=libOSC.a if test -z "$GCC"; then case $host in diff --git a/configure.ac b/configure.ac index 92b9f3a..04009b3 100644 --- a/configure.ac +++ b/configure.ac @@ -57,7 +57,7 @@ dnl for each of the *-*-host's in the following, do the checking and then set y dnl CFLAGS get set for C code, CPPFLAGS for c++ code. LDFLAGS is the linking flags for both c and c++ dnl ------------------------------------------ -INCLUDES="-I../libOSC -I../../pd/src -I../../../pd/src -I." +INCLUDES="-I../libOSC -I../../pd/src -I../../../pd/src -I../src" LIBOSC=libOSC.a if test -z "$GCC"; then case $host in diff --git a/send+dump/Makefile.in b/send+dump/Makefile.in index f7444a6..8bf6b69 100644 --- a/send+dump/Makefile.in +++ b/send+dump/Makefile.in @@ -1,3 +1,4 @@ +LIBS = @LIBS@ LIBOSCDIR = ../libOSC LIBOSC = ${LIBOSCDIR}/libOSC.a @@ -11,13 +12,13 @@ DUMPOBJS=dumpOSC.o both: sendOSC dumpOSC sendOSC: sendOSC.o htmsocket.o ${LIBOSC} - ${CC} ${CFLAGS} $(INCLUDES) -o sendOSC sendOSC.o htmsocket.o ${LIBOSC} + ${CC} ${CFLAGS} $(INCLUDES) -o sendOSC sendOSC.o htmsocket.o $(LIBS) ${LIBOSC} dumpOSC: ${DUMPOBJS} - ${CC} ${CFLAGS} $(INCLUDES) -o $@ ${DUMPOBJS} + ${CC} ${CFLAGS} $(INCLUDES) -o $@ ${DUMPOBJS} $(LIBS) dumpUDP: dumpUDP.o - ${CC} ${CFLAGS} $(INCLUDES) -o dumpUDP dumpUDP.o + ${CC} ${CFLAGS} $(INCLUDES) -o dumpUDP dumpUDP.o $(LIBS) ${LIBOSC}: echo "You need to go to " ${LIBOSCDIR} " and do a make." diff --git a/send+dump/htmsocket.c b/send+dump/htmsocket.c index b8b7fff..1cc17cd 100644 --- a/send+dump/htmsocket.c +++ b/send+dump/htmsocket.c @@ -1,238 +1,313 @@ -/* -Written by Adrian Freed, The Center for New Music and Audio Technologies, -University of California, Berkeley. Copyright (c) 1992,93,94,95,96,97,98,99,2000,01,02,03,04 -The Regents of the University of California (Regents). - -Permission to use, copy, modify, distribute, and distribute modified versions -of this software and its documentation without fee and without a signed -licensing agreement, is hereby granted, provided that the above copyright -notice, this paragraph and the following two paragraphs appear in all copies, -modifications, and distributions. - -IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, -SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING -OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS -BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED -HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE -MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - - -The OSC webpage is http://cnmat.cnmat.berkeley.edu/OpenSoundControl -*/ - - /* htmsocket.c - - Adrian Freed - send parameters to htm servers by udp or UNIX protocol - - Modified 6/6/96 by Matt Wright to understand symbolic host names - in addition to X.X.X.X addresses. - - pd ------------ - -- added BROADCAST socket option jdl - */ - - -#include <stdio.h> -#include <strings.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <netinet/in.h> - -// #include <rpc/rpc.h> l-osc: sendOSC, Date: Fri, 06 Feb 2004 05:02:42 +1100 -#include <sys/socket.h> -#include <sys/un.h> -#include <sys/times.h> -#include <sys/param.h> -#include <sys/time.h> -#include <sys/ioctl.h> - -#include <ctype.h> -#include <arpa/inet.h> -#include <netdb.h> -#include <pwd.h> -#include <signal.h> -#include <grp.h> -#include <sys/fcntl.h> -#include <sys/file.h> -#include <sys/time.h> -#include <sys/types.h> -#ifndef __APPLE__ - #include <sys/prctl.h> -#endif - -#include <stdlib.h> - -#define UNIXDG_PATH "/tmp/htm" -#define UNIXDG_TMP "/tmp/htm.XXXXXX" -#include "htmsocket.h" -typedef struct -{ - float srate; - - struct sockaddr_in serv_addr; /* udp socket */ - struct sockaddr_un userv_addr; /* UNIX socket */ - int sockfd; /* socket file descriptor */ - int index, len,uservlen; - void *addr; - int id; -} desc; - -/* open a socket for HTM communication to given host on given portnumber */ -/* if host is 0 then UNIX protocol is used (i.e. local communication */ -void *OpenHTMSocket(char *host, int portnumber) -{ - int sockfd; - int oval = 1; - struct sockaddr_in cl_addr; - struct sockaddr_un ucl_addr; - desc *o; - o = malloc(sizeof(*o)); - if(!o) - return 0; - if(!host) - { - // char *mkstemp(char *); - int clilen; - o->len = sizeof(ucl_addr); - /* - * Fill in the structure "userv_addr" with the address of the - * server that we want to send to. - */ - - bzero((char *) &o->userv_addr, sizeof(o->userv_addr)); - o->userv_addr.sun_family = AF_UNIX; - strcpy(o->userv_addr.sun_path, UNIXDG_PATH); - sprintf(o->userv_addr.sun_path+strlen(o->userv_addr.sun_path), "%d", portnumber); - o->uservlen = sizeof(o->userv_addr.sun_family) + strlen(o->userv_addr.sun_path); - o->addr = &(o->userv_addr); - /* - * Open a socket (a UNIX domain datagram socket). - */ - - if ( (sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) >= 0) - { - /* - * Bind a local address for us. - * In the UNIX domain we have to choose our own name (that - * should be unique). We'll use mktemp() to create a unique - * pathname, based on our process id. - */ - - bzero((char *) &ucl_addr, sizeof(ucl_addr)); /* zero out */ - ucl_addr.sun_family = AF_UNIX; - strcpy(ucl_addr.sun_path, UNIXDG_TMP); - - mkstemp(ucl_addr.sun_path); - clilen = sizeof(ucl_addr.sun_family) + strlen(ucl_addr.sun_path); - - if (bind(sockfd, (struct sockaddr *) &ucl_addr, clilen) < 0) - { - perror("client: can't bind local address"); - close(sockfd); - sockfd = -1; - } - } - else - perror("unable to make socket\n"); - - }else - { - /* - * Fill in the structure "serv_addr" with the address of the - * server that we want to send to. - */ - o->len = sizeof(cl_addr); - bzero((char *)&o->serv_addr, sizeof(o->serv_addr)); - o->serv_addr.sin_family = AF_INET; - - /* MW 6/6/96: Call gethostbyname() instead of inet_addr(), - so that host can be either an Internet host name (e.g., - "les") or an Internet address in standard dot notation - (e.g., "128.32.122.13") */ - { - struct hostent *hostsEntry; - unsigned long address; - - hostsEntry = gethostbyname(host); - if (hostsEntry == NULL) { - fprintf(stderr, "Couldn't decipher host name \"%s\"\n", - host); - herror(NULL); - return 0; - } - - address = *((unsigned long *) hostsEntry->h_addr_list[0]); - o->serv_addr.sin_addr.s_addr = address; - } - - /* was: o->serv_addr.sin_addr.s_addr = inet_addr(host); */ - - /* End MW changes */ - - o->serv_addr.sin_port = htons(portnumber); - o->addr = &(o->serv_addr); - /* - * Open a socket (a UDP domain datagram socket). - */ - if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) - { - bzero((char *)&cl_addr, sizeof(cl_addr)); - cl_addr.sin_family = AF_INET; - cl_addr.sin_addr.s_addr = htonl(INADDR_ANY); - cl_addr.sin_port = htons(0); - - if(setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &oval, sizeof(int)) == -1) { - perror("setsockopt"); - } - - if(bind(sockfd, (struct sockaddr *) &cl_addr, sizeof(cl_addr)) < 0) - { - perror("could not bind\n"); - close(sockfd); - sockfd = -1; - } - } - else - { - perror("unable to make socket\n"); - } - - } - if(sockfd<0) - { - free(o); o = 0; - } - else - o->sockfd = sockfd; - return o; -} -#include <errno.h> - -static bool sendudp(const struct sockaddr *sp, int sockfd,int length, int count, void *b) -{ - int rcount; - if((rcount=sendto(sockfd, b, count, 0, sp, length)) != count) - { -/* printf("sockfd %d count %d rcount %dlength %d errno %d\n", sockfd,count,rcount,length, - errno); */ - return FALSE; - } - return TRUE; -} -bool SendHTMSocket(void *htmsendhandle, int length_in_bytes, void *buffer) -{ - desc *o = (desc *)htmsendhandle; - return sendudp(o->addr, o->sockfd, o->len, length_in_bytes, buffer); -} -void CloseHTMSocket(void *htmsendhandle) -{ - desc *o = (desc *)htmsendhandle; - close(o->sockfd); - free(o); -} +/*
+Written by Adrian Freed, The Center for New Music and Audio Technologies,
+University of California, Berkeley. Copyright (c) 1992,93,94,95,96,97,98,99,2000,01,02,03,04
+The Regents of the University of California (Regents).
+
+Permission to use, copy, modify, distribute, and distribute modified versions
+of this software and its documentation without fee and without a signed
+licensing agreement, is hereby granted, provided that the above copyright
+notice, this paragraph and the following two paragraphs appear in all copies,
+modifications, and distributions.
+
+IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
+SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
+OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
+BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
+HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
+MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+
+
+The OSC webpage is http://cnmat.cnmat.berkeley.edu/OpenSoundControl
+*/
+
+ /* htmsocket.c
+
+ Adrian Freed
+ send parameters to htm servers by udp or UNIX protocol
+
+ Modified 6/6/96 by Matt Wright to understand symbolic host names
+ in addition to X.X.X.X addresses.
+
+ pd: branched jdl
+ -- win additions raf 2002
+ -- enabled broadcast jdl 2003
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef __APPLE__
+ #include <string.h>
+#endif
+
+#ifdef _WIN32
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <winsock2.h>
+ #include <ctype.h>
+ #include <signal.h>
+ #include <sys/types.h>
+ #include <stdlib.h>
+ #include "OSC-common.h"
+ #include <stdio.h>
+#else
+ #include <stdio.h>
+ #include <unistd.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <netinet/in.h>
+
+// #include <rpc/rpc.h>
+ #include <sys/socket.h>
+ #include <sys/un.h>
+ #include <sys/times.h>
+ #include <sys/param.h>
+ #include <sys/time.h>
+ #include <sys/ioctl.h>
+
+ #include <ctype.h>
+ #include <arpa/inet.h>
+ #include <netdb.h>
+ #include <pwd.h>
+ #include <signal.h>
+ #include <grp.h>
+ #include <sys/fcntl.h>
+ #include <sys/file.h>
+ #include <sys/time.h>
+ #include <sys/types.h>
+// #include <sys/prctl.h>
+
+ #include <stdlib.h>
+#endif
+
+#define UNIXDG_PATH "/tmp/htm"
+#define UNIXDG_TMP "/tmp/htm.XXXXXX"
+#include "htmsocket.h"
+typedef struct
+{
+ float srate;
+
+ struct sockaddr_in serv_addr; /* udp socket */
+ #ifndef WIN32
+ struct sockaddr_un userv_addr; /* UNIX socket */
+ #endif
+ int sockfd; /* socket file descriptor */
+ int index, len,uservlen;
+ void *addr;
+ int id;
+} desc;
+
+/* open a socket for HTM communication to given host on given portnumber */
+/* if host is 0 then UNIX protocol is used (i.e. local communication */
+void *OpenHTMSocket(char *host, int portnumber)
+{
+ struct sockaddr_in cl_addr;
+ #ifndef WIN32
+ int sockfd;
+ struct sockaddr_un ucl_addr;
+ #else
+ unsigned int sockfd;
+ #endif
+
+ char oval = 1;
+
+ desc *o;
+ o = malloc(sizeof(*o));
+ if(!o)
+ return 0;
+
+ #ifndef WIN32
+
+ if(!host)
+ {
+ char *mktemp(char *);
+ int clilen;
+ o->len = sizeof(ucl_addr);
+ /*
+ * Fill in the structure "userv_addr" with the address of the
+ * server that we want to send to.
+ */
+
+ bzero((char *) &o->userv_addr, sizeof(o->userv_addr));
+ o->userv_addr.sun_family = AF_UNIX;
+ strcpy(o->userv_addr.sun_path, UNIXDG_PATH);
+ sprintf(o->userv_addr.sun_path+strlen(o->userv_addr.sun_path), "%d", portnumber);
+ o->uservlen = sizeof(o->userv_addr.sun_family) + strlen(o->userv_addr.sun_path);
+ o->addr = &(o->userv_addr);
+ /*
+ * Open a socket (a UNIX domain datagram socket).
+ */
+
+ if ( (sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) >= 0)
+ {
+ /*
+ * Bind a local address for us.
+ * In the UNIX domain we have to choose our own name (that
+ * should be unique). We'll use mktemp() to create a unique
+ * pathname, based on our process id.
+ */
+
+ bzero((char *) &ucl_addr, sizeof(ucl_addr)); /* zero out */
+ ucl_addr.sun_family = AF_UNIX;
+ strcpy(ucl_addr.sun_path, UNIXDG_TMP);
+
+ mktemp(ucl_addr.sun_path);
+ clilen = sizeof(ucl_addr.sun_family) + strlen(ucl_addr.sun_path);
+
+ if (bind(sockfd, (struct sockaddr *) &ucl_addr, clilen) < 0)
+ {
+ perror("client: can't bind local address");
+ close(sockfd);
+ sockfd = -1;
+ }
+ }
+ else
+ perror("unable to make socket\n");
+
+ }else
+
+ #endif
+
+ {
+ /*
+ * Fill in the structure "serv_addr" with the address of the
+ * server that we want to send to.
+ */
+ o->len = sizeof(cl_addr);
+
+ #ifdef WIN32
+ ZeroMemory((char *)&o->serv_addr, sizeof(o->serv_addr));
+ #else
+ bzero((char *)&o->serv_addr, sizeof(o->serv_addr));
+ #endif
+
+ o->serv_addr.sin_family = AF_INET;
+
+ /* MW 6/6/96: Call gethostbyname() instead of inet_addr(),
+ so that host can be either an Internet host name (e.g.,
+ "les") or an Internet address in standard dot notation
+ (e.g., "128.32.122.13") */
+ {
+ struct hostent *hostsEntry;
+ unsigned long address;
+
+ hostsEntry = gethostbyname(host);
+ if (hostsEntry == NULL) {
+ fprintf(stderr, "Couldn't decipher host name \"%s\"\n", host);
+ #ifndef WIN32
+ herror(NULL);
+ #endif
+ return 0;
+ }
+
+ address = *((unsigned long *) hostsEntry->h_addr_list[0]);
+ o->serv_addr.sin_addr.s_addr = address;
+ }
+
+ /* was: o->serv_addr.sin_addr.s_addr = inet_addr(host); */
+
+ /* End MW changes */
+
+ /*
+ * Open a socket (a UDP domain datagram socket).
+ */
+
+
+ #ifdef WIN32
+ o->serv_addr.sin_port = htons((USHORT)portnumber);
+ o->addr = &(o->serv_addr);
+ if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) != INVALID_SOCKET) {
+ ZeroMemory((char *)&cl_addr, sizeof(cl_addr));
+ cl_addr.sin_family = AF_INET;
+ cl_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+ cl_addr.sin_port = htons(0);
+
+ // enable broadcast: jdl ~2003
+ if(setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &oval, sizeof(int)) == -1) {
+ perror("setsockopt");
+ }
+
+ if(bind(sockfd, (struct sockaddr *) &cl_addr, sizeof(cl_addr)) < 0) {
+ perror("could not bind\n");
+ closesocket(sockfd);
+ sockfd = -1;
+ }
+ }
+ else { perror("unable to make socket\n");}
+ #else
+ o->serv_addr.sin_port = htons(portnumber);
+ o->addr = &(o->serv_addr);
+ if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) {
+ bzero((char *)&cl_addr, sizeof(cl_addr));
+ cl_addr.sin_family = AF_INET;
+ cl_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+ cl_addr.sin_port = htons(0);
+
+ // enable broadcast: jdl ~2003
+ if(setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &oval, sizeof(int)) == -1) {
+ perror("setsockopt");
+ }
+
+ if(bind(sockfd, (struct sockaddr *) &cl_addr, sizeof(cl_addr)) < 0) {
+ perror("could not bind\n");
+ close(sockfd);
+ sockfd = -1;
+ }
+ }
+ else { perror("unable to make socket\n");}
+ #endif
+ }
+ #ifdef WIN32
+ if(sockfd == INVALID_SOCKET) {
+ #else
+ if(sockfd < 0) {
+ #endif
+ free(o);
+ o = 0;
+ }
+ else
+ o->sockfd = sockfd;
+ return o;
+}
+
+
+#include <errno.h>
+
+static bool sendudp(const struct sockaddr *sp, int sockfd,int length, int count, void *b)
+{
+ int rcount;
+ if((rcount=sendto(sockfd, b, count, 0, sp, length)) != count)
+ {
+ printf("sockfd %d count %d rcount %dlength %d errno %d\n", sockfd,count,rcount,length, errno);
+ return FALSE;
+ }
+ return TRUE;
+}
+bool SendHTMSocket(void *htmsendhandle, int length_in_bytes, void *buffer)
+{
+ desc *o = (desc *)htmsendhandle;
+ return sendudp(o->addr, o->sockfd, o->len, length_in_bytes, buffer);
+}
+void CloseHTMSocket(void *htmsendhandle)
+{
+ desc *o = (desc *)htmsendhandle;
+ #ifdef WIN32
+ if(SOCKET_ERROR == closesocket(o->sockfd)) {
+ perror("CloseHTMSocket::closesocket failed\n");
+ return;
+ }
+ #else
+ if(close(o->sockfd) == -1)
+ {
+ perror("CloseHTMSocket::closesocket failed");
+ return;
+ }
+ #endif
+
+ free(o);
+}
|