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


Ignore:
Timestamp:
2013-05-30T17:13:02Z (11 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
98abd40
Parents:
be2bb4f (diff), 94dfb92 (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:

Merge mainline changes

File:
1 edited

Legend:

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

    rbe2bb4f rb8e72fd1  
    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);
     
    213174int main(int argc, char *argv[])
    214175{
     176        dnsr_hostinfo_t *hinfo = NULL;
     177        char *asrc = NULL;
     178        char *adest = NULL;
     179        char *sdest = NULL;
    215180        int rc;
    216181        int argi;
     
    220185                printf(NAME ": Failed connecting to internet ping service "
    221186                    "(%d).\n", rc);
    222                 return 1;
     187                goto error;
    223188        }
    224189
     
    233198        if (argc - argi != 1) {
    234199                print_syntax();
    235                 return 1;
     200                goto error;
    236201        }
    237202
    238203        /* 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;
    244214        }
    245215
     
    248218        if (rc != EOK) {
    249219                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);
    252248
    253249        fid_t fid;
     
    257253                if (fid == 0) {
    258254                        printf(NAME ": Failed creating transmit fibril.\n");
    259                         return 1;
     255                        goto error;
    260256                }
    261257
     
    265261                if (fid == 0) {
    266262                        printf(NAME ": Failed creating input fibril.\n");
    267                         return 1;
     263                        goto error;
    268264                }
    269265
     
    283279        if (rc == ETIMEOUT) {
    284280                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);
    288288        return 0;
     289error:
     290        free(asrc);
     291        free(adest);
     292        free(sdest);
     293        dnsr_hostinfo_destroy(hinfo);
     294        return 1;
    289295}
    290296
Note: See TracChangeset for help on using the changeset viewer.