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