kobject_uevent.c moved to kernel connector.

From: Evgeniy Polyakov (johnpol_at_2ka.mipt.ru)
Date: 01/12/05

  • Next message: Dave Airlie: "Re: [PATCH] kill symbol_get & friends"
    Date:	Thu, 13 Jan 2005 01:15:19 +0300
    To: Greg KH <greg@kroah.com>
    
    
    

    kobject_uevent.c change which allows to use new kernel connector interface.
    More details at http://marc.theaimsgroup.com/?l=linux-kernel&m=110370721906005&w=2
    They require small change to kernel connector itself(needs it export
    initialization flag), also attached small programm to read kobject data.
    Usage:

    s0mbre@kuasar:~/aWork/connector$ sudo ./kobj
    Password:
    Thu Jan 13 00:36:58 2005 : [abcd.0] [seq=4294967295, ack=4294967295], add@/devices/pci0000:00/0000:00:1d.2/usb3/3-1.
    Thu Jan 13 00:36:58 2005 : [abcd.0] [seq=1936024425, ack=1768124463], add@/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0.
    Thu Jan 13 00:36:58 2005 : [abcd.0] [seq=1936024425, ack=1768124463], add@/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.1.
    Thu Jan 13 00:36:58 2005 : [abcd.0] [seq=1936024425, ack=1768124463], add@/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.2.
    Thu Jan 13 00:36:58 2005 : [abcd.0] [seq=1936024425, ack=0], add@/module/hci_usb.
    Thu Jan 13 00:36:58 2005 : [abcd.0] [seq=1936024425, ack=0], add@/module/hci_usb/sections.
    Thu Jan 13 00:36:58 2005 : [abcd.0] [seq=1936024425, ack=0], add@/bus/usb/drivers/hci_usb.
    Thu Jan 13 00:36:58 2005 : [abcd.0] [seq=1936024425, ack=0], add@/class/bluetooth/hci0.
    Thu Jan 13 00:37:04 2005 : [abcd.0] [seq=1647276915, ack=1952806252], remove@/class/bluetooth/hci0.
    Thu Jan 13 00:37:05 2005 : [abcd.0] [seq=1935764579, ack=1818374003], remove@/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0.
    Thu Jan 13 00:37:05 2005 : [abcd.0] [seq=1935764579, ack=1818374003], remove@/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.1.
    Thu Jan 13 00:37:05 2005 : [abcd.0] [seq=1935764579, ack=1818374003], remove@/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.2.
    Thu Jan 13 00:37:05 2005 : [abcd.0] [seq=1935764579, ack=1818374003], remove@/devices/pci0000:00/0000:00:1d.2/usb3/3-1.

    P.S. I'm not subscribed to these mail lists, please CC me in your answers.

    Signed-off-by: Evgeniy Polyakov <johnpol@2ka.mipt.ru>

    --- include/linux/connector.h~ 2005-01-13 00:21:55.000000000 +0300
    +++ include/linux/connector.h 2005-01-13 00:53:21.000000000 +0300
    @@ -24,6 +24,9 @@
     
     #include <asm/types.h>
     
    +#define CONN_IDX_KOBJECT_UEVENT 0xabcd
    +#define CONN_VAL_KOBJECT_UEVENT 0x0000
    +
     #define CONNECTOR_MAX_MSG_SIZE 1024
     
     struct cb_id
    --- linux-2.6/drivers/connector/connector.c.orig 2005-01-13 00:21:23.000000000 +0300
    +++ linux-2.6/drivers/connector/connector.c 2005-01-13 00:32:48.000000000 +0300
    @@ -46,6 +46,8 @@
     
     static struct cn_dev cdev;
     
    +int cn_already_initialized = 0;
    +
     /*
      * msg->seq and msg->ack are used to determine message genealogy.
      * When someone sends message it puts there locally unique sequence
    @@ -456,6 +458,7 @@
     static int cn_init(void)
     {
             struct cn_dev *dev = &cdev;
    + int err;
     
             dev->input = cn_input;
             dev->id.idx = cn_idx;
    @@ -475,7 +478,17 @@
                     return -EINVAL;
             }
     
    - return cn_add_callback(&dev->id, "connector", &cn_callback);
    + err = cn_add_callback(&dev->id, "connector", &cn_callback);
    + if (err) {
    + cn_queue_free_dev(dev->cbdev);
    + if (dev->nls->sk_socket)
    + sock_release(dev->nls->sk_socket);
    + return -EINVAL;
    + }
    +
    + cn_already_initialized = 1;
    +
    + return 0;
     }
     
     static void cn_fini(void)
    --- linux-2.6/lib/kobject_uevent.c.orig 2005-01-13 00:45:55.000000000 +0300
    +++ linux-2.6/lib/kobject_uevent.c 2005-01-13 00:34:05.000000000 +0300
    @@ -12,6 +12,7 @@
      * Kay Sievers <kay.sievers@vrfy.org>
      * Arjan van de Ven <arjanv@redhat.com>
      * Greg Kroah-Hartman <greg@kroah.com>
    + * Evgeniy Polyakov <johnpol@2ka.mipt.ru>
      */
     
     #include <linux/spinlock.h>
    @@ -21,6 +22,7 @@
     #include <linux/string.h>
     #include <linux/kobject_uevent.h>
     #include <linux/kobject.h>
    +#include <linux/connector.h>
     #include <net/sock.h>
     
     #define BUFFER_SIZE 1024 /* buffer for the hotplug env */
    @@ -53,6 +55,68 @@
     #ifdef CONFIG_KOBJECT_UEVENT
     static struct sock *uevent_sock;
     
    +#ifdef CONFIG_CONNECTOR
    +static struct cb_id uid = {CONN_IDX_KOBJECT_UEVENT, CONN_VAL_KOBJECT_UEVENT};
    +static void kobject_uevent_connector_callback(void *data)
    +{
    +}
    +
    +static void kobject_uevent_send_connector(const char *signal, const char *obj, char **envp, int gfp_mask)
    +{
    + if (cn_already_initialized) {
    + int size;
    + struct cn_msg *msg;
    + static int uevent_connector_initialized;
    +
    + if (!uevent_connector_initialized) {
    + cn_add_callback(&uid, "kobject_uevent", kobject_uevent_connector_callback);
    + uevent_connector_initialized = 1;
    + }
    +
    +
    + size = strlen(signal) + strlen(obj) + 2 + BUFFER_SIZE + sizeof(*msg);
    + msg = kmalloc(size, gfp_mask);
    + if (msg) {
    + u8 *pos;
    + int len;
    +
    + msg->len = size - sizeof(*msg);
    +
    + memcpy(&msg->id, &uid, sizeof(msg->id));
    +
    + size -= sizeof(*msg);
    +
    + pos = (u8 *)(msg + 1);
    +
    + len = snprintf(pos, size, "%s@%s", signal, obj);
    + len++;
    + size -= len;
    + pos += len;
    +
    + if (envp) {
    + int i;
    +
    + for (i = 2; envp[i]; i++) {
    + len = strlen(envp[i]) + 1;
    + snprintf(pos, size, "%s", envp[i]);
    + size -= len;
    + pos += len;
    + }
    + }
    +
    + cn_netlink_send(msg, 0);
    +
    + kfree(msg);
    + }
    + }
    +}
    +#else
    +static void kobject_uevent_send_connector(const char *signal, const char *obj, char **envp, int gfp_mask)
    +{
    +}
    +#endif
    +
    +
     /**
      * send_uevent - notify userspace by sending event trough netlink socket
      *
    @@ -93,6 +157,8 @@
                     }
             }
     
    + kobject_uevent_send_connector(signal, obj, envp, gfp_mask);
    +
             return netlink_broadcast(uevent_sock, skb, 0, 1, gfp_mask);
     }
     

            Evgeniy Polyakov

    Only failure makes us experts. -- Theo de Raadt

    
    

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/



  • Next message: Dave Airlie: "Re: [PATCH] kill symbol_get & friends"

    Relevant Pages