Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-gpu
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-gpu
Commits
c4f5530c
Commit
c4f5530c
authored
Feb 03, 2008
by
Rémi Denis-Courmont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use waitpipe when establishing an outgoing network connection
parent
518f3a21
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
41 additions
and
52 deletions
+41
-52
src/network/tcp.c
src/network/tcp.c
+41
-52
No files found.
src/network/tcp.c
View file @
c4f5530c
...
@@ -81,9 +81,14 @@ int __net_Connect( vlc_object_t *p_this, const char *psz_host, int i_port,
...
@@ -81,9 +81,14 @@ int __net_Connect( vlc_object_t *p_this, const char *psz_host, int i_port,
char
*
psz_socks
;
char
*
psz_socks
;
int
i_realport
,
i_val
,
i_handle
=
-
1
;
int
i_realport
,
i_val
,
i_handle
=
-
1
;
int
evfd
=
vlc_object_waitpipe
(
p_this
);
if
(
evfd
==
-
1
)
return
-
1
;
if
(
i_port
==
0
)
if
(
i_port
==
0
)
i_port
=
80
;
/* historical VLC thing */
i_port
=
80
;
/* historical VLC thing */
memset
(
&
hints
,
0
,
sizeof
(
hints
)
);
memset
(
&
hints
,
0
,
sizeof
(
hints
)
);
hints
.
ai_socktype
=
SOCK_STREAM
;
hints
.
ai_socktype
=
SOCK_STREAM
;
...
@@ -158,9 +163,7 @@ int __net_Connect( vlc_object_t *p_this, const char *psz_host, int i_port,
...
@@ -158,9 +163,7 @@ int __net_Connect( vlc_object_t *p_this, const char *psz_host, int i_port,
if
(
connect
(
fd
,
ptr
->
ai_addr
,
ptr
->
ai_addrlen
)
)
if
(
connect
(
fd
,
ptr
->
ai_addr
,
ptr
->
ai_addrlen
)
)
{
{
socklen_t
i_val_size
=
sizeof
(
i_val
);
int
timeout
,
val
;
div_t
d
;
vlc_value_t
timeout
;
if
(
net_errno
!=
EINPROGRESS
)
if
(
net_errno
!=
EINPROGRESS
)
{
{
...
@@ -169,62 +172,47 @@ int __net_Connect( vlc_object_t *p_this, const char *psz_host, int i_port,
...
@@ -169,62 +172,47 @@ int __net_Connect( vlc_object_t *p_this, const char *psz_host, int i_port,
}
}
msg_Dbg
(
p_this
,
"connection: %m"
);
msg_Dbg
(
p_this
,
"connection: %m"
);
var_Create
(
p_this
,
"ipv4-timeout"
,
timeout
=
var_CreateGetInteger
(
p_this
,
"ipv4-timeout"
);
VLC_VAR_INTEGER
|
VLC_VAR_DOINHERIT
);
if
(
timeout
<
0
)
var_Get
(
p_this
,
"ipv4-timeout"
,
&
timeout
);
if
(
timeout
.
i_int
<
0
)
{
{
msg_Err
(
p_this
,
"invalid negative value for ipv4-timeout"
);
msg_Err
(
p_this
,
"invalid negative value for ipv4-timeout"
);
timeout
.
i_int
=
0
;
timeout
=
0
;
}
}
d
=
div
(
timeout
.
i_int
,
100
);
for
(;;)
struct
pollfd
ufd
[
2
]
=
{
{
.
fd
=
fd
,
.
events
=
POLLOUT
},
{
.
fd
=
evfd
,
.
events
=
POLLIN
},
};
do
/* NOTE: timeout screwed up if we catch a signal (EINTR) */
val
=
poll
(
ufd
,
sizeof
(
ufd
)
/
sizeof
(
ufd
[
0
]),
timeout
);
while
((
val
==
-
1
)
&&
(
net_errno
==
EINTR
));
switch
(
val
)
{
{
struct
pollfd
ufd
=
{
.
fd
=
fd
,
.
events
=
POLLOUT
};
case
-
1
:
/* error */
int
i_ret
;
msg_Err
(
p_this
,
"connection polling error: %m"
);
goto
next_ai
;
if
(
p_this
->
b_die
)
{
case
0
:
/* timeout */
msg_Dbg
(
p_this
,
"connection aborted"
);
msg_Warn
(
p_this
,
"connection timed out"
);
net_Close
(
fd
);
goto
next_ai
;
vlc_freeaddrinfo
(
res
);
return
-
1
;
default:
/* something happended */
}
if
(
ufd
[
1
].
revents
)
goto
next_ai
;
/* LibVLC object killed */
/*
* We'll wait 0.1 second if nothing happens
* NOTE:
* time out will be shortened if we catch a signal (EINTR)
*/
i_ret
=
poll
(
&
ufd
,
1
,
(
d
.
quot
>
0
)
?
100
:
d
.
rem
);
if
(
i_ret
==
1
)
break
;
if
(
(
i_ret
==
-
1
)
&&
(
net_errno
!=
EINTR
)
)
{
msg_Err
(
p_this
,
"connection polling error: %m"
);
goto
next_ai
;
}
if
(
d
.
quot
<=
0
)
{
msg_Warn
(
p_this
,
"connection timed out"
);
goto
next_ai
;
}
d
.
quot
--
;
}
}
#if !defined( SYS_BEOS ) && !defined( UNDER_CE )
/* There is NO WAY around checking SO_ERROR.
if
(
getsockopt
(
fd
,
SOL_SOCKET
,
SO_ERROR
,
(
void
*
)
&
i_val
,
* Don't ifdef it out!!! */
&
i_val_size
)
==
-
1
||
i_val
!=
0
)
if
(
getsockopt
(
fd
,
SOL_SOCKET
,
SO_ERROR
,
&
val
,
&
(
socklen_t
){
sizeof
(
val
)
})
||
val
)
{
{
errno
=
i_
val
;
errno
=
val
;
msg_Err
(
p_this
,
"connection failed: %m"
);
msg_Err
(
p_this
,
"connection failed: %m"
);
goto
next_ai
;
goto
next_ai
;
}
}
#endif
}
}
msg_Dbg
(
p_this
,
"connection succeeded (socket = %d)"
,
fd
);
msg_Dbg
(
p_this
,
"connection succeeded (socket = %d)"
,
fd
);
...
@@ -287,11 +275,12 @@ int net_AcceptSingle (vlc_object_t *obj, int lfd)
...
@@ -287,11 +275,12 @@ int net_AcceptSingle (vlc_object_t *obj, int lfd)
int
__net_Accept
(
vlc_object_t
*
p_this
,
int
*
pi_fd
,
mtime_t
i_wait
)
int
__net_Accept
(
vlc_object_t
*
p_this
,
int
*
pi_fd
,
mtime_t
i_wait
)
{
{
int
timeout
=
(
i_wait
<
0
)
?
-
1
:
i_wait
/
1000
;
int
timeout
=
(
i_wait
<
0
)
?
-
1
:
i_wait
/
1000
;
int
evfd
;
int
evfd
=
vlc_object_waitpipe
(
p_this
)
;
assert
(
pi_fd
!=
NULL
);
if
(
evfd
==
-
1
)
return
-
1
;
evfd
=
vlc_object_waitpipe
(
p_this
);
assert
(
pi_fd
!=
NULL
);
for
(;;)
for
(;;)
{
{
...
...
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