Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Burton2011-12-05 21:48:33 +0000
committerFelix Burton2011-12-05 22:42:31 +0000
commitafab780d7c6ad078c3be29236e14a704c5b7c4c7 (patch)
tree2bf3cf6db80e9ce6ee45896b33e1f127333efcf7
parentfb0d1567b191497c804570bdf3312b9154784048 (diff)
downloadorg.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.c53
-rw-r--r--framework/channel.h8
-rw-r--r--framework/channel_pipe.c9
-rw-r--r--framework/channel_tcp.c30
-rw-r--r--main/main.c17
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);

Back to the top