xref: /openbmc/linux/include/linux/umh.h (revision 861dc0b4)
1c1f3fa2aSLuis R. Rodriguez #ifndef __LINUX_UMH_H__
2c1f3fa2aSLuis R. Rodriguez #define __LINUX_UMH_H__
3c1f3fa2aSLuis R. Rodriguez 
4c1f3fa2aSLuis R. Rodriguez #include <linux/gfp.h>
5c1f3fa2aSLuis R. Rodriguez #include <linux/stddef.h>
6c1f3fa2aSLuis R. Rodriguez #include <linux/errno.h>
7c1f3fa2aSLuis R. Rodriguez #include <linux/compiler.h>
8c1f3fa2aSLuis R. Rodriguez #include <linux/workqueue.h>
9c1f3fa2aSLuis R. Rodriguez #include <linux/sysctl.h>
10c1f3fa2aSLuis R. Rodriguez 
11c1f3fa2aSLuis R. Rodriguez struct cred;
12c1f3fa2aSLuis R. Rodriguez struct file;
13c1f3fa2aSLuis R. Rodriguez 
14*1fbcaa92SPeter Zijlstra #define UMH_NO_WAIT	0x00	/* don't wait at all */
15*1fbcaa92SPeter Zijlstra #define UMH_WAIT_EXEC	0x01	/* wait for the exec, but not the process */
16*1fbcaa92SPeter Zijlstra #define UMH_WAIT_PROC	0x02	/* wait for the process to complete */
17*1fbcaa92SPeter Zijlstra #define UMH_KILLABLE	0x04	/* wait for EXEC/PROC killable */
18*1fbcaa92SPeter Zijlstra #define UMH_FREEZABLE	0x08	/* wait for EXEC/PROC freezable */
19c1f3fa2aSLuis R. Rodriguez 
20c1f3fa2aSLuis R. Rodriguez struct subprocess_info {
21c1f3fa2aSLuis R. Rodriguez 	struct work_struct work;
22c1f3fa2aSLuis R. Rodriguez 	struct completion *complete;
23c1f3fa2aSLuis R. Rodriguez 	const char *path;
24c1f3fa2aSLuis R. Rodriguez 	char **argv;
25c1f3fa2aSLuis R. Rodriguez 	char **envp;
26c1f3fa2aSLuis R. Rodriguez 	int wait;
27c1f3fa2aSLuis R. Rodriguez 	int retval;
28c1f3fa2aSLuis R. Rodriguez 	int (*init)(struct subprocess_info *info, struct cred *new);
29c1f3fa2aSLuis R. Rodriguez 	void (*cleanup)(struct subprocess_info *info);
30c1f3fa2aSLuis R. Rodriguez 	void *data;
31c1f3fa2aSLuis R. Rodriguez } __randomize_layout;
32c1f3fa2aSLuis R. Rodriguez 
33c1f3fa2aSLuis R. Rodriguez extern int
34c1f3fa2aSLuis R. Rodriguez call_usermodehelper(const char *path, char **argv, char **envp, int wait);
35c1f3fa2aSLuis R. Rodriguez 
36c1f3fa2aSLuis R. Rodriguez extern struct subprocess_info *
37c1f3fa2aSLuis R. Rodriguez call_usermodehelper_setup(const char *path, char **argv, char **envp,
38c1f3fa2aSLuis R. Rodriguez 			  gfp_t gfp_mask,
39c1f3fa2aSLuis R. Rodriguez 			  int (*init)(struct subprocess_info *info, struct cred *new),
40c1f3fa2aSLuis R. Rodriguez 			  void (*cleanup)(struct subprocess_info *), void *data);
41c1f3fa2aSLuis R. Rodriguez 
42c1f3fa2aSLuis R. Rodriguez extern int
43c1f3fa2aSLuis R. Rodriguez call_usermodehelper_exec(struct subprocess_info *info, int wait);
44c1f3fa2aSLuis R. Rodriguez 
45c1f3fa2aSLuis R. Rodriguez enum umh_disable_depth {
46c1f3fa2aSLuis R. Rodriguez 	UMH_ENABLED = 0,
47c1f3fa2aSLuis R. Rodriguez 	UMH_FREEZING,
48c1f3fa2aSLuis R. Rodriguez 	UMH_DISABLED,
49c1f3fa2aSLuis R. Rodriguez };
50c1f3fa2aSLuis R. Rodriguez 
51c1f3fa2aSLuis R. Rodriguez extern int __usermodehelper_disable(enum umh_disable_depth depth);
52c1f3fa2aSLuis R. Rodriguez extern void __usermodehelper_set_disable_depth(enum umh_disable_depth depth);
53c1f3fa2aSLuis R. Rodriguez 
usermodehelper_disable(void)54c1f3fa2aSLuis R. Rodriguez static inline int usermodehelper_disable(void)
55c1f3fa2aSLuis R. Rodriguez {
56c1f3fa2aSLuis R. Rodriguez 	return __usermodehelper_disable(UMH_DISABLED);
57c1f3fa2aSLuis R. Rodriguez }
58c1f3fa2aSLuis R. Rodriguez 
usermodehelper_enable(void)59c1f3fa2aSLuis R. Rodriguez static inline void usermodehelper_enable(void)
60c1f3fa2aSLuis R. Rodriguez {
61c1f3fa2aSLuis R. Rodriguez 	__usermodehelper_set_disable_depth(UMH_ENABLED);
62c1f3fa2aSLuis R. Rodriguez }
63c1f3fa2aSLuis R. Rodriguez 
64c1f3fa2aSLuis R. Rodriguez extern int usermodehelper_read_trylock(void);
65c1f3fa2aSLuis R. Rodriguez extern long usermodehelper_read_lock_wait(long timeout);
66c1f3fa2aSLuis R. Rodriguez extern void usermodehelper_read_unlock(void);
67c1f3fa2aSLuis R. Rodriguez 
68c1f3fa2aSLuis R. Rodriguez #endif /* __LINUX_UMH_H__ */
69