Changeset 4705:109ee6f17831 in roaraudio


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...

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • configure

    r4696 r4705  
    14191419test_func_defmake ROAR_HAVE_POPEN     popen     'popen("", "")'              -- stdio.h 
    14201420test_func_defmake ROAR_HAVE_PCLOSE    pclose    'pclose(0)'                  -- stdio.h 
     1421test_func_defmake ROAR_HAVE_GETSOCKNAME getsockname 'getsockname(0, 0, 0)'   -- sys/socket.h 
     1422test_func_defmake ROAR_HAVE_GETPEERNAME getpeername 'getpeername(0, 0, 0)'   -- sys/socket.h 
    14211423test_func_defmake ROAR_HAVE_RAND      rand      'rand()'                     -- stdlib.h 
    14221424test_func_defmake ROAR_HAVE_RAND_R    rand_r    'rand_r((unsigned int*)0)'   -- stdlib.h 
  • include/libroar/vio_ctl.h

    r4530 r4705  
    8181                                                                                        /* struct roar_vio_sysio_ioctl* */ 
    8282#define ROAR_VIO_CTL_FSTAT               (ROAR_VIO_CTL_GENERIC|ROAR_VIO_CTL_GET|0x0184) /* fstat() */ 
     83#define ROAR_VIO_CTL_GET_SOCKNAME        (ROAR_VIO_CTL_GENERIC|ROAR_VIO_CTL_GET|0x0188) /* getsockname() */ 
     84#define ROAR_VIO_CTL_GET_PEERNAME        (ROAR_VIO_CTL_GENERIC|ROAR_VIO_CTL_GET|0x018C) /* getpeername() */ 
    8385 
    8486// more about network based protocols: 
     
    185187}; 
    186188 
     189// for ROAR_VIO_CTL_GET_SOCKNAME and ROAR_VIO_CTL_GET_PEERNAME 
     190struct roar_sockname { 
     191 int flags; 
     192 int type; 
     193 char * addr; 
     194 int port; 
     195}; 
     196 
    187197#endif 
    188198 
  • 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: 
  • plugins/roard/protocol-gopher.c

    r4704 r4705  
    7171} 
    7272 
    73 static int send_menu (int client, struct roar_gopher_menu * menu) { 
     73static int send_menu (int client, struct roar_gopher_menu * menu, struct roar_vio_calls * vio) { 
    7474 struct roar_buffer * buf; 
    7575 struct roar_gopher_menu_item * item; 
     
    7878 void * data; 
    7979 char * chardata; 
    80  char * host; 
     80 const char * host; 
    8181 unsigned int port; 
     82 struct roar_sockname sockaddr; 
     83 
     84 if ( roar_vio_ctl(vio, ROAR_VIO_CTL_GET_SOCKNAME, &sockaddr) == -1 ) { 
     85  memset(&sockaddr, 0, sizeof(sockaddr)); 
     86 } 
    8287 
    8388 for (i = 0; i < menu->items_len; i++) { 
    8489  item = &(menu->items[i]); 
    85   if ( roar_buffer_new_data(&buf, len, &data) == -1 ) 
    86    return -1; 
     90  if ( roar_buffer_new_data(&buf, len, &data) == -1 ) { 
     91   if ( sockaddr.addr != NULL ) 
     92    roar_mm_free(sockaddr.addr); 
     93   return -1; 
     94  }  
    8795 
    8896  chardata = data; 
     
    93101    break; 
    94102   default: 
    95      host = item->host; 
    96      port = item->port; 
     103     host = item->host == NULL ? sockaddr.addr : item->host; 
     104     port = item->port ==    0 ? sockaddr.port : item->port; 
    97105     snprintf(data, len-1, "%c%s\t%s\t%s\t%u\r\n", item->type, item->name, item->selector, host, port); 
    98106    break; 
     
    106114 } 
    107115 
    108  return 0; 
    109 } 
    110  
    111 static int send_text (int client, const char * text) { 
     116 if ( sockaddr.addr != NULL ) 
     117  roar_mm_free(sockaddr.addr); 
     118 
     119 return 0; 
     120} 
     121 
     122static int send_text (int client, const char * text, struct roar_vio_calls * vio) { 
    112123 struct roar_buffer * buf; 
    113124 void * data; 
     
    199210 switch (c->type) { 
    200211  case _DIR: 
    201     funcret = send_menu(client, &(c->menu)); 
     212    funcret = send_menu(client, &(c->menu), vio); 
    202213   break; 
    203214  case _FILE: 
    204     funcret = send_text(client, c->text); 
     215    funcret = send_text(client, c->text, vio); 
    205216   break; 
    206217  default: 
Note: See TracChangeset for help on using the changeset viewer.