Changes in uspace/srv/net/app/ping/ping.c [aadf01e:4be390b] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/app/ping/ping.c
raadf01e r4be390b 63 63 * @returns EOK on success. 64 64 */ 65 int main(int argc, char * argv[]);65 int main( int argc, char * argv[] ); 66 66 67 67 /** Prints the application help. 68 68 */ 69 void print_help(void);69 void print_help( void ); 70 70 71 71 /** Translates the character string to the address family number. … … 74 74 * @returns EAFNOSUPPORTED if the address family is not supported. 75 75 */ 76 int parse_address_family(const char * name);77 78 void print_help( void){76 int parse_address_family( const char * name ); 77 78 void print_help( void ){ 79 79 printf( 80 80 "Network Ping aplication\n" \ … … 111 111 } 112 112 113 int parse_address_family( const char * name){114 if( str_lcmp(name, "AF_INET", 7) == 0){113 int parse_address_family( const char * name ){ 114 if( str_lcmp( name, "AF_INET", 7 ) == 0 ){ 115 115 return AF_INET; 116 }else if( str_lcmp(name, "AF_INET6", 8) == 0){116 }else if( str_lcmp( name, "AF_INET6", 8 ) == 0 ){ 117 117 return AF_INET6; 118 118 } … … 120 120 } 121 121 122 int main( int argc, char * argv[]){122 int main( int argc, char * argv[] ){ 123 123 ERROR_DECLARE; 124 124 125 size_t 126 int 127 int 128 ip_ttl_t 129 ip_tos_t 130 int 131 suseconds_t 132 int 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 140 char address_string[INET6_ADDRSTRLEN];141 uint8_t * 142 int 143 struct timeval 144 struct timeval 145 int 146 int 147 int 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 ){ 153 153 print_help(); 154 154 return EINVAL; 155 155 } 156 156 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; 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; 211 204 default: 212 print_unrecognized( index, argv[index] + 1);205 print_unrecognized( index, argv[ index ] + 1 ); 213 206 print_help(); 214 207 return EINVAL; 215 208 } 216 209 }else{ 217 print_unrecognized( index, argv[index]);210 print_unrecognized( index, argv[ index ] ); 218 211 print_help(); 219 212 return EINVAL; … … 221 214 } 222 215 223 bzero( address_data, max_length);224 switch( family){216 bzero( address_data, max_length ); 217 switch( family ){ 225 218 case AF_INET: 226 219 address_in->sin_family = AF_INET; 227 address_start = ( uint8_t *) &address_in->sin_addr.s_addr;228 addrlen = sizeof( struct sockaddr_in);220 address_start = ( uint8_t * ) & address_in->sin_addr.s_addr; 221 addrlen = sizeof( struct sockaddr_in ); 229 222 break; 230 223 case AF_INET6: 231 224 address_in6->sin6_family = AF_INET6; 232 address_start = ( uint8_t *) &address_in6->sin6_addr.s6_addr;233 addrlen = sizeof( struct sockaddr_in6);225 address_start = ( uint8_t * ) & address_in6->sin6_addr.s6_addr; 226 addrlen = sizeof( struct sockaddr_in6 ); 234 227 break; 235 228 default: 236 fprintf( stderr, "Address family is not supported\n");229 fprintf( stderr, "Address family is not supported\n" ); 237 230 return EAFNOSUPPORT; 238 231 } 239 232 240 if( ERROR_OCCURRED(inet_pton(family, argv[argc - 1], address_start))){241 fprintf( stderr, "Address parse error %d\n", ERROR_CODE);233 if( ERROR_OCCURRED( inet_pton( family, argv[ argc - 1 ], address_start ))){ 234 fprintf( stderr, "Address parse error %d\n", ERROR_CODE ); 242 235 return ERROR_CODE; 243 236 } 244 237 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);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 ); 248 241 return icmp_phone; 249 242 } 250 243 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);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 ); 254 247 }else{ 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);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 ); 261 254 return ERROR_CODE; 262 255 } 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);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 ); 266 259 return ERROR_CODE; 267 260 } 268 switch( result){261 switch( result ){ 269 262 case ICMP_ECHO: 270 printf( "Ping round trip time %d miliseconds\n", tv_sub(&time_after, &time_before) / 1000);263 printf( "Ping round trip time %d miliseconds\n", tv_sub( & time_after, & time_before ) / 1000 ); 271 264 break; 272 265 case ETIMEOUT: 273 printf( "Timed out.\n");266 printf( "Timed out.\n" ); 274 267 break; 275 268 default: 276 print_error( stdout, result, NULL, "\n");269 print_error( stdout, result, NULL, "\n" ); 277 270 } 278 271 -- count; 279 272 } 280 273 281 if(verbose){ 282 printf("Exiting\n"); 283 } 274 if( verbose ) printf( "Exiting\n" ); 284 275 285 276 return EOK;
Note:
See TracChangeset
for help on using the changeset viewer.