1 #ifndef __LINUX_UMH_H__ 2 #define __LINUX_UMH_H__ 3 4 #include <linux/gfp.h> 5 #include <linux/stddef.h> 6 #include <linux/errno.h> 7 #include <linux/compiler.h> 8 #include <linux/workqueue.h> 9 #include <linux/sysctl.h> 10 11 struct cred; 12 struct file; 13 14 #define UMH_NO_WAIT 0 /* don't wait at all */ 15 #define UMH_WAIT_EXEC 1 /* wait for the exec, but not the process */ 16 #define UMH_WAIT_PROC 2 /* wait for the process to complete */ 17 #define UMH_KILLABLE 4 /* wait for EXEC/PROC killable */ 18 19 struct subprocess_info { 20 struct work_struct work; 21 struct completion *complete; 22 const char *path; 23 char **argv; 24 char **envp; 25 struct file *file; 26 int wait; 27 int retval; 28 pid_t pid; 29 int (*init)(struct subprocess_info *info, struct cred *new); 30 void (*cleanup)(struct subprocess_info *info); 31 void *data; 32 } __randomize_layout; 33 34 extern int 35 call_usermodehelper(const char *path, char **argv, char **envp, int wait); 36 37 extern struct subprocess_info * 38 call_usermodehelper_setup(const char *path, char **argv, char **envp, 39 gfp_t gfp_mask, 40 int (*init)(struct subprocess_info *info, struct cred *new), 41 void (*cleanup)(struct subprocess_info *), void *data); 42 43 struct subprocess_info *call_usermodehelper_setup_file(struct file *file, 44 int (*init)(struct subprocess_info *info, struct cred *new), 45 void (*cleanup)(struct subprocess_info *), void *data); 46 struct umh_info { 47 const char *cmdline; 48 struct file *pipe_to_umh; 49 struct file *pipe_from_umh; 50 struct list_head list; 51 void (*cleanup)(struct umh_info *info); 52 pid_t pid; 53 }; 54 int fork_usermode_blob(void *data, size_t len, struct umh_info *info); 55 56 extern int 57 call_usermodehelper_exec(struct subprocess_info *info, int wait); 58 59 extern struct ctl_table usermodehelper_table[]; 60 61 enum umh_disable_depth { 62 UMH_ENABLED = 0, 63 UMH_FREEZING, 64 UMH_DISABLED, 65 }; 66 67 extern int __usermodehelper_disable(enum umh_disable_depth depth); 68 extern void __usermodehelper_set_disable_depth(enum umh_disable_depth depth); 69 70 static inline int usermodehelper_disable(void) 71 { 72 return __usermodehelper_disable(UMH_DISABLED); 73 } 74 75 static inline void usermodehelper_enable(void) 76 { 77 __usermodehelper_set_disable_depth(UMH_ENABLED); 78 } 79 80 extern int usermodehelper_read_trylock(void); 81 extern long usermodehelper_read_lock_wait(long timeout); 82 extern void usermodehelper_read_unlock(void); 83 84 #endif /* __LINUX_UMH_H__ */ 85