Changes in uspace/app/ping/ping.c [a2e3ee6:07b7c48] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/ping/ping.c
ra2e3ee6 r07b7c48 1 1 /* 2 * Copyright (c) 201 3Jiri Svoboda2 * Copyright (c) 2012 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>41 39 #include <inet/inetping.h> 42 40 #include <io/console.h> … … 63 61 }; 64 62 65 static uint32_t src;66 static uint32_t dest;63 static inet_addr_t src_addr; 64 static inet_addr_t dest_addr; 67 65 68 66 static bool ping_repeat = false; … … 70 68 static void print_syntax(void) 71 69 { 72 printf("syntax: " NAME " [-r] <host>\n"); 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 112 } 74 113 … … 83 122 static int ping_ev_recv(inetping_sdu_t *sdu) 84 123 { 85 inet_addr_t src_addr; 86 inet_addr_unpack(sdu->src, &src_addr); 87 88 inet_addr_t dest_addr; 89 inet_addr_unpack(sdu->dest, &dest_addr); 90 91 char *asrc; 92 int rc = inet_addr_format(&src_addr, &asrc); 124 char *asrc, *adest; 125 int rc; 126 127 rc = addr_format(&sdu->src, &asrc); 93 128 if (rc != EOK) 94 129 return ENOMEM; 95 96 char *adest; 97 rc = inet_addr_format(&dest_addr, &adest); 130 131 rc = addr_format(&sdu->dest, &adest); 98 132 if (rc != EOK) { 99 133 free(asrc); 100 134 return ENOMEM; 101 135 } 102 103 136 printf("Received ICMP echo reply: from %s to %s, seq. no %u, " 104 137 "payload size %zu\n", asrc, adest, sdu->seq_no, sdu->size); 105 106 if (!ping_repeat) 138 139 if (!ping_repeat) { 107 140 ping_signal_done(); 108 141 } 142 109 143 free(asrc); 110 144 free(adest); … … 117 151 int rc; 118 152 119 sdu.src = src ;120 sdu.dest = dest ;153 sdu.src = src_addr; 154 sdu.dest = dest_addr; 121 155 sdu.seq_no = seq_no; 122 156 sdu.data = (void *) "foo"; … … 179 213 int main(int argc, char *argv[]) 180 214 { 181 dnsr_hostinfo_t *hinfo = NULL;182 char *asrc = NULL;183 char *adest = NULL;184 char *sdest = NULL;185 215 int rc; 186 216 int argi; … … 190 220 printf(NAME ": Failed connecting to internet ping service " 191 221 "(%d).\n", rc); 192 goto error;222 return 1; 193 223 } 194 224 … … 203 233 if (argc - argi != 1) { 204 234 print_syntax(); 205 goto error;235 return 1; 206 236 } 207 237 208 238 /* Parse destination address */ 209 inet_addr_t dest_addr; 210 rc = inet_addr_parse(argv[argi], &dest_addr); 211 if (rc != EOK) { 212 /* Try interpreting as a host name */ 213 rc = dnsr_name2host(argv[argi], &hinfo); 214 if (rc != EOK) { 215 printf(NAME ": Error resolving host '%s'.\n", argv[argi]); 216 goto error; 217 } 218 219 dest_addr = hinfo->addr; 220 } 221 222 rc = inet_addr_pack(&dest_addr, &dest); 223 if (rc != EOK) { 224 printf(NAME ": Destination '%s' is not an IPv4 address.\n", 225 argv[argi]); 226 goto error; 227 } 228 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; 244 } 245 229 246 /* Determine source address */ 230 rc = inetping_get_srcaddr( dest, &src);247 rc = inetping_get_srcaddr(&dest_addr, &src_addr); 231 248 if (rc != EOK) { 232 249 printf(NAME ": Failed determining source address.\n"); 233 goto error; 234 } 235 236 inet_addr_t src_addr; 237 inet_addr_unpack(src, &src_addr); 238 239 rc = inet_addr_format(&src_addr, &asrc); 240 if (rc != EOK) { 241 printf(NAME ": Out of memory.\n"); 242 goto error; 243 } 244 245 rc = inet_addr_format(&dest_addr, &adest); 246 if (rc != EOK) { 247 printf(NAME ": Out of memory.\n"); 248 goto error; 249 } 250 251 if (hinfo != NULL) { 252 rc = asprintf(&sdest, "%s (%s)", hinfo->cname, adest); 253 if (rc < 0) { 254 printf(NAME ": Out of memory.\n"); 255 goto error; 256 } 257 } else { 258 sdest = adest; 259 adest = NULL; 260 } 261 262 printf("Sending ICMP echo request from %s to %s.\n", 263 asrc, sdest); 250 return 1; 251 } 264 252 265 253 fid_t fid; … … 269 257 if (fid == 0) { 270 258 printf(NAME ": Failed creating transmit fibril.\n"); 271 goto error;259 return 1; 272 260 } 273 261 … … 277 265 if (fid == 0) { 278 266 printf(NAME ": Failed creating input fibril.\n"); 279 goto error;267 return 1; 280 268 } 281 269 … … 295 283 if (rc == ETIMEOUT) { 296 284 printf(NAME ": Echo request timed out.\n"); 297 goto error; 298 } 299 300 free(asrc); 301 free(adest); 302 free(sdest); 303 dnsr_hostinfo_destroy(hinfo); 285 return 1; 286 } 287 304 288 return 0; 305 306 error:307 free(asrc);308 free(adest);309 free(sdest);310 dnsr_hostinfo_destroy(hinfo);311 return 1;312 289 } 313 290
Note:
See TracChangeset
for help on using the changeset viewer.