diff options
| author | The Android Open Source Project <initial-contribution@android.com> | 2009-02-10 15:44:07 -0800 |
|---|---|---|
| committer | The Android Open Source Project <initial-contribution@android.com> | 2009-02-10 15:44:07 -0800 |
| commit | 13f797da7f190e9ea52f2f3d235210b8a4963b21 (patch) | |
| tree | c821e95502ab1ab9096a11e7488e224e319a46b4 /toolbox | |
| parent | dcf3ce247e13fe0a982ed2ada35cdee1f0ac626a (diff) | |
| download | system_core-13f797da7f190e9ea52f2f3d235210b8a4963b21.zip system_core-13f797da7f190e9ea52f2f3d235210b8a4963b21.tar.gz system_core-13f797da7f190e9ea52f2f3d235210b8a4963b21.tar.bz2 | |
auto import from //branches/cupcake/...@130745
Diffstat (limited to 'toolbox')
| -rw-r--r-- | toolbox/Android.mk | 1 | ||||
| -rw-r--r-- | toolbox/chown.c | 62 | ||||
| -rw-r--r-- | toolbox/insmod.c | 23 |
3 files changed, 83 insertions, 3 deletions
diff --git a/toolbox/Android.mk b/toolbox/Android.mk index b0c241e..5a8dc0b 100644 --- a/toolbox/Android.mk +++ b/toolbox/Android.mk @@ -41,6 +41,7 @@ TOOLS := \ printenv \ smd \ chmod \ + chown \ mkdosfs \ netstat \ ioctl \ diff --git a/toolbox/chown.c b/toolbox/chown.c new file mode 100644 index 0000000..13617db --- /dev/null +++ b/toolbox/chown.c @@ -0,0 +1,62 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <dirent.h> +#include <errno.h> +#include <pwd.h> +#include <grp.h> + +#include <unistd.h> +#include <time.h> + +int chown_main(int argc, char **argv) +{ + int i; + + if (argc < 3) { + fprintf(stderr, "Usage: chown <USER>[.GROUP] <FILE1> [FILE2] ...\n"); + return 10; + } + + // Copy argv[1] to 'user' so we can truncate it at the period + // if a group id specified. + char user[32]; + char *group = NULL; + strncpy(user, argv[1], sizeof(user)); + if ((group = strchr(user, '.')) != NULL) { + *group++ = '\0'; + } + + // Lookup uid (and gid if specified) + struct passwd *pw; + struct group *grp = NULL; + uid_t uid; + gid_t gid = -1; // passing -1 to chown preserves current group + + pw = getpwnam(user); + if (pw == NULL) { + fprintf(stderr, "No such user '%s'\n", user); + return 10; + } + uid = pw->pw_uid; + + if (group != NULL) { + grp = getgrnam(group); + if (grp == NULL) { + fprintf(stderr, "No such group '%s'\n", group); + return 10; + } + gid = grp->gr_gid; + } + + for (i = 2; i < argc; i++) { + if (chown(argv[i], uid, gid) < 0) { + fprintf(stderr, "Unable to chmod %s: %s\n", argv[i], strerror(errno)); + return 10; + } + } + + return 0; +} + diff --git a/toolbox/insmod.c b/toolbox/insmod.c index d084403..44b9847 100644 --- a/toolbox/insmod.c +++ b/toolbox/insmod.c @@ -45,10 +45,12 @@ bail: return buffer; } +#define min(x,y) ((x) < (y) ? (x) : (y)) int insmod_main(int argc, char **argv) { void *file; - ssize_t size; + ssize_t size = 0; + char opts[1024]; int ret; /* make sure we've got an argument */ @@ -64,9 +66,24 @@ int insmod_main(int argc, char **argv) return -1; } + opts[0] = '\0'; + if (argc > 2) { + int i, len; + char *end = opts + sizeof(opts) - 1; + char *ptr = opts; + + for (i = 2; (i < argc) && (ptr < end); i++) { + len = min(strlen(argv[i]), end - ptr); + memcpy(ptr, argv[i], len); + ptr += len; + *ptr++ = ' '; + *ptr++ = '\0'; + } + *(ptr - 1) = '\0'; + } + /* pass it to the kernel */ - /* XXX options */ - ret = init_module(file, size, ""); + ret = init_module(file, size, opts); if (ret != 0) { fprintf(stderr, "insmod: init_module '%s' failed (%s)\n", |
