diff -ur mim-1.4/xmim/sdp_listener.c mim-1.4.new/xmim/sdp_listener.c --- mim-1.4/xmim/sdp_listener.c Sat Aug 24 00:07:19 2002 +++ mim-1.4.new/xmim/sdp_listener.c Fri Feb 21 16:28:01 2003 @@ -37,14 +37,28 @@ /* auxilliary functions */ int parse_sap_packet(char *data, char **key, char **name); -void *sdp_listener(void *){ +void *sdp_listener4(void *){ + sdp_listener(4); + return NULL; +} +void *sdp_listener6(void *){ + sdp_listener(6); + return NULL; +} + +void *sdp_listener(int ipv){ typedef struct { uint32_t sapHdr; uint32_t sapSrc; char sapData[1]; - }sapPacket_t; - + }sapPacket4_t; + + typedef struct { + uint32_t sapHdr; + unsigned char sapSrc[16]; + char sapData[1]; + }sapPacket6_t; extern GtkWidget *mpegVideoCLIST; extern GtkWidget *otherVideoCLIST; @@ -53,25 +67,33 @@ int returnVal; int sock, addressSize; - sapPacket_t *s=NULL; - struct sockaddr_in sourceAddress; + sapPacket4_t *s4=NULL; + sapPacket6_t *s6=NULL; + struct sockaddr_storage sourceAddress; char *data=(char *)malloc(BUFFERSIZE); char *duplicate=NULL; + char *sap_addr; char *items[]={"NULL"}; - aMediaSource_t mediaSource; + aMediaSource_t mediaSource; + + if (ipv == 4) + sap_addr = SAP_ADDR; + else + sap_addr = SAPV6_ADDR; - mediaSource.mreq = Mreq::getMClass(SAP_ADDR, 0); - mediaSource.mreq->setGroup(SAP_ADDR, NULL, 0, 0); + mediaSource.mreq = Mreq::getMClass(sap_addr, 0); + mediaSource.mreq->setGroup(sap_addr, NULL, 0, 0); if( (sock=start_msock(&mediaSource,SAP_PORT,1,127,0)) <0 ){ - perror("start_msock(SAP_ADDR)"); - fprintf(stderr,"Could not start sdp listener.\n"); - exit(-1); + perror("start_msock(sap_addr)"); + fprintf(stderr,"Could not start sdp%u listener: %s.\n", ipv, sap_addr); + //exit(-1); + return NULL; // note: a problem if neither v4 or v6 SAP succeeds. } - fprintf(stderr,"sdp Listener started\n"); - addressSize=sizeof(struct sockaddr_in); + fprintf(stderr,"sdp%u Listener started\n", ipv); + addressSize=sizeof(struct sockaddr_storage); while(1){ node *thisNode=NULL; @@ -84,9 +106,17 @@ perror("recvfrom()"); break; } - s=(sapPacket_t *)data; - duplicate=(char *)malloc(returnVal); - strcpy(duplicate,s->sapData); + + duplicate=(char *)malloc(returnVal); + + if (ipv == 4) { + s4=(sapPacket4_t *)data; + strcpy(duplicate,s4->sapData); + } + else { + s6=(sapPacket6_t *)data; + strcpy(duplicate,s6->sapData); + } /* parse the packet for key and name */ key=(char *)strtok(duplicate,"\n"); @@ -95,8 +125,11 @@ name=(char *)strtok(name,"="); name=(char *)strtok(NULL,"="); - if(key!=NULL && name!=NULL && s->sapData!=NULL){ - thisNode=new_node(key,name,s->sapData); + if(key!=NULL && name!=NULL && (s4->sapData!=NULL || s6->sapData!=NULL)){ + if (ipv == 4) + thisNode=new_node(key,name,s4->sapData); + else + thisNode=new_node(key,name,s6->sapData); gdk_threads_enter(); if( (char *)strstr(thisNode->data, "RTP/AVP 32")!=NULL ){ if( find_node(mpegListHead, thisNode->key)==NULL ){ diff -ur mim-1.4/xmim/sdp_listener.h mim-1.4.new/xmim/sdp_listener.h --- mim-1.4/xmim/sdp_listener.h Wed Aug 21 19:47:12 2002 +++ mim-1.4.new/xmim/sdp_listener.h Fri Feb 21 16:11:26 2003 @@ -23,10 +23,17 @@ #define SDP_LISTENER_H #define SAP_ADDR "224.2.127.254" +#define SAPV6_ADDR "ff0e:0:0:0:0:0:2:7ffe" #define SAP_PORT 9875 void * -sdp_listener(void *); +sdp_listener(int); + +void * +sdp_listener4(void *); + +void * +sdp_listener6(void *); diff -ur mim-1.4/xmim/xmim.c mim-1.4.new/xmim/xmim.c --- mim-1.4/xmim/xmim.c Wed Sep 4 19:27:23 2002 +++ mim-1.4.new/xmim/xmim.c Fri Feb 21 16:28:54 2003 @@ -54,7 +54,8 @@ GtkWidget *mpegSCROLLEDWINDOW,*otherSCROLLEDWINDOW; GtkWidget *mpegVideoVBOX, *otherVideoVBOX; - pthread_t sdpListenerThread; + pthread_t sdpListener4Thread; + pthread_t sdpListener6Thread; char *column_titles[]={"Session Names"}; @@ -216,7 +217,8 @@ read_cache(); gtk_widget_show(mainWINDOW); - pthread_create(&sdpListenerThread,NULL,sdp_listener,NULL); + pthread_create(&sdpListener4Thread,NULL,sdp_listener4,NULL); + pthread_create(&sdpListener6Thread,NULL,sdp_listener6,NULL); gdk_threads_enter(); gtk_main();