1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- --- a/include/linux/kobject.h
- +++ b/include/linux/kobject.h
- @@ -32,6 +32,8 @@
- #define UEVENT_NUM_ENVP 32 /* number of env pointers */
- #define UEVENT_BUFFER_SIZE 2048 /* buffer for the variables */
-
- +struct sk_buff;
- +
- #ifdef CONFIG_UEVENT_HELPER
- /* path to the userspace helper executed on an event */
- extern char uevent_helper[];
- @@ -221,4 +223,7 @@ 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);
- +
- #endif /* _KOBJECT_H_ */
- --- a/lib/kobject_uevent.c
- +++ b/lib/kobject_uevent.c
- @@ -423,6 +423,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;
|