diff options
Diffstat (limited to 'src/os')
-rw-r--r-- | src/os/unix/ngx_errno.h | 3 | ||||
-rw-r--r-- | src/os/unix/ngx_files.c | 14 | ||||
-rw-r--r-- | src/os/unix/ngx_files.h | 54 | ||||
-rw-r--r-- | src/os/unix/ngx_types.h | 8 | ||||
-rw-r--r-- | src/os/win32/ngx_errno.c | 28 | ||||
-rw-r--r-- | src/os/win32/ngx_errno.h | 5 | ||||
-rw-r--r-- | src/os/win32/ngx_files.c | 70 | ||||
-rw-r--r-- | src/os/win32/ngx_files.h | 88 | ||||
-rw-r--r-- | src/os/win32/ngx_os.h | 1 | ||||
-rw-r--r-- | src/os/win32/ngx_socket.h | 6 | ||||
-rw-r--r-- | src/os/win32/ngx_types.h | 8 | ||||
-rw-r--r-- | src/os/win32/ngx_win32_config.h | 23 | ||||
-rw-r--r-- | src/os/win32/ngx_win32_init.c | 2 | ||||
-rw-r--r-- | src/os/win32/ngx_wsarecv_chain.c | 72 |
14 files changed, 316 insertions, 66 deletions
diff --git a/src/os/unix/ngx_errno.h b/src/os/unix/ngx_errno.h index feb9e4a08..d0f255a4e 100644 --- a/src/os/unix/ngx_errno.h +++ b/src/os/unix/ngx_errno.h @@ -19,10 +19,13 @@ typedef int ngx_err_t; #define NGX_ECONNRESET ECONNRESET #define NGX_ETIMEDOUT ETIMEDOUT #define NGX_ECANCELED ECANCELED +#define NGX_ENOMOREFILES 0 + #define ngx_errno errno #define ngx_socket_errno errno +#define ngx_set_errno(err) errno = err #define ngx_set_socket_errno(err) errno = err #if 0 diff --git a/src/os/unix/ngx_files.c b/src/os/unix/ngx_files.c index 1fd69fc4c..76b86a035 100644 --- a/src/os/unix/ngx_files.c +++ b/src/os/unix/ngx_files.c @@ -169,6 +169,20 @@ ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, } +int ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir) +{ + dir->dir = opendir(name->data); + + if (dir->dir == NULL) { + return NGX_ERROR; + } + + dir->info_valid = 0; + + return NGX_OK; +} + + #if 0 ssize_t ngx_read_file(ngx_file_t *file, char *buf, size_t size, off_t offset) diff --git a/src/os/unix/ngx_files.h b/src/os/unix/ngx_files.h index f83cc6a0c..09fc856a4 100644 --- a/src/os/unix/ngx_files.h +++ b/src/os/unix/ngx_files.h @@ -49,37 +49,59 @@ ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *ce, off_t offset, ngx_pool_t *pool); -#define ngx_rename_file(from, to, pool) rename(from->data, to->data) +#define ngx_rename_file rename #define ngx_rename_file_n "rename" -#define ngx_open_dir opendir +#define ngx_file_info(file, sb) stat(file, sb) +#define ngx_file_info_n "stat()" + +#define ngx_fd_info(fd, sb) fstat(fd, sb) +#define ngx_fd_info_n "fstat()" + +#define ngx_is_dir(sb) (S_ISDIR((sb)->st_mode)) +#define ngx_is_file(sb) (S_ISREG((sb)->st_mode)) +#define ngx_file_size(sb) (sb)->st_size +#define ngx_file_mtime(sb) (sb)->st_mtime +#define ngx_file_uniq(sb) (sb)->st_ino + + +#define NGX_DIR_MASK_LEN 0 + + +int ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir); #define ngx_open_dir_n "opendir()" -#define ngx_read_dir readdir +#define ngx_close_dir(d) closedir((d)->dir) +#define ngx_close_dir_n "closedir()" + + +#define ngx_read_dir(d) \ + (((d)->de = readdir((d)->dir)) ? NGX_OK : NGX_ERROR) #define ngx_read_dir_n "readdir()" -#define ngx_mkdir(name) mkdir(name, 0700) -#define ngx_mkdir_n "mkdir()" +#define ngx_create_dir(name) mkdir(name, 0700) +#define ngx_create_dir_n "mkdir()" #define ngx_delete_dir rmdir #define ngx_delete_dir_n "rmdir()" -#define ngx_file_type(file, sb) stat(file, sb) -#define ngx_file_type_n "stat()" - -#define ngx_stat_fd(fd, sb) fstat(fd, sb) -#define ngx_stat_fd_n "fstat()" - -#define ngx_is_dir(sb) (S_ISDIR(sb->st_mode)) -#define ngx_is_file(sb) (S_ISREG(sb->st_mode)) -#define ngx_file_size(sb) sb->st_size -#define ngx_file_mtime(sb) sb->st_mtime -#define ngx_file_uniq(sb) sb->st_ino +#define ngx_de_name(dir) (dir)->de->d_name +#ifdef __FreeBSD__ +#define ngx_de_namelen(dir) (dir)->de->d_namlen +#else +#define ngx_de_namelen(dir) ngx_strlen((dir)->de->d_name) +#endif +#define ngx_de_info(name, dir) stat(name, &(dir)->info) +#define ngx_de_info_n "stat()" +#define ngx_de_is_dir(dir) (S_ISDIR((dir)->info.st_mode)) +#define ngx_de_is_file(dir) (S_ISREG((dir)->info.st_mode)) +#define ngx_de_size(dir) (dir)->info.st_size +#define ngx_de_mtime(dir) (dir)->info.st_mtime #endif /* _NGX_FILES_H_INCLUDED_ */ diff --git a/src/os/unix/ngx_types.h b/src/os/unix/ngx_types.h index e2622c557..bdad25dd7 100644 --- a/src/os/unix/ngx_types.h +++ b/src/os/unix/ngx_types.h @@ -9,8 +9,12 @@ typedef int ngx_fd_t; typedef struct stat ngx_file_info_t; typedef ino_t ngx_file_uniq_t; -typedef DIR ngx_dir_t; -typedef struct dirent ngx_dirent_t; +typedef struct { + DIR *dir; + struct dirent *de; + struct stat info; + unsigned info_valid; +} ngx_dir_t; #endif /* _NGX_TYPES_H_INCLUDED_ */ diff --git a/src/os/win32/ngx_errno.c b/src/os/win32/ngx_errno.c index 3a9487c06..865fbe37b 100644 --- a/src/os/win32/ngx_errno.c +++ b/src/os/win32/ngx_errno.c @@ -9,7 +9,7 @@ #include <ngx_core.h> -ngx_str_t wsa_errors[] = { +static ngx_str_t wsa_errors[] = { ngx_string("Invalid argument"), /* 10022 */ ngx_null_string, /* 10023 */ ngx_null_string, /* 10024 */ @@ -23,7 +23,29 @@ ngx_str_t wsa_errors[] = { ngx_null_string, /* 10032 */ ngx_null_string, /* 10033 */ ngx_null_string, /* 10034 */ - ngx_string("Resource temporarily unavailable") /* 10035 */ + ngx_string("Resource temporarily unavailable"), /* 10035 */ + ngx_null_string, /* 10036 */ + ngx_null_string, /* 10037 */ + ngx_null_string, /* 10038 */ + ngx_null_string, /* 10039 */ + ngx_null_string, /* 10040 */ + ngx_null_string, /* 10041 */ + ngx_null_string, /* 10042 */ + ngx_null_string, /* 10043 */ + ngx_null_string, /* 10044 */ + ngx_null_string, /* 10045 */ + ngx_null_string, /* 10046 */ + ngx_null_string, /* 10047 */ + ngx_null_string, /* 10048 */ + ngx_null_string, /* 10049 */ + ngx_null_string, /* 10050 */ + ngx_null_string, /* 10051 */ + ngx_null_string, /* 10052 */ + ngx_null_string, /* 10053 */ + ngx_null_string, /* 10054 */ + ngx_null_string, /* 10055 */ + ngx_null_string, /* 10056 */ + ngx_string("Socket is not connected") /* 10057 */ }; @@ -45,7 +67,7 @@ int ngx_strerror_r(ngx_err_t err, char *errstr, size_t size) if (format_error == ERROR_MR_MID_NOT_FOUND) { n = err - WSABASEERR - 22; - if (n >= 0 && n < 14) { + if (n >= 0 && n <= 35) { len = wsa_errors[n].len; if (len) { diff --git a/src/os/win32/ngx_errno.h b/src/os/win32/ngx_errno.h index e94dbe066..179cbbce5 100644 --- a/src/os/win32/ngx_errno.h +++ b/src/os/win32/ngx_errno.h @@ -9,6 +9,7 @@ typedef DWORD ngx_err_t; #define ngx_errno GetLastError() +#define ngx_set_errno(err) SetLastError(err) #define ngx_socket_errno WSAGetLastError() #define ngx_set_socket_errno(err) WSASetLastError(err) @@ -21,6 +22,10 @@ typedef DWORD ngx_err_t; #define NGX_EADDRINUSE WSAEADDRINUSE #define NGX_ECONNRESET ECONNRESET #define NGX_ETIMEDOUT WSAETIMEDOUT +#define NGX_ENOMOREFILES ERROR_NO_MORE_FILES + +#define NGX_EALREADY WSAEALREADY +#define NGX_EINVAL WSAEINVAL int ngx_strerror_r(ngx_err_t err, char *errstr, size_t size); diff --git a/src/os/win32/ngx_files.c b/src/os/win32/ngx_files.c index 7e2346288..3906ddc49 100644 --- a/src/os/win32/ngx_files.c +++ b/src/os/win32/ngx_files.c @@ -163,14 +163,16 @@ ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, } -int ngx_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_pool_t *pool) +int ngx_win32_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_pool_t *pool) { int rc, collision; u_int num; char *name; - ngx_err_t err; - name = ngx_palloc(pool, to->len + 1 + 10 + 1 + sizeof("DELETE")); + if (!(name = ngx_palloc(pool, to->len + 1 + 10 + 1 + sizeof("DELETE")))) { + return NGX_ERROR; + } + ngx_memcpy(name, to->data, to->len); collision = 0; @@ -184,11 +186,6 @@ int ngx_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_pool_t *pool) ".%010u.DELETE", num); if (MoveFile(to->data, name) == 0) { - err = ngx_errno; - if (err == NGX_ENOENT || err == NGX_ENOTDIR) { - return NGX_ERROR; - } - collision = 1; ngx_log_error(NGX_LOG_ERR, pool->log, ngx_errno, "MoveFile() failed"); @@ -196,18 +193,21 @@ int ngx_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_pool_t *pool) } while (collision); + if (MoveFile(from->data, to->data) == 0) { + rc = NGX_ERROR; + + } else { + rc = NGX_OK; + } + if (ngx_win32_version >= NGX_WIN_NT) { if (DeleteFile(name) == 0) { ngx_log_error(NGX_LOG_ERR, pool->log, ngx_errno, "DeleteFile() failed"); } - } - - if (MoveFile(from->data, to->data) == 0) { - rc = NGX_ERROR; } else { - rc = NGX_OK; + /* TODO: Win9X: update the open files table */ } if (rc == NGX_ERROR) { @@ -220,7 +220,9 @@ int ngx_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_pool_t *pool) } -int ngx_file_type(char *file, ngx_file_info_t *sb) +#if 0 + +int ngx_file_info(char *file, ngx_file_info_t *sb) { WIN32_FILE_ATTRIBUTE_DATA fa; @@ -240,13 +242,13 @@ int ngx_file_type(char *file, ngx_file_info_t *sb) return NGX_OK; } +#endif -#if 0 - -/* Win95 */ -int ngx_file_type(char *file, ngx_file_info_t *sb) +int ngx_file_info(char *file, ngx_file_info_t *sb) { + /* Win95 */ + sb->dwFileAttributes = GetFileAttributes(file); if (sb->dwFileAttributes == INVALID_FILE_ATTRIBUTES) { @@ -256,7 +258,37 @@ int ngx_file_type(char *file, ngx_file_info_t *sb) return NGX_OK; } -#endif + +int ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir) +{ + ngx_cpystrn(name->data + name->len, NGX_DIR_MASK, NGX_DIR_MASK_LEN + 1); + + dir->dir = FindFirstFile(name->data, &dir->fd); + + if (dir->dir == INVALID_HANDLE_VALUE) { + return NGX_ERROR; + } + + dir->info_valid = 1; + dir->ready = 1; + + return NGX_OK; +} + + +int ngx_read_dir(ngx_dir_t *dir) +{ + if (dir->ready) { + dir->ready = 0; + return NGX_OK; + } + + if (FindNextFile(dir->dir, &dir->fd) == 0) { + return NGX_ERROR; + } + + return NGX_OK; +} int ngx_file_append_mode(ngx_fd_t fd) diff --git a/src/os/win32/ngx_files.h b/src/os/win32/ngx_files.h index d7d7d00b3..1268d47c0 100644 --- a/src/os/win32/ngx_files.h +++ b/src/os/win32/ngx_files.h @@ -21,6 +21,8 @@ #define NGX_FILE_ERROR 0 +#define STDERR_FILENO (HANDLE) 2 + #define ngx_open_file(name, access, create) \ CreateFile(name, access, \ @@ -58,35 +60,87 @@ int ngx_file_append_mode(ngx_fd_t fd); #define ngx_close_file CloseHandle #define ngx_close_file_n "CloseHandle()" -int ngx_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_pool_t *pool); + +#define ngx_delete_file DeleteFile +#define ngx_delete_file_n "DeleteFile()" + + +#define ngx_rename_file MoveFile #define ngx_rename_file_n "MoveFile()" +int ngx_win32_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_pool_t *pool); + + +int ngx_file_info(char *filename, ngx_file_info_t *fi); +#define ngx_file_info_n "GetFileAttributesEx()" + -#define ngx_mkdir(name) CreateDirectory(name, NULL) -#define ngx_mkdir_n "CreateDirectory()" +#define ngx_fd_info(fd, fi) GetFileInformationByHandle(fd, fi) +#define ngx_fd_info_n "GetFileInformationByHandle" -int ngx_file_type(char *filename, ngx_file_info_t *fi); -#define ngx_file_type_n "GetFileAttributesEx()" -#define ngx_stat_fd(fd, fi) GetFileInformationByHandle(fd, fi) -#define ngx_stat_fd_n "GetFileInformationByHandle" +#define ngx_is_dir(fi) ((fi)->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) +#define ngx_is_file(fi) !((fi)->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) -#define ngx_is_dir(fi) (fi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) -#define ngx_is_file(fi) !(fi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) -#define ngx_file_size(fi) \ - (((off_t) fi.nFileSizeHigh << 32) | fi.nFileSizeLow) +#define ngx_file_size(fi) \ + (((off_t) (fi)->nFileSizeHigh << 32) | (fi)->nFileSizeLow) -#define ngx_file_uniq(fi) (*(ngx_file_uniq_t *) &fi.nFileIndexHigh) +#define ngx_file_uniq(fi) (*(ngx_file_uniq_t *) &(fi)->nFileIndexHigh) /* 116444736000000000 is commented in src/os/win32/ngx_time.c */ -#define ngx_file_mtime(fi) \ - (time_t) (((((unsigned __int64) fi.ftLastWriteTime.dwHighDateTime << 32) \ - | fi.ftLastWriteTime.dwLowDateTime) \ +#define ngx_file_mtime(fi) \ + (time_t) (((((unsigned __int64) (fi)->ftLastWriteTime.dwHighDateTime << 32) \ + | (fi)->ftLastWriteTime.dwLowDateTime) \ - 116444736000000000) / 10000000) +#define NGX_DIR_MASK "/*" +#define NGX_DIR_MASK_LEN 2 + + +int ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir); +#define ngx_open_dir_n "FindFirstFile()" + + +int ngx_read_dir(ngx_dir_t *dir); +#define ngx_read_dir_n "FindNextFile()" + + +#define ngx_close_dir(d) FindClose((d)->dir) +#define ngx_close_dir_n "FindClose()" + + +#define ngx_create_dir(name) CreateDirectory(name, NULL) +#define ngx_create_dir_n "CreateDirectory()" + + +#define ngx_delete_dir RemoveDirectory +#define ngx_delete_dir_n "RemoveDirectory()" + + +#define ngx_de_name(dir) (dir)->fd.cFileName +#define ngx_de_namelen(dir) ngx_strlen((dir)->fd.cFileName) +#define ngx_de_info(name, dir) NGX_OK +#define ngx_de_info_n "dummy()" +#define ngx_de_is_dir(dir) \ + ((dir)->fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) +#define ngx_de_is_file(dir) \ + !((dir)->fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) +#define ngx_de_size(dir) \ + (((off_t) (dir)->fd.nFileSizeHigh << 32) | (dir)->fd.nFileSizeLow) + +/* 116444736000000000 is commented in src/os/win32/ngx_time.c */ + +#define ngx_de_mtime(dir) \ + (time_t) (((((unsigned __int64) \ + (dir)->fd.ftLastWriteTime.dwHighDateTime << 32) \ + | (dir)->fd.ftLastWriteTime.dwLowDateTime) \ + - 116444736000000000) / 10000000) + + + ssize_t ngx_read_file(ngx_file_t *file, char *buf, size_t size, off_t offset); #define ngx_read_file_n "ReadFile()" @@ -96,8 +150,4 @@ ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *ce, off_t offset, ngx_pool_t *pool); - -#define STDERR_FILENO (HANDLE) 2 - - #endif /* _NGX_FILES_H_INCLUDED_ */ diff --git a/src/os/win32/ngx_os.h b/src/os/win32/ngx_os.h index 52a7c05a8..bf5253b00 100644 --- a/src/os/win32/ngx_os.h +++ b/src/os/win32/ngx_os.h @@ -35,6 +35,7 @@ int ngx_os_init(ngx_log_t *log); ssize_t ngx_wsarecv(ngx_connection_t *c, char *buf, size_t size); ssize_t ngx_overlapped_wsarecv(ngx_connection_t *c, char *buf, size_t size); +ssize_t ngx_wsarecv_chain(ngx_connection_t *c, ngx_chain_t *chain); ngx_chain_t *ngx_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in); ngx_chain_t *ngx_overlapped_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in); diff --git a/src/os/win32/ngx_socket.h b/src/os/win32/ngx_socket.h index a78c40c6b..86231030f 100644 --- a/src/os/win32/ngx_socket.h +++ b/src/os/win32/ngx_socket.h @@ -13,8 +13,12 @@ typedef SOCKET ngx_socket_t; typedef int socklen_t; +#define ngx_socket(af, type, proto, flags) socket(af, type, proto) + +#if 0 #define ngx_socket(af, type, proto, flags) \ WSASocket(af, type, proto, NULL, 0, flags) +#endif #define ngx_socket_n "WSASocket()" @@ -36,7 +40,7 @@ extern LPFN_GETACCEPTEXSOCKADDRS getacceptexsockaddrs; extern LPFN_TRANSMITFILE transmitfile; -ngx_inline int ngx_tcp_push(s) { +static ngx_inline int ngx_tcp_push(ngx_socket_t s) { return 0; } diff --git a/src/os/win32/ngx_types.h b/src/os/win32/ngx_types.h index fe4af4496..760342968 100644 --- a/src/os/win32/ngx_types.h +++ b/src/os/win32/ngx_types.h @@ -11,11 +11,11 @@ typedef BY_HANDLE_FILE_INFORMATION ngx_file_info_t; typedef uint64_t ngx_file_uniq_t; typedef struct { - HANDLE dir; - WIN32_FIND_DATA de; + HANDLE dir; + WIN32_FIND_DATA fd; + unsigned info_valid; + unsigned ready; } ngx_dir_t; -typedef WIN32_FIND_DATA ngx_dirent_t; - #endif /* _NGX_TYPES_H_INCLUDED_ */ diff --git a/src/os/win32/ngx_win32_config.h b/src/os/win32/ngx_win32_config.h index 23164328b..defddab94 100644 --- a/src/os/win32/ngx_win32_config.h +++ b/src/os/win32/ngx_win32_config.h @@ -6,7 +6,18 @@ #define NGX_WIN_NT 200000 +#define STRICT +#define WIN32_LEAN_AND_MEAN +/* + * we need to include windows.h explicity before winsock2.h because + * warning 4201 is enabled in windows.h + */ +#include <windows.h> + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif #include <winsock2.h> #include <mswsock.h> @@ -15,6 +26,16 @@ #include <stdlib.h> #include <stdarg.h> +#ifdef _MSC_VER +#pragma warning(default:4201) + +/* unreferenced formal parameter */ +#pragma warning(disable:4100) + +/* STUB */ +#pragma warning(disable:4127) +#endif + #define ngx_inline __inline @@ -30,7 +51,7 @@ typedef u_int uintptr_t; typedef int ssize_t; typedef long time_t; -typedef unsigned __int64 off_t; +typedef __int64 off_t; #define OFF_FMT "%I64d" diff --git a/src/os/win32/ngx_win32_init.c b/src/os/win32/ngx_win32_init.c index 77e4462d0..3c3509c02 100644 --- a/src/os/win32/ngx_win32_init.c +++ b/src/os/win32/ngx_win32_init.c @@ -10,7 +10,7 @@ int ngx_inherited_nonblocking = 1; ngx_os_io_t ngx_os_io = { ngx_wsarecv, - NULL, + ngx_wsarecv_chain, NULL, ngx_wsasend_chain, 0 diff --git a/src/os/win32/ngx_wsarecv_chain.c b/src/os/win32/ngx_wsarecv_chain.c new file mode 100644 index 000000000..edc4421dd --- /dev/null +++ b/src/os/win32/ngx_wsarecv_chain.c @@ -0,0 +1,72 @@ + +#include <ngx_config.h> +#include <ngx_core.h> +#include <ngx_event.h> + + +ssize_t ngx_wsarecv_chain(ngx_connection_t *c, ngx_chain_t *chain) +{ + int rc; + char *prev; + u_int flags; + size_t bytes, size; + WSABUF *wsabuf; + ngx_err_t err; + ngx_array_t io; + ngx_event_t *rev; + + prev = NULL; + wsabuf = NULL; + flags = 0; + size = 0; + bytes = 0; + + ngx_init_array(io, c->pool, 10, sizeof(WSABUF), NGX_ERROR); + + /* coalesce the neighbouring hunks */ + + while (chain) { + if (prev == chain->hunk->last) { + wsabuf->len += chain->hunk->end - chain->hunk->last; + + } else { + ngx_test_null(wsabuf, ngx_push_array(&io), NGX_ERROR); + wsabuf->buf = chain->hunk->last; + wsabuf->len = chain->hunk->end - chain->hunk->last; + } + + size += chain->hunk->end - chain->hunk->last; + prev = chain->hunk->end; + chain = chain->next; + } + +ngx_log_debug(c->log, "WSARecv: %d:%d" _ io.nelts _ wsabuf->len); + + rc = WSARecv(c->fd, io.elts, io.nelts, &bytes, &flags, NULL, NULL); + + rev = c->read; + + if (rc == -1) { + rev->ready = 0; + err = ngx_socket_errno; + + if (err == WSAEWOULDBLOCK) { + ngx_log_error(NGX_LOG_INFO, c->log, err, "WSARecv() EAGAIN"); + return NGX_AGAIN; + } + + rev->error = 1; + ngx_log_error(NGX_LOG_CRIT, c->log, err, "WSARecv() failed"); + return NGX_ERROR; + } + + if (bytes < size) { + rev->ready = 0; + } + + if (bytes == 0) { + rev->eof = 1; + } + + return bytes; +} |