@@ -287,8 +287,8 @@ DWORD router_main(void *arg) {
287287 if (
288288 ra -> local_port &&
289289 (ra -> filter_ptype < 0 || ra -> filter_ptype == packet -> ptype ) &&
290- (memcmp (packet -> dest_net , ra -> addr .sa_netnum , 4 ) == 0 || memcmp (packet -> dest_net , f6 , 4 ) == 0 ) &&
291- (memcmp (packet -> dest_node , ra -> addr .sa_nodenum , 6 ) == 0 || memcmp (packet -> dest_node , f6 , 6 ) == 0 ) &&
290+ (memcmp (packet -> dest_net , ra -> addr .sa_netnum , 4 ) == 0 || ( memcmp (packet -> dest_net , f6 , 4 ) == 0 && ( ra -> flags & IPX_BROADCAST || ! global_conf . w95_bug ) && ra -> flags & IPX_RECV_BCAST ) ) &&
291+ (memcmp (packet -> dest_node , ra -> addr .sa_nodenum , 6 ) == 0 || ( memcmp (packet -> dest_node , f6 , 6 ) == 0 && ( ra -> flags & IPX_BROADCAST || ! global_conf . w95_bug ) && ra -> flags & IPX_RECV_BCAST ) ) &&
292292 packet -> dest_socket == ra -> addr .sa_socket &&
293293
294294 /* Check source IP is within correct subnet */
@@ -314,7 +314,7 @@ DWORD router_main(void *arg) {
314314 return 0 ;
315315}
316316
317- static int router_bind (struct router_vars * router , SOCKET control , SOCKET sock , struct sockaddr_ipx * addr , uint32_t * nic_bcast , BOOL reuse ) {
317+ static int router_bind (struct router_vars * router , SOCKET control , SOCKET sock , struct sockaddr_ipx * addr , uint32_t * nic_bcast , int flags ) {
318318 /* Network number 00:00:00:00 is specified as the "current" network, this code
319319 * treats it as a wildcard when used for the network OR node numbers.
320320 *
@@ -406,7 +406,7 @@ static int router_bind(struct router_vars *router, SOCKET control, SOCKET sock,
406406 struct router_addr * a = router -> addrs ;
407407
408408 while (a ) {
409- if (a -> addr .sa_socket == addr -> sa_socket && (!a -> reuse || !reuse )) {
409+ if (a -> addr .sa_socket == addr -> sa_socket && (!( a -> flags & IPX_REUSE ) || !( flags & IPX_REUSE ) )) {
410410 log_printf ("bind failed: requested socket in use" );
411411
412412 LeaveCriticalSection (& (router -> crit_sec ));
@@ -433,7 +433,7 @@ static int router_bind(struct router_vars *router, SOCKET control, SOCKET sock,
433433 new_addr -> ws_socket = sock ;
434434 new_addr -> control_socket = control ;
435435 new_addr -> filter_ptype = -1 ;
436- new_addr -> reuse = reuse ;
436+ new_addr -> flags = flags ;
437437 new_addr -> ipaddr = iface_ipaddr ;
438438 new_addr -> netmask = iface_netmask ;
439439 new_addr -> next = router -> addrs ;
@@ -512,28 +512,30 @@ static void router_set_filter(struct router_vars *router, SOCKET control, SOCKET
512512 LeaveCriticalSection (& (router -> crit_sec ));
513513}
514514
515- static int router_set_reuse (struct router_vars * router , SOCKET control , SOCKET sock , BOOL reuse ) {
515+ static int router_set_flags (struct router_vars * router , SOCKET control , SOCKET sock , int flags ) {
516516 EnterCriticalSection (& (router -> crit_sec ));
517517
518518 struct router_addr * addr = router_get (router , control , sock );
519519 if (addr ) {
520- struct router_addr * test = router -> addrs ;
521-
522- while (test ) {
523- if (addr != test && memcmp (& (addr -> addr ), & (test -> addr ), sizeof (struct sockaddr_ipx )) == 0 && !reuse ) {
524- /* Refuse to disable SO_REUSEADDR when another binding for the same address exists */
525- LeaveCriticalSection (& (router -> crit_sec ));
526- return 0 ;
527- }
520+ if (addr -> flags & IPX_REUSE && !(flags & IPX_REUSE )) {
521+ struct router_addr * test = router -> addrs ;
528522
529- test = test -> next ;
523+ while (test ) {
524+ if (addr != test && memcmp (& (addr -> addr ), & (test -> addr ), sizeof (struct sockaddr_ipx )) == 0 ) {
525+ /* Refuse to disable SO_REUSEADDR when another binding for the same address exists */
526+ LeaveCriticalSection (& (router -> crit_sec ));
527+ return WSAEINVAL ;
528+ }
529+
530+ test = test -> next ;
531+ }
530532 }
531533
532- addr -> reuse = reuse ;
534+ addr -> flags = flags ;
533535 }
534536
535537 LeaveCriticalSection (& (router -> crit_sec ));
536- return 1 ;
538+ return ERROR_SUCCESS ;
537539}
538540
539541static BOOL router_set_remote (struct router_vars * router , SOCKET control , SOCKET sock , const struct sockaddr_ipx * addr ) {
@@ -579,11 +581,8 @@ static BOOL router_handle_call(struct router_vars *router, int sock, struct rout
579581 break ;
580582 }
581583
582- case rc_reuse : {
583- if (!router_set_reuse (router , sock , call -> sock , call -> arg_int )) {
584- ret .err_code = WSAEINVAL ;
585- }
586-
584+ case rc_flags : {
585+ ret .err_code = router_set_flags (router , sock , call -> sock , call -> arg_int );
587586 break ;
588587 }
589588
@@ -879,14 +878,14 @@ BOOL rclient_set_filter(struct rclient *rclient, SOCKET sock, int ptype) {
879878 return FALSE;
880879}
881880
882- BOOL rclient_set_reuse (struct rclient * rclient , SOCKET sock , BOOL reuse ) {
881+ BOOL rclient_set_flags (struct rclient * rclient , SOCKET sock , int flags ) {
883882 if (rclient -> sock != -1 ) {
884883 struct router_call call ;
885884 struct router_ret ret ;
886885
887- call .call = rc_reuse ;
886+ call .call = rc_flags ;
888887 call .sock = sock ;
889- call .arg_int = reuse ;
888+ call .arg_int = flags ;
890889
891890 if (!rclient_do (rclient , & call , & ret )) {
892891 return FALSE;
@@ -895,11 +894,18 @@ BOOL rclient_set_reuse(struct rclient *rclient, SOCKET sock, BOOL reuse) {
895894 if (ret .err_code == ERROR_SUCCESS ) {
896895 return TRUE;
897896 }else {
898- WSASetLastError (WSAEINVAL );
897+ WSASetLastError (ret . err_code );
899898 return FALSE;
900899 }
901900 }else if (rclient -> router ) {
902- router_set_reuse (rclient -> router , 0 , sock , reuse );
901+ int err = router_set_flags (rclient -> router , 0 , sock , flags );
902+ if (err == ERROR_SUCCESS ) {
903+ return TRUE;
904+ }else {
905+ WSASetLastError (err );
906+ return FALSE;
907+ }
908+
903909 return TRUE;
904910 }
905911
0 commit comments