X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=e2fsprogs%2Flsattr.c;h=5f4f8727628a83fc82e69f9b79e4e16b601bb5d3;hb=339936be006c3695de5c93bc59707c3d853ae186;hp=62b9535c2cc6561566ebc46b9b4e5fea2989fd1c;hpb=d6a8f5f0d0572b7e8bb975cdbba1e581931d12d6;p=oweals%2Fbusybox.git diff --git a/e2fsprogs/lsattr.c b/e2fsprogs/lsattr.c index 62b9535c2..5f4f87276 100644 --- a/e2fsprogs/lsattr.c +++ b/e2fsprogs/lsattr.c @@ -1,3 +1,4 @@ +/* vi: set sw=4 ts=4: */ /* * lsattr.c - List file attributes on an ext2 file system * @@ -17,129 +18,95 @@ * 98/12/29 - Display version info only when -V specified (G M Sipe) */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "e2fsbb.h" -#include "e2p/e2p.h" - -#ifdef __GNUC__ -#define EXT2FS_ATTR(x) __attribute__(x) -#else -#define EXT2FS_ATTR(x) -#endif - -#define OPT_RECUR 1 -#define OPT_ALL 2 -#define OPT_DIRS_OPT 4 -#define OPT_PF_LONG 8 -#define OPT_GENERATION 16 -static int flags; - -#ifdef CONFIG_LFS -# define LSTAT lstat64 -# define STRUCT_STAT struct stat64 -#else -# define LSTAT lstat -# define STRUCT_STAT struct stat -#endif +#include "libbb.h" +#include "e2fs_lib.h" + +enum { + OPT_RECUR = 0x1, + OPT_ALL = 0x2, + OPT_DIRS_OPT = 0x4, + OPT_PF_LONG = 0x8, + OPT_GENERATION = 0x10, +}; static void list_attributes(const char *name) { unsigned long fsflags; unsigned long generation; - if (fgetflags(name, &fsflags) == -1) { - bb_perror_msg("While reading flags on %s", name); - return; - } - if (flags & OPT_GENERATION) { - if (fgetversion(name, &generation) == -1) { - bb_perror_msg("While reading version on %s", name); - return; - } + if (fgetflags(name, &fsflags) != 0) + goto read_err; + + if (option_mask32 & OPT_GENERATION) { + if (fgetversion(name, &generation) != 0) + goto read_err; printf("%5lu ", generation); } - if (flags & OPT_PF_LONG) { + + if (option_mask32 & OPT_PF_LONG) { printf("%-28s ", name); print_flags(stdout, fsflags, PFOPT_LONG); - fputc('\n', stdout); + bb_putchar('\n'); } else { print_flags(stdout, fsflags, 0); printf(" %s\n", name); } -} - -static int lsattr_dir_proc(const char *, struct dirent *, void *); -static void lsattr_args(const char *name) -{ - STRUCT_STAT st; - - if (LSTAT(name, &st) == -1) - bb_perror_msg("while trying to stat %s", name); - else { - if (S_ISDIR(st.st_mode) && !(flags & OPT_DIRS_OPT)) - iterate_on_dir(name, lsattr_dir_proc, NULL); - else - list_attributes(name); - } + return; + read_err: + bb_perror_msg("reading %s", name); } -static int lsattr_dir_proc(const char *dir_name, struct dirent *de, - void *private EXT2FS_ATTR((unused))) +static int lsattr_dir_proc(const char *dir_name, struct dirent *de, + void *private) { - STRUCT_STAT st; + struct stat st; char *path; - int i = strlen(dir_name); - - if (i && dir_name[i-1] == '/') - i = asprintf(&path, "%s%s", dir_name, de->d_name); - else - i = asprintf(&path, "%s/%s", dir_name, de->d_name); - if (i == -1) - bb_error_msg_and_die(bb_msg_memory_exhausted); - if (LSTAT(path, &st) == -1) - bb_perror_msg(path); - else { - if (de->d_name[0] != '.' || (flags & OPT_ALL)) { - list_attributes(path); - if (S_ISDIR(st.st_mode) && (flags & OPT_RECUR) && - strcmp(de->d_name, ".") && strcmp(de->d_name, "..")) { - printf("\n%s:\n", path); - iterate_on_dir(path, lsattr_dir_proc, NULL); - printf("\n"); - } + path = concat_path_file(dir_name, de->d_name); + + if (lstat(path, &st) != 0) + bb_perror_msg("stat %s", path); + else if (de->d_name[0] != '.' || (option_mask32 & OPT_ALL)) { + list_attributes(path); + if (S_ISDIR(st.st_mode) && (option_mask32 & OPT_RECUR) + && !DOT_OR_DOTDOT(de->d_name) + ) { + printf("\n%s:\n", path); + iterate_on_dir(path, lsattr_dir_proc, NULL); + bb_putchar('\n'); } } free(path); - return 0; } -int lsattr_main(int argc, char **argv) +static void lsattr_args(const char *name) { - int i; + struct stat st; + + if (lstat(name, &st) == -1) { + bb_perror_msg("stat %s", name); + } else if (S_ISDIR(st.st_mode) && !(option_mask32 & OPT_DIRS_OPT)) { + iterate_on_dir(name, lsattr_dir_proc, NULL); + } else { + list_attributes(name); + } +} - flags = bb_getopt_ulflags(argc, argv, "Radlv"); +int lsattr_main(int argc, char **argv); +int lsattr_main(int argc, char **argv) +{ + getopt32(argv, "Radlv"); + argv += optind; - if (optind > argc - 1) + if (!*argv) lsattr_args("."); - else - for (i = optind; i < argc; i++) - lsattr_args(argv[i]); + else { + while (*argv) + lsattr_args(*argv++); + } return EXIT_SUCCESS; }