From e6e9de1ac496b65c6b7023d2085773700613fecf Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Mon, 13 Sep 2004 09:41:51 +0000 Subject: [PATCH] Initial release; not functional yet --- src/chown.c | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 src/chown.c diff --git a/src/chown.c b/src/chown.c new file mode 100644 index 0000000..c8d0644 --- /dev/null +++ b/src/chown.c @@ -0,0 +1,123 @@ +/* chown.c */ + + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +/* types */ +#define OPT_h 1 +#define OPT_R 2 +#define OPT_H 4 +#define OPT_L 8 +#define OPT_P 12 + + +/* chown */ +static int _chown_owner(char * owner, uid_t * uid, gid_t * gid); +static int _chown_do(int opts, uid_t uid, gid_t gid, int argc, char * argv[]); +static int _chown(int opts, char * owner, int argc, char * argv[]) +{ + uid_t uid; + gid_t gid; + + if(_chown_owner(owner, &uid, &gid) != 0) + return 2; + return _chown_do(opts, uid, gid, argc, argv); +} + +/* PRE + * POST + * 0 success + * else failure */ +static uid_t _chown_uid(char * owner); +static gid_t _chown_gid(char * group); +static int _chown_owner(char * owner, uid_t * uid, gid_t * gid) +{ + int i; + + for(i = 0; owner[i] != 0; i++) + if(owner[i] == ':') + { + owner[i++] = '\0'; + break; + } + if((*uid = _chown_uid(owner)) == -1) + return 1; + if(owner[i] != '\0' && (*gid = _chown_gid(&owner[i])) == -1) + return 1; + else + *gid = -1; + return 0; +} + +static uid_t _chown_uid(char * owner) +{ + struct passwd * pwd; + + if((pwd = getpwnam(owner)) == NULL) + return -1; + return pwd->pw_uid; +} + +static gid_t _chown_gid(char * group) +{ + struct group * gr; + + if((gr = getgrnam(group)) == NULL) + return -1; + return gr->gr_gid; +} + +static int _chown_do(int opts, uid_t uid, gid_t gid, int argc, char * argv[]) +{ + return 2; +} + + +/* usage */ +static int _usage(void) +{ + fprintf(stderr, "%s", "Usage: chown [-hR] owner[:group] file ...\n\ + chown -R [-H | -L | -P] owner[:group] file ...\n"); + return 1; +} + +/* main */ +int main(int argc, char * argv[]) +{ + int o; + int opts = 0; + + while((o = getopt(argc, argv, "hRHLP")) != -1) + { + switch(o) + { + case 'h': + opts |= OPT_h; + break; + case 'R': + opts |= OPT_R; + break; + case 'H': + case 'L': + case 'P': + fprintf(stderr, "%s%c%s", "chown: -", o, + ": Not yet implemented\n"); + default: + return _usage(); + } + } + if(argc - optind < 2) + return _usage(); + return _chown(opts, argv[optind], argc - optind - 1, &argv[optind+1]); +}