xref: /haiku/src/system/libroot/posix/unistd/process.c (revision df4074fbed092b09474695aa286752ca41625332)
1 /*
2  * Copyright 2002-2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include <syscalls.h>
8 #include <syscall_process_info.h>
9 
10 #include <unistd.h>
11 #include <string.h>
12 #include <errno.h>
13 
14 #include <errno_private.h>
15 #include <syscall_utils.h>
16 
17 
18 extern thread_id __main_thread_id;
19 
20 
21 pid_t
22 getpgrp(void)
23 {
24 	return getpgid(__main_thread_id);
25 }
26 
27 
28 pid_t
29 getpid(void)
30 {
31 	// this one returns the ID of the main thread
32 	return __main_thread_id;
33 }
34 
35 
36 pid_t
37 getppid(void)
38 {
39 	return _kern_process_info(0, PARENT_ID);
40 		// this is not supposed to return an error value
41 }
42 
43 
44 pid_t
45 getsid(pid_t process)
46 {
47 	pid_t session = _kern_process_info(process, SESSION_ID);
48 
49 	RETURN_AND_SET_ERRNO(session);
50 }
51 
52 
53 pid_t
54 getpgid(pid_t process)
55 {
56 	pid_t group = _kern_process_info(process, GROUP_ID);
57 
58 	RETURN_AND_SET_ERRNO(group);
59 }
60 
61 
62 int
63 setpgid(pid_t process, pid_t group)
64 {
65 	pid_t result = _kern_setpgid(process, group);
66 	if (result >= 0)
67 		return 0;
68 
69 	RETURN_AND_SET_ERRNO(result);
70 }
71 
72 
73 pid_t
74 setpgrp(void)
75 {
76 	// setpgrp() never fails -- setpgid() fails when the process is a session
77 	// leader, though.
78 	pid_t result = _kern_setpgid(0, 0);
79 	return result >= 0 ? result : getpgrp();
80 }
81 
82 
83 pid_t
84 setsid(void)
85 {
86 	status_t status = _kern_setsid();
87 
88 	RETURN_AND_SET_ERRNO(status);
89 }
90 
91