1 /* Copyright (C) 1992, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
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 Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, see
16 <http://www.gnu.org/licenses/>. */
19 #include <hurd/msg_server.h>
28 if (auth != mach_task_self () && ! __USEPORT (AUTH, port == auth)) \
32 /* Snarfing and frobbing the init ports. */
35 _S_msg_get_init_port (mach_port_t msgport, mach_port_t auth, int which,
36 mach_port_t *result, mach_msg_type_name_t *result_type)
39 *result_type = MACH_MSG_TYPE_MOVE_SEND;
40 /* This function adds a new user reference for the *RESULT it gives back.
41 Our reply message uses a move-send right that consumes this reference. */
42 return _hurd_ports_get (which, result);
46 _S_msg_set_init_port (mach_port_t msgport, mach_port_t auth,
47 int which, mach_port_t port)
53 err = _hurd_ports_set (which, port);
55 __mach_port_deallocate (__mach_task_self (), port);
61 _S_msg_get_init_ports (mach_port_t msgport, mach_port_t auth,
63 mach_msg_type_name_t *ports_type,
64 mach_msg_type_number_t *nports)
66 mach_msg_type_number_t i;
71 if (err = __vm_allocate (__mach_task_self (), (vm_address_t *) ports,
72 _hurd_nports * sizeof (mach_port_t), 1))
74 *nports = _hurd_nports;
76 for (i = 0; i < _hurd_nports; ++i)
77 /* This function adds a new user ref for the *RESULT it gives back.
78 Our reply message uses move-send rights that consumes this ref. */
79 if (err = _hurd_ports_get (i, &(*ports)[i]))
81 /* Died part way through. Deallocate the ports already fetched. */
83 __mach_port_deallocate (__mach_task_self (), (*ports)[i]);
84 __vm_deallocate (__mach_task_self (),
85 (vm_address_t) *ports,
86 *nports * sizeof (mach_port_t));
90 *ports_type = MACH_MSG_TYPE_MOVE_SEND;
95 _S_msg_set_init_ports (mach_port_t msgport, mach_port_t auth,
96 mach_port_t *ports, mach_msg_type_number_t nports)
98 mach_msg_type_number_t i;
103 for (i = 0; i < _hurd_nports; ++i)
105 if (err = _hurd_ports_set (i, ports[i]))
108 __mach_port_deallocate (__mach_task_self (), ports[i]);
114 /* Snarfing and frobbing the init ints. */
117 get_int (int which, int *value)
122 *value = _hurd_umask;
126 struct hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread);
127 __spin_lock (&ss->lock);
128 *value = ss->blocked;
129 __spin_unlock (&ss->lock);
132 case INIT_SIGPENDING:
134 struct hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread);
135 __spin_lock (&ss->lock);
136 *value = ss->pending;
137 __spin_unlock (&ss->lock);
142 struct hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread);
145 __spin_lock (&ss->lock);
146 __sigemptyset (&ign);
147 for (sig = 1; sig < NSIG; ++sig)
148 if (ss->actions[sig].sa_handler == SIG_IGN)
149 __sigaddset (&ign, sig);
150 __spin_unlock (&ss->lock);
160 _S_msg_get_init_int (mach_port_t msgport, mach_port_t auth,
161 int which, int *value)
165 return get_int (which, value);
169 _S_msg_get_init_ints (mach_port_t msgport, mach_port_t auth,
170 int **values, mach_msg_type_number_t *nvalues)
173 mach_msg_type_number_t i;
177 if (err = __vm_allocate (__mach_task_self (), (vm_address_t *) values,
178 INIT_INT_MAX * sizeof (int), 1))
180 *nvalues = INIT_INT_MAX;
182 for (i = 0; i < INIT_INT_MAX; ++i)
183 switch (err = get_int (i, &(*values)[i]))
185 case 0: /* Success. */
187 case EINVAL: /* Unknown index. */
190 default: /* Lossage. */
191 __vm_deallocate (__mach_task_self (),
192 (vm_address_t) *values, INIT_INT_MAX * sizeof (int));
201 set_int (int which, int value)
209 /* These are pretty odd things to do. But you asked for it. */
212 struct hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread);
213 __spin_lock (&ss->lock);
215 __spin_unlock (&ss->lock);
218 case INIT_SIGPENDING:
220 struct hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread);
221 __spin_lock (&ss->lock);
223 __spin_unlock (&ss->lock);
228 struct hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread);
230 const sigset_t ign = value;
231 __spin_lock (&ss->lock);
232 for (sig = 1; sig < NSIG; ++sig)
234 if (__sigismember (&ign, sig))
235 ss->actions[sig].sa_handler = SIG_IGN;
236 else if (ss->actions[sig].sa_handler == SIG_IGN)
237 ss->actions[sig].sa_handler = SIG_DFL;
239 __spin_unlock (&ss->lock);
243 _hurdsig_traced = value;
252 _S_msg_set_init_int (mach_port_t msgport, mach_port_t auth,
253 int which, int value)
257 return set_int (which, value);
261 _S_msg_set_init_ints (mach_port_t msgport, mach_port_t auth,
262 int *values, mach_msg_type_number_t nvalues)
265 mach_msg_type_number_t i;
269 for (i = 0; i < INIT_INT_MAX; ++i)
270 switch (err = set_int (i, values[i]))
272 case 0: /* Success. */
274 case EINVAL: /* Unknown index. */
276 default: /* Lossage. */
285 _S_msg_get_fd (mach_port_t msgport, mach_port_t auth, int which,
286 mach_port_t *result, mach_msg_type_name_t *result_type)
290 /* This creates a new user reference for the send right.
291 Our reply message will move that reference to the caller. */
292 *result = __getdport (which);
293 if (*result == MACH_PORT_NULL)
295 *result_type = MACH_MSG_TYPE_MOVE_SEND;
301 _S_msg_set_fd (mach_port_t msgport, mach_port_t auth,
302 int which, mach_port_t port)
306 /* We consume the reference if successful. */
307 return HURD_FD_USE (which, (_hurd_port2fd (descriptor, port, 0), 0));
310 /* Snarfing and frobbing environment variables. */
313 _S_msg_get_env_variable (mach_port_t msgport,
315 char **data, mach_msg_type_number_t *datalen)
318 mach_msg_type_number_t valuelen;
319 const char *value = getenv (variable);
324 valuelen = strlen (value);
325 if (valuelen > *datalen)
327 if (err = __vm_allocate (__mach_task_self (),
328 (vm_address_t *) data, valuelen, 1))
332 memcpy (*data, value, valuelen);
340 _S_msg_set_env_variable (mach_port_t msgport, mach_port_t auth,
347 if (setenv (variable, value, replace)) /* XXX name space */
353 _S_msg_get_environment (mach_port_t msgport,
354 char **data, mach_msg_type_number_t *datalen)
356 /* Pack the environment into an array with nulls separating elements. */
357 if (__environ != NULL)
362 for (p = __environ; *p != NULL; ++p)
363 envlen += strlen (*p) + 1;
365 if (envlen > *datalen)
367 if (__vm_allocate (__mach_task_self (),
368 (vm_address_t *) data, envlen, 1))
373 for (p = __environ; *p != NULL; ++p)
374 ap = __memccpy (ap, *p, '\0', ULONG_MAX);
385 _S_msg_set_environment (mach_port_t msgport, mach_port_t auth,
386 char *data, mach_msg_type_number_t datalen)
388 int _hurd_split_args (char *, mach_msg_type_number_t, char **);
394 envc = __argz_count (data, datalen);
395 envp = malloc ((envc + 1) * sizeof (char *));
398 __argz_extract (data, datalen, envp);
399 __environ = envp; /* XXX cooperate with loadenv et al */
407 _S_msg_get_dtable (mach_port_t process,
410 mach_msg_type_name_t *dtablePoly,
411 mach_msg_type_number_t *dtableCnt)
412 { return EOPNOTSUPP; }
415 _S_msg_set_dtable (mach_port_t process,
418 mach_msg_type_number_t dtableCnt)
419 { return EOPNOTSUPP; }