Changeset 1770 in MondoRescue for branches/stable/mindi-busybox/e2fsprogs/lsattr.c
- Timestamp:
- Nov 6, 2007, 11:01:53 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/stable/mindi-busybox/e2fsprogs/lsattr.c
r821 r1770 1 /* vi: set sw=4 ts=4: */ 1 2 /* 2 3 * lsattr.c - List file attributes on an ext2 file system … … 18 19 */ 19 20 20 #include <sys/types.h> 21 #include <dirent.h> 22 #include <errno.h> 23 #include <fcntl.h> 24 #include <getopt.h> 25 #include <stdio.h> 26 #include <unistd.h> 27 #include <stdlib.h> 28 #include <string.h> 29 #include <sys/param.h> 30 #include <sys/stat.h> 21 #include "libbb.h" 22 #include "e2fs_lib.h" 31 23 32 #include "ext2fs/ext2_fs.h" 33 #include "e2fsbb.h" 34 #include "e2p/e2p.h" 35 36 #define OPT_RECUR 1 37 #define OPT_ALL 2 38 #define OPT_DIRS_OPT 4 39 #define OPT_PF_LONG 8 40 #define OPT_GENERATION 16 41 static int flags; 42 43 #ifdef CONFIG_LFS 44 # define LSTAT lstat64 45 # define STRUCT_STAT struct stat64 46 #else 47 # define LSTAT lstat 48 # define STRUCT_STAT struct stat 49 #endif 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 }; 50 31 51 32 static void list_attributes(const char *name) … … 54 35 unsigned long generation; 55 36 56 if (fgetflags(name, &fsflags) == -1)37 if (fgetflags(name, &fsflags) != 0) 57 38 goto read_err; 58 if (flags & OPT_GENERATION) { 59 if (fgetversion(name, &generation) == -1) 39 40 if (option_mask32 & OPT_GENERATION) { 41 if (fgetversion(name, &generation) != 0) 60 42 goto read_err; 61 43 printf("%5lu ", generation); 62 44 } 63 45 64 if ( flags& OPT_PF_LONG) {46 if (option_mask32 & OPT_PF_LONG) { 65 47 printf("%-28s ", name); 66 48 print_flags(stdout, fsflags, PFOPT_LONG); 67 p rintf("\n");49 puts(""); 68 50 } else { 69 51 print_flags(stdout, fsflags, 0); … … 72 54 73 55 return; 74 read_err:56 read_err: 75 57 bb_perror_msg("reading %s", name); 76 }77 78 static int lsattr_dir_proc(const char *, struct dirent *, void *);79 80 static void lsattr_args(const char *name)81 {82 STRUCT_STAT st;83 84 if (LSTAT(name, &st) == -1) {85 bb_perror_msg("stating %s", name);86 } else {87 if (S_ISDIR(st.st_mode) && !(flags & OPT_DIRS_OPT))88 iterate_on_dir(name, lsattr_dir_proc, NULL);89 else90 list_attributes(name);91 }92 58 } 93 59 … … 95 61 void *private) 96 62 { 97 STRUCT_STATst;63 struct stat st; 98 64 char *path; 99 65 100 66 path = concat_path_file(dir_name, de->d_name); 101 67 102 if (LSTAT(path, &st) == -1) 103 bb_perror_msg(path); 104 else { 105 if (de->d_name[0] != '.' || (flags & OPT_ALL)) { 106 list_attributes(path); 107 if (S_ISDIR(st.st_mode) && (flags & OPT_RECUR) && 108 (de->d_name[0] != '.' && (de->d_name[1] != '\0' || 109 (de->d_name[1] != '.' && de->d_name[2] != '\0')))) { 110 printf("\n%s:\n", path); 111 iterate_on_dir(path, lsattr_dir_proc, NULL); 112 printf("\n"); 113 } 68 if (lstat(path, &st) != 0) 69 bb_perror_msg("stat %s", path); 70 else if (de->d_name[0] != '.' || (option_mask32 & OPT_ALL)) { 71 list_attributes(path); 72 if (S_ISDIR(st.st_mode) && (option_mask32 & OPT_RECUR) 73 && !DOT_OR_DOTDOT(de->d_name) 74 ) { 75 printf("\n%s:\n", path); 76 iterate_on_dir(path, lsattr_dir_proc, NULL); 77 puts(""); 114 78 } 115 79 } 116 80 117 81 free(path); 118 119 82 return 0; 120 83 } 121 84 85 static void lsattr_args(const char *name) 86 { 87 struct stat st; 88 89 if (lstat(name, &st) == -1) { 90 bb_perror_msg("stat %s", name); 91 } else if (S_ISDIR(st.st_mode) && !(option_mask32 & OPT_DIRS_OPT)) { 92 iterate_on_dir(name, lsattr_dir_proc, NULL); 93 } else { 94 list_attributes(name); 95 } 96 } 97 98 int lsattr_main(int argc, char **argv); 122 99 int lsattr_main(int argc, char **argv) 123 100 { 124 int i; 101 getopt32(argv, "Radlv"); 102 argv += optind; 125 103 126 flags = bb_getopt_ulflags(argc, argv, "Radlv"); 127 128 if (optind > argc - 1) 104 if (!*argv) 129 105 lsattr_args("."); 130 else 131 for (i = optind; i < argc; i++) 132 lsattr_args(argv[i]); 106 else { 107 while (*argv) 108 lsattr_args(*argv++); 109 } 133 110 134 111 return EXIT_SUCCESS;
Note:
See TracChangeset
for help on using the changeset viewer.