Changes in uspace/app/ping/ping.c [07b7c48:a2e3ee6] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/ping/ping.c
r07b7c48 ra2e3ee6 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> … … 61 63 }; 62 64 63 static inet_addr_t src_addr;64 static inet_addr_t dest_addr;65 static uint32_t src; 66 static uint32_t dest; 65 67 66 68 static bool ping_repeat = false; … … 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 … … 122 83 static int ping_ev_recv(inetping_sdu_t *sdu) 123 84 { 124 char *asrc, *adest; 125 int rc; 126 127 rc = addr_format(&sdu->src, &asrc); 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); 128 93 if (rc != EOK) 129 94 return ENOMEM; 130 131 rc = addr_format(&sdu->dest, &adest); 95 96 char *adest; 97 rc = inet_addr_format(&dest_addr, &adest); 132 98 if (rc != EOK) { 133 99 free(asrc); 134 100 return ENOMEM; 135 101 } 102 136 103 printf("Received ICMP echo reply: from %s to %s, seq. no %u, " 137 104 "payload size %zu\n", asrc, adest, sdu->seq_no, sdu->size); 138 139 if (!ping_repeat) {105 106 if (!ping_repeat) 140 107 ping_signal_done(); 141 } 142 108 143 109 free(asrc); 144 110 free(adest); … … 151 117 int rc; 152 118 153 sdu.src = src _addr;154 sdu.dest = dest _addr;119 sdu.src = src; 120 sdu.dest = dest; 155 121 sdu.seq_no = seq_no; 156 122 sdu.data = (void *) "foo"; … … 213 179 int main(int argc, char *argv[]) 214 180 { 181 dnsr_hostinfo_t *hinfo = NULL; 182 char *asrc = NULL; 183 char *adest = NULL; 184 char *sdest = NULL; 215 185 int rc; 216 186 int argi; … … 220 190 printf(NAME ": Failed connecting to internet ping service " 221 191 "(%d).\n", rc); 222 return 1;192 goto error; 223 193 } 224 194 … … 233 203 if (argc - argi != 1) { 234 204 print_syntax(); 235 return 1;205 goto error; 236 206 } 237 207 238 208 /* 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; 244 } 245 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 246 229 /* Determine source address */ 247 rc = inetping_get_srcaddr( &dest_addr, &src_addr);230 rc = inetping_get_srcaddr(dest, &src); 248 231 if (rc != EOK) { 249 232 printf(NAME ": Failed determining source address.\n"); 250 return 1; 251 } 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); 252 264 253 265 fid_t fid; … … 257 269 if (fid == 0) { 258 270 printf(NAME ": Failed creating transmit fibril.\n"); 259 return 1;271 goto error; 260 272 } 261 273 … … 265 277 if (fid == 0) { 266 278 printf(NAME ": Failed creating input fibril.\n"); 267 return 1;279 goto error; 268 280 } 269 281 … … 283 295 if (rc == ETIMEOUT) { 284 296 printf(NAME ": Echo request timed out.\n"); 285 return 1; 286 } 287 297 goto error; 298 } 299 300 free(asrc); 301 free(adest); 302 free(sdest); 303 dnsr_hostinfo_destroy(hinfo); 288 304 return 0; 305 306 error: 307 free(asrc); 308 free(adest); 309 free(sdest); 310 dnsr_hostinfo_destroy(hinfo); 311 return 1; 289 312 } 290 313
Note:
See TracChangeset
for help on using the changeset viewer.