implement chown
This commit is contained in:
@ -122,12 +122,12 @@ int make_directive_file(FILE * f) {
|
||||
}
|
||||
// Owner
|
||||
if (do_owner) {
|
||||
struct passwd * pw = getpwuid(entry->st.st_uid);
|
||||
struct group * gr = getgrgid(entry->st.st_gid);
|
||||
struct passwd * usr = getpwuid(entry->st.st_uid);
|
||||
struct group * grp = getgrgid(entry->st.st_gid);
|
||||
|
||||
fprintf(f, "\t%s:%s",
|
||||
pw->pw_name,
|
||||
gr->gr_name
|
||||
usr->pw_name,
|
||||
grp->gr_name
|
||||
);
|
||||
}
|
||||
// Name
|
||||
@ -199,8 +199,13 @@ int execute_directive_file(FILE * f) {
|
||||
// Owner
|
||||
if (do_owner) {
|
||||
char buffer2[113];
|
||||
sscanf(sp, "%s:%s\t", buffer, buffer2);
|
||||
//mychown(filename, buffer, buffer2);
|
||||
sscanf(sp, "%[^:]:%s\t", buffer, buffer2);
|
||||
struct passwd * usr = getpwuid(entry->st.st_uid);
|
||||
struct group * grp = getgrgid(entry->st.st_gid);
|
||||
if (strcmp(usr->pw_name, buffer)
|
||||
|| strcmp(grp->gr_name, buffer2)) {
|
||||
mychown(entry->name, buffer, buffer2);
|
||||
}
|
||||
NEXT_FIELD;
|
||||
}
|
||||
|
||||
|
@ -31,6 +31,9 @@ void errorn(int n, ...) {
|
||||
case E_FILE_ACCESS: verror("failed to interact with file '%s'", argv); break;
|
||||
case E_FILE_DELETE: verror("failed to delete file '%s'", argv); break;
|
||||
case E_FILE_MOVE: verror("failed to move '%s' to '%s'", argv); break;
|
||||
case E_FILE_CHOWN: verror("failed to chown '%s'", argv); break;
|
||||
case E_NO_USER: verror("failed to find the user '%s'", argv); break;
|
||||
case E_NO_GROUP: verror("failed to find the group '%s'", argv); break;
|
||||
case E_FORMAT: verror("directive-file format violation", argv); break;
|
||||
case E_FLAG: verror("unknown flag '%c'", argv); break;
|
||||
default: verror("unknown error encountered; this is an illegal inner state", 0); break;
|
||||
|
@ -6,6 +6,9 @@ enum {
|
||||
E_FILE_ACCESS,
|
||||
E_FILE_DELETE,
|
||||
E_FILE_MOVE,
|
||||
E_FILE_CHOWN,
|
||||
E_NO_USER,
|
||||
E_NO_GROUP,
|
||||
E_FORMAT,
|
||||
E_FLAG,
|
||||
};
|
||||
|
@ -194,24 +194,25 @@ int moist_chown(const char * filename, const char * owner, const char * group) {
|
||||
uid_t uid = -1;
|
||||
gid_t gid = -1;
|
||||
|
||||
struct passwd * pwd = getpwnam(owner);
|
||||
if (!pwd) {
|
||||
fprintf(stderr, "Error: User '%s' not found\n", owner);
|
||||
struct passwd * usr = getpwnam(owner);
|
||||
if (!usr) {
|
||||
errorn(E_NO_USER, owner);
|
||||
return 1;
|
||||
}
|
||||
uid = pwd->pw_uid;
|
||||
uid = usr->pw_uid;
|
||||
|
||||
struct group * grp = getgrnam(group);
|
||||
if (!grp) {
|
||||
fprintf(stderr, "Error: Group '%s' not found\n", group);
|
||||
errorn(E_NO_GROUP, group);
|
||||
return 1;
|
||||
}
|
||||
gid = grp->gr_gid;
|
||||
|
||||
if (chown(filename, uid, gid) != 0) {
|
||||
perror("Error changing file ownership");
|
||||
if (chown(filename, uid, gid)) {
|
||||
errorn(E_FILE_CHOWN, filename);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user