summaryrefslogtreecommitdiff
path: root/winsup/cygwin/fhandler_windows.cc
diff options
context:
space:
mode:
authorChristopher Faylor <cgf@redhat.com>2003-01-16 01:27:30 +0000
committerChristopher Faylor <cgf@redhat.com>2003-01-16 01:27:30 +0000
commita91a64d228e9a4bdf1c5531119c42426bc719838 (patch)
tree3070c7daf6c77fdc92cef32ea9a2a7de5e2c2933 /winsup/cygwin/fhandler_windows.cc
parent0f38f19ae0747aec7a7c787bb5c23f91d8912b1e (diff)
downloadgdb-a91a64d228e9a4bdf1c5531119c42426bc719838.tar.gz
merge from trunk
Diffstat (limited to 'winsup/cygwin/fhandler_windows.cc')
-rw-r--r--winsup/cygwin/fhandler_windows.cc147
1 files changed, 147 insertions, 0 deletions
diff --git a/winsup/cygwin/fhandler_windows.cc b/winsup/cygwin/fhandler_windows.cc
new file mode 100644
index 00000000000..929aae5cec6
--- /dev/null
+++ b/winsup/cygwin/fhandler_windows.cc
@@ -0,0 +1,147 @@
+/* fhandler_windows.cc: code to access windows message queues.
+
+ Copyright 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+
+ Written by Sergey S. Okhapkin (sos@prospect.com.ru).
+ Feedback and testing by Andy Piper (andyp@parallax.co.uk).
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include "winsup.h"
+#include <errno.h>
+#include <wingdi.h>
+#include <winuser.h>
+#include "cygerrno.h"
+#include "security.h"
+#include "fhandler.h"
+
+/*
+The following unix-style calls are supported:
+
+ open ("/dev/windows", flags, mode=0)
+ - create a unix fd for message queue.
+ O_NONBLOCK flag controls the read() call behavior.
+
+ read (fd, buf, len)
+ - return next message from queue. buf must point to MSG
+ structure, len must be >= sizeof (MSG). If read is set to
+ non-blocking and the queue is empty, read call returns -1
+ immediately with errno set to EAGAIN, otherwise it blocks
+ untill the message will be received.
+
+ write (fd, buf, len)
+ - send a message pointed by buf. len argument ignored.
+
+ ioctl (fd, command, *param)
+ - control read()/write() behavior.
+ ioctl (fd, WINDOWS_POST, NULL): write() will PostMessage();
+ ioctl (fd, WINDOWS_SEND, NULL): write() will SendMessage();
+ ioctl (fd, WINDOWS_HWND, &hWnd): read() messages for
+ hWnd window.
+
+ select () call marks read fd when any message posted to queue.
+*/
+
+fhandler_windows::fhandler_windows ()
+ : fhandler_base (), hWnd_ (NULL), method_ (WINDOWS_POST)
+{
+}
+
+int
+fhandler_windows::open (path_conv *, int flags, mode_t)
+{
+ set_flags ((flags & ~O_TEXT) | O_BINARY);
+ set_close_on_exec_flag (1);
+ set_open_status ();
+ return 1;
+}
+
+int
+fhandler_windows::write (const void *buf, size_t)
+{
+ MSG *ptr = (MSG *) buf;
+
+ if (method_ == WINDOWS_POST)
+ {
+ if (!PostMessage (ptr->hwnd, ptr->message, ptr->wParam, ptr->lParam))
+ {
+ __seterrno ();
+ return -1;
+ }
+ else
+ return sizeof (MSG);
+ }
+ else
+ return SendMessage (ptr->hwnd, ptr->message, ptr->wParam, ptr->lParam);
+}
+
+void __stdcall
+fhandler_windows::read (void *buf, size_t& len)
+{
+ MSG *ptr = (MSG *) buf;
+
+ if (len < sizeof (MSG))
+ {
+ set_errno (EINVAL);
+ (ssize_t) len = -1;
+ return;
+ }
+
+ (ssize_t) len = GetMessage (ptr, hWnd_, 0, 0);
+
+ if ((ssize_t) len == -1)
+ __seterrno ();
+ else
+ set_errno (0);
+ return;
+}
+
+int
+fhandler_windows::ioctl (unsigned int cmd, void *val)
+{
+ switch (cmd)
+ {
+ case WINDOWS_POST:
+ case WINDOWS_SEND:
+ method_ = cmd;
+ break;
+ case WINDOWS_HWND:
+ if (val == NULL)
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+ hWnd_ = * ((HWND *) val);
+ break;
+ default:
+ set_errno (EINVAL);
+ return -1;
+ }
+ return 0;
+}
+
+void
+fhandler_windows::set_close_on_exec (int val)
+{
+ if (get_handle ())
+ this->fhandler_base::set_close_on_exec (val);
+ else
+ this->fhandler_base::set_close_on_exec_flag (val);
+ void *h = hWnd_;
+ if (h)
+ set_inheritance (h, val);
+}
+
+void
+fhandler_windows::fixup_after_fork (HANDLE parent)
+{
+ if (get_handle ())
+ this->fhandler_base::fixup_after_fork (parent);
+ void *h = hWnd_;
+ if (h)
+ fork_fixup (parent, h, "hWnd_");
+}