strings: implement -t radix
[oweals/busybox.git] / e2fsprogs / lsattr.c
index f317b047ef9c4546df4ef4d9ce8c8fb76fb06e22..d2348b5f741d61be197146f67d04be6fcbb398d5 100644 (file)
@@ -9,16 +9,28 @@
  * This file can be redistributed under the terms of the GNU General
  * Public License
  */
-
-/*
- * History:
- * 93/10/30    - Creation
- * 93/11/13    - Replace stat() calls by lstat() to avoid loops
- * 94/02/27    - Integrated in Ted's distribution
- * 98/12/29    - Display version info only when -V specified (G M Sipe)
- */
-
-#include "busybox.h"
+//config:config LSATTR
+//config:      bool "lsattr"
+//config:      default y
+//config:      select PLATFORM_LINUX
+//config:      help
+//config:        lsattr lists the file attributes on a second extended file system.
+
+//applet:IF_LSATTR(APPLET(lsattr, BB_DIR_BIN, BB_SUID_DROP))
+
+//kbuild:lib-$(CONFIG_LSATTR) += lsattr.o e2fs_lib.o
+
+//usage:#define lsattr_trivial_usage
+//usage:       "[-Radlv] [FILE]..."
+//usage:#define lsattr_full_usage "\n\n"
+//usage:       "List ext2 file attributes\n"
+//usage:     "\n       -R      Recurse"
+//usage:     "\n       -a      Don't hide entries starting with ."
+//usage:     "\n       -d      List directory entries instead of contents"
+//usage:     "\n       -l      List long flag names"
+//usage:     "\n       -v      List version/generation number"
+
+#include "libbb.h"
 #include "e2fs_lib.h"
 
 enum {
@@ -34,21 +46,21 @@ static void list_attributes(const char *name)
        unsigned long fsflags;
        unsigned long generation;
 
-       if (fgetflags(name, &fsflags) == -1)
+       if (fgetflags(name, &fsflags) != 0)
                goto read_err;
 
        if (option_mask32 & OPT_GENERATION) {
-               if (fgetversion(name, &generation) == -1)
+               if (fgetversion(name, &generation) != 0)
                        goto read_err;
                printf("%5lu ", generation);
        }
 
        if (option_mask32 & OPT_PF_LONG) {
                printf("%-28s ", name);
-               print_flags(stdout, fsflags, PFOPT_LONG);
-               puts("");
+               print_e2flags(stdout, fsflags, PFOPT_LONG);
+               bb_putchar('\n');
        } else {
-               print_flags(stdout, fsflags, 0);
+               print_e2flags(stdout, fsflags, 0);
                printf(" %s\n", name);
        }
 
@@ -57,31 +69,29 @@ static void list_attributes(const char *name)
        bb_perror_msg("reading %s", name);
 }
 
-static int lsattr_dir_proc(const char *dir_name, struct dirent *de,
-                          void *private)
+static int FAST_FUNC lsattr_dir_proc(const char *dir_name,
+               struct dirent *de,
+               void *private UNUSED_PARAM)
 {
        struct stat st;
        char *path;
 
        path = concat_path_file(dir_name, de->d_name);
 
-       if (lstat(path, &st) == -1)
+       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)
-                && (de->d_name[0] != '.'
-                    || (de->d_name[1] != '\0' && NOT_LONE_CHAR(de->d_name+1, '.')))
+                && !DOT_OR_DOTDOT(de->d_name)
                ) {
                        printf("\n%s:\n", path);
                        iterate_on_dir(path, lsattr_dir_proc, NULL);
-                       puts("");
+                       bb_putchar('\n');
                }
        }
 
        free(path);
-
        return 0;
 }
 
@@ -98,17 +108,15 @@ static void lsattr_args(const char *name)
        }
 }
 
-int lsattr_main(int argc, char **argv)
+int lsattr_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int lsattr_main(int argc UNUSED_PARAM, char **argv)
 {
-       getopt32(argc, argv, "Radlv");
+       getopt32(argv, "Radlv");
        argv += optind;
 
        if (!*argv)
-               lsattr_args(".");
-       else {
-               while (*argv)
-                       lsattr_args(*argv++);
-       }
+               *--argv = (char*)".";
+       do lsattr_args(*argv++); while (*argv);
 
        return EXIT_SUCCESS;
 }