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