Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
F
ffbs-gluon
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
darkbit
ffbs-gluon
Commits
7dec8ebf
Unverified
Commit
7dec8ebf
authored
5 years ago
by
Matthias Schiffer
Browse files
Options
Downloads
Patches
Plain Diff
gluon-neighbour-info: fix mixed tab/space indentation
parent
fc5f9360
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
package/gluon-neighbour-info/src/gluon-neighbour-info.c
+199
-199
199 additions, 199 deletions
package/gluon-neighbour-info/src/gluon-neighbour-info.c
with
199 additions
and
199 deletions
package/gluon-neighbour-info/src/gluon-neighbour-info.c
+
199
−
199
View file @
7dec8ebf
/*
/*
Copyright (c) 2014, Nils Schneider <nils@nilsschneider.net>
Copyright (c) 2014, Nils Schneider <nils@nilsschneider.net>
All rights reserved.
All rights reserved.
Redistribution and use in source and binary forms, with or without
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
#include
<stdbool.h>
#include
<stdbool.h>
#include
<stdio.h>
#include
<stdio.h>
...
@@ -36,200 +36,200 @@
...
@@ -36,200 +36,200 @@
#include
<time.h>
#include
<time.h>
void
usage
()
{
void
usage
()
{
puts
(
"Usage: gluon-neighbour-info [-h] [-s] [-l] [-c <count>] [-t <sec>] -d <dest> -p <port> -i <if0> -r <request>"
);
puts
(
"Usage: gluon-neighbour-info [-h] [-s] [-l] [-c <count>] [-t <sec>] -d <dest> -p <port> -i <if0> -r <request>"
);
puts
(
" -p <int> UDP port"
);
puts
(
" -p <int> UDP port"
);
puts
(
" -d <ip6> destination address (unicast ip6 or multicast group, e.g. ff02:0:0:0:0:0:2:1001)"
);
puts
(
" -d <ip6> destination address (unicast ip6 or multicast group, e.g. ff02:0:0:0:0:0:2:1001)"
);
puts
(
" -i <string> interface, e.g. eth0 "
);
puts
(
" -i <string> interface, e.g. eth0 "
);
puts
(
" -r <string> request, e.g. nodeinfo"
);
puts
(
" -r <string> request, e.g. nodeinfo"
);
puts
(
" -t <sec> timeout in seconds (default: 3)"
);
puts
(
" -t <sec> timeout in seconds (default: 3)"
);
puts
(
" -s <event> output as server-sent events of type <event>"
);
puts
(
" -s <event> output as server-sent events of type <event>"
);
puts
(
" or without type if <event> is the empty string"
);
puts
(
" or without type if <event> is the empty string"
);
puts
(
" -c <count> only wait for at most <count> replies"
);
puts
(
" -c <count> only wait for at most <count> replies"
);
puts
(
" -l after timeout (or <count> replies if -c is given),"
);
puts
(
" -l after timeout (or <count> replies if -c is given),"
);
puts
(
" send another request and loop forever"
);
puts
(
" send another request and loop forever"
);
puts
(
" -h this help
\n
"
);
puts
(
" -h this help
\n
"
);
}
}
void
getclock
(
struct
timeval
*
tv
)
{
void
getclock
(
struct
timeval
*
tv
)
{
struct
timespec
ts
;
struct
timespec
ts
;
clock_gettime
(
CLOCK_MONOTONIC
,
&
ts
);
clock_gettime
(
CLOCK_MONOTONIC
,
&
ts
);
tv
->
tv_sec
=
ts
.
tv_sec
;
tv
->
tv_sec
=
ts
.
tv_sec
;
tv
->
tv_usec
=
ts
.
tv_nsec
/
1000
;
tv
->
tv_usec
=
ts
.
tv_nsec
/
1000
;
}
}
/* Assumes a and b are normalized */
/* Assumes a and b are normalized */
void
tv_subtract
(
struct
timeval
*
r
,
const
struct
timeval
*
a
,
const
struct
timeval
*
b
)
{
void
tv_subtract
(
struct
timeval
*
r
,
const
struct
timeval
*
a
,
const
struct
timeval
*
b
)
{
r
->
tv_usec
=
a
->
tv_usec
-
b
->
tv_usec
;
r
->
tv_usec
=
a
->
tv_usec
-
b
->
tv_usec
;
r
->
tv_sec
=
a
->
tv_sec
-
b
->
tv_sec
;
r
->
tv_sec
=
a
->
tv_sec
-
b
->
tv_sec
;
if
(
r
->
tv_usec
<
0
)
{
if
(
r
->
tv_usec
<
0
)
{
r
->
tv_usec
+=
1000000
;
r
->
tv_usec
+=
1000000
;
r
->
tv_sec
-=
1
;
r
->
tv_sec
-=
1
;
}
}
}
}
ssize_t
recvtimeout
(
int
socket
,
void
*
buffer
,
size_t
length
,
int
flags
,
const
struct
timeval
*
timeout
)
{
ssize_t
recvtimeout
(
int
socket
,
void
*
buffer
,
size_t
length
,
int
flags
,
const
struct
timeval
*
timeout
)
{
struct
timeval
now
,
timeout_left
;
struct
timeval
now
,
timeout_left
;
getclock
(
&
now
);
getclock
(
&
now
);
tv_subtract
(
&
timeout_left
,
timeout
,
&
now
);
tv_subtract
(
&
timeout_left
,
timeout
,
&
now
);
if
(
timeout_left
.
tv_sec
<
0
)
if
(
timeout_left
.
tv_sec
<
0
)
return
-
1
;
return
-
1
;
setsockopt
(
socket
,
SOL_SOCKET
,
SO_RCVTIMEO
,
&
timeout_left
,
sizeof
(
timeout_left
));
setsockopt
(
socket
,
SOL_SOCKET
,
SO_RCVTIMEO
,
&
timeout_left
,
sizeof
(
timeout_left
));
return
recv
(
socket
,
buffer
,
length
,
flags
);
return
recv
(
socket
,
buffer
,
length
,
flags
);
}
}
int
request
(
const
int
sock
,
const
struct
sockaddr_in6
*
client_addr
,
const
char
*
request
,
const
char
*
sse
,
double
timeout
,
unsigned
int
max_count
)
{
int
request
(
const
int
sock
,
const
struct
sockaddr_in6
*
client_addr
,
const
char
*
request
,
const
char
*
sse
,
double
timeout
,
unsigned
int
max_count
)
{
ssize_t
ret
;
ssize_t
ret
;
char
buffer
[
8192
];
char
buffer
[
8192
];
unsigned
int
count
=
0
;
unsigned
int
count
=
0
;
ret
=
sendto
(
sock
,
request
,
strlen
(
request
),
0
,
(
struct
sockaddr
*
)
client_addr
,
sizeof
(
struct
sockaddr_in6
));
ret
=
sendto
(
sock
,
request
,
strlen
(
request
),
0
,
(
struct
sockaddr
*
)
client_addr
,
sizeof
(
struct
sockaddr_in6
));
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
perror
(
"Error in sendto()"
);
perror
(
"Error in sendto()"
);
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
struct
timeval
tv_timeout
;
struct
timeval
tv_timeout
;
getclock
(
&
tv_timeout
);
getclock
(
&
tv_timeout
);
tv_timeout
.
tv_sec
+=
(
int
)
timeout
;
tv_timeout
.
tv_sec
+=
(
int
)
timeout
;
tv_timeout
.
tv_usec
+=
((
int
)
(
timeout
*
1000000
))
%
1000000
;
tv_timeout
.
tv_usec
+=
((
int
)
(
timeout
*
1000000
))
%
1000000
;
if
(
tv_timeout
.
tv_usec
>=
1000000
)
{
if
(
tv_timeout
.
tv_usec
>=
1000000
)
{
tv_timeout
.
tv_usec
-=
1000000
;
tv_timeout
.
tv_usec
-=
1000000
;
tv_timeout
.
tv_sec
+=
1
;
tv_timeout
.
tv_sec
+=
1
;
}
}
do
{
do
{
ret
=
recvtimeout
(
sock
,
buffer
,
sizeof
(
buffer
),
0
,
&
tv_timeout
);
ret
=
recvtimeout
(
sock
,
buffer
,
sizeof
(
buffer
),
0
,
&
tv_timeout
);
if
(
ret
<
0
)
if
(
ret
<
0
)
break
;
break
;
if
(
sse
)
{
if
(
sse
)
{
if
(
sse
[
0
]
!=
'\0'
)
if
(
sse
[
0
]
!=
'\0'
)
fprintf
(
stdout
,
"event: %s
\n
"
,
sse
);
fprintf
(
stdout
,
"event: %s
\n
"
,
sse
);
fputs
(
"data: "
,
stdout
);
fputs
(
"data: "
,
stdout
);
}
}
fwrite
(
buffer
,
sizeof
(
char
),
ret
,
stdout
);
fwrite
(
buffer
,
sizeof
(
char
),
ret
,
stdout
);
if
(
sse
)
if
(
sse
)
fputs
(
"
\n\n
"
,
stdout
);
fputs
(
"
\n\n
"
,
stdout
);
else
else
fputs
(
"
\n
"
,
stdout
);
fputs
(
"
\n
"
,
stdout
);
fflush
(
stdout
);
fflush
(
stdout
);
count
++
;
count
++
;
}
while
(
max_count
==
0
||
count
<
max_count
);
}
while
(
max_count
==
0
||
count
<
max_count
);
if
((
max_count
==
0
&&
count
==
0
)
||
count
<
max_count
)
if
((
max_count
==
0
&&
count
==
0
)
||
count
<
max_count
)
return
EXIT_FAILURE
;
return
EXIT_FAILURE
;
else
else
return
EXIT_SUCCESS
;
return
EXIT_SUCCESS
;
}
}
int
main
(
int
argc
,
char
**
argv
)
{
int
main
(
int
argc
,
char
**
argv
)
{
int
sock
;
int
sock
;
struct
sockaddr_in6
client_addr
=
{};
struct
sockaddr_in6
client_addr
=
{};
char
*
request_string
=
NULL
;
char
*
request_string
=
NULL
;
sock
=
socket
(
PF_INET6
,
SOCK_DGRAM
,
0
);
sock
=
socket
(
PF_INET6
,
SOCK_DGRAM
,
0
);
if
(
sock
<
0
)
{
if
(
sock
<
0
)
{
perror
(
"creating socket"
);
perror
(
"creating socket"
);
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
client_addr
.
sin6_family
=
AF_INET6
;
client_addr
.
sin6_family
=
AF_INET6
;
opterr
=
0
;
opterr
=
0
;
int
max_count
=
0
;
int
max_count
=
0
;
double
timeout
=
3
.
0
;
double
timeout
=
3
.
0
;
char
*
sse
=
NULL
;
char
*
sse
=
NULL
;
bool
loop
=
false
;
bool
loop
=
false
;
int
ret
=
false
;
int
ret
=
false
;
int
c
;
int
c
;
while
((
c
=
getopt
(
argc
,
argv
,
"p:d:r:i:t:s:c:lh"
))
!=
-
1
)
while
((
c
=
getopt
(
argc
,
argv
,
"p:d:r:i:t:s:c:lh"
))
!=
-
1
)
switch
(
c
)
{
switch
(
c
)
{
case
'p'
:
case
'p'
:
client_addr
.
sin6_port
=
htons
(
atoi
(
optarg
));
client_addr
.
sin6_port
=
htons
(
atoi
(
optarg
));
break
;
break
;
case
'd'
:
case
'd'
:
if
(
!
inet_pton
(
AF_INET6
,
optarg
,
&
client_addr
.
sin6_addr
))
{
if
(
!
inet_pton
(
AF_INET6
,
optarg
,
&
client_addr
.
sin6_addr
))
{
fprintf
(
stderr
,
"Invalid destination address
\n
"
);
fprintf
(
stderr
,
"Invalid destination address
\n
"
);
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
break
;
break
;
case
'i'
:
case
'i'
:
client_addr
.
sin6_scope_id
=
if_nametoindex
(
optarg
);
client_addr
.
sin6_scope_id
=
if_nametoindex
(
optarg
);
if
(
client_addr
.
sin6_scope_id
==
0
)
{
if
(
client_addr
.
sin6_scope_id
==
0
)
{
perror
(
"Can not use interface"
);
perror
(
"Can not use interface"
);
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
break
;
break
;
case
'r'
:
case
'r'
:
request_string
=
optarg
;
request_string
=
optarg
;
break
;
break
;
case
't'
:
case
't'
:
timeout
=
atof
(
optarg
);
timeout
=
atof
(
optarg
);
if
(
timeout
<
0
)
{
if
(
timeout
<
0
)
{
perror
(
"Negative timeout not supported"
);
perror
(
"Negative timeout not supported"
);
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
break
;
break
;
case
's'
:
case
's'
:
sse
=
optarg
;
sse
=
optarg
;
break
;
break
;
case
'l'
:
case
'l'
:
loop
=
true
;
loop
=
true
;
break
;
break
;
case
'c'
:
case
'c'
:
max_count
=
atoi
(
optarg
);
max_count
=
atoi
(
optarg
);
if
(
max_count
<
0
)
{
if
(
max_count
<
0
)
{
perror
(
"Negative count not supported"
);
perror
(
"Negative count not supported"
);
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
break
;
break
;
case
'h'
:
case
'h'
:
usage
();
usage
();
exit
(
EXIT_SUCCESS
);
exit
(
EXIT_SUCCESS
);
break
;
break
;
default:
default:
fprintf
(
stderr
,
"Invalid parameter %c ignored.
\n
"
,
c
);
fprintf
(
stderr
,
"Invalid parameter %c ignored.
\n
"
,
c
);
}
}
if
(
request_string
==
NULL
)
{
if
(
request_string
==
NULL
)
{
fprintf
(
stderr
,
"No request string supplied
\n
"
);
fprintf
(
stderr
,
"No request string supplied
\n
"
);
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
if
(
client_addr
.
sin6_port
==
htons
(
0
))
{
if
(
client_addr
.
sin6_port
==
htons
(
0
))
{
fprintf
(
stderr
,
"No port supplied
\n
"
);
fprintf
(
stderr
,
"No port supplied
\n
"
);
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
if
(
IN6_IS_ADDR_UNSPECIFIED
(
&
client_addr
.
sin6_addr
))
{
if
(
IN6_IS_ADDR_UNSPECIFIED
(
&
client_addr
.
sin6_addr
))
{
fprintf
(
stderr
,
"No destination address supplied
\n
"
);
fprintf
(
stderr
,
"No destination address supplied
\n
"
);
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
if
(
sse
)
{
if
(
sse
)
{
fputs
(
"Content-Type: text/event-stream
\n\n
"
,
stdout
);
fputs
(
"Content-Type: text/event-stream
\n\n
"
,
stdout
);
fflush
(
stdout
);
fflush
(
stdout
);
}
}
do
{
do
{
ret
=
request
(
sock
,
&
client_addr
,
request_string
,
sse
,
timeout
,
max_count
);
ret
=
request
(
sock
,
&
client_addr
,
request_string
,
sse
,
timeout
,
max_count
);
}
while
(
loop
);
}
while
(
loop
);
if
(
sse
)
if
(
sse
)
fputs
(
"event: eot
\n
data: null
\n\n
"
,
stdout
);
fputs
(
"event: eot
\n
data: null
\n\n
"
,
stdout
);
return
ret
;
return
ret
;
}
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment