Changeset 4353:afd8ee9a2999 in roaraudio


Ignore:
Timestamp:
09/14/10 03:27:11 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

support default address in enum support

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/enumdev.c

    r4352 r4353  
    3838// TODO: we should put all the data in one big alloced block. 
    3939 
     40static int _test_server(struct roar_server * c, int flags) { 
     41 struct roar_connection con; 
     42 if ( c->server == NULL ) 
     43  return -1; 
     44 
     45 if ( flags & ROAR_ENUM_FLAG_NONBLOCK ) 
     46  return 0; 
     47 
     48 if ( roar_connect(&con, (char*)c->server) == -1 ) 
     49  return -1; 
     50 
     51 roar_disconnect(&con); 
     52 
     53 return 0; 
     54} 
     55 
     56#define _add(x) if ( (x) != NULL ) servers[ret++] = roar_mm_strdup((x)) 
     57static ssize_t _esl_defaults(int flags, int dir, int socktype, char ** servers, size_t maxlen) { 
     58#ifdef ROAR_HAVE_LIBX11 
     59 struct roar_x11_connection * x11con; 
     60#endif 
     61 ssize_t ret = 0; 
     62 const char * new; 
     63 char buf[1024]; 
     64 int i; 
     65 
     66 if ( maxlen < 10 ) 
     67  return -1; 
     68 
     69 new = roar_libroar_get_server(); 
     70 _add(new); 
     71 
     72 new = getenv("ROAR_SERVER"); 
     73 _add(new); 
     74 
     75#ifdef ROAR_HAVE_LIBX11 
     76 if ( (x11con = roar_x11_connect(NULL)) != NULL ) { 
     77  new = roar_x11_get_prop(x11con, "ROAR_SERVER"); 
     78  _add(new); 
     79  roar_x11_disconnect(x11con); 
     80 } 
     81#endif 
     82 
     83#if !defined(ROAR_TARGET_WIN32) && !defined(ROAR_TARGET_MICROCONTROLLER) 
     84 if ( (i = readlink("/etc/roarserver", buf, sizeof(buf)-1)) != -1 ) { 
     85   buf[i] = 0; 
     86   _add(buf); 
     87 } 
     88#endif 
     89 
     90 if ( (new = roar_env_get_home(0)) != NULL ) { 
     91  snprintf(buf, sizeof(buf)-1, "%s/%s", new, ROAR_DEFAULT_SOCK_USER); 
     92  buf[sizeof(buf)-1] = 0; 
     93  _add(buf); 
     94 } 
     95 
     96 servers[ret++] = roar_mm_strdup(ROAR_DEFAULT_SOCK_GLOBAL); 
     97 servers[ret++] = roar_mm_strdup(ROAR_DEFAULT_HOST); 
     98 servers[ret++] = roar_mm_strdup("::" ROAR_DEFAULT_OBJECT); 
     99 servers[ret++] = roar_mm_strdup("+abstract"); 
     100 servers[ret++] = roar_mm_strdup("/tmp/muroard"); 
     101 
     102 return ret; 
     103} 
     104 
    40105struct locmed { 
    41106 int supflags; 
     
    44109 
    45110static struct locmed _libroar_locmod[] = { 
     111 {ROAR_ENUM_FLAG_NONBLOCK|ROAR_ENUM_FLAG_HARDNONBLOCK, _esl_defaults} 
    46112}; 
    47113 
     
    51117 char * servers[64]; 
    52118 size_t have = 1; 
    53  size_t i; 
     119 size_t i, cp; 
    54120 ssize_t r; 
    55121 int testflags = flags; 
     122 
     123 // load config: 
     124 roar_libroar_get_config(); 
    56125 
    57126 if ( testflags & ROAR_ENUM_FLAG_DESC ) 
     
    75144 have--; 
    76145 
    77  for (i = 0; i < have; i++) { 
    78   c = &(ret[i]); 
     146 for (i = cp = 0; i < have; i++) { 
     147  c = &(ret[cp]); 
    79148  c->server = servers[i]; 
    80149  c->description = NULL; 
    81150  c->location = NULL; 
    82  } 
    83  
    84  ret[have].server = NULL; 
    85  ret[have].description = roar_mm_strdup("Default server"); 
    86  ret[have].location = NULL; 
     151  if ( _test_server(c, flags) == 0 ) { 
     152   cp++; 
     153  } else { 
     154   roar_mm_free(servers[i]); 
     155  } 
     156 } 
     157 
     158 ret[cp].server = NULL; 
     159 ret[cp].description = roar_mm_strdup("Default server"); 
     160 ret[cp].location = NULL; 
    87161 
    88162 return ret; 
Note: See TracChangeset for help on using the changeset viewer.