wok annotate busybox/stuff/busybox-1.22-fatattr.u @ rev 17217

Up: file (5.20).
author Aleksej Bobylev <al.bobylev@gmail.com>
date Tue Oct 14 11:50:51 2014 +0300 (2014-10-14)
parents 79c239d4e13f
children
rev   line source
pascal@16773 1 --- busybox-1.22.0/include/applets.src.h
pascal@16773 2 +++ busybox-1.22.0/include/applets.src.h
pascal@16773 3 @@ -138,6 +138,7 @@
pascal@16773 4 IF_EXPR(APPLET(expr, BB_DIR_USR_BIN, BB_SUID_DROP))
pascal@16773 5 IF_FAKEIDENTD(APPLET(fakeidentd, BB_DIR_USR_SBIN, BB_SUID_DROP))
pascal@16773 6 IF_FALSE(APPLET_NOFORK(false, false, BB_DIR_BIN, BB_SUID_DROP, false))
pascal@16773 7 +IF_FATATTR(APPLET(fatattr, BB_DIR_BIN, BB_SUID_DROP))
pascal@16773 8 IF_FBSET(APPLET(fbset, BB_DIR_USR_SBIN, BB_SUID_DROP))
pascal@16773 9 IF_FBSPLASH(APPLET(fbsplash, BB_DIR_SBIN, BB_SUID_DROP))
pascal@16773 10 IF_FDFLUSH(APPLET_ODDNAME(fdflush, freeramdisk, BB_DIR_BIN, BB_SUID_DROP, fdflush))
pascal@16773 11 --- busybox-1.22.0/e2fsprogs/Config.src
pascal@16773 12 +++ busybox-1.22.0/e2fsprogs/Config.src
pascal@16773 13 @@ -37,6 +37,13 @@
pascal@16773 14 help
pascal@16773 15 lsattr lists the file attributes on a second extended file system.
pascal@16773 16
pascal@16773 17 +config FATATTR
pascal@16773 18 + bool "fatattr"
pascal@16773 19 + default y
pascal@16773 20 + select PLATFORM_LINUX
pascal@16773 21 + help
pascal@16773 22 + fatattr lists or changes the file attributes on a fat file system.
pascal@16773 23 +
pascal@16773 24 ### config MKE2FS
pascal@16773 25 ### bool "mke2fs"
pascal@16773 26 ### default y
pascal@16773 27 --- busybox-1.22.0/e2fsprogs/Kbuild.src
pascal@16773 28 +++ busybox-1.22.0/e2fsprogs/Kbuild.src
pascal@16773 29 @@ -11,5 +11,7 @@
pascal@16773 30 lib-$(CONFIG_CHATTR) += chattr.o e2fs_lib.o
pascal@16773 31 lib-$(CONFIG_LSATTR) += lsattr.o e2fs_lib.o
pascal@16773 32
pascal@16773 33 +lib-$(CONFIG_FATATTR) += fatattr.o
pascal@16773 34 +
pascal@16773 35 lib-$(CONFIG_FSCK) += fsck.o
pascal@16773 36 lib-$(CONFIG_TUNE2FS) += tune2fs.o
pascal@16773 37 --- busybox-1.22.0/e2fsprogs/fatattr.c
pascal@16773 38 +++ busybox-1.22.0/e2fsprogs/fatattr.c
pascal@16773 39 @@ -0,0 +1,113 @@
pascal@16773 40 +/* vi: set sw=4 ts=4: */
pascal@16773 41 +/*
pascal@16773 42 + * fatattr.c - Display or change file attributes on a fat file system
pascal@16773 43 + *
pascal@16773 44 + * Copyright 2005 H. Peter Anvin
pascal@16773 45 + * Busybox'ed (2014) by Pascal Bellard <pascal.bellard@ads-lu.com>
pascal@16773 46 + *
pascal@16773 47 + * This file can be redistributed under the terms of the GNU General
pascal@16773 48 + * Public License
pascal@16773 49 + */
pascal@16773 50 +
pascal@16773 51 +//usage:#define fatattr_trivial_usage
pascal@16773 52 +//usage: "[-+rhsvda] [FILE]..."
pascal@16773 53 +//usage:#define fatattr_full_usage "\n\n"
pascal@16773 54 +//usage: "Change file attributes on a fat fs\n"
pascal@16773 55 +//usage: "\nModifiers:"
pascal@16773 56 +//usage: "\n - Clear attributes"
pascal@16773 57 +//usage: "\n + Set attributes"
pascal@16773 58 +//usage: "\nAttributes:"
pascal@16773 59 +//usage: "\n r Read only"
pascal@16773 60 +//usage: "\n h Hidden"
pascal@16773 61 +//usage: "\n s System"
pascal@16773 62 +//usage: "\n v Volume label"
pascal@16773 63 +//usage: "\n d Directory"
pascal@16773 64 +//usage: "\n a Archive"
pascal@16773 65 +
pascal@16773 66 +#include "libbb.h"
pascal@16773 67 +/* linux/msdos_fs.h says: */
pascal@16773 68 +#ifndef FAT_IOCTL_GET_ATTRIBUTES
pascal@17018 69 +# define FAT_IOCTL_GET_ATTRIBUTES _IOR('r', 0x10, uint32_t)
pascal@16773 70 +#endif
pascal@16773 71 +#ifndef FAT_IOCTL_SET_ATTRIBUTES
pascal@17018 72 +# define FAT_IOCTL_SET_ATTRIBUTES _IOW('r', 0x11, uint32_t)
pascal@16773 73 +#endif
pascal@16773 74 +
pascal@16773 75 +#define OPT_ADD 1
pascal@16773 76 +#define OPT_REM 2
pascal@16773 77 +
pascal@16773 78 +struct globals {
pascal@16773 79 + unsigned long af;
pascal@16773 80 + unsigned long rf;
pascal@16773 81 +};
pascal@16773 82 +
pascal@16773 83 +/* Currently supports only the FAT flags, not the NTFS ones */
pascal@16773 84 +const char bit_to_char[] = "rhsvda67 ";
pascal@16773 85 +
pascal@16773 86 +static inline unsigned long get_flag(char c)
pascal@16773 87 +{
pascal@16773 88 + const char *fp = strchr(bit_to_char, c);
pascal@16773 89 + if (fp)
pascal@16773 90 + return 1 << (fp - bit_to_char);
pascal@16773 91 + bb_error_msg_and_die("invalid character '%c' ", c);
pascal@16773 92 +}
pascal@16773 93 +
pascal@16773 94 +static inline int decode_arg(const char *arg, struct globals *gp)
pascal@16773 95 +{
pascal@16773 96 + unsigned long *fl;
pascal@16773 97 + char opt = *arg++;
pascal@16773 98 +
pascal@16773 99 + fl = &gp->af;
pascal@16773 100 + if (opt == '-') {
pascal@16773 101 + fl = &gp->rf;
pascal@16773 102 + } else if (opt != '+') {
pascal@16773 103 + return 0;
pascal@16773 104 + }
pascal@16773 105 +
pascal@16773 106 + while (*arg)
pascal@16773 107 + *fl |= get_flag(*arg++);
pascal@16773 108 +
pascal@16773 109 + return 1;
pascal@16773 110 +}
pascal@16773 111 +
pascal@16773 112 +int fatattr_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
pascal@16773 113 +int fatattr_main(int argc UNUSED_PARAM, char **argv)
pascal@16773 114 +{
pascal@16773 115 + struct globals g;
pascal@16773 116 + char *arg;
pascal@16773 117 +
pascal@16773 118 + g.rf = g.af = 0;
pascal@16773 119 +
pascal@16773 120 + /* parse the args */
pascal@16773 121 + while ((arg = *++argv)) {
pascal@16773 122 + if (!decode_arg(arg, &g))
pascal@16773 123 + break;
pascal@16773 124 + }
pascal@16773 125 +
pascal@16773 126 + /* run sanity checks on all the arguments given us */
pascal@16773 127 + if (!*argv)
pascal@16773 128 + bb_show_usage();
pascal@16773 129 +
pascal@16773 130 + /* now proceed all the files passed to us */
pascal@16773 131 + do {
pascal@16773 132 + int fd, i;
pascal@16773 133 + uint32_t attr;
pascal@16773 134 +
pascal@16773 135 + fd = xopen(*argv, O_RDONLY);
pascal@16773 136 + xioctl(fd, FAT_IOCTL_GET_ATTRIBUTES, &attr);
pascal@16773 137 + attr |= g.af;
pascal@16773 138 + attr &= ~g.rf;
pascal@16773 139 + if (g.af || g.rf)
pascal@16773 140 + xioctl(fd, FAT_IOCTL_SET_ATTRIBUTES, &attr);
pascal@16773 141 + else {
pascal@16773 142 + for ( i = 0 ; bit_to_char[i] ; i++ ) {
pascal@16773 143 + bb_putchar( (attr & 1) ? bit_to_char[i] : ' ' );
pascal@16773 144 + attr >>= 1;
pascal@16773 145 + }
pascal@16773 146 + puts(*argv);
pascal@16773 147 + }
pascal@16773 148 + close(fd);
pascal@16773 149 + } while (*++argv);
pascal@16773 150 +
pascal@16773 151 + return EXIT_SUCCESS;
pascal@16773 152 +}