diff options
Diffstat (limited to 'toolbox')
-rw-r--r-- | toolbox/Android.mk | 15 | ||||
-rw-r--r-- | toolbox/df.c | 85 | ||||
-rw-r--r-- | toolbox/ionice.c | 58 | ||||
-rw-r--r-- | toolbox/lsof.c | 253 | ||||
-rw-r--r-- | toolbox/mount.c | 360 | ||||
-rw-r--r-- | toolbox/renice.c | 161 | ||||
-rw-r--r-- | toolbox/restart.c | 27 | ||||
-rw-r--r-- | toolbox/upstream-netbsd/usr.bin/du/du.c | 364 | ||||
-rw-r--r-- | toolbox/uptime.c | 87 | ||||
-rw-r--r-- | toolbox/watchprops.c | 92 |
10 files changed, 28 insertions, 1474 deletions
diff --git a/toolbox/Android.mk b/toolbox/Android.mk index ad99a39..b17408a 100644 --- a/toolbox/Android.mk +++ b/toolbox/Android.mk @@ -25,40 +25,27 @@ LOCAL_CFLAGS += $(common_cflags) -Dmain=dd_main -DNO_CONV LOCAL_MODULE := libtoolbox_dd include $(BUILD_STATIC_LIBRARY) -include $(CLEAR_VARS) -LOCAL_SRC_FILES := upstream-netbsd/usr.bin/du/du.c -LOCAL_CFLAGS += $(common_cflags) -Dmain=du_main -LOCAL_MODULE := libtoolbox_du -include $(BUILD_STATIC_LIBRARY) - include $(CLEAR_VARS) BSD_TOOLS := \ dd \ - du \ OUR_TOOLS := \ - df \ getevent \ iftop \ ioctl \ - ionice \ log \ ls \ - lsof \ - mount \ nandread \ newfs_msdos \ ps \ prlimit \ - renice \ + restart \ sendevent \ start \ stop \ top \ - uptime \ - watchprops \ ALL_TOOLS = $(BSD_TOOLS) $(OUR_TOOLS) diff --git a/toolbox/df.c b/toolbox/df.c deleted file mode 100644 index 9cd0743..0000000 --- a/toolbox/df.c +++ /dev/null @@ -1,85 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <sys/statfs.h> - -static int ok = EXIT_SUCCESS; - -static void printsize(long long n) -{ - char unit = 'K'; - long long t; - - n *= 10; - - if (n > 1024*1024*10) { - n /= 1024; - unit = 'M'; - } - - if (n > 1024*1024*10) { - n /= 1024; - unit = 'G'; - } - - t = (n + 512) / 1024; - printf("%4lld.%1lld%c", t/10, t%10, unit); -} - -static void df(char *s, int always) { - struct statfs st; - - if (statfs(s, &st) < 0) { - fprintf(stderr, "%s: %s\n", s, strerror(errno)); - ok = EXIT_FAILURE; - } else { - if (st.f_blocks == 0 && !always) - return; - printf("%-20s ", s); - printsize((long long)st.f_blocks * (long long)st.f_bsize); - printf(" "); - printsize((long long)(st.f_blocks - (long long)st.f_bfree) * st.f_bsize); - printf(" "); - printsize((long long)st.f_bfree * (long long)st.f_bsize); - printf(" %d\n", (int) st.f_bsize); - } -} - -int df_main(int argc, char *argv[]) { - printf("Filesystem Size Used Free Blksize\n"); - if (argc == 1) { - char s[2000]; - FILE *f = fopen("/proc/mounts", "r"); - - while (fgets(s, 2000, f)) { - char *c, *e = s; - - for (c = s; *c; c++) { - if (*c == ' ') { - e = c + 1; - break; - } - } - - for (c = e; *c; c++) { - if (*c == ' ') { - *c = '\0'; - break; - } - } - - df(e, 0); - } - - fclose(f); - } else { - int i; - - for (i = 1; i < argc; i++) { - df(argv[i], 1); - } - } - - exit(ok); -} diff --git a/toolbox/ionice.c b/toolbox/ionice.c deleted file mode 100644 index 7abc261..0000000 --- a/toolbox/ionice.c +++ /dev/null @@ -1,58 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> - -#include <cutils/iosched_policy.h> - -static char *classes[] = {"none", "rt", "be", "idle", NULL}; - -int ionice_main(int argc, char *argv[]) -{ - IoSchedClass clazz = IoSchedClass_NONE; - int ioprio = 0; - int pid; - - if(argc != 2 && argc != 4) { - fprintf(stderr, "usage: ionice <pid> [none|rt|be|idle] [prio]\n"); - return 1; - } - - if (!(pid = atoi(argv[1]))) { - fprintf(stderr, "Invalid pid specified\n"); - return 1; - } - - if (argc == 2) { - if (android_get_ioprio(pid, &clazz, &ioprio)) { - fprintf(stderr, "Failed to read priority (%s)\n", strerror(errno)); - return 1; - } - fprintf(stdout, "Pid %d, class %s (%d), prio %d\n", pid, classes[clazz], clazz, ioprio); - return 0; - } - - if (!strcmp(argv[2], "none")) { - clazz = IoSchedClass_NONE; - } else if (!strcmp(argv[2], "rt")) { - clazz = IoSchedClass_RT; - } else if (!strcmp(argv[2], "be")) { - clazz = IoSchedClass_BE; - } else if (!strcmp(argv[2], "idle")) { - clazz = IoSchedClass_IDLE; - } else { - fprintf(stderr, "Unsupported class '%s'\n", argv[2]); - return 1; - } - - ioprio = atoi(argv[3]); - - printf("Setting pid %d i/o class to %d, prio %d\n", pid, clazz, ioprio); - if (android_set_ioprio(pid, clazz, ioprio)) { - fprintf(stderr, "Failed to set priority (%s)\n", strerror(errno)); - return 1; - } - - return 0; -} diff --git a/toolbox/lsof.c b/toolbox/lsof.c deleted file mode 100644 index 982f5aa..0000000 --- a/toolbox/lsof.c +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright (c) 2010, The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google, Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <dirent.h> -#include <errno.h> -#include <fcntl.h> -#include <libgen.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <pwd.h> -#include <sys/stat.h> - -#define BUF_MAX 1024 -#define CMD_DISPLAY_MAX (9 + 1) -#define USER_DISPLAY_MAX (10 + 1) - -struct pid_info_t { - pid_t pid; - char user[USER_DISPLAY_MAX]; - - char cmdline[CMD_DISPLAY_MAX]; - - char path[PATH_MAX]; - ssize_t parent_length; -}; - -static void print_header() -{ - printf("%-9s %5s %10s %4s %9s %18s %9s %10s %s\n", - "COMMAND", - "PID", - "USER", - "FD", - "TYPE", - "DEVICE", - "SIZE/OFF", - "NODE", - "NAME"); -} - -static void print_type(char *type, struct pid_info_t* info) -{ - static ssize_t link_dest_size; - static char link_dest[PATH_MAX]; - - strlcat(info->path, type, sizeof(info->path)); - if ((link_dest_size = readlink(info->path, link_dest, sizeof(link_dest)-1)) < 0) { - if (errno == ENOENT) - goto out; - - snprintf(link_dest, sizeof(link_dest), "%s (readlink: %s)", info->path, strerror(errno)); - } else { - link_dest[link_dest_size] = '\0'; - } - - // Things that are just the root filesystem are uninteresting (we already know) - if (!strcmp(link_dest, "/")) - goto out; - - printf("%-9s %5d %10s %4s %9s %18s %9s %10s %s\n", - info->cmdline, info->pid, info->user, type, - "???", "???", "???", "???", link_dest); - -out: - info->path[info->parent_length] = '\0'; -} - -// Prints out all file that have been memory mapped -static void print_maps(struct pid_info_t* info) -{ - FILE *maps; - size_t offset; - char device[10]; - long int inode; - char file[PATH_MAX]; - - strlcat(info->path, "maps", sizeof(info->path)); - - maps = fopen(info->path, "r"); - if (!maps) - goto out; - - while (fscanf(maps, "%*x-%*x %*s %zx %s %ld %s\n", &offset, device, &inode, - file) == 4) { - // We don't care about non-file maps - if (inode == 0 || !strcmp(device, "00:00")) - continue; - - printf("%-9s %5d %10s %4s %9s %18s %9zd %10ld %s\n", - info->cmdline, info->pid, info->user, "mem", - "???", device, offset, inode, file); - } - - fclose(maps); - -out: - info->path[info->parent_length] = '\0'; -} - -// Prints out all open file descriptors -static void print_fds(struct pid_info_t* info) -{ - static char* fd_path = "fd/"; - strlcat(info->path, fd_path, sizeof(info->path)); - - int previous_length = info->parent_length; - info->parent_length += strlen(fd_path); - - DIR *dir = opendir(info->path); - if (dir == NULL) { - char msg[BUF_MAX]; - snprintf(msg, sizeof(msg), "%s (opendir: %s)", info->path, strerror(errno)); - printf("%-9s %5d %10s %4s %9s %18s %9s %10s %s\n", - info->cmdline, info->pid, info->user, "FDS", - "", "", "", "", msg); - goto out; - } - - struct dirent* de; - while ((de = readdir(dir))) { - if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) - continue; - - print_type(de->d_name, info); - } - closedir(dir); - -out: - info->parent_length = previous_length; - info->path[info->parent_length] = '\0'; -} - -static void lsof_dumpinfo(pid_t pid) -{ - int fd; - struct pid_info_t info; - struct stat pidstat; - struct passwd *pw; - - info.pid = pid; - snprintf(info.path, sizeof(info.path), "/proc/%d/", pid); - info.parent_length = strlen(info.path); - - // Get the UID by calling stat on the proc/pid directory. - if (!stat(info.path, &pidstat)) { - pw = getpwuid(pidstat.st_uid); - if (pw) { - strlcpy(info.user, pw->pw_name, sizeof(info.user)); - } else { - snprintf(info.user, USER_DISPLAY_MAX, "%d", (int)pidstat.st_uid); - } - } else { - strcpy(info.user, "???"); - } - - // Read the command line information; each argument is terminated with NULL. - strlcat(info.path, "cmdline", sizeof(info.path)); - fd = open(info.path, O_RDONLY); - if (fd < 0) { - fprintf(stderr, "Couldn't read %s\n", info.path); - return; - } - - char cmdline[PATH_MAX]; - int numRead = read(fd, cmdline, sizeof(cmdline) - 1); - close(fd); - - if (numRead < 0) { - fprintf(stderr, "Error reading cmdline: %s: %s\n", info.path, strerror(errno)); - return; - } - - cmdline[numRead] = '\0'; - - // We only want the basename of the cmdline - strlcpy(info.cmdline, basename(cmdline), sizeof(info.cmdline)); - - // Read each of these symlinks - print_type("cwd", &info); - print_type("exe", &info); - print_type("root", &info); - - print_fds(&info); - print_maps(&info); -} - -int lsof_main(int argc, char *argv[]) -{ - long int pid = 0; - char* endptr; - if (argc == 2) { - pid = strtol(argv[1], &endptr, 10); - } - - print_header(); - - if (pid) { - lsof_dumpinfo(pid); - } else { - DIR *dir = opendir("/proc"); - if (dir == NULL) { - fprintf(stderr, "Couldn't open /proc\n"); - return -1; - } - - struct dirent* de; - while ((de = readdir(dir))) { - if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) - continue; - - // Only inspect directories that are PID numbers - pid = strtol(de->d_name, &endptr, 10); - if (*endptr != '\0') - continue; - - lsof_dumpinfo(pid); - } - closedir(dir); - } - - return 0; -} diff --git a/toolbox/mount.c b/toolbox/mount.c deleted file mode 100644 index 66ae8b1..0000000 --- a/toolbox/mount.c +++ /dev/null @@ -1,360 +0,0 @@ -/* - * mount.c, by rmk - */ - -#include <sys/mount.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <linux/loop.h> - -#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) - -#define DEFAULT_LOOP_DEVICE "/dev/block/loop0" -#define LOOPDEV_MAXLEN 64 - -struct mount_opts { - const char str[16]; - unsigned long rwmask; - unsigned long rwset; - unsigned long rwnoset; -}; - -struct extra_opts { - char *str; - char *end; - int used_size; - int alloc_size; -}; - -/* - * These options define the function of "mount(2)". - */ -#define MS_TYPE (MS_REMOUNT|MS_BIND|MS_MOVE) - - -static const struct mount_opts options[] = { - /* name mask set noset */ - { "async", MS_SYNCHRONOUS, 0, MS_SYNCHRONOUS }, - { "atime", MS_NOATIME, 0, MS_NOATIME }, - { "bind", MS_TYPE, MS_BIND, 0, }, - { "dev", MS_NODEV, 0, MS_NODEV }, - { "diratime", MS_NODIRATIME, 0, MS_NODIRATIME }, - { "dirsync", MS_DIRSYNC, MS_DIRSYNC, 0 }, - { "exec", MS_NOEXEC, 0, MS_NOEXEC }, - { "move", MS_TYPE, MS_MOVE, 0 }, - { "recurse", MS_REC, MS_REC, 0 }, - { "rec", MS_REC, MS_REC, 0 }, - { "remount", MS_TYPE, MS_REMOUNT, 0 }, - { "ro", MS_RDONLY, MS_RDONLY, 0 }, - { "rw", MS_RDONLY, 0, MS_RDONLY }, - { "suid", MS_NOSUID, 0, MS_NOSUID }, - { "sync", MS_SYNCHRONOUS, MS_SYNCHRONOUS, 0 }, - { "verbose", MS_VERBOSE, MS_VERBOSE, 0 }, - { "unbindable", MS_UNBINDABLE, MS_UNBINDABLE, 0 }, - { "private", MS_PRIVATE, MS_PRIVATE, 0 }, - { "slave", MS_SLAVE, MS_SLAVE, 0 }, - { "shared", MS_SHARED, MS_SHARED, 0 }, -}; - -static void add_extra_option(struct extra_opts *extra, char *s) -{ - int len = strlen(s); - int newlen; - - if (extra->str) - len++; /* +1 for ',' */ - newlen = extra->used_size + len; - - if (newlen >= extra->alloc_size) { - char *new; - - new = realloc(extra->str, newlen + 1); /* +1 for NUL */ - if (!new) - return; - - extra->str = new; - extra->end = extra->str + extra->used_size; - extra->alloc_size = newlen + 1; - } - - if (extra->used_size) { - *extra->end = ','; - extra->end++; - } - strcpy(extra->end, s); - extra->used_size += len; - -} - -static unsigned long -parse_mount_options(char *arg, unsigned long rwflag, struct extra_opts *extra, int* loop, char *loopdev) -{ - char *s; - - *loop = 0; - while ((s = strsep(&arg, ",")) != NULL) { - char *opt = s; - unsigned int i; - int res, no = s[0] == 'n' && s[1] == 'o'; - - if (no) - s += 2; - - if (strncmp(s, "loop=", 5) == 0) { - *loop = 1; - strlcpy(loopdev, s + 5, LOOPDEV_MAXLEN); - continue; - } - - if (strcmp(s, "loop") == 0) { - *loop = 1; - strlcpy(loopdev, DEFAULT_LOOP_DEVICE, LOOPDEV_MAXLEN); - continue; - } - for (i = 0, res = 1; i < ARRAY_SIZE(options); i++) { - res = strcmp(s, options[i].str); - - if (res == 0) { - rwflag &= ~options[i].rwmask; - if (no) - rwflag |= options[i].rwnoset; - else - rwflag |= options[i].rwset; - } - if (res <= 0) - break; - } - - if (res != 0 && s[0]) - add_extra_option(extra, opt); - } - - return rwflag; -} - -/* - * Mark the given block device as read-write, using the BLKROSET ioctl. - */ -static void fs_set_blk_rw(const char *blockdev) -{ - int fd; - int OFF = 0; - - fd = open(blockdev, O_RDONLY); - if (fd < 0) { - // should never happen - return; - } - - ioctl(fd, BLKROSET, &OFF); - close(fd); -} - -static char *progname; - -static struct extra_opts extra; -static unsigned long rwflag; - -static int -do_mount(char *dev, char *dir, char *type, unsigned long rwflag, void *data, int loop, - char *loopdev) -{ - char *s; - int error = 0; - - if (loop) { - int file_fd, device_fd; - int flags; - - flags = (rwflag & MS_RDONLY) ? O_RDONLY : O_RDWR; - - file_fd = open(dev, flags); - if (file_fd < 0) { - perror("open backing file failed"); - return 1; - } - device_fd = open(loopdev, flags); - if (device_fd < 0) { - perror("open loop device failed"); - close(file_fd); - return 1; - } - if (ioctl(device_fd, LOOP_SET_FD, file_fd) < 0) { - perror("ioctl LOOP_SET_FD failed"); - close(file_fd); - close(device_fd); - return 1; - } - - close(file_fd); - close(device_fd); - dev = loopdev; - } - - if ((rwflag & MS_RDONLY) == 0) { - fs_set_blk_rw(dev); - } - - while ((s = strsep(&type, ",")) != NULL) { -retry: - if (mount(dev, dir, s, rwflag, data) == -1) { - error = errno; - /* - * If the filesystem is not found, or the - * superblock is invalid, try the next. - */ - if (error == ENODEV || error == EINVAL) - continue; - - /* - * If we get EACCESS, and we're trying to - * mount readwrite and this isn't a remount, - * try read only. - */ - if (error == EACCES && - (rwflag & (MS_REMOUNT|MS_RDONLY)) == 0) { - rwflag |= MS_RDONLY; - goto retry; - } - break; - } - } - - if (error) { - errno = error; - perror("mount"); - return 255; - } - - return 0; -} - -static int print_mounts() -{ - FILE* f; - int length; - char buffer[100]; - - f = fopen("/proc/mounts", "r"); - if (!f) { - fprintf(stdout, "could not open /proc/mounts\n"); - return -1; - } - - do { - length = fread(buffer, 1, 100, f); - if (length > 0) - fwrite(buffer, 1, length, stdout); - } while (length > 0); - - fclose(f); - return 0; -} - -static int get_mounts_dev_dir(const char *arg, char **dev, char **dir) -{ - FILE *f; - char mount_dev[256]; - char mount_dir[256]; - char mount_type[256]; - char mount_opts[256]; - int mount_freq; - int mount_passno; - int match; - - f = fopen("/proc/mounts", "r"); - if (!f) { - fprintf(stdout, "could not open /proc/mounts\n"); - return -1; - } - - do { - match = fscanf(f, "%255s %255s %255s %255s %d %d\n", - mount_dev, mount_dir, mount_type, - mount_opts, &mount_freq, &mount_passno); - mount_dev[255] = 0; - mount_dir[255] = 0; - mount_type[255] = 0; - mount_opts[255] = 0; - if (match == 6 && - (strcmp(arg, mount_dev) == 0 || - strcmp(arg, mount_dir) == 0)) { - *dev = strdup(mount_dev); - *dir = strdup(mount_dir); - fclose(f); - return 0; - } - } while (match != EOF); - - fclose(f); - return -1; -} - -int mount_main(int argc, char *argv[]) -{ - char *type = NULL; - char *dev = NULL; - char *dir = NULL; - int c; - int loop = 0; - char loopdev[LOOPDEV_MAXLEN]; - - progname = argv[0]; - rwflag = MS_VERBOSE; - - // mount with no arguments is equivalent to "cat /proc/mounts" - if (argc == 1) return print_mounts(); - - do { - c = getopt(argc, argv, "o:rt:w"); - if (c == EOF) - break; - switch (c) { - case 'o': - rwflag = parse_mount_options(optarg, rwflag, &extra, &loop, loopdev); - break; - case 'r': - rwflag |= MS_RDONLY; - break; - case 't': - type = optarg; - break; - case 'w': - rwflag &= ~MS_RDONLY; - break; - case '?': - fprintf(stderr, "%s: invalid option -%c\n", - progname, optopt); - exit(1); - } - } while (1); - - /* - * If remount, bind or move was specified, then we don't - * have a "type" as such. Use the dummy "none" type. - */ - if (rwflag & MS_TYPE) - type = "none"; - - if (optind + 2 == argc) { - dev = argv[optind]; - dir = argv[optind + 1]; - } else if (optind + 1 == argc && rwflag & MS_REMOUNT) { - get_mounts_dev_dir(argv[optind], &dev, &dir); - } - - if (dev == NULL || dir == NULL || type == NULL) { - fprintf(stderr, "Usage: %s [-r] [-w] [-o options] [-t type] " - "device directory\n", progname); - exit(1); - } - - return do_mount(dev, dir, type, rwflag, extra.str, loop, loopdev); - /* We leak dev and dir in some cases, but we're about to exit */ -} diff --git a/toolbox/renice.c b/toolbox/renice.c deleted file mode 100644 index 99a06f4..0000000 --- a/toolbox/renice.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 2008, The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google, Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <stdio.h> -#include <unistd.h> -#include <stdlib.h> -#include <string.h> -#include <sys/time.h> -#include <sys/resource.h> -#include <sched.h> -#include <getopt.h> - -static void -usage(const char *s) -{ - fprintf(stderr, "USAGE: %s [[-r] [-t TYPE] priority pids ...] [-g pid]\n", s); - exit(EXIT_FAILURE); -} - -void print_prio(pid_t pid) -{ - int sched; - struct sched_param sp; - - printf("pid %d's priority: %d\n", pid, getpriority(PRIO_PROCESS, pid)); - - printf("scheduling class: "); - sched = sched_getscheduler(pid); - switch (sched) { - case SCHED_FIFO: - printf("FIFO\n"); - break; - case SCHED_RR: - printf("RR\n"); - break; - case SCHED_OTHER: - printf("Normal\n"); - break; - case -1: - perror("sched_getscheduler"); - break; - default: - printf("Unknown\n"); - } - - sched_getparam(pid, &sp); - printf("RT prio: %d (of %d to %d)\n", sp.sched_priority, - sched_get_priority_min(sched), sched_get_priority_max(sched)); -} - -int get_sched(char *str) -{ - if (strcasecmp(str, "RR") == 0) - return SCHED_RR; - else if (strcasecmp(str, "FIFO") == 0) - return SCHED_FIFO; - else if (strcasecmp(str, "NORMAL") == 0) - return SCHED_OTHER; - else if (strcasecmp(str, "OTHER") == 0) - return SCHED_OTHER; - return SCHED_RR; -} - -int renice_main(int argc, char *argv[]) -{ - int prio; - int realtime = 0; - int opt; - int sched = SCHED_RR; - char *cmd = argv[0]; - - do { - opt = getopt(argc, argv, "rt:g:"); - if (opt == -1) - break; - switch (opt) { - case 'r': - // do realtime priority adjustment - realtime = 1; - break; - case 't': - sched = get_sched(optarg); - break; - case 'g': - print_prio(atoi(optarg)); - return 0; - default: - usage(cmd); - } - } while (1); - - argc -= optind; - argv += optind; - - if (argc < 1) - usage(cmd); - - prio = atoi(argv[0]); - argc--; - argv++; - - if (argc < 1) - usage(cmd); - - while(argc) { - pid_t pid; - - pid = atoi(argv[0]); - argc--; - argv++; - - if (realtime) { - struct sched_param sp = { .sched_priority = prio }; - int ret; - - ret = sched_setscheduler(pid, sched, &sp); - if (ret) { - perror("sched_set_scheduler"); - exit(EXIT_FAILURE); - } - } else { - int ret; - - ret = setpriority(PRIO_PROCESS, pid, prio); - if (ret) { - perror("setpriority"); - exit(EXIT_FAILURE); - } - } - } - - return 0; -} diff --git a/toolbox/restart.c b/toolbox/restart.c new file mode 100644 index 0000000..9d803de --- /dev/null +++ b/toolbox/restart.c @@ -0,0 +1,27 @@ +#include <string.h> +#include <stdio.h> +#include <stdlib.h> + +#include <cutils/properties.h> + +int restart_main(int argc, char *argv[]) +{ + char buf[1024]; + + if(argc > 1) { + property_set("ctl.stop", argv[1]); + property_set("ctl.start", argv[1]); + } else { + /* defaults to stopping and starting the common services */ + property_set("ctl.stop", "zygote_secondary"); + property_set("ctl.stop", "zygote"); + property_set("ctl.stop", "surfaceflinger"); + property_set("ctl.stop", "netd"); + property_set("ctl.start", "netd"); + property_set("ctl.start", "surfaceflinger"); + property_set("ctl.start", "zygote"); + property_set("ctl.start", "zygote_secondary"); + } + + return 0; +} diff --git a/toolbox/upstream-netbsd/usr.bin/du/du.c b/toolbox/upstream-netbsd/usr.bin/du/du.c deleted file mode 100644 index 086ac4a..0000000 --- a/toolbox/upstream-netbsd/usr.bin/du/du.c +++ /dev/null @@ -1,364 +0,0 @@ -/* $NetBSD: du.c,v 1.36 2012/03/11 11:23:20 shattered Exp $ */ - -/* - * Copyright (c) 1989, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Chris Newcomb. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -#ifndef lint -__COPYRIGHT("@(#) Copyright (c) 1989, 1993, 1994\ - The Regents of the University of California. All rights reserved."); -#endif /* not lint */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)du.c 8.5 (Berkeley) 5/4/95"; -#else -__RCSID("$NetBSD: du.c,v 1.36 2012/03/11 11:23:20 shattered Exp $"); -#endif -#endif /* not lint */ - -#include <sys/param.h> -#include <sys/types.h> -#include <sys/stat.h> - -#include <dirent.h> -#include <err.h> -#include <errno.h> -#include <fts.h> -#include <inttypes.h> -#include <util.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <limits.h> - -/* Count inodes or file size */ -#define COUNT (iflag ? 1 : p->fts_statp->st_blocks) - -static int linkchk(dev_t, ino_t); -static void prstat(const char *, int64_t); -__dead static void usage(void); - -static int hflag, iflag; -static long blocksize; - -int -main(int argc, char *argv[]) -{ - FTS *fts; - FTSENT *p; - int64_t totalblocks; - int ftsoptions, listfiles; - int depth; - int Hflag, Lflag, aflag, ch, cflag, dflag, gkmflag, nflag, rval, sflag; - const char *noargv[2]; - - Hflag = Lflag = aflag = cflag = dflag = gkmflag = nflag = sflag = 0; - totalblocks = 0; - ftsoptions = FTS_PHYSICAL; - depth = INT_MAX; - while ((ch = getopt(argc, argv, "HLPacd:ghikmnrsx")) != -1) - switch (ch) { - case 'H': - Hflag = 1; - Lflag = 0; - break; - case 'L': - Lflag = 1; - Hflag = 0; - break; - case 'P': - Hflag = Lflag = 0; - break; - case 'a': - aflag = 1; - break; - case 'c': - cflag = 1; - break; - case 'd': - dflag = 1; - depth = atoi(optarg); - if (depth < 0 || depth > SHRT_MAX) { - warnx("invalid argument to option d: %s", - optarg); - usage(); - } - break; - case 'g': - blocksize = 1024 * 1024 * 1024; - gkmflag = 1; - break; - case 'h': - hflag = 1; - break; - case 'i': - iflag = 1; - break; - case 'k': - blocksize = 1024; - gkmflag = 1; - break; - case 'm': - blocksize = 1024 * 1024; - gkmflag = 1; - break; - case 'n': - nflag = 1; - break; - case 'r': - break; - case 's': - sflag = 1; - break; - case 'x': - ftsoptions |= FTS_XDEV; - break; - case '?': - default: - usage(); - } - argc -= optind; - argv += optind; - - /* - * XXX - * Because of the way that fts(3) works, logical walks will not count - * the blocks actually used by symbolic links. We rationalize this by - * noting that users computing logical sizes are likely to do logical - * copies, so not counting the links is correct. The real reason is - * that we'd have to re-implement the kernel's symbolic link traversing - * algorithm to get this right. If, for example, you have relative - * symbolic links referencing other relative symbolic links, it gets - * very nasty, very fast. The bottom line is that it's documented in - * the man page, so it's a feature. - */ - if (Hflag) - ftsoptions |= FTS_COMFOLLOW; - if (Lflag) { - ftsoptions &= ~FTS_PHYSICAL; - ftsoptions |= FTS_LOGICAL; - } - - listfiles = 0; - if (aflag) { - if (sflag || dflag) - usage(); - listfiles = 1; - } else if (sflag) { - if (dflag) - usage(); - depth = 0; - } - - if (!*argv) { - noargv[0] = "."; - noargv[1] = NULL; - argv = __UNCONST(noargv); - } - - if (!gkmflag) - (void)getbsize(NULL, &blocksize); - blocksize /= 512; - - if ((fts = fts_open(argv, ftsoptions, NULL)) == NULL) - err(1, "fts_open `%s'", *argv); - - for (rval = 0; (p = fts_read(fts)) != NULL;) { -#ifndef __ANDROID__ - if (nflag) { - switch (p->fts_info) { - case FTS_NS: - case FTS_SLNONE: - /* nothing */ - break; - default: - if (p->fts_statp->st_flags & UF_NODUMP) { - fts_set(fts, p, FTS_SKIP); - continue; - } - } - } -#endif - switch (p->fts_info) { - case FTS_D: /* Ignore. */ - break; - case FTS_DP: - p->fts_parent->fts_number += - p->fts_number += COUNT; - if (cflag) - totalblocks += COUNT; - /* - * If listing each directory, or not listing files - * or directories and this is post-order of the - * root of a traversal, display the total. - */ - if (p->fts_level <= depth - || (!listfiles && !p->fts_level)) - prstat(p->fts_path, p->fts_number); - break; - case FTS_DC: /* Ignore. */ - break; - case FTS_DNR: /* Warn, continue. */ - case FTS_ERR: - case FTS_NS: - warnx("%s: %s", p->fts_path, strerror(p->fts_errno)); - rval = 1; - break; - default: - if (p->fts_statp->st_nlink > 1 && - linkchk(p->fts_statp->st_dev, p->fts_statp->st_ino)) - break; - /* - * If listing each file, or a non-directory file was - * the root of a traversal, display the total. - */ - if (listfiles || !p->fts_level) - prstat(p->fts_path, COUNT); - p->fts_parent->fts_number += COUNT; - if (cflag) - totalblocks += COUNT; - } - } - if (errno) - err(1, "fts_read"); - if (cflag) - prstat("total", totalblocks); - exit(rval); -} - -static void -prstat(const char *fname, int64_t blocks) -{ - if (iflag) { - (void)printf("%" PRId64 "\t%s\n", blocks, fname); - return; - } - - if (hflag) { - char buf[5]; - int64_t sz = blocks * 512; - - humanize_number(buf, sizeof(buf), sz, "", HN_AUTOSCALE, - HN_B | HN_NOSPACE | HN_DECIMAL); - - (void)printf("%s\t%s\n", buf, fname); - } else - (void)printf("%" PRId64 "\t%s\n", - howmany(blocks, (int64_t)blocksize), - fname); -} - -static int -linkchk(dev_t dev, ino_t ino) -{ - static struct entry { - dev_t dev; - ino_t ino; - } *htable; - static int htshift; /* log(allocated size) */ - static int htmask; /* allocated size - 1 */ - static int htused; /* 2*number of insertions */ - static int sawzero; /* Whether zero is in table or not */ - int h, h2; - uint64_t tmp; - /* this constant is (1<<64)/((1+sqrt(5))/2) - * aka (word size)/(golden ratio) - */ - const uint64_t HTCONST = 11400714819323198485ULL; - const int HTBITS = CHAR_BIT * sizeof(tmp); - - /* Never store zero in hashtable */ - if (dev == 0 && ino == 0) { - h = sawzero; - sawzero = 1; - return h; - } - - /* Extend hash table if necessary, keep load under 0.5 */ - if (htused<<1 >= htmask) { - struct entry *ohtable; - - if (!htable) - htshift = 10; /* starting hashtable size */ - else - htshift++; /* exponential hashtable growth */ - - htmask = (1 << htshift) - 1; - htused = 0; - - ohtable = htable; - htable = calloc(htmask+1, sizeof(*htable)); - if (!htable) - err(1, "calloc"); - - /* populate newly allocated hashtable */ - if (ohtable) { - int i; - for (i = 0; i <= htmask>>1; i++) - if (ohtable[i].ino || ohtable[i].dev) - linkchk(ohtable[i].dev, ohtable[i].ino); - free(ohtable); - } - } - - /* multiplicative hashing */ - tmp = dev; - tmp <<= HTBITS>>1; - tmp |= ino; - tmp *= HTCONST; - h = tmp >> (HTBITS - htshift); - h2 = 1 | ( tmp >> (HTBITS - (htshift<<1) - 1)); /* must be odd */ - - /* open address hashtable search with double hash probing */ - while (htable[h].ino || htable[h].dev) { - if ((htable[h].ino == ino) && (htable[h].dev == dev)) - return 1; - h = (h + h2) & htmask; - } - - /* Insert the current entry into hashtable */ - htable[h].dev = dev; - htable[h].ino = ino; - htused++; - return 0; -} - -static void -usage(void) -{ - - (void)fprintf(stderr, - "usage: du [-H | -L | -P] [-a | -d depth | -s] [-cghikmnrx] [file ...]\n"); - exit(1); -} diff --git a/toolbox/uptime.c b/toolbox/uptime.c deleted file mode 100644 index ebfb15e..0000000 --- a/toolbox/uptime.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2010, The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google, Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <errno.h> -#include <stdio.h> -#include <string.h> -#include <time.h> - -static void format_time(int time, char* buffer) { - int seconds = time % 60; - time /= 60; - int minutes = time % 60; - time /= 60; - int hours = time % 24; - int days = time / 24; - - if (days > 0) { - sprintf(buffer, "%d day%s, %02d:%02d:%02d", days, (days == 1) ? "" : "s", hours, minutes, seconds); - } else { - sprintf(buffer, "%02d:%02d:%02d", hours, minutes, seconds); - } -} - -int uptime_main(int argc __attribute__((unused)), char *argv[] __attribute__((unused))) { - FILE* file = fopen("/proc/uptime", "r"); - if (!file) { - fprintf(stderr, "Could not open /proc/uptime\n"); - return -1; - } - float idle_time; - if (fscanf(file, "%*f %f", &idle_time) != 1) { - fprintf(stderr, "Could not parse /proc/uptime\n"); - fclose(file); - return -1; - } - fclose(file); - - struct timespec up_timespec; - if (clock_gettime(CLOCK_MONOTONIC, &up_timespec) == -1) { - fprintf(stderr, "Could not get monotonic time: %s\n", strerror(errno)); - return -1; - } - float up_time = up_timespec.tv_sec + up_timespec.tv_nsec / 1e9; - - struct timespec elapsed_timespec; - if (clock_gettime(CLOCK_BOOTTIME, &elapsed_timespec) == -1) { - fprintf(stderr, "Could not get boot time: %s\n", strerror(errno)); - return -1; - } - int elapsed = elapsed_timespec.tv_sec; - - char up_string[100], idle_string[100], sleep_string[100]; - format_time(elapsed, up_string); - format_time((int)idle_time, idle_string); - format_time((int)(elapsed - up_time), sleep_string); - printf("up time: %s, idle time: %s, sleep time: %s\n", up_string, idle_string, sleep_string); - - return 0; -} diff --git a/toolbox/watchprops.c b/toolbox/watchprops.c deleted file mode 100644 index cd62922..0000000 --- a/toolbox/watchprops.c +++ /dev/null @@ -1,92 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include <errno.h> - -#include <cutils/properties.h> -#include <cutils/hashmap.h> - -#define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_ -#include <sys/_system_properties.h> - -static int str_hash(void *key) -{ - return hashmapHash(key, strlen(key)); -} - -static bool str_equals(void *keyA, void *keyB) -{ - return strcmp(keyA, keyB) == 0; -} - -static void announce(char *name, char *value) -{ - unsigned char *x; - - for(x = (unsigned char *)value; *x; x++) { - if((*x < 32) || (*x > 127)) *x = '.'; - } - - fprintf(stderr,"%10d %s = '%s'\n", (int) time(0), name, value); -} - -static void add_to_watchlist(Hashmap *watchlist, const char *name, - const prop_info *pi) -{ - char *key = strdup(name); - unsigned *value = malloc(sizeof(unsigned)); - if (!key || !value) - exit(1); - - *value = __system_property_serial(pi); - hashmapPut(watchlist, key, value); -} - -static void populate_watchlist(const prop_info *pi, void *cookie) -{ - Hashmap *watchlist = cookie; - char name[PROP_NAME_MAX]; - char value_unused[PROP_VALUE_MAX]; - - __system_property_read(pi, name, value_unused); - add_to_watchlist(watchlist, name, pi); -} - -static void update_watchlist(const prop_info *pi, void *cookie) -{ - Hashmap *watchlist = cookie; - char name[PROP_NAME_MAX]; - char value[PROP_VALUE_MAX]; - unsigned *serial; - - __system_property_read(pi, name, value); - serial = hashmapGet(watchlist, name); - if (!serial) { - add_to_watchlist(watchlist, name, pi); - announce(name, value); - } else { - unsigned tmp = __system_property_serial(pi); - if (*serial != tmp) { - *serial = tmp; - announce(name, value); - } - } -} - -int watchprops_main(int argc, char *argv[]) -{ - unsigned serial; - - Hashmap *watchlist = hashmapCreate(1024, str_hash, str_equals); - if (!watchlist) - exit(1); - - __system_property_foreach(populate_watchlist, watchlist); - - for(serial = 0;;) { - serial = __system_property_wait_any(serial); - __system_property_foreach(update_watchlist, watchlist); - } - return 0; -} |