char *error;
Plug plug;
-
- void *privptr;
};
static int handle_gotdata(struct handle *h, void *data, int len)
/* do nothing */
}
-static void sk_handle_set_private_ptr(Socket s, void *ptr)
-{
- Handle_Socket ps = (Handle_Socket) s;
- ps->privptr = ptr;
-}
-
-static void *sk_handle_get_private_ptr(Socket s)
-{
- Handle_Socket ps = (Handle_Socket) s;
- return ps->privptr;
-}
-
static void handle_socket_unfreeze(void *psv)
{
Handle_Socket ps = (Handle_Socket) psv;
return ps->error;
}
+static char *sk_handle_peer_info(Socket s)
+{
+ Handle_Socket ps = (Handle_Socket) s;
+ ULONG pid;
+ static HMODULE kernel32_module;
+ DECL_WINDOWS_FUNCTION(static, BOOL, GetNamedPipeClientProcessId,
+ (HANDLE, PULONG));
+
+ if (!kernel32_module) {
+ kernel32_module = load_system32_dll("kernel32.dll");
+ GET_WINDOWS_FUNCTION(kernel32_module, GetNamedPipeClientProcessId);
+ }
+
+ /*
+ * Of course, not all handles managed by this module will be
+ * server ends of named pipes, but if they are, then it's useful
+ * to log what we can find out about the client end.
+ */
+ if (p_GetNamedPipeClientProcessId &&
+ p_GetNamedPipeClientProcessId(ps->send_H, &pid))
+ return dupprintf("process id %lu", (unsigned long)pid);
+
+ return NULL;
+}
+
Socket make_handle_socket(HANDLE send_H, HANDLE recv_H, Plug plug,
int overlapped)
{
sk_handle_write_oob,
sk_handle_write_eof,
sk_handle_flush,
- sk_handle_set_private_ptr,
- sk_handle_get_private_ptr,
sk_handle_set_frozen,
- sk_handle_socket_error
+ sk_handle_socket_error,
+ sk_handle_peer_info,
};
Handle_Socket ret;