diff options
Diffstat (limited to 'examples/echosrv.c')
-rw-r--r-- | examples/echosrv.c | 69 |
1 files changed, 43 insertions, 26 deletions
diff --git a/examples/echosrv.c b/examples/echosrv.c index fb68e7aee..fffde7343 100644 --- a/examples/echosrv.c +++ b/examples/echosrv.c | |||
@@ -39,13 +39,9 @@ echo_conn (int fd, struct sockaddr *s, int len, | |||
39 | void *server_data, void *call_data, | 39 | void *server_data, void *call_data, |
40 | mu_ip_server_t srv) | 40 | mu_ip_server_t srv) |
41 | { | 41 | { |
42 | struct sockaddr_in srv_addr, *s_in = (struct sockaddr_in *)s; | ||
43 | int addrlen = sizeof srv_addr; | ||
44 | pid_t pid; | 42 | pid_t pid; |
45 | char buf[512]; | 43 | char buf[512]; |
46 | FILE *in, *out; | 44 | FILE *in, *out; |
47 | |||
48 | mu_ip_server_get_sockaddr (srv, (struct sockaddr *)&srv_addr, &addrlen); | ||
49 | 45 | ||
50 | pid = fork (); | 46 | pid = fork (); |
51 | if (pid == -1) | 47 | if (pid == -1) |
@@ -56,10 +52,20 @@ echo_conn (int fd, struct sockaddr *s, int len, | |||
56 | 52 | ||
57 | if (pid) | 53 | if (pid) |
58 | { | 54 | { |
59 | mu_diag_output (MU_DIAG_INFO, "%lu: opened connection %s:%d => %s:%d", | 55 | struct mu_sockaddr *clt_addr; |
56 | int rc = mu_sockaddr_create (&clt_addr, s, len); | ||
57 | if (rc) | ||
58 | { | ||
59 | mu_error ("mu_sockaddr_create failed: %s", mu_strerror (rc)); | ||
60 | return 0; | ||
61 | } | ||
62 | |||
63 | mu_diag_output (MU_DIAG_INFO, "%lu: opened connection %s => %s", | ||
60 | (unsigned long) pid, | 64 | (unsigned long) pid, |
61 | inet_ntoa (srv_addr.sin_addr), ntohs (srv_addr.sin_port), | 65 | mu_ip_server_addrstr (srv), |
62 | inet_ntoa (s_in->sin_addr), ntohs (s_in->sin_port)); | 66 | mu_sockaddr_str (clt_addr)); |
67 | |||
68 | mu_sockaddr_free (clt_addr); | ||
63 | return 0; | 69 | return 0; |
64 | } | 70 | } |
65 | 71 | ||
@@ -108,34 +114,45 @@ tcp_conn_free (void *conn_data, void *server_data) | |||
108 | void | 114 | void |
109 | create_server (char *arg) | 115 | create_server (char *arg) |
110 | { | 116 | { |
111 | char *p, *q; | 117 | struct mu_sockaddr *s; |
112 | struct sockaddr_in s; | ||
113 | mu_ip_server_t tcpsrv; | 118 | mu_ip_server_t tcpsrv; |
114 | unsigned n; | 119 | int rc; |
115 | 120 | mu_url_t url, url_hint; | |
116 | p = strchr (arg, ':'); | 121 | struct mu_sockaddr_hints hints; |
117 | if (!*p) | 122 | |
123 | if (arg[0] == '/') | ||
124 | url_hint = NULL; | ||
125 | else | ||
118 | { | 126 | { |
119 | mu_error ("invalid specification: %s\n", arg); | 127 | rc = mu_url_create (&url_hint, "inet://"); |
120 | exit (1); | 128 | if (rc) |
129 | { | ||
130 | mu_error ("cannot create URL hints: %s", mu_strerror (rc)); | ||
131 | exit (1); | ||
132 | } | ||
121 | } | 133 | } |
122 | *p++ = 0; | 134 | rc = mu_url_create_hint (&url, arg, MU_URL_PARSE_DEFAULT, url_hint); |
123 | s.sin_family = AF_INET; | 135 | mu_url_destroy (&url_hint); |
124 | if (inet_aton (arg, &s.sin_addr) == 0) | 136 | if (rc) |
125 | { | 137 | { |
126 | mu_error ("invalid IP address: %s\n", arg); | 138 | mu_error ("cannot parse URL `%s': %s", arg, mu_strerror (rc)); |
127 | exit (1); | 139 | exit (1); |
128 | } | 140 | } |
129 | n = strtoul (p, &q, 0); | 141 | |
130 | if (*q) | 142 | memset (&hints, sizeof(hints), 0); |
143 | hints.flags = MU_AH_PASSIVE; | ||
144 | hints.socktype = SOCK_STREAM; | ||
145 | hints.protocol = IPPROTO_TCP; | ||
146 | rc = mu_sockaddr_from_url (&s, url, &hints); | ||
147 | mu_url_destroy (&url); | ||
148 | |||
149 | if (rc) | ||
131 | { | 150 | { |
132 | mu_error ("invalid port number: %s\n", p); | 151 | mu_error ("cannot create sockaddr: %s", mu_strerror (rc)); |
133 | exit (1); | 152 | exit (1); |
134 | } | 153 | } |
135 | s.sin_port = htons (n); | ||
136 | 154 | ||
137 | MU_ASSERT (mu_ip_server_create (&tcpsrv, (struct sockaddr*) &s, sizeof s, | 155 | MU_ASSERT (mu_ip_server_create (&tcpsrv, s, MU_IP_TCP)); |
138 | MU_IP_TCP)); | ||
139 | MU_ASSERT (mu_ip_server_open (tcpsrv)); | 156 | MU_ASSERT (mu_ip_server_open (tcpsrv)); |
140 | MU_ASSERT (mu_ip_server_set_conn (tcpsrv, echo_conn)); | 157 | MU_ASSERT (mu_ip_server_set_conn (tcpsrv, echo_conn)); |
141 | MU_ASSERT (mu_server_add_connection (server, | 158 | MU_ASSERT (mu_server_add_connection (server, |