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

Reply via email to