*: make GNU licensing statement forms more regular
[platform/upstream/busybox.git] / e2fsprogs / lsattr.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * lsattr.c             - List file attributes on an ext2 file system
4  *
5  * Copyright (C) 1993, 1994  Remy Card <card@masi.ibp.fr>
6  *                           Laboratoire MASI, Institut Blaise Pascal
7  *                           Universite Pierre et Marie Curie (Paris VI)
8  *
9  * This file can be redistributed under the terms of the GNU General
10  * Public License
11  */
12
13 /*
14  * History:
15  * 93/10/30     - Creation
16  * 93/11/13     - Replace stat() calls by lstat() to avoid loops
17  * 94/02/27     - Integrated in Ted's distribution
18  * 98/12/29     - Display version info only when -V specified (G M Sipe)
19  */
20
21 #include "libbb.h"
22 #include "e2fs_lib.h"
23
24 enum {
25         OPT_RECUR      = 0x1,
26         OPT_ALL        = 0x2,
27         OPT_DIRS_OPT   = 0x4,
28         OPT_PF_LONG    = 0x8,
29         OPT_GENERATION = 0x10,
30 };
31
32 static void list_attributes(const char *name)
33 {
34         unsigned long fsflags;
35         unsigned long generation;
36
37         if (fgetflags(name, &fsflags) != 0)
38                 goto read_err;
39
40         if (option_mask32 & OPT_GENERATION) {
41                 if (fgetversion(name, &generation) != 0)
42                         goto read_err;
43                 printf("%5lu ", generation);
44         }
45
46         if (option_mask32 & OPT_PF_LONG) {
47                 printf("%-28s ", name);
48                 print_e2flags(stdout, fsflags, PFOPT_LONG);
49                 bb_putchar('\n');
50         } else {
51                 print_e2flags(stdout, fsflags, 0);
52                 printf(" %s\n", name);
53         }
54
55         return;
56  read_err:
57         bb_perror_msg("reading %s", name);
58 }
59
60 static int FAST_FUNC lsattr_dir_proc(const char *dir_name,
61                 struct dirent *de,
62                 void *private UNUSED_PARAM)
63 {
64         struct stat st;
65         char *path;
66
67         path = concat_path_file(dir_name, de->d_name);
68
69         if (lstat(path, &st) != 0)
70                 bb_perror_msg("stat %s", path);
71         else if (de->d_name[0] != '.' || (option_mask32 & OPT_ALL)) {
72                 list_attributes(path);
73                 if (S_ISDIR(st.st_mode) && (option_mask32 & OPT_RECUR)
74                  && !DOT_OR_DOTDOT(de->d_name)
75                 ) {
76                         printf("\n%s:\n", path);
77                         iterate_on_dir(path, lsattr_dir_proc, NULL);
78                         bb_putchar('\n');
79                 }
80         }
81
82         free(path);
83         return 0;
84 }
85
86 static void lsattr_args(const char *name)
87 {
88         struct stat st;
89
90         if (lstat(name, &st) == -1) {
91                 bb_perror_msg("stat %s", name);
92         } else if (S_ISDIR(st.st_mode) && !(option_mask32 & OPT_DIRS_OPT)) {
93                 iterate_on_dir(name, lsattr_dir_proc, NULL);
94         } else {
95                 list_attributes(name);
96         }
97 }
98
99 int lsattr_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
100 int lsattr_main(int argc UNUSED_PARAM, char **argv)
101 {
102         getopt32(argv, "Radlv");
103         argv += optind;
104
105         if (!*argv)
106                 *--argv = (char*)".";
107         do lsattr_args(*argv++); while (*argv);
108
109         return EXIT_SUCCESS;
110 }