[Top][All Lists]
[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])))
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r5612 - in GNUnet/src: include transports util/network,
gnunet <=