implement chown

This commit is contained in:
anon
2025-01-24 12:41:02 +01:00
parent 798e087e82
commit f5d178f879
4 changed files with 25 additions and 13 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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,
};

View File

@ -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;
}