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