12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- --- a/include/linux/kobject.h
- +++ b/include/linux/kobject.h
- @@ -31,6 +31,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[];
-
- @@ -213,6 +215,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)
- @@ -229,6 +235,16 @@ int add_uevent_var(struct kobj_uevent_en
- 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
- @@ -381,6 +381,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;
|