-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain_ping.cpp
142 lines (126 loc) · 3.9 KB
/
main_ping.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <cstdio>
#include "device_ping.h"
#ifndef _MSC_VER
#include <getopt.h>
#else
int opterr = 1, /* if error message should be printed */
optind = 1, /* index into parent argv vector */
optopt, /* character checked for validity */
optreset; /* reset getopt */
char *optarg; /* argument associated with option */
#define BADCH (int)'?'
#define BADARG (int)':'
#define EMSG ""
/*
* getopt --
* Parse argc/argv argument vector.
*/
int
getopt(int nargc, char * const nargv[], const char *ostr)
{
static char *place = EMSG; /* option letter processing */
const char *oli; /* option letter list index */
if (optreset || !*place) { /* update scanning pointer */
optreset = 0;
if (optind >= nargc || *(place = nargv[optind]) != '-') {
place = EMSG;
return (-1);
}
if (place[1] && *++place == '-') { /* found "--" */
++optind;
place = EMSG;
return (-1);
}
} /* option letter okay? */
if ((optopt = (int)*place++) == (int)':' ||
!(oli = strchr(ostr, optopt))) {
/*
* if the user didn't specify '-' as an option,
* assume it means -1.
*/
if (optopt == (int)'-')
return (-1);
if (!*place)
++optind;
if (opterr && *ostr != ':')
(void)printf("illegal option -- %c\n", optopt);
return (BADCH);
}
if (*++oli != ':') { /* don't need argument */
optarg = NULL;
if (!*place)
++optind;
}
else { /* need an argument */
if (*place) /* no white space */
optarg = place;
else if (nargc <= ++optind) { /* no arg */
place = EMSG;
if (*ostr == ':')
return (BADARG);
if (opterr)
(void)printf("option requires an argument -- %c\n", optopt);
return (BADCH);
}
else /* white space */
optarg = nargv[optind];
place = EMSG;
++optind;
}
return (optopt); /* dump back option letter */
}
#endif
/*!
* \brief Display interface to use
*/
void display_usage(void)
{
printf("Usage: pinghr destination\n");
printf("\t-h --help - print help\n");
printf("\t-s - packetsize\n");
printf("\t-f - fragmentation off\n");
}
int main(int argc, char *argv[])
{
// setbuf(stdout, NULL); // TODO: remove, need only for debug on cross gdb
printf("Ping device:\n");
if (argc < 2) {
display_usage();
return -1;
}
const char *short_options = {"hs:f"}; // x: - mean x have parametr
std::string addr;
uint32_t packetsize = 0;
bool fragmentation = false;
int opt;
do {
opt = getopt(argc, argv, short_options);
switch (opt) {
case 'h': {
display_usage();
return 0;
} break;
case 's': {
if (optarg) {
sscanf(optarg, "%u", &packetsize);
printf("\t packetsize %u\n", packetsize);
}
} break;
case 'f': {
printf("\t fragmentation off by default (TODO)\n");
} break;
default: {
printf("\t ping '%s'\n", argv[optind]);
addr.assign(argv[optind]);
} break;
}
} while (opt != -1);
if (addr.empty()) return -2;
dev_ping p;
dev_ping::result_t ping_result;
if (packetsize) p.setSize(packetsize);
bool ok = p.check(addr, &ping_result);
printf("Ping: %s\n", ok ? "ok" : "fail");
printf("%s", ping_result.status.c_str());
return 0;
}