Changes in uspace/app/ping/ping.c [3b3c689:02a09ed] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/ping/ping.c
r3b3c689 r02a09ed 1 1 /* 2 * Copyright (c) 201 2Jiri Svoboda2 * Copyright (c) 2013 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 34 34 35 35 #include <async.h> 36 #include < bool.h>36 #include <stdbool.h> 37 37 #include <errno.h> 38 38 #include <fibril_synch.h> 39 #include <net/socket_codes.h> 40 #include <inet/dnsr.h> 41 #include <inet/addr.h> 39 42 #include <inet/inetping.h> 40 43 #include <io/console.h> … … 61 64 }; 62 65 63 static inet_addr_t src_addr;64 static inet_addr_t dest_addr;66 static addr32_t src; 67 static addr32_t dest; 65 68 66 69 static bool ping_repeat = false; … … 68 71 static void print_syntax(void) 69 72 { 70 printf("syntax: " NAME " [-r] <addr>\n"); 71 } 72 73 static int addr_parse(const char *text, inet_addr_t *addr) 74 { 75 unsigned long a[4]; 76 char *cp = (char *)text; 77 int i; 78 79 for (i = 0; i < 3; i++) { 80 a[i] = strtoul(cp, &cp, 10); 81 if (*cp != '.') 82 return EINVAL; 83 ++cp; 84 } 85 86 a[3] = strtoul(cp, &cp, 10); 87 if (*cp != '\0') 88 return EINVAL; 89 90 addr->ipv4 = 0; 91 for (i = 0; i < 4; i++) { 92 if (a[i] > 255) 93 return EINVAL; 94 addr->ipv4 = (addr->ipv4 << 8) | a[i]; 95 } 96 97 return EOK; 98 } 99 100 static int addr_format(inet_addr_t *addr, char **bufp) 101 { 102 int rc; 103 104 rc = asprintf(bufp, "%d.%d.%d.%d", addr->ipv4 >> 24, 105 (addr->ipv4 >> 16) & 0xff, (addr->ipv4 >> 8) & 0xff, 106 addr->ipv4 & 0xff); 107 108 if (rc < 0) 109 return ENOMEM; 110 111 return EOK; 73 printf("syntax: " NAME " [-r] <host>\n"); 112 74 } 113 75 … … 122 84 static int ping_ev_recv(inetping_sdu_t *sdu) 123 85 { 124 char *asrc, *adest; 125 int rc; 126 127 rc = addr_format(&sdu->src, &asrc); 86 inet_addr_t src_addr; 87 inet_addr_set(sdu->src, &src_addr); 88 89 inet_addr_t dest_addr; 90 inet_addr_set(sdu->dest, &dest_addr); 91 92 char *asrc; 93 int rc = inet_addr_format(&src_addr, &asrc); 128 94 if (rc != EOK) 129 95 return ENOMEM; 130 131 rc = addr_format(&sdu->dest, &adest); 96 97 char *adest; 98 rc = inet_addr_format(&dest_addr, &adest); 132 99 if (rc != EOK) { 133 100 free(asrc); 134 101 return ENOMEM; 135 102 } 103 136 104 printf("Received ICMP echo reply: from %s to %s, seq. no %u, " 137 105 "payload size %zu\n", asrc, adest, sdu->seq_no, sdu->size); 138 139 if (!ping_repeat) {106 107 if (!ping_repeat) 140 108 ping_signal_done(); 141 } 142 109 143 110 free(asrc); 144 111 free(adest); … … 151 118 int rc; 152 119 153 sdu.src = src _addr;154 sdu.dest = dest _addr;120 sdu.src = src; 121 sdu.dest = dest; 155 122 sdu.seq_no = seq_no; 156 123 sdu.data = (void *) "foo"; … … 188 155 { 189 156 console_ctrl_t *con; 190 kbd_event_t ev;157 cons_event_t ev; 191 158 192 159 con = console_init(stdin, stdout); … … 194 161 195 162 while (true) { 196 if (!console_get_ kbd_event(con, &ev))163 if (!console_get_event(con, &ev)) 197 164 break; 198 165 199 if (ev.type == KEY_PRESS && (ev.mods & (KM_ALT | KM_SHIFT)) == 200 0 && (ev.mods & KM_CTRL) != 0) { 166 if (ev.type == CEV_KEY && ev.ev.key.type == KEY_PRESS && 167 (ev.ev.key.mods & (KM_ALT | KM_SHIFT)) == 168 0 && (ev.ev.key.mods & KM_CTRL) != 0) { 201 169 /* Ctrl+key */ 202 if (ev. key == KC_Q) {170 if (ev.ev.key.key == KC_Q) { 203 171 ping_signal_done(); 204 172 return 0; … … 212 180 int main(int argc, char *argv[]) 213 181 { 182 dnsr_hostinfo_t *hinfo = NULL; 183 char *asrc = NULL; 184 char *adest = NULL; 185 char *sdest = NULL; 214 186 int rc; 215 187 int argi; … … 219 191 printf(NAME ": Failed connecting to internet ping service " 220 192 "(%d).\n", rc); 221 return 1;193 goto error; 222 194 } 223 195 … … 232 204 if (argc - argi != 1) { 233 205 print_syntax(); 234 return 1;206 goto error; 235 207 } 236 208 237 209 /* Parse destination address */ 238 rc = addr_parse(argv[argi], &dest_addr); 239 if (rc != EOK) { 240 printf(NAME ": Invalid address format.\n"); 241 print_syntax(); 242 return 1; 243 } 244 210 inet_addr_t dest_addr; 211 rc = inet_addr_parse(argv[argi], &dest_addr); 212 if (rc != EOK) { 213 /* Try interpreting as a host name */ 214 rc = dnsr_name2host(argv[argi], &hinfo); 215 if (rc != EOK) { 216 printf(NAME ": Error resolving host '%s'.\n", argv[argi]); 217 goto error; 218 } 219 220 dest_addr = hinfo->addr; 221 } 222 223 uint16_t af = inet_addr_get(&dest_addr, &dest, NULL); 224 if (af != AF_INET) { 225 printf(NAME ": Destination '%s' is not an IPv4 address.\n", 226 argv[argi]); 227 goto error; 228 } 229 245 230 /* Determine source address */ 246 rc = inetping_get_srcaddr( &dest_addr, &src_addr);231 rc = inetping_get_srcaddr(dest, &src); 247 232 if (rc != EOK) { 248 233 printf(NAME ": Failed determining source address.\n"); 249 return 1; 250 } 234 goto error; 235 } 236 237 inet_addr_t src_addr; 238 inet_addr_set(src, &src_addr); 239 240 rc = inet_addr_format(&src_addr, &asrc); 241 if (rc != EOK) { 242 printf(NAME ": Out of memory.\n"); 243 goto error; 244 } 245 246 rc = inet_addr_format(&dest_addr, &adest); 247 if (rc != EOK) { 248 printf(NAME ": Out of memory.\n"); 249 goto error; 250 } 251 252 if (hinfo != NULL) { 253 rc = asprintf(&sdest, "%s (%s)", hinfo->cname, adest); 254 if (rc < 0) { 255 printf(NAME ": Out of memory.\n"); 256 goto error; 257 } 258 } else { 259 sdest = adest; 260 adest = NULL; 261 } 262 263 printf("Sending ICMP echo request from %s to %s.\n", 264 asrc, sdest); 251 265 252 266 fid_t fid; … … 256 270 if (fid == 0) { 257 271 printf(NAME ": Failed creating transmit fibril.\n"); 258 return 1;272 goto error; 259 273 } 260 274 … … 264 278 if (fid == 0) { 265 279 printf(NAME ": Failed creating input fibril.\n"); 266 return 1;280 goto error; 267 281 } 268 282 … … 282 296 if (rc == ETIMEOUT) { 283 297 printf(NAME ": Echo request timed out.\n"); 284 return 1; 285 } 286 298 goto error; 299 } 300 301 free(asrc); 302 free(adest); 303 free(sdest); 304 dnsr_hostinfo_destroy(hinfo); 287 305 return 0; 306 307 error: 308 free(asrc); 309 free(adest); 310 free(sdest); 311 dnsr_hostinfo_destroy(hinfo); 312 return 1; 288 313 } 289 314
Note:
See TracChangeset
for help on using the changeset viewer.