Changeset 508:1129ff87dd1e in roaraudio for libroar/socket.c


Ignore:
Timestamp:
08/15/08 00:40:31 (16 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added DECnet listen support, introused -n/--decnet to roard, added woraround to Linux DECnet stack bugs on streams and added some helpfull DECnet macros, puh...

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/socket.c

    r503 r508  
    4242 return fh; 
    4343} 
     44 
     45int roar_socket_new_decnet_seqpacket (void) { 
     46#ifdef ROAR_HAVE_LIBDNET 
     47 int fh; 
     48 
     49 fh = socket(AF_DECnet, SOCK_SEQPACKET, DNPROTO_NSP); 
     50 
     51 return fh; 
     52#else 
     53 return -1; 
     54#endif 
     55} 
     56 
     57 
     58int roar_socket_new_decnet_stream (void) { 
     59#ifdef ROAR_HAVE_LIBDNET 
     60 int fh; 
     61 
     62 fh = socket(AF_DECnet, SOCK_STREAM, DNPROTO_NSP); 
     63 
     64 return fh; 
     65#else 
     66 return -1; 
     67#endif 
     68} 
     69 
    4470 
    4571int roar_socket_nonblock(int fh, int state) { 
     
    119145  return roar_socket_open_proxy(MODE_CONNECT, ROAR_SOCKET_TYPE_UNKNOWN, host, port, proxy_type); 
    120146 } 
     147} 
     148 
     149 
     150int roar_socket_listen_decnet (char * object, int num) { 
     151#ifdef ROAR_HAVE_LIBDNET 
     152 int fh = roar_socket_new_decnet_stream(); 
     153 struct sockaddr_dn bind_sockaddr; 
     154 
     155 if ( fh == -1 ) 
     156  return -1; 
     157 
     158 if ( !*object ) 
     159  object = NULL; 
     160 
     161 if ( (object && num) || (!*object && !num) ) { 
     162  ROAR_WARN("roar_socket_listen_decnet(object='%s', num=%i): illegal address!", object, num); 
     163  close(fh); 
     164  return -1; 
     165 } 
     166 
     167 memset((void*)&bind_sockaddr, 0, sizeof(struct sockaddr_dn)); 
     168 
     169 bind_sockaddr.sdn_family    = AF_DECnet; 
     170 bind_sockaddr.sdn_flags     = 0; 
     171 bind_sockaddr.sdn_objnum    = num; 
     172 
     173 if ( num ) { 
     174  bind_sockaddr.sdn_objnamel = 0; 
     175 } else { 
     176  bind_sockaddr.sdn_objnamel  = ROAR_dn_htons(strlen(object)); 
     177  strcpy((char*)bind_sockaddr.sdn_objname, object); // FIXME: shouldn't we use strncpy()? 
     178 } 
     179 
     180 if ( bind(fh, (struct sockaddr *) &bind_sockaddr, sizeof(bind_sockaddr)) == -1 ) { 
     181  close(fh); 
     182  return -1; 
     183 } 
     184 
     185 if ( listen(fh, 8) == -1 ) { 
     186  close(fh); 
     187  return -1; 
     188 } 
     189 
     190 return fh; 
     191#else 
     192 return -1; 
     193#endif 
    121194} 
    122195 
     
    153226 
    154227 if ( type == ROAR_SOCKET_TYPE_DECNET ) { 
    155   if ( mode == MODE_LISTEN ) { 
    156    return -1; // listen sockets on DECnet are not supportet at the moment 
    157   } else { 
    158228#ifdef ROAR_HAVE_LIBDNET 
    159    // There is nothing wrong in this case to use dnet_conn() so we do. 
     229   ROAR_DBG("roar_socket_open(*): hostname for DECnet: host(%p)=%s", host, host); 
    160230   del = strstr(host, "::"); 
     231   ROAR_DBG("roar_socket_open(*): hostname for DECnet: del(%p)=%s", del, del); 
     232 
     233   if ( del == NULL ) { 
     234    ROAR_WARN("roar_socket_open(*): invalid hostname for DECnet: %s", host); 
     235    return -1; 
     236   } 
     237 
    161238   *del = 0; 
    162239 
     
    172249   } 
    173250 
     251  if ( mode == MODE_LISTEN ) { 
     252   fh = roar_socket_listen_decnet(obj, port); 
     253   *del = ':'; 
     254   return fh; 
     255//   return -1; // listen sockets on DECnet are not supportet at the moment 
     256  } else { 
     257   // There is nothing wrong in this case to use dnet_conn() so we do. 
    174258   fh = dnet_conn(host, obj, SOCK_STREAM, 0 ,0 ,0 , 0); 
    175259   *del = ':'; 
Note: See TracChangeset for help on using the changeset viewer.