X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=misc%2Flsattr.c;h=0d95437622752e39d294626964d336c6e5edbbeb;hb=4ebce13292f54c96f43dcb1bd1d5b8df5dc8749d;hp=3fadeb2b6c4796e9f93e8a1a4c8b79e8dd520d8d;hpb=fff18b4e76d3757a78e5583010bbce3772461f4d;p=tools%2Fe2fsprogs.git diff --git a/misc/lsattr.c b/misc/lsattr.c index 3fadeb2..0d95437 100644 --- a/misc/lsattr.c +++ b/misc/lsattr.c @@ -18,8 +18,8 @@ */ #define _LARGEFILE64_SOURCE -#define _FILE_OFFSET_BITS 64 +#include "config.h" #include #include #ifdef HAVE_ERRNO_H @@ -38,13 +38,19 @@ extern char *optarg; #include #include #include -#include +#include "ext2fs/ext2_fs.h" #include "et/com_err.h" #include "e2p/e2p.h" +#include "support/nls-enable.h" #include "../version.h" -#include "nls-enable.h" + +#ifdef __GNUC__ +#define EXT2FS_ATTR(x) __attribute__(x) +#else +#define EXT2FS_ATTR(x) +#endif static const char * program_name = "lsattr"; @@ -54,31 +60,50 @@ static unsigned pf_options; static int recursive; static int verbose; static int generation_opt; +static int project_opt; + +#ifdef _LFS64_LARGEFILE +#define LSTAT lstat64 +#define STRUCT_STAT struct stat64 +#else +#define LSTAT lstat +#define STRUCT_STAT struct stat +#endif static void usage(void) { - fprintf(stderr, _("Usage: %s [-RVadlv] [files...]\n"), program_name); + fprintf(stderr, _("Usage: %s [-RVadlpv] [files...]\n"), program_name); exit(1); } -static void list_attributes (const char * name) +static int list_attributes (const char * name) { unsigned long flags; unsigned long generation; + unsigned long project; if (fgetflags (name, &flags) == -1) { com_err (program_name, errno, _("While reading flags on %s"), name); - return; + return -1; + } + if (project_opt) { + if (fgetproject(name, &project) == -1) { + com_err (program_name, errno, + _("While reading project on %s"), + name); + return -1; + } + printf ("%5lu ", project); } if (generation_opt) { if (fgetversion (name, &generation) == -1) { com_err (program_name, errno, _("While reading version on %s"), name); - return; + return -1; } - printf ("%5lu ", generation); + printf ("%-10lu ", generation); } if (pf_options & PFOPT_LONG) { printf("%-28s ", name); @@ -88,34 +113,43 @@ static void list_attributes (const char * name) print_flags(stdout, flags, pf_options); printf(" %s\n", name); } + return 0; } static int lsattr_dir_proc (const char *, struct dirent *, void *); -static void lsattr_args (const char * name) +static int lsattr_args (const char * name) { - struct stat st; + STRUCT_STAT st; + int retval = 0; - if (lstat (name, &st) == -1) + if (LSTAT (name, &st) == -1) { com_err (program_name, errno, _("while trying to stat %s"), name); - else { + retval = -1; + } else { if (S_ISDIR(st.st_mode) && !dirs_opt) - iterate_on_dir (name, lsattr_dir_proc, NULL); + retval = iterate_on_dir (name, lsattr_dir_proc, NULL); else - list_attributes (name); + retval = list_attributes (name); } + return retval; } -static int lsattr_dir_proc (const char * dir_name, struct dirent * de, void * private) +static int lsattr_dir_proc (const char * dir_name, struct dirent * de, + void * private EXT2FS_ATTR((unused))) { - struct stat st; + STRUCT_STAT st; char *path; + int dir_len = strlen(dir_name); - path = malloc(strlen (dir_name) + 1 + strlen (de->d_name) + 1); + path = malloc(dir_len + strlen (de->d_name) + 2); - sprintf (path, "%s/%s", dir_name, de->d_name); - if (lstat (path, &st) == -1) + if (dir_len && dir_name[dir_len-1] == '/') + sprintf (path, "%s%s", dir_name, de->d_name); + else + sprintf (path, "%s/%s", dir_name, de->d_name); + if (LSTAT (path, &st) == -1) perror (path); else { if (de->d_name[0] != '.' || all) { @@ -137,15 +171,18 @@ int main (int argc, char ** argv) { int c; int i; + int err, retval = 0; #ifdef ENABLE_NLS setlocale(LC_MESSAGES, ""); + setlocale(LC_CTYPE, ""); bindtextdomain(NLS_CAT_NAME, LOCALEDIR); textdomain(NLS_CAT_NAME); + set_com_err_gettext(gettext); #endif if (argc && *argv) program_name = *argv; - while ((c = getopt (argc, argv, "RVadlv")) != EOF) + while ((c = getopt (argc, argv, "RVadlvp")) != EOF) switch (c) { case 'R': @@ -166,18 +203,25 @@ int main (int argc, char ** argv) case 'v': generation_opt = 1; break; + case 'p': + project_opt = 1; + break; default: usage(); } if (verbose) - fprintf (stderr, _("lsattr %s, %s for EXT2 FS %s, %s\n"), - E2FSPROGS_VERSION, E2FSPROGS_DATE, - EXT2FS_VERSION, EXT2FS_DATE); - if (optind > argc - 1) - lsattr_args ("."); - else - for (i = optind; i < argc; i++) - lsattr_args (argv[i]); - exit(0); + fprintf (stderr, "lsattr %s (%s)\n", + E2FSPROGS_VERSION, E2FSPROGS_DATE); + if (optind > argc - 1) { + if (lsattr_args (".") == -1) + retval = 1; + } else { + for (i = optind; i < argc; i++) { + err = lsattr_args (argv[i]); + if (err) + retval = 1; + } + } + exit(retval); }