Changeset 6026:d51b782b77c5 in roaraudio
- Timestamp:
- 07/14/14 10:06:28 (10 years ago)
- Branch:
- default
- Phase:
- public
- Location:
- libroar
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/stream.c
r5961 r6026 299 299 300 300 return 0; 301 } 302 303 int 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; 301 391 } 302 392 -
libroar/vio_stream.c
r6023 r6026 164 164 int opt = 1; 165 165 #endif 166 #ifdef ROAR_HAVE_LIBDNET 167 struct dn_naddr *binaddr; 168 #endif 166 169 #ifdef ROAR_HAVE_IPV4 167 170 struct sockaddr_in socket_addr; … … 181 184 #endif 182 185 struct roar_sockname sockname; 186 char socketaddr[80]; 187 ssize_t socketaddr_len = -1; 183 188 184 189 // make valgrind happy … … 214 219 215 220 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); 218 228 } else { 219 229 return -1; 220 230 } 231 #else 232 roar_err_set(ROAR_ERROR_NOSYS); 233 return -1; 234 #endif 221 235 #ifdef ROAR_HAVE_IPV4 222 236 } 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; 224 245 #endif 225 246 } 226 247 227 248 if ( sockname.type != ROAR_SOCKET_TYPE_UNIX ) { 249 roar_libroar_nowarn(); 228 250 if ( (listen = roar_socket_listen(sockname.type, file, port)) == -1 ) { 251 roar_libroar_warn(); 229 252 return -1; 230 253 } 254 roar_libroar_warn(); 231 255 } 232 256 … … 239 263 return -1; 240 264 } 265 ((uint16_t*)socketaddr)[3] = socket_addr.sin_port; 241 266 port = ROAR_NET2HOST16(socket_addr.sin_port); 242 267 ROAR_DBG("roar_simple_new_stream_obj(*): port=%i", port); … … 262 287 if ( sockname.type != ROAR_SOCKET_TYPE_UNIX ) { 263 288 #ifdef ROAR_HAVE_SELECT 264 if ( roar_stream_connect_to_a sk(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 ) { 265 290 266 291 FD_ZERO(&fds); … … 334 359 close(listen); 335 360 #else 361 roar_err_set(ROAR_ERROR_NOSYS); 336 362 return -1; 337 363 #endif
Note: See TracChangeset
for help on using the changeset viewer.