You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.4 KiB
71 lines
2.4 KiB
/* |
|
* Copyright (C) 2017 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 <signal.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
|
|
#include <string> |
|
#include <vector> |
|
|
|
#include <log/logcat.h> |
|
|
|
int main(int argc, char** argv, char** envp) { |
|
android_logcat_context ctx = create_android_logcat(); |
|
if (!ctx) return -1; |
|
|
|
signal(SIGPIPE, exit); |
|
|
|
// Save and detect presence of -L or --last flag |
|
std::vector<std::string> args; |
|
bool last = false; |
|
for (int i = 0; i < argc; ++i) { |
|
if (!argv[i]) continue; |
|
args.push_back(std::string(argv[i])); |
|
if (!strcmp(argv[i], "-L") || !strcmp(argv[i], "--last")) last = true; |
|
} |
|
|
|
// Generate argv from saved content |
|
std::vector<const char*> argv_hold; |
|
for (auto& str : args) argv_hold.push_back(str.c_str()); |
|
argv_hold.push_back(nullptr); |
|
|
|
int ret = 0; |
|
if (last) { |
|
// Run logcat command with -L flag |
|
ret = android_logcat_run_command(ctx, -1, -1, argv_hold.size() - 1, |
|
(char* const*)&argv_hold[0], envp); |
|
// Remove -L and --last flags from argument list |
|
for (std::vector<const char*>::iterator it = argv_hold.begin(); |
|
it != argv_hold.end();) { |
|
if (!*it || (strcmp(*it, "-L") && strcmp(*it, "--last"))) { |
|
++it; |
|
} else { |
|
it = argv_hold.erase(it); |
|
} |
|
} |
|
// fall through to re-run the command regardless of the arguments |
|
// passed in. For instance, we expect -h to report help stutter. |
|
} |
|
|
|
// Run logcat command without -L flag |
|
int retval = android_logcat_run_command(ctx, -1, -1, argv_hold.size() - 1, |
|
(char* const*)&argv_hold[0], envp); |
|
if (!ret) ret = retval; |
|
retval = android_logcat_destroy(&ctx); |
|
if (!ret) ret = retval; |
|
return ret; |
|
}
|
|
|