main.cpp revision 5c1b8af16dbbc20c89aaca2f93e725e12b16d055
1d18304287dbabc7835be771400b85d4ae8b63de6San Mehat/* 2d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * Copyright (C) 2008 The Android Open Source Project 3d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * 4d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * Licensed under the Apache License, Version 2.0 (the "License"); 5d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * you may not use this file except in compliance with the License. 6d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * You may obtain a copy of the License at 7d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * 8d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * http://www.apache.org/licenses/LICENSE-2.0 9d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * 10d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * Unless required by applicable law or agreed to in writing, software 11d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * distributed under the License is distributed on an "AS IS" BASIS, 12d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * See the License for the specific language governing permissions and 14d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * limitations under the License. 15d18304287dbabc7835be771400b85d4ae8b63de6San Mehat */ 16d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 17d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <stdio.h> 18d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <stdlib.h> 195c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat#include <signal.h> 20d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <errno.h> 21d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <string.h> 22d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sys/stat.h> 23d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sys/types.h> 245c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat#include <sys/wait.h> 25d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 26d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <fcntl.h> 27d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <dirent.h> 28d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 29d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#define LOG_TAG "Netd" 30d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 31d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "cutils/log.h" 32d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 33d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "CommandListener.h" 34d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "NetlinkManager.h" 35d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 36d18304287dbabc7835be771400b85d4ae8b63de6San Mehatstatic void coldboot(const char *path); 375c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatstatic void sigchld_handler(int sig); 38d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 39d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint main() { 40d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 41d18304287dbabc7835be771400b85d4ae8b63de6San Mehat CommandListener *cl; 42d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetlinkManager *nm; 43d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 44d18304287dbabc7835be771400b85d4ae8b63de6San Mehat LOGI("Netd 1.0 starting"); 45d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 465c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat signal(SIGCHLD, sigchld_handler); 475c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 48d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if (!(nm = NetlinkManager::Instance())) { 49d18304287dbabc7835be771400b85d4ae8b63de6San Mehat LOGE("Unable to create NetlinkManager"); 50d18304287dbabc7835be771400b85d4ae8b63de6San Mehat exit(1); 51d18304287dbabc7835be771400b85d4ae8b63de6San Mehat }; 52d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 53d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 54d18304287dbabc7835be771400b85d4ae8b63de6San Mehat cl = new CommandListener(); 55d18304287dbabc7835be771400b85d4ae8b63de6San Mehat nm->setBroadcaster((SocketListener *) cl); 56d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 57d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if (nm->start()) { 58d18304287dbabc7835be771400b85d4ae8b63de6San Mehat LOGE("Unable to start NetlinkManager (%s)", strerror(errno)); 59d18304287dbabc7835be771400b85d4ae8b63de6San Mehat exit(1); 60d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 61d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 62d18304287dbabc7835be771400b85d4ae8b63de6San Mehat /* 63d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * Now that we're up, we can respond to commands 64d18304287dbabc7835be771400b85d4ae8b63de6San Mehat */ 65d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if (cl->startListener()) { 66d18304287dbabc7835be771400b85d4ae8b63de6San Mehat LOGE("Unable to start CommandListener (%s)", strerror(errno)); 67d18304287dbabc7835be771400b85d4ae8b63de6San Mehat exit(1); 68d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 69d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 70d18304287dbabc7835be771400b85d4ae8b63de6San Mehat // Eventually we'll become the monitoring thread 71d18304287dbabc7835be771400b85d4ae8b63de6San Mehat while(1) { 72d18304287dbabc7835be771400b85d4ae8b63de6San Mehat sleep(1000); 73d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 74d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 75d18304287dbabc7835be771400b85d4ae8b63de6San Mehat LOGI("Netd exiting"); 76d18304287dbabc7835be771400b85d4ae8b63de6San Mehat exit(0); 77d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 78d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 79d18304287dbabc7835be771400b85d4ae8b63de6San Mehatstatic void do_coldboot(DIR *d, int lvl) 80d18304287dbabc7835be771400b85d4ae8b63de6San Mehat{ 81d18304287dbabc7835be771400b85d4ae8b63de6San Mehat struct dirent *de; 82d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int dfd, fd; 83d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 84d18304287dbabc7835be771400b85d4ae8b63de6San Mehat dfd = dirfd(d); 85d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 86d18304287dbabc7835be771400b85d4ae8b63de6San Mehat fd = openat(dfd, "uevent", O_WRONLY); 87d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if(fd >= 0) { 88d18304287dbabc7835be771400b85d4ae8b63de6San Mehat write(fd, "add\n", 4); 89d18304287dbabc7835be771400b85d4ae8b63de6San Mehat close(fd); 90d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 91d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 92d18304287dbabc7835be771400b85d4ae8b63de6San Mehat while((de = readdir(d))) { 93d18304287dbabc7835be771400b85d4ae8b63de6San Mehat DIR *d2; 94d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 95d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if (de->d_name[0] == '.') 96d18304287dbabc7835be771400b85d4ae8b63de6San Mehat continue; 97d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 98d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if (de->d_type != DT_DIR && lvl > 0) 99d18304287dbabc7835be771400b85d4ae8b63de6San Mehat continue; 100d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 101d18304287dbabc7835be771400b85d4ae8b63de6San Mehat fd = openat(dfd, de->d_name, O_RDONLY | O_DIRECTORY); 102d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if(fd < 0) 103d18304287dbabc7835be771400b85d4ae8b63de6San Mehat continue; 104d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 105d18304287dbabc7835be771400b85d4ae8b63de6San Mehat d2 = fdopendir(fd); 106d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if(d2 == 0) 107d18304287dbabc7835be771400b85d4ae8b63de6San Mehat close(fd); 108d18304287dbabc7835be771400b85d4ae8b63de6San Mehat else { 109d18304287dbabc7835be771400b85d4ae8b63de6San Mehat do_coldboot(d2, lvl + 1); 110d18304287dbabc7835be771400b85d4ae8b63de6San Mehat closedir(d2); 111d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 112d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 113d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 114d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 115d18304287dbabc7835be771400b85d4ae8b63de6San Mehatstatic void coldboot(const char *path) 116d18304287dbabc7835be771400b85d4ae8b63de6San Mehat{ 117d18304287dbabc7835be771400b85d4ae8b63de6San Mehat DIR *d = opendir(path); 118d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if(d) { 119d18304287dbabc7835be771400b85d4ae8b63de6San Mehat do_coldboot(d, 0); 120d18304287dbabc7835be771400b85d4ae8b63de6San Mehat closedir(d); 121d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 122d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 1235c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1245c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatstatic void sigchld_handler(int sig) { 1255c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat pid_t pid = wait(NULL); 1265c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGD("Child process %d exited", pid); 1275c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat} 128