summaryrefslogtreecommitdiff
path: root/test/test.c
blob: b3012d7940f0dc4d82ce5d185723f209baaee4a9 (plain)
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;
}