Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
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-2-2
Commits
da014eb8
Commit
da014eb8
authored
Dec 10, 2002
by
Arnaud Schauly
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fixed a segfault under windows.
parent
0c091c92
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
126 additions
and
125 deletions
+126
-125
modules/misc/sap.c
modules/misc/sap.c
+126
-125
No files found.
modules/misc/sap.c
View file @
da014eb8
...
...
@@ -2,7 +2,7 @@
* sap.c : SAP interface module
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: sap.c,v 1.
4 2002/12/06 22:44:03
gitan Exp $
* $Id: sap.c,v 1.
5 2002/12/10 00:02:29
gitan Exp $
*
* Authors: Arnaud Schauly <gitan@via.ecp.fr>
*
...
...
@@ -10,7 +10,7 @@
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
...
...
@@ -67,8 +67,8 @@
#define MAX_LINE_LENGTH 256
/* SAP is always on that port */
#define HELLO_PORT 9875
#define HELLO_GROUP "2
39.255.255.255"
#define HELLO_PORT 9875
#define HELLO_GROUP "2
24.2.127.254"
#define ADD_SESSION 1
/*****************************************************************************
...
...
@@ -81,7 +81,7 @@ typedef struct sess_descr_t sess_descr_t;
static
int
Activate
(
vlc_object_t
*
);
static
void
Run
(
intf_thread_t
*
p_intf
);
static
int
Kill
(
intf_thread_t
*
);
static
ssize_t
NetRead
(
intf_thread_t
*
,
int
,
byte_t
*
,
size_t
);
/* playlist related functions */
...
...
@@ -95,7 +95,7 @@ static sess_descr_t * parse_sdp( char *,intf_thread_t * ) ;
/* specific sdp fields parsing */
static
void
cfield_parse
(
char
*
,
char
**
);
static
void
mfield_parse
(
char
*
psz_mfield
,
char
**
ppsz_proto
,
static
void
mfield_parse
(
char
*
psz_mfield
,
char
**
ppsz_proto
,
char
**
ppsz_port
);
static
void
free_sd
(
sess_descr_t
*
);
...
...
@@ -104,19 +104,19 @@ static int ismult( char * );
/* The struct that contains sdp informations */
struct
sess_descr_t
{
char
*
psz_version
;
char
*
psz_origin
;
char
*
psz_sessionname
;
char
*
psz_information
;
char
*
psz_uri
;
char
*
psz_origin
;
char
*
psz_sessionname
;
char
*
psz_information
;
char
*
psz_uri
;
char
*
psz_emails
;
char
*
psz_phone
;
char
*
psz_time
;
char
*
psz_repeat
;
char
*
psz_attribute
;
char
*
psz_connection
;
char
*
psz_phone
;
char
*
psz_time
;
char
*
psz_repeat
;
char
*
psz_attribute
;
char
*
psz_connection
;
int
i_media
;
media_descr_t
**
pp_media
;
};
media_descr_t
**
pp_media
;
};
/* All this informations are not useful yet. */
struct
media_descr_t
{
...
...
@@ -129,7 +129,7 @@ struct media_descr_t {
*****************************************************************************/
vlc_module_begin
();
add_category_hint
(
N_
(
"SAP"
),
NULL
);
add_string
(
"sap-addr"
,
NULL
,
NULL
,
add_string
(
"sap-addr"
,
NULL
,
NULL
,
"SAP multicast address"
,
"SAP multicast address"
);
set_description
(
_
(
"SAP interface module"
)
);
set_capability
(
"interface"
,
0
);
...
...
@@ -164,14 +164,14 @@ static void Run( intf_thread_t *p_intf )
module_t
*
p_network
;
network_socket_t
socket_desc
;
psz_buf
=
NULL
;
if
(
!
(
psz_addr
=
config_GetPsz
(
p_intf
,
"sap-addr"
)
)
)
{
psz_addr
=
strdup
(
HELLO_GROUP
);
}
/* Prepare the network_socket_t structure */
socket_desc
.
i_type
=
NETWORK_UDP
;
socket_desc
.
psz_bind_addr
=
psz_addr
;
...
...
@@ -180,8 +180,8 @@ static void Run( intf_thread_t *p_intf )
socket_desc
.
i_server_port
=
0
;
p_intf
->
p_private
=
(
void
*
)
&
socket_desc
;
psz_network
=
"ipv4"
;
// FIXME
psz_network
=
"ipv4"
;
// FIXME
/* Create, Bind the socket, ... with the appropriate module */
if
(
!
(
p_network
=
module_Need
(
p_intf
,
"network"
,
psz_network
)
)
)
...
...
@@ -189,26 +189,25 @@ static void Run( intf_thread_t *p_intf )
msg_Err
(
p_intf
,
"failed to open a connection (udp)"
);
return
;
}
module_Unneed
(
p_intf
,
p_network
);
module_Unneed
(
p_intf
,
p_network
);
fd
=
socket_desc
.
i_handle
;
/* read SAP packets */
psz_buf
=
malloc
(
2000
);
psz_buf
=
malloc
(
2000
);
while
(
!
p_intf
->
b_die
)
{
int
i_read
;
addrlen
=
sizeof
(
addr
);
memset
(
psz_buf
,
0
,
2000
);
i_read
=
NetRead
(
p_intf
,
fd
,
psz_buf
,
2000
);
if
(
i_read
<
0
)
{
msg_Err
(
p_intf
,
"Cannot read in the socket"
);
...
...
@@ -220,12 +219,12 @@ static void Run( intf_thread_t *p_intf )
packet_handle
(
p_intf
,
&
psz_buf
);
}
free
(
psz_buf
);
/* Closing socket */
#ifdef UNDER_CE
CloseHandle
(
socket_desc
.
i_handle
);
#elif defined( WIN32 )
...
...
@@ -233,13 +232,13 @@ static void Run( intf_thread_t *p_intf )
#else
close
(
socket_desc
.
i_handle
);
#endif
}
/********************************************************************
* Kill
* Kill
*******************************************************************
* Kills the SAP interface.
* Kills the SAP interface.
********************************************************************/
static
int
Kill
(
intf_thread_t
*
p_intf
)
{
...
...
@@ -250,11 +249,11 @@ static int Kill( intf_thread_t *p_intf )
}
/*******************************************************************
* sess_toitem : changes a sess_descr_t into a hurd of
* sess_toitem : changes a sess_descr_t into a hurd of
* playlist_item_t, which are enqueued.
*******************************************************************
* Note : does not support sessions that take place on consecutive
* port or adresses yet.
* port or adresses yet.
*******************************************************************/
static
int
sess_toitem
(
intf_thread_t
*
p_intf
,
sess_descr_t
*
p_sd
)
...
...
@@ -266,11 +265,10 @@ static int sess_toitem( intf_thread_t * p_intf, sess_descr_t * p_sd )
int
i_multicast
;
int
i_count
;
playlist_t
*
p_playlist
;
psz_uri_default
=
NULL
;
psz_uri_default
=
NULL
;
cfield_parse
(
p_sd
->
psz_connection
,
&
psz_uri_default
);
for
(
i_count
=
0
;
i_count
<=
p_sd
->
i_media
;
i_count
++
)
{
...
...
@@ -278,22 +276,22 @@ static int sess_toitem( intf_thread_t * p_intf, sess_descr_t * p_sd )
p_item
->
psz_name
=
strdup
(
p_sd
->
psz_sessionname
);
p_item
->
i_type
=
0
;
p_item
->
i_status
=
0
;
p_item
->
b_autodeletion
=
VLC_FALSE
;
p_item
->
b_autodeletion
=
VLC_FALSE
;
p_item
->
psz_uri
=
NULL
;
psz_uri
=
NULL
;
/* Build what we have to put in p_item->psz_uri, with the m and
* c fields */
if
(
!
p_sd
->
pp_media
[
i_count
]
)
{
return
0
;
}
mfield_parse
(
p_sd
->
pp_media
[
i_count
]
->
psz_medianame
,
&
psz_proto
,
&
psz_port
);
mfield_parse
(
p_sd
->
pp_media
[
i_count
]
->
psz_medianame
,
&
psz_proto
,
&
psz_port
);
if
(
!
psz_proto
||
!
psz_port
)
{
return
0
;
...
...
@@ -301,10 +299,10 @@ static int sess_toitem( intf_thread_t * p_intf, sess_descr_t * p_sd )
if
(
p_sd
->
pp_media
[
i_count
]
->
psz_mediaconnection
)
{
cfield_parse
(
p_sd
->
pp_media
[
i_count
]
->
psz_mediaconnection
,
cfield_parse
(
p_sd
->
pp_media
[
i_count
]
->
psz_mediaconnection
,
&
psz_uri
);
}
else
else
{
psz_uri
=
NULL
;
}
...
...
@@ -323,38 +321,39 @@ static int sess_toitem( intf_thread_t * p_intf, sess_descr_t * p_sd )
/* Filling p_item->psz_uri */
i_multicast
=
ismult
(
psz_uri
);
p_item
->
psz_uri
=
malloc
(
strlen
(
psz_proto
)
+
strlen
(
psz_uri
)
+
i_multicast
=
ismult
(
psz_uri
);
p_item
->
psz_uri
=
malloc
(
strlen
(
psz_proto
)
+
strlen
(
psz_uri
)
+
strlen
(
psz_port
)
+
5
+
i_multicast
);
if
(
p_item
->
psz_uri
==
NULL
)
{
msg_Err
(
p_intf
,
"Not enough memory"
);
return
0
;
}
if
(
i_multicast
==
1
)
{
sprintf
(
p_item
->
psz_uri
,
"%s://@%s:%s"
,
psz_proto
,
sprintf
(
p_item
->
psz_uri
,
"%s://@%s:%s"
,
psz_proto
,
psz_uri
,
psz_port
);
}
else
else
{
sprintf
(
p_item
->
psz_uri
,
"%s://%s:%s"
,
psz_proto
,
sprintf
(
p_item
->
psz_uri
,
"%s://%s:%s"
,
psz_proto
,
psz_uri
,
psz_port
);
}
/* Enqueueing p_item in the playlist */
if
(
p_item
)
{
p_playlist
=
vlc_object_find
(
p_intf
,
VLC_OBJECT_PLAYLIST
,
FIND_ANYWHERE
);
playlist_AddItem
(
p_playlist
,
p_item
,
PLAYLIST_CHECK_INSERT
,
PLAYLIST_END
);
vlc_object_release
(
p_playlist
);
}
}
...
...
@@ -366,29 +365,29 @@ static int sess_toitem( intf_thread_t * p_intf, sess_descr_t * p_sd )
/**********************************************************************
* cfield_parse
*********************************************************************
* put into *ppsz_uri, the the uri in the cfield, psz_cfield.
* put into *ppsz_uri, the the uri in the cfield, psz_cfield.
*********************************************************************/
static
void
cfield_parse
(
char
*
psz_cfield
,
char
**
ppsz_uri
)
{
char
*
psz_pos
;
char
*
psz_pos
;
if
(
psz_cfield
)
{
psz_pos
=
psz_cfield
;
while
(
*
psz_pos
&&
*
psz_pos
!=
' '
&&
*
psz_pos
!=
'\0'
)
while
(
*
psz_pos
!=
' '
&&
*
psz_pos
!=
'\0'
)
{
psz_pos
++
;
}
psz_pos
++
;
while
(
*
psz_pos
&&
*
psz_pos
!=
' '
&&
*
psz_pos
!=
'\0'
)
while
(
*
psz_pos
!=
' '
&&
*
psz_pos
!=
'\0'
)
{
psz_pos
++
;
}
psz_pos
++
;
*
ppsz_uri
=
psz_pos
;
while
(
*
psz_pos
&&
*
psz_pos
!=
' '
&&
*
psz_pos
!=
'/'
*
ppsz_uri
=
psz_pos
;
while
(
*
psz_pos
!=
' '
&&
*
psz_pos
!=
'/'
&&
*
psz_pos
!=
'\0'
)
{
psz_pos
++
;
...
...
@@ -400,51 +399,52 @@ static void cfield_parse( char *psz_cfield, char **ppsz_uri )
{
ppsz_uri
=
NULL
;
}
return
;
return
;
}
/**********************************************************************
* m
c
field_parse
* mfield_parse
*********************************************************************
* put into *ppsz_proto, and *ppsz_port, the protocol and the port.
* put into *ppsz_proto, and *ppsz_port, the protocol and the port.
*********************************************************************/
static
void
mfield_parse
(
char
*
psz_mfield
,
char
**
ppsz_proto
,
static
void
mfield_parse
(
char
*
psz_mfield
,
char
**
ppsz_proto
,
char
**
ppsz_port
)
{
char
*
psz_pos
;
char
*
psz_pos
;
if
(
psz_mfield
)
{
psz_pos
=
psz_mfield
;
while
(
*
psz_pos
&&
*
psz_pos
!=
' '
)
while
(
*
psz_pos
!=
'\0'
&&
*
psz_pos
!=
' '
)
{
psz_pos
++
;
}
psz_pos
++
;
*
ppsz_port
=
psz_pos
;
while
(
*
psz_pos
&&
*
psz_pos
!=
' '
&&
*
psz_pos
!=
'/'
)
while
(
*
psz_pos
!=
'\0'
&&
*
psz_pos
&&
*
psz_pos
!=
' '
&&
*
psz_pos
!=
'/'
)
{
psz_pos
++
;
psz_pos
++
;
}
if
(
*
psz_pos
==
'/'
)
// FIXME does not support multi-port
{
*
psz_pos
=
'\0'
;
while
(
*
psz_pos
&&
*
psz_pos
!=
' '
)
psz_pos
++
;
while
(
*
psz_pos
!=
'\0'
&&
*
psz_pos
!=
' '
)
{
psz_pos
++
;
}
}
}
*
psz_pos
=
'\0'
;
psz_pos
++
;
*
ppsz_proto
=
psz_pos
;
while
(
*
psz_pos
&&
*
psz_pos
!=
' '
&&
*
psz_pos
!=
'\0'
&&
while
(
*
psz_pos
!=
'\0'
&&
*
psz_pos
!=
' '
&&
*
psz_pos
!=
'/'
)
{
*
psz_pos
=
tolower
(
*
psz_pos
);
psz_pos
++
;
psz_pos
++
;
}
*
psz_pos
=
'\0'
;
}
...
...
@@ -459,7 +459,7 @@ static void mfield_parse( char *psz_mfield, char **ppsz_proto,
/***********************************************************************
* parse_sap : Takes care of the SAP headers
***********************************************************************
* checks if the packet has the true headers ;
* checks if the packet has the true headers ;
***********************************************************************/
static
int
parse_sap
(
char
**
ppsz_sa_packet
)
{
/* Dummy Parser : does nothing !*/
...
...
@@ -468,30 +468,29 @@ static int parse_sap( char ** ppsz_sa_packet ) { /* Dummy Parser : does nothin
}
/*************************************************************************
* packet_handle : handle the received packet and enques the
* packet_handle : handle the received packet and enques the
* the understated session
*************************************************************************/
static
int
packet_handle
(
intf_thread_t
*
p_intf
,
char
**
ppsz_packet
)
{
int
j
=
0
;
sess_descr_t
*
p_sd
;
/* playlist_t *p_playlist;
playlist_item_t *p_item; */
j
=
parse_sap
(
ppsz_packet
);
j
=
parse_sap
(
ppsz_packet
);
if
(
j
!=
0
)
{
p_sd
=
parse_sdp
(
*
ppsz_packet
,
p_intf
);
p_sd
=
parse_sdp
(
*
ppsz_packet
,
p_intf
);
sess_toitem
(
p_intf
,
p_sd
);
free_sd
(
p_sd
);
return
1
;
}
return
0
;
// Invalid Packet
return
0
;
// Invalid Packet
}
...
...
@@ -501,13 +500,13 @@ static int packet_handle( intf_thread_t * p_intf, char ** ppsz_packet ) {
* Make a sess_descr_t with a psz
***********************************************************************/
static
sess_descr_t
*
parse_sdp
(
char
*
psz_pct
,
intf_thread_t
*
p_intf
)
static
sess_descr_t
*
parse_sdp
(
char
*
psz_pct
,
intf_thread_t
*
p_intf
)
{
int
j
,
k
;
char
**
ppsz_fill
=
NULL
;
sess_descr_t
*
sd
;
sd
=
malloc
(
sizeof
(
sess_descr_t
)
);
sd
=
malloc
(
sizeof
(
sess_descr_t
)
);
if
(
sd
==
NULL
)
...
...
@@ -517,9 +516,9 @@ static sess_descr_t * parse_sdp( char * psz_pct, intf_thread_t * p_intf )
else
{
sd
->
pp_media
=
NULL
;
sd
->
psz_origin
=
NULL
;
sd
->
psz_sessionname
=
NULL
;
sd
->
psz_information
=
NULL
;
sd
->
psz_origin
=
NULL
;
sd
->
psz_sessionname
=
NULL
;
sd
->
psz_information
=
NULL
;
sd
->
psz_uri
=
NULL
;
sd
->
psz_emails
=
NULL
;
sd
->
psz_phone
=
NULL
;
...
...
@@ -529,17 +528,17 @@ static sess_descr_t * parse_sdp( char * psz_pct, intf_thread_t * p_intf )
sd
->
psz_connection
=
NULL
;
sd
->
i_media
=-
1
;
j
=
0
;
while
(
psz_pct
[
j
]
!=
EOF
)
j
=
0
;
while
(
psz_pct
[
j
]
!=
EOF
&&
psz_pct
[
j
]
!=
'\0'
)
{
j
++
;
if
(
psz_pct
[
j
]
==
'='
)
{
if
(
psz_pct
[
j
]
==
'='
)
{
switch
(
psz_pct
[(
j
-
1
)])
{
case
(
'v'
)
:
{
ppsz_fill
=
&
sd
->
psz_version
;
break
;
}
}
case
(
'o'
)
:
{
ppsz_fill
=
&
sd
->
psz_origin
;
break
;
...
...
@@ -579,16 +578,16 @@ static sess_descr_t * parse_sdp( char * psz_pct, intf_thread_t * p_intf )
case
(
'm'
)
:
{
sd
->
i_media
++
;
if
(
sd
->
pp_media
)
{
sd
->
pp_media
=
realloc
(
sd
->
pp_media
,
sd
->
pp_media
=
realloc
(
sd
->
pp_media
,
(
sizeof
(
void
*
)
*
(
sd
->
i_media
+
1
))
);
}
else
else
{
sd
->
pp_media
=
malloc
(
sizeof
(
void
*
)
);
}
sd
->
pp_media
[
sd
->
i_media
]
=
}
sd
->
pp_media
[
sd
->
i_media
]
=
malloc
(
sizeof
(
media_descr_t
)
);
sd
->
pp_media
[
sd
->
i_media
]
->
psz_medianame
=
NULL
;
sd
->
pp_media
[
sd
->
i_media
]
->
psz_mediaconnection
=
NULL
;
...
...
@@ -596,11 +595,11 @@ static sess_descr_t * parse_sdp( char * psz_pct, intf_thread_t * p_intf )
break
;
}
case
(
'c'
)
:
{
if
(
sd
->
i_media
==
-
1
)
if
(
sd
->
i_media
==
-
1
)
{
ppsz_fill
=
&
sd
->
psz_connection
;
}
else
else
{
ppsz_fill
=
&
sd
->
pp_media
[
sd
->
i_media
]
->
psz_mediaconnection
;
...
...
@@ -608,19 +607,19 @@ static sess_descr_t * parse_sdp( char * psz_pct, intf_thread_t * p_intf )
break
;
}
default
:
{
msg_Info
(
p_intf
,
"Warning : Ignored field
\"
%c
\"
"
,
psz_pct
[
j
-
1
]
);
default
:
{
ppsz_fill
=
NULL
;
}
}
}
k
=
0
;
j
++
;
while
(
psz_pct
[
j
]
!=
'\n'
&&
psz_pct
[
j
]
!=
EOF
)
{
k
++
;
j
++
;
}
j
--
;
if
(
ppsz_fill
!=
NULL
)
{
*
ppsz_fill
=
malloc
(
sizeof
(
char
)
*
(
k
+
1
)
);
...
...
@@ -637,11 +636,12 @@ static sess_descr_t * parse_sdp( char * psz_pct, intf_thread_t * p_intf )
#define FREE( p ) \
if( p ) { free( p ); (p) = NULL; }
static
void
free_sd
(
sess_descr_t
*
p_sd
)
static
void
free_sd
(
sess_descr_t
*
p_sd
)
{
int
i
;
if
(
p_sd
)
{
FREE
(
p_sd
->
psz_origin
);
FREE
(
p_sd
->
psz_sessionname
);
FREE
(
p_sd
->
psz_information
);
...
...
@@ -661,7 +661,7 @@ static void free_sd( sess_descr_t * p_sd )
FREE
(
p_sd
->
pp_media
[
i
]
->
psz_mediaconnection
);
}
FREE
(
p_sd
->
pp_media
);
}
}
free
(
p_sd
);
}
else
...
...
@@ -681,20 +681,21 @@ static int ismult( char *psz_uri )
int
i
;
psz_c
=
malloc
(
3
);
memcpy
(
psz_c
,
psz_uri
,
3
);
if
(
psz_c
[
2
]
==
'.'
||
psz_c
[
1
]
==
'.'
)
{
free
(
psz_c
);
return
0
;
}
i
=
atoi
(
psz_c
);
if
(
i
<
224
)
{
free
(
psz_c
);
return
0
;
}
free
(
psz_c
);
return
1
;
}
...
...
@@ -704,29 +705,29 @@ static int ismult( char *psz_uri )
*****************************************************************************
* Taken from udp.c
******************************************************************************/
static
ssize_t
NetRead
(
intf_thread_t
*
p_intf
,
static
ssize_t
NetRead
(
intf_thread_t
*
p_intf
,
int
i_handle
,
byte_t
*
p_buffer
,
size_t
i_len
)
{
#ifdef UNDER_CE
return
-
1
;
#else
struct
timeval
timeout
;
fd_set
fds
;
int
i_ret
;
/* Initialize file descriptor set */
FD_ZERO
(
&
fds
);
FD_SET
(
i_handle
,
&
fds
);
/* We'll wait 0.5 second if nothing happens */
timeout
.
tv_sec
=
0
;
timeout
.
tv_usec
=
500000
;
/* Find if some data is available */
i_ret
=
select
(
i_handle
+
1
,
&
fds
,
NULL
,
NULL
,
&
timeout
);
if
(
i_ret
==
-
1
&&
errno
!=
EINTR
)
{
msg_Err
(
p_intf
,
"network select error (%s)"
,
strerror
(
errno
)
);
...
...
@@ -734,15 +735,15 @@ static ssize_t NetRead( intf_thread_t *p_intf,
else
if
(
i_ret
>
0
)
{
ssize_t
i_recv
=
recv
(
i_handle
,
p_buffer
,
i_len
,
0
);
if
(
i_recv
<
0
)
{
msg_Err
(
p_intf
,
"recv failed (%s)"
,
strerror
(
errno
)
);
}
return
i_recv
;
}
return
0
;
#endif
...
...
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