am 1ff04118: Merge change 23693 into eclair

Merge commit '1ff041180c66ef6f1020cf5314a665d319e9ac86' into eclair-plus-aosp

* commit '1ff041180c66ef6f1020cf5314a665d319e9ac86':
  dumpstate: Add option to output to socket, disable code that switched to nonroot
This commit is contained in:
Mike Lockwood
2009-09-02 17:42:36 -07:00
committed by Android Git Automerger

View File

@@ -25,6 +25,7 @@
#include <sys/time.h> #include <sys/time.h>
#include <sys/resource.h> #include <sys/resource.h>
#include <cutils/sockets.h>
#include "private/android_filesystem_config.h" #include "private/android_filesystem_config.h"
#include "dumpstate.h" #include "dumpstate.h"
@@ -164,11 +165,11 @@ static int check_command_name(const char* name, const char* test) {
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
int dumpcrash = check_command_name(argv[0], "dumpcrash"); int dumpcrash = check_command_name(argv[0], "dumpcrash");
int bugreport = check_command_name(argv[0], "bugreport");
int add_date = 0; int add_date = 0;
char* outfile = 0; char* outfile = 0;
int vibrate = 0; int vibrate = 0;
int compress = 0; int compress = 0;
int socket = 0;
int c, fd, vibrate_fd, fds[2]; int c, fd, vibrate_fd, fds[2];
char path[PATH_MAX]; char path[PATH_MAX];
pid_t pid; pid_t pid;
@@ -180,31 +181,32 @@ int main(int argc, char *argv[]) {
get_time(&now); get_time(&now);
if (bugreport) { do {
do { c = getopt(argc, argv, "do:svz");
c = getopt(argc, argv, "do:vz"); if (c == EOF)
if (c == EOF) break;
switch (c) {
case 'd':
add_date = 1;
break; break;
switch (c) { case 'o':
case 'd': outfile = optarg;
add_date = 1; break;
break; case 'v':
case 'o': vibrate = 1;
outfile = optarg; break;
break; case 'z':
case 'v': compress = 1;
vibrate = 1; break;
break; case 's':
case 'z': socket = 1;
compress = 1; break;
break; case '?':
case '?': fprintf(stderr, "%s: invalid option -%c\n",
fprintf(stderr, "%s: invalid option -%c\n", argv[0], optopt);
argv[0], optopt); exit(1);
exit(1); }
} } while (1);
} while (1);
}
/* open vibrator before switching user */ /* open vibrator before switching user */
if (vibrate) { if (vibrate) {
@@ -214,14 +216,40 @@ int main(int argc, char *argv[]) {
} else } else
vibrate_fd = -1; vibrate_fd = -1;
#if 0
/* switch to non-root user and group */ /* switch to non-root user and group */
setgroups(sizeof(groups)/sizeof(groups[0]), groups); setgroups(sizeof(groups)/sizeof(groups[0]), groups);
setuid(AID_SHELL); setuid(AID_SHELL);
#endif
/* make it safe to use both printf and STDOUT_FILENO */ /* make it safe to use both printf and STDOUT_FILENO */
setvbuf(stdout, 0, _IONBF, 0); setvbuf(stdout, 0, _IONBF, 0);
if (outfile) { if (socket) {
struct sockaddr addr;
socklen_t alen;
int s = android_get_control_socket("dumpstate");
if (s < 0) {
fprintf(stderr, "could not open dumpstate socket\n");
exit(1);
}
if (listen(s, 4) < 0) {
fprintf(stderr, "could not listen on dumpstate socket\n");
exit(1);
}
alen = sizeof(addr);
fd = accept(s, &addr, &alen);
if (fd < 0) {
fprintf(stderr, "could not accept dumpstate socket\n");
exit(1);
}
/* redirect stdout to the socket */
dup2(fd, STDOUT_FILENO);
close(fd);
} else if (outfile) {
if (strlen(outfile) > sizeof(path) - 100) if (strlen(outfile) > sizeof(path) - 100)
exit(1); exit(1);