@@ -166,29 +166,42 @@ static int _applemidi_update_runloop_source( struct MIDIDriverAppleMIDI * driver
166
166
}
167
167
168
168
169
- static int _applemidi_connect ( struct MIDIDriverAppleMIDI * driver ) {
169
+ static int _applemidi_bind ( int fd , int port ) {
170
+ #if (defined(AF_INET6 ) && defined(ENABLE_IPV6 ))
171
+ struct sockaddr_in6 addr ;
172
+ memset (& addr , 0 , sizeof (addr ));
173
+ addr .sin6_family = AF_INET6 ;
174
+ addr .sin6_addr = in6addr_any ;
175
+ addr .sin6_port = htons ( port );
176
+ #else
170
177
struct sockaddr_in addr ;
171
- int result = 0 ;
172
-
173
178
memset (& addr , 0 , sizeof (addr ));
174
- if ( driver -> control_socket <= 0 ) {
175
- addr .sin_family = AF_INET ;
176
- addr .sin_addr .s_addr = INADDR_ANY ;
177
- addr .sin_port = htons ( driver -> port );
179
+ addr .sin_family = AF_INET ;
180
+ addr .sin_addr .s_addr = INADDR_ANY ;
181
+ addr .sin_port = htons ( port );
182
+ #endif
183
+ return bind ( fd , (struct sockaddr * ) & addr , sizeof (addr ) );
184
+ }
178
185
179
- driver -> control_socket = socket ( PF_INET , SOCK_DGRAM , 0 );
180
- if (driver -> control_socket != -1 )
181
<
A93C
/td>
- result = bind ( driver -> control_socket , (struct sockaddr * ) & addr , sizeof (addr ) );
182
- }
183
186
184
- if ( driver -> rtp_socket <= 0 ) {
185
- addr .sin_family = AF_INET ;
186
- addr .sin_addr .s_addr = INADDR_ANY ;
187
- addr .sin_port = htons ( driver -> port + 1 );
187
+ static int _applemidi_connect ( struct MIDIDriverAppleMIDI * driver ) {
188
+ int result = 0 ;
189
+ #if (defined(AF_INET6 ) && defined(ENABLE_IPV6 ))
190
+ int pf = PF_INET6 ;
191
+ #else
192
+ int pf = PF_INET ;
193
+ #endif
188
194
189
- driver -> rtp_socket = socket ( PF_INET , SOCK_DGRAM , 0 );
190
- if (driver -> control_socket != -1 )
191
- result = bind ( driver -> rtp_socket , (struct sockaddr * ) & addr , sizeof (addr ) );
195
+ if ( driver -> control_socket <= 0 ) {
196
+ driver -> control_socket = socket ( pf , SOCK_DGRAM , 0 );
197
+ if ( driver -> control_socket != -1 )
198
+ result = _applemidi_bind ( driver -> control_socket , driver -> port );
199
+ }
200
+
201
+ if ( result == 0 && driver -> rtp_socket <= 0 ) {
202
+ driver -> rtp_socket = socket ( pf , SOCK_DGRAM , 0 );
203
+ if ( driver -> rtp_socket != -1 )
204
+ result = _applemidi_bind ( driver -> rtp_socket , driver -> port + 1 );
192
205
}
193
206
194
207
return result ;
@@ -271,6 +284,7 @@ static void _driver_destroy( struct MIDIDriver * driverp ) {
271
284
struct MIDIDriverAppleMIDI * MIDIDriverAppleMIDICreate ( char * name , unsigned short port ) {
272
285
struct MIDIDriverAppleMIDI * driver ;
273
286
MIDITimestamp timestamp ;
287
+ int ret = 0 ;
274
288
275
289
driver = malloc ( sizeof ( struct MIDIDriverAppleMIDI ) );
276
290
MIDIPrecondReturn ( driver != NULL , ENOMEM , NULL );
@@ -289,7 +303,9 @@ struct MIDIDriverAppleMIDI * MIDIDriverAppleMIDICreate( char * name, unsigned sh
289
303
driver -> base .send = & _driver_send ;
290
304
driver -> base .destroy = & _driver_destroy ;
291
305
292
- _applemidi_connect ( driver );
306
+ ret = _applemidi_connect ( driver );
307
+ if (ret == -1 )
308
+ MIDILog ( ERROR , "Bind failed for port: %hu\n" , port );
293
309
294
310
driver -> peer = NULL ;
295
311
driver -> rtp_session = RTPSessionCreate ( driver -> rtp_socket );
@@ -537,6 +553,13 @@ static int _applemidi_send_command( struct MIDIDriverAppleMIDI * driver, int fd,
537
553
if ( command -> addr .ss_family == AF_INET ) {
538
554
struct sockaddr_in * a = (struct sockaddr_in * ) & (command -> addr );
539
555
MIDILog ( DEBUG , "send %i bytes to %s:%i on s(%i)\n" , len , inet_ntoa ( a -> sin_addr ), ntohs ( a -> sin_port ), fd );
556
+ #if (defined(AF_INET6 ))
557
+ } else if (command -> addr .ss_family == AF_INET6 ) {
558
+ char straddr [INET6_ADDRSTRLEN ];
559
+ struct sockaddr_in6 * a = (struct sockaddr_in6 * ) & (command -> addr );
560
+ MIDILog ( DEBUG , "send %i bytes to %s:%i on s(%i)\n" , len ,
561
+ inet_ntop (AF_INET6 , & a -> sin6_addr , straddr , sizeof (straddr )), ntohs ( a -> sin6_port ), fd );
562
+ #endif
540
563
} else {
541
564
MIDILog ( DEBUG , "send %i bytes to <unknown addr family> on s(%i)\n" , len , fd );
542
565
}
@@ -569,6 +592,13 @@ static int _applemidi_recv_command( struct MIDIDriverAppleMIDI * driver, int fd,
569
592
if ( command -> addr .ss_family == AF_INET ) {
570
593
struct sockaddr_in * a = (struct sockaddr_in * ) & (command -> addr );
571
594
MIDILog ( DEBUG , "recv %i bytes from %s:%i on s(%i)\n" , len , inet_ntoa ( a -> sin_addr ), ntohs ( a -> sin_port ), fd );
595
+ #if (defined(AF_INET6 ))
596
+ } else if (command -> addr .ss_family == AF_INET6 ) {
597
+ char straddr [INET6_ADDRSTRLEN ];
598
+ struct sockaddr_in6 * a = (struct sockaddr_in6 * ) & (command -> addr );
599
+ MIDILog ( DEBUG , "recv %i bytes from %s:%i on s(%i)\n" , len ,
600
+ inet_ntop (AF_INET6 , & a -> sin6_addr , straddr , sizeof (straddr )), ntohs ( a -> sin6_port ), fd );
601
+ #endif
572
602
} else {
573
603
MIDILog ( DEBUG , "recv %i bytes from <unknown addr family> on s(%i)\n" , len , fd );
574
604
}
@@ -734,14 +764,21 @@ static int _applemidi_endsession( struct MIDIDriverAppleMIDI * driver, int fd, s
734
764
* @return >0 on error.
735
765
*/
736
766
static int _applemidi_rtp_addr ( socklen_t size , struct sockaddr * control_addr , struct sockaddr * rtp_addr ) {
737
- struct sockaddr_in * in_addr ;
738
767
if ( control_addr != rtp_addr ) {
739
768
memcpy ( rtp_addr , control_addr , size );
740
769
}
741
770
if ( rtp_addr -> sa_family == AF_INET ) {
771
+ struct sockaddr_in * in_addr ;
742
772
in_addr = (struct sockaddr_in * ) rtp_addr ;
743
773
in_addr -> sin_port = htons ( ntohs ( in_addr -> sin_port ) + 1 );
744
774
return 0 ;
775
+ #if (defined(AF_INET6 ))
776
+ } else if ( rtp_addr -> sa_family == AF_INET6 ) {
777
+ struct sockaddr_in6 * in_addr ;
778
+ in_addr = (struct sockaddr_in6 * ) rtp_addr ;
779
+ in_addr -> sin6_port = htons ( ntohs ( in_addr -> sin6_port ) + 1 );
780
+ return 0 ;
781
+ #endif
745
782
} else {
746
783
return 1 ;
747
784
}
@@ -756,14 +793,21 @@ static int _applemidi_rtp_addr( socklen_t size, struct sockaddr * control_addr,
756
793
* @return >0 on error.
757
794
*/
758
795
static int _applemidi_control_addr ( socklen_t size , struct sockaddr * rtp_addr , struct sockaddr * control_addr ) {
759
- struct sockaddr_in * in_addr ;
760
796
if ( rtp_addr != control_addr ) {
761
797
memcpy ( control_addr , rtp_addr , size );
762
798
}
763
799
if ( control_addr -> sa_family == AF_INET ) {
800
+ struct sockaddr_in * in_addr ;
764
801
in_addr = (struct sockaddr_in * ) control_addr ;
765
802
in_addr -> sin_port = htons ( ntohs ( in_addr -> sin_port ) - 1 );
766
803
return 0 ;
<
F438
code> 804
+ #if (defined(AF_INET6 ))
805
+ } else if ( control_addr -> sa_family == AF_INET6 ) {
806
+ struct sockaddr_in6 * in_addr ;
807
+ in_addr = (struct sockaddr_in6 * ) control_addr ;
808
+ in_addr -> sin6_port = htons ( ntohs ( in_addr -> sin6_port ) - 1 );
809
+ return 0 ;
810
+ #endif
767
811
} else {
768
812
return 1 ;
769
813
}
0 commit comments