]>
git.ipfire.org Git - thirdparty/e2fsprogs.git/blob - misc/lsattr.c
2 * lsattr.c - List file attributes on an ext2 file system
4 * Copyright (C) 1993, 1994 Remy Card <card@masi.ibp.fr>
5 * Laboratoire MASI, Institut Blaise Pascal
6 * Universite Pierre et Marie Curie (Paris VI)
8 * This file can be redistributed under the terms of the GNU General
15 * 93/11/13 - Replace stat() calls by lstat() to avoid loops
16 * 94/02/27 - Integrated in Ted's distribution
17 * 98/12/29 - Display version info only when -V specified (G M Sipe)
20 #define _LARGEFILE64_SOURCE
22 #include <sys/types.h>
38 #include <sys/param.h>
41 #include "ext2fs/ext2_fs.h"
42 #include "et/com_err.h"
45 #include "../version.h"
46 #include "nls-enable.h"
49 #define EXT2FS_ATTR(x) __attribute__(x)
51 #define EXT2FS_ATTR(x)
54 static const char * program_name
= "lsattr";
58 static unsigned pf_options
;
61 static int generation_opt
;
63 #ifdef _LFS64_LARGEFILE
65 #define STRUCT_STAT struct stat64
68 #define STRUCT_STAT struct stat
71 static void usage(void)
73 fprintf(stderr
, _("Usage: %s [-RVadlv] [files...]\n"), program_name
);
77 static int list_attributes (const char * name
)
80 unsigned long generation
;
82 if (fgetflags (name
, &flags
) == -1) {
83 com_err (program_name
, errno
, _("While reading flags on %s"),
88 if (fgetversion (name
, &generation
) == -1) {
89 com_err (program_name
, errno
,
90 _("While reading version on %s"),
94 printf ("%5lu ", generation
);
96 if (pf_options
& PFOPT_LONG
) {
97 printf("%-28s ", name
);
98 print_flags(stdout
, flags
, pf_options
);
101 print_flags(stdout
, flags
, pf_options
);
102 printf(" %s\n", name
);
107 static int lsattr_dir_proc (const char *, struct dirent
*, void *);
109 static int lsattr_args (const char * name
)
114 if (LSTAT (name
, &st
) == -1) {
115 com_err (program_name
, errno
, _("while trying to stat %s"),
119 if (S_ISDIR(st
.st_mode
) && !dirs_opt
)
120 retval
= iterate_on_dir (name
, lsattr_dir_proc
, NULL
);
122 retval
= list_attributes (name
);
127 static int lsattr_dir_proc (const char * dir_name
, struct dirent
* de
,
128 void * private EXT2FS_ATTR((unused
)))
132 int dir_len
= strlen(dir_name
);
134 path
= malloc(dir_len
+ strlen (de
->d_name
) + 2);
136 if (dir_len
&& dir_name
[dir_len
-1] == '/')
137 sprintf (path
, "%s%s", dir_name
, de
->d_name
);
139 sprintf (path
, "%s/%s", dir_name
, de
->d_name
);
140 if (LSTAT (path
, &st
) == -1)
143 if (de
->d_name
[0] != '.' || all
) {
144 list_attributes (path
);
145 if (S_ISDIR(st
.st_mode
) && recursive
&&
146 strcmp(de
->d_name
, ".") &&
147 strcmp(de
->d_name
, "..")) {
148 printf ("\n%s:\n", path
);
149 iterate_on_dir (path
, lsattr_dir_proc
, NULL
);
158 int main (int argc
, char ** argv
)
165 setlocale(LC_MESSAGES
, "");
166 setlocale(LC_CTYPE
, "");
167 bindtextdomain(NLS_CAT_NAME
, LOCALEDIR
);
168 textdomain(NLS_CAT_NAME
);
171 program_name
= *argv
;
172 while ((c
= getopt (argc
, argv
, "RVadlv")) != EOF
)
188 pf_options
= PFOPT_LONG
;
198 fprintf (stderr
, "lsattr %s (%s)\n",
199 E2FSPROGS_VERSION
, E2FSPROGS_DATE
);
200 if (optind
> argc
- 1) {
201 if (lsattr_args (".") == -1)
204 for (i
= optind
; i
< argc
; i
++) {
205 err
= lsattr_args (argv
[i
]);