Changeset 4705:109ee6f17831 in roaraudio for libroar/vio.c


Ignore:
Timestamp:
01/06/11 02:37:55 (13 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

got gopher finally working, now moving myself into sleepingbag device...

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/vio.c

    r4692 r4705  
    369369 int tmp; 
    370370 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 
    371393 
    372394 if ( vio == NULL || cmd == -1 ) 
     
    442464    return ROAR_SHUTDOWN(roar_vio_get_fh(vio), tmp); 
    443465   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; 
    444553#ifdef ROAR_HAVE_H_SYS_IOCTL 
    445554  case ROAR_VIO_CTL_SYSIO_IOCTL: 
Note: See TracChangeset for help on using the changeset viewer.