diff options
author | Felix Burton | 2011-12-05 21:48:33 +0000 |
---|---|---|
committer | Felix Burton | 2011-12-05 22:42:31 +0000 |
commit | afab780d7c6ad078c3be29236e14a704c5b7c4c7 (patch) | |
tree | 2bf3cf6db80e9ce6ee45896b33e1f127333efcf7 | |
parent | fb0d1567b191497c804570bdf3312b9154784048 (diff) | |
download | org.eclipse.tcf.agent-afab780d7c6ad078c3be29236e14a704c5b7c4c7.tar.gz org.eclipse.tcf.agent-afab780d7c6ad078c3be29236e14a704c5b7c4c7.tar.xz org.eclipse.tcf.agent-afab780d7c6ad078c3be29236e14a704c5b7c4c7.zip |
TCF Agent: added option "-S" to print server URL
-rw-r--r-- | framework/channel.c | 53 | ||||
-rw-r--r-- | framework/channel.h | 8 | ||||
-rw-r--r-- | framework/channel_pipe.c | 9 | ||||
-rw-r--r-- | framework/channel_tcp.c | 30 | ||||
-rw-r--r-- | main/main.c | 17 |
5 files changed, 104 insertions, 13 deletions
diff --git a/framework/channel.c b/framework/channel.c index 67996f39..2437d966 100644 --- a/framework/channel.c +++ b/framework/channel.c @@ -218,6 +218,59 @@ PeerServer * channel_peer_from_url(const char * url) { return ps; } +static int hex_digit(unsigned n) { + n &= 0xf; + if (n < 10) return '0' + n; + return 'A' + (n - 10); +} + +static void write_url_string(OutputStream * out, const char * str, const char *quote) { + int c; + while ((c = *str++) != '\0') { + if (c == '%' || strchr(quote, c)) { + write_stream(out, '%'); + write_stream(out, hex_digit(c >> 4)); + write_stream(out, hex_digit(c)); + } else + write_stream(out, c & 0xff); + } +} + +char * channel_peer_to_url(PeerServer * ps) { + int i; + char *rval; + const char * host; + const char * port; + const char * transportname = peer_server_getprop(ps, "TransportName", NULL); + ByteArrayOutputStream buf; + OutputStream * out; + + out = create_byte_array_output_stream(&buf); + if (transportname != NULL) { + write_url_string(out, transportname, ":"); + write_stream(out, ':'); + } + host = peer_server_getprop(ps, "Host", NULL); + if (host) + write_url_string(out, host, ":;"); + port = peer_server_getprop(ps, "Port", NULL); + if (port) { + write_stream(out, ':'); + write_url_string(out, port, ":;"); + } + for (i = 0; i < ps->ind; i++) { + if (ps->list[i].value == host || ps->list[i].value == port) + continue; + write_stream(out, ';'); + write_url_string(out, ps->list[i].name, ":;="); + write_stream(out, '='); + write_url_string(out, ps->list[i].value, ":;="); + } + write_stream(out, '\0'); + get_byte_array_output_stream_data(&buf, &rval, NULL); + return rval; +} + /* * Start TCF channel server */ diff --git a/framework/channel.h b/framework/channel.h index ec1da67e..ea931933 100644 --- a/framework/channel.h +++ b/framework/channel.h @@ -85,6 +85,7 @@ struct Channel { }; struct ChannelServer { + PeerServer * ps; /* Server peer address information */ LINK servlink; /* Channel server list */ void * client_data; /* Client data */ void (*new_conn)(ChannelServer *, Channel *); /* New connection call back */ @@ -175,8 +176,13 @@ extern int is_channel_closed(Channel *); #define is_stream_closed(channel) is_channel_closed(channel) /* - * Create and return PeerServer object with attribute values taken fron given URL. + * Create and return PeerServer object with attribute values taken from given URL. */ extern PeerServer * channel_peer_from_url(const char *); +/* + * Create and return URL string with attribute values taken from given PeerServer. + */ +extern char * channel_peer_to_url(PeerServer * ps); + #endif /* D_channel */ diff --git a/framework/channel_pipe.c b/framework/channel_pipe.c index b03b4969..0e6259c6 100644 --- a/framework/channel_pipe.c +++ b/framework/channel_pipe.c @@ -86,7 +86,6 @@ struct ServerInstance { struct ServerPIPE { ChannelServer serv; - PeerServer * ps; LINK servlink; ServerInstance arr[SERVER_INSTANCE_CNT]; }; @@ -569,7 +568,7 @@ static void pipe_client_connected(void * args) { HANDLE h = NULL; OVERLAPPED overlap; char inp_path[FILE_PATH_SIZE]; - const char * path = peer_server_getprop(ins->server->ps, attr_pipe_name, def_pipe_name); + const char * path = peer_server_getprop(ins->server->serv.ps, attr_pipe_name, def_pipe_name); static unsigned pipe_cnt = 0; memset(&overlap, 0, sizeof(overlap)); @@ -661,7 +660,7 @@ static void close_output_pipe(ChannelPIPE * c) { static void register_server(ServerPIPE * s) { int i; - PeerServer * ps = s->ps; + PeerServer * ps = s->serv.ps; PeerServer * ps2 = peer_server_alloc(); const char * transport = peer_server_getprop(ps, "TransportName", NULL); const char * path = peer_server_getprop(ps, attr_pipe_name, def_pipe_name); @@ -700,7 +699,7 @@ static void server_close(ChannelServer * serv) { assert(is_dispatch_thread()); list_remove(&s->serv.servlink); list_remove(&s->servlink); - peer_server_free(s->ps); + peer_server_free(s->serv.ps); for (i = 0; i < SERVER_INSTANCE_CNT; i++) { ServerInstance * ins = s->arr + i; if (ins->fd_inp >= 0 && close(ins->fd_inp) < 0) check_error(errno); @@ -734,7 +733,7 @@ ChannelServer * channel_pipe_server(PeerServer * ps) { ins->fd_inp = -1; ins->fd_out = _open_osfhandle((intptr_t)ins->pipe, O_BINARY | O_WRONLY); } - s->ps = ps; + s->serv.ps = ps; s->serv.close = server_close; list_add_last(&s->serv.servlink, &channel_server_root); list_add_last(&s->servlink, &server_list); diff --git a/framework/channel_tcp.c b/framework/channel_tcp.c index 28fb94af..53320486 100644 --- a/framework/channel_tcp.c +++ b/framework/channel_tcp.c @@ -140,7 +140,6 @@ struct ServerTCP { int sock; struct sockaddr * addr_buf; int addr_len; - PeerServer * ps; LINK servlink; AsyncReqInfo accreq; }; @@ -910,6 +909,7 @@ static void refresh_peer_server(int sock, PeerServer * ps) { #else socklen_t sinlen; #endif + const char *str_port = peer_server_getprop(ps, "Port", NULL); int ifcind; struct in_addr src_addr; ip_ifc_info ifclist[MAX_IFC]; @@ -920,7 +920,6 @@ static void refresh_peer_server(int sock, PeerServer * ps) { } ifcind = build_ifclist(sock, MAX_IFC, ifclist); while (ifcind-- > 0) { - char str_port[32]; char str_host[64]; char str_id[64]; PeerServer * ps2; @@ -935,7 +934,6 @@ static void refresh_peer_server(int sock, PeerServer * ps) { for (i = 0; i < ps->ind; i++) { peer_server_addprop(ps2, loc_strdup(ps->list[i].name), loc_strdup(ps->list[i].value)); } - snprintf(str_port, sizeof(str_port), "%d", ntohs(sin.sin_port)); inet_ntop(AF_INET, &src_addr, str_host, sizeof(str_host)); snprintf(str_id, sizeof(str_id), "%s:%s:%s", transport, str_host, str_port); peer_server_addprop(ps2, loc_strdup("ID"), loc_strdup(str_id)); @@ -950,7 +948,7 @@ static void refresh_all_peer_servers(void * x) { LINK * l = server_list.next; while (l != &server_list) { ServerTCP * si = servlink2tcp(l); - refresh_peer_server(si->sock, si->ps); + refresh_peer_server(si->sock, si->serv.ps); l = l->next; } post_event_with_delay(refresh_all_peer_servers, NULL, PEER_DATA_REFRESH_PERIOD * 1000000); @@ -993,7 +991,7 @@ static void tcp_server_accept_done(void * x) { trace(LOG_ALWAYS, "Socket accept failed: %s", errno_to_str(req->error)); } else { - int ssl = strcmp(peer_server_getprop(si->ps, "TransportName", ""), "SSL") == 0; + int ssl = strcmp(peer_server_getprop(si->serv.ps, "TransportName", ""), "SSL") == 0; int unix_domain = si->addr_buf->sa_family == AF_UNIX; ChannelTCP * c = create_channel(req->u.acc.rval, ssl, 1, unix_domain); if (c == NULL) { @@ -1016,7 +1014,7 @@ static void server_close(ChannelServer * serv) { if (s->sock < 0) return; list_remove(&s->serv.servlink); list_remove(&s->servlink); - peer_server_free(s->ps); + peer_server_free(s->serv.ps); closesocket(s->sock); s->sock = -1; /* TODO: free server struct */ @@ -1041,7 +1039,7 @@ static ChannelServer * channel_server_create(PeerServer * ps, int sock) { si->addr_buf = (struct sockaddr *)loc_alloc(si->addr_len); si->serv.close = server_close; si->sock = sock; - si->ps = ps; + si->serv.ps = ps; if (server_list.next == NULL) { list_init(&server_list); post_event_with_delay(refresh_all_peer_servers, NULL, PEER_DATA_REFRESH_PERIOD * 1000000); @@ -1224,6 +1222,24 @@ ChannelServer * channel_tcp_server(PeerServer * ps) { errno = error; return NULL; } + if (def_port) { + struct sockaddr_in sin; +#if defined(_WRS_KERNEL) + int sinlen; +#else + socklen_t sinlen; +#endif + char str_port[32]; + + sinlen = sizeof sin; + if (getsockname(sock, (struct sockaddr *)&sin, &sinlen) != 0) { + trace(LOG_ALWAYS, "getsockname error: %s", errno_to_str(errno)); + closesocket(sock); + return NULL; + } + snprintf(str_port, sizeof(str_port), "%d", ntohs(sin.sin_port)); + peer_server_addprop(ps, loc_strdup("Port"), loc_strdup(str_port)); + } return channel_server_create(ps, sock); } diff --git a/main/main.c b/main/main.c index 3327ece4..be0f7ebe 100644 --- a/main/main.c +++ b/main/main.c @@ -30,6 +30,7 @@ #include <framework/trace.h> #include <framework/channel_tcp.h> #include <framework/plugins.h> +#include <framework/myalloc.h> #include <services/discovery.h> #include <main/test.h> #include <main/cmdline.h> @@ -120,6 +121,7 @@ int main(int argc, char ** argv) { int ind; int daemon = 0; int interactive = 0; + int print_server_url = 0; const char * log_name = NULL; const char * url = "TCP:"; Protocol * proto = NULL; @@ -169,6 +171,10 @@ int main(int argc, char ** argv) { exit(0); break; + case 'S': + print_server_url = 1; + break; + case 'l': case 'L': case 's': @@ -234,6 +240,17 @@ int main(int argc, char ** argv) { } discovery_start(); + if (print_server_url) { + ChannelServer *s; + char *server_url; + assert(!list_is_empty(&channel_server_root)); + s = servlink2channelserverp(channel_server_root.next); + server_url = channel_peer_to_url(s->ps); + printf("Server-URL: %s\n", server_url); + trace(LOG_ALWAYS, "Server-URL: %s", server_url); + loc_free(server_url); + } + signal(SIGABRT, signal_handler); signal(SIGILL, signal_handler); signal(SIGINT, signal_handler); |