From f5d178f87928884c7abdc3fe653604b80419997b Mon Sep 17 00:00:00 2001 From: anon Date: Fri, 24 Jan 2025 12:41:02 +0100 Subject: [PATCH] implement chown --- source/directive.c | 17 +++++++++++------ source/error.c | 3 +++ source/error.h | 3 +++ source/file_utils.c | 15 ++++++++------- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/source/directive.c b/source/directive.c index 821c2a7..af91b20 100644 --- a/source/directive.c +++ b/source/directive.c @@ -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; } diff --git a/source/error.c b/source/error.c index 106a874..e690c7b 100644 --- a/source/error.c +++ b/source/error.c @@ -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; diff --git a/source/error.h b/source/error.h index 18e506f..a90d45c 100644 --- a/source/error.h +++ b/source/error.h @@ -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, }; diff --git a/source/file_utils.c b/source/file_utils.c index fce464a..7492ad0 100644 --- a/source/file_utils.c +++ b/source/file_utils.c @@ -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; }