chown.c revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
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) { 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 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)); 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((group = strchr(user, '.')) != NULL) { 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *group++ = '\0'; 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // Lookup uid (and gid if specified) 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct passwd *pw; 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct group *grp = NULL; 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uid_t uid; 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gid_t gid = -1; // passing -1 to chown preserves current group 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pw = getpwnam(user); 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (pw == NULL) { 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "No such user '%s'\n", user); 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 10; 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uid = pw->pw_uid; 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (group != NULL) { 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project grp = getgrnam(group); 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (grp == NULL) { 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "No such group '%s'\n", group); 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 10; 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gid = grp->gr_gid; 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (i = 2; i < argc; i++) { 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (chown(argv[i], uid, gid) < 0) { 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "Unable to chmod %s: %s\n", argv[i], strerror(errno)); 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 10; 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 63