diff options
-rw-r--r-- | include/cutils/uevent.h | 2 | ||||
-rw-r--r-- | init/devices.c | 30 | ||||
-rw-r--r-- | libcutils/uevent.c | 31 |
3 files changed, 35 insertions, 28 deletions
diff --git a/include/cutils/uevent.h b/include/cutils/uevent.h index 5f5e6ca..4ebc300 100644 --- a/include/cutils/uevent.h +++ b/include/cutils/uevent.h @@ -17,12 +17,14 @@ #ifndef __CUTILS_UEVENT_H #define __CUTILS_UEVENT_H +#include <stdbool.h> #include <sys/socket.h> #ifdef __cplusplus extern "C" { #endif +int uevent_open_socket(int buf_sz, bool passcred); ssize_t uevent_kernel_multicast_recv(int socket, void *buffer, size_t length); #ifdef __cplusplus diff --git a/init/devices.c b/init/devices.c index 60659ce..43d0ca3 100644 --- a/init/devices.c +++ b/init/devices.c @@ -58,33 +58,6 @@ struct uevent { int minor; }; -static int open_uevent_socket(void) -{ - struct sockaddr_nl addr; - int sz = 64*1024; // XXX larger? udev uses 16MB! - int on = 1; - int s; - - memset(&addr, 0, sizeof(addr)); - addr.nl_family = AF_NETLINK; - addr.nl_pid = getpid(); - addr.nl_groups = 0xffffffff; - - s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT); - if(s < 0) - return -1; - - setsockopt(s, SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz)); - setsockopt(s, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)); - - if(bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { - close(s); - return -1; - } - - return s; -} - struct perms_ { char *name; char *attr; @@ -847,7 +820,8 @@ void device_init(void) struct stat info; int fd; - device_fd = open_uevent_socket(); + /* is 64K enough? udev uses 16MB! */ + device_fd = uevent_open_socket(64*1024, true); if(device_fd < 0) return; diff --git a/libcutils/uevent.c b/libcutils/uevent.c index 320f8d1..4add29c 100644 --- a/libcutils/uevent.c +++ b/libcutils/uevent.c @@ -17,7 +17,12 @@ #include <cutils/uevent.h> #include <errno.h> +#include <stdbool.h> +#include <string.h> #include <strings.h> +#include <sys/socket.h> +#include <sys/un.h> +#include <unistd.h> #include <linux/netlink.h> @@ -68,3 +73,29 @@ out: errno = EIO; return -1; } + +int uevent_open_socket(int buf_sz, bool passcred) +{ + struct sockaddr_nl addr; + int on = passcred; + int s; + + memset(&addr, 0, sizeof(addr)); + addr.nl_family = AF_NETLINK; + addr.nl_pid = getpid(); + addr.nl_groups = 0xffffffff; + + s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT); + if(s < 0) + return -1; + + setsockopt(s, SOL_SOCKET, SO_RCVBUFFORCE, &buf_sz, sizeof(buf_sz)); + setsockopt(s, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)); + + if(bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + close(s); + return -1; + } + + return s; +} |