Rebase against 8075101480df82c5f4280d534f2d76f035653667.

This commit is contained in:
Sebastian Lackner
2015-10-21 19:51:16 +02:00
parent 7cf357b20c
commit bd89770641
16 changed files with 175 additions and 893 deletions

View File

@@ -1,348 +0,0 @@
From 38e2c0d234e1d3615ac26eeb4808a0446a6c72de Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@wine-staging.com>
Date: Wed, 7 Oct 2015 12:19:42 -0600
Subject: ws2_32: Add asynchronous support for TransmitFile.
Signed-off-by: Erich E. Hoover <erich.e.hoover@wine-staging.com>
---
dlls/ws2_32/socket.c | 89 ++++++++++++++++++++++++++++++++++++++--------
dlls/ws2_32/tests/sock.c | 91 ++++++++++++++++++++++++++++++++++++++++++++----
2 files changed, 160 insertions(+), 20 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index bc29f6d..4531b81 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -177,6 +177,8 @@
#define TCP_KEEPIDLE TCP_KEEPALIVE
#endif
+#define FILE_USE_FILE_POINTER_POSITION ((LONGLONG)-2)
+
WINE_DEFAULT_DEBUG_CHANNEL(winsock);
WINE_DECLARE_DEBUG_CHANNEL(winediag);
@@ -524,6 +526,7 @@ struct ws2_transmitfile_async
DWORD bytes_per_send;
TRANSMIT_FILE_BUFFERS buffers;
DWORD flags;
+ LARGE_INTEGER offset;
struct ws2_async write;
};
@@ -2742,9 +2745,10 @@ static BOOL WINAPI WS2_AcceptEx(SOCKET listener, SOCKET acceptor, PVOID dest, DW
*
* Perform an APC-safe ReadFile operation
*/
-static NTSTATUS WS2_ReadFile(HANDLE hFile, PIO_STATUS_BLOCK io_status, char* buffer, ULONG length)
+static NTSTATUS WS2_ReadFile(HANDLE hFile, PIO_STATUS_BLOCK io_status, char* buffer, ULONG length,
+ PLARGE_INTEGER offset)
{
- int result, unix_handle;
+ int result = -1, unix_handle;
unsigned int options;
NTSTATUS status;
@@ -2753,8 +2757,12 @@ static NTSTATUS WS2_ReadFile(HANDLE hFile, PIO_STATUS_BLOCK io_status, char* buf
status = wine_server_handle_to_fd( hFile, FILE_READ_DATA, &unix_handle, &options );
if (status) return status;
- while ((result = read( unix_handle, buffer, length )) == -1)
+ while (result == -1)
{
+ if (offset && offset->QuadPart != FILE_USE_FILE_POINTER_POSITION)
+ result = pread( unix_handle, buffer, length, offset->QuadPart );
+ else
+ result = read( unix_handle, buffer, length );
if (errno != EINTR)
break;
}
@@ -2772,6 +2780,8 @@ static NTSTATUS WS2_ReadFile(HANDLE hFile, PIO_STATUS_BLOCK io_status, char* buf
TRACE("= 0x%08x (%d)\n", status, result);
if (status == STATUS_SUCCESS || status == STATUS_END_OF_FILE)
{
+ if (offset && offset->QuadPart != FILE_USE_FILE_POINTER_POSITION)
+ offset->QuadPart += result;
io_status->u.Status = status;
io_status->Information = result;
}
@@ -2811,7 +2821,7 @@ static NTSTATUS WS2_transmitfile_getbuffer( int fd, struct ws2_transmitfile_asyn
/* when the size of the transfer is limited ensure that we don't go past that limit */
if (wsa->file_bytes != 0)
bytes_per_send = min(bytes_per_send, wsa->file_bytes - wsa->file_read);
- status = WS2_ReadFile( wsa->file, &iosb, wsa->buffer, bytes_per_send );
+ status = WS2_ReadFile( wsa->file, &iosb, wsa->buffer, bytes_per_send, &wsa->offset );
if (status == STATUS_END_OF_FILE)
wsa->file = NULL; /* continue on to the footer */
else if (status != STATUS_SUCCESS)
@@ -2860,10 +2870,15 @@ static NTSTATUS WS2_transmitfile_base( int fd, struct ws2_transmitfile_async *ws
status = WS2_transmitfile_getbuffer( fd, wsa );
if (status == STATUS_PENDING)
{
+ IO_STATUS_BLOCK *iosb = (IO_STATUS_BLOCK *)wsa->write.user_overlapped;
int n;
n = WS2_send( fd, &wsa->write, convert_flags(wsa->write.flags) );
- if (n == -1 && errno != EAGAIN)
+ if (n >= 0)
+ {
+ if (iosb) iosb->Information += n;
+ }
+ else if (errno != EAGAIN)
return wsaErrStatus();
}
@@ -2871,26 +2886,46 @@ static NTSTATUS WS2_transmitfile_base( int fd, struct ws2_transmitfile_async *ws
}
/***********************************************************************
+ * WS2_async_transmitfile (INTERNAL)
+ *
+ * Asynchronous callback for overlapped TransmitFile operations.
+ */
+static NTSTATUS WS2_async_transmitfile( void *user, IO_STATUS_BLOCK *iosb,
+ NTSTATUS status, void **apc, void **arg )
+{
+ struct ws2_transmitfile_async *wsa = user;
+ int fd;
+
+ if (status == STATUS_ALERTED)
+ {
+ if (!(status = wine_server_handle_to_fd( wsa->write.hSocket, FILE_WRITE_DATA, &fd, NULL )))
+ {
+ status = WS2_transmitfile_base( fd, wsa );
+ wine_server_release_fd( wsa->write.hSocket, fd );
+ }
+ if (status == STATUS_PENDING)
+ return status;
+ }
+
+ iosb->u.Status = status;
+ release_async_io( &wsa->io );
+ return status;
+}
+
+/***********************************************************************
* TransmitFile
*/
static BOOL WINAPI WS2_TransmitFile( SOCKET s, HANDLE h, DWORD file_bytes, DWORD bytes_per_send,
LPOVERLAPPED overlapped, LPTRANSMIT_FILE_BUFFERS buffers,
DWORD flags )
{
+ IO_STATUS_BLOCK *iosb = (IO_STATUS_BLOCK *)overlapped;
union generic_unix_sockaddr uaddr;
unsigned int uaddrlen = sizeof(uaddr);
struct ws2_transmitfile_async *wsa;
NTSTATUS status;
int fd;
- if (overlapped)
- {
- FIXME("(%lx, %p, %d, %d, %p, %p, %d): stub !\n", s, h, file_bytes, bytes_per_send,
- overlapped, buffers, flags);
- WSASetLastError( WSAEOPNOTSUPP );
- return FALSE;
- }
-
TRACE("(%lx, %p, %d, %d, %p, %p, %d)\n", s, h, file_bytes, bytes_per_send, overlapped,
buffers, flags );
@@ -2937,6 +2972,7 @@ static BOOL WINAPI WS2_TransmitFile( SOCKET s, HANDLE h, DWORD file_bytes, DWORD
wsa->file_bytes = file_bytes;
wsa->bytes_per_send = bytes_per_send;
wsa->flags = flags;
+ wsa->offset.QuadPart = FILE_USE_FILE_POINTER_POSITION;
wsa->write.hSocket = SOCKET2HANDLE(s);
wsa->write.addr = NULL;
wsa->write.addrlen.val = 0;
@@ -2945,7 +2981,32 @@ static BOOL WINAPI WS2_TransmitFile( SOCKET s, HANDLE h, DWORD file_bytes, DWORD
wsa->write.control = NULL;
wsa->write.n_iovecs = 0;
wsa->write.first_iovec = 0;
- wsa->write.user_overlapped = NULL;
+ wsa->write.user_overlapped = overlapped;
+ if (overlapped)
+ {
+ int status;
+
+ wsa->offset.u.LowPart = overlapped->u.s.Offset;
+ wsa->offset.u.HighPart = overlapped->u.s.OffsetHigh;
+ iosb->u.Status = STATUS_PENDING;
+ iosb->Information = 0;
+ SERVER_START_REQ( register_async )
+ {
+ req->type = ASYNC_TYPE_WRITE;
+ req->async.handle = wine_server_obj_handle( SOCKET2HANDLE(s) );
+ req->async.event = wine_server_obj_handle( overlapped->hEvent );
+ req->async.callback = wine_server_client_ptr( WS2_async_transmitfile );
+ req->async.iosb = wine_server_client_ptr( iosb );
+ req->async.arg = wine_server_client_ptr( wsa );
+ status = wine_server_call( req );
+ }
+ SERVER_END_REQ;
+
+ if(status != STATUS_PENDING) HeapFree( GetProcessHeap(), 0, wsa );
+ release_sock_fd( s, fd );
+ WSASetLastError( NtStatusToWSAError(status) );
+ return FALSE;
+ }
do
{
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 3d20c89..29e20c3 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -7429,15 +7429,15 @@ end:
closesocket(connector2);
}
-#define compare_file(h,s) compare_file2(h,s,__FILE__,__LINE__)
+#define compare_file(h,s,o) compare_file2(h,s,o,__FILE__,__LINE__)
-static void compare_file2(HANDLE handle, SOCKET sock, const char *file, int line)
+static void compare_file2(HANDLE handle, SOCKET sock, int offset, const char *file, int line)
{
char buf1[256], buf2[256];
BOOL success;
int i = 0;
- SetFilePointer(handle, 0, NULL, FILE_BEGIN);
+ SetFilePointer(handle, offset, NULL, FILE_BEGIN);
while (1)
{
DWORD n1 = 0, n2 = 0;
@@ -7457,6 +7457,7 @@ static void compare_file2(HANDLE handle, SOCKET sock, const char *file, int line
static void test_TransmitFile(void)
{
+ DWORD num_bytes, err, file_size, total_sent;
GUID transmitFileGuid = WSAID_TRANSMITFILE;
LPFN_TRANSMITFILE pTransmitFile = NULL;
HANDLE file = INVALID_HANDLE_VALUE;
@@ -7466,11 +7467,13 @@ static void test_TransmitFile(void)
struct sockaddr_in bindAddress;
TRANSMIT_FILE_BUFFERS buffers;
SOCKET client, server, dest;
- DWORD num_bytes, err;
+ WSAOVERLAPPED ov;
char buf[256];
int iret, len;
BOOL bret;
+ memset( &ov, 0, sizeof(ov) );
+
/* Setup sockets for testing TransmitFile */
client = socket(AF_INET, SOCK_STREAM, 0);
server = socket(AF_INET, SOCK_STREAM, 0);
@@ -7494,6 +7497,7 @@ static void test_TransmitFile(void)
skip("Unable to open a file to transmit.\n");
goto cleanup;
}
+ file_size = GetFileSize(file, NULL);
/* Test TransmitFile with an invalid socket */
bret = pTransmitFile(INVALID_SOCKET, file, 0, 0, NULL, NULL, 0);
@@ -7567,7 +7571,7 @@ static void test_TransmitFile(void)
/* Test TransmitFile with only file data */
bret = pTransmitFile(client, file, 0, 0, NULL, NULL, 0);
ok(bret, "TransmitFile failed unexpectedly.\n");
- compare_file(file, dest);
+ compare_file(file, dest, 0);
/* Test TransmitFile with both file and buffer data */
buffers.Head = &header_msg[0];
@@ -7580,7 +7584,81 @@ static void test_TransmitFile(void)
iret = recv(dest, buf, sizeof(header_msg)+1, 0);
ok(memcmp(buf, &header_msg[0], sizeof(header_msg)+1) == 0,
"TransmitFile header buffer did not match!\n");
- compare_file(file, dest);
+ compare_file(file, dest, 0);
+ iret = recv(dest, buf, sizeof(footer_msg)+1, 0);
+ ok(memcmp(buf, &footer_msg[0], sizeof(footer_msg)+1) == 0,
+ "TransmitFile footer buffer did not match!\n");
+
+ /* Test overlapped TransmitFile */
+ ov.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
+ if (ov.hEvent == INVALID_HANDLE_VALUE)
+ {
+ skip("Could not create event object, some tests will be skipped. errno = %d\n",
+ GetLastError());
+ goto cleanup;
+ }
+ SetFilePointer(file, 0, NULL, FILE_BEGIN);
+ bret = pTransmitFile(client, file, 0, 0, &ov, NULL, 0);
+ err = WSAGetLastError();
+ ok(!bret, "TransmitFile succeeded unexpectedly.\n");
+ ok(err == ERROR_IO_PENDING, "TransmitFile triggered unexpected errno (%d != %d)\n",
+ err, ERROR_IO_PENDING);
+ iret = WaitForSingleObject(ov.hEvent, 2000);
+ ok(iret == WAIT_OBJECT_0, "Overlapped TransmitFile failed.\n");
+ WSAGetOverlappedResult(client, &ov, &total_sent, FALSE, NULL);
+ ok(total_sent == file_size,
+ "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
+ total_sent, file_size);
+ compare_file(file, dest, 0);
+
+ /* Test overlapped TransmitFile w/ start offset */
+ ov.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
+ if (ov.hEvent == INVALID_HANDLE_VALUE)
+ {
+ skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError());
+ goto cleanup;
+ }
+ SetFilePointer(file, 0, NULL, FILE_BEGIN);
+ ov.Offset = 10;
+ bret = pTransmitFile(client, file, 0, 0, &ov, NULL, 0);
+ err = WSAGetLastError();
+ ok(!bret, "TransmitFile succeeded unexpectedly.\n");
+ ok(err == ERROR_IO_PENDING, "TransmitFile triggered unexpected errno (%d != %d)\n", err, ERROR_IO_PENDING);
+ iret = WaitForSingleObject(ov.hEvent, 2000);
+ ok(iret == WAIT_OBJECT_0, "Overlapped TransmitFile failed.\n");
+ WSAGetOverlappedResult(client, &ov, &total_sent, FALSE, NULL);
+ ok(total_sent == (file_size - ov.Offset),
+ "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
+ total_sent, file_size - ov.Offset);
+ compare_file(file, dest, ov.Offset);
+
+ /* Test overlapped TransmitFile w/ file and buffer data */
+ ov.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
+ if (ov.hEvent == INVALID_HANDLE_VALUE)
+ {
+ skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError());
+ goto cleanup;
+ }
+ buffers.Head = &header_msg[0];
+ buffers.HeadLength = sizeof(header_msg)+1;
+ buffers.Tail = &footer_msg[0];
+ buffers.TailLength = sizeof(footer_msg)+1;
+ SetFilePointer(file, 0, NULL, FILE_BEGIN);
+ ov.Offset = 0;
+ bret = pTransmitFile(client, file, 0, 0, &ov, &buffers, 0);
+ err = WSAGetLastError();
+ ok(!bret, "TransmitFile succeeded unexpectedly.\n");
+ ok(err == ERROR_IO_PENDING, "TransmitFile triggered unexpected errno (%d != %d)\n", err, ERROR_IO_PENDING);
+ iret = WaitForSingleObject(ov.hEvent, 2000);
+ ok(iret == WAIT_OBJECT_0, "Overlapped TransmitFile failed.\n");
+ WSAGetOverlappedResult(client, &ov, &total_sent, FALSE, NULL);
+ ok(total_sent == (file_size + buffers.HeadLength + buffers.TailLength),
+ "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
+ total_sent, file_size + buffers.HeadLength + buffers.TailLength);
+ iret = recv(dest, buf, sizeof(header_msg)+1, 0);
+ ok(memcmp(buf, &header_msg[0], sizeof(header_msg)+1) == 0,
+ "TransmitFile header buffer did not match!\n");
+ compare_file(file, dest, 0);
iret = recv(dest, buf, sizeof(footer_msg)+1, 0);
ok(memcmp(buf, &footer_msg[0], sizeof(footer_msg)+1) == 0,
"TransmitFile footer buffer did not match!\n");
@@ -7595,6 +7673,7 @@ static void test_TransmitFile(void)
cleanup:
CloseHandle(file);
+ CloseHandle(ov.hEvent);
closesocket(client);
closesocket(server);
}
--
2.6.1

View File

@@ -1,4 +1,4 @@
From 0a0a7b4793378c54346cd0e9e7feae6eb2a89dc3 Mon Sep 17 00:00:00 2001
From 0a7427437a87557be853c5d27e11b62436a00848 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@wine-staging.com>
Date: Wed, 4 Mar 2015 13:16:20 -0700
Subject: ws2_32: Add support for TF_DISCONNECT to TransmitFile.
@@ -9,10 +9,10 @@ Subject: ws2_32: Add support for TF_DISCONNECT to TransmitFile.
2 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 4531b81..0f94a57 100644
index b0cbb11..7deaeda 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -2882,7 +2882,16 @@ static NTSTATUS WS2_transmitfile_base( int fd, struct ws2_transmitfile_async *ws
@@ -2883,7 +2883,16 @@ static NTSTATUS WS2_transmitfile_base( int fd, struct ws2_transmitfile_async *ws
return wsaErrStatus();
}
@@ -30,14 +30,14 @@ index 4531b81..0f94a57 100644
}
/***********************************************************************
@@ -2919,6 +2928,7 @@ static BOOL WINAPI WS2_TransmitFile( SOCKET s, HANDLE h, DWORD file_bytes, DWORD
@@ -2920,6 +2929,7 @@ static BOOL WINAPI WS2_TransmitFile( SOCKET s, HANDLE h, DWORD file_bytes, DWORD
LPOVERLAPPED overlapped, LPTRANSMIT_FILE_BUFFERS buffers,
DWORD flags )
{
+ DWORD unsupported_flags = flags & ~(TF_DISCONNECT);
IO_STATUS_BLOCK *iosb = (IO_STATUS_BLOCK *)overlapped;
union generic_unix_sockaddr uaddr;
unsigned int uaddrlen = sizeof(uaddr);
struct ws2_transmitfile_async *wsa;
@@ -2941,8 +2951,8 @@ static BOOL WINAPI WS2_TransmitFile( SOCKET s, HANDLE h, DWORD file_bytes, DWORD
WSASetLastError( WSAENOTCONN );
return FALSE;

View File

@@ -1,4 +1,4 @@
From 0b55083552779d1148c04778f5479e5fc4e6d6e4 Mon Sep 17 00:00:00 2001
From 58723ec84900590ae95a7abd688540d963372993 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 16 Jan 2014 19:08:30 -0700
Subject: ws2_32: Add support for TF_REUSE_SOCKET to TransmitFile.
@@ -12,10 +12,10 @@ Subject: ws2_32: Add support for TF_REUSE_SOCKET to TransmitFile.
5 files changed, 75 insertions(+), 11 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index f530a94..bf33e25 100644
index 7deaeda..258f121 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -2810,6 +2810,17 @@ static NTSTATUS WS2_transmitfile_base( int fd, struct ws2_transmitfile_async *ws
@@ -2886,6 +2886,17 @@ static NTSTATUS WS2_transmitfile_base( int fd, struct ws2_transmitfile_async *ws
if (status != STATUS_SUCCESS)
return status;
@@ -33,20 +33,20 @@ index f530a94..bf33e25 100644
if (wsa->flags & TF_DISCONNECT)
{
/* we can't use WS_closesocket because it modifies the last error */
@@ -2853,7 +2864,7 @@ static BOOL WINAPI WS2_TransmitFile( SOCKET s, HANDLE h, DWORD file_bytes, DWORD
@@ -2929,7 +2940,7 @@ static BOOL WINAPI WS2_TransmitFile( SOCKET s, HANDLE h, DWORD file_bytes, DWORD
LPOVERLAPPED overlapped, LPTRANSMIT_FILE_BUFFERS buffers,
DWORD flags )
{
- DWORD unsupported_flags = flags & ~(TF_DISCONNECT);
+ DWORD unsupported_flags = flags & ~(TF_DISCONNECT|TF_REUSE_SOCKET);
IO_STATUS_BLOCK *iosb = (IO_STATUS_BLOCK *)overlapped;
union generic_unix_sockaddr uaddr;
unsigned int uaddrlen = sizeof(uaddr);
struct ws2_transmitfile_async *wsa;
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index a8abdee..58d8db7 100644
index d5c206c..4e1a432 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -7566,7 +7566,6 @@ static void test_TransmitFile(void)
@@ -7675,7 +7675,6 @@ static void test_TransmitFile(void)
err, WSAENOTSOCK);
/* Test TransmitFile with a UDP datagram socket */
@@ -67,10 +67,10 @@ index 50237e8..e53aa1e 100644
#define FD_WINE_NONBLOCKING 0x20000000
#define FD_WINE_CONNECTED 0x40000000
diff --git a/server/protocol.def b/server/protocol.def
index 9c4dab4..0694f99 100644
index c313006..5588f6a 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -1230,6 +1230,12 @@ enum server_fd_type
@@ -1263,6 +1263,12 @@ enum server_fd_type
@END
@@ -84,7 +84,7 @@ index 9c4dab4..0694f99 100644
@REQ(set_socket_event)
obj_handle_t handle; /* handle to the socket */
diff --git a/server/sock.c b/server/sock.c
index c4dcf6f..fb80bc7 100644
index 1767dea..0f029bf 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -86,6 +86,7 @@
@@ -95,7 +95,7 @@ index c4dcf6f..fb80bc7 100644
#define FD_WINE_LISTENING 0x10000000
#define FD_WINE_NONBLOCKING 0x20000000
#define FD_WINE_CONNECTED 0x40000000
@@ -134,6 +135,7 @@ static obj_handle_t sock_ioctl( struct fd *fd, ioctl_code_t code, const async_da
@@ -133,6 +134,7 @@ static obj_handle_t sock_ioctl( struct fd *fd, ioctl_code_t code, const async_da
static void sock_queue_async( struct fd *fd, const async_data_t *data, int type, int count );
static void sock_reselect_async( struct fd *fd, struct async_queue *queue );
static int sock_cancel_async( struct fd *fd, struct process *process, struct thread *thread, client_ptr_t iosb );
@@ -103,7 +103,7 @@ index c4dcf6f..fb80bc7 100644
static int sock_get_ntstatus( int err );
static int sock_get_error( int err );
@@ -155,7 +157,7 @@ static const struct object_ops sock_ops =
@@ -154,7 +156,7 @@ static const struct object_ops sock_ops =
default_set_sd, /* set_sd */
no_lookup_name, /* lookup_name */
no_open_file, /* open_file */
@@ -112,7 +112,7 @@ index c4dcf6f..fb80bc7 100644
sock_destroy /* destroy */
};
@@ -628,6 +630,47 @@ static struct fd *sock_get_fd( struct object *obj )
@@ -626,6 +628,47 @@ static struct fd *sock_get_fd( struct object *obj )
return (struct fd *)grab_object( sock->fd );
}
@@ -160,7 +160,7 @@ index c4dcf6f..fb80bc7 100644
static void sock_destroy( struct object *obj )
{
struct sock *sock = (struct sock *)obj;
@@ -679,15 +722,8 @@ static struct object *create_socket( int family, int type, int protocol, unsigne
@@ -677,15 +720,8 @@ static struct object *create_socket( int family, int type, int protocol, unsigne
struct sock *sock;
int sockfd;
@@ -177,7 +177,7 @@ index c4dcf6f..fb80bc7 100644
if (!(sock = alloc_object( &sock_ops )))
{
close( sockfd );
@@ -1286,6 +1322,17 @@ DECL_HANDLER(accept_into_socket)
@@ -1261,6 +1297,17 @@ DECL_HANDLER(accept_into_socket)
release_object( sock );
}
@@ -196,5 +196,5 @@ index c4dcf6f..fb80bc7 100644
DECL_HANDLER(set_socket_event)
{
--
2.3.7
2.6.1