ueventd.c revision 44b65d047cc39baf30e21bfd8dd438f6bc1f77f5
1f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross/* 2f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross * Copyright (C) 2010 The Android Open Source Project 3f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross * 4f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross * Licensed under the Apache License, Version 2.0 (the "License"); 5f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross * you may not use this file except in compliance with the License. 6f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross * You may obtain a copy of the License at 7f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross * 8f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross * http://www.apache.org/licenses/LICENSE-2.0 9f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross * 10f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross * Unless required by applicable law or agreed to in writing, software 11f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross * distributed under the License is distributed on an "AS IS" BASIS, 12f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross * See the License for the specific language governing permissions and 14f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross * limitations under the License. 15f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross */ 16f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross 17f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross#include <poll.h> 1844b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross#include <fcntl.h> 1944b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross#include <string.h> 2044b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross#include <stdlib.h> 2144b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross#include <stdio.h> 2244b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross#include <ctype.h> 2344b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross#include <private/android_filesystem_config.h> 24f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross 25f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross#include "ueventd.h" 26f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross#include "log.h" 27f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross#include "util.h" 28f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross#include "devices.h" 2944b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross#include "ueventd_parser.h" 3044b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross 3144b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Crossstatic char hardware[32]; 3244b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Crossstatic unsigned revision = 0; 33f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross 34f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Crossint ueventd_main(int argc, char **argv) 35f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross{ 36f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross struct pollfd ufd; 37f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross int nr; 3844b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross char tmp[32]; 39f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross 40f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross open_devnull_stdio(); 41f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross log_init(); 42f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross 43f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross INFO("starting ueventd\n"); 44f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross 4544b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross get_hardware_name(hardware, &revision); 4644b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross 4744b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross ueventd_parse_config_file("/ueventd.rc"); 4844b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross 4944b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross snprintf(tmp, sizeof(tmp), "/ueventd.%s.rc", hardware); 5044b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross ueventd_parse_config_file(tmp); 5144b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross 52f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross device_init(); 53f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross 54f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross ufd.events = POLLIN; 55f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross ufd.fd = get_device_fd(); 56f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross 57f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross while(1) { 58f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross ufd.revents = 0; 59f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross nr = poll(&ufd, 1, -1); 60f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross if (nr <= 0) 61f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross continue; 62f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross if (ufd.revents == POLLIN) 63f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross handle_device_fd(); 64f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross } 65f83d0b9af5cbe4440cc41ceaa8a7806a13c86282Colin Cross} 6644b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross 6744b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Crossstatic int get_android_id(const char *id) 6844b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross{ 6944b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross unsigned int i; 7044b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross for (i = 0; i < ARRAY_SIZE(android_ids); i++) 7144b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross if (!strcmp(id, android_ids[i].name)) 7244b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross return android_ids[i].aid; 7344b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross return 0; 7444b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross} 7544b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross 7644b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Crossvoid set_device_permission(int nargs, char **args) 7744b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross{ 7844b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross char *name; 7944b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross mode_t perm; 8044b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross uid_t uid; 8144b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross gid_t gid; 8244b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross int prefix = 0; 8344b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross char *endptr; 8444b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross int ret; 8544b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross char *tmp = 0; 8644b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross 8744b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross if (nargs == 0) 8844b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross return; 8944b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross 9044b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross if (args[0][0] == '#') 9144b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross return; 9244b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross 9344b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross if (nargs != 4) { 9444b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross ERROR("invalid line ueventd.rc line for '%s'\n", args[0]); 9544b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross return; 9644b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross } 9744b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross 9844b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross name = args[0]; 9944b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross /* If path starts with mtd@ lookup the mount number. */ 10044b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross if (!strncmp(name, "mtd@", 4)) { 10144b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross int n = mtd_name_to_number(name + 4); 10244b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross if (n >= 0) 10344b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross asprintf(&tmp, "/dev/mtd/mtd%d", n); 10444b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross name = tmp; 10544b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross } else { 10644b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross int len = strlen(name); 10744b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross if (name[len - 1] == '*') { 10844b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross prefix = 1; 10944b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross name[len - 1] = '\0'; 11044b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross } 11144b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross } 11244b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross 11344b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross perm = strtol(args[1], &endptr, 8); 11444b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross if (!endptr || *endptr != '\0') { 11544b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross ERROR("invalid mode '%s'\n", args[1]); 11644b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross free(tmp); 11744b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross return; 11844b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross } 11944b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross 12044b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross ret = get_android_id(args[2]); 12144b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross if (ret < 0) { 12244b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross ERROR("invalid uid '%s'\n", args[2]); 12344b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross free(tmp); 12444b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross return; 12544b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross } 12644b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross uid = ret; 12744b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross 12844b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross ret = get_android_id(args[3]); 12944b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross if (ret < 0) { 13044b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross ERROR("invalid gid '%s'\n", args[3]); 13144b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross free(tmp); 13244b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross return; 13344b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross } 13444b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross gid = ret; 13544b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross 13644b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross add_dev_perms(name, perm, uid, gid, prefix); 13744b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross free(tmp); 13844b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross} 139