Changeset 4705:109ee6f17831 in roaraudio for libroar
- Timestamp:
- 01/06/11 02:37:55 (13 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/vio.c
r4692 r4705 369 369 int tmp; 370 370 int s_r = 0, s_w = 0; 371 #if defined(ROAR_HAVE_GETSOCKNAME) || defined(ROAR_HAVE_GETPEERNAME) 372 union { 373 struct sockaddr sa; 374 #if defined(ROAR_HAVE_IPV4) || defined(ROAR_HAVE_IPV6) 375 struct sockaddr_in in; 376 #endif 377 #ifdef ROAR_HAVE_UNIX 378 struct sockaddr_un un; 379 #endif 380 #ifdef ROAR_HAVE_LIBDNET 381 struct sockaddr_dn dn; 382 #endif 383 #ifdef ROAR_HAVE_IPV6 384 struct sockaddr_in6 in6; 385 #endif 386 #ifdef ROAR_HAVE_IPX 387 struct sockaddr_ipx ipx; 388 #endif 389 } sockaddr; 390 socklen_t socklen; 391 struct roar_sockname * rsockname; 392 #endif 371 393 372 394 if ( vio == NULL || cmd == -1 ) … … 442 464 return ROAR_SHUTDOWN(roar_vio_get_fh(vio), tmp); 443 465 break; 466 #if defined(ROAR_HAVE_GETSOCKNAME) || defined(ROAR_HAVE_GETPEERNAME) 467 case ROAR_VIO_CTL_GET_SOCKNAME: 468 case ROAR_VIO_CTL_GET_PEERNAME: 469 if ( data == NULL ) 470 return -1; 471 472 rsockname = data; 473 474 socklen = sizeof(sockaddr); 475 476 if ( cmd == ROAR_VIO_CTL_GET_SOCKNAME ) { 477 #ifdef ROAR_HAVE_GETSOCKNAME 478 tmp = getsockname(roar_vio_get_fh(vio), &(sockaddr.sa), &socklen); 479 #else 480 return -1; 481 #endif 482 } else if ( cmd == ROAR_VIO_CTL_GET_PEERNAME ) { 483 #ifdef ROAR_HAVE_GETPEERNAME 484 tmp = getpeername(roar_vio_get_fh(vio), &(sockaddr.sa), &socklen); 485 #else 486 return -1; 487 #endif 488 } else { 489 return -1; 490 } 491 492 if ( tmp == -1 ) 493 return -1; 494 495 memset(rsockname, 0, sizeof(struct roar_sockname)); 496 497 switch (sockaddr.sa.sa_family) { 498 #ifdef AF_UNIX 499 case AF_UNIX: 500 rsockname->type = ROAR_SOCKET_TYPE_UNIX; 501 if ( sockaddr.un.sun_path[0] == 0 ) { 502 rsockname->addr = roar_mm_malloc(sizeof(sockaddr.un.sun_path)); 503 if ( rsockname->addr == NULL ) 504 return -1; 505 memcpy(rsockname->addr, sockaddr.un.sun_path, sizeof(sockaddr.un.sun_path)); 506 } else { 507 rsockname->addr = roar_mm_strdup(sockaddr.un.sun_path); 508 } 509 break; 510 #endif 511 #ifdef AF_DECnet 512 case AF_DECnet: 513 rsockname->type = ROAR_SOCKET_TYPE_DECNET; 514 515 if ( sockaddr.dn.sdn_add.a_len != 2 ) 516 return -1; 517 518 rsockname->addr = roar_mm_malloc(28); 519 if ( rsockname->addr == NULL ) 520 return -1; 521 522 snprintf(rsockname->addr, 28, "%i.%i::", 523 sockaddr.dn.sdn_add.a_addr[1] >> 2, 524 sockaddr.dn.sdn_add.a_addr[0] + ((sockaddr.dn.sdn_add.a_addr[1] & 0x03) << 8)); 525 526 rsockname->port = sockaddr.dn.sdn_objnum; 527 if ( sockaddr.dn.sdn_objnum == 0 ) { 528 tmp = strlen(rsockname->addr); 529 memcpy(rsockname->addr + tmp, sockaddr.dn.sdn_objname, sockaddr.dn.sdn_objnamel); 530 rsockname->addr[tmp + sockaddr.dn.sdn_objnamel] = 0; 531 } 532 break; 533 #endif 534 #ifdef AF_INET 535 case AF_INET: 536 rsockname->type = ROAR_SOCKET_TYPE_INET; 537 rsockname->port = ntohs(sockaddr.in.sin_port); 538 rsockname->addr = roar_mm_strdup(inet_ntoa(sockaddr.in.sin_addr)); 539 break; 540 #endif 541 #ifdef AF_INET6 542 case AF_INET6: 543 rsockname->type = ROAR_SOCKET_TYPE_INET6; 544 rsockname->port = ntohs(sockaddr.in6.sin6_port); 545 break; 546 #endif 547 default: 548 return -1; 549 } 550 return 0; 551 #endif 552 break; 444 553 #ifdef ROAR_HAVE_H_SYS_IOCTL 445 554 case ROAR_VIO_CTL_SYSIO_IOCTL:
Note: See TracChangeset
for help on using the changeset viewer.