From c6446e178bf8f4a53511e5ae1e0f3feeb921197c Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Fri, 12 May 2023 17:38:41 -0400 Subject: chown, chmod --- command/ls.c | 45 ++++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 17 deletions(-) (limited to 'command/ls.c') diff --git a/command/ls.c b/command/ls.c index 8ed796f..bbfedfb 100644 --- a/command/ls.c +++ b/command/ls.c @@ -133,35 +133,46 @@ static bool get_file_info(const char* file_name, struct FileInfo* info) { info->mode[1] = (s.st_mode & S_IRUSR) ? 'r' : '-'; info->mode[2] = (s.st_mode & S_IWUSR) ? 'w' : '-'; - if (s.st_mode & S_IXUSR) { - if (s.st_mode & S_ISUID) { - info->mode[3] = 's'; - info->set_uid = true; - } else { - info->mode[3] = 'x'; - } - if (!info->exec) info->exec = s.st_uid == uid; + if (s.st_mode & S_IXUSR && s.st_mode & S_ISUID) { + info->mode[3] = 's'; + info->set_uid = true; + if (!info->exec) info->exec = info->usr->pw_uid == uid; + } else if (s.st_mode & S_ISUID) { + info->mode[3] = 'S'; + info->set_uid = true; + } else if (s.st_mode & S_IXUSR) { + info->mode[3] = 'x'; + if (!info->exec) info->exec = info->usr->pw_uid == uid; } else { info->mode[3] = '-'; } info->mode[4] = (s.st_mode & S_IRGRP) ? 'r' : '-'; info->mode[5] = (s.st_mode & S_IWGRP) ? 'w' : '-'; - if (s.st_mode & S_IXGRP) { - if (s.st_mode & S_ISGID) { - info->mode[6] = 's'; - info->set_gid = true; - } else { - info->mode[6] = 'x'; - } - if (!info->exec) info->exec = s.st_gid == gid; + if (s.st_mode & S_IXGRP && s.st_mode & S_ISGID) { + info->mode[6] = 's'; + info->set_gid = true; + if (!info->exec) info->exec = info->grp->gr_gid == gid; + } else if (s.st_mode & S_ISGID) { + info->mode[6] = 'S'; + info->set_gid = true; + } else if (s.st_mode & S_IXGRP) { + info->mode[6] = 'x'; + if (!info->exec) info->exec = info->grp->gr_gid == gid; } else { info->mode[6] = '-'; } info->mode[7] = (s.st_mode & S_IROTH) ? 'r' : '-'; info->mode[8] = (s.st_mode & S_IWOTH) ? 'w' : '-'; - if (s.st_mode & S_IXOTH) { + if (s.st_mode & S_IXOTH && s.st_mode & S_ISVTX) { + info->mode[9] = 't'; + info->set_gid = true; + info->exec = true; + } else if (s.st_mode & S_ISVTX) { + info->mode[9] = 'T'; + info->set_gid = true; + } else if (s.st_mode & S_IXOTH) { info->mode[9] = 'x'; info->exec = true; } else { -- cgit v1.2.3-freya