diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 19:32:14 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 19:32:14 -0800 |
commit | cc490161f6af9e4a6842ee827e4bfc43bc4509d5 (patch) | |
tree | a60e0ed36ef1d3a43530c46562c86c9cd431744c /uevent | |
parent | 3bbe5328cd738976443822502e23fb3971c5f87b (diff) | |
download | hardware_libhardware_legacy-cc490161f6af9e4a6842ee827e4bfc43bc4509d5.zip hardware_libhardware_legacy-cc490161f6af9e4a6842ee827e4bfc43bc4509d5.tar.gz hardware_libhardware_legacy-cc490161f6af9e4a6842ee827e4bfc43bc4509d5.tar.bz2 |
auto import from //depot/cupcake/@135843
Diffstat (limited to 'uevent')
-rw-r--r-- | uevent/Android.mk | 7 | ||||
-rw-r--r-- | uevent/uevent.c | 78 | ||||
-rw-r--r-- | uevent/uevent_stub.c | 33 |
3 files changed, 118 insertions, 0 deletions
diff --git a/uevent/Android.mk b/uevent/Android.mk new file mode 100644 index 0000000..74ccdbc --- /dev/null +++ b/uevent/Android.mk @@ -0,0 +1,7 @@ +# Copyright 2008 The Android Open Source Project + +ifeq ($(TARGET_SIMULATOR),true) +LOCAL_SRC_FILES += uevent/uevent_stub.c +else +LOCAL_SRC_FILES += uevent/uevent.c +endif diff --git a/uevent/uevent.c b/uevent/uevent.c new file mode 100644 index 0000000..d1d4b8e --- /dev/null +++ b/uevent/uevent.c @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <hardware_legacy/uevent.h> + +#include <string.h> +#include <unistd.h> +#include <poll.h> + +#include <sys/socket.h> +#include <sys/un.h> +#include <linux/netlink.h> + + +static int fd = -1; + +/* Returns 0 on failure, 1 on success */ +int uevent_init() +{ + struct sockaddr_nl addr; + int sz = 64*1024; + 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 0; + + setsockopt(s, SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz)); + + if(bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + close(s); + return 0; + } + + fd = s; + return (fd > 0); +} + +int uevent_next_event(char* buffer, int buffer_length) +{ + while (1) { + struct pollfd fds; + int nr; + + fds.fd = fd; + fds.events = POLLIN; + fds.revents = 0; + nr = poll(&fds, 1, -1); + + if(nr > 0 && fds.revents == POLLIN) { + int count = recv(fd, buffer, buffer_length, 0); + if (count > 0) { + return count; + } + } + } + + // won't get here + return 0; +} diff --git a/uevent/uevent_stub.c b/uevent/uevent_stub.c new file mode 100644 index 0000000..2f28ab4 --- /dev/null +++ b/uevent/uevent_stub.c @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <hardware_legacy/uevent.h> +#include <unistd.h> + +int uevent_init() +{ + return 1; +} + +int uevent_next_event(char* buffer, int buffer_length) +{ + while (1) { + sleep(10000); + } + + // won't get here + return 0; +} |