1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
|
/* Copyright (C) 1993-2025 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#ifndef _HURD_H
#define _HURD_H 1
#include <features.h>
/* Get types, macros, constants and function declarations
for all Mach microkernel interaction. */
#include <mach.h>
#include <mach/mig_errors.h>
/* Get types and constants necessary for Hurd interfaces. */
#include <hurd/hurd_types.h>
/* Get MiG stub declarations for commonly used Hurd interfaces. */
#include <hurd/auth.h>
#include <hurd/process.h>
#include <hurd/fs.h>
#include <hurd/io.h>
/* Get `struct hurd_port' and related definitions implementing lightweight
user references for ports. These are used pervasively throughout the C
library; this is here to avoid putting it in nearly every source file. */
#include <hurd/port.h>
#include <errno.h>
#include <bits/types/error_t.h>
#include <bits/types/sigset_t.h>
#ifndef _HURD_H_EXTERN_INLINE
#define _HURD_H_EXTERN_INLINE __extern_inline
#endif
extern int __hurd_fail (error_t err) __COLD;
#ifdef __USE_EXTERN_INLINES
_HURD_H_EXTERN_INLINE int
__hurd_fail (error_t err)
{
switch (err)
{
case EMACH_SEND_INVALID_DEST:
case EMIG_SERVER_DIED:
/* The server has disappeared! */
err = (error_t) EIEIO;
break;
case KERN_NO_SPACE:
err = (error_t) ENOMEM;
break;
case KERN_INVALID_ADDRESS:
case KERN_INVALID_ARGUMENT:
err = (error_t) EINVAL;
break;
case 0:
return 0;
default:
break;
}
errno = err;
return -1;
}
#endif
/* Basic ports and info, initialized by startup. */
extern int _hurd_exec_flags; /* Flags word passed in exec_startup. */
extern struct hurd_port *_hurd_ports;
extern unsigned int _hurd_nports;
extern mode_t _hurd_umask;
extern sigset_t _hurdsig_traced;
/* Shorthand macro for internal library code referencing _hurd_ports (see
<hurd/port.h>). */
/* Also see __USEPORT_CANCEL. */
#define __USEPORT(which, expr) \
HURD_PORT_USE (&_hurd_ports[INIT_PORT_##which], (expr))
/* Function version of __USEPORT: calls OPERATE with a send right. */
extern error_t _hurd_ports_use (int which, error_t (*operate) (mach_port_t));
/* Base address and size of the initial stack set up by the exec server.
Not locked. */
extern vm_address_t _hurd_stack_base;
extern vm_size_t _hurd_stack_size;
/* Initial file descriptor table we were passed at startup. If we are
using a real dtable, these are turned into that and then cleared at
startup. If not, these are never changed after startup. Not locked. */
extern mach_port_t *_hurd_init_dtable;
extern mach_msg_type_number_t _hurd_init_dtablesize;
/* Current process IDs. */
extern pid_t _hurd_pid, _hurd_ppid, _hurd_pgrp;
extern int _hurd_orphaned;
/* This variable is incremented every time the process IDs change. */
extern unsigned int _hurd_pids_changed_stamp;
/* Unix `data break', for brk and sbrk.
If brk and sbrk are not used, this info will not be initialized or used. */
/* Data break. This is what `sbrk (0)' returns. */
extern vm_address_t _hurd_brk;
/* End of allocated space. This is generally `round_page (_hurd_brk)'. */
extern vm_address_t _hurd_data_end;
/* This mutex locks _hurd_brk and _hurd_data_end. */
extern struct mutex _hurd_brk_lock;
/* Set the data break to NEWBRK; _hurd_brk_lock must
be held, and is released on return. */
extern int _hurd_set_brk (vm_address_t newbrk);
#include <bits/types/FILE.h>
/* Calls to get and set basic ports. */
extern error_t _hurd_ports_get (unsigned int which, mach_port_t *result);
extern error_t _hurd_ports_set (unsigned int which, mach_port_t newport);
extern process_t getproc (void);
extern file_t getcwdir (void), getcrdir (void);
extern auth_t getauth (void);
extern mach_port_t getcttyid (void);
extern int setproc (process_t);
extern int setcwdir (file_t), setcrdir (file_t);
extern int setcttyid (mach_port_t);
/* Does reauth with the proc server and fd io servers. */
extern int __setauth (auth_t), setauth (auth_t);
/* Modify a port cell by looking up a directory name.
This verifies that it is a directory and that we have search permission. */
extern int _hurd_change_directory_port_from_name (struct hurd_port *portcell,
const char *name);
/* Same thing, but using an open file descriptor.
Also verifies that it is a directory and that we have search permission. */
extern int _hurd_change_directory_port_from_fd (struct hurd_port *portcell,
int fd);
/* Get and set the effective UID set. */
extern int geteuids (int __n, uid_t *__uidset);
extern int seteuids (int __n, const uid_t *__uidset);
/* Split FILE into a directory and a name within the directory. The
directory lookup uses the current root and working directory. If
successful, stores in *NAME a pointer into FILE where the name
within directory begins and returns a port to the directory;
otherwise sets `errno' and returns MACH_PORT_NULL. */
extern file_t __file_name_split (const char *file, char **name);
extern file_t file_name_split (const char *file, char **name);
/* Split DIRECTORY into a parent directory and a name within the directory.
This is the same as file_name_split, but ignores trailing slashes. */
extern file_t __directory_name_split (const char *file, char **name);
extern file_t directory_name_split (const char *file, char **name);
/* Open a port to FILE with the given FLAGS and MODE (see <fcntl.h>).
The file lookup uses the current root and working directory.
Returns a port to the file if successful; otherwise sets `errno'
and returns MACH_PORT_NULL. */
extern file_t __file_name_lookup (const char *file, int flags, mode_t mode);
extern file_t file_name_lookup (const char *file, int flags, mode_t mode);
/* Open a port to FILE with the given FLAGS and MODE (see <fcntl.h>). The
file lookup uses the current root directory, but uses STARTDIR as the
"working directory" for file relative names. Returns a port to the file
if successful; otherwise sets `errno' and returns MACH_PORT_NULL. */
extern file_t __file_name_lookup_under (file_t startdir, const char *file,
int flags, mode_t mode);
extern file_t file_name_lookup_under (file_t startdir, const char *file,
int flags, mode_t mode);
/* Lookup FILE_NAME and return the node opened with FLAGS & MODE
(see hurd_file_name_lookup for details), but a simple file name (without
any directory prefixes) will be consecutively prefixed with the pathnames
in the `:' separated list PATH until one succeeds in a successful lookup.
If none succeed, then the first error that wasn't ENOENT is returned, or
ENOENT i
|