]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/basic/process-util.h
process-spec: add another flag FORK_WAIT to safe_fork()
[thirdparty/systemd.git] / src / basic / process-util.h
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
0b452006
RC
2#pragma once
3
4/***
5 This file is part of systemd.
6
7 Copyright 2010 Lennart Poettering
8
9 systemd is free software; you can redistribute it and/or modify it
10 under the terms of the GNU Lesser General Public License as published by
11 the Free Software Foundation; either version 2.1 of the License, or
12 (at your option) any later version.
13
14 systemd is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 Lesser General Public License for more details.
18
19 You should have received a copy of the GNU Lesser General Public License
20 along with systemd; If not, see <http://www.gnu.org/licenses/>.
21***/
22
0b452006 23#include <alloca.h>
29ea9f0f 24#include <sched.h>
71d35b6b
TA
25#include <signal.h>
26#include <stdbool.h>
11c3a366 27#include <stddef.h>
0b452006
RC
28#include <stdio.h>
29#include <string.h>
41bf0590 30#include <sys/resource.h>
7f452159 31#include <sys/types.h>
0b452006 32
f97b34a6 33#include "format-util.h"
7f452159 34#include "ioprio.h"
7b3e062c 35#include "macro.h"
d5641e0d 36#include "time-util.h"
0b452006
RC
37
38#define procfs_file_alloca(pid, field) \
39 ({ \
40 pid_t _pid_ = (pid); \
41 const char *_r_; \
42 if (_pid_ == 0) { \
43 _r_ = ("/proc/self/" field); \
44 } else { \
fbd0b64f 45 _r_ = alloca(STRLEN("/proc/") + DECIMAL_STR_MAX(pid_t) + 1 + sizeof(field)); \
0b452006
RC
46 sprintf((char*) _r_, "/proc/"PID_FMT"/" field, _pid_); \
47 } \
48 _r_; \
49 })
50
51int get_process_state(pid_t pid);
52int get_process_comm(pid_t pid, char **name);
53int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line);
54int get_process_exe(pid_t pid, char **name);
55int get_process_uid(pid_t pid, uid_t *uid);
56int get_process_gid(pid_t pid, gid_t *gid);
57int get_process_capeff(pid_t pid, char **capeff);
58int get_process_cwd(pid_t pid, char **cwd);
59int get_process_root(pid_t pid, char **root);
60int get_process_environ(pid_t pid, char **environ);
6bc73acb 61int get_process_ppid(pid_t pid, pid_t *ppid);
0b452006
RC
62
63int wait_for_terminate(pid_t pid, siginfo_t *status);
7d4904fe
LP
64
65typedef enum WaitFlags {
66 WAIT_LOG_ABNORMAL = 1U << 0,
67 WAIT_LOG_NON_ZERO_EXIT_STATUS = 1U << 1,
68
69 /* A shortcut for requesting the most complete logging */
70 WAIT_LOG = WAIT_LOG_ABNORMAL|WAIT_LOG_NON_ZERO_EXIT_STATUS,
71} WaitFlags;
72
73int wait_for_terminate_and_check(const char *name, pid_t pid, WaitFlags flags);
d5641e0d 74int wait_for_terminate_with_timeout(pid_t pid, usec_t timeout);
0b452006 75
89c9030d
LP
76void sigkill_wait(pid_t pid);
77void sigkill_waitp(pid_t *pid);
4d0d3d41 78
0b452006 79int kill_and_sigcont(pid_t pid, int sig);
405f8907 80
9bfaffd5 81int rename_process(const char name[]);
0b452006 82int is_kernel_thread(pid_t pid);
405f8907 83
0b452006
RC
84int getenv_for_pid(pid_t pid, const char *field, char **_value);
85
86bool pid_is_alive(pid_t pid);
87bool pid_is_unwaited(pid_t pid);
1359fffa 88int pid_from_same_root_fs(pid_t pid);
d4510856
LP
89
90bool is_main_thread(void);
ceee6d3a 91
7b3e062c
LP
92noreturn void freeze(void);
93
94bool oom_score_adjust_is_valid(int oa);
95
96#ifndef PERSONALITY_INVALID
97/* personality(7) documents that 0xffffffffUL is used for querying the
98 * current personality, hence let's use that here as error
99 * indicator. */
100#define PERSONALITY_INVALID 0xffffffffLU
101#endif
102
103unsigned long personality_from_string(const char *p);
104const char *personality_to_string(unsigned long);
105
21022b9d 106int safe_personality(unsigned long p);
e8132d63
LP
107int opinionated_personality(unsigned long *ret);
108
7b3e062c
LP
109int ioprio_class_to_string_alloc(int i, char **s);
110int ioprio_class_from_string(const char *s);
111
112const char *sigchld_code_to_string(int i) _const_;
113int sigchld_code_from_string(const char *s) _pure_;
114
115int sched_policy_to_string_alloc(int i, char **s);
116int sched_policy_from_string(const char *s);
117
ceee6d3a
LP
118#define PTR_TO_PID(p) ((pid_t) ((uintptr_t) p))
119#define PID_TO_PTR(p) ((void*) ((uintptr_t) p))
dcadc967
EV
120
121void valgrind_summary_hack(void);
291d565a
LP
122
123int pid_compare_func(const void *a, const void *b);
41bf0590
LP
124
125static inline bool nice_is_valid(int n) {
126 return n >= PRIO_MIN && n < PRIO_MAX;
127}
7f452159 128
29ea9f0f
YW
129static inline bool sched_policy_is_valid(int i) {
130 return IN_SET(i, SCHED_OTHER, SCHED_BATCH, SCHED_IDLE, SCHED_FIFO, SCHED_RR);
131}
132
133static inline bool sched_priority_is_valid(int i) {
134 return i >= 0 && i <= sched_get_priority_max(SCHED_RR);
135}
136
7f452159
LP
137static inline bool ioprio_class_is_valid(int i) {
138 return IN_SET(i, IOPRIO_CLASS_NONE, IOPRIO_CLASS_RT, IOPRIO_CLASS_BE, IOPRIO_CLASS_IDLE);
139}
140
141static inline bool ioprio_priority_is_valid(int i) {
142 return i >= 0 && i < IOPRIO_BE_NR;
143}
144
54191eb3
LP
145static inline bool pid_is_valid(pid_t p) {
146 return p > 0;
147}
148
33d12153
YW
149static inline int sched_policy_to_string_alloc_with_check(int n, char **s) {
150 if (!sched_policy_is_valid(n))
151 return -EINVAL;
152
153 return sched_policy_to_string_alloc(n, s);
154}
155
7f452159 156int ioprio_parse_priority(const char *s, int *ret);
5c30a6d2
LP
157
158pid_t getpid_cached(void);
799a960d 159void reset_cached_pid(void);
fba868fa
LP
160
161int must_be_root(void);
4c253ed1
LP
162
163typedef enum ForkFlags {
164 FORK_RESET_SIGNALS = 1U << 0,
165 FORK_CLOSE_ALL_FDS = 1U << 1,
166 FORK_DEATHSIG = 1U << 2,
167 FORK_NULL_STDIO = 1U << 3,
168 FORK_REOPEN_LOG = 1U << 4,
b6e1fff1 169 FORK_LOG = 1U << 5,
1f5d1e02 170 FORK_WAIT = 1U << 6,
4c253ed1
LP
171} ForkFlags;
172
173int safe_fork_full(const char *name, const int except_fds[], size_t n_except_fds, ForkFlags flags, pid_t *ret_pid);
174
175static inline int safe_fork(const char *name, ForkFlags flags, pid_t *ret_pid) {
176 return safe_fork_full(name, NULL, 0, flags, ret_pid);
177}
78752f2e
LP
178
179int fork_agent(const char *name, const int except[], unsigned n_except, pid_t *pid, const char *path, ...);