Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
R3ABM Artem
DigestPlay
Commits
34084f17
Commit
34084f17
authored
May 23, 2017
by
Artem Prilutskiy
Browse files
..
parent
76c1d8bf
Changes
3
Hide whitespace changes
Inline
Side-by-side
DigestPlay.c
View file @
34084f17
...
...
@@ -28,25 +28,6 @@
#define CLIENT_NAME "DigestPlay " STRING(VERSION) " " BUILD
typedef
uint8_t
Integer24
[
3
];
struct
FullLC
{
uint8_t
code
;
uint8_t
feature
;
uint8_t
options
;
Integer24
destination
;
Integer24
source
;
Integer24
sum
;
};
void
EncodeInteger24
(
uint32_t
value
,
Integer24
data
)
{
data
[
0
]
=
(
value
>>
16
)
&
0xff
;
data
[
1
]
=
(
value
>>
8
)
&
0xff
;
data
[
2
]
=
value
&
0xff
;
}
int
main
(
int
argc
,
char
*
argv
[])
{
printf
(
"
\n
"
);
...
...
@@ -62,8 +43,8 @@ int main(int argc, char* argv[])
const
char
*
location
=
NULL
;
const
char
*
password
=
NULL
;
struct
FullLC
header
;
memset
(
&
header
,
0
,
sizeof
(
struct
FullLC
));
struct
RewindSuperHeader
header
;
memset
(
&
header
,
0
,
sizeof
(
struct
RewindSuperHeader
));
// Start up
...
...
@@ -108,7 +89,7 @@ int main(int argc, char* argv[])
value
=
strtol
(
optarg
,
NULL
,
10
);
if
(
value
>
0
)
{
EncodeInteger24
(
value
,
header
.
sourc
e
);
header
.
sourceID
=
htole32
(
valu
e
);
control
|=
0
b01000
;
}
break
;
...
...
@@ -117,7 +98,7 @@ int main(int argc, char* argv[])
value
=
strtol
(
optarg
,
NULL
,
10
);
if
(
value
>
0
)
{
EncodeInteger24
(
value
,
header
.
destination
);
header
.
destination
ID
=
htole32
(
value
);
control
|=
0
b10000
;
}
break
;
...
...
@@ -141,7 +122,7 @@ int main(int argc, char* argv[])
// Create Rewind client context
struct
RewindContext
*
context
=
CreateRewindC
lien
t
(
number
,
CLIENT_NAME
);
struct
RewindContext
*
context
=
CreateRewindC
ontex
t
(
number
,
CLIENT_NAME
);
if
(
context
==
NULL
)
{
...
...
@@ -158,7 +139,7 @@ int main(int argc, char* argv[])
(
memcmp
(
buffer
,
DSD_MAGIC_TEXT
,
length
)
!=
0
))
{
printf
(
"Error checking input data format
\n
"
);
ReleaseRewindC
lien
t
(
context
);
ReleaseRewindC
ontex
t
(
context
);
return
EXIT_FAILURE
;
}
...
...
@@ -169,7 +150,7 @@ int main(int argc, char* argv[])
if
(
result
<
0
)
{
printf
(
"Cannot connect to the server (%i)
\n
"
,
result
);
ReleaseRewindC
lien
t
(
context
);
ReleaseRewindC
ontex
t
(
context
);
return
EXIT_FAILURE
;
}
...
...
@@ -190,9 +171,10 @@ int main(int argc, char* argv[])
printf
(
"Playing...
\n
"
);
TransmitRewindData
(
context
,
REWIND_TYPE_DMR_DATA_BASE
+
1
,
REWIND_FLAG_REAL_TIME_1
,
&
header
,
sizeof
(
struct
FullLC
));
TransmitRewindData
(
context
,
REWIND_TYPE_DMR_DATA_BASE
+
1
,
REWIND_FLAG_REAL_TIME_1
,
&
header
,
sizeof
(
struct
FullLC
));
TransmitRewindData
(
context
,
REWIND_TYPE_DMR_DATA_BASE
+
1
,
REWIND_FLAG_REAL_TIME_1
,
&
header
,
sizeof
(
struct
FullLC
));
header
.
type
=
htole32
(
SESSION_TYPE_GROUP_VOICE
);
TransmitRewindData
(
context
,
REWIND_TYPE_SUPER_HEADER
,
REWIND_FLAG_REAL_TIME_1
,
&
header
,
sizeof
(
struct
RewindSuperHeader
));
TransmitRewindData
(
context
,
REWIND_TYPE_SUPER_HEADER
,
REWIND_FLAG_REAL_TIME_1
,
&
header
,
sizeof
(
struct
RewindSuperHeader
));
TransmitRewindData
(
context
,
REWIND_TYPE_SUPER_HEADER
,
REWIND_FLAG_REAL_TIME_1
,
&
header
,
sizeof
(
struct
RewindSuperHeader
));
// Main loop
...
...
@@ -234,7 +216,7 @@ int main(int argc, char* argv[])
printf
(
"Done
\n
"
);
TransmitRewindCloae
(
context
);
ReleaseRewindC
lien
t
(
context
);
ReleaseRewindC
ontex
t
(
context
);
return
EXIT_SUCCESS
;
};
RewindClient.c
View file @
34084f17
...
...
@@ -3,6 +3,8 @@
#include <unistd.h>
#include <string.h>
#include <endian.h>
#include <errno.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
...
...
@@ -27,7 +29,10 @@
#endif
#define BUFFER_SIZE 256
#define ATTEMPT_COUNT 5
#define CONNECTION_ATTEMPT_COUNT 5
#define CONNECTION_RECEIVE_TIMEOUT 2
#define CONNECTION_CONNECT_TIMEOUT 5
static
int
CompareAddresses
(
struct
sockaddr
*
value1
,
struct
sockaddr_in6
*
value2
)
{
...
...
@@ -53,7 +58,7 @@ static int CompareAddresses(struct sockaddr* value1, struct sockaddr_in6* value2
return
-
1
;
}
struct
RewindContext
*
CreateRewindC
lien
t
(
uint32_t
number
,
const
char
*
verion
)
struct
RewindContext
*
CreateRewindC
ontex
t
(
uint32_t
number
,
const
char
*
verion
)
{
struct
utsname
name
;
struct
timeval
interval
;
...
...
@@ -103,7 +108,7 @@ struct RewindContext* CreateRewindClient(uint32_t number, const char* verion)
return
context
;
}
void
ReleaseRewindC
lien
t
(
struct
RewindContext
*
context
)
void
ReleaseRewindC
ontex
t
(
struct
RewindContext
*
context
)
{
if
(
context
!=
NULL
)
{
...
...
@@ -179,7 +184,9 @@ int ConnectRewindClient(struct RewindContext* context, const char* location, con
struct
RewindData
*
buffer
=
(
struct
RewindData
*
)
alloca
(
BUFFER_SIZE
);
ssize_t
length
;
size_t
attempt
=
ATTEMPT_COUNT
;
size_t
attempt
=
CONNECTION_ATTEMPT_COUNT
;
time_t
threshold
=
time
(
NULL
)
+
CONNECTION_CONNECT_TIMEOUT
;
uint8_t
*
digest
=
(
uint8_t
*
)
alloca
(
SHA256_DIGEST_LENGTH
);
struct
RewindConfigurationData
data
;
...
...
@@ -194,8 +201,14 @@ int ConnectRewindClient(struct RewindContext* context, const char* location, con
memset
(
&
hints
,
0
,
sizeof
(
hints
));
hints
.
ai_socktype
=
SOCK_DGRAM
;
#ifdef __linux__
hints
.
ai_flags
=
AI_ADDRCONFIG
;
hints
.
ai_family
=
AF_UNSPEC
;
#endif
#ifdef __MACH__
hints
.
ai_flags
=
AI_V4MAPPED
;
hints
.
ai_family
=
AF_INET6
;
#endif
if
(
getaddrinfo
(
location
,
port
,
&
hints
,
&
context
->
address
)
!=
0
)
{
...
...
@@ -205,16 +218,19 @@ int ConnectRewindClient(struct RewindContext* context, const char* location, con
// Do login procedure
while
(
attempt
>
0
)
while
(
(
attempt
>
0
)
&&
(
threshold
>
time
(
NULL
)))
{
TransmitRewindData
(
context
,
REWIND_TYPE_KEEP_ALIVE
,
REWIND_FLAG_NONE
,
context
->
data
,
context
->
length
);
length
=
ReceiveRewindData
(
context
,
buffer
,
BUFFER_SIZE
);
if
(
length
<
CLIENT_ERROR_SOCKET_IO
)
{
// Possible we got socket timeout
if
((
length
==
CLIENT_ERROR_WRONG_ADDRESS
)
||
(
length
==
CLIENT_ERROR_SOCKET_IO
)
&&
((
errno
==
EWOULDBLOCK
)
||
(
errno
==
EAGAIN
)))
continue
;
if
(
length
<
0
)
return
length
;
}
switch
(
buffer
->
type
)
{
...
...
RewindClient.h
View file @
34084f17
...
...
@@ -15,6 +15,9 @@ extern "C"
{
#endif
#define SESSION_TYPE_PRIVATE_VOICE 5
#define SESSION_TYPE_GROUP_VOICE 7
#define CLIENT_ERROR_SUCCESS 0
#define CLIENT_ERROR_SOCKET_IO -1
#define CLIENT_ERROR_WRONG_ADDRESS -2
...
...
@@ -33,8 +36,8 @@ struct RewindContext
size_t
length
;
};
struct
RewindContext
*
CreateRewindC
lien
t
(
uint32_t
number
,
const
char
*
verion
);
void
ReleaseRewindC
lien
t
(
struct
RewindContext
*
context
);
struct
RewindContext
*
CreateRewindC
ontex
t
(
uint32_t
number
,
const
char
*
verion
);
void
ReleaseRewindC
ontex
t
(
struct
RewindContext
*
context
);
void
TransmitRewindData
(
struct
RewindContext
*
context
,
uint16_t
type
,
uint16_t
flag
,
void
*
data
,
size_t
length
);
ssize_t
ReceiveRewindData
(
struct
RewindContext
*
context
,
struct
RewindData
*
buffer
,
ssize_t
length
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment