Changeset 71b00dcc in mainline for uspace/srv/net/app/ping/ping.c


Ignore:
Timestamp:
2010-03-07T22:51:38Z (14 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
60ab6c3
Parents:
b5cbff4 (diff), 31c80a5 (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 from lp:~lukasmejdrech/helenos/network.

File:
1 edited

Legend:

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

    rb5cbff4 r71b00dcc  
    6363 *  @returns EOK on success.
    6464 */
    65 int             main( int argc, char * argv[] );
     65int main(int argc, char * argv[]);
    6666
    6767/** Prints the application help.
    6868 */
    69 void    print_help( void );
     69void print_help(void);
    7070
    7171/** Translates the character string to the address family number.
     
    7474 *  @returns EAFNOSUPPORTED if the address family is not supported.
    7575 */
    76 int             parse_address_family( const char * name );
    77 
    78 void print_help( void ){
     76int parse_address_family(const char * name);
     77
     78void print_help(void){
    7979        printf(
    8080                "Network Ping aplication\n" \
     
    111111}
    112112
    113 int parse_address_family( const char * name ){
    114         if( str_lcmp( name, "AF_INET", 7 ) == 0 ){
     113int parse_address_family(const char * name){
     114        if(str_lcmp(name, "AF_INET", 7) == 0){
    115115                return AF_INET;
    116         }else if( str_lcmp( name, "AF_INET6", 8 ) == 0 ){
     116        }else if(str_lcmp(name, "AF_INET6", 8) == 0){
    117117                return AF_INET6;
    118118        }
     
    120120}
    121121
    122 int main( int argc, char * argv[] ){
     122int main(int argc, char * argv[]){
    123123        ERROR_DECLARE;
    124124
    125         size_t                          size                    = 38;
    126         int                                     verbose                 = 0;
    127         int                                     dont_fragment   = 0;
    128         ip_ttl_t                        ttl                             = 0;
    129         ip_tos_t                        tos                             = 0;
    130         int                                     count                   = 3;
    131         suseconds_t                     timeout                 = 3000;
    132         int                                     family                  = AF_INET;
    133 
    134         socklen_t                       max_length              = sizeof( struct sockaddr_in6 );
    135         uint8_t                         address_data[ max_length ];
    136         struct sockaddr *               address         = ( struct sockaddr * ) address_data;
    137         struct sockaddr_in *    address_in              = ( struct sockaddr_in * ) address;
    138         struct sockaddr_in6 *   address_in6     = ( struct sockaddr_in6 * ) address;
    139         socklen_t                       addrlen;
    140         char                            address_string[ INET6_ADDRSTRLEN ];
    141         uint8_t *                       address_start;
    142         int                                     icmp_phone;
    143         struct timeval          time_before;
    144         struct timeval          time_after;
    145         int                                     result;
    146         int                                     value;
    147         int                                     index;
    148 
    149         printf( "Task %d - ", task_get_id());
    150         printf( "%s\n", NAME );
    151 
    152         if( argc <= 1 ){
     125        size_t size                     = 38;
     126        int verbose                     = 0;
     127        int dont_fragment       = 0;
     128        ip_ttl_t ttl                            = 0;
     129        ip_tos_t tos                            = 0;
     130        int count                       = 3;
     131        suseconds_t timeout                     = 3000;
     132        int family                      = AF_INET;
     133
     134        socklen_t max_length            = sizeof(struct sockaddr_in6);
     135        uint8_t address_data[max_length];
     136        struct sockaddr * address               = (struct sockaddr *) address_data;
     137        struct sockaddr_in * address_in         = (struct sockaddr_in *) address;
     138        struct sockaddr_in6 * address_in6       = (struct sockaddr_in6 *) address;
     139        socklen_t addrlen;
     140        char address_string[INET6_ADDRSTRLEN];
     141        uint8_t * address_start;
     142        int icmp_phone;
     143        struct timeval time_before;
     144        struct timeval time_after;
     145        int result;
     146        int value;
     147        int index;
     148
     149        printf("Task %d - ", task_get_id());
     150        printf("%s\n", NAME);
     151
     152        if(argc <= 1){
    153153                print_help();
    154154                return EINVAL;
    155155        }
    156156
    157         for( index = 1; ( index < argc - 1 ) || (( index == argc ) && ( argv[ index ][ 0 ] == '-' )); ++ index ){
    158                 if( argv[ index ][ 0 ] == '-' ){
    159                         switch( argv[ index ][ 1 ] ){
    160                                 case 'c':       ERROR_PROPAGATE( parse_parameter_int( argc, argv, & index, & count, "count", 0 ));
    161                                                         break;
    162                                 case 'f':       ERROR_PROPAGATE( parse_parameter_name_int( argc, argv, & index, & family, "address family", 0, parse_address_family ));
    163                                                         break;
    164                                 case 'h':       print_help();
    165                                                         return EOK;
    166                                                         break;
    167                                 case 's':       ERROR_PROPAGATE( parse_parameter_int( argc, argv, & index, & value, "packet size", 0 ));
    168                                                         size = (value >= 0 ) ? ( size_t ) value : 0;
    169                                                         break;
    170                                 case 't':       ERROR_PROPAGATE( parse_parameter_int( argc, argv, & index, & value, "timeout", 0 ));
    171                                                         timeout = (value >= 0 ) ? ( suseconds_t ) value : 0;
    172                                                         break;
    173                                 case 'v':       verbose = 1;
    174                                                         break;
    175                                 case '-':       if( str_lcmp( argv[ index ] + 2, "count=", 6 ) == 0 ){
    176                                                                 ERROR_PROPAGATE( parse_parameter_int( argc, argv, & index, & count, "received count", 8 ));
    177                                                         }else if( str_lcmp( argv[ index ] + 2, "dont_fragment", 13 ) == 0 ){
    178                                                                 dont_fragment = 1;
    179                                                         }else if( str_lcmp( argv[ index ] + 2, "family=", 7 ) == 0 ){
    180                                                                 ERROR_PROPAGATE( parse_parameter_name_int( argc, argv, & index, & family, "address family", 9, parse_address_family ));
    181                                                         }else if( str_lcmp( argv[ index ] + 2, "help", 5 ) == 0 ){
    182                                                                 print_help();
    183                                                                 return EOK;
    184                                                         }else if( str_lcmp( argv[ index ] + 2, "size=", 5 ) == 0 ){
    185                                                                 ERROR_PROPAGATE( parse_parameter_int( argc, argv, & index, & value, "packet size", 7 ));
    186                                                                 size = (value >= 0 ) ? ( size_t ) value : 0;
    187                                                         }else if( str_lcmp( argv[ index ] + 2, "timeout=", 8 ) == 0 ){
    188                                                                 ERROR_PROPAGATE( parse_parameter_int( argc, argv, & index, & value, "timeout", 7 ));
    189                                                                 timeout = (value >= 0 ) ? ( suseconds_t ) value : 0;
    190                                                         }else if( str_lcmp( argv[ index ] + 2, "tos=", 4 ) == 0 ){
    191                                                                 ERROR_PROPAGATE( parse_parameter_int( argc, argv, & index, & value, "type of service", 7 ));
    192                                                                 tos = (value >= 0 ) ? ( ip_tos_t ) value : 0;
    193                                                         }else if( str_lcmp( argv[ index ] + 2, "ttl=", 4 ) == 0 ){
    194                                                                 ERROR_PROPAGATE( parse_parameter_int( argc, argv, & index, & value, "time to live", 7 ));
    195                                                                 ttl = (value >= 0 ) ? ( ip_ttl_t ) value : 0;
    196                                                         }else if( str_lcmp( argv[ index ] + 2, "verbose", 8 ) == 0 ){
    197                                                                 verbose = 1;
    198                                                         }else{
    199                                                                 print_unrecognized( index, argv[ index ] + 2 );
    200                                                                 print_help();
    201                                                                 return EINVAL;
    202                                                         }
    203                                                         break;
     157        for(index = 1; (index < argc - 1) || ((index == argc) && (argv[index][0] == '-')); ++ index){
     158                if(argv[index][0] == '-'){
     159                        switch(argv[index][1]){
     160                                case 'c':
     161                                        ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &count, "count", 0));
     162                                        break;
     163                                case 'f':
     164                                        ERROR_PROPAGATE(parse_parameter_name_int(argc, argv, &index, &family, "address family", 0, parse_address_family));
     165                                        break;
     166                                case 'h':
     167                                        print_help();
     168                                        return EOK;
     169                                        break;
     170                                case 's':
     171                                        ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &value, "packet size", 0));
     172                                        size = (value >= 0) ? (size_t) value : 0;
     173                                        break;
     174                                case 't':
     175                                        ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &value, "timeout", 0));
     176                                        timeout = (value >= 0) ? (suseconds_t) value : 0;
     177                                        break;
     178                                case 'v':
     179                                        verbose = 1;
     180                                        break;
     181                                case '-':
     182                                        if(str_lcmp(argv[index] + 2, "count=", 6) == 0){
     183                                                ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &count, "received count", 8));
     184                                        }else if(str_lcmp(argv[index] + 2, "dont_fragment", 13) == 0){
     185                                                dont_fragment = 1;
     186                                        }else if(str_lcmp(argv[index] + 2, "family=", 7) == 0){
     187                                                ERROR_PROPAGATE(parse_parameter_name_int(argc, argv, &index, &family, "address family", 9, parse_address_family));
     188                                        }else if(str_lcmp(argv[index] + 2, "help", 5) == 0){
     189                                                print_help();
     190                                                return EOK;
     191                                        }else if(str_lcmp(argv[index] + 2, "size=", 5) == 0){
     192                                                ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &value, "packet size", 7));
     193                                                size = (value >= 0) ? (size_t) value : 0;
     194                                        }else if(str_lcmp(argv[index] + 2, "timeout=", 8) == 0){
     195                                                ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &value, "timeout", 7));
     196                                                timeout = (value >= 0) ? (suseconds_t) value : 0;
     197                                        }else if(str_lcmp(argv[index] + 2, "tos=", 4) == 0){
     198                                                ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &value, "type of service", 7));
     199                                                tos = (value >= 0) ? (ip_tos_t) value : 0;
     200                                        }else if(str_lcmp(argv[index] + 2, "ttl=", 4) == 0){
     201                                                ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &value, "time to live", 7));
     202                                                ttl = (value >= 0) ? (ip_ttl_t) value : 0;
     203                                        }else if(str_lcmp(argv[index] + 2, "verbose", 8) == 0){
     204                                                verbose = 1;
     205                                        }else{
     206                                                print_unrecognized(index, argv[index] + 2);
     207                                                print_help();
     208                                                return EINVAL;
     209                                        }
     210                                        break;
    204211                                default:
    205                                         print_unrecognized( index, argv[ index ] + 1 );
     212                                        print_unrecognized(index, argv[index] + 1);
    206213                                        print_help();
    207214                                        return EINVAL;
    208215                        }
    209216                }else{
    210                         print_unrecognized( index, argv[ index ] );
     217                        print_unrecognized(index, argv[index]);
    211218                        print_help();
    212219                        return EINVAL;
     
    214221        }
    215222
    216         bzero( address_data, max_length );
    217         switch( family ){
     223        bzero(address_data, max_length);
     224        switch(family){
    218225                case AF_INET:
    219226                        address_in->sin_family = AF_INET;
    220                         address_start = ( uint8_t * ) & address_in->sin_addr.s_addr;
    221                         addrlen = sizeof( struct sockaddr_in );
     227                        address_start = (uint8_t *) &address_in->sin_addr.s_addr;
     228                        addrlen = sizeof(struct sockaddr_in);
    222229                        break;
    223230                case AF_INET6:
    224231                        address_in6->sin6_family = AF_INET6;
    225                         address_start = ( uint8_t * ) & address_in6->sin6_addr.s6_addr;
    226                         addrlen = sizeof( struct sockaddr_in6 );
     232                        address_start = (uint8_t *) &address_in6->sin6_addr.s6_addr;
     233                        addrlen = sizeof(struct sockaddr_in6);
    227234                        break;
    228235                default:
    229                         fprintf( stderr, "Address family is not supported\n" );
     236                        fprintf(stderr, "Address family is not supported\n");
    230237                        return EAFNOSUPPORT;
    231238        }
    232239
    233         if( ERROR_OCCURRED( inet_pton( family, argv[ argc - 1 ], address_start ))){
    234                 fprintf( stderr, "Address parse error %d\n", ERROR_CODE );
     240        if(ERROR_OCCURRED(inet_pton(family, argv[argc - 1], address_start))){
     241                fprintf(stderr, "Address parse error %d\n", ERROR_CODE);
    235242                return ERROR_CODE;
    236243        }
    237244
    238         icmp_phone = icmp_connect_module( SERVICE_ICMP, ICMP_CONNECT_TIMEOUT );
    239         if( icmp_phone < 0 ){
    240                 fprintf( stderr, "ICMP connect error %d\n", icmp_phone );
     245        icmp_phone = icmp_connect_module(SERVICE_ICMP, ICMP_CONNECT_TIMEOUT);
     246        if(icmp_phone < 0){
     247                fprintf(stderr, "ICMP connect error %d\n", icmp_phone);
    241248                return icmp_phone;
    242249        }
    243250
    244         printf( "PING %d bytes of data\n", size );
    245         if( ERROR_OCCURRED( inet_ntop( address->sa_family, address_start, address_string, sizeof( address_string )))){
    246                 fprintf( stderr, "Address error %d\n", ERROR_CODE );
     251        printf("PING %d bytes of data\n", size);
     252        if(ERROR_OCCURRED(inet_ntop(address->sa_family, address_start, address_string, sizeof(address_string)))){
     253                fprintf(stderr, "Address error %d\n", ERROR_CODE);
    247254        }else{
    248                 printf( "Address %s:\n", address_string );
    249         }
    250 
    251         while( count > 0 ){
    252                 if( ERROR_OCCURRED( gettimeofday( & time_before, NULL ))){
    253                         fprintf( stderr, "Get time of day error %d\n", ERROR_CODE );
     255                printf("Address %s:\n", address_string);
     256        }
     257
     258        while(count > 0){
     259                if(ERROR_OCCURRED(gettimeofday(&time_before, NULL))){
     260                        fprintf(stderr, "Get time of day error %d\n", ERROR_CODE);
    254261                        return ERROR_CODE;
    255262                }
    256                 result = icmp_echo_msg( icmp_phone, size, timeout, ttl, tos, dont_fragment, address, addrlen );
    257                 if( ERROR_OCCURRED( gettimeofday( & time_after, NULL ))){
    258                         fprintf( stderr, "Get time of day error %d\n", ERROR_CODE );
     263                result = icmp_echo_msg(icmp_phone, size, timeout, ttl, tos, dont_fragment, address, addrlen);
     264                if(ERROR_OCCURRED(gettimeofday(&time_after, NULL))){
     265                        fprintf(stderr, "Get time of day error %d\n", ERROR_CODE);
    259266                        return ERROR_CODE;
    260267                }
    261                 switch( result ){
     268                switch(result){
    262269                        case ICMP_ECHO:
    263                                 printf( "Ping round trip time %d miliseconds\n", tv_sub( & time_after, & time_before ) / 1000 );
     270                                printf("Ping round trip time %d miliseconds\n", tv_sub(&time_after, &time_before) / 1000);
    264271                                break;
    265272                        case ETIMEOUT:
    266                                 printf( "Timed out.\n" );
     273                                printf("Timed out.\n");
    267274                                break;
    268275                        default:
    269                                 print_error( stdout, result, NULL, "\n" );
     276                                print_error(stdout, result, NULL, "\n");
    270277                }
    271278                -- count;
    272279        }
    273280
    274         if( verbose ) printf( "Exiting\n" );
     281        if(verbose){
     282                printf("Exiting\n");
     283        }
    275284
    276285        return EOK;
Note: See TracChangeset for help on using the changeset viewer.