diff options
author | Christopher Faylor <cgf@redhat.com> | 2003-01-16 01:27:30 +0000 |
---|---|---|
committer | Christopher Faylor <cgf@redhat.com> | 2003-01-16 01:27:30 +0000 |
commit | a91a64d228e9a4bdf1c5531119c42426bc719838 (patch) | |
tree | 3070c7daf6c77fdc92cef32ea9a2a7de5e2c2933 /winsup/cygwin/fhandler_windows.cc | |
parent | 0f38f19ae0747aec7a7c787bb5c23f91d8912b1e (diff) | |
download | gdb-a91a64d228e9a4bdf1c5531119c42426bc719838.tar.gz |
merge from trunk
Diffstat (limited to 'winsup/cygwin/fhandler_windows.cc')
-rw-r--r-- | winsup/cygwin/fhandler_windows.cc | 147 |
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_"); +} |