#include "winsecur.h"
-Socket make_handle_socket(HANDLE send_H, HANDLE recv_H, Plug plug,
- int overlapped);
+Socket make_handle_socket(HANDLE send_H, HANDLE recv_H, HANDLE stderr_H,
+ Plug plug, int overlapped);
typedef struct Socket_named_pipe_server_tag *Named_Pipe_Server_Socket;
struct Socket_named_pipe_server_tag {
/* The current named pipe object + attempt to connect to it */
HANDLE pipehandle;
OVERLAPPED connect_ovl;
+ struct handle *callback_handle; /* winhandl.c's reference */
/* PuTTY Socket machinery */
Plug plug;
{
Named_Pipe_Server_Socket ps = (Named_Pipe_Server_Socket) s;
+ if (ps->callback_handle)
+ handle_free(ps->callback_handle);
CloseHandle(ps->pipehandle);
CloseHandle(ps->connect_ovl.hEvent);
sfree(ps->error);
return ps->error;
}
+static char *sk_namedpipeserver_peer_info(Socket s)
+{
+ return NULL;
+}
+
static int create_named_pipe(Named_Pipe_Server_Socket ps, int first_instance)
{
SECURITY_ATTRIBUTES sa;
{
HANDLE conn = (HANDLE)ctx.p;
- return make_handle_socket(conn, conn, plug, TRUE);
+ return make_handle_socket(conn, conn, NULL, plug, TRUE);
}
/*
NULL /* write_eof */,
NULL /* flush */,
NULL /* set_frozen */,
- sk_namedpipeserver_socket_error
+ sk_namedpipeserver_socket_error,
+ sk_namedpipeserver_peer_info,
};
Named_Pipe_Server_Socket ret;
ret->psd = NULL;
ret->pipename = dupstr(pipename);
ret->acl = NULL;
+ ret->callback_handle = NULL;
assert(strncmp(pipename, "\\\\.\\pipe\\", 9) == 0);
assert(strchr(pipename + 9, '\\') == NULL);
memset(&ret->connect_ovl, 0, sizeof(ret->connect_ovl));
ret->connect_ovl.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
- handle_add_foreign_event(ret->connect_ovl.hEvent,
- named_pipe_connect_callback, ret);
+ ret->callback_handle =
+ handle_add_foreign_event(ret->connect_ovl.hEvent,
+ named_pipe_connect_callback, ret);
named_pipe_accept_loop(ret, FALSE);
cleanup: