Changeset dff90fa7 in mainline for uspace/app/ping/ping.c
- Timestamp:
- 2013-06-05T19:41:12Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 74dcc07
- Parents:
- f288d85 (diff), 6db5d4b (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/ping/ping.c
rf288d85 rdff90fa7 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); … … 188 149 { 189 150 console_ctrl_t *con; 190 kbd_event_t ev;151 cons_event_t ev; 191 152 192 153 con = console_init(stdin, stdout); … … 194 155 195 156 while (true) { 196 if (!console_get_ kbd_event(con, &ev))157 if (!console_get_event(con, &ev)) 197 158 break; 198 159 199 if (ev.type == KEY_PRESS && (ev.mods & (KM_ALT | KM_SHIFT)) == 200 0 && (ev.mods & KM_CTRL) != 0) { 160 if (ev.type == CEV_KEY && ev.ev.key.type == KEY_PRESS && 161 (ev.ev.key.mods & (KM_ALT | KM_SHIFT)) == 162 0 && (ev.ev.key.mods & KM_CTRL) != 0) { 201 163 /* Ctrl+key */ 202 if (ev. key == KC_Q) {164 if (ev.ev.key.key == KC_Q) { 203 165 ping_signal_done(); 204 166 return 0; … … 212 174 int main(int argc, char *argv[]) 213 175 { 176 dnsr_hostinfo_t *hinfo = NULL; 177 char *asrc = NULL; 178 char *adest = NULL; 179 char *sdest = NULL; 214 180 int rc; 215 181 int argi; … … 219 185 printf(NAME ": Failed connecting to internet ping service " 220 186 "(%d).\n", rc); 221 return 1;187 goto error; 222 188 } 223 189 … … 232 198 if (argc - argi != 1) { 233 199 print_syntax(); 234 return 1;200 goto error; 235 201 } 236 202 237 203 /* 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; 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; 243 214 } 244 215 … … 247 218 if (rc != EOK) { 248 219 printf(NAME ": Failed determining source address.\n"); 249 return 1; 250 } 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); 251 248 252 249 fid_t fid; … … 256 253 if (fid == 0) { 257 254 printf(NAME ": Failed creating transmit fibril.\n"); 258 return 1;255 goto error; 259 256 } 260 257 … … 264 261 if (fid == 0) { 265 262 printf(NAME ": Failed creating input fibril.\n"); 266 return 1;263 goto error; 267 264 } 268 265 … … 282 279 if (rc == ETIMEOUT) { 283 280 printf(NAME ": Echo request timed out.\n"); 284 return 1; 285 } 286 281 goto error; 282 } 283 284 free(asrc); 285 free(adest); 286 free(sdest); 287 dnsr_hostinfo_destroy(hinfo); 287 288 return 0; 289 error: 290 free(asrc); 291 free(adest); 292 free(sdest); 293 dnsr_hostinfo_destroy(hinfo); 294 return 1; 288 295 } 289 296
Note:
See TracChangeset
for help on using the changeset viewer.