|
|
@@ -0,0 +1,85 @@
|
|
|
+--- a/include/linux/kobject.h
|
|
|
++++ b/include/linux/kobject.h
|
|
|
+@@ -30,6 +30,8 @@
|
|
|
+ #define UEVENT_NUM_ENVP 32 /* number of env pointers */
|
|
|
+ #define UEVENT_BUFFER_SIZE 2048 /* buffer for the variables */
|
|
|
+
|
|
|
++struct sk_buff;
|
|
|
++
|
|
|
+ /* path to the userspace helper executed on an event */
|
|
|
+ extern char uevent_helper[];
|
|
|
+
|
|
|
+@@ -246,6 +248,10 @@ int add_uevent_var(struct kobj_uevent_en
|
|
|
+
|
|
|
+ int kobject_action_type(const char *buf, size_t count,
|
|
|
+ enum kobject_action *type);
|
|
|
++
|
|
|
++int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
|
|
|
++ gfp_t allocation);
|
|
|
++
|
|
|
+ #else
|
|
|
+ static inline int kobject_uevent(struct kobject *kobj,
|
|
|
+ enum kobject_action action)
|
|
|
+@@ -262,6 +268,16 @@ static inline int add_uevent_var(struct
|
|
|
+ static inline int kobject_action_type(const char *buf, size_t count,
|
|
|
+ enum kobject_action *type)
|
|
|
+ { return -EINVAL; }
|
|
|
++
|
|
|
++void kfree_skb(struct sk_buff *);
|
|
|
++
|
|
|
++static inline int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
|
|
|
++ gfp_t allocation)
|
|
|
++{
|
|
|
++ kfree_skb(skb);
|
|
|
++ return 0;
|
|
|
++}
|
|
|
++
|
|
|
+ #endif
|
|
|
+
|
|
|
+ #endif /* _KOBJECT_H_ */
|
|
|
+--- a/lib/kobject_uevent.c
|
|
|
++++ b/lib/kobject_uevent.c
|
|
|
+@@ -377,6 +377,43 @@ int add_uevent_var(struct kobj_uevent_en
|
|
|
+ EXPORT_SYMBOL_GPL(add_uevent_var);
|
|
|
+
|
|
|
+ #if defined(CONFIG_NET)
|
|
|
++int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
|
|
|
++ gfp_t allocation)
|
|
|
++{
|
|
|
++ struct uevent_sock *ue_sk;
|
|
|
++ int err = 0;
|
|
|
++
|
|
|
++ /* send netlink message */
|
|
|
++ mutex_lock(&uevent_sock_mutex);
|
|
|
++ list_for_each_entry(ue_sk, &uevent_sock_list, list) {
|
|
|
++ struct sock *uevent_sock = ue_sk->sk;
|
|
|
++ struct sk_buff *skb2;
|
|
|
++
|
|
|
++ skb2 = skb_clone(skb, allocation);
|
|
|
++ if (!skb2)
|
|
|
++ break;
|
|
|
++
|
|
|
++ err = netlink_broadcast(uevent_sock, skb2, pid, group,
|
|
|
++ allocation);
|
|
|
++ if (err)
|
|
|
++ break;
|
|
|
++ }
|
|
|
++ mutex_unlock(&uevent_sock_mutex);
|
|
|
++
|
|
|
++ kfree_skb(skb);
|
|
|
++ return err;
|
|
|
++}
|
|
|
++#else
|
|
|
++int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
|
|
|
++ gfp_t allocation)
|
|
|
++{
|
|
|
++ kfree_skb(skb);
|
|
|
++ return 0;
|
|
|
++}
|
|
|
++#endif
|
|
|
++EXPORT_SYMBOL_GPL(broadcast_uevent);
|
|
|
++
|
|
|
++#if defined(CONFIG_NET)
|
|
|
+ static int uevent_net_init(struct net *net)
|
|
|
+ {
|
|
|
+ struct uevent_sock *ue_sk;
|