/*****************************************************************************
* io.c: network I/O functions
*****************************************************************************
- * Copyright (C) 2004-2005, 2007 the VideoLAN team
+ * Copyright (C) 2004-2005, 2007 VLC authors and VideoLAN
* Copyright © 2005-2006 Rémi Denis-Courmont
* $Id$
*
* Rémi Denis-Courmont <rem # videolan.org>
* Christophe Mutricy <xtophe at videolan dot org>
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 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
- * GNU General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/*****************************************************************************
#include <errno.h>
#include <assert.h>
-#ifdef HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
+#include <fcntl.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
#ifdef DCCP_SOCKOPT_SERVICE
if (socktype == SOL_DCCP)
{
- char *dccps = var_CreateGetNonEmptyString (p_this, "dccp-service");
+ char *dccps = var_InheritString (p_this, "dccp-service");
if (dccps != NULL)
{
setsockopt (fd, SOL_DCCP, DCCP_SOCKOPT_SERVICE, dccps,
int *net_Listen (vlc_object_t *p_this, const char *psz_host,
- int i_port, int protocol)
+ int i_port, int type, int protocol)
{
struct addrinfo hints, *res;
memset (&hints, 0, sizeof( hints ));
+ hints.ai_socktype = type;
hints.ai_protocol = protocol;
hints.ai_flags = AI_PASSIVE;
- msg_Dbg (p_this, "net: listening to %s port %d", psz_host, i_port);
+ msg_Dbg (p_this, "net: listening to %s port %d",
+ (psz_host != NULL) ? psz_host : "*", i_port);
int i_val = vlc_getaddrinfo (p_this, psz_host, i_port, &hints, &res);
if (i_val)
{
- msg_Err (p_this, "Cannot resolve %s port %d : %s", psz_host, i_port,
+ msg_Err (p_this, "Cannot resolve %s port %d : %s",
+ (psz_host != NULL) ? psz_host : "", i_port,
gai_strerror (i_val));
return NULL;
}
while (i_buflen > 0)
{
- ufd[0].revents = ufd[1].revents = 0;
-
if (poll (ufd, sizeof (ufd) / sizeof (ufd[0]), -1) < 0)
{
if (errno != EINTR)
continue;
}
-#ifndef POLLRDHUP /* This is nice but non-portable */
-# define POLLRDHUP 0
-#endif
if (i_total > 0)
{
/* Errors (-1) and EOF (0) will be returned on next call,
* otherwise we'd "hide" the error from the caller, which is a
* bad idea™. */
- if (ufd[0].revents & (POLLERR|POLLNVAL|POLLRDHUP))
+ if (ufd[0].revents & (POLLERR|POLLNVAL))
break;
if (ufd[1].revents)
break;
assert (ufd[0].revents);
ssize_t n;
+#if defined(WIN32) || defined(UNDER_CE)
+ int error;
+#endif
if (vs != NULL)
{
int canc = vlc_savecancel ();
n = vs->pf_recv (vs->p_sys, p_buf, i_buflen);
+#if defined(WIN32) || defined(UNDER_CE)
+ /* We must read last error immediately, because vlc_restorecancel()
+ * access thread local storage, and TlsGetValue() will call
+ * SetLastError() to indicate that the function succeeded, thus
+ * overwriting the error code coming from pf_recv().
+ * WSAGetLastError is just an alias for GetLastError these days.
+ */
+ error = WSAGetLastError();
+#endif
vlc_restorecancel (canc);
}
else
{
#ifdef WIN32
n = recv (fd, p_buf, i_buflen, 0);
+ error = WSAGetLastError();
#else
n = read (fd, p_buf, i_buflen);
#endif
if (n == -1)
{
#if defined(WIN32) || defined(UNDER_CE)
- switch (WSAGetLastError ())
+ switch (error)
{
case WSAEWOULDBLOCK:
case WSAEINTR: