159f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme/* 259f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme * Copyright (C) 2016 The Android Open Source Project 359f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme * 459f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme * Licensed under the Apache License, Version 2.0 (the "License"); 559f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme * you may not use this file except in compliance with the License. 659f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme * You may obtain a copy of the License at 759f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme * 859f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme * http://www.apache.org/licenses/LICENSE-2.0 959f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme * 1059f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme * Unless required by applicable law or agreed to in writing, software 1159f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme * distributed under the License is distributed on an "AS IS" BASIS, 1259f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1359f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme * See the License for the specific language governing permissions and 1459f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme * limitations under the License. 1559f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme */ 1659f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme 1759f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme#include <errno.h> 1859f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme#include <getopt.h> 1959f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme#include <stdio.h> 2059f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme#include <sys/socket.h> 2159f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme#include <sys/types.h> 2259f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme#include <unistd.h> 2359f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme 2459f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme#include <cutils/properties.h> 2559f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme#include <cutils/sockets.h> 2659f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme 2759f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme#include "bugreportz.h" 2859f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme 2902b7e00c1e1b0bf22997ab7ed913a9451e5b6b8aFelipe Lemestatic constexpr char VERSION[] = "1.1"; 3059f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme 3159f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Lemestatic void show_usage() { 3259f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme fprintf(stderr, 3359f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme "usage: bugreportz [-h | -v]\n" 3459f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme " -h: to display this help message\n" 3502b7e00c1e1b0bf22997ab7ed913a9451e5b6b8aFelipe Leme " -p: display progress\n" 3659f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme " -v: to display the version\n" 3759f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme " or no arguments to generate a zipped bugreport\n"); 3859f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme} 3959f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme 4059f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Lemestatic void show_version() { 4159f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme fprintf(stderr, "%s\n", VERSION); 4259f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme} 4359f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme 4459f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Lemeint main(int argc, char* argv[]) { 4502b7e00c1e1b0bf22997ab7ed913a9451e5b6b8aFelipe Leme bool show_progress = false; 4659f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme if (argc > 1) { 4759f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme /* parse arguments */ 4859f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme int c; 4902b7e00c1e1b0bf22997ab7ed913a9451e5b6b8aFelipe Leme while ((c = getopt(argc, argv, "hpv")) != -1) { 5059f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme switch (c) { 5159f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme case 'h': 5259f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme show_usage(); 5359f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme return EXIT_SUCCESS; 5402b7e00c1e1b0bf22997ab7ed913a9451e5b6b8aFelipe Leme case 'p': 5502b7e00c1e1b0bf22997ab7ed913a9451e5b6b8aFelipe Leme show_progress = true; 5602b7e00c1e1b0bf22997ab7ed913a9451e5b6b8aFelipe Leme break; 5759f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme case 'v': 5859f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme show_version(); 5959f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme return EXIT_SUCCESS; 6059f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme default: 6159f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme show_usage(); 6259f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme return EXIT_FAILURE; 6359f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme } 6459f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme } 6559f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme } 6659f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme 6759f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme // TODO: code below was copy-and-pasted from bugreport.cpp (except by the 6859f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme // timeout value); 6959f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme // should be reused instead. 7059f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme 7159f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme // Start the dumpstatez service. 7259f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme property_set("ctl.start", "dumpstatez"); 7359f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme 7459f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme // Socket will not be available until service starts. 7559f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme int s; 7659f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme for (int i = 0; i < 20; i++) { 7759f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme s = socket_local_client("dumpstate", ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_STREAM); 7859f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme if (s >= 0) break; 7959f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme // Try again in 1 second. 8059f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme sleep(1); 8159f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme } 8259f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme 8359f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme if (s == -1) { 8459f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme printf("FAIL:Failed to connect to dumpstatez service: %s\n", strerror(errno)); 8559f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme return EXIT_SUCCESS; 8659f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme } 8759f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme 8859f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme // Set a timeout so that if nothing is read in 10 minutes, we'll stop 8959f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme // reading and quit. No timeout in dumpstate is longer than 60 seconds, 9059f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme // so this gives lots of leeway in case of unforeseen time outs. 9159f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme struct timeval tv; 9259f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme tv.tv_sec = 10 * 60; 9359f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme tv.tv_usec = 0; 9459f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) == -1) { 9559f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme fprintf(stderr, "WARNING: Cannot set socket timeout: %s\n", strerror(errno)); 9659f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme } 9759f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme 9802b7e00c1e1b0bf22997ab7ed913a9451e5b6b8aFelipe Leme bugreportz(s, show_progress); 9959f5af0465dcbf275a3653ac23885d12ee7e395dFelipe Leme} 100