gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r5612 - in GNUnet/src: include transports util/network


From: gnunet
Subject: [GNUnet-SVN] r5612 - in GNUnet/src: include transports util/network
Date: Sat, 8 Sep 2007 17:49:13 -0600 (MDT)

Author: grothoff
Date: 2007-09-08 17:49:09 -0600 (Sat, 08 Sep 2007)
New Revision: 5612

Modified:
   GNUnet/src/include/gnunet_util_network.h
   GNUnet/src/include/plibc.h
   GNUnet/src/transports/http.c
   GNUnet/src/transports/test_repeat.c
   GNUnet/src/util/network/io.c
   GNUnet/src/util/network/select.c
Log:
http bugfixes

Modified: GNUnet/src/include/gnunet_util_network.h
===================================================================
--- GNUnet/src/include/gnunet_util_network.h    2007-09-08 23:46:46 UTC (rev 
5611)
+++ GNUnet/src/include/gnunet_util_network.h    2007-09-08 23:49:09 UTC (rev 
5612)
@@ -522,6 +522,13 @@
                             struct GE_Context *ectx, IPaddr * addr);
 
 
+/**
+ * Change a file descriptor that refers to a pipe
+ * to non-blocking IO.
+ * @return OK on success
+ */
+int network_make_pipe_nonblocking(struct GE_Context * ectx,
+                                 int pipe);
 
 #if 0                           /* keep Emacsens' auto-indent happy */
 {

Modified: GNUnet/src/include/plibc.h
===================================================================
--- GNUnet/src/include/plibc.h  2007-09-08 23:46:46 UTC (rev 5611)
+++ GNUnet/src/include/plibc.h  2007-09-08 23:49:09 UTC (rev 5612)
@@ -29,21 +29,22 @@
 #define _PLIBC_H_
 
 #ifndef SIGALRM
- #define SIGALRM 14
+#define SIGALRM 14
 #endif
 
 #ifdef __cplusplus
-extern "C" {
+extern "C"
+{
 #endif
 
 #ifdef Q_OS_WIN32
- #define WINDOWS 1
+#define WINDOWS 1
 #endif
 
 #ifdef WINDOWS
 
 #if ENABLE_NLS
-  #include "langinfo.h"
+#include "langinfo.h"
 #endif
 
 #include <windows.h>
@@ -75,8 +76,8 @@
 #define int64_t long long
 #define int32_t long
 
-struct stat64
-{
+  struct stat64
+  {
     _dev_t st_dev;
     _ino_t st_ino;
     _mode_t st_mode;
@@ -88,112 +89,112 @@
     __time64_t st_atime;
     __time64_t st_mtime;
     __time64_t st_ctime;
-};
+  };
 
 #ifndef pid_t
-  #define pid_t int
+#define pid_t int
 #endif
 
 #ifndef WEXITSTATUS
-  #define WEXITSTATUS(status) (((status) & 0xff00) >> 8)
+#define WEXITSTATUS(status) (((status) & 0xff00) >> 8)
 #endif
 
 /* Thanks to the Cygwin project */
-#define ENOCSI 43 /* No CSI structure available */
-#define EL2HLT 44 /* Level 2 halted */
+#define ENOCSI 43               /* No CSI structure available */
+#define EL2HLT 44               /* Level 2 halted */
 #ifndef  EDEADLK
-  #define EDEADLK 45  /* Deadlock condition */
+#define EDEADLK 45              /* Deadlock condition */
 #endif
 #ifndef  ENOLCK
-  #define ENOLCK 46 /* No record locks available */
+#define ENOLCK 46               /* No record locks available */
 #endif
-#define EBADE 50  /* Invalid exchange */
-#define EBADR 51  /* Invalid request descriptor */
-#define EXFULL 52 /* Exchange full */
-#define ENOANO 53 /* No anode */
-#define EBADRQC 54  /* Invalid request code */
-#define EBADSLT 55  /* Invalid slot */
+#define EBADE 50                /* Invalid exchange */
+#define EBADR 51                /* Invalid request descriptor */
+#define EXFULL 52               /* Exchange full */
+#define ENOANO 53               /* No anode */
+#define EBADRQC 54              /* Invalid request code */
+#define EBADSLT 55              /* Invalid slot */
 #ifndef  EDEADLOCK
-  #define EDEADLOCK EDEADLK /* File locking deadlock error */
+#define EDEADLOCK EDEADLK       /* File locking deadlock error */
 #endif
-#define EBFONT 57 /* Bad font file fmt */
-#define ENOSTR 60 /* Device not a stream */
-#define ENODATA 61  /* No data (for no delay io) */
-#define ETIME 62  /* Timer expired */
-#define ENOSR 63  /* Out of streams resources */
-#define ENONET 64 /* Machine is not on the network */
-#define ENOPKG 65 /* Package not installed */
-#define EREMOTE 66  /* The object is remote */
-#define ENOLINK 67  /* The link has been severed */
-#define EADV 68   /* Advertise error */
-#define ESRMNT 69 /* Srmount error */
-#define ECOMM 70  /* Communication error on send */
-#define EPROTO 71 /* Protocol error */
-#define EMULTIHOP 74  /* Multihop attempted */
-#define ELBIN 75  /* Inode is remote (not really error) */
-#define EDOTDOT 76  /* Cross mount point (not really error) */
-#define EBADMSG 77  /* Trying to read unreadable message */
-#define ENOTUNIQ 80 /* Given log. name not unique */
-#define EBADFD 81 /* f.d. invalid for this operation */
-#define EREMCHG 82  /* Remote address changed */
-#define ELIBACC 83  /* Can't access a needed shared lib */
-#define ELIBBAD 84  /* Accessing a corrupted shared lib */
-#define ELIBSCN 85  /* .lib section in a.out corrupted */
-#define ELIBMAX 86  /* Attempting to link in too many libs */
-#define ELIBEXEC 87 /* Attempting to exec a shared library */
+#define EBFONT 57               /* Bad font file fmt */
+#define ENOSTR 60               /* Device not a stream */
+#define ENODATA 61              /* No data (for no delay io) */
+#define ETIME 62                /* Timer expired */
+#define ENOSR 63                /* Out of streams resources */
+#define ENONET 64               /* Machine is not on the network */
+#define ENOPKG 65               /* Package not installed */
+#define EREMOTE 66              /* The object is remote */
+#define ENOLINK 67              /* The link has been severed */
+#define EADV 68                 /* Advertise error */
+#define ESRMNT 69               /* Srmount error */
+#define ECOMM 70                /* Communication error on send */
+#define EPROTO 71               /* Protocol error */
+#define EMULTIHOP 74            /* Multihop attempted */
+#define ELBIN 75                /* Inode is remote (not really error) */
+#define EDOTDOT 76              /* Cross mount point (not really error) */
+#define EBADMSG 77              /* Trying to read unreadable message */
+#define ENOTUNIQ 80             /* Given log. name not unique */
+#define EBADFD 81               /* f.d. invalid for this operation */
+#define EREMCHG 82              /* Remote address changed */
+#define ELIBACC 83              /* Can't access a needed shared lib */
+#define ELIBBAD 84              /* Accessing a corrupted shared lib */
+#define ELIBSCN 85              /* .lib section in a.out corrupted */
+#define ELIBMAX 86              /* Attempting to link in too many libs */
+#define ELIBEXEC 87             /* Attempting to exec a shared library */
 #ifndef  ENOSYS
-  #define ENOSYS 88 /* Function not implemented */
+#define ENOSYS 88               /* Function not implemented */
 #endif
-#define ENMFILE 89      /* No more files */
+#define ENMFILE 89              /* No more files */
 #ifndef  ENOTEMPTY
-  #define ENOTEMPTY 90  /* Directory not empty */
+#define ENOTEMPTY 90            /* Directory not empty */
 #endif
 #ifndef  ENAMETOOLONG
-  #define ENAMETOOLONG 91 /* File or path name too long */
+#define ENAMETOOLONG 91         /* File or path name too long */
 #endif
-#define ELOOP 92  /* Too many symbolic links */
-#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */
-#define EPFNOSUPPORT 96 /* Protocol family not supported */
-#define ECONNRESET 104  /* Connection reset by peer */
-#define ENOBUFS 105 /* No buffer space available */
-#define EAFNOSUPPORT 106 /* Address family not supported by protocol family */
-#define EPROTOTYPE 107  /* Protocol wrong type for socket */
-#define ENOTSOCK 108  /* Socket operation on non-socket */
-#define ENOPROTOOPT 109 /* Protocol not available */
-#define ESHUTDOWN 110 /* Can't send after socket shutdown */
-#define ECONNREFUSED 111  /* Connection refused */
-#define EADDRINUSE 112    /* Address already in use */
-#define ECONNABORTED 113  /* Connection aborted */
-#define ENETUNREACH 114   /* Network is unreachable */
-#define ENETDOWN 115    /* Network interface is not configured */
+#define ELOOP 92                /* Too many symbolic links */
+#define EOPNOTSUPP 95           /* Operation not supported on transport 
endpoint */
+#define EPFNOSUPPORT 96         /* Protocol family not supported */
+#define ECONNRESET 104          /* Connection reset by peer */
+#define ENOBUFS 105             /* No buffer space available */
+#define EAFNOSUPPORT 106        /* Address family not supported by protocol 
family */
+#define EPROTOTYPE 107          /* Protocol wrong type for socket */
+#define ENOTSOCK 108            /* Socket operation on non-socket */
+#define ENOPROTOOPT 109         /* Protocol not available */
+#define ESHUTDOWN 110           /* Can't send after socket shutdown */
+#define ECONNREFUSED 111        /* Connection refused */
+#define EADDRINUSE 112          /* Address already in use */
+#define ECONNABORTED 113        /* Connection aborted */
+#define ENETUNREACH 114         /* Network is unreachable */
+#define ENETDOWN 115            /* Network interface is not configured */
 #ifndef  ETIMEDOUT
-  #define ETIMEDOUT 116   /* Connection timed out */
+#define ETIMEDOUT 116           /* Connection timed out */
 #endif
-#define EHOSTDOWN 117   /* Host is down */
-#define EHOSTUNREACH 118  /* Host is unreachable */
-#define EINPROGRESS 119   /* Connection already in progress */
-#define EALREADY 120    /* Socket already connected */
-#define EDESTADDRREQ 121  /* Destination address required */
-#define EMSGSIZE 122    /* Message too long */
-#define EPROTONOSUPPORT 123 /* Unknown protocol */
-#define ESOCKTNOSUPPORT 124 /* Socket type not supported */
-#define EADDRNOTAVAIL 125 /* Address not available */
-#define ENETRESET 126   /* Connection aborted by network */
-#define EISCONN 127       /* Socket is already connected */
-#define ENOTCONN 128    /* Socket is not connected */
-#define ETOOMANYREFS 129  /* Too many references: cannot splice */
-#define EPROCLIM 130    /* Too many processes */
-#define EUSERS 131      /* Too many users */
-#define EDQUOT 132      /* Disk quota exceeded */
-#define ESTALE 133          /* Unknown error */
+#define EHOSTDOWN 117           /* Host is down */
+#define EHOSTUNREACH 118        /* Host is unreachable */
+#define EINPROGRESS 119         /* Connection already in progress */
+#define EALREADY 120            /* Socket already connected */
+#define EDESTADDRREQ 121        /* Destination address required */
+#define EMSGSIZE 122            /* Message too long */
+#define EPROTONOSUPPORT 123     /* Unknown protocol */
+#define ESOCKTNOSUPPORT 124     /* Socket type not supported */
+#define EADDRNOTAVAIL 125       /* Address not available */
+#define ENETRESET 126           /* Connection aborted by network */
+#define EISCONN 127             /* Socket is already connected */
+#define ENOTCONN 128            /* Socket is not connected */
+#define ETOOMANYREFS 129        /* Too many references: cannot splice */
+#define EPROCLIM 130            /* Too many processes */
+#define EUSERS 131              /* Too many users */
+#define EDQUOT 132              /* Disk quota exceeded */
+#define ESTALE 133              /* Unknown error */
 #ifndef  ENOTSUP
-  #define ENOTSUP 134       /* Not supported */
+#define ENOTSUP 134             /* Not supported */
 #endif
-#define ENOMEDIUM 135       /* No medium (in tape drive) */
-#define ENOSHARE 136        /* No such host or network path */
-#define ECASECLASH 137      /* Filename exists with different case */
-#define EWOULDBLOCK EAGAIN  /* Operation would block */
-#define EOVERFLOW 139 /* Value too large for defined data type */
+#define ENOMEDIUM 135           /* No medium (in tape drive) */
+#define ENOSHARE 136            /* No such host or network path */
+#define ECASECLASH 137          /* Filename exists with different case */
+#define EWOULDBLOCK EAGAIN      /* Operation would block */
+#define EOVERFLOW 139           /* Value too large for defined data type */
 
 #undef HOST_NOT_FOUND
 #define HOST_NOT_FOUND 1
@@ -207,65 +208,65 @@
 #define PROT_READ   0x1
 #define PROT_WRITE  0x2
 #define MAP_SHARED  0x1
-#define MAP_PRIVATE 0x2 /* unsupported */
+#define MAP_PRIVATE 0x2         /* unsupported */
 #define MAP_FIXED   0x10
 #define MAP_FAILED  ((void *)-1)
 
-struct statfs
-{
-  long f_type;                  /* type of filesystem (see below) */
-  long f_bsize;                 /* optimal transfer block size */
-  long f_blocks;                /* total data blocks in file system */
-  long f_bfree;                 /* free blocks in fs */
-  long f_bavail;                /* free blocks avail to non-superuser */
-  long f_files;                 /* total file nodes in file system */
-  long f_ffree;                 /* free file nodes in fs */
-  long f_fsid;                  /* file system id */
-  long f_namelen;               /* maximum length of filenames */
-  long f_spare[6];              /* spare for later */
-};
+  struct statfs
+  {
+    long f_type;                /* type of filesystem (see below) */
+    long f_bsize;               /* optimal transfer block size */
+    long f_blocks;              /* total data blocks in file system */
+    long f_bfree;               /* free blocks in fs */
+    long f_bavail;              /* free blocks avail to non-superuser */
+    long f_files;               /* total file nodes in file system */
+    long f_ffree;               /* free file nodes in fs */
+    long f_fsid;                /* file system id */
+    long f_namelen;             /* maximum length of filenames */
+    long f_spare[6];            /* spare for later */
+  };
 
 /* Taken from the Wine project <http://www.winehq.org>
     /wine/include/winternl.h */
-enum SYSTEM_INFORMATION_CLASS
-{
-  SystemBasicInformation = 0,
-  Unknown1,
-  SystemPerformanceInformation = 2,
-  SystemTimeOfDayInformation = 3, /* was SystemTimeInformation */
-  Unknown4,
-  SystemProcessInformation = 5,
-  Unknown6,
-  Unknown7,
-  SystemProcessorPerformanceInformation = 8,
-  Unknown9,
-  Unknown10,
-  SystemDriverInformation,
-  Unknown12,
-  Unknown13,
-  Unknown14,
-  Unknown15,
-  SystemHandleList,
-  Unknown17,
-  Unknown18,
-  Unknown19,
-  Unknown20,
-  SystemCacheInformation,
-  Unknown22,
-  SystemInterruptInformation = 23,
-  SystemExceptionInformation = 33,
-  SystemRegistryQuotaInformation = 37,
-  SystemLookasideInformation = 45
-};
+  enum SYSTEM_INFORMATION_CLASS
+  {
+    SystemBasicInformation = 0,
+    Unknown1,
+    SystemPerformanceInformation = 2,
+    SystemTimeOfDayInformation = 3,     /* was SystemTimeInformation */
+    Unknown4,
+    SystemProcessInformation = 5,
+    Unknown6,
+    Unknown7,
+    SystemProcessorPerformanceInformation = 8,
+    Unknown9,
+    Unknown10,
+    SystemDriverInformation,
+    Unknown12,
+    Unknown13,
+    Unknown14,
+    Unknown15,
+    SystemHandleList,
+    Unknown17,
+    Unknown18,
+    Unknown19,
+    Unknown20,
+    SystemCacheInformation,
+    Unknown22,
+    SystemInterruptInformation = 23,
+    SystemExceptionInformation = 33,
+    SystemRegistryQuotaInformation = 37,
+    SystemLookasideInformation = 45
+  };
 
-typedef struct
-{
+  typedef struct
+  {
     LARGE_INTEGER IdleTime;
     LARGE_INTEGER KernelTime;
     LARGE_INTEGER UserTime;
     LARGE_INTEGER Reserved1[2];
     ULONG Reserved2;
-} SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION;
+  } SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION;
 
 #define sleep(secs) (Sleep(secs * 1000))
 
@@ -282,11 +283,11 @@
 #define SHUT_RDWR SD_BOTH
 
 /* Operations for flock() */
-#define LOCK_SH  1       /* shared lock */
-#define LOCK_EX  2       /* exclusive lock */
-#define LOCK_NB  4       /* or'd with one of the above to prevent
-                            blocking */
-#define LOCK_UN  8       /* remove lock */
+#define LOCK_SH  1              /* shared lock */
+#define LOCK_EX  2              /* exclusive lock */
+#define LOCK_NB  4              /* or'd with one of the above to prevent
+                                   blocking */
+#define LOCK_UN  8              /* remove lock */
 
 /* Not supported under MinGW */
 #define S_IRGRP 0
@@ -312,273 +313,274 @@
  */
 #define index(s, c) strchr(s, c)
 
-BOOL _plibc_CreateShortcut(const char *pszSrc, const char *pszDest);
-BOOL _plibc_DereferenceShortcut(char *pszShortcut);
-char *plibc_ChooseDir(char *pszTitle, unsigned long ulFlags);
-char *plibc_ChooseFile(char *pszTitle, unsigned long ulFlags);
-long QueryRegistry(HKEY hMainKey, char *pszKey, char *pszSubKey,
-              char *pszBuffer, long *pdLength);
+  BOOL _plibc_CreateShortcut (const char *pszSrc, const char *pszDest);
+  BOOL _plibc_DereferenceShortcut (char *pszShortcut);
+  char *plibc_ChooseDir (char *pszTitle, unsigned long ulFlags);
+  char *plibc_ChooseFile (char *pszTitle, unsigned long ulFlags);
+  long QueryRegistry (HKEY hMainKey, char *pszKey, char *pszSubKey,
+                      char *pszBuffer, long *pdLength);
 
-BOOL __win_IsHandleMarkedAsBlocking(SOCKET hHandle);
-void __win_SetHandleBlockingMode(SOCKET s, BOOL bBlocking);
-void __win_DiscardHandleBlockingMode(SOCKET s);
-int _win_isSocketValid(int s);
-int plibc_conv_to_win_path(const char *pszUnix, char *pszWindows);
+  BOOL __win_IsHandleMarkedAsBlocking (SOCKET hHandle);
+  void __win_SetHandleBlockingMode (SOCKET s, BOOL bBlocking);
+  void __win_DiscardHandleBlockingMode (SOCKET s);
+  int _win_isSocketValid (int s);
+  int plibc_conv_to_win_path (const char *pszUnix, char *pszWindows);
 
-typedef void (*TPanicProc) (int, char *);
-void plibc_set_panic_proc(TPanicProc proc);
+  typedef void (*TPanicProc) (int, char *);
+  void plibc_set_panic_proc (TPanicProc proc);
 
-int flock(int fd, int operation);
-int fsync(int fildes);
-int inet_pton(int af, const char *src, void *dst);
-int inet_pton4(const char *src, u_char *dst, int pton);
+  int flock (int fd, int operation);
+  int fsync (int fildes);
+  int inet_pton (int af, const char *src, void *dst);
+  int inet_pton4 (const char *src, u_char * dst, int pton);
 #if USE_IPV6
-int inet_pton6(const char *src, u_char *dst);
+  int inet_pton6 (const char *src, u_char * dst);
 #endif
-int truncate(const char *fname, int distance);
-int statfs(const char *path, struct statfs *buf);
-const char *hstrerror(int err);
-void gettimeofday(struct timeval *tp, void *tzp);
-int mkstemp(char *tmplate);
-char *strptime (const char *buf, const char *format, struct tm *tm);
-char *ctime(const time_t *clock);
-char *ctime_r(const time_t *clock, char *buf);
-const char *inet_ntop(int af, const void *src, char *dst, size_t size);
-int plibc_init(char *pszOrg, char *pszApp);
-void plibc_shutdown();
-int plibc_initialized();
-int plibc_conv_to_win_path_ex(const char *pszUnix, char *pszWindows, int 
derefLinks);
-void _SetErrnoFromWinError(long lWinError, char *pszCaller, int iLine);
-void SetErrnoFromWinsockError(long lWinError);
-void SetHErrnoFromWinError(long lWinError);
-void SetErrnoFromHRESULT(HRESULT hRes);
-FILE *_win_fopen(const char *filename, const char *mode);
-DIR *_win_opendir(const char *dirname);
-int _win_open(const char *filename, int oflag, ...);
+  int truncate (const char *fname, int distance);
+  int statfs (const char *path, struct statfs *buf);
+  const char *hstrerror (int err);
+  void gettimeofday (struct timeval *tp, void *tzp);
+  int mkstemp (char *tmplate);
+  char *strptime (const char *buf, const char *format, struct tm *tm);
+  char *ctime (const time_t * clock);
+  char *ctime_r (const time_t * clock, char *buf);
+  const char *inet_ntop (int af, const void *src, char *dst, size_t size);
+  int plibc_init (char *pszOrg, char *pszApp);
+  void plibc_shutdown ();
+  int plibc_initialized ();
+  int plibc_conv_to_win_path_ex (const char *pszUnix, char *pszWindows,
+                                 int derefLinks);
+  void _SetErrnoFromWinError (long lWinError, char *pszCaller, int iLine);
+  void SetErrnoFromWinsockError (long lWinError);
+  void SetHErrnoFromWinError (long lWinError);
+  void SetErrnoFromHRESULT (HRESULT hRes);
+  FILE *_win_fopen (const char *filename, const char *mode);
+  DIR *_win_opendir (const char *dirname);
+  int _win_open (const char *filename, int oflag, ...);
 #ifdef ENABLE_NLS
-char *_win_bindtextdomain(const char *domainname, const char *dirname);
+  char *_win_bindtextdomain (const char *domainname, const char *dirname);
 #endif
-int _win_chdir(const char *path);
-int _win_close(int fd);
-int _win_creat(const char *path, mode_t mode);
-int _win_fstat(int handle, struct stat *buffer);
-int _win_pipe(int *phandles);
-int _win_rmdir(const char *path);
-int _win_access( const char *path, int mode );
-int _win_chmod(const char *filename, int pmode);
-char *realpath(const char *file_name, char *resolved_name);
-long _win_random(void);
-int _win_remove(const char *path);
-int _win_rename(const char *oldname, const char *newname);
-int _win_stat(const char *path, struct stat *buffer);
-int _win_stat64(const char *path, struct stat64 *buffer);
-int _win_unlink(const char *filename);
-int _win_write(int fildes, const void *buf, size_t nbyte);
-int _win_read(int fildes, void *buf, size_t nbyte);
-size_t _win_fwrite(const void *buffer, size_t size, size_t count, FILE 
*stream);
-size_t _win_fread( void *buffer, size_t size, size_t count, FILE *stream );
-int _win_symlink(const char *path1, const char *path2);
-void *_win_mmap(void *start, size_t len, int access, int flags, int fd,
-                unsigned long long offset);
-int _win_munmap(void *start, size_t length);
-int _win_lstat(const char *path, struct stat *buf);
-int _win_lstat64(const char *path, struct stat64 *buf);
-int _win_readlink(const char *path, char *buf, size_t bufsize);
-int _win_accept(SOCKET s, struct sockaddr *addr, int *addrlen);
-int _win_printf(const char *format,...);
-int _win_fprintf(FILE *f,const char *format,...);
-int _win_vprintf(const char *format, va_list ap);
-int _win_vfprintf(FILE *stream, const char *format, va_list arg_ptr);
-int _win_vsprintf(char *dest,const char *format, va_list arg_ptr);
-int _win_vsnprintf(char* str, size_t size, const char *format, va_list 
arg_ptr);
-int _win_snprintf(char *str,size_t size,const char *format,...);
-int _win_sprintf(char *dest,const char *format,...);
-int _win_vsscanf(const char* str, const char* format, va_list arg_ptr);
-int _win_sscanf(const char *str, const char *format, ...);
-int _win_vfscanf(FILE *stream, const char *format, va_list arg_ptr);
-int _win_vscanf(const char *format, va_list arg_ptr);
-int _win_scanf(const char *format, ...);
-int _win_fscanf(FILE *stream, const char *format, ...);
-pid_t _win_waitpid(pid_t pid, int *stat_loc, int options);
-int _win_bind(SOCKET s, const struct sockaddr *name, int namelen);
-int _win_connect(SOCKET s,const struct sockaddr *name, int namelen);
-int _win_getpeername(SOCKET s, struct sockaddr *name,
-                int *namelen);
-int _win_getsockname(SOCKET s, struct sockaddr *name,
-                int *namelen);
-int _win_getsockopt(SOCKET s, int level, int optname, char *optval,
-        int *optlen);
-int _win_listen(SOCKET s, int backlog);
-int _win_recv(SOCKET s, char *buf, int len, int flags);
-int _win_recvfrom(SOCKET s, void *buf, int len, int flags,
-             struct sockaddr *from, int *fromlen);
-int _win_select(int max_fd, fd_set * rfds, fd_set * wfds, fd_set * efds,
-                const struct timeval *tv);
-int _win_send(SOCKET s, const char *buf, int len, int flags);
-int _win_sendto(SOCKET s, const char *buf, int len, int flags,
-                const struct sockaddr *to, int tolen);
-int _win_setsockopt(SOCKET s, int level, int optname, const void *optval,
-                    int optlen);
-int _win_shutdown(SOCKET s, int how);
-SOCKET _win_socket(int af, int type, int protocol);
-struct hostent *_win_gethostbyaddr(const char *addr, int len, int type);
-struct hostent *_win_gethostbyname(const char *name);
-char *_win_strerror(int errnum);
-int IsWinNT();
+  int _win_chdir (const char *path);
+  int _win_close (int fd);
+  int _win_creat (const char *path, mode_t mode);
+  int _win_fstat (int handle, struct stat *buffer);
+  int _win_pipe (int *phandles);
+  int _win_rmdir (const char *path);
+  int _win_access (const char *path, int mode);
+  int _win_chmod (const char *filename, int pmode);
+  char *realpath (const char *file_name, char *resolved_name);
+  long _win_random (void);
+  int _win_remove (const char *path);
+  int _win_rename (const char *oldname, const char *newname);
+  int _win_stat (const char *path, struct stat *buffer);
+  int _win_stat64 (const char *path, struct stat64 *buffer);
+  int _win_unlink (const char *filename);
+  int _win_write (int fildes, const void *buf, size_t nbyte);
+  int _win_read (int fildes, void *buf, size_t nbyte);
+  size_t _win_fwrite (const void *buffer, size_t size, size_t count,
+                      FILE * stream);
+  size_t _win_fread (void *buffer, size_t size, size_t count, FILE * stream);
+  int _win_symlink (const char *path1, const char *path2);
+  void *_win_mmap (void *start, size_t len, int access, int flags, int fd,
+                   unsigned long long offset);
+  int _win_munmap (void *start, size_t length);
+  int _win_lstat (const char *path, struct stat *buf);
+  int _win_lstat64 (const char *path, struct stat64 *buf);
+  int _win_readlink (const char *path, char *buf, size_t bufsize);
+  int _win_accept (SOCKET s, struct sockaddr *addr, int *addrlen);
+  int _win_printf (const char *format, ...);
+  int _win_fprintf (FILE * f, const char *format, ...);
+  int _win_vprintf (const char *format, va_list ap);
+  int _win_vfprintf (FILE * stream, const char *format, va_list arg_ptr);
+  int _win_vsprintf (char *dest, const char *format, va_list arg_ptr);
+  int _win_vsnprintf (char *str, size_t size, const char *format,
+                      va_list arg_ptr);
+  int _win_snprintf (char *str, size_t size, const char *format, ...);
+  int _win_sprintf (char *dest, const char *format, ...);
+  int _win_vsscanf (const char *str, const char *format, va_list arg_ptr);
+  int _win_sscanf (const char *str, const char *format, ...);
+  int _win_vfscanf (FILE * stream, const char *format, va_list arg_ptr);
+  int _win_vscanf (const char *format, va_list arg_ptr);
+  int _win_scanf (const char *format, ...);
+  int _win_fscanf (FILE * stream, const char *format, ...);
+  pid_t _win_waitpid (pid_t pid, int *stat_loc, int options);
+  int _win_bind (SOCKET s, const struct sockaddr *name, int namelen);
+  int _win_connect (SOCKET s, const struct sockaddr *name, int namelen);
+  int _win_getpeername (SOCKET s, struct sockaddr *name, int *namelen);
+  int _win_getsockname (SOCKET s, struct sockaddr *name, int *namelen);
+  int _win_getsockopt (SOCKET s, int level, int optname, char *optval,
+                       int *optlen);
+  int _win_listen (SOCKET s, int backlog);
+  int _win_recv (SOCKET s, char *buf, int len, int flags);
+  int _win_recvfrom (SOCKET s, void *buf, int len, int flags,
+                     struct sockaddr *from, int *fromlen);
+  int _win_select (int max_fd, fd_set * rfds, fd_set * wfds, fd_set * efds,
+                   const struct timeval *tv);
+  int _win_send (SOCKET s, const char *buf, int len, int flags);
+  int _win_sendto (SOCKET s, const char *buf, int len, int flags,
+                   const struct sockaddr *to, int tolen);
+  int _win_setsockopt (SOCKET s, int level, int optname, const void *optval,
+                       int optlen);
+  int _win_shutdown (SOCKET s, int how);
+  SOCKET _win_socket (int af, int type, int protocol);
+  struct hostent *_win_gethostbyaddr (const char *addr, int len, int type);
+  struct hostent *_win_gethostbyname (const char *name);
+  char *_win_strerror (int errnum);
+  int IsWinNT ();
 
 #if !HAVE_STRNDUP
-char *strndup (const char *s, size_t n);
+  char *strndup (const char *s, size_t n);
 #endif
 #if !HAVE_STRNLEN
-size_t strnlen (const char *str, size_t maxlen);
+  size_t strnlen (const char *str, size_t maxlen);
 #endif
 
 #define strcasecmp(a, b) stricmp(a, b)
 #define strncasecmp(a, b, c) strnicmp(a, b, c)
 
-#endif /* WINDOWS */
+#endif                          /* WINDOWS */
 
 #ifndef WINDOWS
- #define DIR_SEPARATOR '/'
- #define DIR_SEPARATOR_STR "/"
- #define PATH_SEPARATOR ';'
- #define PATH_SEPARATOR_STR ";"
- #define NEWLINE "\n"
+#define DIR_SEPARATOR '/'
+#define DIR_SEPARATOR_STR "/"
+#define PATH_SEPARATOR ';'
+#define PATH_SEPARATOR_STR ";"
+#define NEWLINE "\n"
 
 #ifdef ENABLE_NLS
- #define BINDTEXTDOMAIN(d, n) bindtextdomain(d, n)
+#define BINDTEXTDOMAIN(d, n) bindtextdomain(d, n)
 #endif
- #define CREAT(p, m) creat(p, m)
- #undef FOPEN
- #define FOPEN(f, m) fopen(f, m)
- #define OPENDIR(d) opendir(d)
- #define OPEN open
- #define CHDIR(d) chdir(d)
- #define CLOSE(f) close(f)
- #define RMDIR(f) rmdir(f)
- #define ACCESS(p, m) access(p, m)
- #define CHMOD(f, p) chmod(f, p)
- #define FSTAT(h, b) fstat(h, b)
- #define PIPE(h) pipe(h)
- #define REMOVE(p) remove(p)
- #define RENAME(o, n) rename(o, n)
- #define STAT(p, b) stat(p, b)
- #define STAT64(p, b) stat64(p, b)
- #define UNLINK(f) unlink(f)
- #define WRITE(f, b, n) write(f, b, n)
- #define READ(f, b, n) read(f, b, n)
- #define GN_FREAD(b, s, c, f) fread(b, s, c, f)
- #define GN_FWRITE(b, s, c, f) fwrite(b, s, c, f)
- #define SYMLINK(a, b) symlink(a, b)
- #define MMAP(s, l, p, f, d, o) mmap(s, l, p, f, d, o)
- #define MUNMAP(s, l) munmap(s, l)
- #define STRERROR(i) strerror(i)
- #define RANDOM() random()
- #define READLINK(p, b, s) readlink(p, b, s)
- #define LSTAT(p, b) lstat(p, b)
- #define LSTAT64(p, b) lstat64(p, b)
- #define PRINTF printf
- #define FPRINTF fprintf
- #define VPRINTF(f, a) vprintf(f, a)
- #define VFPRINTF(s, f, a) vfprintf(s, f, a)
- #define VSPRINTF(d, f, a) vsprintf(d, f, a)
- #define VSNPRINTF(str, size, fmt, a) vsnprintf(str, size, fmt, a)
- #define _REAL_SNPRINTF snprintf
- #define SPRINTF sprintf
- #define VSSCANF(s, f, a) vsscanf(s, f, a)
- #define SSCANF sscanf
- #define VFSCANF(s, f, a) vfscanf(s, f, a)
- #define VSCANF(f, a) vscanf(f, a)
- #define SCANF scanf
- #define FSCANF fscanf
- #define WAITPID(p, s, o) waitpid(p, s, o)
- #define ACCEPT(s, a, l) accept(s, a, l)
- #define BIND(s, n, l) bind(s, n, l)
- #define CONNECT(s, n, l) connect(s, n, l)
- #define GETPEERNAME(s, n, l) getpeername(s, n, l)
- #define GETSOCKNAME(s, n, l) getsockname(s, n, l)
- #define GETSOCKOPT(s, l, o, v, p) getsockopt(s, l, o, v, p)
- #define LISTEN(s, b) listen(s, b)
- #define RECV(s, b, l, f) recv(s, b, l, f)
- #define RECVFROM(s, b, l, f, r, o) recvfrom(s, b, l, f, r, o)
- #define SELECT(n, r, w, e, t) select(n, r, w, e, t)
- #define SEND(s, b, l, f) send(s, b, l, f)
- #define SENDTO(s, b, l, f, o, n) sendto(s, b, l, f, o, n)
- #define SETSOCKOPT(s, l, o, v, n) setsockopt(s, l, o, v, n)
- #define SHUTDOWN(s, h) shutdown(s, h)
- #define SOCKET(a, t, p) socket(a, t, p)
- #define GETHOSTBYADDR(a, l, t) gethostbyname(a, l, t)
- #define GETHOSTBYNAME(n) gethostbyname(n)
+#define CREAT(p, m) creat(p, m)
+#undef FOPEN
+#define FOPEN(f, m) fopen(f, m)
+#define OPENDIR(d) opendir(d)
+#define OPEN open
+#define CHDIR(d) chdir(d)
+#define CLOSE(f) close(f)
+#define RMDIR(f) rmdir(f)
+#define ACCESS(p, m) access(p, m)
+#define CHMOD(f, p) chmod(f, p)
+#define FSTAT(h, b) fstat(h, b)
+#define PIPE(h) pipe(h)
+#define REMOVE(p) remove(p)
+#define RENAME(o, n) rename(o, n)
+#define STAT(p, b) stat(p, b)
+#define STAT64(p, b) stat64(p, b)
+#define UNLINK(f) unlink(f)
+#define WRITE(f, b, n) write(f, b, n)
+#define READ(f, b, n) read(f, b, n)
+#define GN_FREAD(b, s, c, f) fread(b, s, c, f)
+#define GN_FWRITE(b, s, c, f) fwrite(b, s, c, f)
+#define SYMLINK(a, b) symlink(a, b)
+#define MMAP(s, l, p, f, d, o) mmap(s, l, p, f, d, o)
+#define MUNMAP(s, l) munmap(s, l)
+#define STRERROR(i) strerror(i)
+#define RANDOM() random()
+#define READLINK(p, b, s) readlink(p, b, s)
+#define LSTAT(p, b) lstat(p, b)
+#define LSTAT64(p, b) lstat64(p, b)
+#define PRINTF printf
+#define FPRINTF fprintf
+#define VPRINTF(f, a) vprintf(f, a)
+#define VFPRINTF(s, f, a) vfprintf(s, f, a)
+#define VSPRINTF(d, f, a) vsprintf(d, f, a)
+#define VSNPRINTF(str, size, fmt, a) vsnprintf(str, size, fmt, a)
+#define _REAL_SNPRINTF snprintf
+#define SPRINTF sprintf
+#define VSSCANF(s, f, a) vsscanf(s, f, a)
+#define SSCANF sscanf
+#define VFSCANF(s, f, a) vfscanf(s, f, a)
+#define VSCANF(f, a) vscanf(f, a)
+#define SCANF scanf
+#define FSCANF fscanf
+#define WAITPID(p, s, o) waitpid(p, s, o)
+#define ACCEPT(s, a, l) accept(s, a, l)
+#define BIND(s, n, l) bind(s, n, l)
+#define CONNECT(s, n, l) connect(s, n, l)
+#define GETPEERNAME(s, n, l) getpeername(s, n, l)
+#define GETSOCKNAME(s, n, l) getsockname(s, n, l)
+#define GETSOCKOPT(s, l, o, v, p) getsockopt(s, l, o, v, p)
+#define LISTEN(s, b) listen(s, b)
+#define RECV(s, b, l, f) recv(s, b, l, f)
+#define RECVFROM(s, b, l, f, r, o) recvfrom(s, b, l, f, r, o)
+#define SELECT(n, r, w, e, t) select(n, r, w, e, t)
+#define SEND(s, b, l, f) send(s, b, l, f)
+#define SENDTO(s, b, l, f, o, n) sendto(s, b, l, f, o, n)
+#define SETSOCKOPT(s, l, o, v, n) setsockopt(s, l, o, v, n)
+#define SHUTDOWN(s, h) shutdown(s, h)
+#define SOCKET(a, t, p) socket(a, t, p)
+#define GETHOSTBYADDR(a, l, t) gethostbyname(a, l, t)
+#define GETHOSTBYNAME(n) gethostbyname(n)
 #else
- #define DIR_SEPARATOR '\\'
- #define DIR_SEPARATOR_STR "\\"
- #define PATH_SEPARATOR ':'
- #define PATH_SEPARATOR_STR ":"
- #define NEWLINE "\r\n"
+#define DIR_SEPARATOR '\\'
+#define DIR_SEPARATOR_STR "\\"
+#define PATH_SEPARATOR ':'
+#define PATH_SEPARATOR_STR ":"
+#define NEWLINE "\r\n"
 
 #ifdef ENABLE_NLS
- #define BINDTEXTDOMAIN(d, n) _win_bindtextdomain(d, n)
+#define BINDTEXTDOMAIN(d, n) _win_bindtextdomain(d, n)
 #endif
- #define CREAT(p, m) _win_creat(p, m)
- #define FOPEN(f, m) _win_fopen(f, m)
- #define OPENDIR(d) _win_opendir(d)
- #define OPEN _win_open
- #define CHDIR(d) _win_chdir(d)
- #define CLOSE(f) _win_close(f)
- #define FSTAT(h, b) _win_fstat(h, b)
- #define RMDIR(f) _win_rmdir(f)
- #define ACCESS(p, m) _win_access(p, m)
- #define CHMOD(f, p) _win_chmod(f, p)
- #define PIPE(h) _win_pipe(h)
- #define RANDOM() _win_random()
- #define REMOVE(p) _win_remove(p)
- #define RENAME(o, n) _win_rename(o, n)
- #define STAT(p, b) _win_stat(p, b)
- #define STAT64(p, b) _win_stat64(p, b)
- #define UNLINK(f) _win_unlink(f)
- #define WRITE(f, b, n) _win_write(f, b, n)
- #define READ(f, b, n) _win_read(f, b, n)
- #define GN_FREAD(b, s, c, f) _win_fread(b, s, c, f)
- #define GN_FWRITE(b, s, c, f) _win_fwrite(b, s, c, f)
- #define SYMLINK(a, b) _win_symlink(a, b)
- #define MMAP(s, l, p, f, d, o) _win_mmap(s, l, p, f, d, o)
- #define MUNMAP(s, l) _win_munmap(s, l)
- #define STRERROR(i) _win_strerror(i)
- #define READLINK(p, b, s) _win_readlink(p, b, s)
- #define LSTAT(p, b) _win_lstat(p, b)
- #define LSTAT64(p, b) _win_lstat64(p, b)
- #define PRINTF(f, ...) _win_printf(f , __VA_ARGS__)
- #define FPRINTF(fil, fmt, ...) _win_fprintf(fil, fmt, __VA_ARGS__)
- #define VPRINTF(f, a) _win_vprintf(f, a)
- #define VFPRINTF(s, f, a) _win_vfprintf(s, f, a)
- #define VSPRINTF(d, f, a) _win_vsprintf(d, f, a)
- #define VSNPRINTF(str, size, fmt, a) _win_vsnprintf(str, size, fmt, a)
- #define _REAL_SNPRINTF(str, size, fmt, ...) _win_snprintf(str, size, fmt, 
__VA_ARGS__)
- #define SPRINTF(d, f, ...) _win_sprintf(d, f, __VA_ARGS__)
- #define VSSCANF(s, f, a) _win_vsscanf(s, f, a)
- #define SSCANF(s, f, ...) _win_sscanf(s, f, __VA_ARGS__)
- #define VFSCANF(s, f, a) _win_vfscanf(s, f, a)
- #define VSCANF(f, a) _win_vscanf(f, a)
- #define SCANF(f, ...) _win_scanf(f, __VA_ARGS__)
- #define FSCANF(s, f, ...) _win_fscanf(s, f, __VA_ARGS__)
- #define WAITPID(p, s, o) _win_waitpid(p, s, o)
- #define ACCEPT(s, a, l) _win_accept(s, a, l)
- #define BIND(s, n, l) _win_bind(s, n, l)
- #define CONNECT(s, n, l) _win_connect(s, n, l)
- #define GETPEERNAME(s, n, l) _win_getpeername(s, n, l)
- #define GETSOCKNAME(s, n, l) _win_getsockname(s, n, l)
- #define GETSOCKOPT(s, l, o, v, p) _win_getsockopt(s, l, o, v, p)
- #define LISTEN(s, b) _win_listen(s, b)
- #define RECV(s, b, l, f) _win_recv(s, b, l, f)
- #define RECVFROM(s, b, l, f, r, o) _win_recvfrom(s, b, l, f, r, o)
- #define SELECT(n, r, w, e, t) _win_select(n, r, w, e, t)
- #define SEND(s, b, l, f) _win_send(s, b, l, f)
- #define SENDTO(s, b, l, f, o, n) _win_sendto(s, b, l, f, o, n)
- #define SETSOCKOPT(s, l, o, v, n) _win_setsockopt(s, l, o, v, n)
- #define SHUTDOWN(s, h) _win_shutdown(s, h)
- #define SOCKET(a, t, p) _win_socket(a, t, p)
- #define GETHOSTBYADDR(a, l, t) _win_gethostbyname(a, l, t)
- #define GETHOSTBYNAME(n) _win_gethostbyname(n)
+#define CREAT(p, m) _win_creat(p, m)
+#define FOPEN(f, m) _win_fopen(f, m)
+#define OPENDIR(d) _win_opendir(d)
+#define OPEN _win_open
+#define CHDIR(d) _win_chdir(d)
+#define CLOSE(f) _win_close(f)
+#define FSTAT(h, b) _win_fstat(h, b)
+#define RMDIR(f) _win_rmdir(f)
+#define ACCESS(p, m) _win_access(p, m)
+#define CHMOD(f, p) _win_chmod(f, p)
+#define PIPE(h) _win_pipe(h)
+#define RANDOM() _win_random()
+#define REMOVE(p) _win_remove(p)
+#define RENAME(o, n) _win_rename(o, n)
+#define STAT(p, b) _win_stat(p, b)
+#define STAT64(p, b) _win_stat64(p, b)
+#define UNLINK(f) _win_unlink(f)
+#define WRITE(f, b, n) _win_write(f, b, n)
+#define READ(f, b, n) _win_read(f, b, n)
+#define GN_FREAD(b, s, c, f) _win_fread(b, s, c, f)
+#define GN_FWRITE(b, s, c, f) _win_fwrite(b, s, c, f)
+#define SYMLINK(a, b) _win_symlink(a, b)
+#define MMAP(s, l, p, f, d, o) _win_mmap(s, l, p, f, d, o)
+#define MUNMAP(s, l) _win_munmap(s, l)
+#define STRERROR(i) _win_strerror(i)
+#define READLINK(p, b, s) _win_readlink(p, b, s)
+#define LSTAT(p, b) _win_lstat(p, b)
+#define LSTAT64(p, b) _win_lstat64(p, b)
+#define PRINTF(f, ...) _win_printf(f , __VA_ARGS__)
+#define FPRINTF(fil, fmt, ...) _win_fprintf(fil, fmt, __VA_ARGS__)
+#define VPRINTF(f, a) _win_vprintf(f, a)
+#define VFPRINTF(s, f, a) _win_vfprintf(s, f, a)
+#define VSPRINTF(d, f, a) _win_vsprintf(d, f, a)
+#define VSNPRINTF(str, size, fmt, a) _win_vsnprintf(str, size, fmt, a)
+#define _REAL_SNPRINTF(str, size, fmt, ...) _win_snprintf(str, size, fmt, 
__VA_ARGS__)
+#define SPRINTF(d, f, ...) _win_sprintf(d, f, __VA_ARGS__)
+#define VSSCANF(s, f, a) _win_vsscanf(s, f, a)
+#define SSCANF(s, f, ...) _win_sscanf(s, f, __VA_ARGS__)
+#define VFSCANF(s, f, a) _win_vfscanf(s, f, a)
+#define VSCANF(f, a) _win_vscanf(f, a)
+#define SCANF(f, ...) _win_scanf(f, __VA_ARGS__)
+#define FSCANF(s, f, ...) _win_fscanf(s, f, __VA_ARGS__)
+#define WAITPID(p, s, o) _win_waitpid(p, s, o)
+#define ACCEPT(s, a, l) _win_accept(s, a, l)
+#define BIND(s, n, l) _win_bind(s, n, l)
+#define CONNECT(s, n, l) _win_connect(s, n, l)
+#define GETPEERNAME(s, n, l) _win_getpeername(s, n, l)
+#define GETSOCKNAME(s, n, l) _win_getsockname(s, n, l)
+#define GETSOCKOPT(s, l, o, v, p) _win_getsockopt(s, l, o, v, p)
+#define LISTEN(s, b) _win_listen(s, b)
+#define RECV(s, b, l, f) _win_recv(s, b, l, f)
+#define RECVFROM(s, b, l, f, r, o) _win_recvfrom(s, b, l, f, r, o)
+#define SELECT(n, r, w, e, t) _win_select(n, r, w, e, t)
+#define SEND(s, b, l, f) _win_send(s, b, l, f)
+#define SENDTO(s, b, l, f, o, n) _win_sendto(s, b, l, f, o, n)
+#define SETSOCKOPT(s, l, o, v, n) _win_setsockopt(s, l, o, v, n)
+#define SHUTDOWN(s, h) _win_shutdown(s, h)
+#define SOCKET(a, t, p) _win_socket(a, t, p)
+#define GETHOSTBYADDR(a, l, t) _win_gethostbyname(a, l, t)
+#define GETHOSTBYNAME(n) _win_gethostbyname(n)
 #endif
 
 
@@ -587,6 +589,6 @@
 #endif
 
 
-#endif //_PLIBC_H_
+#endif                          //_PLIBC_H_
 
 /* end of plibc.h */

Modified: GNUnet/src/transports/http.c
===================================================================
--- GNUnet/src/transports/http.c        2007-09-08 23:46:46 UTC (rev 5611)
+++ GNUnet/src/transports/http.c        2007-09-08 23:49:09 UTC (rev 5612)
@@ -22,9 +22,6 @@
  * @file transports/http.c
  * @brief Implementation of the HTTP transport service
  * @author Christian Grothoff
- *
- * TODO:
- * - test GETs (gnunet-transport-check does NOT!)
  */
 
 #include "gnunet_util.h"
@@ -37,7 +34,7 @@
 #include "platform.h"
 #include "ip.h"
 
-#define DEBUG_HTTP YES
+#define DEBUG_HTTP NO
 
 /**
  * Disable GET (for debugging only!).  Must be YES
@@ -193,9 +190,67 @@
 };
 
 /**
+ * Server-side data for a GET request.
+ */
+struct MHDGetData {
+  
+  /**
+   * This is a linked list.
+   */
+  struct MHDGetData * next;
+
+  /**
+   * mutex for synchronized access to struct
+   */
+  struct MUTEX *lock;
+
+  /**
+   * MHD connection handle for this request.
+   */
+  struct MHD_Connection *session;
+  
+  /**
+   * GET session response handle
+   */
+  struct MHD_Response *get;
+
+  /**
+   * My HTTP session.
+   */
+  struct HTTPSession * httpsession;
+
+  /**
+   * The write buffer (for sending GET response)
+   */
+  char *wbuff;
+  
+  /**
+   * What was the last time we were able to
+   * transmit data using the current get handle?
+   */
+  cron_t last_get_activity;
+
+  /**
+   * Current write position in wbuff
+   */
+  unsigned int woff;
+  
+  /**
+   * Number of valid bytes in wbuff (starting at woff)
+   */
+  unsigned int wpos;
+  
+  /**
+   * Size of the write buffer.
+   */
+  unsigned int wsize;
+
+};
+
+/**
  * Transport Session handle.
  */
-typedef struct
+typedef struct HTTPSession
 {
 
   /**
@@ -247,35 +302,10 @@
 
 #if DO_GET
       /**
-       * GET session response handle
+       * Active GET requests (linked list; most
+       * recent received GET is the head of the list).
        */
-      struct MHD_Response *get;
-
-      /**
-       * The write buffer (for sending GET response)
-       */
-      char *wbuff;
-
-      /**
-       * What was the last time we were able to
-       * transmit data using the current get handle?
-       */
-      cron_t last_get_activity;
-
-      /**
-       * Current write position in wbuff
-       */
-      unsigned int woff;
-
-      /**
-       * Number of valid bytes in wbuff (starting at woff)
-       */
-      unsigned int wpos;
-
-      /**
-       * Size of the write buffer.
-       */
-      unsigned int wsize;
+      struct MHDGetData * gets;
 #endif
 
     } server;
@@ -513,6 +543,10 @@
   struct HTTPPutData *next;
   struct MHDPutData *mpos;
   struct MHDPutData *mnext;
+#if DO_GET
+  struct MHDGetData *gpos;
+  struct MHDGetData *gnext;
+#endif
   struct MHD_Response *r;
   int i;
 
@@ -563,30 +597,72 @@
           FREE (mpos);
           mpos = mnext;
         }
+      httpsession->cs.server.puts = NULL;
 #if DO_GET
-      GROW (httpsession->cs.server.wbuff, httpsession->cs.server.wsize, 0);
-      if (httpsession->cs.server.get != NULL)
-        {
-          r = httpsession->cs.server.get;
-          httpsession->cs.server.get = NULL;
+      gpos = httpsession->cs.server.gets;
+      while (gpos != NULL) 
+       {
+         GROW (gpos->wbuff, 
+               gpos->wsize, 0);
+          r = gpos->get;
+          gpos->get = NULL;
           /* contentReaderFreeCallback WILL
              destroy session->lock/tesssion */
-          MHD_destroy_response (r);
+         gnext = gpos->next;
+         MHD_destroy_response (r); 
+         gpos = gnext;
         }
-      else
-        {
-          /* If we never received a GET request,
-             we did not create a response... */
-          MUTEX_DESTROY (httpsession->lock);
-          FREE (httpsession->tsession);
-          FREE (httpsession);
-        }
-#else
+      httpsession->cs.server.gets = NULL;
+#endif
       MUTEX_DESTROY (httpsession->lock);
       FREE (httpsession->tsession);
       FREE (httpsession);
+    }
+}
+
+/**
+ * MHD is done handling a request.  Cleanup
+ * the respective transport state.
+ */
+static void
+requestCompletedCallback(void * unused,
+                        struct MHD_Connection * session,
+                        void ** httpSessionCache) {
+  HTTPSession * httpsession = *httpSessionCache;
+  struct MHDPutData * pprev;
+  struct MHDPutData * ppos;
+#if DO_GET
+  struct MHDGetData * gprev;
+  struct MHDGetData * gpos;
 #endif
+
+  if (httpsession == NULL)
+    return; /* oops */
+  GE_ASSERT(NULL, !httpsession->is_client);
+  pprev = NULL;
+  ppos = httpsession->cs.server.puts;
+  while (ppos != NULL) {
+    if (ppos->session == session) {
+      ppos->last_activity = 0;
+      signal_select();
+      return;
     }
+    pprev = ppos;
+    ppos = ppos->next;
+  }
+#if DO_GET
+  gprev = NULL;
+  gpos = httpsession->cs.server.gets;
+  while (gpos != NULL) {
+    if (gpos->session == session) {
+      gpos->last_get_activity = 0;
+      signal_select();
+      return;
+    }
+    gprev = gpos;
+    gpos = gpos->next;
+  }
+#endif
 }
 
 /**
@@ -786,26 +862,21 @@
 static int
 contentReaderCallback (void *cls, size_t pos, char *buf, int max)
 {
-  HTTPSession *session = cls;
+  struct MHDGetData * mgd = cls;
   cron_t now;
 
-  MUTEX_LOCK (session->lock);
-  if (session->destroyed)
-    {
-      MUTEX_UNLOCK (session->lock);
-      return -1;
-    }
-  if (session->cs.server.wpos < max)
-    max = session->cs.server.wpos;
-  memcpy (buf, &session->cs.server.wbuff[session->cs.server.woff], max);
-  session->cs.server.wpos -= max;
-  session->cs.server.woff += max;
+  MUTEX_LOCK (mgd->lock);
+  if (mgd->wpos < max)
+    max = mgd->wpos;
+  memcpy (buf, &mgd->wbuff[mgd->woff], max);
+  mgd->wpos -= max;
+  mgd->woff += max;
   now = get_time ();
   if (max > 0)
-    session->cs.server.last_get_activity = now;
-  if (session->cs.server.wpos == 0)
-    session->cs.server.woff = 0;
-  MUTEX_UNLOCK (session->lock);
+    mgd->last_get_activity = now;
+  if (mgd->wpos == 0)
+    mgd->woff = 0;
+  MUTEX_UNLOCK (mgd->lock);
 #if DEBUG_HTTP
   GE_LOG (coreAPI->ectx,
           GE_DEBUG | GE_REQUEST | GE_USER,
@@ -813,6 +884,9 @@
 #endif
   if (stats != NULL)
     stats->change (stat_bytesSent, max);
+  if ( (max == 0) &&
+       (mgd->httpsession->cs.server.gets != mgd) )
+    return -1; /* end of response (another GET replaces this one) */
   return max;
 }
 #endif
@@ -825,12 +899,11 @@
 static void
 contentReaderFreeCallback (void *cls)
 {
-  HTTPSession *session = cls;
+  struct MHDGetData * mgd = cls;
 
-  GE_ASSERT (NULL, session->cs.server.get == NULL);
-  MUTEX_DESTROY (session->lock);
-  FREE (session->tsession);
-  FREE (session);
+  GE_ASSERT (NULL, mgd->get == NULL);
+  MUTEX_DESTROY(mgd->lock);
+  FREE (mgd);
 }
 #endif
 
@@ -848,12 +921,14 @@
                        const char *method,
                        const char *version,
                        const char *upload_data,
-                       unsigned int *upload_data_size, void **unused)
+                       unsigned int *upload_data_size,
+                      void **httpSessionCache)
 {
   TSession *tsession;
-  struct MHD_Response *response;
   struct MHDPutData *put;
+  struct MHDGetData *get;
   HTTPSession *httpSession;
+  struct MHD_Response * response;
   HashCode512 client;
   int i;
   unsigned int have;
@@ -871,20 +946,22 @@
     }
 
   /* check if we already have a session for this */
-  httpSession = NULL;
-  MUTEX_LOCK (httplock);
-  for (i = 0; i < tsessionCount; i++)
+  httpSession = *httpSessionCache;
+  if (httpSession == NULL) 
     {
-      tsession = tsessions[i];
-      httpSession = tsession->internal;
-      if ((0 == memcmp (&httpSession->sender, &client, sizeof (HashCode512)))
-          && (httpSession->is_client == NO))
-        break;
-      tsession = NULL;
-      httpSession = NULL;
+      MUTEX_LOCK (httplock);
+      for (i = 0; i < tsessionCount; i++)
+       {
+         tsession = tsessions[i];
+         httpSession = tsession->internal;
+         if ((0 == memcmp (&httpSession->sender, &client, sizeof 
(HashCode512)))
+             && (httpSession->is_client == NO))
+           break;
+         tsession = NULL;
+         httpSession = NULL;
+       }
+      MUTEX_UNLOCK (httplock);
     }
-  MUTEX_UNLOCK (httplock);
-
   /* create new session if necessary */
   if (httpSession == NULL)
     {
@@ -907,6 +984,7 @@
       httpSession->tsession = tsession;
       addTSession (tsession);
     }
+  *httpSessionCache = httpSession;
   MUTEX_LOCK (httpSession->lock);
 #if DO_GET
   if (0 == strcasecmp (MHD_HTTP_METHOD_GET, method))
@@ -919,18 +997,20 @@
 
       /* handle get; create response object if we do not 
          have one already */
-      response = httpSession->cs.server.get;
-      if (response == NULL)
-        {
-          response = MHD_create_response_from_callback (-1,
-                                                        64 * 1024,
-                                                        contentReaderCallback,
-                                                        httpSession,
-                                                        
contentReaderFreeCallback);
-          httpSession->cs.server.get = response;
-        }
-      httpSession->cs.server.last_get_activity = get_time ();
-      MHD_queue_response (session, MHD_HTTP_OK, response);
+      get = MALLOC(sizeof(struct MHDGetData));
+      memset(get, 0, sizeof(struct MHDGetData));
+      get->lock = MUTEX_CREATE(NO);      
+      get->next = httpSession->cs.server.gets;
+      httpSession->cs.server.gets = get;
+      get->session = session;
+      get->httpsession = httpSession;
+      get->last_get_activity = get_time();
+      get->get = MHD_create_response_from_callback (-1,
+                                                   64 * 1024,
+                                                   contentReaderCallback,
+                                                   get,
+                                                   contentReaderFreeCallback);
+      MHD_queue_response (session, MHD_HTTP_OK, get->get);
       MUTEX_UNLOCK (httpSession->lock);
       return MHD_YES;
     }
@@ -1400,6 +1480,8 @@
 httpTestWouldTry (TSession * tsession, const unsigned int size, int important)
 {
   HTTPSession *httpSession = tsession->internal;
+  struct MHDGetData * get;
+  int ret;
 
   if (size >= MAX_BUFFER_SIZE - sizeof (MESSAGE_HEADER))
     {
@@ -1421,12 +1503,22 @@
   else
     {
       /* server */
-      if (httpSession->cs.server.wsize == 0)
-        return YES;
-      if ((httpSession->cs.server.wpos + size > httpSession->cs.server.wsize)
-          && (important != YES))
-        return NO;
-      return YES;
+      MUTEX_LOCK(httpSession->lock);
+      get = httpSession->cs.server.gets;
+      if (get == NULL)
+       ret = NO;      
+      else {
+       if (get->wsize == 0)
+         ret = YES;
+       else
+         if ( (get->wpos + size > get->wsize)
+              && (important != YES) )
+           ret = NO;
+         else
+           ret = YES;
+      }
+      MUTEX_UNLOCK(httpSession->lock);
+      return ret;
     }
 }
 
@@ -1447,6 +1539,7 @@
   struct HTTPPutData *putData;
   MESSAGE_HEADER *hdr;
 #if DO_GET
+  struct MHDGetData *getData;
   char *tmp;
 #endif
 
@@ -1508,52 +1601,60 @@
 #endif
 #if DO_GET
   MUTEX_LOCK (httpSession->lock);
-  if (httpSession->cs.server.wsize == 0)
-    GROW (httpSession->cs.server.wbuff, httpSession->cs.server.wsize,
+  getData = httpSession->cs.server.gets;
+  if (getData == NULL) {
+    MUTEX_UNLOCK (httpSession->lock);
+    return SYSERR;    
+  }
+  MUTEX_LOCK(getData->lock);
+  if (getData->wsize == 0)
+    GROW (getData->wbuff, getData->wsize,
           HTTP_BUF_SIZE);
   size += sizeof (MESSAGE_HEADER);
-  if (httpSession->cs.server.wpos + size > httpSession->cs.server.wsize)
+  if (getData->wpos + size > getData->wsize)
     {
       /* need to grow or discard */
       if (!important)
         {
+          MUTEX_UNLOCK (getData->lock);
           MUTEX_UNLOCK (httpSession->lock);
           return NO;
         }
-      tmp = MALLOC (httpSession->cs.server.wpos + size);
+      tmp = MALLOC (getData->wpos + size);
       memcpy (tmp,
-              &httpSession->cs.server.wbuff[httpSession->cs.server.woff],
-              httpSession->cs.server.wpos);
-      hdr = (MESSAGE_HEADER *) & tmp[httpSession->cs.server.wpos];
+              &getData->wbuff[getData->woff],
+              getData->wpos);
+      hdr = (MESSAGE_HEADER *) & tmp[getData->wpos];
       hdr->type = htons (0);
       hdr->size = htons (size);
       memcpy (&hdr[1], msg, size - sizeof (MESSAGE_HEADER));
-      FREE (httpSession->cs.server.wbuff);
-      httpSession->cs.server.wbuff = tmp;
-      httpSession->cs.server.wsize = httpSession->cs.server.wpos + size;
-      httpSession->cs.server.woff = 0;
-      httpSession->cs.server.wpos = httpSession->cs.server.wpos + size;
+      FREE (getData->wbuff);
+      getData->wbuff = tmp;
+      getData->wsize = getData->wpos + size;
+      getData->woff = 0;
+      getData->wpos = getData->wpos + size;
     }
   else
     {
       /* fits without growing */
-      if (httpSession->cs.server.wpos + httpSession->cs.server.woff + size >
-          httpSession->cs.server.wsize)
+      if (getData->wpos + getData->woff + size >
+          getData->wsize)
         {
           /* need to compact first */
-          memmove (httpSession->cs.server.wbuff,
-                   &httpSession->cs.server.wbuff[httpSession->cs.server.woff],
-                   httpSession->cs.server.wpos);
-          httpSession->cs.server.woff = 0;
+          memmove (getData->wbuff,
+                   &getData->wbuff[getData->woff],
+                   getData->wpos);
+          getData->woff = 0;
         }
       /* append */
-      hdr = (MESSAGE_HEADER *) & httpSession->cs.server.
-        wbuff[httpSession->cs.server.woff + httpSession->cs.server.wpos];
+      hdr = (MESSAGE_HEADER *) &getData->
+        wbuff[getData->woff + getData->wpos];
       hdr->size = htons (size);
       hdr->type = htons (0);
       memcpy (&hdr[1], msg, size - sizeof (MESSAGE_HEADER));
-      httpSession->cs.server.wpos += size;
+      getData->wpos += size;
     }
+  MUTEX_UNLOCK (getData->lock);
   MUTEX_UNLOCK (httpSession->lock);
 #endif
   return OK;
@@ -1574,6 +1675,11 @@
   struct HTTPPutData *pos;
   struct MHDPutData *mpos;
   struct MHDPutData *mprev;
+#if DO_GET
+  struct MHD_Response * r;
+  struct MHDGetData *gpos;
+  struct MHDGetData *gnext;
+#endif
   cron_t now;
 
   MUTEX_LOCK (httplock);
@@ -1662,19 +1768,34 @@
             }
 
           /* ! s->is_client */
+#if DO_GET
+         gpos = s->cs.server.gets;
+         while (gpos != NULL) {
+           gnext = gpos->next;
+           gpos->next = NULL;
+           if ( (gpos->last_get_activity + HTTP_TIMEOUT < now) ||
+                (gpos != s->cs.server.gets) ) {
+             if (gpos == s->cs.server.gets)
+               s->cs.server.gets = NULL;
+             r = gpos->get;
+             gpos->get = NULL;
+             MHD_destroy_response (r);
+           }
+           gpos = gnext;
+         }
+#endif
           if (
 #if DO_GET
-               (s->cs.server.last_get_activity + HTTP_TIMEOUT < now) &&
+             (s->cs.server.gets == NULL) &&
 #endif
-               (s->users == 0))
+             (s->users == 0))
             {
               MUTEX_UNLOCK (s->lock);
 #if DO_GET
 #if DEBUG_HTTP
               GE_LOG (coreAPI->ectx,
                       GE_DEBUG | GE_REQUEST | GE_USER,
-                      "HTTP transport destroys old (%llu ms) unused server 
session\n",
-                      now - s->cs.server.last_get_activity);
+                      "HTTP transport destroys unused server session\n");
 #endif
 #endif
               destroy_tsession (tsessions[i]);
@@ -1753,7 +1874,7 @@
         }
       while ((mret == CURLM_CALL_MULTI_PERFORM) && (http_running == YES));
       if (FD_ISSET (signal_pipe[0], &rs))
-        read (signal_pipe[0], buf, sizeof (buf));
+        read (signal_pipe[0], buf, 1);
       if ((mret != CURLM_OK) && (mret != CURLM_CALL_MULTI_PERFORM))
         GE_LOG (coreAPI->ectx,
                 GE_ERROR | GE_ADMIN | GE_USER | GE_BULK,
@@ -1799,7 +1920,10 @@
                                      MHD_OPTION_CONNECTION_MEMORY_LIMIT,
                                      (unsigned int) 1024 * 128,
                                      MHD_OPTION_CONNECTION_LIMIT,
-                                     (unsigned int) 128, MHD_OPTION_END);
+                                     (unsigned int) 128, 
+                                    MHD_OPTION_NOTIFY_COMPLETED,
+                                    &requestCompletedCallback, NULL,
+                                    MHD_OPTION_END);
     }
   if (0 != PIPE (signal_pipe))
     {
@@ -1809,6 +1933,8 @@
       mhd_daemon = NULL;
       return SYSERR;
     }
+  network_make_pipe_nonblocking(coreAPI->ectx,
+                               signal_pipe[0]);
   http_running = YES;
   curl_thread = PTHREAD_CREATE (&curl_runner, NULL, 32 * 1024);
   if (curl_thread == NULL)

Modified: GNUnet/src/transports/test_repeat.c
===================================================================
--- GNUnet/src/transports/test_repeat.c 2007-09-08 23:46:46 UTC (rev 5611)
+++ GNUnet/src/transports/test_repeat.c 2007-09-08 23:49:09 UTC (rev 5612)
@@ -36,7 +36,7 @@
 
 #define ROUNDS 10
 
-#define XROUNDS 2
+#define XROUNDS 10
 
 #define OFFSET 10
 
@@ -292,8 +292,8 @@
              pos++;
          }
        pos = 0;
-       while ((pos++ < 100) && (msg_count < ROUNDS * (xround+1) ))
-         PTHREAD_SLEEP (50 * cronMILLIS);
+       while ((pos++ < 100) && (msg_count < ROUNDS * (xround+1) )) 
+         PTHREAD_SLEEP (50 * cronMILLIS);      
        if (msg_count < ROUNDS * (xround + 1))
          {
            if (NULL == strstr (argv[0], "udp"))

Modified: GNUnet/src/util/network/io.c
===================================================================
--- GNUnet/src/util/network/io.c        2007-09-08 23:46:46 UTC (rev 5611)
+++ GNUnet/src/util/network/io.c        2007-09-08 23:49:09 UTC (rev 5612)
@@ -529,4 +529,5 @@
 #endif
 }
 
+
 /* end of io.c */

Modified: GNUnet/src/util/network/select.c
===================================================================
--- GNUnet/src/util/network/select.c    2007-09-08 23:46:46 UTC (rev 5611)
+++ GNUnet/src/util/network/select.c    2007-09-08 23:49:09 UTC (rev 5612)
@@ -765,8 +765,8 @@
   return NULL;
 }
 
-static int
-makePipeNonblocking (struct GE_Context *ectx, int handle)
+int
+network_make_pipe_nonblocking (struct GE_Context *ectx, int handle)
 {
 #if MINGW
   DWORD mode;
@@ -836,7 +836,7 @@
       FREE (sh);
       return NULL;
     }
-  if (OK != makePipeNonblocking (sh->ectx, sh->signal_pipe[0]))
+  if (OK != network_make_pipe_nonblocking (sh->ectx, sh->signal_pipe[0]))
     {
       if ((0 != CLOSE (sh->signal_pipe[0])) ||
           (0 != CLOSE (sh->signal_pipe[1])))





reply via email to

[Prev in Thread] Current Thread [Next in Thread]