busybox/miscutils/setfattr.c
Denys Vlasenko b278ac0e60 setfattr: new applet
function                                             old     new   delta
setfattr_main                                          -     189    +189
packed_usage                                       31516   31588     +72
setxattr                                               -      53     +53
lsetxattr                                              -      53     +53
removexattr                                            -      37     +37
lremovexattr                                           -      37     +37
applet_names                                        2649    2658      +9
find_applet_by_name                                  124     128      +4
applet_main                                         1532    1536      +4
------------------------------------------------------------------------------
(add/remove: 7/0 grow/shrink: 4/0 up/down: 458/0)             Total: 458 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2017-09-08 20:55:59 +02:00

69 lines
1.7 KiB
C

/*
* setfattr - set extended attributes of filesystem objects.
*
* Copyright (C) 2017 by Denys Vlasenko <vda.linux@googlemail.com>
*
* Licensed under GPLv2, see file LICENSE in this source tree.
*/
//config:config SETFATTR
//config: bool "setfattr"
//config: default y
//config: help
//config: Set/delete extended attributes on files
//applet:IF_SETFATTR(APPLET_NOEXEC(setfattr, setfattr, BB_DIR_USR_BIN, BB_SUID_DROP, setfattr))
//kbuild:lib-$(CONFIG_SETFATTR) += setfattr.o
#include <sys/xattr.h>
#include "libbb.h"
//usage:#define setfattr_trivial_usage
//usage: "[-h] -n|-x ATTR [-v VALUE] FILE..."
//usage:#define setfattr_full_usage "\n\n"
//usage: "Set extended attributes"
//usage: "\n"
//usage: "\n -h Do not follow symlinks"
//usage: "\n -x ATTR Remove attribute ATTR"
//usage: "\n -n ATTR Set attribute ATTR to VALUE"
//usage: "\n -v VALUE (default: empty)"
int setfattr_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int setfattr_main(int argc UNUSED_PARAM, char **argv)
{
const char *name;
const char *value = "";
int status;
int opt;
enum {
OPT_h = (1 << 0),
OPT_x = (1 << 1),
};
opt = getopt32(argv, "^"
"hx:n:v:"
/* Min one arg, either -x or -n is a must, -x does not allow -v */
"\0" "-1:x:n:n--x:x--nv:v--x"
, &name, &name, &value
);
argv += optind;
status = EXIT_SUCCESS;
do {
int r;
if (opt & OPT_x)
r = ((opt & OPT_h) ? lremovexattr : removexattr)(*argv, name);
else {
r = ((opt & OPT_h) ? lsetxattr : setxattr)(
*argv, name,
value, strlen(value), /*flags:*/ 0
);
}
if (r) {
bb_simple_perror_msg(*argv);
status = EXIT_FAILURE;
}
} while (*++argv);
return status;
}