Changeset 4352:6c46e5e41e82 in roaraudio
- Timestamp:
- 09/14/10 02:35:36 (14 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/enumdev.c
r4350 r4352 36 36 #include "libroar.h" 37 37 38 // TODO: we should put all the data in one big alloced block. 39 40 struct locmed { 41 int supflags; 42 ssize_t (*func)(int flags, int dir, int socktype, char ** servers, size_t maxlen); 43 }; 44 45 static struct locmed _libroar_locmod[] = { 46 }; 47 48 struct roar_server * roar_enum_servers(int flags, int dir, int socktype) { 49 struct roar_server * ret = NULL; 50 struct roar_server * c; 51 char * servers[64]; 52 size_t have = 1; 53 size_t i; 54 ssize_t r; 55 int testflags = flags; 56 57 if ( testflags & ROAR_ENUM_FLAG_DESC ) 58 testflags -= ROAR_ENUM_FLAG_DESC; 59 if ( testflags & ROAR_ENUM_FLAG_LOCATION ) 60 testflags -= ROAR_ENUM_FLAG_LOCATION; 61 62 for (i = 0; i < sizeof(_libroar_locmod)/sizeof(*_libroar_locmod); i++) { 63 if ( (_libroar_locmod[i].supflags & testflags) == testflags ) { 64 r = _libroar_locmod[i].func(flags, dir, socktype, &(servers[have-1]), (sizeof(servers)/sizeof(*servers)) - have); 65 if ( r > 0 ) 66 have += r; 67 } 68 } 69 70 ret = roar_mm_malloc(have*sizeof(struct roar_server)); 71 72 if (ret == NULL) 73 return NULL; 74 75 have--; 76 77 for (i = 0; i < have; i++) { 78 c = &(ret[i]); 79 c->server = servers[i]; 80 c->description = NULL; 81 c->location = NULL; 82 } 83 84 ret[have].server = NULL; 85 ret[have].description = roar_mm_strdup("Default server"); 86 ret[have].location = NULL; 87 88 return ret; 89 } 90 91 int roar_enum_servers_free(struct roar_server * servs) { 92 struct roar_server * c; 93 int i; 94 95 if ( servs == NULL ) 96 return -1; 97 98 for (i = 0; (c = &(servs[i]))->server != NULL; i++) { 99 roar_mm_free((void*)c->server); 100 if ( c->description != NULL ) 101 roar_mm_free((void*)c->description); 102 if ( c->location != NULL ) 103 roar_mm_free((void*)c->location); 104 } 105 106 if ( c->description != NULL ) 107 roar_mm_free((void*)c->description); 108 if ( c->location != NULL ) 109 roar_mm_free((void*)c->location); 110 111 roar_mm_free(servs); 112 113 return 0; 114 } 115 116 ssize_t roar_enum_servers_num(struct roar_server * servs) { 117 size_t ret; 118 119 if ( servs == NULL ) 120 return -1; 121 122 for (ret = 0; servs[ret].server != NULL; ret++); 123 124 return ret; 125 } 126 38 127 //ll
Note: See TracChangeset
for help on using the changeset viewer.