Changeset 6028:be0bcaaf9edf in roaraudio for libroar/vio_stream.c
- Timestamp:
- 07/14/14 12:24:09 (10 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/vio_stream.c
r6027 r6028 155 155 } 156 156 157 static inline int _roar_simple_new_stream_obj_try_select (struct roar_connection * con, struct roar_stream * s, uint32_t rate, uint32_t channels, uint32_t bits, uint32_t codec, int dir, int mixer, struct roar_sockname * sockname, int * fh ) {157 static inline int _roar_simple_new_stream_obj_try_select (struct roar_connection * con, struct roar_stream * s, uint32_t rate, uint32_t channels, uint32_t bits, uint32_t codec, int dir, int mixer, struct roar_sockname * sockname, int * fh, int * can_go_on) { 158 158 #ifdef ROAR_HAVE_SELECT 159 159 int confh; … … 184 184 memset(&socket_addr, 0, sizeof(socket_addr)); 185 185 186 if ( sockname->type == ROAR_SOCKET_TYPE_DECNET ) { 186 *can_go_on = 0; 187 188 switch (sockname->type) { 187 189 #ifdef ROAR_HAVE_LIBDNET 188 if ( roar_socket_get_local_nodename() != NULL && (binaddr = getnodeadd()) != NULL ) { 189 snprintf(socketaddr+3, sizeof(socketaddr)-3, "roar$TMP%04x%02x", getpid(), count++); 190 snprintf(file, sizeof(file), "%s::%s", roar_socket_get_local_nodename(), socketaddr+3); 191 memcpy(socketaddr, binaddr->a_addr, 2); 192 socketaddr[2] = 0; // object 0. 193 socketaddr_len = 3 + roar_mm_strlen(socketaddr+3); 194 } else { 195 return -1; 196 } 197 #else 198 roar_err_set(ROAR_ERROR_NOSYS); 199 return -1; 190 case ROAR_SOCKET_TYPE_DECNET: 191 if ( roar_socket_get_local_nodename() != NULL && (binaddr = getnodeadd()) != NULL ) { 192 snprintf(socketaddr+3, sizeof(socketaddr)-3, "roar$TMP%04x%02x", getpid(), count++); 193 snprintf(file, sizeof(file), "%s::%s", roar_socket_get_local_nodename(), socketaddr+3); 194 memcpy(socketaddr, binaddr->a_addr, 2); 195 socketaddr[2] = 0; // object 0. 196 socketaddr_len = 3 + roar_mm_strlen(socketaddr+3); 197 } else { 198 return -1; 199 } 200 break; 200 201 #endif 201 202 #ifdef ROAR_HAVE_IPV4 202 } else { 203 strncpy(file, sockname->addr, sizeof(file) - 1); 204 roar_err_set(ROAR_ERROR_NONE); 205 if ( inet_aton(sockname->addr, &socket_addr.sin_addr) == 0 ) { 206 roar_err_update(); 207 return -1; 208 } 209 memcpy(socketaddr, &socket_addr.sin_addr.s_addr, 4); 210 socketaddr_len = 6; 211 #endif 203 case ROAR_SOCKET_TYPE_TCP: 204 strncpy(file, sockname->addr, sizeof(file) - 1); 205 roar_err_set(ROAR_ERROR_NONE); 206 if ( inet_aton(sockname->addr, &socket_addr.sin_addr) == 0 ) { 207 roar_err_update(); 208 return -1; 209 } 210 memcpy(socketaddr, &socket_addr.sin_addr.s_addr, 4); 211 socketaddr_len = 6; 212 break; 213 #endif 214 default: 215 roar_err_set(ROAR_ERROR_AFNOTSUP); 216 return -1; 217 break; 212 218 } 213 219 … … 219 225 roar_libroar_warn(); 220 226 221 if ( sockname->type == ROAR_SOCKET_TYPE_INET) {227 switch (sockname->type) { 222 228 #ifdef ROAR_HAVE_IPV4 223 setsockopt(listen, SOL_SOCKET, SO_REUSEADDR, (void*)&opt, sizeof(int)); 224 225 len = sizeof(struct sockaddr_in); 226 if ( getsockname(listen, (struct sockaddr *)&socket_addr, &len) == -1 ) { 227 return -1; 228 } 229 ((uint16_t*)socketaddr)[3] = socket_addr.sin_port; 230 port = ROAR_NET2HOST16(socket_addr.sin_port); 231 ROAR_DBG("roar_simple_new_stream_obj(*): port=%i", port); 232 #else 233 return -1; 234 #endif 235 } else if ( sockname->type == ROAR_SOCKET_TYPE_DECNET ) { 229 case ROAR_SOCKET_TYPE_TCP: 230 setsockopt(listen, SOL_SOCKET, SO_REUSEADDR, (void*)&opt, sizeof(int)); 231 232 len = sizeof(struct sockaddr_in); 233 if ( getsockname(listen, (struct sockaddr *)&socket_addr, &len) == -1 ) { 234 return -1; 235 } 236 ((uint16_t*)socketaddr)[3] = socket_addr.sin_port; 237 port = ROAR_NET2HOST16(socket_addr.sin_port); 238 ROAR_DBG("roar_simple_new_stream_obj(*): port=%i", port); 239 break; 240 #endif 236 241 #ifdef ROAR_HAVE_LIBDNET 237 setsockopt(listen, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)); 238 #else 239 return -1; 240 #endif 241 } 242 243 if ( roar_stream_connect_to_advanced(con, s, 0, 1, 0, sockname->type, socketaddr_len, socketaddr, ROAR_PROTO_NONE, -1, NULL, 0, NULL) != -1 ) { 242 case ROAR_SOCKET_TYPE_DECNET: 243 setsockopt(listen, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)); 244 break; 245 #endif 246 } 247 248 if ( roar_stream_connect_to_advanced(con, s, 0, 1, 0, sockname->type, socketaddr_len, socketaddr, ROAR_PROTO_NONE, -1, NULL, 0, NULL) == -1 ) { 249 close(listen); 250 *can_go_on = 1; 251 return -1; 252 } else { 244 253 245 254 FD_ZERO(&fds); … … 262 271 return -1; 263 272 264 return roar_simple_new_stream_attachexeced_obj(con, s, rate, channels, bits, codec, dir, mixer); 273 *can_go_on = 1; 274 return -1; 265 275 } 266 276 … … 291 301 return -1; 292 302 293 return roar_simple_new_stream_attachexeced_obj(con, s, rate, channels, bits, codec, dir, mixer); 303 *can_go_on = 1; 304 return -1; 294 305 } else { // seems like we have a positive reply. So we retry the listen socket: 295 306 FD_ZERO(&fds); … … 304 315 return -1; 305 316 306 return roar_simple_new_stream_attachexeced_obj(con, s, rate, channels, bits, codec, dir, mixer); 317 *can_go_on = 1; 318 return -1; 307 319 } 308 320 } 309 321 } 310 322 } 311 } 312 313 close(listen); 314 315 return 0; 323 close(listen); 324 return 0; 325 } 326 316 327 #else 317 318 328 roar_err_set(ROAR_ERROR_NOSYS); 329 return -1; 319 330 #endif 320 331 } … … 327 338 #endif 328 339 struct roar_sockname sockname; 340 int can_go_on = 0; 329 341 330 342 ROAR_DBG("_roar_simple_new_stream_obj(con=%p, s=%p, rate=%i, channels=%i, bits=%i, codec=%i, dir=%i, mixer=%i) = ?", con, s, (int)rate, (int)channels, (int)bits, (int)codec, dir, mixer); … … 362 374 363 375 if ( sockname.type != ROAR_SOCKET_TYPE_UNIX ) { 364 if ( _roar_simple_new_stream_obj_try_select(con, s, rate, channels, bits, codec, dir, mixer, &sockname, &fh) == -1 ) 365 return -1; 376 do { 377 if ( _roar_simple_new_stream_obj_try_select(con, s, 378 rate, channels, bits, codec, dir, mixer, 379 &sockname, &fh, &can_go_on) != -1 ) 380 break; 381 if ( !can_go_on ) 382 return -1; 383 384 return roar_simple_new_stream_attachexeced_obj(con, s, rate, channels, bits, codec, dir, mixer); 385 } while (0); 366 386 } else { // this is sockname.type == ROAR_SOCKET_TYPE_UNIX 367 387 #ifdef ROAR_HAVE_UNIX
Note: See TracChangeset
for help on using the changeset viewer.