Changes in uspace/app/ping/ping.c [07b7c48:959d2ec] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/ping/ping.c
r07b7c48 r959d2ec 1 1 /* 2 * Copyright (c) 201 2Jiri Svoboda2 * Copyright (c) 2013 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 37 37 #include <errno.h> 38 38 #include <fibril_synch.h> 39 #include <inet/dnsr.h> 40 #include <inet/addr.h> 39 41 #include <inet/inetping.h> 40 42 #include <io/console.h> … … 68 70 static void print_syntax(void) 69 71 { 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; 72 printf("syntax: " NAME " [-r] <host>\n"); 112 73 } 113 74 … … 125 86 int rc; 126 87 127 rc = addr_format(&sdu->src, &asrc);88 rc = inet_addr_format(&sdu->src, &asrc); 128 89 if (rc != EOK) 129 90 return ENOMEM; 130 91 131 rc = addr_format(&sdu->dest, &adest);92 rc = inet_addr_format(&sdu->dest, &adest); 132 93 if (rc != EOK) { 133 94 free(asrc); … … 213 174 int main(int argc, char *argv[]) 214 175 { 176 dnsr_hostinfo_t *hinfo = NULL; 177 char *asrc = NULL; 178 char *adest = NULL; 179 char *sdest = NULL; 215 180 int rc; 216 181 int argi; … … 220 185 printf(NAME ": Failed connecting to internet ping service " 221 186 "(%d).\n", rc); 222 return 1;187 goto error; 223 188 } 224 189 … … 233 198 if (argc - argi != 1) { 234 199 print_syntax(); 235 return 1;200 goto error; 236 201 } 237 202 238 203 /* Parse destination address */ 239 rc = addr_parse(argv[argi], &dest_addr); 240 if (rc != EOK) { 241 printf(NAME ": Invalid address format.\n"); 242 print_syntax(); 243 return 1; 204 rc = inet_addr_parse(argv[argi], &dest_addr); 205 if (rc != EOK) { 206 /* Try interpreting as a host name */ 207 rc = dnsr_name2host(argv[argi], &hinfo); 208 if (rc != EOK) { 209 printf(NAME ": Error resolving host '%s'.\n", argv[argi]); 210 goto error; 211 } 212 213 dest_addr = hinfo->addr; 244 214 } 245 215 … … 248 218 if (rc != EOK) { 249 219 printf(NAME ": Failed determining source address.\n"); 250 return 1; 251 } 220 goto error; 221 } 222 223 rc = inet_addr_format(&src_addr, &asrc); 224 if (rc != EOK) { 225 printf(NAME ": Out of memory.\n"); 226 goto error; 227 } 228 229 rc = inet_addr_format(&dest_addr, &adest); 230 if (rc != EOK) { 231 printf(NAME ": Out of memory.\n"); 232 goto error; 233 } 234 235 if (hinfo != NULL) { 236 rc = asprintf(&sdest, "%s (%s)", hinfo->cname, adest); 237 if (rc < 0) { 238 printf(NAME ": Out of memory.\n"); 239 goto error; 240 } 241 } else { 242 sdest = adest; 243 adest = NULL; 244 } 245 246 printf("Sending ICMP echo request from %s to %s.\n", 247 asrc, sdest); 252 248 253 249 fid_t fid; … … 257 253 if (fid == 0) { 258 254 printf(NAME ": Failed creating transmit fibril.\n"); 259 return 1;255 goto error; 260 256 } 261 257 … … 265 261 if (fid == 0) { 266 262 printf(NAME ": Failed creating input fibril.\n"); 267 return 1;263 goto error; 268 264 } 269 265 … … 283 279 if (rc == ETIMEOUT) { 284 280 printf(NAME ": Echo request timed out.\n"); 285 return 1; 286 } 287 281 goto error; 282 } 283 284 free(asrc); 285 free(adest); 286 free(sdest); 287 dnsr_hostinfo_destroy(hinfo); 288 288 return 0; 289 error: 290 free(asrc); 291 free(adest); 292 free(sdest); 293 dnsr_hostinfo_destroy(hinfo); 294 return 1; 289 295 } 290 296
Note:
See TracChangeset
for help on using the changeset viewer.