Greetings,
When trying to install from source on Mac OS X I get the following
error after running 'make install':
stream.c:128: error: implicit declaration of function `strndupa'
stream.c:128: warning: assignment makes pointer from integer without a
cast
stream.c:131: error: implicit declaration of function `strdupa'
stream.c:131: warning: assignment makes pointer from integer without a
cast
stream.c: In function `file_open':
stream.c:1237: error: storage size of `s' isn't known
stream.c:1239: error: implicit declaration of function `fstat'
stream.c:1237: warning: unused variable `s'
make[3]: *** [stream.lo] Error 1
make[2]: *** [all-recursive] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all-recursive-am] Error 2
Any ideas?
Sorry for the inconvenience.
Apply the attached patch.
--
Regards,
Claudio Ciccani
[EMAIL PROTECTED]
http://directfb.org
http://sf.net/projects/php-directfb
===================================================================
RCS file: /cvs/directfb/DirectFB/lib/direct/stream.c,v
retrieving revision 1.4
retrieving revision 1.9
diff -u -r1.4 -r1.9
--- DirectFB/lib/direct/stream.c 2005/09/24 15:53:31 1.4
+++ DirectFB/lib/direct/stream.c 2006/01/05 12:04:45 1.9
@@ -40,6 +40,7 @@
#include <sys/types.h>
#include <sys/time.h>
#include <sys/socket.h>
+#include <sys/stat.h>
#include <netinet/in.h>
#include <netdb.h>
@@ -97,7 +98,7 @@
};
-#define TCP_TIMEOUT 15
+#define NET_TIMEOUT 15
#define HTTP_PORT 80
#define FTP_PORT 21
#define HTTP_MAX_REDIRECTS 15
@@ -116,7 +117,7 @@
parse_url( const char *url, char **ret_host, int *ret_port,
char **ret_user, char **ret_pass, char **ret_path )
{
- char *host;
+ char *host = NULL;
int port = 0;
char *user = NULL;
char *pass = NULL;
@@ -125,10 +126,13 @@
tmp = strchr( url, '/' );
if (tmp) {
- host = strndupa( url, tmp - url );
+ host = alloca( tmp - url + 1 );
+ memcpy( host, url, tmp - url );
+ host[tmp-url] = '\0';
path = tmp;
} else {
- host = strdupa( url );
+ host = alloca( strlen( url ) + 1 );
+ memcpy( host, url, strlen( url ) + 1 );
path = "/";
}
@@ -222,7 +226,7 @@
/*****************************************************************************/
static int
-tcp_readl( int fd, char *buf, size_t size )
+net_readl( int fd, char *buf, size_t size )
{
fd_set set;
struct timeval tv;
@@ -232,7 +236,7 @@
FD_SET( fd, &set );
for (i = 0; i < size-1; i++) {
- tv.tv_sec = TCP_TIMEOUT;
+ tv.tv_sec = NET_TIMEOUT;
tv.tv_usec = 0;
select( fd+1, &set, NULL, NULL, &tv );
@@ -258,7 +262,7 @@
}
static DirectResult
-tcp_wait( DirectStream *stream,
+net_wait( DirectStream *stream,
unsigned int length,
struct timeval *tv )
{
@@ -323,7 +327,7 @@
}
static DirectResult
-tcp_peek( DirectStream *stream,
+net_peek( DirectStream *stream,
unsigned int length,
int offset,
void *buf,
@@ -342,10 +346,12 @@
case 0:
return DFB_EOF;
case -1:
+ if (errno == EAGAIN)
+ return DFB_BUFFEREMPTY;
return errno2result( errno );
default:
if (size < offset)
- return DFB_FAILURE;
+ return DFB_BUFFEREMPTY;
size -= offset;
break;
}
@@ -359,7 +365,7 @@
}
static DirectResult
-tcp_read( DirectStream *stream,
+net_read( DirectStream *stream,
unsigned int length,
void *buf,
unsigned int *read_out )
@@ -371,10 +377,9 @@
case 0:
return DFB_EOF;
case -1:
- if (errno != EAGAIN)
- return errno2result( errno );
- size = 0;
- break;
+ if (errno == EAGAIN)
+ return DFB_BUFFEREMPTY;
+ return errno2result( errno );
}
stream->offset += size;
@@ -386,7 +391,7 @@
}
static void
-tcp_close( DirectStream *stream )
+net_close( DirectStream *stream )
{
if (stream->remote.host) {
D_FREE( stream->remote.host );
@@ -430,7 +435,7 @@
}
static DirectResult
-tcp_connect( struct addrinfo *addr, int *ret_fd )
+net_connect( struct addrinfo *addr, int type, int proto, int *ret_fd )
{
DirectResult ret = DFB_OK;
int fd = -1;
@@ -442,7 +447,7 @@
for (tmp = addr; tmp; tmp = tmp->ai_next) {
int err;
- fd = socket( tmp->ai_family, SOCK_STREAM, IPPROTO_TCP );
+ fd = socket( tmp->ai_family, type, proto );
if (fd < 0) {
ret = errno2result( errno );
D_DEBUG_AT( Direct_Stream,
@@ -458,7 +463,7 @@
err = connect( fd, tmp->ai_addr, tmp->ai_addrlen );
if (err == 0 || errno == EINPROGRESS) {
- struct timeval t = { TCP_TIMEOUT, 0 };
+ struct timeval t = { NET_TIMEOUT, 0 };
fd_set s;
FD_ZERO( &s );
@@ -492,6 +497,8 @@
return ret;
}
+/*****************************************************************************/
+
static DirectResult
tcp_open( DirectStream *stream, const char *filename )
{
@@ -517,23 +524,24 @@
&hints, &stream->remote.addr )) {
D_ERROR( "Direct/Stream: "
"failed to resolve host '%s'!\n", stream->remote.host );
- tcp_close( stream );
+ net_close( stream );
return DFB_FAILURE;
}
- ret = tcp_connect( stream->remote.addr, &stream->remote.sd );
+ ret = net_connect( stream->remote.addr,
+ SOCK_STREAM, IPPROTO_TCP, &stream->remote.sd );
if (ret)
return ret;
stream->fd = stream->remote.sd;
stream->length = -1;
- stream->wait = tcp_wait;
- stream->peek = tcp_peek;
- stream->read = tcp_read;
- stream->close = tcp_close;
+ stream->wait = net_wait;
+ stream->peek = net_peek;
+ stream->read = net_read;
+ stream->close = net_close;
return ret;
-}
+}
/*****************************************************************************/
@@ -547,7 +555,8 @@
close( stream->remote.sd );
stream->remote.sd = -1;
- ret = tcp_connect( stream->remote.addr, &stream->remote.sd );
+ ret = net_connect( stream->remote.addr,
+ SOCK_STREAM, IPPROTO_TCP, &stream->remote.sd );
if (ret)
return ret;
@@ -584,7 +593,7 @@
D_DEBUG_AT( Direct_Stream, "sent [%s].\n", buf );
- while (tcp_readl( stream->remote.sd, buf, sizeof(buf) ) > 0) {
+ while (net_readl( stream->remote.sd, buf, sizeof(buf) ) > 0) {
D_DEBUG_AT( Direct_Stream, "got [%s].\n", buf );
if (!strncmp( buf, "HTTP/", sizeof("HTTP/")-1 )) {
@@ -669,7 +678,7 @@
D_DEBUG_AT( Direct_Stream, "sent [%s].\n", buf );
- while (tcp_readl( stream->remote.sd, buf, sizeof(buf) ) > 0) {
+ while (net_readl( stream->remote.sd, buf, sizeof(buf) ) > 0) {
D_DEBUG_AT( Direct_Stream, "got [%s].\n", buf );
if (!strncmp( buf, "HTTP/", sizeof("HTTP/")-1 )) {
@@ -685,7 +694,7 @@
sscanf( buf, "Content-Length: bytes=%d", &stream->length );
}
else if (!strncmp( buf, "Location:", sizeof("Location:")-1 )) {
- tcp_close( stream );
+ net_close( stream );
stream->seek = NULL;
if (++stream->remote.redirects > HTTP_MAX_REDIRECTS) {
@@ -718,7 +727,7 @@
if (status)
D_DEBUG_AT( Direct_Stream,
"server returned status %d.\n", status );
- tcp_close( stream );
+ net_close( stream );
return (status == 404) ? DFB_FILENOTFOUND : DFB_FAILURE;
}
@@ -736,7 +745,7 @@
FD_ZERO( &s );
FD_SET( stream->remote.sd, &s );
- t.tv_sec = TCP_TIMEOUT;
+ t.tv_sec = NET_TIMEOUT;
t.tv_usec = 0;
switch (select( stream->remote.sd+1, NULL, &s, NULL, &t )) {
@@ -767,7 +776,7 @@
static int
ftp_response( DirectStream *stream, char *buf, size_t size )
{
- while (tcp_readl( stream->remote.sd, buf, size ) > 0) {
+ while (net_readl( stream->remote.sd, buf, size ) > 0) {
D_DEBUG_AT( Direct_Stream, "got [%s].\n", buf );
if (isdigit(buf[0]) && isdigit(buf[1]) &&
@@ -826,7 +835,8 @@
return DFB_FAILURE;
}
- ret = tcp_connect( addr, &stream->fd );
+ ret = net_connect( addr, SOCK_STREAM,
+ IPPROTO_TCP, &stream->fd );
freeaddrinfo( addr );
return ret;
@@ -906,7 +916,7 @@
status = ftp_response( stream, buf, sizeof(buf) );
if (status != 220) {
- tcp_close( stream );
+ net_close( stream );
return DFB_FAILURE;
}
@@ -915,13 +925,13 @@
stream->remote.user ? : "anonymous" );
ret = ftp_command( stream, buf, len );
if (ret) {
- tcp_close( stream );
+ net_close( stream );
return ret;
}
status = ftp_response( stream, buf, sizeof(buf) );
if (status != 230 && status != 331) {
- tcp_close( stream );
+ net_close( stream );
return DFB_FAILURE;
}
@@ -930,13 +940,13 @@
"PASS %s\r\n", stream->remote.pass );
ret = ftp_command( stream, buf, len );
if (ret) {
- tcp_close( stream );
+ net_close( stream );
return ret;
}
status = ftp_response( stream, buf, sizeof(buf) );
if (status != 230) {
- tcp_close( stream );
+ net_close( stream );
return DFB_FAILURE;
}
}
@@ -945,13 +955,13 @@
len = snprintf( buf, sizeof(buf), "TYPE I\r\n" );
ret = ftp_command( stream, buf, len );
if (ret) {
- tcp_close( stream );
+ net_close( stream );
return ret;
}
status = ftp_response( stream, buf, sizeof(buf) );
if (status != 200) {
- tcp_close( stream );
+ net_close( stream );
return DFB_FAILURE;
}
@@ -959,7 +969,7 @@
len = snprintf( buf, sizeof(buf), "SIZE %s\r\n", stream->remote.path );
ret = ftp_command( stream, buf, len );
if (ret) {
- tcp_close( stream );
+ net_close( stream );
return ret;
}
@@ -970,7 +980,7 @@
/* enter passive mode by default */
ret = ftp_open_pasv( stream, buf, sizeof(buf) );
if (ret) {
- tcp_close( stream );
+ net_close( stream );
return ret;
}
@@ -978,13 +988,13 @@
len = snprintf( buf, sizeof(buf), "RETR %s\r\n", stream->remote.path );
ret = ftp_command( stream, buf, len );
if (ret) {
- tcp_close( stream );
+ net_close( stream );
return ret;
}
status = ftp_response( stream, buf, sizeof(buf) );
if (status != 150 && status != 125) {
- tcp_close( stream );
+ net_close( stream );
return DFB_FAILURE;
}
@@ -996,6 +1006,52 @@
/*****************************************************************************/
static DirectResult
+udp_open( DirectStream *stream, const char *filename )
+{
+ DirectResult ret = DFB_OK;
+ struct addrinfo hints;
+ char port[16];
+
+ parse_url( filename,
+ &stream->remote.host,
+ &stream->remote.port,
+ NULL,
+ NULL,
+ NULL );
+
+ snprintf( port, sizeof(port), "%d", stream->remote.port );
+
+ memset( &hints, 0, sizeof(hints) );
+ hints.ai_flags = AI_CANONNAME;
+ hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_family = PF_UNSPEC;
+
+ if (getaddrinfo( stream->remote.host, port,
+ &hints, &stream->remote.addr )) {
+ D_ERROR( "Direct/Stream: "
+ "failed to resolve host '%s'!\n", stream->remote.host );
+ net_close( stream );
+ return DFB_FAILURE;
+ }
+
+ ret = net_connect( stream->remote.addr,
+ SOCK_DGRAM, IPPROTO_UDP, &stream->remote.sd );
+ if (ret)
+ return ret;
+
+ stream->fd = stream->remote.sd;
+ stream->length = -1;
+ stream->wait = net_wait;
+ stream->peek = net_peek;
+ stream->read = net_read;
+ stream->close = net_close;
+
+ return ret;
+}
+
+/*****************************************************************************/
+
+static DirectResult
pipe_wait( DirectStream *stream,
unsigned int length,
struct timeval *tv )
@@ -1033,7 +1089,7 @@
len = length + offset;
if (len > stream->cache_size) {
- size_t s;
+ ssize_t s;
stream->cache = D_REALLOC( stream->cache, len );
if (!stream->cache) {
@@ -1051,8 +1107,8 @@
}
stream->cache_size += s;
- if (stream->cache_size < offset)
- return DFB_FAILURE;
+ if (stream->cache_size <= offset)
+ return DFB_BUFFEREMPTY;
size = stream->cache_size - offset;
}
@@ -1092,7 +1148,7 @@
}
if (length) {
- size_t s;
+ ssize_t s;
s = read( stream->fd, buf+size, length-size );
switch (s) {
@@ -1101,8 +1157,11 @@
return DFB_EOF;
break;
case -1:
- if (!size && errno != EAGAIN)
- return errno2result( errno );
+ if (!size) {
+ return (errno == EAGAIN)
+ ? DFB_BUFFEREMPTY
+ : errno2result( errno );
+ }
break;
default:
size += s;
@@ -1128,7 +1187,7 @@
unsigned int *read_out )
{
DirectResult ret = DFB_OK;
- size_t size;
+ ssize_t size;
if (lseek( stream->fd, offset, SEEK_CUR ) < 0)
return DFB_FAILURE;
@@ -1139,8 +1198,9 @@
ret = DFB_EOF;
break;
case -1:
- if (errno != EAGAIN)
- ret = errno2result( errno );
+ ret = (errno == EAGAIN)
+ ? DFB_BUFFEREMPTY
+ : errno2result( errno );
size = 0;
break;
}
@@ -1160,17 +1220,16 @@
void *buf,
unsigned int *read_out )
{
- size_t size;
+ ssize_t size;
size = read( stream->fd, buf, length );
switch (size) {
case 0:
return DFB_EOF;
case -1:
- if (errno != EAGAIN)
- return errno2result( errno );
- size = 0;
- break;
+ if (errno == EAGAIN)
+ return DFB_BUFFEREMPTY;
+ return errno2result( errno );
}
stream->offset += size;
@@ -1276,6 +1335,9 @@
else if (!strncmp( filename, "ftp://", 6 )) {
ret = ftp_open( stream, filename+6 );
}
+ else if (!strncmp( filename, "udp://", 6 )) {
+ ret = udp_open( stream, filename+6 );
+ }
else if (!strncmp( filename, "file:/", 6 )) {
ret = file_open( stream, filename+6 );
}
_______________________________________________
directfb-users mailing list
[email protected]
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-users