Changeset 4705:109ee6f17831 in roaraudio
- Timestamp:
- 01/06/11 02:37:55 (13 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
configure
r4696 r4705 1419 1419 test_func_defmake ROAR_HAVE_POPEN popen 'popen("", "")' -- stdio.h 1420 1420 test_func_defmake ROAR_HAVE_PCLOSE pclose 'pclose(0)' -- stdio.h 1421 test_func_defmake ROAR_HAVE_GETSOCKNAME getsockname 'getsockname(0, 0, 0)' -- sys/socket.h 1422 test_func_defmake ROAR_HAVE_GETPEERNAME getpeername 'getpeername(0, 0, 0)' -- sys/socket.h 1421 1423 test_func_defmake ROAR_HAVE_RAND rand 'rand()' -- stdlib.h 1422 1424 test_func_defmake ROAR_HAVE_RAND_R rand_r 'rand_r((unsigned int*)0)' -- stdlib.h -
include/libroar/vio_ctl.h
r4530 r4705 81 81 /* struct roar_vio_sysio_ioctl* */ 82 82 #define ROAR_VIO_CTL_FSTAT (ROAR_VIO_CTL_GENERIC|ROAR_VIO_CTL_GET|0x0184) /* fstat() */ 83 #define ROAR_VIO_CTL_GET_SOCKNAME (ROAR_VIO_CTL_GENERIC|ROAR_VIO_CTL_GET|0x0188) /* getsockname() */ 84 #define ROAR_VIO_CTL_GET_PEERNAME (ROAR_VIO_CTL_GENERIC|ROAR_VIO_CTL_GET|0x018C) /* getpeername() */ 83 85 84 86 // more about network based protocols: … … 185 187 }; 186 188 189 // for ROAR_VIO_CTL_GET_SOCKNAME and ROAR_VIO_CTL_GET_PEERNAME 190 struct roar_sockname { 191 int flags; 192 int type; 193 char * addr; 194 int port; 195 }; 196 187 197 #endif 188 198 -
libroar/vio.c
r4692 r4705 369 369 int tmp; 370 370 int s_r = 0, s_w = 0; 371 #if defined(ROAR_HAVE_GETSOCKNAME) || defined(ROAR_HAVE_GETPEERNAME) 372 union { 373 struct sockaddr sa; 374 #if defined(ROAR_HAVE_IPV4) || defined(ROAR_HAVE_IPV6) 375 struct sockaddr_in in; 376 #endif 377 #ifdef ROAR_HAVE_UNIX 378 struct sockaddr_un un; 379 #endif 380 #ifdef ROAR_HAVE_LIBDNET 381 struct sockaddr_dn dn; 382 #endif 383 #ifdef ROAR_HAVE_IPV6 384 struct sockaddr_in6 in6; 385 #endif 386 #ifdef ROAR_HAVE_IPX 387 struct sockaddr_ipx ipx; 388 #endif 389 } sockaddr; 390 socklen_t socklen; 391 struct roar_sockname * rsockname; 392 #endif 371 393 372 394 if ( vio == NULL || cmd == -1 ) … … 442 464 return ROAR_SHUTDOWN(roar_vio_get_fh(vio), tmp); 443 465 break; 466 #if defined(ROAR_HAVE_GETSOCKNAME) || defined(ROAR_HAVE_GETPEERNAME) 467 case ROAR_VIO_CTL_GET_SOCKNAME: 468 case ROAR_VIO_CTL_GET_PEERNAME: 469 if ( data == NULL ) 470 return -1; 471 472 rsockname = data; 473 474 socklen = sizeof(sockaddr); 475 476 if ( cmd == ROAR_VIO_CTL_GET_SOCKNAME ) { 477 #ifdef ROAR_HAVE_GETSOCKNAME 478 tmp = getsockname(roar_vio_get_fh(vio), &(sockaddr.sa), &socklen); 479 #else 480 return -1; 481 #endif 482 } else if ( cmd == ROAR_VIO_CTL_GET_PEERNAME ) { 483 #ifdef ROAR_HAVE_GETPEERNAME 484 tmp = getpeername(roar_vio_get_fh(vio), &(sockaddr.sa), &socklen); 485 #else 486 return -1; 487 #endif 488 } else { 489 return -1; 490 } 491 492 if ( tmp == -1 ) 493 return -1; 494 495 memset(rsockname, 0, sizeof(struct roar_sockname)); 496 497 switch (sockaddr.sa.sa_family) { 498 #ifdef AF_UNIX 499 case AF_UNIX: 500 rsockname->type = ROAR_SOCKET_TYPE_UNIX; 501 if ( sockaddr.un.sun_path[0] == 0 ) { 502 rsockname->addr = roar_mm_malloc(sizeof(sockaddr.un.sun_path)); 503 if ( rsockname->addr == NULL ) 504 return -1; 505 memcpy(rsockname->addr, sockaddr.un.sun_path, sizeof(sockaddr.un.sun_path)); 506 } else { 507 rsockname->addr = roar_mm_strdup(sockaddr.un.sun_path); 508 } 509 break; 510 #endif 511 #ifdef AF_DECnet 512 case AF_DECnet: 513 rsockname->type = ROAR_SOCKET_TYPE_DECNET; 514 515 if ( sockaddr.dn.sdn_add.a_len != 2 ) 516 return -1; 517 518 rsockname->addr = roar_mm_malloc(28); 519 if ( rsockname->addr == NULL ) 520 return -1; 521 522 snprintf(rsockname->addr, 28, "%i.%i::", 523 sockaddr.dn.sdn_add.a_addr[1] >> 2, 524 sockaddr.dn.sdn_add.a_addr[0] + ((sockaddr.dn.sdn_add.a_addr[1] & 0x03) << 8)); 525 526 rsockname->port = sockaddr.dn.sdn_objnum; 527 if ( sockaddr.dn.sdn_objnum == 0 ) { 528 tmp = strlen(rsockname->addr); 529 memcpy(rsockname->addr + tmp, sockaddr.dn.sdn_objname, sockaddr.dn.sdn_objnamel); 530 rsockname->addr[tmp + sockaddr.dn.sdn_objnamel] = 0; 531 } 532 break; 533 #endif 534 #ifdef AF_INET 535 case AF_INET: 536 rsockname->type = ROAR_SOCKET_TYPE_INET; 537 rsockname->port = ntohs(sockaddr.in.sin_port); 538 rsockname->addr = roar_mm_strdup(inet_ntoa(sockaddr.in.sin_addr)); 539 break; 540 #endif 541 #ifdef AF_INET6 542 case AF_INET6: 543 rsockname->type = ROAR_SOCKET_TYPE_INET6; 544 rsockname->port = ntohs(sockaddr.in6.sin6_port); 545 break; 546 #endif 547 default: 548 return -1; 549 } 550 return 0; 551 #endif 552 break; 444 553 #ifdef ROAR_HAVE_H_SYS_IOCTL 445 554 case ROAR_VIO_CTL_SYSIO_IOCTL: -
plugins/roard/protocol-gopher.c
r4704 r4705 71 71 } 72 72 73 static int send_menu (int client, struct roar_gopher_menu * menu ) {73 static int send_menu (int client, struct roar_gopher_menu * menu, struct roar_vio_calls * vio) { 74 74 struct roar_buffer * buf; 75 75 struct roar_gopher_menu_item * item; … … 78 78 void * data; 79 79 char * chardata; 80 c har * host;80 const char * host; 81 81 unsigned int port; 82 struct roar_sockname sockaddr; 83 84 if ( roar_vio_ctl(vio, ROAR_VIO_CTL_GET_SOCKNAME, &sockaddr) == -1 ) { 85 memset(&sockaddr, 0, sizeof(sockaddr)); 86 } 82 87 83 88 for (i = 0; i < menu->items_len; i++) { 84 89 item = &(menu->items[i]); 85 if ( roar_buffer_new_data(&buf, len, &data) == -1 ) 86 return -1; 90 if ( roar_buffer_new_data(&buf, len, &data) == -1 ) { 91 if ( sockaddr.addr != NULL ) 92 roar_mm_free(sockaddr.addr); 93 return -1; 94 } 87 95 88 96 chardata = data; … … 93 101 break; 94 102 default: 95 host = item->host ;96 port = item->port ;103 host = item->host == NULL ? sockaddr.addr : item->host; 104 port = item->port == 0 ? sockaddr.port : item->port; 97 105 snprintf(data, len-1, "%c%s\t%s\t%s\t%u\r\n", item->type, item->name, item->selector, host, port); 98 106 break; … … 106 114 } 107 115 108 return 0; 109 } 110 111 static int send_text (int client, const char * text) { 116 if ( sockaddr.addr != NULL ) 117 roar_mm_free(sockaddr.addr); 118 119 return 0; 120 } 121 122 static int send_text (int client, const char * text, struct roar_vio_calls * vio) { 112 123 struct roar_buffer * buf; 113 124 void * data; … … 199 210 switch (c->type) { 200 211 case _DIR: 201 funcret = send_menu(client, &(c->menu) );212 funcret = send_menu(client, &(c->menu), vio); 202 213 break; 203 214 case _FILE: 204 funcret = send_text(client, c->text );215 funcret = send_text(client, c->text, vio); 205 216 break; 206 217 default:
Note: See TracChangeset
for help on using the changeset viewer.