Changeset 4440:970fdb88487b in roaraudio
- Timestamp:
- 10/09/10 15:56:35 (14 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/serverinfo.c
r4433 r4440 43 43 44 44 struct roar_server_info * roar_server_info(struct roar_connection * con) { 45 struct roar_server_info * ret; 45 46 struct roar_message mes; 46 47 uint16_t * d16; 48 char * data = NULL; 47 49 48 50 memset(&mes, 0, sizeof(mes)); … … 55 57 d16[1] = ROAR_HOST2NET16(ROAR_IT_SERVER); 56 58 57 if ( roar_req(con, &mes, NULL) != 0 )59 if ( roar_req(con, &mes, &data) != 0 ) 58 60 return NULL; 59 61 … … 61 63 return NULL; 62 64 63 return roar_server_info_from_mes(&mes); 65 ret = roar_server_info_from_mes(&mes, data); 66 67 if ( data != NULL ) 68 free(data); 69 70 return ret; 64 71 } 65 72 … … 75 82 #define _add(t, m) do { if ( info->m != NULL && (sl = strlen(info->m)) != 0 ) { iebuf[idx].type = (t); iebuf[idx].len = sl; iebuf[idx].buf = (info->m); idx++; needlen += 4 + sl; } } while (0) 76 83 77 int roar_server_info_to_mes(struct roar_message * mes, struct roar_server_info * info ) {84 int roar_server_info_to_mes(struct roar_message * mes, struct roar_server_info * info, void ** data) { 78 85 size_t needlen = 4; 79 86 size_t sl; … … 83 90 char * textpart; 84 91 int i; 92 char * mesdata; 85 93 86 94 if ( mes == NULL || info == NULL ) … … 100 108 101 109 if ( needlen > LIBROAR_BUFFER_MSGDATA ) { 102 return -1; 110 if ( data == NULL ) 111 return -1; 112 113 mesdata = malloc(needlen); 114 115 if ( mesdata == NULL ) 116 return -1; 117 } else { 118 mesdata = mes->data; 103 119 } 104 120 … … 107 123 mes->datalen = needlen; 108 124 109 d16 = (uint16_t*)mes ->data;110 111 mes ->data[0] = 0; // version112 mes ->data[1] = 0; // reserved125 d16 = (uint16_t*)mesdata; 126 127 mesdata[0] = 0; // version 128 mesdata[1] = 0; // reserved 113 129 114 130 d16[1] = ROAR_HOST2NET16(idx); … … 122 138 } 123 139 124 textpart = mes ->data + (4 + 4*idx);140 textpart = mesdata + (4 + 4*idx); 125 141 126 142 for (i = 0; i < idx; i++) { … … 132 148 } 133 149 134 struct roar_server_info * roar_server_info_from_mes(struct roar_message * mes ) {150 struct roar_server_info * roar_server_info_from_mes(struct roar_message * mes, void * data) { 135 151 struct ie iebuf[sizeof(struct roar_server_info)/sizeof(char*)]; 136 152 struct ie * ieptr; … … 143 159 char * textbuf; 144 160 char ** tptr; 161 char * mesdata; 145 162 146 163 ROAR_DBG("roar_server_info(mes=%p{.datalen=%llu) = ?", mes, (long long unsigned int)mes->datalen); … … 148 165 if ( mes == NULL ) 149 166 return NULL; 167 168 if ( data == NULL ) { 169 mesdata = mes->data; 170 } else { 171 mesdata = data; 172 } 150 173 151 174 memset(iebuf, 0, sizeof(iebuf)); … … 159 182 ROAR_DBG("roar_server_info(mes=%p) = ?", mes); 160 183 161 if ( mes ->data[0] != 0 ) /* version */162 return NULL; 163 164 ROAR_DBG("roar_server_info(mes=%p) = ?", mes); 165 166 if ( mes ->data[1] != 0 ) /* reserved */167 return NULL; 168 169 ROAR_DBG("roar_server_info(mes=%p) = ?", mes); 170 171 d16 = (uint16_t*)mes ->data;184 if ( mesdata[0] != 0 ) /* version */ 185 return NULL; 186 187 ROAR_DBG("roar_server_info(mes=%p) = ?", mes); 188 189 if ( mesdata[1] != 0 ) /* reserved */ 190 return NULL; 191 192 ROAR_DBG("roar_server_info(mes=%p) = ?", mes); 193 194 d16 = (uint16_t*)mesdata; 172 195 173 196 idx = ROAR_NET2HOST16(d16[1]); … … 191 214 ROAR_DBG("roar_server_info(mes=%p) = ?", mes); 192 215 193 d16 = (uint16_t*)mes ->data;216 d16 = (uint16_t*)mesdata; 194 217 dptr = &(d16[2]); 195 218 196 textpart = mes ->data + (4 + 4*idx);219 textpart = mesdata + (4 + 4*idx); 197 220 198 221 ROAR_DBG("roar_server_info(mes=%p): needlen=%llu", mes, (long long unsigned int)needlen);
Note: See TracChangeset
for help on using the changeset viewer.