aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configs/mingw32_defconfig6
-rw-r--r--configs/mingw64_defconfig6
-rw-r--r--e2fsprogs/chattr.c46
-rw-r--r--e2fsprogs/e2fs_lib.c67
-rw-r--r--e2fsprogs/e2fs_lib.h5
-rw-r--r--e2fsprogs/lsattr.c15
6 files changed, 138 insertions, 7 deletions
diff --git a/configs/mingw32_defconfig b/configs/mingw32_defconfig
index b3dfc0033..379d8265b 100644
--- a/configs/mingw32_defconfig
+++ b/configs/mingw32_defconfig
@@ -1,7 +1,7 @@
1# 1#
2# Automatically generated make config: don't edit 2# Automatically generated make config: don't edit
3# Busybox version: 1.32.0.git 3# Busybox version: 1.32.0.git
4# Sun Jun 14 09:30:06 2020 4# Thu Jul 9 08:46:09 2020
5# 5#
6CONFIG_HAVE_DOT_CONFIG=y 6CONFIG_HAVE_DOT_CONFIG=y
7# CONFIG_PLATFORM_POSIX is not set 7# CONFIG_PLATFORM_POSIX is not set
@@ -562,9 +562,9 @@ CONFIG_SUW32=y
562# 562#
563# Linux Ext2 FS Progs 563# Linux Ext2 FS Progs
564# 564#
565# CONFIG_CHATTR is not set 565CONFIG_CHATTR=y
566# CONFIG_FSCK is not set 566# CONFIG_FSCK is not set
567# CONFIG_LSATTR is not set 567CONFIG_LSATTR=y
568# CONFIG_TUNE2FS is not set 568# CONFIG_TUNE2FS is not set
569 569
570# 570#
diff --git a/configs/mingw64_defconfig b/configs/mingw64_defconfig
index 2410d476d..25ed022e4 100644
--- a/configs/mingw64_defconfig
+++ b/configs/mingw64_defconfig
@@ -1,7 +1,7 @@
1# 1#
2# Automatically generated make config: don't edit 2# Automatically generated make config: don't edit
3# Busybox version: 1.32.0.git 3# Busybox version: 1.32.0.git
4# Sun Jun 14 09:30:06 2020 4# Thu Jul 9 08:46:09 2020
5# 5#
6CONFIG_HAVE_DOT_CONFIG=y 6CONFIG_HAVE_DOT_CONFIG=y
7# CONFIG_PLATFORM_POSIX is not set 7# CONFIG_PLATFORM_POSIX is not set
@@ -562,9 +562,9 @@ CONFIG_SUW32=y
562# 562#
563# Linux Ext2 FS Progs 563# Linux Ext2 FS Progs
564# 564#
565# CONFIG_CHATTR is not set 565CONFIG_CHATTR=y
566# CONFIG_FSCK is not set 566# CONFIG_FSCK is not set
567# CONFIG_LSATTR is not set 567CONFIG_LSATTR=y
568# CONFIG_TUNE2FS is not set 568# CONFIG_TUNE2FS is not set
569 569
570# 570#
diff --git a/e2fsprogs/chattr.c b/e2fsprogs/chattr.c
index c37469021..e1a798727 100644
--- a/e2fsprogs/chattr.c
+++ b/e2fsprogs/chattr.c
@@ -20,13 +20,26 @@
20//kbuild:lib-$(CONFIG_CHATTR) += chattr.o e2fs_lib.o 20//kbuild:lib-$(CONFIG_CHATTR) += chattr.o e2fs_lib.o
21 21
22//usage:#define chattr_trivial_usage 22//usage:#define chattr_trivial_usage
23//usage: IF_NOT_PLATFORM_MINGW32(
23//usage: "[-R] [-v VERSION] [-+=AacDdijsStTu] FILE..." 24//usage: "[-R] [-v VERSION] [-+=AacDdijsStTu] FILE..."
25//usage: )
26//usage: IF_PLATFORM_MINGW32(
27//usage: "[-R] [-+rhsatn] FILE..."
28//usage: )
24//usage:#define chattr_full_usage "\n\n" 29//usage:#define chattr_full_usage "\n\n"
30//usage: IF_NOT_PLATFORM_MINGW32(
25//usage: "Change ext2 file attributes\n" 31//usage: "Change ext2 file attributes\n"
32//usage: )
33//usage: IF_PLATFORM_MINGW32(
34//usage: "Change file attributes\n"
35//usage: )
26//usage: "\n -R Recurse" 36//usage: "\n -R Recurse"
37//usage: IF_NOT_PLATFORM_MINGW32(
27//usage: "\n -v VER Set version/generation number" 38//usage: "\n -v VER Set version/generation number"
39//usage: )
28//-V, -f accepted but ignored 40//-V, -f accepted but ignored
29//usage: "\nModifiers:" 41//usage: "\nModifiers:"
42//usage: IF_NOT_PLATFORM_MINGW32(
30//usage: "\n -,+,= Remove/add/set attributes" 43//usage: "\n -,+,= Remove/add/set attributes"
31//usage: "\nAttributes:" 44//usage: "\nAttributes:"
32//usage: "\n A Don't track atime" 45//usage: "\n A Don't track atime"
@@ -40,6 +53,17 @@
40//usage: "\n S Write synchronously" 53//usage: "\n S Write synchronously"
41//usage: "\n t Disable tail-merging of partial blocks with other files" 54//usage: "\n t Disable tail-merging of partial blocks with other files"
42//usage: "\n u Allow file to be undeleted" 55//usage: "\n u Allow file to be undeleted"
56//usage: )
57//usage: IF_PLATFORM_MINGW32(
58//usage: "\n -,+ Remove/add attributes"
59//usage: "\nAttributes:"
60//usage: "\n r Read only"
61//usage: "\n h Hidden"
62//usage: "\n s System"
63//usage: "\n a Archive"
64//usage: "\n t Temporary"
65//usage: "\n n Not indexed"
66//usage: )
43 67
44#include "libbb.h" 68#include "libbb.h"
45#include "e2fs_lib.h" 69#include "e2fs_lib.h"
@@ -50,7 +74,9 @@
50#define OPT_SET_VER 8 74#define OPT_SET_VER 8
51 75
52struct globals { 76struct globals {
77#if !ENABLE_PLATFORM_MINGW32
53 unsigned long version; 78 unsigned long version;
79#endif
54 unsigned long af; 80 unsigned long af;
55 unsigned long rf; 81 unsigned long rf;
56 int flags; 82 int flags;
@@ -75,11 +101,17 @@ static char** decode_arg(char **argv, struct globals *gp)
75 if (opt == '-') { 101 if (opt == '-') {
76 gp->flags |= OPT_REM; 102 gp->flags |= OPT_REM;
77 fl = &gp->rf; 103 fl = &gp->rf;
104#if ENABLE_PLATFORM_MINGW32
105 } else { /* if (opt == '+') */
106 gp->flags |= OPT_ADD;
107 }
108#else
78 } else if (opt == '+') { 109 } else if (opt == '+') {
79 gp->flags |= OPT_ADD; 110 gp->flags |= OPT_ADD;
80 } else { /* if (opt == '=') */ 111 } else { /* if (opt == '=') */
81 gp->flags |= OPT_SET; 112 gp->flags |= OPT_SET;
82 } 113 }
114#endif
83 115
84 while (*++arg) { 116 while (*++arg) {
85 if (opt == '-') { 117 if (opt == '-') {
@@ -92,6 +124,7 @@ static char** decode_arg(char **argv, struct globals *gp)
92 gp->recursive = 1; 124 gp->recursive = 1;
93 continue; 125 continue;
94 } 126 }
127#if !ENABLE_PLATFORM_MINGW32
95 if (*arg == 'V') { 128 if (*arg == 'V') {
96 /*"verbose and print program version" (nop for now) */; 129 /*"verbose and print program version" (nop for now) */;
97 continue; 130 continue;
@@ -108,6 +141,7 @@ static char** decode_arg(char **argv, struct globals *gp)
108 continue; 141 continue;
109 } 142 }
110//TODO: "-p PROJECT_NUM" ? 143//TODO: "-p PROJECT_NUM" ?
144#endif
111 /* not a known option, try as an attribute */ 145 /* not a known option, try as an attribute */
112 } 146 }
113 *fl |= get_flag(*arg); 147 *fl |= get_flag(*arg);
@@ -148,9 +182,11 @@ static void change_attributes(const char *name, struct globals *gp)
148 if (!S_ISREG(st.st_mode) && !S_ISLNK(st.st_mode) && !S_ISDIR(st.st_mode)) 182 if (!S_ISREG(st.st_mode) && !S_ISLNK(st.st_mode) && !S_ISDIR(st.st_mode))
149 return; 183 return;
150 184
185#if !ENABLE_PLATFORM_MINGW32
151 if (gp->flags & OPT_SET_VER) 186 if (gp->flags & OPT_SET_VER)
152 if (fsetversion(name, gp->version) != 0) 187 if (fsetversion(name, gp->version) != 0)
153 bb_perror_msg("setting version on %s", name); 188 bb_perror_msg("setting version on %s", name);
189#endif
154 190
155 if (gp->flags & OPT_SET) { 191 if (gp->flags & OPT_SET) {
156 fsflags = gp->af; 192 fsflags = gp->af;
@@ -163,9 +199,11 @@ static void change_attributes(const char *name, struct globals *gp)
163 fsflags &= ~gp->rf; 199 fsflags &= ~gp->rf;
164 /*if (gp->flags & OPT_ADD) - not needed, af is zero otherwise */ 200 /*if (gp->flags & OPT_ADD) - not needed, af is zero otherwise */
165 fsflags |= gp->af; 201 fsflags |= gp->af;
202#if !ENABLE_PLATFORM_MINGW32
166// What is this? And why it's not done for SET case? 203// What is this? And why it's not done for SET case?
167 if (!S_ISDIR(st.st_mode)) 204 if (!S_ISDIR(st.st_mode))
168 fsflags &= ~EXT2_DIRSYNC_FL; 205 fsflags &= ~EXT2_DIRSYNC_FL;
206#endif
169 } 207 }
170 if (fsetflags(name, fsflags) != 0) 208 if (fsetflags(name, fsflags) != 0)
171 bb_perror_msg("setting flags on %s", name); 209 bb_perror_msg("setting flags on %s", name);
@@ -187,7 +225,11 @@ int chattr_main(int argc UNUSED_PARAM, char **argv)
187 char *arg = *++argv; 225 char *arg = *++argv;
188 if (!arg) 226 if (!arg)
189 bb_show_usage(); 227 bb_show_usage();
228#if ENABLE_PLATFORM_MINGW32
229 if (arg[0] != '-' && arg[0] != '+')
230#else
190 if (arg[0] != '-' && arg[0] != '+' && arg[0] != '=') 231 if (arg[0] != '-' && arg[0] != '+' && arg[0] != '=')
232#endif
191 break; 233 break;
192 234
193 argv = decode_arg(argv, &g); 235 argv = decode_arg(argv, &g);
@@ -200,7 +242,11 @@ int chattr_main(int argc UNUSED_PARAM, char **argv)
200 if (g.rf & g.af) 242 if (g.rf & g.af)
201 bb_simple_error_msg_and_die("can't set and unset a flag"); 243 bb_simple_error_msg_and_die("can't set and unset a flag");
202 if (!g.flags) 244 if (!g.flags)
245#if ENABLE_PLATFORM_MINGW32
246 bb_simple_error_msg_and_die("must use - or +");
247#else
203 bb_simple_error_msg_and_die("must use '-v', =, - or +"); 248 bb_simple_error_msg_and_die("must use '-v', =, - or +");
249#endif
204 250
205 /* now run chattr on all the files passed to us */ 251 /* now run chattr on all the files passed to us */
206 do change_attributes(*argv, &g); while (*++argv); 252 do change_attributes(*argv, &g); while (*++argv);
diff --git a/e2fsprogs/e2fs_lib.c b/e2fsprogs/e2fs_lib.c
index 6ce655be3..3b776bc97 100644
--- a/e2fsprogs/e2fs_lib.c
+++ b/e2fsprogs/e2fs_lib.c
@@ -8,6 +8,7 @@
8#include "libbb.h" 8#include "libbb.h"
9#include "e2fs_lib.h" 9#include "e2fs_lib.h"
10 10
11#if !ENABLE_PLATFORM_MINGW32
11#define HAVE_EXT2_IOCTLS 1 12#define HAVE_EXT2_IOCTLS 1
12 13
13#if INT_MAX == LONG_MAX 14#if INT_MAX == LONG_MAX
@@ -24,6 +25,7 @@ static void close_silently(int fd)
24 close(fd); 25 close(fd);
25 errno = e; 26 errno = e;
26} 27}
28#endif
27 29
28 30
29/* Iterate a function on each entry of a directory */ 31/* Iterate a function on each entry of a directory */
@@ -46,6 +48,7 @@ int iterate_on_dir(const char *dir_name,
46} 48}
47 49
48 50
51#if !ENABLE_PLATFORM_MINGW32
49/* Get/set a file version on an ext2 file system */ 52/* Get/set a file version on an ext2 file system */
50int fgetsetversion(const char *name, unsigned long *get_version, unsigned long set_version) 53int fgetsetversion(const char *name, unsigned long *get_version, unsigned long set_version)
51{ 54{
@@ -81,7 +84,6 @@ int fgetsetversion(const char *name, unsigned long *get_version, unsigned long s
81#endif /* ! HAVE_EXT2_IOCTLS */ 84#endif /* ! HAVE_EXT2_IOCTLS */
82} 85}
83 86
84
85/* Get/set a file flags on an ext2 file system */ 87/* Get/set a file flags on an ext2 file system */
86int fgetsetflags(const char *name, unsigned long *get_flags, unsigned long set_flags) 88int fgetsetflags(const char *name, unsigned long *get_flags, unsigned long set_flags)
87{ 89{
@@ -124,8 +126,38 @@ int fgetsetflags(const char *name, unsigned long *get_flags, unsigned long set_f
124 errno = EOPNOTSUPP; 126 errno = EOPNOTSUPP;
125 return -1; 127 return -1;
126} 128}
129#else /* ENABLE_PLATFORM_MINGW32 */
130/* Only certain attributes can be set using SetFileAttributes() */
131#define CHATTR_MASK (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN | \
132 FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_ARCHIVE | \
133 FILE_ATTRIBUTE_TEMPORARY | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED | \
134 FILE_ATTRIBUTE_OFFLINE)
127 135
136/* Get/set file attributes on a Windows file system */
137int fgetsetflags(const char *name, unsigned long *get_flags, unsigned long set_flags)
138{
139 struct stat buf;
140
141 if (stat(name, &buf) == 0 /* stat is ok */
142 && !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)
143 ) {
144 errno = EOPNOTSUPP;
145 return -1;
146 }
128 147
148 if (get_flags) {
149 *get_flags = (unsigned long)buf.st_attr;
150 }
151 else if (!SetFileAttributes(name, set_flags & CHATTR_MASK)) {
152 errno = err_win_to_posix();
153 return -1;
154 }
155 return 0;
156}
157#endif
158
159
160#if !ENABLE_PLATFORM_MINGW32
129/* Print file attributes on an ext2 file system */ 161/* Print file attributes on an ext2 file system */
130const uint32_t e2attr_flags_value[] = { 162const uint32_t e2attr_flags_value[] = {
131#ifdef ENABLE_COMPRESSION 163#ifdef ENABLE_COMPRESSION
@@ -177,6 +209,39 @@ static const char e2attr_flags_lname[] ALIGN1 =
177 "No_Tailmerging" "\0" 209 "No_Tailmerging" "\0"
178 "Top_of_Directory_Hierarchies" "\0" 210 "Top_of_Directory_Hierarchies" "\0"
179 /* Another trailing NUL is added by compiler */; 211 /* Another trailing NUL is added by compiler */;
212#else /* ENABLE_PLATFORM_MINGW32 */
213/* Print file attributes on a Windows file system */
214const uint32_t e2attr_flags_value[] = {
215 FILE_ATTRIBUTE_REPARSE_POINT,
216 FILE_ATTRIBUTE_OFFLINE,
217 FILE_ATTRIBUTE_ENCRYPTED,
218 FILE_ATTRIBUTE_COMPRESSED,
219 FILE_ATTRIBUTE_SPARSE_FILE,
220 FILE_ATTRIBUTE_READONLY,
221 FILE_ATTRIBUTE_HIDDEN,
222 FILE_ATTRIBUTE_SYSTEM,
223 FILE_ATTRIBUTE_ARCHIVE,
224 FILE_ATTRIBUTE_TEMPORARY,
225 FILE_ATTRIBUTE_NOT_CONTENT_INDEXED,
226};
227
228const char e2attr_flags_sname[] ALIGN1 =
229 "roecSrhsatn";
230
231static const char e2attr_flags_lname[] ALIGN1 =
232 "Reparse" "\0"
233 "Offline" "\0"
234 "Encrypted" "\0"
235 "Compressed" "\0"
236 "Sparse" "\0"
237 "Readonly" "\0"
238 "Hidden" "\0"
239 "System" "\0"
240 "Archive" "\0"
241 "Temporary" "\0"
242 "Notindexed" "\0"
243 /* Another trailing NUL is added by compiler */;
244#endif
180 245
181void print_e2flags(FILE *f, unsigned long flags, unsigned options) 246void print_e2flags(FILE *f, unsigned long flags, unsigned options)
182{ 247{
diff --git a/e2fsprogs/e2fs_lib.h b/e2fsprogs/e2fs_lib.h
index ae28c353b..4a4d4cc27 100644
--- a/e2fsprogs/e2fs_lib.h
+++ b/e2fsprogs/e2fs_lib.h
@@ -36,6 +36,7 @@ extern const char e2attr_flags_sname[];
36 36
37/* If you plan to ENABLE_COMPRESSION, see e2fs_lib.c and chattr.c - */ 37/* If you plan to ENABLE_COMPRESSION, see e2fs_lib.c and chattr.c - */
38/* make sure that chattr doesn't accept bad options! */ 38/* make sure that chattr doesn't accept bad options! */
39#if !ENABLE_PLATFORM_MINGW32
39#ifdef ENABLE_COMPRESSION 40#ifdef ENABLE_COMPRESSION
40#define e2attr_flags_value_chattr (&e2attr_flags_value[5]) 41#define e2attr_flags_value_chattr (&e2attr_flags_value[5])
41#define e2attr_flags_sname_chattr (&e2attr_flags_sname[5]) 42#define e2attr_flags_sname_chattr (&e2attr_flags_sname[5])
@@ -43,5 +44,9 @@ extern const char e2attr_flags_sname[];
43#define e2attr_flags_value_chattr (&e2attr_flags_value[1]) 44#define e2attr_flags_value_chattr (&e2attr_flags_value[1])
44#define e2attr_flags_sname_chattr (&e2attr_flags_sname[1]) 45#define e2attr_flags_sname_chattr (&e2attr_flags_sname[1])
45#endif 46#endif
47#else
48#define e2attr_flags_value_chattr (&e2attr_flags_value[5])
49#define e2attr_flags_sname_chattr (&e2attr_flags_sname[5])
50#endif
46 51
47POP_SAVED_FUNCTION_VISIBILITY 52POP_SAVED_FUNCTION_VISIBILITY
diff --git a/e2fsprogs/lsattr.c b/e2fsprogs/lsattr.c
index be1488b79..b36dd47a5 100644
--- a/e2fsprogs/lsattr.c
+++ b/e2fsprogs/lsattr.c
@@ -22,14 +22,21 @@
22//kbuild:lib-$(CONFIG_LSATTR) += lsattr.o e2fs_lib.o 22//kbuild:lib-$(CONFIG_LSATTR) += lsattr.o e2fs_lib.o
23 23
24//usage:#define lsattr_trivial_usage 24//usage:#define lsattr_trivial_usage
25//usage: IF_NOT_PLATFORM_MINGW32(
25//usage: "[-Radlv] [FILE]..." 26//usage: "[-Radlv] [FILE]..."
27//usage: )
28//usage: IF_PLATFORM_MINGW32(
29//usage: "[-Radl] [FILE]..."
30//usage: )
26//usage:#define lsattr_full_usage "\n\n" 31//usage:#define lsattr_full_usage "\n\n"
27//usage: "List ext2 file attributes\n" 32//usage: "List ext2 file attributes\n"
28//usage: "\n -R Recurse" 33//usage: "\n -R Recurse"
29//usage: "\n -a Don't hide entries starting with ." 34//usage: "\n -a Don't hide entries starting with ."
30//usage: "\n -d List directory entries instead of contents" 35//usage: "\n -d List directory entries instead of contents"
31//usage: "\n -l List long flag names" 36//usage: "\n -l List long flag names"
37//usage: IF_NOT_PLATFORM_MINGW32(
32//usage: "\n -v List version/generation number" 38//usage: "\n -v List version/generation number"
39//usage: )
33 40
34#include "libbb.h" 41#include "libbb.h"
35#include "e2fs_lib.h" 42#include "e2fs_lib.h"
@@ -45,16 +52,20 @@ enum {
45static void list_attributes(const char *name) 52static void list_attributes(const char *name)
46{ 53{
47 unsigned long fsflags; 54 unsigned long fsflags;
55#if !ENABLE_PLATFORM_MINGW32
48 unsigned long generation; 56 unsigned long generation;
57#endif
49 58
50 if (fgetflags(name, &fsflags) != 0) 59 if (fgetflags(name, &fsflags) != 0)
51 goto read_err; 60 goto read_err;
52 61
62#if !ENABLE_PLATFORM_MINGW32
53 if (option_mask32 & OPT_GENERATION) { 63 if (option_mask32 & OPT_GENERATION) {
54 if (fgetversion(name, &generation) != 0) 64 if (fgetversion(name, &generation) != 0)
55 goto read_err; 65 goto read_err;
56 printf("%5lu ", generation); 66 printf("%5lu ", generation);
57 } 67 }
68#endif
58 69
59 if (option_mask32 & OPT_PF_LONG) { 70 if (option_mask32 & OPT_PF_LONG) {
60 printf("%-28s ", name); 71 printf("%-28s ", name);
@@ -112,7 +123,11 @@ static void lsattr_args(const char *name)
112int lsattr_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 123int lsattr_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
113int lsattr_main(int argc UNUSED_PARAM, char **argv) 124int lsattr_main(int argc UNUSED_PARAM, char **argv)
114{ 125{
126#if ENABLE_PLATFORM_MINGW32
127 getopt32(argv, "Radl");
128#else
115 getopt32(argv, "Radlv"); 129 getopt32(argv, "Radlv");
130#endif
116 argv += optind; 131 argv += optind;
117 132
118 if (!*argv) 133 if (!*argv)