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
|
#define _GNU_SOURCE
#include <errno.h>
#include <error.h>
#include <fcntl.h>
#include <hurd.h>
#include <mach.h>
#include <stdio.h>
void
dosth (void)
{
mach_port_t foo;
mach_port_t bar = MACH_PORT_DEAD;
foo = file_name_lookup ("/dev", O_NOTRANS, 0);
if (! MACH_PORT_VALID (foo))
error (1, errno, "file_name_lookup");
fprintf (stderr, "dosth looked up %d\n", foo);
}
void
donothing (mach_port_t *p)
{
}
void
dosthelse (mach_port_t *p)
{
*p = file_name_lookup ("/bin", O_NOTRANS, 0);
if (! MACH_PORT_VALID (*p))
error (1, errno, "file_name_lookup");
fprintf (stderr, "dosthelse looked up %d\n", *p);
donothing (p);
}
mach_port_t some_port;
mach_port_t some_other_port;
void
dosthglobal (void)
{
some_port = file_name_lookup ("/sbin", O_NOTRANS, 0);
if (! MACH_PORT_VALID (some_port))
error (1, errno, "file_name_lookup");
fprintf (stderr, "dosthglobal looked up %d\n", some_port);
some_other_port = some_port;
some_port = MACH_PORT_NULL;
}
void
doleakreceive (void)
{
mach_port_t foo;
error_t err = mach_port_allocate (mach_task_self (),
MACH_PORT_RIGHT_RECEIVE,
&foo);
if (err)
error (1, errno, "mach_port_allocate");
fprintf (stderr, "allocated receive port %d\n", foo);
}
void
dolookupcwd (void)
{
mach_port_t foo;
foo = getcwdir ();
if (! MACH_PORT_VALID (foo))
error (1, errno, "file_name_lookup");
fprintf (stderr, "dolookupcwd looked up %d\n", foo);
}
void
gopinniped (void)
{
mach_port_deallocate (mach_task_self (), 12345);
mach_port_destroy (mach_task_self (), 54321);
}
int
main ()
{
dosth ();
mach_port_t *p = malloc (sizeof *p);
dosthelse (p);
free (p);
dosthglobal ();
some_other_port = MACH_PORT_NULL;
doleakreceive ();
dolookupcwd ();
gopinniped ();
return 0;
}
|