1 /*
2  * virprocess.h: interaction with processes
3  *
4  * Copyright (C) 2010-2015 Red Hat, Inc.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library.  If not, see
18  * <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 #pragma once
23 
24 #include <sys/types.h>
25 
26 #include "internal.h"
27 #include "virbitmap.h"
28 #include "virenum.h"
29 
30 typedef enum {
31     VIR_PROC_POLICY_NONE = 0,
32     VIR_PROC_POLICY_BATCH,
33     VIR_PROC_POLICY_IDLE,
34     VIR_PROC_POLICY_FIFO,
35     VIR_PROC_POLICY_RR,
36 
37     VIR_PROC_POLICY_LAST
38 } virProcessSchedPolicy;
39 
40 VIR_ENUM_DECL(virProcessSchedPolicy);
41 
42 char *
43 virProcessTranslateStatus(int status);
44 
45 void
46 virProcessAbort(pid_t pid);
47 
48 void virProcessExitWithStatus(int status) G_GNUC_NORETURN;
49 
50 int
51 virProcessWait(pid_t pid, int *exitstatus, bool raw)
52     G_GNUC_WARN_UNUSED_RESULT;
53 
54 int virProcessKill(pid_t pid, int sig);
55 int virProcessGroupKill(pid_t pid, int sig);
56 pid_t virProcessGroupGet(pid_t pid);
57 
58 int virProcessKillPainfully(pid_t pid, bool force);
59 int virProcessKillPainfullyDelay(pid_t pid,
60                                  bool force,
61                                  unsigned int extradelay,
62                                  bool group);
63 
64 int virProcessSetAffinity(pid_t pid, virBitmap *map, bool quiet);
65 
66 virBitmap *virProcessGetAffinity(pid_t pid);
67 
68 int virProcessGetPids(pid_t pid, size_t *npids, pid_t **pids);
69 
70 int virProcessGetStartTime(pid_t pid,
71                            unsigned long long *timestamp);
72 
73 int virProcessGetNamespaces(pid_t pid,
74                             size_t *nfdlist,
75                             int **fdlist);
76 
77 int virProcessSetNamespaces(size_t nfdlist,
78                             int *fdlist);
79 
80 int virProcessSetMaxMemLock(pid_t pid, unsigned long long bytes) G_GNUC_NO_INLINE;
81 int virProcessSetMaxProcesses(pid_t pid, unsigned int procs);
82 int virProcessSetMaxFiles(pid_t pid, unsigned int files);
83 int virProcessSetMaxCoreSize(pid_t pid, unsigned long long bytes);
84 
85 int virProcessGetMaxMemLock(pid_t pid, unsigned long long *bytes) G_GNUC_NO_INLINE;
86 
87 /* Callback to run code within the mount namespace tied to the given
88  * pid.  This function must use only async-signal-safe functions, as
89  * it gets run after a fork of a multi-threaded process.  The return
90  * value of this function is passed to _exit(), except that a
91  * negative value is treated as EXIT_CANCELED.  */
92 typedef int (*virProcessNamespaceCallback)(pid_t pid, void *opaque);
93 
94 int virProcessRunInMountNamespace(pid_t pid,
95                                   virProcessNamespaceCallback cb,
96                                   void *opaque);
97 
98 /**
99  * virProcessForkCallback:
100  * @ppid: parent's pid
101  * @opaque: opaque data
102  *
103  * Callback to run in fork()-ed process.
104  *
105  * Returns: 0 on success,
106  *         -1 on error (treated as EXIT_CANCELED)
107  */
108 typedef int (*virProcessForkCallback)(pid_t ppid,
109                                       void *opaque);
110 
111 int virProcessRunInFork(virProcessForkCallback cb,
112                         void *opaque)
113     G_GNUC_NO_INLINE;
114 
115 int virProcessSetupPrivateMountNS(void);
116 
117 int virProcessSetScheduler(pid_t pid,
118                            virProcessSchedPolicy policy,
119                            int priority);
120 
121 GStrv virProcessGetStat(pid_t pid, pid_t tid);
122 
123 /* These constants are modelled after proc(5) */
124 enum {
125     VIR_PROCESS_STAT_PID,
126     VIR_PROCESS_STAT_COMM,
127     VIR_PROCESS_STAT_STATE,
128     VIR_PROCESS_STAT_PPID,
129     VIR_PROCESS_STAT_PGRP,
130     VIR_PROCESS_STAT_SESSION,
131     VIR_PROCESS_STAT_TTY_NR,
132     VIR_PROCESS_STAT_TPGID,
133     VIR_PROCESS_STAT_FLAGS,
134     VIR_PROCESS_STAT_MINFLT,
135     VIR_PROCESS_STAT_CMINFLT,
136     VIR_PROCESS_STAT_MAJFLT,
137     VIR_PROCESS_STAT_CMAJFLT,
138     VIR_PROCESS_STAT_UTIME,
139     VIR_PROCESS_STAT_STIME,
140     VIR_PROCESS_STAT_CUTIME,
141     VIR_PROCESS_STAT_CSTIME,
142     VIR_PROCESS_STAT_PRIORITY,
143     VIR_PROCESS_STAT_NICE,
144     VIR_PROCESS_STAT_NUM_THREADS,
145     VIR_PROCESS_STAT_ITREALVALUE,
146     VIR_PROCESS_STAT_STARTTIME,
147     VIR_PROCESS_STAT_VSIZE,
148     VIR_PROCESS_STAT_RSS,
149     VIR_PROCESS_STAT_RSSLIM,
150     VIR_PROCESS_STAT_STARTCODE,
151     VIR_PROCESS_STAT_ENDCODE,
152     VIR_PROCESS_STAT_STARTSTACK,
153     VIR_PROCESS_STAT_KSTKESP,
154     VIR_PROCESS_STAT_KSTKEIP,
155     VIR_PROCESS_STAT_SIGNAL,
156     VIR_PROCESS_STAT_BLOCKED,
157     VIR_PROCESS_STAT_SIGIGNORE,
158     VIR_PROCESS_STAT_SIGCATCH,
159     VIR_PROCESS_STAT_WCHAN,
160     VIR_PROCESS_STAT_NSWAP,
161     VIR_PROCESS_STAT_CNSWAP,
162     VIR_PROCESS_STAT_EXIT_SIGNAL,
163     VIR_PROCESS_STAT_PROCESSOR,
164     VIR_PROCESS_STAT_RT_PRIORITY,
165     VIR_PROCESS_STAT_POLICY,
166     VIR_PROCESS_STAT_DELAYACCT_BLKIO_TICKS,
167     VIR_PROCESS_STAT_GUEST_TIME,
168     VIR_PROCESS_STAT_CGUEST_TIME,
169     VIR_PROCESS_STAT_START_DATA,
170     VIR_PROCESS_STAT_END_DATA,
171     VIR_PROCESS_STAT_START_BRK,
172     VIR_PROCESS_STAT_ARG_START,
173     VIR_PROCESS_STAT_ARG_END,
174     VIR_PROCESS_STAT_ENV_START,
175     VIR_PROCESS_STAT_ENV_END,
176     VIR_PROCESS_STAT_EXIT_CODE,
177 };
178 
179 /*
180  * At the time of writing there are 52 values reported in /proc/.../stat, the
181  * line below checks that the last one has the right value, increase accordingly
182  * based on proc(5) whenever adding new fields.
183 */
184 G_STATIC_ASSERT(VIR_PROCESS_STAT_EXIT_CODE == 51);
185 
186 typedef enum {
187     VIR_PROCESS_NAMESPACE_MNT = (1 << 1),
188     VIR_PROCESS_NAMESPACE_IPC = (1 << 2),
189     VIR_PROCESS_NAMESPACE_NET = (1 << 3),
190     VIR_PROCESS_NAMESPACE_PID = (1 << 4),
191     VIR_PROCESS_NAMESPACE_USER = (1 << 5),
192     VIR_PROCESS_NAMESPACE_UTS = (1 << 6),
193 } virProcessNamespaceFlags;
194 
195 int virProcessNamespaceAvailable(unsigned int ns);
196