summaryrefslogtreecommitdiffstats
path: root/debuggerd/getevent.cpp
diff options
context:
space:
mode:
authorJosh Gao <jmgao@google.com>2016-10-18 18:17:52 -0700
committerJosh Gao <jmgao@google.com>2017-01-17 13:57:57 -0800
commitcbe70cb0a8cb0171f3802273050e851a47b090ed (patch)
tree87a2805f11d9fa5283fe169d9b155f5b08a94f85 /debuggerd/getevent.cpp
parent4c5c9db17b55bfcb2d62eec158440d0e794e30bb (diff)
downloadsystem_core-cbe70cb0a8cb0171f3802273050e851a47b090ed.tar.gz
system_core-cbe70cb0a8cb0171f3802273050e851a47b090ed.tar.bz2
system_core-cbe70cb0a8cb0171f3802273050e851a47b090ed.zip
debuggerd: advance our amazing bet.
Remove debuggerd in favor of a helper process that gets execed by crashing processes. Bug: http://b/30705528 Test: debuggerd_test Change-Id: I9906c69473989cbf7fe5ea6cccf9a9c563d75906
Diffstat (limited to 'debuggerd/getevent.cpp')
-rw-r--r--debuggerd/getevent.cpp224
1 files changed, 0 insertions, 224 deletions
diff --git a/debuggerd/getevent.cpp b/debuggerd/getevent.cpp
deleted file mode 100644
index dbb878acb..000000000
--- a/debuggerd/getevent.cpp
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright (C) 2014 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 <dirent.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <linux/input.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/inotify.h>
-#include <sys/ioctl.h>
-#include <sys/limits.h>
-#include <sys/poll.h>
-#include <unistd.h>
-
-#include <memory>
-
-#include <android/log.h>
-
-static struct pollfd* ufds;
-static char** device_names;
-static int nfds;
-
-static int open_device(const char* device) {
- int version;
- int fd;
- struct pollfd* new_ufds;
- char** new_device_names;
- char name[80];
- char location[80];
- char idstr[80];
- struct input_id id;
-
- fd = open(device, O_RDWR);
- if (fd < 0) {
- return -1;
- }
-
- if (ioctl(fd, EVIOCGVERSION, &version)) {
- return -1;
- }
- if (ioctl(fd, EVIOCGID, &id)) {
- return -1;
- }
- name[sizeof(name) - 1] = '\0';
- location[sizeof(location) - 1] = '\0';
- idstr[sizeof(idstr) - 1] = '\0';
- if (ioctl(fd, EVIOCGNAME(sizeof(name) - 1), &name) < 1) {
- name[0] = '\0';
- }
- if (ioctl(fd, EVIOCGPHYS(sizeof(location) - 1), &location) < 1) {
- location[0] = '\0';
- }
- if (ioctl(fd, EVIOCGUNIQ(sizeof(idstr) - 1), &idstr) < 1) {
- idstr[0] = '\0';
- }
-
- new_ufds = reinterpret_cast<pollfd*>(realloc(ufds, sizeof(ufds[0]) * (nfds + 1)));
- if (new_ufds == NULL) {
- fprintf(stderr, "out of memory\n");
- return -1;
- }
- ufds = new_ufds;
- new_device_names = reinterpret_cast<char**>(realloc(
- device_names, sizeof(device_names[0]) * (nfds + 1)));
- if (new_device_names == NULL) {
- fprintf(stderr, "out of memory\n");
- return -1;
- }
- device_names = new_device_names;
- ufds[nfds].fd = fd;
- ufds[nfds].events = POLLIN;
- device_names[nfds] = strdup(device);
- nfds++;
-
- return 0;
-}
-
-int close_device(const char* device) {
- int i;
- for (i = 1; i < nfds; i++) {
- if (strcmp(device_names[i], device) == 0) {
- int count = nfds - i - 1;
- free(device_names[i]);
- memmove(device_names + i, device_names + i + 1, sizeof(device_names[0]) * count);
- memmove(ufds + i, ufds + i + 1, sizeof(ufds[0]) * count);
- nfds--;
- return 0;
- }
- }
- return -1;
-}
-
-static int read_notify(const char* dirname, int nfd) {
- int res;
- char devname[PATH_MAX];
- char* filename;
- char event_buf[512];
- int event_size;
- int event_pos = 0;
- struct inotify_event *event;
-
- res = read(nfd, event_buf, sizeof(event_buf));
- if (res < (int)sizeof(*event)) {
- if (errno == EINTR)
- return 0;
- fprintf(stderr, "could not get event, %s\n", strerror(errno));
- return 1;
- }
-
- strcpy(devname, dirname);
- filename = devname + strlen(devname);
- *filename++ = '/';
-
- while (res >= (int)sizeof(*event)) {
- event = reinterpret_cast<struct inotify_event*>(event_buf + event_pos);
- if (event->len) {
- strcpy(filename, event->name);
- if (event->mask & IN_CREATE) {
- open_device(devname);
- } else {
- close_device(devname);
- }
- }
- event_size = sizeof(*event) + event->len;
- res -= event_size;
- event_pos += event_size;
- }
- return 0;
-}
-
-static int scan_dir(const char* dirname) {
- char devname[PATH_MAX];
- char* filename;
- struct dirent* de;
- std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(dirname), closedir);
- if (dir == NULL)
- return -1;
- strcpy(devname, dirname);
- filename = devname + strlen(devname);
- *filename++ = '/';
- while ((de = readdir(dir.get()))) {
- if ((de->d_name[0] == '.' && de->d_name[1] == '\0') ||
- (de->d_name[1] == '.' && de->d_name[2] == '\0'))
- continue;
- strcpy(filename, de->d_name);
- open_device(devname);
- }
- return 0;
-}
-
-int init_getevent() {
- int res;
- const char* device_path = "/dev/input";
-
- nfds = 1;
- ufds = reinterpret_cast<pollfd*>(calloc(1, sizeof(ufds[0])));
- ufds[0].fd = inotify_init();
- ufds[0].events = POLLIN;
-
- res = inotify_add_watch(ufds[0].fd, device_path, IN_DELETE | IN_CREATE);
- if (res < 0) {
- return 1;
- }
- res = scan_dir(device_path);
- if (res < 0) {
- return 1;
- }
- return 0;
-}
-
-void uninit_getevent() {
- int i;
- for (i = 0; i < nfds; i++) {
- close(ufds[i].fd);
- }
- free(ufds);
- ufds = 0;
- nfds = 0;
-}
-
-int get_event(struct input_event* event, int timeout) {
- int res;
- int i;
- int pollres;
- const char* device_path = "/dev/input";
- while (1) {
- pollres = poll(ufds, nfds, timeout);
- if (pollres == 0) {
- return 1;
- }
- if (ufds[0].revents & POLLIN) {
- read_notify(device_path, ufds[0].fd);
- }
- for (i = 1; i < nfds; i++) {
- if (ufds[i].revents) {
- if (ufds[i].revents & POLLIN) {
- res = read(ufds[i].fd, event, sizeof(*event));
- if (res < static_cast<int>(sizeof(event))) {
- fprintf(stderr, "could not get event\n");
- return -1;
- }
- return 0;
- }
- }
- }
- }
- return 0;
-}