summaryrefslogtreecommitdiff
path: root/examples/echosrv.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/echosrv.c')
-rw-r--r--examples/echosrv.c69
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)
108void 114void
109create_server (char *arg) 115create_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,

Return to:

Send suggestions and report system problems to the System administrator.