Changeset 6026:d51b782b77c5 in roaraudio


Ignore:
Timestamp:
07/14/14 10:06:28 (5 years ago)
Author:
phi
Branch:
default
Message:

wrote roar_stream_connect_to_advanced() that combines roar_stream_connect_to() and roar_stream_connect_to_ask() in peaparation for v1 CON_STREAM messages and make use of it

Location:
libroar
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • libroar/stream.c

    r5961 r6026  
    299299 
    300300 return 0; 
     301} 
     302 
     303int roar_stream_connect_to_advanced (struct roar_connection * con, struct roar_stream * s, 
     304                                     int version, int ask_only, uint_least32_t flags, 
     305                                     int socket_type, ssize_t socket_len, const void * socketaddr, 
     306                                     int transport_protocol, ssize_t tranport_len, const void * transportsetup, 
     307                                     uint16_t clientsetup_flags, struct roar_client * clientsetup) { 
     308 struct roar_message m; 
     309 char buf[80]; 
     310 int port; 
     311 uint16_t tmp; 
     312 
     313 if ( con == NULL ) { 
     314  roar_err_set(ROAR_ERROR_FAULT); 
     315  return -1; 
     316 } 
     317 
     318 if ( transport_protocol == ROAR_PROTO_NONE && (tranport_len != -1 || transportsetup ) ) { 
     319  roar_err_set(ROAR_ERROR_INVAL); 
     320  return -1; 
     321 } 
     322 
     323 if ( !((s == NULL) ^ (clientsetup == NULL)) ) { 
     324  roar_err_set(ROAR_ERROR_INVAL); 
     325  return -1; 
     326 } 
     327 
     328 switch (version) { 
     329  case 0: 
     330    if ( transport_protocol != ROAR_PROTO_NONE || s == NULL) { 
     331     roar_err_set(ROAR_ERROR_INVAL); 
     332     return -1; 
     333    } 
     334    switch (socket_type) { 
     335     case ROAR_SOCKET_TYPE_TCP: 
     336     case ROAR_SOCKET_TYPE_UDP: 
     337       if ( socket_len != 6 ) { 
     338        roar_err_set(ROAR_ERROR_FAULT); 
     339        return -1; 
     340       } 
     341       snprintf(buf, sizeof(buf), "%i.%i.%i.%i", 
     342                ((const unsigned char*)socketaddr)[0], ((const unsigned char*)socketaddr)[1], 
     343                ((const unsigned char*)socketaddr)[2], ((const unsigned char*)socketaddr)[3]); 
     344       port = ROAR_NET2HOST16(((const uint16_t*)socketaddr)[3]); 
     345       if ( roar_stream_connect_to_ask(con, s, socket_type, buf, port) == -1 ) 
     346        return -1; 
     347      break; 
     348     case ROAR_SOCKET_TYPE_DECNET: 
     349       if ( socket_len < 3 ) { 
     350        roar_err_set(ROAR_ERROR_FAULT); 
     351        return -1; 
     352       } 
     353       tmp  = ((const uint16_t*)socketaddr)[0]; 
     354       port = ((const unsigned char*)socketaddr)[2]; 
     355       snprintf(buf, sizeof(buf), "%i.%i::%*s", tmp >> 10, tmp & 0x03FF, (int)socket_len - 3, (const char*)socketaddr + 3); 
     356       if ( roar_stream_connect_to_ask(con, s, socket_type, buf, port) == -1 ) 
     357        return -1; 
     358      break; 
     359     default: 
     360       if ( ((const char *)socketaddr)[socket_len-1] == 0 ) { 
     361        if ( socket_len > sizeof(buf) ) { 
     362         roar_err_set(ROAR_ERROR_MSGSIZE); 
     363         return -1; 
     364        } 
     365        memcpy(buf, socketaddr, socket_len); 
     366        if ( roar_stream_connect_to_ask(con, s, socket_type, buf, 0) == -1 ) 
     367         return -1; 
     368       } else { 
     369        roar_err_set(ROAR_ERROR_FAULT); 
     370        return -1; 
     371       } 
     372      break; 
     373    } 
     374   break; 
     375  default: 
     376    roar_err_set(ROAR_ERROR_NSVERSION); 
     377    return -1; 
     378   break; 
     379 } 
     380 
     381 
     382 if ( ask_only ) 
     383  return 0; 
     384 
     385 if ( roar_recv_message(con, &m, NULL) == -1 ) 
     386  return -1; 
     387 
     388 if ( m.cmd == ROAR_CMD_OK ) 
     389  return 0; 
     390 return -1; 
    301391} 
    302392 
  • libroar/vio_stream.c

    r6023 r6026  
    164164 int    opt  = 1; 
    165165#endif 
     166#ifdef ROAR_HAVE_LIBDNET 
     167 struct dn_naddr      *binaddr; 
     168#endif 
    166169#ifdef ROAR_HAVE_IPV4 
    167170 struct sockaddr_in   socket_addr; 
     
    181184#endif 
    182185 struct roar_sockname sockname; 
     186 char socketaddr[80]; 
     187 ssize_t socketaddr_len = -1; 
    183188 
    184189 // make valgrind happy 
     
    214219 
    215220 if ( sockname.type == ROAR_SOCKET_TYPE_DECNET ) { 
    216   if ( roar_socket_get_local_nodename() ) { 
    217    snprintf(file, sizeof(file), "%s::roar$TMP%04x%02x", roar_socket_get_local_nodename(), getpid(), count++); 
     221#ifdef ROAR_HAVE_LIBDNET 
     222  if ( roar_socket_get_local_nodename() != NULL && (binaddr = getnodeadd()) != NULL ) { 
     223   snprintf(socketaddr+3, sizeof(socketaddr)-3, "roar$TMP%04x%02x", getpid(), count++); 
     224   snprintf(file, sizeof(file), "%s::%s", roar_socket_get_local_nodename(), socketaddr+3); 
     225   memcpy(socketaddr, binaddr->a_addr, 2); 
     226   socketaddr[2] = 0; // object 0. 
     227   socketaddr_len = 3 + roar_mm_strlen(socketaddr+3); 
    218228  } else { 
    219229   return -1; 
    220230  } 
     231#else 
     232  roar_err_set(ROAR_ERROR_NOSYS); 
     233  return -1; 
     234#endif 
    221235#ifdef ROAR_HAVE_IPV4 
    222236 } else { 
    223   strncpy(file, inet_ntoa(socket_addr.sin_addr), sizeof(file) - 1); 
     237  strncpy(file, sockname.addr, sizeof(file) - 1); 
     238  roar_err_set(ROAR_ERROR_NONE); 
     239  if ( inet_aton(sockname.addr, &socket_addr.sin_addr) == 0 ) { 
     240   roar_err_update(); 
     241   return -1; 
     242  } 
     243  memcpy(socketaddr, &socket_addr.sin_addr.s_addr, 4); 
     244  socketaddr_len = 6; 
    224245#endif 
    225246 } 
    226247 
    227248 if ( sockname.type != ROAR_SOCKET_TYPE_UNIX ) { 
     249  roar_libroar_nowarn(); 
    228250  if ( (listen = roar_socket_listen(sockname.type, file, port)) == -1 ) { 
     251   roar_libroar_warn(); 
    229252   return -1; 
    230253  } 
     254  roar_libroar_warn(); 
    231255 } 
    232256 
     
    239263   return -1; 
    240264  } 
     265  ((uint16_t*)socketaddr)[3] = socket_addr.sin_port; 
    241266  port = ROAR_NET2HOST16(socket_addr.sin_port); 
    242267  ROAR_DBG("roar_simple_new_stream_obj(*): port=%i", port); 
     
    262287 if ( sockname.type != ROAR_SOCKET_TYPE_UNIX ) { 
    263288#ifdef ROAR_HAVE_SELECT 
    264   if ( roar_stream_connect_to_ask(con, s, sockname.type, file, port) != -1 ) { 
     289  if ( roar_stream_connect_to_advanced(con, s, 0, 1, 0, sockname.type, socketaddr_len, socketaddr, ROAR_PROTO_NONE, -1, NULL, 0, NULL) != -1 ) { 
    265290 
    266291   FD_ZERO(&fds); 
     
    334359  close(listen); 
    335360#else 
     361  roar_err_set(ROAR_ERROR_NOSYS); 
    336362  return -1; 
    337363#endif 
Note: See TracChangeset for help on using the changeset viewer.