fixed du ls chmod

This commit is contained in:
Your Name 2024-03-18 00:46:58 +03:00
parent 1a14f8e484
commit 9f12d068fc
7 changed files with 87 additions and 71 deletions

View File

@ -14,6 +14,7 @@ char *mu_humansize(off_t n, off_t block) {
double size = n; double size = n;
size_t i; size_t i;
for (i = 0; i < strlen(postfixes) && size >= block; i++) for (i = 0; i < strlen(postfixes) && size >= block; i++)
size /= block; size /= block;

View File

@ -0,0 +1,57 @@
#ifndef _MODE_TO_STR_H
#define _MODE_TO_STR_H
#include <stdio.h>
#include <sys/stat.h>
char *mu_mode_2_str(mode_t file_mode) {
static char mode[11];
snprintf(mode, sizeof(mode), "----------");
if (file_mode & S_IRUSR)
mode[1] = 'r';
if (file_mode & S_IRGRP)
mode[4] = 'r';
if (file_mode & S_IROTH)
mode[7] = 'r';
if (file_mode & S_IWUSR)
mode[2] = 'w';
if (file_mode & S_IWGRP)
mode[5] = 'w';
if (file_mode & S_IWOTH)
mode[8] = 'w';
if (file_mode & S_IXUSR)
mode[3] = 'x';
if (file_mode & S_IXGRP)
mode[6] = 'x';
if (file_mode & S_IXOTH)
mode[9] = 'x';
if (file_mode & S_ISUID) {
if (file_mode & S_IXUSR)
mode[3] = 's';
else
mode[3] = 'S';
}
if (file_mode & S_ISGID) {
if (file_mode & S_IRGRP)
mode[6] = 's';
else
mode[6] = 'S';
}
return mode;
}
#endif

View File

@ -12,6 +12,7 @@
#define WR_PERM (S_IWUSR | S_IWGRP | S_IWOTH) #define WR_PERM (S_IWUSR | S_IWGRP | S_IWOTH)
#define EX_PERM (S_IXUSR | S_IXGRP | S_IXOTH) #define EX_PERM (S_IXUSR | S_IXGRP | S_IXOTH)
#define RD_PERM (S_IRUSR | S_IRGRP | S_IROTH) #define RD_PERM (S_IRUSR | S_IRGRP | S_IROTH)
#define SU_PERM (S_ISUID | S_ISGID | S_ISVTX)
#define FULL_PERM (WR_PERM | EX_PERM | RD_PERM) #define FULL_PERM (WR_PERM | EX_PERM | RD_PERM)
mode_t mu_parse_mode(const char *s, mode_t cur_mode) { mode_t mu_parse_mode(const char *s, mode_t cur_mode) {
@ -27,7 +28,7 @@ mode_t mu_parse_mode(const char *s, mode_t cur_mode) {
mode = 0; mode = 0;
/* Default + */ /* Default + */
int append = 1; char append = 1;
mode_t mask = 0; mode_t mask = 0;
for (size_t i = 0; i < strlen(s); i++) { for (size_t i = 0; i < strlen(s); i++) {
@ -44,6 +45,10 @@ mode_t mu_parse_mode(const char *s, mode_t cur_mode) {
mode |= EX_PERM; mode |= EX_PERM;
break; break;
case 's':
mode |= SU_PERM;
break;
case '+': case '+':
append = 1; append = 1;
break; break;
@ -52,6 +57,10 @@ mode_t mu_parse_mode(const char *s, mode_t cur_mode) {
append = 0; append = 0;
break; break;
case '=':
append = 2;
break;
case 'g': case 'g':
mask |= G; mask |= G;
break; break;
@ -77,10 +86,14 @@ mode_t mu_parse_mode(const char *s, mode_t cur_mode) {
mask = U; mask = U;
mask &= mode; mask &= mode;
if (!append) if (append == 0)
mode = ~mode; mode = ~mode;
return (cur_mode & ~mask) | (mode & mask); if (append == 2)
return mode & mask;
else
return (cur_mode & ~mask) | (mode & mask);
} }
#endif #endif

View File

@ -4,6 +4,7 @@
#include <unistd.h> #include <unistd.h>
#include <dirent.h> #include <dirent.h>
#include <sys/stat.h> #include <sys/stat.h>
#include "mode_to_str.h"
#include "make_path.h" #include "make_path.h"
#include "get_stat.h" #include "get_stat.h"
#include "parse_mode.h" #include "parse_mode.h"
@ -30,7 +31,7 @@ int change(const char *file, void *p) {
} }
if (v_flag) if (v_flag)
printf("chmod: %s: changed mode to %d\n", file, mode); printf("chmod: %s: changed mode to %s\n", file, mu_mode_2_str(mode));
return 0; return 0;
} }

View File

@ -16,19 +16,21 @@ off_t total;
void print(off_t size, const char *filename) { void print(off_t size, const char *filename) {
if (h_flag) if (h_flag)
printf("%s\t%s\n", mu_humansize(size, 1024), filename); printf("%s\t%s\n", mu_humansize(size * 512, 1024), filename);
else else
printf("%jd\t%s\n", (intmax_t)size / 1024, filename); printf("%jd\t%s\n", (intmax_t)size / 2, filename);
} }
off_t du(const char *path, int recurs_flag) { off_t du(const char *path, int recurs_flag) {
off_t sum = 0;
struct stat sb; struct stat sb;
if (mu_get_lstat("du", path, &sb)) if (mu_get_lstat("du", path, &sb))
return 0; return 0;
off_t sum = sb.st_blocks;
if (c_flag)
total += sum;
if (S_ISDIR(sb.st_mode)) { if (S_ISDIR(sb.st_mode)) {
DIR *dp = opendir(path); DIR *dp = opendir(path);
if (!dp) { if (!dp) {
@ -62,15 +64,8 @@ off_t du(const char *path, int recurs_flag) {
print(sum, path); print(sum, path);
} }
/* Get file size */ else if (!recurs_flag)
else { print(sum, path);
sum = sb.st_blocks * 512;
if (c_flag)
total += sum;
if (!recurs_flag)
print(sum, path);
}
return sum; return sum;
} }

View File

@ -11,6 +11,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include "mode_to_str.h"
#include "make_path.h" #include "make_path.h"
#include "get_stat.h" #include "get_stat.h"
#include "config.h" #include "config.h"
@ -165,60 +166,8 @@ char *get_date(time_t mtime) {
int print(const struct d_node *node) { int print(const struct d_node *node) {
char suf = ' '; char suf = ' ';
char *color = ""; char *color = "";
char mode[] = "----------";
if (node->stats.st_mode & S_IRUSR)
mode[1] = 'r';
if (node->stats.st_mode & S_IRGRP)
mode[4] = 'r';
if (node->stats.st_mode & S_IROTH)
mode[7] = 'r';
if (node->stats.st_mode & S_IWUSR)
mode[2] = 'w';
if (node->stats.st_mode & S_IWGRP)
mode[5] = 'w';
if (node->stats.st_mode & S_IWOTH)
mode[8] = 'w';
if (node->stats.st_mode & S_IXUSR)
mode[3] = 'x';
if (node->stats.st_mode & S_IXGRP)
mode[6] = 'x';
if (node->stats.st_mode & S_IXOTH)
mode[9] = 'x';
if (node->stats.st_mode & S_ISUID) {
if (node->stats.st_mode & S_IXUSR)
mode[3] = 's';
else
mode[3] = 'S';
}
if (node->stats.st_mode & S_ISGID) {
if (node->stats.st_mode & S_IRGRP)
mode[6] = 's';
else
mode[6] = 'S';
}
if (node->stats.st_mode & S_ISVTX) {
if (node->stats.st_mode & S_IROTH)
mode[9] = 't';
else
mode[9] = 'T';
}
char *mode = mu_mode_2_str(node->stats.st_mode);
if (S_ISDIR(node->stats.st_mode)) { if (S_ISDIR(node->stats.st_mode)) {
if (node->name[strlen(node->name) - 1] != '/') if (node->name[strlen(node->name) - 1] != '/')
suf = '/'; suf = '/';

View File

@ -29,7 +29,7 @@ void execute(char *argv[]) {
execvp(argv[0], argv); execvp(argv[0], argv);
fprintf(stderr, "init: Failed to run %s\nRebooting...\n", argv[0]); fprintf(stderr, "init: Failed to run %s\nRebooting...\n", argv[0]);
poweroff(SIGKILL); poweroff(SIGUSR2);
} }
} }