Changeset dff90fa7 in mainline for uspace/app/ping/ping.c


Ignore:
Timestamp:
2013-06-05T19:41:12Z (12 years ago)
Author:
Jan Vesely <jano.vesely@…>
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.
Message:

mainline changes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/ping/ping.c

    rf288d85 rdff90fa7  
    11/*
    2  * Copyright (c) 2012 Jiri Svoboda
     2 * Copyright (c) 2013 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3737#include <errno.h>
    3838#include <fibril_synch.h>
     39#include <inet/dnsr.h>
     40#include <inet/addr.h>
    3941#include <inet/inetping.h>
    4042#include <io/console.h>
     
    6870static void print_syntax(void)
    6971{
    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");
    11273}
    11374
     
    12586        int rc;
    12687
    127         rc = addr_format(&sdu->src, &asrc);
     88        rc = inet_addr_format(&sdu->src, &asrc);
    12889        if (rc != EOK)
    12990                return ENOMEM;
    13091
    131         rc = addr_format(&sdu->dest, &adest);
     92        rc = inet_addr_format(&sdu->dest, &adest);
    13293        if (rc != EOK) {
    13394                free(asrc);
     
    188149{
    189150        console_ctrl_t *con;
    190         kbd_event_t ev;
     151        cons_event_t ev;
    191152
    192153        con = console_init(stdin, stdout);
     
    194155
    195156        while (true) {
    196                 if (!console_get_kbd_event(con, &ev))
     157                if (!console_get_event(con, &ev))
    197158                        break;
    198159
    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) {
    201163                        /* Ctrl+key */
    202                         if (ev.key == KC_Q) {
     164                        if (ev.ev.key.key == KC_Q) {
    203165                                ping_signal_done();
    204166                                return 0;
     
    212174int main(int argc, char *argv[])
    213175{
     176        dnsr_hostinfo_t *hinfo = NULL;
     177        char *asrc = NULL;
     178        char *adest = NULL;
     179        char *sdest = NULL;
    214180        int rc;
    215181        int argi;
     
    219185                printf(NAME ": Failed connecting to internet ping service "
    220186                    "(%d).\n", rc);
    221                 return 1;
     187                goto error;
    222188        }
    223189
     
    232198        if (argc - argi != 1) {
    233199                print_syntax();
    234                 return 1;
     200                goto error;
    235201        }
    236202
    237203        /* 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;
    243214        }
    244215
     
    247218        if (rc != EOK) {
    248219                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);
    251248
    252249        fid_t fid;
     
    256253                if (fid == 0) {
    257254                        printf(NAME ": Failed creating transmit fibril.\n");
    258                         return 1;
     255                        goto error;
    259256                }
    260257
     
    264261                if (fid == 0) {
    265262                        printf(NAME ": Failed creating input fibril.\n");
    266                         return 1;
     263                        goto error;
    267264                }
    268265
     
    282279        if (rc == ETIMEOUT) {
    283280                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);
    287288        return 0;
     289error:
     290        free(asrc);
     291        free(adest);
     292        free(sdest);
     293        dnsr_hostinfo_destroy(hinfo);
     294        return 1;
    288295}
    289296
Note: See TracChangeset for help on using the changeset viewer.