3 Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
5 This file is part of Cygwin.
7 This software is a copyrighted work licensed under the terms of the
8 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
14 #include <sys/ioctl.h>
18 Code is located in fhandler.cc unless another file name is given.
20 fhandler_base normal I/O
23 fhandler_serial Adds vmin and vtime.
24 fhandler_dev_null Not really I/O
25 fhandler_dev_zero Faked
27 fhandler_dev_raw (fhandler_raw.cc)
28 fhandler_dev_floppy (fhandler_floppy.cc)
29 fhandler_dev_tape (fhandler_tape.cc)
32 fhandler_socket (fhandler_socket.cc)
34 fhandler_tty_slave (tty.cc)
35 fhandler_pty_master (tty.cc)
36 fhandler_tty_master (tty.cc)
38 fhandler_console Out with ansi control. (console.cc)
40 fhandler_windows Windows messages I/O (fhandler_windows.cc)
42 fhandler_dev_random /dev/[u]random implementation (fhandler_random.cc)
44 fhandler_dev_mem /dev/mem implementation (fhandler_mem.cc)
46 fhandler_dev_clipboard /dev/clipboard implementation (fhandler_clipboard.cc)
48 fhandler_proc Interesting possibility, not implemented yet
53 FH_RBINARY = 0x00001000, /* binary read mode */
54 FH_WBINARY = 0x00002000, /* binary write mode */
55 FH_CLOEXEC = 0x00004000, /* close-on-exec */
56 FH_RBINSET = 0x00008000, /* binary read mode has been explicitly set */
57 FH_WBINSET = 0x00010000, /* binary write mode has been explicitly set */
58 FH_APPEND = 0x00020000, /* always append */
59 FH_ASYNC = 0x00040000, /* async I/O */
60 FH_HADEOF = 0x00080000, /* EOF seen */
62 FH_SYMLINK = 0x00100000, /* is a symlink */
63 FH_EXECABL = 0x00200000, /* file looked like it would run:
64 * ends in .exe or .bat or begins with #! */
65 FH_W95LSBUG= 0x00400000, /* set when lseek is called as a flag that
66 * _write should check if we've moved beyond
67 * EOF, zero filling if so. */
68 FH_NOFRNAME= 0x00800000, /* Set if shouldn't free unix_path_name_ and
69 windows_path_name_ on destruction. */
70 FH_NOEINTR = 0x01000000, /* Set if I/O should be uninterruptible. */
71 FH_FFIXUP = 0x02000000, /* Set if need to fixup after fork. */
72 FH_LOCAL = 0x04000000, /* File is unix domain socket */
73 FH_FIFO = 0x08000000, /* File is FIFO */
74 FH_HASACLS = 0x40000000, /* True if fs of file has ACLS */
79 FH_CONSOLE = 0x00000001, /* is a console */
80 FH_CONIN = 0x00000002, /* console input */
81 FH_CONOUT = 0x00000003, /* console output */
82 FH_TTYM = 0x00000004, /* is a tty master */
83 FH_TTYS = 0x00000005, /* is a tty slave */
84 FH_PTYM = 0x00000006, /* is a pty master */
85 FH_SERIAL = 0x00000007, /* is a serial port */
86 FH_PIPE = 0x00000008, /* is a pipe */
87 FH_PIPER = 0x00000009, /* read end of a pipe */
88 FH_PIPEW = 0x0000000a, /* write end of a pipe */
89 FH_SOCKET = 0x0000000b, /* is a socket */
90 FH_WINDOWS = 0x0000000c, /* is a window */
92 FH_SLOW = 0x00000010, /* "slow" device if below this */
95 FH_DISK = 0x00000010, /* is a disk */
96 FH_FLOPPY = 0x00000011, /* is a floppy */
97 FH_TAPE = 0x00000012, /* is a tape */
98 FH_NULL = 0x00000013, /* is the null device */
99 FH_ZERO = 0x00000014, /* is the zero device */
100 FH_RANDOM = 0x00000015, /* is a random device */
101 FH_MEM = 0x00000016, /* is a mem device */
102 FH_CLIPBOARD = 0x00000017, /* is a clipbaord device */
104 FH_NDEV = 0x00000018, /* Maximum number of devices */
105 FH_DEVMASK = 0x00000fff, /* devices live here */
109 #define FHDEVN(n) ((n) & FH_DEVMASK)
110 #define FHISSETF(x) __ISSETF (this, x, FH)
111 #define FHSETF(x) __SETF (this, x, FH)
112 #define FHCLEARF(x) __CLEARF (this, x, FH)
113 #define FHCONDSETF(n, x) __CONDSETF(n, this, x, FH)
117 extern const char *windows_device_names[];
118 extern struct __cygwin_perfile *perfile_table;
119 #define __fmode (*(user_data->fmode_ptr))
123 class fhandler_disk_file;
135 unsigned long namehash_; /* hashed filename, used as inode num */
137 /* Full unix path name of this file */
138 /* File open flags from open () and fcntl () calls */
142 char *rabuf; /* used for crlf conversion in text files */
148 char *unix_path_name_;
149 char *win32_path_name_;
152 void set_name (const char * unix_path, const char * win32_path = NULL,
155 virtual fhandler_base& operator =(fhandler_base &x);
156 fhandler_base (DWORD dev, const char *name = 0, int unit = 0);
157 virtual ~fhandler_base ();
159 /* Non-virtual simple accessor functions. */
160 void set_io_handle (HANDLE x) { io_handle = x; }
162 void set_cb (size_t size) { cb = size; }
163 DWORD get_device () { return status & FH_DEVMASK; }
164 virtual int get_unit () { return 0; }
165 virtual BOOL is_slow () { return get_device () < FH_SLOW; }
167 int get_access () { return access_; }
168 void set_access (int x) { access_ = x; }
170 int get_async () { return FHISSETF (ASYNC); }
171 void set_async (int x) { FHCONDSETF (x, ASYNC); }
173 int get_flags () { return openflags_; }
174 void set_flags (int x) { openflags_ = x; }
176 int get_w_binary () { return FHISSETF (WBINARY); }
177 int get_r_binary () { return FHISSETF (RBINARY); }
179 int get_w_binset () { return FHISSETF (WBINSET); }
180 int get_r_binset () { return FHISSETF (RBINSET); }
182 void set_w_binary (int b) { FHCONDSETF (b, WBINARY); FHSETF (WBINSET); }
183 void set_r_binary (int b) { FHCONDSETF (b, RBINARY); FHSETF (RBINSET); }
185 int get_default_fmode (int flags);
187 int get_r_no_interrupt () { return FHISSETF (NOEINTR); }
188 void set_r_no_interrupt (int b) { FHCONDSETF (b, NOEINTR); }
190 int get_close_on_exec () { return FHISSETF (CLOEXEC); }
191 int set_close_on_exec_flag (int b) { return FHCONDSETF (b, CLOEXEC); }
193 void set_check_win95_lseek_bug (int b = 1) { FHCONDSETF (b, W95LSBUG); }
194 int get_check_win95_lseek_bug () { return FHISSETF (W95LSBUG); }
196 int get_need_fork_fixup () { return FHISSETF (FFIXUP); }
197 void set_need_fork_fixup () { FHSETF (FFIXUP); }
199 virtual void set_close_on_exec (int val);
201 virtual void fixup_before_fork_exec (DWORD) {}
202 virtual void fixup_after_fork (HANDLE);
203 virtual void fixup_after_exec (HANDLE) {}
205 int get_symlink_p () { return FHISSETF (SYMLINK); }
206 void set_symlink_p (int val) { FHCONDSETF (val, SYMLINK); }
207 void set_symlink_p () { FHSETF (SYMLINK); }
209 int get_socket_p () { return FHISSETF (LOCAL); }
210 void set_socket_p (int val) { FHCONDSETF (val, LOCAL); }
211 void set_socket_p () { FHSETF (LOCAL); }
213 int get_execable_p () { return FHISSETF (EXECABL); }
214 void set_execable_p (int val) { FHCONDSETF (val, EXECABL); }
215 void set_execable_p () { FHSETF (EXECABL); }
217 int get_append_p () { return FHISSETF (APPEND); }
218 void set_append_p (int val) { FHCONDSETF (val, APPEND); }
219 void set_append_p () { FHSETF (APPEND); }
221 int get_readahead_valid () { return raixget < ralen; }
222 int puts_readahead (const char *s, size_t len = (size_t) -1);
223 int put_readahead (char value);
225 int get_readahead ();
226 int peek_readahead (int queryput = 0);
228 int eat_readahead (int n);
230 void set_readahead_valid (int val, int ch = -1);
232 int get_readahead_into_buffer (char *buf, size_t buflen);
234 int has_acls () { return FHISSETF (HASACLS); }
235 void set_has_acls (int val) { FHCONDSETF (val, HASACLS); }
237 int no_free_names () { return FHISSETF (NOFRNAME); }
238 void set_no_free_names (int val) { FHCONDSETF (val, NOFRNAME); }
239 void set_no_free_names () { FHSETF (NOFRNAME); }
241 const char *get_name () { return unix_path_name_; }
242 const char *get_win32_name () { return win32_path_name_; }
243 unsigned long get_namehash () { return namehash_; }
245 virtual void hclose (HANDLE h) {CloseHandle (h);}
246 virtual void set_inheritance (HANDLE &h, int not_inheriting,
247 const char *name = NULL);
249 /* fixup fd possibly non-inherited handles after fork */
250 void fork_fixup (HANDLE parent, HANDLE &h, const char *name);
252 /* Potentially overridden virtual functions. */
253 virtual int open (const char *, int flags, mode_t mode = 0)
255 return open (flags, mode);
257 virtual int open (int flags, mode_t mode = 0);
258 virtual int close ();
259 virtual int fstat (struct stat *buf) { return stat_dev (get_device (), get_unit (), get_namehash (), buf); }
260 virtual int ioctl (unsigned int cmd, void *);
261 virtual int fcntl (int cmd, void *);
262 virtual char const * ttyname () { return get_name(); }
263 virtual int read (void *ptr, size_t len);
264 virtual int write (const void *ptr, size_t len);
265 virtual off_t lseek (off_t offset, int whence);
266 virtual int lock (int, struct flock *);
267 virtual void dump ();
268 virtual int dup (fhandler_base *child);
270 virtual HANDLE mmap (caddr_t *addr, size_t len, DWORD access,
271 int flags, off_t off);
272 virtual int munmap (HANDLE h, caddr_t addr, size_t len);
273 virtual int msync (HANDLE h, caddr_t addr, size_t len, int flags);
275 void *operator new (size_t, void *p) {return p;}
277 virtual void init (HANDLE, DWORD, mode_t);
279 virtual int tcflush (int);
280 virtual int tcsendbreak (int);
281 virtual int tcdrain ();
282 virtual int tcflow (int);
283 virtual int tcsetattr (int a, const struct termios *t);
284 virtual int tcgetattr (struct termios *t);
285 virtual int tcsetpgrp (const pid_t pid);
286 virtual int tcgetpgrp ();
287 virtual int is_tty () { return 0; }
288 virtual BOOL is_device () { return TRUE; }
289 virtual char *ptsname () { return NULL;}
290 virtual class fhandler_socket *is_socket () { return 0; }
291 virtual class fhandler_console *is_console () { return 0; }
292 virtual int is_windows () {return 0; }
294 virtual int raw_read (void *ptr, size_t ulen);
295 virtual int raw_write (const void *ptr, size_t ulen);
297 /* Virtual accessor functions to hide the fact
298 that some fd's have two handles. */
299 virtual HANDLE get_handle () const { return io_handle; }
300 virtual HANDLE get_io_handle () const { return io_handle; }
301 virtual HANDLE get_output_handle () const { return io_handle; }
302 virtual BOOL hit_eof () {return FALSE;}
303 virtual select_record *select_read (select_record *s);
304 virtual select_record *select_write (select_record *s);
305 virtual select_record *select_except (select_record *s);
306 virtual int ready_for_read (int fd, DWORD howlong, int ignra);
307 virtual const char * get_native_name ()
309 return windows_device_names[FHDEVN (status)];
311 virtual int bg_check (int) {return 1;}
312 void clear_readahead ()
314 raixput = raixget = ralen = rabuflen = 0;
317 void operator delete (void *);
320 class fhandler_socket: public fhandler_base
324 struct _WSAPROTOCOL_INFOA *prot_info_ptr;
327 fhandler_socket (const char *name = 0);
329 int get_socket () const { return (int) get_handle(); }
330 fhandler_socket * is_socket () { return this; }
331 int write (const void *ptr, size_t len);
332 int read (void *ptr, size_t len);
333 int ioctl (unsigned int cmd, void *);
334 int fcntl (int cmd, void *);
335 off_t lseek (off_t, int) { return 0; }
337 void hclose (HANDLE) {close ();}
338 int dup (fhandler_base *child);
340 virtual void fixup_before_fork_exec (DWORD);
341 void fixup_after_fork (HANDLE);
342 void fixup_after_exec (HANDLE parent) { fixup_after_fork (parent); }
344 select_record *select_read (select_record *s);
345 select_record *select_write (select_record *s);
346 select_record *select_except (select_record *s);
347 int ready_for_read (int fd, DWORD howlong, int ignra);
348 int get_addr_family () {return addr_family;}
349 void set_addr_family (int af) {addr_family = af;}
352 class fhandler_pipe: public fhandler_base
355 fhandler_pipe (const char *name = 0, DWORD devtype = FH_PIPE);
356 off_t lseek (off_t offset, int whence);
357 /* This strange test is due to the fact that we can't rely on
358 Windows shells to "do the right thing" with pipes. Apparently
359 the can keep one end of the pipe open when it shouldn't be. */
360 BOOL is_slow () {return os_being_run == winNT;}
361 select_record *select_read (select_record *s);
362 select_record *select_write (select_record *s);
363 select_record *select_except (select_record *s);
364 int ready_for_read (int fd, DWORD howlong, int ignra);
367 class fhandler_dev_raw: public fhandler_base
374 int eom_detected : 1;
375 int eof_detected : 1;
376 int lastblk_to_read : 1;
382 virtual void clear (void);
383 virtual int writebuf (void);
385 /* returns not null, if `win_error' determines an end of media condition */
386 virtual int is_eom(int win_error) = 0;
387 /* returns not null, if `win_error' determines an end of file condition */
388 virtual int is_eof(int win_error) = 0;
390 fhandler_dev_raw (DWORD dev, const char *name, int unit);
393 ~fhandler_dev_raw (void);
395 int open (const char *path, int flags, mode_t mode = 0);
398 int raw_read (void *ptr, size_t ulen);
399 int raw_write (const void *ptr, size_t ulen);
401 int fstat (struct stat *buf);
403 int dup (fhandler_base *child);
405 int ioctl (unsigned int cmd, void *buf);
407 void fixup_after_fork (HANDLE);
410 class fhandler_dev_floppy: public fhandler_dev_raw
413 virtual int is_eom (int win_error);
414 virtual int is_eof (int win_error);
417 fhandler_dev_floppy (const char *name, int unit);
419 virtual int open (const char *path, int flags, mode_t mode = 0);
420 virtual int close (void);
422 virtual off_t lseek (off_t offset, int whence);
424 virtual int ioctl (unsigned int cmd, void *buf);
427 class fhandler_dev_tape: public fhandler_dev_raw
433 virtual void clear (void);
435 virtual int is_eom (int win_error);
436 virtual int is_eof (int win_error);
439 fhandler_dev_tape (const char *name, int unit);
441 virtual int open (const char *path, int flags, mode_t mode = 0);
442 virtual int close (void);
444 virtual off_t lseek (off_t offset, int whence);
446 virtual int fstat (struct stat *buf);
448 virtual int dup (fhandler_base *child);
450 virtual int ioctl (unsigned int cmd, void *buf);
453 int tape_write_marks (int marktype, DWORD len);
454 int tape_get_pos (unsigned long *ret);
455 int tape_set_pos (int mode, long count, BOOLEAN sfm_func = FALSE);
456 int tape_erase (int mode);
457 int tape_prepare (int action);
458 BOOLEAN tape_get_feature (DWORD parm);
459 int tape_get_blocksize (long *min, long *def, long *max, long *cur);
460 int tape_set_blocksize (long count);
461 int tape_status (struct mtget *get);
462 int tape_compression (long count);
465 /* Standard disk file */
467 class fhandler_disk_file: public fhandler_base
470 int check_execable_p (const char *path);
473 fhandler_disk_file (const char *name);
475 int open (const char *path, int flags, mode_t mode = 0);
476 int open (path_conv& real_path, int flags, mode_t mode);
478 int lock (int, struct flock *);
479 BOOL is_device () { return FALSE; }
480 int fstat (struct stat *buf);
482 HANDLE mmap (caddr_t *addr, size_t len, DWORD access, int flags, off_t off);
483 int munmap (HANDLE h, caddr_t addr, size_t len);
484 int msync (HANDLE h, caddr_t addr, size_t len, int flags);
487 class fhandler_serial: public fhandler_base
490 unsigned int vmin_; /* from termios */
491 unsigned int vtime_; /* from termios */
495 int overlapped_armed;
496 OVERLAPPED io_status;
499 fhandler_serial (const char *name, DWORD devtype = FH_SERIAL, int unit = 0);
501 int open (const char *path, int flags, mode_t mode);
503 void init (HANDLE h, DWORD a, mode_t flags);
504 void overlapped_setup ();
505 int dup (fhandler_base *child);
506 int raw_read (void *ptr, size_t ulen);
507 int raw_write (const void *ptr, size_t ulen);
508 int tcsendbreak (int);
511 int tcsetattr (int a, const struct termios *t);
512 int tcgetattr (struct termios *t);
513 off_t lseek (off_t, int) { return 0; }
516 int is_tty () { return 1; }
517 void fixup_after_fork (HANDLE parent);
518 void fixup_after_exec (HANDLE);
520 /* We maintain a pgrp so that tcsetpgrp and tcgetpgrp work, but we
521 don't use it for permissions checking. fhandler_tty_slave does
522 permission checking on pgrps. */
523 virtual int tcgetpgrp () { return pgrp_; }
524 virtual int tcsetpgrp (const pid_t pid) { pgrp_ = pid; return 0; }
525 select_record *select_read (select_record *s);
526 select_record *select_write (select_record *s);
527 select_record *select_except (select_record *s);
528 int ready_for_read (int fd, DWORD howlong, int ignra);
531 #define acquire_output_mutex(ms) \
532 __acquire_output_mutex (__PRETTY_FUNCTION__, __LINE__, ms);
534 #define release_output_mutex() \
535 __release_output_mutex (__PRETTY_FUNCTION__, __LINE__);
539 class fhandler_termios: public fhandler_base
542 HANDLE output_handle;
543 virtual void doecho (const void *, DWORD) {};
544 virtual int accept_input () {return 1;};
547 fhandler_termios (DWORD dev, const char *name = 0, int unit = 0) :
548 fhandler_base (dev, name, unit)
552 HANDLE get_output_handle () const { return output_handle; }
553 int line_edit (const char *rptr, int nread, int always_accept = 0);
554 void set_output_handle (HANDLE h) { output_handle = h; }
555 void tcinit (tty_min *this_tc, int force = FALSE);
556 virtual int is_tty () { return 1; }
558 int tcsetpgrp (int pid);
559 void set_ctty (int ttynum, int flags);
560 int bg_check (int sig);
561 virtual DWORD __acquire_output_mutex (const char *fn, int ln, DWORD ms) {return 1;}
562 virtual void __release_output_mutex (const char *fn, int ln) {}
565 /* This is a input and output console handle */
566 class fhandler_console: public fhandler_termios
572 // enum {normal, gotesc, gotsquare, gotarg1, gotcommand} state;
591 void clear_screen (int, int, int, int);
592 void scroll_screen (int, int, int, int, int, int);
593 void cursor_set (BOOL, int, int);
594 void cursor_get (int *, int *);
595 void cursor_rel (int, int);
596 const unsigned char * write_normal (unsigned const char*, unsigned const char *);
597 void char_command (char);
598 int output_tcsetattr (int a, const struct termios *t);
601 int igncr_enabled ();
602 int input_tcsetattr (int a, const struct termios *t);
603 void set_cursor_maybe ();
607 fhandler_console (const char *name);
609 fhandler_console* is_console () { return this; }
611 int open (const char *path, int flags, mode_t mode = 0);
613 int write (const void *ptr, size_t len);
614 void doecho (const void *str, DWORD len) { (void) write (str, len); }
615 int read (void *ptr, size_t len);
619 int tcsetattr (int a, const struct termios *t);
620 int tcgetattr (struct termios *t);
622 /* Special dup as we must dup two handles */
623 int dup (fhandler_base *child);
625 int ioctl (unsigned int cmd, void *);
626 void init (HANDLE, DWORD, mode_t);
628 select_record *select_read (select_record *s);
629 select_record *select_write (select_record *s);
630 select_record *select_except (select_record *s);
631 int ready_for_read (int fd, DWORD howlong, int ignra);
632 void fixup_after_exec (HANDLE);
633 void set_close_on_exec (int val);
634 void fixup_after_fork (HANDLE parent);
635 void set_input_state ();
638 class fhandler_tty_common: public fhandler_termios
641 fhandler_tty_common (DWORD dev, const char *name = 0, int unit = 0) :
642 fhandler_termios (dev, name, unit),
647 HANDLE output_done_event; // Raised by master when tty's output buffer
648 // written. Write status in tty::write_retval.
649 HANDLE ioctl_request_event; // Raised by slave to perform ioctl() request.
650 // Ioctl() request in tty::cmd/arg.
651 HANDLE ioctl_done_event; // Raised by master on ioctl() completion.
652 // Ioctl() status in tty::ioctl_retval.
654 HANDLE inuse; // used to indicate that a tty is in use
657 DWORD __acquire_output_mutex (const char *fn, int ln, DWORD ms);
658 void __release_output_mutex (const char *fn, int ln);
660 int ttynum; // Master tty num.
661 virtual int dup (fhandler_base *child);
663 tty *get_ttyp () { return (tty *)tc; }
664 int get_unit () { return ttynum; }
667 void set_close_on_exec (int val);
668 void fixup_after_fork (HANDLE parent);
669 select_record *select_read (select_record *s);
670 select_record *select_write (select_record *s);
671 select_record *select_except (select_record *s);
672 int ready_for_read (int fd, DWORD howlong, int ignra);
675 class fhandler_tty_slave: public fhandler_tty_common
679 fhandler_tty_slave (const char *name);
680 fhandler_tty_slave (int, const char *name);
682 int open (const char *path, int flags, mode_t mode = 0);
683 int write (const void *ptr, size_t len);
684 int read (void *ptr, size_t len);
685 void init (HANDLE, DWORD, mode_t);
687 int tcsetattr (int a, const struct termios *t);
688 int tcgetattr (struct termios *t);
690 int ioctl (unsigned int cmd, void *);
692 off_t lseek (off_t, int) { return 0; }
695 class fhandler_pty_master: public fhandler_tty_common
697 int pktmode; // non-zero if pty in a packet mode.
699 int need_nl; // Next read should start with \n
702 fhandler_pty_master (const char *name, DWORD devtype = FH_PTYM, int unit = -1);
704 int process_slave_output (char *buf, size_t len, int pktmode_on);
705 void doecho (const void *str, DWORD len);
707 int open (const char *path, int flags, mode_t mode = 0);
708 int write (const void *ptr, size_t len);
709 int read (void *ptr, size_t len);
712 int tcsetattr (int a, const struct termios *t);
713 int tcgetattr (struct termios *t);
715 int ioctl (unsigned int cmd, void *);
717 off_t lseek (off_t, int) { return 0; }
720 void set_close_on_exec (int val);
724 class fhandler_tty_master: public fhandler_pty_master
728 fhandler_tty_master (const char *name, int unit);
729 fhandler_console *console; // device handler to perform real i/o.
730 HANDLE hThread; // process_output thread handle.
734 void fixup_after_fork (HANDLE parent);
735 void fixup_after_exec (HANDLE);
738 class fhandler_dev_null: public fhandler_base
741 fhandler_dev_null (const char *name);
744 select_record *select_read (select_record *s);
745 select_record *select_write (select_record *s);
746 select_record *select_except (select_record *s);
749 class fhandler_dev_zero: public fhandler_base
752 fhandler_dev_zero (const char *name);
753 int open (const char *path, int flags, mode_t mode = 0);
754 int write (const void *ptr, size_t len);
755 int read (void *ptr, size_t len);
756 off_t lseek (off_t offset, int whence);
762 class fhandler_dev_random: public fhandler_base
766 HCRYPTPROV crypt_prov;
769 BOOL crypt_gen_random (void *ptr, size_t len);
770 int pseudo_write (const void *ptr, size_t len);
771 int pseudo_read (void *ptr, size_t len);
774 fhandler_dev_random (const char *name, int unit);
775 int get_unit () { return unit; }
776 int open (const char *path, int flags, mode_t mode = 0);
777 int write (const void *ptr, size_t len);
778 int read (void *ptr, size_t len);
779 off_t lseek (off_t offset, int whence);
781 int dup (fhandler_base *child);
786 class fhandler_dev_mem: public fhandler_base
794 fhandler_dev_mem (const char *name, int unit);
795 ~fhandler_dev_mem (void);
797 int open (const char *path, int flags, mode_t mode = 0);
798 int write (const void *ptr, size_t ulen);
799 int read (void *ptr, size_t ulen);
800 off_t lseek (off_t offset, int whence);
802 int fstat (struct stat *buf);
803 int dup (fhandler_base *child);
805 HANDLE mmap (caddr_t *addr, size_t len, DWORD access, int flags, off_t off);
806 int munmap (HANDLE h, caddr_t addr, size_t len);
807 int msync (HANDLE h, caddr_t addr, size_t len, int flags);
812 class fhandler_dev_clipboard: public fhandler_base
815 fhandler_dev_clipboard (const char *name);
816 int is_windows (void) { return 1; }
817 int open (const char *path, int flags, mode_t mode = 0);
818 int write (const void *ptr, size_t len);
819 int read (void *ptr, size_t len);
820 off_t lseek (off_t offset, int whence);
826 class fhandler_windows: public fhandler_base
829 HWND hWnd_; // the window whose messages are to be retrieved by read() call
830 int method_; // write method (Post or Send)
832 fhandler_windows (const char *name = 0);
833 int is_windows (void) { return 1; }
834 int open (const char *path, int flags, mode_t mode = 0);
835 int write (const void *ptr, size_t len);
836 int read (void *ptr, size_t len);
837 int ioctl (unsigned int cmd, void *);
838 off_t lseek (off_t, int) { return 0; }
839 int close (void) { return 0; }
841 void set_close_on_exec (int val);
842 void fixup_after_fork (HANDLE parent);
843 select_record *select_read (select_record *s);
844 select_record *select_write (select_record *s);
845 select_record *select_except (select_record *s);
846 int ready_for_read (int fd, DWORD howlong, int ignra);
850 /* You can't do this */
853 fhandler_normal normal;
854 fhandler_dev_null dev_null;
859 #define fhandler_union fhandler_console
868 BOOL read_ready, write_ready, except_ready;
869 BOOL read_selected, write_selected, except_selected;
870 int (*startup) (select_record *me, class select_stuff *stuff);
871 int (*poll) (select_record *me, fd_set *readfds, fd_set *writefds,
873 int (*verify) (select_record *me, fd_set *readfds, fd_set *writefds,
875 void (*cleanup) (select_record *me, class select_stuff *stuff);
876 struct select_record *next;
878 select_record (fhandler_base *in_fh = NULL) : fd (0), h (NULL),
879 fh (in_fh), saw_error (0), windows_handle (0),
880 read_ready (0), write_ready (0), except_ready (0),
881 read_selected (0), write_selected (0), except_selected (0),
882 startup (NULL), poll (NULL), verify (NULL), cleanup (NULL),
890 select_stuff (): always_ready (0), windows_used (0), start (0)
892 memset (device_specific, 0, sizeof (device_specific));
894 BOOL always_ready, windows_used;
896 void *device_specific[FH_NDEV];
898 int test_and_set (int i, fd_set *readfds, fd_set *writefds,
900 int poll (fd_set *readfds, fd_set *writefds, fd_set *exceptfds);
901 int wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds, DWORD ms);
904 uid_t __stdcall get_file_owner (int, const char *);
905 gid_t __stdcall get_file_group (int, const char *);
906 int __stdcall set_console_state_for_spawn ();
908 #endif /* _FHANDLER_H_ */