1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/types.h> 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <dirent.h> 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h> 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <pwd.h> 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <grp.h> 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h> 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <time.h> 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint chown_main(int argc, char **argv) 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc < 3) { 18474cea824fde58a7a2b81b9edc2ffe68d4843177Jeff Sharkey fprintf(stderr, "Usage: chown <USER>[:GROUP] <FILE1> [FILE2] ...\n"); 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 10; 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // Copy argv[1] to 'user' so we can truncate it at the period 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // if a group id specified. 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char user[32]; 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *group = NULL; 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strncpy(user, argv[1], sizeof(user)); 27474cea824fde58a7a2b81b9edc2ffe68d4843177Jeff Sharkey if ((group = strchr(user, ':')) != NULL) { 28474cea824fde58a7a2b81b9edc2ffe68d4843177Jeff Sharkey *group++ = '\0'; 29474cea824fde58a7a2b81b9edc2ffe68d4843177Jeff Sharkey } else if ((group = strchr(user, '.')) != NULL) { 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *group++ = '\0'; 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // Lookup uid (and gid if specified) 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct passwd *pw; 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct group *grp = NULL; 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uid_t uid; 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gid_t gid = -1; // passing -1 to chown preserves current group 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pw = getpwnam(user); 40715c889713a7b3bd2f487dd14482af9675afc5cfAndrew Stadler if (pw != NULL) { 41715c889713a7b3bd2f487dd14482af9675afc5cfAndrew Stadler uid = pw->pw_uid; 42715c889713a7b3bd2f487dd14482af9675afc5cfAndrew Stadler } else { 43715c889713a7b3bd2f487dd14482af9675afc5cfAndrew Stadler char* endptr; 44715c889713a7b3bd2f487dd14482af9675afc5cfAndrew Stadler uid = (int) strtoul(user, &endptr, 0); 45715c889713a7b3bd2f487dd14482af9675afc5cfAndrew Stadler if (endptr == user) { // no conversion 46715c889713a7b3bd2f487dd14482af9675afc5cfAndrew Stadler fprintf(stderr, "No such user '%s'\n", user); 47715c889713a7b3bd2f487dd14482af9675afc5cfAndrew Stadler return 10; 48715c889713a7b3bd2f487dd14482af9675afc5cfAndrew Stadler } 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (group != NULL) { 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project grp = getgrnam(group); 53715c889713a7b3bd2f487dd14482af9675afc5cfAndrew Stadler if (grp != NULL) { 54715c889713a7b3bd2f487dd14482af9675afc5cfAndrew Stadler gid = grp->gr_gid; 55715c889713a7b3bd2f487dd14482af9675afc5cfAndrew Stadler } else { 56715c889713a7b3bd2f487dd14482af9675afc5cfAndrew Stadler char* endptr; 57715c889713a7b3bd2f487dd14482af9675afc5cfAndrew Stadler gid = (int) strtoul(group, &endptr, 0); 58715c889713a7b3bd2f487dd14482af9675afc5cfAndrew Stadler if (endptr == group) { // no conversion 59715c889713a7b3bd2f487dd14482af9675afc5cfAndrew Stadler fprintf(stderr, "No such group '%s'\n", group); 60715c889713a7b3bd2f487dd14482af9675afc5cfAndrew Stadler return 10; 61715c889713a7b3bd2f487dd14482af9675afc5cfAndrew Stadler } 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (i = 2; i < argc; i++) { 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (chown(argv[i], uid, gid) < 0) { 6769ab6de33319c111a6b9ff4c78474d7605b28175Johan Norberg fprintf(stderr, "Unable to chown %s: %s\n", argv[i], strerror(errno)); 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 10; 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 74