uevent.c revision cc490161f6af9e4a6842ee827e4bfc43bc4509d5
1cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project/*
2cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project *
4cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * you may not use this file except in compliance with the License.
6cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * You may obtain a copy of the License at
7cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project *
8cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project *
10cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * See the License for the specific language governing permissions and
14cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * limitations under the License.
15cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project */
16cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
17cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#include <hardware_legacy/uevent.h>
18cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
19cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#include <string.h>
20cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#include <unistd.h>
21cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#include <poll.h>
22cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
23cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#include <sys/socket.h>
24cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#include <sys/un.h>
25cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#include <linux/netlink.h>
26cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
27cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
28cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Projectstatic int fd = -1;
29cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
30cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project/* Returns 0 on failure, 1 on success */
31cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Projectint uevent_init()
32cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project{
33cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    struct sockaddr_nl addr;
34cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    int sz = 64*1024;
35cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    int s;
36cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
37cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    memset(&addr, 0, sizeof(addr));
38cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    addr.nl_family = AF_NETLINK;
39cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    addr.nl_pid = getpid();
40cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    addr.nl_groups = 0xffffffff;
41cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
42cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
43cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    if(s < 0)
44cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project        return 0;
45cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
46cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    setsockopt(s, SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz));
47cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
48cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    if(bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
49cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project        close(s);
50cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project        return 0;
51cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    }
52cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
53cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    fd = s;
54cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    return (fd > 0);
55cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project}
56cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
57cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Projectint uevent_next_event(char* buffer, int buffer_length)
58cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project{
59cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    while (1) {
60cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project        struct pollfd fds;
61cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project        int nr;
62cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
63cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project        fds.fd = fd;
64cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project        fds.events = POLLIN;
65cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project        fds.revents = 0;
66cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project        nr = poll(&fds, 1, -1);
67cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
68cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project        if(nr > 0 && fds.revents == POLLIN) {
69cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project            int count = recv(fd, buffer, buffer_length, 0);
70cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project            if (count > 0) {
71cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project                return count;
72cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project            }
73cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project        }
74cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    }
75cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
76cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    // won't get here
77cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    return 0;
78cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project}
79