aboutsummaryrefslogtreecommitdiff
path: root/src/os/win32
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2002-08-06 16:39:45 +0000
committerIgor Sysoev <igor@sysoev.ru>2002-08-06 16:39:45 +0000
commit6de5c2cb63f8aee4bcbec3c363a72fd8e4a4e64d (patch)
tree0e4da305f8101799b6c6aa3002cecf539c2578c0 /src/os/win32
downloadnginx-6de5c2cb63f8aee4bcbec3c363a72fd8e4a4e64d.tar.gz
nginx-6de5c2cb63f8aee4bcbec3c363a72fd8e4a4e64d.zip
nginx-0.0.1-2002-08-06-20:39:45 import
The first code that uses "ngx_" prefix, the previous one used "gx_" prefix. At that point the code is not yet usable. The first draft ideas are dated back to 23.10.2001.
Diffstat (limited to 'src/os/win32')
-rw-r--r--src/os/win32/ngx_errno.c38
-rw-r--r--src/os/win32/ngx_errno.h18
-rw-r--r--src/os/win32/ngx_sendfile.c89
-rw-r--r--src/os/win32/ngx_sendfile.h18
-rw-r--r--src/os/win32/ngx_sendv.h14
-rw-r--r--src/os/win32/ngx_stat.c15
-rw-r--r--src/os/win32/ngx_stat.h26
-rw-r--r--src/os/win32/ngx_time.h21
-rw-r--r--src/os/win32/ngx_types.h14
9 files changed, 253 insertions, 0 deletions
diff --git a/src/os/win32/ngx_errno.c b/src/os/win32/ngx_errno.c
new file mode 100644
index 000000000..ef91e883c
--- /dev/null
+++ b/src/os/win32/ngx_errno.c
@@ -0,0 +1,38 @@
+
+/*
+ TODO:
+ add WSA error messages
+ test for English only messages
+*/
+
+#include <ngx_config.h>
+#include <ngx_string.h>
+#include <ngx_errno.h>
+
+int ngx_strerror_r(ngx_err_t err, char *errstr, size_t size)
+{
+ int len;
+
+ len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
+ | FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL, err,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ errstr, size, NULL);
+
+ /* add WSA error messages */
+
+ if (len == 0) {
+
+ len = ngx_snprintf(errstr, size,
+ "FormatMessage error:(%d)", GetLastError());
+ return len;
+
+ }
+
+ /* remove ".\r\n\0" */
+ while (errstr[len] == '\0' || errstr[len] == CR
+ || errstr[len] == LF || errstr[len] == '.')
+ --len;
+
+ return ++len;
+}
diff --git a/src/os/win32/ngx_errno.h b/src/os/win32/ngx_errno.h
new file mode 100644
index 000000000..dc4cd5044
--- /dev/null
+++ b/src/os/win32/ngx_errno.h
@@ -0,0 +1,18 @@
+#ifndef _NGX_ERRNO_H_INCLUDED_
+#define _NGX_ERRNO_H_INCLUDED_
+
+
+#include <ngx_config.h>
+
+typedef DWORD ngx_err_t;
+
+#define ngx_errno GetLastError()
+#define ngx_socket_errno WSAGetLastError()
+
+#define NGX_ENOENT ERROR_FILE_NOT_FOUND
+#define NGX_EAGAIN WSAEWOULDBLOCK
+
+int ngx_strerror_r(ngx_err_t err, char *errstr, size_t size);
+
+
+#endif /* _NGX_ERRNO_H_INCLUDED_ */
diff --git a/src/os/win32/ngx_sendfile.c b/src/os/win32/ngx_sendfile.c
new file mode 100644
index 000000000..922a4f1f5
--- /dev/null
+++ b/src/os/win32/ngx_sendfile.c
@@ -0,0 +1,89 @@
+
+#include <ngx_config.h>
+#include <ngx_types.h>
+#include <ngx_errno.h>
+#include <ngx_log.h>
+#include <ngx_sendv.h>
+#include <ngx_sendfile.h>
+
+/*
+ TODO:
+ various flags
+ TransmitPackets
+*/
+
+/*
+ returns
+ 0 done
+ -1 error
+*/
+
+#if (HAVE_WIN32_TRANSMITFILE)
+
+int ngx_sendfile(ngx_socket_t s,
+ ngx_iovec_t *headers, int hdr_cnt,
+ ngx_file_t fd, off_t offset, size_t nbytes,
+ ngx_iovec_t *trailers, int trl_cnt,
+ off_t *sent,
+ ngx_log_t *log)
+{
+ int tfrc, rc;
+ ngx_err_t tf_err, err;
+ OVERLAPPED olp;
+ TRANSMIT_FILE_BUFFERS tfb, *ptfb;
+
+ tf_err = 0;
+ err = 0;
+
+ olp.Internal = 0;
+ olp.InternalHigh = 0;
+ olp.Offset = (DWORD) offset;
+ olp.OffsetHigh = (DWORD) (offset >> 32);
+ olp.hEvent = NULL;
+
+ if (headers || trailers) {
+ tfb.Head = headers->ngx_iov_base;
+ tfb.HeadLength = headers->ngx_iov_len;
+ tfb.Tail = trailers->ngx_iov_base;
+ tfb.TailLength = trailers->ngx_iov_len;
+ ptfb = &tfb;
+
+ } else {
+ ptfb = NULL;
+ }
+
+ tfrc = TransmitFile(s, fd, nbytes, 0, &olp, ptfb, 0);
+
+ if (tfrc == 0)
+ tf_err = ngx_socket_errno;
+
+ /* set sent */
+ rc = WSAGetOverlappedResult(s, &olp, (unsigned long *) sent, 0, NULL);
+
+ ngx_log_debug(log, "ngx_sendfile: %d, @%qd %d:%qd" _
+ tfrc _ offset _ nbytes _ *sent);
+
+ if (rc == 0) {
+ err = ngx_socket_errno;
+ ngx_log_error(NGX_LOG_ERR, log, err,
+ "ngx_sendfile: WSAGetOverlappedResult failed");
+ }
+
+ if (tfrc == 0) {
+ if (tf_err != NGX_EAGAIN) {
+ ngx_log_error(NGX_LOG_ERR, log, tf_err,
+ "ngx_sendfile: TransmitFile failed");
+ return -1;
+ }
+
+ ngx_log_error(NGX_LOG_INFO, log, tf_err,
+ "ngx_sendfile: TransmitFile sent only %qd bytes", *sent);
+ }
+
+ if (rc == 0)
+ return -1;
+
+ return 0;
+}
+
+#endif
diff --git a/src/os/win32/ngx_sendfile.h b/src/os/win32/ngx_sendfile.h
new file mode 100644
index 000000000..5bad2b926
--- /dev/null
+++ b/src/os/win32/ngx_sendfile.h
@@ -0,0 +1,18 @@
+#ifndef _NGX_SENDFILE_H_INCLUDED_
+#define _NGX_SENDFILE_H_INCLUDED_
+
+
+#include <ngx_config.h>
+#include <ngx_types.h>
+#include <ngx_log.h>
+#include <ngx_sendv.h>
+
+int ngx_sendfile(ngx_socket_t s,
+ ngx_iovec_t *headers, int hdr_cnt,
+ ngx_file_t fd, off_t offset, size_t nbytes,
+ ngx_iovec_t *trailers, int trl_cnt,
+ off_t *sent,
+ ngx_log_t *log);
+
+
+#endif /* _NGX_SENDFILE_H_INCLUDED_ */
diff --git a/src/os/win32/ngx_sendv.h b/src/os/win32/ngx_sendv.h
new file mode 100644
index 000000000..0de427610
--- /dev/null
+++ b/src/os/win32/ngx_sendv.h
@@ -0,0 +1,14 @@
+#ifndef _NGX_SENDV_H_INCLUDED_
+#define _NGX_SENDV_H_INCLUDED_
+
+
+#include <ngx_config.h>
+
+typedef WSABUF ngx_iovec_t;
+#define ngx_iov_base buf
+#define ngx_iov_len len
+
+#define ngx_sendv(s, iovec, n, sent) WSASend(s, iovec, n, sent, 0, NULL, NULL)
+
+
+#endif /* _NGX_SENDV_H_INCLUDED_ */
diff --git a/src/os/win32/ngx_stat.c b/src/os/win32/ngx_stat.c
new file mode 100644
index 000000000..5b1af3014
--- /dev/null
+++ b/src/os/win32/ngx_stat.c
@@ -0,0 +1,15 @@
+
+#include <windows.h>
+
+#include <ngx_stat.h>
+
+int ngx_stat(char *file, ngx_stat_t *sb)
+{
+ *sb = GetFileAttributes(file);
+
+ if (*sb == INVALID_FILE_ATTRIBUTES) {
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/src/os/win32/ngx_stat.h b/src/os/win32/ngx_stat.h
new file mode 100644
index 000000000..600facd3e
--- /dev/null
+++ b/src/os/win32/ngx_stat.h
@@ -0,0 +1,26 @@
+#ifndef _NGX_STAT_H_INCLUDED_
+#define _NGX_STAT_H_INCLUDED_
+
+
+#include <windows.h>
+
+/* INVALID_FILE_ATTRIBUTES specified but never defined */
+#ifndef INVALID_FILE_ATTRIBUTES
+#define INVALID_FILE_ATTRIBUTES 0xFFFFFFFF
+#endif
+
+typedef DWORD ngx_stat_t;
+
+
+#define ngx_is_dir(sb) (*sb & FILE_ATTRIBUTE_DIRECTORY)
+
+#define ngx_stat_n "GetFileAttributes"
+
+#define ngx_fstat(file, fd, sb) ngx_stat(file, sb)
+#define ngx_fstat_n "GetFileAttributes"
+
+
+int ngx_stat(char *file, ngx_stat_t *sb);
+
+
+#endif /* _NGX_STAT_H_INCLUDED_ */
diff --git a/src/os/win32/ngx_time.h b/src/os/win32/ngx_time.h
new file mode 100644
index 000000000..57915ac1a
--- /dev/null
+++ b/src/os/win32/ngx_time.h
@@ -0,0 +1,21 @@
+#ifndef _NGX_TIME_H_INCLUDED_
+#define _NGX_TIME_H_INCLUDED_
+
+
+#include <windows.h>
+
+typedef SYSTEMTIME ngx_tm_t;
+
+#define ngx_tm_sec wSecond
+#define ngx_tm_min wMinute
+#define ngx_tm_hour wHour
+#define ngx_tm_mday wDay
+#define ngx_tm_mon wMonth
+#define ngx_tm_year wYear
+#define ngx_tm_wday wDayOfWeek
+
+#define ngx_localtime GetLocalTime
+#define ngx_msec GetTickCount
+
+
+#endif /* _NGX_TIME_H_INCLUDED_ */
diff --git a/src/os/win32/ngx_types.h b/src/os/win32/ngx_types.h
new file mode 100644
index 000000000..5715e3fc4
--- /dev/null
+++ b/src/os/win32/ngx_types.h
@@ -0,0 +1,14 @@
+#ifndef _NGX_TYPES_H_INCLUDED_
+#define _NGX_TYPES_H_INCLUDED_
+
+
+#include <ngx_config.h>
+
+
+typedef HANDLE ngx_file_t;
+typedef SOCKET ngx_socket_t;
+typedef long time_t;
+typedef unsigned __int64 off_t;
+
+
+#endif /* _NGX_TYPES_H_INCLUDED_ */