Formerly ../hurd/alloc-fd.c.~6~
[kopensolaris-gnu/glibc.git] / hurd / hurdmsg.c
1 /* Copyright (C) 1992, 1994 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public
15 License along with the GNU C Library; see the file COPYING.LIB.  If
16 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
17 Cambridge, MA 02139, USA.  */
18
19 #include <hurd.h>
20 #include "hurd/msg_server.h"
21
22 error_t
23 __get_init_port (mach_port_t msgport, mach_port_t auth,
24                  int which, mach_port_t *port)
25 {
26   if (auth != mach_task_self () && ! __USEPORT (AUTH, port == auth))
27     return EPERM;
28
29   switch (which)
30     {
31     case INIT_PORT_CWDIR:
32       *port = get (&_hurd_cwdir);
33       return 0;
34     case INIT_PORT_CRDIR:
35       *port = get (&_hurd_crdir);
36       return 0;
37     case INIT_PORT_PROC:
38       *port = get (&_hurd_proc);
39       return 0;
40     case INIT_PORT_AUTH:
41       *port = get (&_hurd_auth);
42       return 0;
43     case INIT_PORT_LOGINCOLL:
44       return EOPNOTSUPP;        /* XXX */
45     case INIT_PORT_BOOTSTRAP:
46       return __task_get_special_port (__mach_task_self (),
47                                       TASK_BOOTSTRAP_PORT,
48                                       port);
49     default:
50       return EINVAL;
51     }
52 }
53
54 error_t
55 __set_init_port (mach_port_t msgport, mach_port_t auth,
56                  int which, mach_port_t port)
57 {
58   if (auth != mach_task_self () && ! __USEPORT (AUTH, port == auth))
59     return EPERM;
60
61   switch (which)
62     {
63     case INIT_PORT_CWDIR:
64       set (&_hurd_cwdir);
65       return 0;
66     case INIT_PORT_CRDIR:
67       set (&_hurd_crdir);
68       return 0;
69     case INIT_PORT_PROC:
70       set (&_hurd_proc); /* XXX do more? */
71       return 0;
72     case INIT_PORT_AUTH:
73       __setauth (&_hurd_auth);
74       return errno;             /* XXX can't clobber errno */
75     case INIT_PORT_LOGINCOLL:
76       return EOPNOTSUPP;        /* XXX */
77     case INIT_PORT_BOOTSTRAP:
78       return __task_set_special_port (__mach_task_self (),
79                                       TASK_BOOTSTRAP_PORT,
80                                       port);
81     default:
82       return EINVAL;
83     }
84 }
85
86 error_t
87 __get_init_int (mach_port_t msgport, mach_port_t auth,
88                 int which, int *value)
89 {
90   if (task != mach_task_self () &&
91       _HURD_PORT_USE (&_hurd_auth, auth != port))
92     return EPERM;
93
94   switch (which)
95     {
96     case INIT_UMASK:
97       *value = _hurd_umask;
98       return 0;
99     case INIT_SIGMASK:
100       {
101         struct _hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread);
102         *value = ss->blocked;
103         __mutex_unlock (&ss->lock);
104         return 0;
105       }
106     case INIT_SIGIGN:
107       {
108         struct _hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread);
109         sigset_t ign;
110         int sig;
111         __sigemptyset (&ign);
112         for (sig = 1; sig < NSIG; ++sig)
113           if (ss->actions[sig].sa_handler == SIG_IGN)
114             __sigaddset (&ign, sig);
115         __mutex_unlock (&ss->lock);
116         *value = ign;
117         return 0;
118       }
119       /* XXX ctty crap */
120     default:
121       return EINVAL;
122     }
123 }