Initial revision
[kopensolaris-gnu/glibc.git] / hurd / hurdioctl.c
1 /* ioctl commands which must be done in the C library.
2 Copyright (C) 1994 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public
16 License along with the GNU C Library; see the file COPYING.LIB.  If
17 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
18 Cambridge, MA 02139, USA.  */
19
20 #include <hurd.h>
21 #include <sys/ioctl.h>
22
23 /* Symbol set of ioctl handler lists.  This definition is here so that when
24    __ioctl refers to it, we will link in fionread et al (below).  */
25
26 const struct
27   {
28     size_t n;
29     struct ioctl_handler *v[0];
30   } _hurd_ioctl_handler_lists;
31 \f
32 /* Find out how many bytes may be read from FD without blocking.  */
33
34 static int
35 fionread (int fd,
36           int request,          /* Always FIONREAD.  */
37           void *arg)
38 {
39   error_t err;
40   int amount;
41
42   if (err = HURD_DPORT_USE (fd, __io_readable (port, &amount)))
43     return __hurd_fail (err);
44
45   *(int *) arg = amount;
46   return 0;
47 }
48
49 _HURD_HANDLE_IOCTL (fionread, FIONREAD);
50 \f
51 /* Make FD be the controlling terminal.
52    This function is called for `ioctl (fd, TCIOSCTTY)'.  */
53
54 static int
55 tiocsctty (int fd,
56            int request,         /* Always TCIOSCTTY.  */
57            void *arg)           /* Not used.  */
58 {
59   mach_port_t cttyid;
60   error_t err;
61
62   /* Get FD's cttyid port, unless it is already ours.  */
63   err = HURD_DPORT_USE (fd,
64                         ctty ? EADDRINUSE : __term_getctty (port, &cttyid));
65   if (err == EADDRINUSE)
66     /* FD is already the ctty.  Nothing to do.  */
67     return 0;
68   else if (err)
69     return __hurd_fail (err);
70
71   /* Make it our own.  */
72   _hurd_port_set (&_hurd_ports[INIT_PORT_CTTYID], cttyid); /* Consumes ref.  */
73
74   /* Reset all the ctty ports in all the descriptors.  */
75   __USEPORT (CTTYID, (rectty_dtable (port), 0));
76
77   return 0;
78 }
79 _HURD_HANDLE_IOCTL (tiocsctty, TIOCSCTTY);
80
81 /* Dissociate from the controlling terminal.  */
82
83 static int
84 tiocnotty (int fd,
85            int request,         /* Always TIOCNOTTY.  */
86            void *arg)           /* Not used.  */
87 {
88   mach_port_t fd_cttyid;
89   error_t err;
90
91   if (err = HURD_DPORT_USE (fd, __term_getctty (port, &fd_cttyid)))
92     return __hurd_fail (err);
93
94   if (__USEPORT (CTTYID, port != fd_cttyid))
95     err = EINVAL;
96
97   __mach_port_deallocate (__mach_task_+self (), fd_cttyid);
98
99   if (err)
100     return __hurd_fail (err);
101
102   /* Clear our cttyid port cell.  */
103   _hurd_port_set (&_hurd_ports[INIT_PORT_CTTYID], MACH_PORT_NULL);
104
105   /* Reset all the ctty ports in all the descriptors.  */
106                                 
107   __USEPORT (CTTYID, (rectty_dtable (MACH_PORT_NULL), 0));
108
109   return 0;
110 }
111 _HURD_HANDLE_IOCTL (tiocnotty, TIOCNOTTY);