aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2022-05-19 12:34:34 +0100
committerRon Yorston <rmy@pobox.com>2022-05-19 15:43:23 +0100
commit6ba1bb6d0245ecfca39224a44e2b3af3b2fef3d3 (patch)
treede44a134c030c9d1ebb342ab6ae066184cb90b58
parent342f35e6c8ad13dad931af7858f64c8a7f63d08f (diff)
downloadbusybox-w32-6ba1bb6d0245ecfca39224a44e2b3af3b2fef3d3.tar.gz
busybox-w32-6ba1bb6d0245ecfca39224a44e2b3af3b2fef3d3.tar.bz2
busybox-w32-6ba1bb6d0245ecfca39224a44e2b3af3b2fef3d3.zip
chattr,lsattr: code shrink
Drop fgetsetflags() and move its functionality into chattr and lsattr. Raw file attributes are available from struct stat. In chattr don't compile code related to the unused (on Windows) OPT_SET option.
-rw-r--r--e2fsprogs/chattr.c26
-rw-r--r--e2fsprogs/e2fs_lib.c30
-rw-r--r--e2fsprogs/e2fs_lib.h8
-rw-r--r--e2fsprogs/lsattr.c7
4 files changed, 20 insertions, 51 deletions
diff --git a/e2fsprogs/chattr.c b/e2fsprogs/chattr.c
index c1e90d13f..e35b9d223 100644
--- a/e2fsprogs/chattr.c
+++ b/e2fsprogs/chattr.c
@@ -190,8 +190,8 @@ static int FAST_FUNC chattr_dir_proc(const char *dir_name, struct dirent *de, vo
190 190
191static void change_attributes(const char *name, struct globals *gp) 191static void change_attributes(const char *name, struct globals *gp)
192{ 192{
193 unsigned fsflags;
194#if !ENABLE_PLATFORM_MINGW32 193#if !ENABLE_PLATFORM_MINGW32
194 unsigned fsflags;
195 int fd; 195 int fd;
196#endif 196#endif
197 struct stat st; 197 struct stat st;
@@ -261,22 +261,14 @@ static void change_attributes(const char *name, struct globals *gp)
261 close(fd); 261 close(fd);
262 } 262 }
263#else /* ENABLE_PLATFORM_MINGW32 */ 263#else /* ENABLE_PLATFORM_MINGW32 */
264 if (gp->flags & OPT_SET) { 264 /*if (gp->flags & OPT_REM) - not needed, rf is zero otherwise */
265 fsflags = gp->af; 265 st.st_attr &= ~gp->rf;
266 } else { 266 /*if (gp->flags & OPT_ADD) - not needed, af is zero otherwise */
267 if (fgetflags(name, &fsflags) != 0) { 267 st.st_attr |= gp->af;
268 bb_perror_msg("reading flags on %s", name); 268 if (!SetFileAttributes(name, st.st_attr & CHATTR_MASK)) {
269 goto skip_setflags; 269 errno = err_win_to_posix();
270 }
271 /*if (gp->flags & OPT_REM) - not needed, rf is zero otherwise */
272 fsflags &= ~gp->rf;
273 /*if (gp->flags & OPT_ADD) - not needed, af is zero otherwise */
274 fsflags |= gp->af;
275 }
276 if (fsetflags(name, fsflags) != 0)
277 bb_perror_msg("setting flags on %s", name); 270 bb_perror_msg("setting flags on %s", name);
278 271 }
279 skip_setflags:
280#endif 272#endif
281 273
282 if (gp->recursive && S_ISDIR(st.st_mode)) 274 if (gp->recursive && S_ISDIR(st.st_mode))
@@ -307,8 +299,10 @@ int chattr_main(int argc UNUSED_PARAM, char **argv)
307 /* note: on loop exit, remaining argv[] is never empty */ 299 /* note: on loop exit, remaining argv[] is never empty */
308 300
309 /* run sanity checks on all the arguments given us */ 301 /* run sanity checks on all the arguments given us */
302#if !ENABLE_PLATFORM_MINGW32
310 if ((g.flags & OPT_SET) && (g.flags & (OPT_ADD|OPT_REM))) 303 if ((g.flags & OPT_SET) && (g.flags & (OPT_ADD|OPT_REM)))
311 bb_simple_error_msg_and_die("= is incompatible with - and +"); 304 bb_simple_error_msg_and_die("= is incompatible with - and +");
305#endif
312 if (g.rf & g.af) 306 if (g.rf & g.af)
313 bb_simple_error_msg_and_die("can't set and unset a flag"); 307 bb_simple_error_msg_and_die("can't set and unset a flag");
314 if (!g.flags) 308 if (!g.flags)
diff --git a/e2fsprogs/e2fs_lib.c b/e2fsprogs/e2fs_lib.c
index 48c3b68b5..e40702e78 100644
--- a/e2fsprogs/e2fs_lib.c
+++ b/e2fsprogs/e2fs_lib.c
@@ -8,36 +8,6 @@
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
12/* Only certain attributes can be set using SetFileAttributes() */
13#define CHATTR_MASK (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN | \
14 FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_ARCHIVE | \
15 FILE_ATTRIBUTE_TEMPORARY | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED | \
16 FILE_ATTRIBUTE_OFFLINE)
17
18/* Get/set file attributes on a Windows file system */
19int fgetsetflags(const char *name, unsigned *get_flags, unsigned set_flags)
20{
21 struct stat buf;
22
23 if (stat(name, &buf) == 0 /* stat is ok */
24 && !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)
25 ) {
26 errno = EOPNOTSUPP;
27 return -1;
28 }
29
30 if (get_flags) {
31 *get_flags = (unsigned long)buf.st_attr;
32 }
33 else if (!SetFileAttributes(name, set_flags & CHATTR_MASK)) {
34 errno = err_win_to_posix();
35 return -1;
36 }
37 return 0;
38}
39#endif
40
41#if !ENABLE_PLATFORM_MINGW32 11#if !ENABLE_PLATFORM_MINGW32
42/* Print file attributes on an ext2 file system */ 12/* Print file attributes on an ext2 file system */
43const uint32_t e2attr_flags_value[] ALIGN4 = { 13const uint32_t e2attr_flags_value[] ALIGN4 = {
diff --git a/e2fsprogs/e2fs_lib.h b/e2fsprogs/e2fs_lib.h
index aa92e63af..fd6948fc7 100644
--- a/e2fsprogs/e2fs_lib.h
+++ b/e2fsprogs/e2fs_lib.h
@@ -12,10 +12,10 @@
12PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN 12PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
13 13
14#if ENABLE_PLATFORM_MINGW32 14#if ENABLE_PLATFORM_MINGW32
15/* Get/set a file flags */ 15/* Only certain attributes can be set using SetFileAttributes() */
16int fgetsetflags(const char *name, unsigned *get_flags, unsigned set_flags); 16#define CHATTR_MASK (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN | \
17#define fgetflags(name, flags) fgetsetflags(name, flags, 0) 17 FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_ARCHIVE | \
18#define fsetflags(name, flags) fgetsetflags(name, NULL, flags) 18 FILE_ATTRIBUTE_TEMPORARY | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)
19#endif 19#endif
20 20
21/* Print file attributes on an ext2 file system */ 21/* Print file attributes on an ext2 file system */
diff --git a/e2fsprogs/lsattr.c b/e2fsprogs/lsattr.c
index d82861e14..461ce39e6 100644
--- a/e2fsprogs/lsattr.c
+++ b/e2fsprogs/lsattr.c
@@ -89,8 +89,13 @@ static void list_attributes(const char *name)
89 89
90 close(fd); 90 close(fd);
91#else /* ENABLE_PLATFORM_MINGW32 */ 91#else /* ENABLE_PLATFORM_MINGW32 */
92 if (fgetflags(name, &fsflags) != 0) 92 struct stat st;
93
94 if (lstat(name, &st) == 0 && !(S_ISREG(st.st_mode) ||
95 S_ISDIR(st.st_mode) || S_ISLNK(st.st_mode)))
93 goto read_err; 96 goto read_err;
97
98 fsflags = st.st_attr;
94#endif 99#endif
95 100
96 if (option_mask32 & OPT_PF_LONG) { 101 if (option_mask32 & OPT_PF_LONG) {