99 |
static void decode_type (const char *optarg); |
static void decode_type (const char *optarg); |
100 |
static int send_echo (PING *ping); |
static int send_echo (PING *ping); |
101 |
|
|
102 |
|
static size_t |
103 |
|
ping_cvt_number (const char *optarg, size_t maxval, int allow_zero) |
104 |
|
{ |
105 |
|
char *p; |
106 |
|
size_t n; |
107 |
|
|
108 |
|
n = strtoul (optarg, &p, 0); |
109 |
|
if (*p) |
110 |
|
{ |
111 |
|
fprintf (stderr, "Invalid value (`%s' near `%s')\n", optarg, p); |
112 |
|
exit (1); |
113 |
|
} |
114 |
|
if (n == 0 && !allow_zero) |
115 |
|
{ |
116 |
|
fprintf (stderr, "Option value too small: %s\n", optarg); |
117 |
|
exit (1); |
118 |
|
} |
119 |
|
if (maxval && n > maxval) |
120 |
|
{ |
121 |
|
fprintf (stderr, "Option value too big: %s\n", optarg); |
122 |
|
exit (1); |
123 |
|
} |
124 |
|
return n; |
125 |
|
} |
126 |
|
|
127 |
int |
int |
128 |
main (int argc, char **argv) |
main (int argc, char **argv) |
129 |
{ |
{ |
135 |
u_char *patptr = NULL; |
u_char *patptr = NULL; |
136 |
bool is_root = false; |
bool is_root = false; |
137 |
|
|
138 |
int count = 0; |
size_t count = 0; |
139 |
int socket_type = 0; |
int socket_type = 0; |
140 |
int interval = 0; |
size_t interval = 0; |
141 |
|
|
142 |
if (getuid () == 0) |
if (getuid () == 0) |
143 |
is_root = true; |
is_root = true; |
169 |
break; |
break; |
170 |
|
|
171 |
case 'c': |
case 'c': |
172 |
count = atoi (optarg); |
count = ping_cvt_number (optarg, 0, 0); |
|
if (count <= 0) |
|
|
error (1, 0, "invalid count: %i", count); |
|
173 |
break; |
break; |
174 |
|
|
175 |
case 'd': |
case 'd': |
182 |
|
|
183 |
case 'i': |
case 'i': |
184 |
options |= OPT_INTERVAL; |
options |= OPT_INTERVAL; |
185 |
if (interval <= 0) |
interval = ping_cvt_number (optarg, 0, 0); |
|
error (1, 0, "invalid interval: %i", interval); |
|
186 |
break; |
break; |
187 |
|
|
188 |
case 'p': |
case 'p': |
191 |
break; |
break; |
192 |
|
|
193 |
case 's': |
case 's': |
194 |
data_length = atoi (optarg); |
data_length = ping_cvt_number (optarg, PING_MAX_DATALEN, 1); |
|
if (data_length < 1 || data_length > PING_MAX_DATALEN) |
|
|
error (1, 0, "invalid data length: %i", data_length); |
|
195 |
break; |
break; |
196 |
|
|
197 |
case 'n': |
case 'n': |