Changeset 6028:be0bcaaf9edf in roaraudio


Ignore:
Timestamp:
07/14/14 12:24:09 (10 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

yet another set of cleanup and structural changes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/vio_stream.c

    r6027 r6028  
    155155} 
    156156 
    157 static inline int _roar_simple_new_stream_obj_try_select (struct roar_connection * con, struct roar_stream * s, uint32_t rate, uint32_t channels, uint32_t bits, uint32_t codec, int dir, int mixer, struct roar_sockname * sockname, int * fh) { 
     157static inline int _roar_simple_new_stream_obj_try_select (struct roar_connection * con, struct roar_stream * s, uint32_t rate, uint32_t channels, uint32_t bits, uint32_t codec, int dir, int mixer, struct roar_sockname * sockname, int * fh, int * can_go_on) { 
    158158#ifdef ROAR_HAVE_SELECT 
    159159 int confh; 
     
    184184 memset(&socket_addr, 0, sizeof(socket_addr)); 
    185185 
    186  if ( sockname->type == ROAR_SOCKET_TYPE_DECNET ) { 
     186 *can_go_on = 0; 
     187 
     188 switch (sockname->type) { 
    187189#ifdef ROAR_HAVE_LIBDNET 
    188   if ( roar_socket_get_local_nodename() != NULL && (binaddr = getnodeadd()) != NULL ) { 
    189    snprintf(socketaddr+3, sizeof(socketaddr)-3, "roar$TMP%04x%02x", getpid(), count++); 
    190    snprintf(file, sizeof(file), "%s::%s", roar_socket_get_local_nodename(), socketaddr+3); 
    191    memcpy(socketaddr, binaddr->a_addr, 2); 
    192    socketaddr[2] = 0; // object 0. 
    193    socketaddr_len = 3 + roar_mm_strlen(socketaddr+3); 
    194   } else { 
    195    return -1; 
    196   } 
    197 #else 
    198   roar_err_set(ROAR_ERROR_NOSYS); 
    199   return -1; 
     190  case ROAR_SOCKET_TYPE_DECNET: 
     191    if ( roar_socket_get_local_nodename() != NULL && (binaddr = getnodeadd()) != NULL ) { 
     192     snprintf(socketaddr+3, sizeof(socketaddr)-3, "roar$TMP%04x%02x", getpid(), count++); 
     193     snprintf(file, sizeof(file), "%s::%s", roar_socket_get_local_nodename(), socketaddr+3); 
     194     memcpy(socketaddr, binaddr->a_addr, 2); 
     195     socketaddr[2] = 0; // object 0. 
     196     socketaddr_len = 3 + roar_mm_strlen(socketaddr+3); 
     197    } else { 
     198     return -1; 
     199    } 
     200   break; 
    200201#endif 
    201202#ifdef ROAR_HAVE_IPV4 
    202  } else { 
    203   strncpy(file, sockname->addr, sizeof(file) - 1); 
    204   roar_err_set(ROAR_ERROR_NONE); 
    205   if ( inet_aton(sockname->addr, &socket_addr.sin_addr) == 0 ) { 
    206    roar_err_update(); 
    207    return -1; 
    208   } 
    209   memcpy(socketaddr, &socket_addr.sin_addr.s_addr, 4); 
    210   socketaddr_len = 6; 
    211 #endif 
     203  case ROAR_SOCKET_TYPE_TCP: 
     204    strncpy(file, sockname->addr, sizeof(file) - 1); 
     205    roar_err_set(ROAR_ERROR_NONE); 
     206    if ( inet_aton(sockname->addr, &socket_addr.sin_addr) == 0 ) { 
     207     roar_err_update(); 
     208     return -1; 
     209    } 
     210    memcpy(socketaddr, &socket_addr.sin_addr.s_addr, 4); 
     211    socketaddr_len = 6; 
     212   break; 
     213#endif 
     214  default: 
     215    roar_err_set(ROAR_ERROR_AFNOTSUP); 
     216    return -1; 
     217   break; 
    212218 } 
    213219 
     
    219225 roar_libroar_warn(); 
    220226 
    221  if ( sockname->type == ROAR_SOCKET_TYPE_INET ) { 
     227 switch (sockname->type) { 
    222228#ifdef ROAR_HAVE_IPV4 
    223   setsockopt(listen, SOL_SOCKET, SO_REUSEADDR, (void*)&opt, sizeof(int)); 
    224  
    225   len = sizeof(struct sockaddr_in); 
    226   if ( getsockname(listen, (struct sockaddr *)&socket_addr, &len) == -1 ) { 
    227    return -1; 
    228   } 
    229   ((uint16_t*)socketaddr)[3] = socket_addr.sin_port; 
    230   port = ROAR_NET2HOST16(socket_addr.sin_port); 
    231   ROAR_DBG("roar_simple_new_stream_obj(*): port=%i", port); 
    232 #else 
    233   return -1; 
    234 #endif 
    235  } else if ( sockname->type == ROAR_SOCKET_TYPE_DECNET ) { 
     229  case ROAR_SOCKET_TYPE_TCP: 
     230    setsockopt(listen, SOL_SOCKET, SO_REUSEADDR, (void*)&opt, sizeof(int)); 
     231 
     232    len = sizeof(struct sockaddr_in); 
     233    if ( getsockname(listen, (struct sockaddr *)&socket_addr, &len) == -1 ) { 
     234     return -1; 
     235    } 
     236    ((uint16_t*)socketaddr)[3] = socket_addr.sin_port; 
     237    port = ROAR_NET2HOST16(socket_addr.sin_port); 
     238    ROAR_DBG("roar_simple_new_stream_obj(*): port=%i", port); 
     239   break; 
     240#endif 
    236241#ifdef ROAR_HAVE_LIBDNET 
    237   setsockopt(listen, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)); 
    238 #else 
    239   return -1; 
    240 #endif 
    241  } 
    242  
    243  if ( roar_stream_connect_to_advanced(con, s, 0, 1, 0, sockname->type, socketaddr_len, socketaddr, ROAR_PROTO_NONE, -1, NULL, 0, NULL) != -1 ) { 
     242  case ROAR_SOCKET_TYPE_DECNET: 
     243    setsockopt(listen, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)); 
     244   break; 
     245#endif 
     246 } 
     247 
     248 if ( roar_stream_connect_to_advanced(con, s, 0, 1, 0, sockname->type, socketaddr_len, socketaddr, ROAR_PROTO_NONE, -1, NULL, 0, NULL) == -1 ) { 
     249  close(listen); 
     250  *can_go_on = 1; 
     251  return -1; 
     252 } else { 
    244253 
    245254  FD_ZERO(&fds); 
     
    262271    return -1; 
    263272 
    264    return roar_simple_new_stream_attachexeced_obj(con, s, rate, channels, bits, codec, dir, mixer); 
     273   *can_go_on = 1; 
     274   return -1; 
    265275  } 
    266276 
     
    291301     return -1; 
    292302 
    293     return roar_simple_new_stream_attachexeced_obj(con, s, rate, channels, bits, codec, dir, mixer); 
     303    *can_go_on = 1; 
     304    return -1; 
    294305   } else { // seems like we have a positive reply. So we retry the listen socket: 
    295306    FD_ZERO(&fds); 
     
    304315       return -1; 
    305316 
    306       return roar_simple_new_stream_attachexeced_obj(con, s, rate, channels, bits, codec, dir, mixer); 
     317      *can_go_on = 1; 
     318      return -1; 
    307319     } 
    308320    } 
    309321   } 
    310322  } 
    311  } 
    312  
    313  close(listen); 
    314  
    315  return 0; 
     323  close(listen); 
     324  return 0; 
     325 } 
     326 
    316327#else 
    317   roar_err_set(ROAR_ERROR_NOSYS); 
    318   return -1; 
     328 roar_err_set(ROAR_ERROR_NOSYS); 
     329 return -1; 
    319330#endif 
    320331} 
     
    327338#endif 
    328339 struct roar_sockname sockname; 
     340 int can_go_on = 0; 
    329341 
    330342 ROAR_DBG("_roar_simple_new_stream_obj(con=%p, s=%p, rate=%i, channels=%i, bits=%i, codec=%i, dir=%i, mixer=%i) = ?", con, s, (int)rate, (int)channels, (int)bits, (int)codec, dir, mixer); 
     
    362374 
    363375 if ( sockname.type != ROAR_SOCKET_TYPE_UNIX ) { 
    364   if ( _roar_simple_new_stream_obj_try_select(con, s, rate, channels, bits, codec, dir, mixer, &sockname, &fh) == -1 ) 
    365    return -1; 
     376  do { 
     377   if ( _roar_simple_new_stream_obj_try_select(con, s, 
     378                                               rate, channels, bits, codec, dir, mixer, 
     379                                               &sockname, &fh, &can_go_on) != -1 ) 
     380    break; 
     381   if ( !can_go_on ) 
     382    return -1; 
     383 
     384   return roar_simple_new_stream_attachexeced_obj(con, s, rate, channels, bits, codec, dir, mixer); 
     385  } while (0); 
    366386 } else { // this is sockname.type == ROAR_SOCKET_TYPE_UNIX 
    367387#ifdef ROAR_HAVE_UNIX 
Note: See TracChangeset for help on using the changeset viewer.