Changes in uspace/srv/net/app/ping/ping.c [4be390b:aadf01e] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/app/ping/ping.c
r4be390b raadf01e 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( 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': 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; 204 211 default: 205 print_unrecognized( index, argv[ index ] + 1);212 print_unrecognized(index, argv[index] + 1); 206 213 print_help(); 207 214 return EINVAL; 208 215 } 209 216 }else{ 210 print_unrecognized( index, argv[ index ]);217 print_unrecognized(index, argv[index]); 211 218 print_help(); 212 219 return EINVAL; … … 214 221 } 215 222 216 bzero( address_data, max_length);217 switch( family){223 bzero(address_data, max_length); 224 switch(family){ 218 225 case AF_INET: 219 226 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); 222 229 break; 223 230 case AF_INET6: 224 231 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); 227 234 break; 228 235 default: 229 fprintf( stderr, "Address family is not supported\n");236 fprintf(stderr, "Address family is not supported\n"); 230 237 return EAFNOSUPPORT; 231 238 } 232 239 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); 235 242 return ERROR_CODE; 236 243 } 237 244 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); 241 248 return icmp_phone; 242 249 } 243 250 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); 247 254 }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); 254 261 return ERROR_CODE; 255 262 } 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); 259 266 return ERROR_CODE; 260 267 } 261 switch( result){268 switch(result){ 262 269 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); 264 271 break; 265 272 case ETIMEOUT: 266 printf( "Timed out.\n");273 printf("Timed out.\n"); 267 274 break; 268 275 default: 269 print_error( stdout, result, NULL, "\n");276 print_error(stdout, result, NULL, "\n"); 270 277 } 271 278 -- count; 272 279 } 273 280 274 if( verbose ) printf( "Exiting\n" ); 281 if(verbose){ 282 printf("Exiting\n"); 283 } 275 284 276 285 return EOK;
Note:
See TracChangeset
for help on using the changeset viewer.