Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
aa935693
Commit
aa935693
authored
Jul 17, 2003
by
Sam Hocevar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* src/stream_output/announce.c:
+ Coding style fixes. + Use memcpy() instead of for() loops.
parent
8c7b5a88
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
139 additions
and
146 deletions
+139
-146
include/announce.h
include/announce.h
+3
-3
src/stream_output/announce.c
src/stream_output/announce.c
+136
-143
No files found.
include/announce.h
View file @
aa935693
...
...
@@ -2,7 +2,7 @@
* announce.h : Session announcement
*****************************************************************************
* Copyright (C) 2002 VideoLAN
* $Id: announce.h,v 1.
6 2003/07/05 15:00:28 zorglub
Exp $
* $Id: announce.h,v 1.
7 2003/07/17 14:10:08 sam
Exp $
*
* Authors: Clment Stenac <zorglub@via.ecp.fr>
*
...
...
@@ -51,8 +51,8 @@ struct sap_session_t
char
psz_name
[
1024
];
char
psz_port
[
8
];
module_t
p_network
;
unsigned
int
socket
;
unsigned
int
sendnow
;
unsigned
int
i_
socket
;
unsigned
int
i_calls
;
int
i_ip_version
;
};
...
...
src/stream_output/announce.c
View file @
aa935693
...
...
@@ -58,9 +58,9 @@ static char * split( char *psz_in, char *psz_out1, char *psz_out2, char delim)
{
unsigned
int
i_count
=
0
;
/*pos in input string*/
unsigned
int
i_pos1
=
0
;
/*pos in out2 string */
unsigned
int
i_pos2
=
0
;
unsigned
int
i_pos2
=
0
;
char
*
psz_cur
;
/*store the pos of the first delim found */
/*skip spaces at the beginning*/
while
(
psz_in
[
i_count
]
==
' '
&&
i_count
<
strlen
(
psz_in
))
{
...
...
@@ -68,7 +68,7 @@ static char * split( char *psz_in, char *psz_out1, char *psz_out2, char delim)
}
if
(
i_count
==
strlen
(
psz_in
))
return
NULL
;
/*Look for delim*/
while
(
psz_in
[
i_count
]
!=
delim
&&
i_count
<
strlen
(
psz_in
))
{
...
...
@@ -78,26 +78,26 @@ static char * split( char *psz_in, char *psz_out1, char *psz_out2, char delim)
}
/* Mark the end of out1 */
psz_out1
[
i_pos1
]
=
0
;
if
(
i_count
==
strlen
(
psz_in
))
return
NULL
;
/*store pos of the first delim*/
psz_cur
=
&
psz_in
[
i_count
];
/*skip all delim and all spaces*/
while
(
(
psz_in
[
i_count
]
==
' '
||
psz_in
[
i_count
]
==
delim
)
while
(
(
psz_in
[
i_count
]
==
' '
||
psz_in
[
i_count
]
==
delim
)
&&
i_count
<
strlen
(
psz_in
))
{
i_count
++
;
}
if
(
i_count
==
strlen
(
psz_in
))
return
psz_cur
;
/*Store the second string*/
while
(
i_count
<
strlen
(
psz_in
))
{
...
...
@@ -106,14 +106,14 @@ static char * split( char *psz_in, char *psz_out1, char *psz_out2, char delim)
i_count
++
;
}
psz_out2
[
i_pos2
]
=
0
;
return
psz_cur
;
}
/*****************************************************************************
* sout_SAPNew: Creates a SAP Session
*****************************************************************************/
sap_session_t
*
sout_SAPNew
(
sout_instance_t
*
p_sout
,
sap_session_t
*
sout_SAPNew
(
sout_instance_t
*
p_sout
,
char
*
psz_url_arg
,
char
*
psz_name_arg
,
int
ip_version
,
char
*
psz_v6_scope
)
...
...
@@ -125,72 +125,72 @@ sap_session_t * sout_SAPNew ( sout_instance_t *p_sout ,
char
*
sap_ipv6_addr
=
NULL
;
/* IPv6 built address */
char
*
psz_eol
;
/* Used to parse IPv6 URIs */
int
i_port
;
/* Port in numerical format */
/* Allocate the SAP structure */
p_new
=
(
sap_session_t
*
)
malloc
(
sizeof
(
sap_session_t
)
)
;
p_new
=
(
sap_session_t
*
)
malloc
(
sizeof
(
sap_session_t
)
)
;
if
(
!
p_new
)
{
msg_Err
(
p_sout
,
"
No memory left
"
);
msg_Err
(
p_sout
,
"
out of memory
"
);
return
NULL
;
}
/* Fill the information in the structure */
if
(
strstr
(
psz_url_arg
,
"["
)
)
if
(
strstr
(
psz_url_arg
,
"["
)
)
{
/* We have an IPv6 address. Do not use ':' as the port separator */
psz_eol
=
strchr
(
psz_url_arg
,
']'
);
if
(
!
psz_eol
)
/* No matching ] ! Aborting */
{
msg_Warn
(
p_sout
,
"No matching ]. U
nable to parse URI"
);
msg_Warn
(
p_sout
,
"no matching ], u
nable to parse URI"
);
return
NULL
;
}
if
(
!
psz_eol
++
)
if
(
!
psz_eol
++
)
{
sprintf
(
p_new
->
psz_url
,
"%s"
,
psz_url_arg
);
sprintf
(
p_new
->
psz_port
,
"%s"
,
DEFAULT_PORT
);
sprintf
(
p_new
->
psz_url
,
"%s"
,
psz_url_arg
);
sprintf
(
p_new
->
psz_port
,
"%s"
,
DEFAULT_PORT
);
}
else
{
*
psz_eol
=
'\0'
;
sprintf
(
p_new
->
psz_url
,
"%s"
,
psz_url_arg
);
sprintf
(
p_new
->
psz_url
,
"%s"
,
psz_url_arg
);
psz_eol
++
;
if
(
psz_eol
)
if
(
psz_eol
)
{
sprintf
(
p_new
->
psz_port
,
"%s"
,
psz_eol
);
sprintf
(
p_new
->
psz_port
,
"%s"
,
psz_eol
);
}
}
}
}
else
{
split
(
psz_url_arg
,
p_new
->
psz_url
,
p_new
->
psz_port
,
':'
);
split
(
psz_url_arg
,
p_new
->
psz_url
,
p_new
->
psz_port
,
':'
);
}
/* Check if we have a port */
if
(
!
strlen
(
p_new
->
psz_port
)
)
if
(
!
strlen
(
p_new
->
psz_port
)
)
{
sprintf
(
p_new
->
psz_port
,
"%s"
,
DEFAULT_PORT
);
sprintf
(
p_new
->
psz_port
,
"%s"
,
DEFAULT_PORT
);
}
/* Make sure our port is valid and atoi it*/
i_port
=
atoi
(
p_new
->
psz_port
);
if
(
!
i_port
)
{
sprintf
(
p_new
->
psz_port
,
"%s"
,
DEFAULT_PORT
);
sprintf
(
p_new
->
psz_port
,
"%s"
,
DEFAULT_PORT
);
}
else
{
sprintf
(
p_new
->
psz_port
,
"%i"
,
i_port
);
sprintf
(
p_new
->
psz_port
,
"%i"
,
i_port
);
}
/* The name that we send */
sprintf
(
p_new
->
psz_name
,
"%s"
,
psz_name_arg
);
/* The name that we send */
sprintf
(
p_new
->
psz_name
,
"%s"
,
psz_name_arg
);
p_new
->
i_ip_version
=
ip_version
;
/* Only "6" triggers IPv6. IPv4 is default */
if
(
ip_version
!=
6
)
{
msg_Dbg
(
p_sout
,
"C
reating IPv4 SAP socket"
);
msg_Dbg
(
p_sout
,
"c
reating IPv4 SAP socket"
);
/* Fill the socket descriptor */
socket_desc
.
i_type
=
NETWORK_UDP
;
...
...
@@ -202,7 +202,7 @@ sap_session_t * sout_SAPNew ( sout_instance_t *p_sout ,
/* Call the network module */
sprintf
(
psz_network
,
"ipv4"
);
p_sout
->
p_private
=
(
void
*
)
&
socket_desc
;
p_sout
->
p_private
=
(
void
*
)
&
socket_desc
;
if
(
!
(
p_network
=
module_Need
(
p_sout
,
"network"
,
psz_network
)
)
)
{
msg_Warn
(
p_sout
,
"failed to open a connection (udp)"
);
...
...
@@ -210,42 +210,40 @@ sap_session_t * sout_SAPNew ( sout_instance_t *p_sout ,
}
module_Unneed
(
p_sout
,
p_network
);
p_new
->
socket
=
socket_desc
.
i_handle
;
if
(
p_new
->
socket
<=
0
)
p_new
->
i_socket
=
socket_desc
.
i_handle
;
if
(
p_new
->
i_socket
<
0
)
{
msg_Warn
(
p_sout
,
"
U
nable to initialize SAP"
);
msg_Warn
(
p_sout
,
"
u
nable to initialize SAP"
);
return
NULL
;
}
}
else
{
msg_Dbg
(
p_sout
,
"Creating IPv6 SAP socket with scope %s"
,
psz_v6_scope
);
msg_Dbg
(
p_sout
,
"creating IPv6 SAP socket with scope %s"
,
psz_v6_scope
);
/* Initialize and build the IPv6 address to broadcast to */
sap_ipv6_addr
=
(
char
*
)
malloc
(
28
*
sizeof
(
char
)
);
sap_ipv6_addr
=
(
char
*
)
malloc
(
28
*
sizeof
(
char
)
);
if
(
!
sap_ipv6_addr
)
{
msg_Err
(
p_sout
,
"
No memory left
"
);
msg_Err
(
p_sout
,
"
out of memory
"
);
return
NULL
;
}
sprintf
(
sap_ipv6_addr
,
"%s%c%s"
,
SAP_IPV6_ADDR_1
,
psz_v6_scope
[
0
],
SAP_IPV6_ADDR_2
);
sprintf
(
sap_ipv6_addr
,
"%s%c%s"
,
SAP_IPV6_ADDR_1
,
psz_v6_scope
[
0
],
SAP_IPV6_ADDR_2
);
/* Fill the socket descriptor */
socket_desc
.
i_type
=
NETWORK_UDP
;
socket_desc
.
psz_bind_addr
=
""
;
socket_desc
.
i_bind_port
=
0
;
socket_desc
.
i_type
=
NETWORK_UDP
;
socket_desc
.
psz_bind_addr
=
""
;
socket_desc
.
i_bind_port
=
0
;
socket_desc
.
psz_server_addr
=
sap_ipv6_addr
;
socket_desc
.
i_server_port
=
SAP_PORT
;
socket_desc
.
i_handle
=
0
;
socket_desc
.
i_server_port
=
SAP_PORT
;
socket_desc
.
i_handle
=
0
;
sprintf
(
psz_network
,
"ipv6"
);
/* Call the network module */
p_sout
->
p_private
=
(
void
*
)
&
socket_desc
;
p_sout
->
p_private
=
(
void
*
)
&
socket_desc
;
if
(
!
(
p_network
=
module_Need
(
p_sout
,
"network"
,
psz_network
)
)
)
{
msg_Warn
(
p_sout
,
"failed to open a connection (udp)"
);
...
...
@@ -253,19 +251,21 @@ sap_session_t * sout_SAPNew ( sout_instance_t *p_sout ,
}
module_Unneed
(
p_sout
,
p_network
);
p_new
->
socket
=
socket_desc
.
i_handle
;
if
(
p_new
->
socket
<=
0
)
p_new
->
i_socket
=
socket_desc
.
i_handle
;
if
(
p_new
->
i_socket
<=
0
)
{
msg_Warn
(
p_sout
,
"
U
nable to initialize SAP"
);
msg_Warn
(
p_sout
,
"
u
nable to initialize SAP"
);
return
NULL
;
}
/* Free what we allocated */
if
(
sap_ipv6_addr
)
free
(
sap_ipv6_addr
);
if
(
sap_ipv6_addr
)
{
free
(
sap_ipv6_addr
);
}
}
msg_Dbg
(
p_sout
,
"SAP initialization complete"
);
msg_Dbg
(
p_sout
,
"SAP initialization complete"
);
return
(
p_new
);
}
...
...
@@ -273,14 +273,14 @@ sap_session_t * sout_SAPNew ( sout_instance_t *p_sout ,
/*****************************************************************************
* sout_SAPDelete: Deletes a SAP Session
*****************************************************************************/
void
sout_SAPDelete
(
sout_instance_t
*
p_sout
,
sap_session_t
*
p_this
)
void
sout_SAPDelete
(
sout_instance_t
*
p_sout
,
sap_session_t
*
p_this
)
{
if
(
close
(
p_this
->
socket
)
)
if
(
close
(
p_this
->
i_
socket
)
)
{
msg_Err
(
p_sout
,
"Unable to close SAP socket"
);
msg_Err
(
p_sout
,
"unable to close SAP socket"
);
}
if
(
p_this
)
free
(
p_this
);
free
(
p_this
);
}
/*****************************************************************************
...
...
@@ -288,99 +288,92 @@ void sout_SAPDelete( sout_instance_t *p_sout , sap_session_t * p_this )
*****************************************************************************/
void
sout_SAPSend
(
sout_instance_t
*
p_sout
,
sap_session_t
*
p_this
)
{
char
*
sap_head
;
/* SAP header */
char
sap_msg
[
1000
];
/* SDP content */
char
*
sap_send
;
/* What we send */
char
*
payload_type
=
"application/sdp"
;
int
i_send_result
=
0
;
/* Result of send */
int
i
;
char
psz_msg
[
1000
];
/* SDP content */
char
*
psz_head
;
/* SAP header */
char
*
psz_send
;
/* What we send */
char
*
psz_type
=
"application/sdp"
;
int
i_header_size
;
/* SAP header size */
int
i_msg_size
;
/* SDP content size */
int
i_size
;
/* Total size */
int
i_ret
=
0
;
/* We send a packet every 24 calls to the function */
if
(
p_this
->
sendnow
==
24
)
if
(
p_this
->
i_calls
++
<
24
)
{
i_header_size
=
9
+
strlen
(
payload_type
)
;
sap_head
=
(
char
*
)
malloc
(
i_header_size
*
sizeof
(
char
)
);
return
;
}
if
(
!
sap_head
)
{
msg_Warn
(
p_sout
,
"No memory left"
);
return
;
}
i_header_size
=
8
+
strlen
(
psz_type
)
+
1
;
psz_head
=
(
char
*
)
malloc
(
i_header_size
*
sizeof
(
char
)
);
/* Create the SAP headers */
sap_head
[
0
]
=
0x20
;
/* Means IPv4, not encrypted, not compressed */
sap_head
[
1
]
=
0x00
;
/* No authentification */
sap_head
[
2
]
=
0x42
;
/* Version */
sap_head
[
3
]
=
0x12
;
/* Version */
sap_head
[
4
]
=
0x01
;
/* Source IP FIXME: we should get the real address */
sap_head
[
5
]
=
0x02
;
/* idem */
sap_head
[
6
]
=
0x03
;
/* idem */
sap_head
[
7
]
=
0x04
;
/* idem */
strncpy
(
sap_head
+
8
,
payload_type
,
15
);
sap_head
[
i_header_size
-
1
]
=
'\0'
;
/* Create the SDP content */
/* Do not add spaces at beginning of the lines ! */
sprintf
(
sap_msg
,
"v=0
\n
"
"o=VideoLAN 3247692199 3247895918 IN IP4 VideoLAN
\n
"
"s=%s
\n
"
"u=VideoLAN
\n
"
"t=0 0
\n
"
"m=audio %s udp 14
\n
"
"c=IN IP4 %s/15
\n
"
"a=type:test
\n
"
,
p_this
->
psz_name
,
p_this
->
psz_port
,
p_this
->
psz_url
);
i_msg_size
=
strlen
(
sap_msg
);
i_size
=
i_msg_size
+
i_header_size
;
/* Create the message */
sap_send
=
(
char
*
)
malloc
(
i_size
*
sizeof
(
char
)
);
if
(
!
sap_send
)
{
msg_Err
(
p_sout
,
"No memory left"
)
;
return
;
}
if
(
!
psz_head
)
{
msg_Err
(
p_sout
,
"out of memory"
);
return
;
}
for
(
i
=
0
;
i
<
i_header_size
;
i
++
)
{
sap_send
[
i
]
=
sap_head
[
i
];
}
/* Create the SAP headers */
psz_head
[
0
]
=
0x20
;
/* Means IPv4, not encrypted, not compressed */
psz_head
[
1
]
=
0x00
;
/* No authentification */
psz_head
[
2
]
=
0x42
;
/* Version */
psz_head
[
3
]
=
0x12
;
/* Version */
psz_head
[
4
]
=
0x01
;
/* Source IP FIXME: we should get the real address */
psz_head
[
5
]
=
0x02
;
/* idem */
psz_head
[
6
]
=
0x03
;
/* idem */
psz_head
[
7
]
=
0x04
;
/* idem */
strncpy
(
psz_head
+
8
,
psz_type
,
15
);
psz_head
[
i_header_size
-
1
]
=
'\0'
;
/* Create the SDP content */
/* Do not add spaces at beginning of the lines ! */
sprintf
(
psz_msg
,
"v=0
\n
"
"o=VideoLAN 3247692199 3247895918 IN IP4 VideoLAN
\n
"
"s=%s
\n
"
"u=VideoLAN
\n
"
"t=0 0
\n
"
"m=audio %s udp 14
\n
"
"c=IN IP4 %s/15
\n
"
"a=type:test
\n
"
,
p_this
->
psz_name
,
p_this
->
psz_port
,
p_this
->
psz_url
);
i_msg_size
=
strlen
(
psz_msg
);
i_size
=
i_msg_size
+
i_header_size
;
/* Create the message */
psz_send
=
(
char
*
)
malloc
(
i_size
*
sizeof
(
char
)
);
if
(
!
psz_send
)
{
msg_Err
(
p_sout
,
"out of memory"
);
return
;
}
for
(
;
i
<
i_size
;
i
++
)
{
sap_send
[
i
]
=
sap_msg
[
i
-
i_header_size
];
}
memcpy
(
psz_send
,
psz_head
,
i_header_size
);
memcpy
(
psz_send
+
i_header_size
,
psz_msg
,
i_msg_size
);
if
(
i_size
<
1024
)
/* We mustn't send packets larger than 1024B */
if
(
i_size
<
1024
)
/* We mustn't send packets larger than 1024B */
{
if
(
p_this
->
i_ip_version
==
6
)
{
if
(
p_this
->
i_ip_version
==
6
)
{
i_send_result
=
send
(
p_this
->
socket
,
sap_send
,
i_size
,
0
);
}
else
{
i_send_result
=
send
(
p_this
->
socket
,
sap_send
,
i_size
,
0
);
}
i_ret
=
send
(
p_this
->
i_socket
,
psz_send
,
i_size
,
0
);
}
if
(
i_send_result
==
-
1
)
else
{
msg_Warn
(
p_sout
,
"SAP send failed on socket %i"
,
p_this
->
socket
);
perror
(
"sendto"
);
i_ret
=
send
(
p_this
->
i_socket
,
psz_send
,
i_size
,
0
);
}
}
p_this
->
sendnow
=
0
;
/* Free what we allocated */
if
(
sap_send
)
free
(
sap_send
);
if
(
sap_head
)
free
(
sap_head
);
if
(
i_ret
<=
0
)
{
msg_Warn
(
p_sout
,
"SAP send failed on socket %i (%s)"
,
p_this
->
i_socket
,
strerror
(
errno
)
);
}
p_this
->
sendnow
++
;
p_this
->
i_calls
=
0
;
/* Free what we allocated */
free
(
psz_send
);
free
(
psz_head
);
}
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