[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    Re: [PATCH] getfattr: new applet
From:       Denys Vlasenko <vda.linux () googlemail ! com>
Date:       2023-07-16 12:55:42
Message-ID: CAK1hOcOXm8BGoAfX7mUfUjGqEa2C=xcGSyAzQ+tJZdJ3Md6txw () mail ! gmail ! com
[Download RAW message or body]

Applied, thank you.
Please try current git.

I would like to check how we do on errors.
How to easily get getxattr error? Neither sysfs, procfs,
nor devtmpfs throw errors on it.

On Fri, Jul 7, 2023 at 10:45 AM LoveSy <lovesykun@gmail.com> wrote:
>
> function                                             old     new   delta
> getfattr_main                                          -     380    +380
> print_attr                                             -     204    +204
> list_attr                                              -     152    +152
> .rodata                                            95358   95401     +43
> applet_names                                        2766    2775      +9
> e843419@0048_000003ed_14                               -       8      +8
> e843419@0047_000003d1_550                              -       8      +8
> applet_main                                         3216    3224      +8
> packed_usage                                       34560   34567      +7
> applet_install_loc                                   201     202      +1
> ------------------------------------------------------------------------------
> (add/remove: 6/0 grow/shrink: 5/0 up/down: 820/0)             Total: 820 bytes
>    text    data     bss     dec     hex filename
> 1127717   16889    1736 1146342  117de6 busybox_old
> 1141124   16937    1736 1159797  11b275 busybox_unstripped
>
> Signed-off-by: LoveSy <lovesykun@gmail.com>
> ---
> Thansk for your review. Updated the patch. Please have a check.
>
>  miscutils/getfattr.c | 121 +++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 121 insertions(+)
>  create mode 100644 miscutils/getfattr.c
>
> diff --git a/miscutils/getfattr.c b/miscutils/getfattr.c
> new file mode 100644
> index 000000000..44556cb24
> --- /dev/null
> +++ b/miscutils/getfattr.c
> @@ -0,0 +1,121 @@
> +/*
> + * getfattr - get extended attributes of filesystem objects.
> + *
> + * Copyright (C) 2023 by LoveSy <lovesykun@gmail.com>
> + *
> + * Licensed under GPLv2, see file LICENSE in this source tree.
> + */
> +//config:config GETFATTR
> +//config:      bool "getfattr (12.3 kb)"
> +//config:      default y
> +//config:      help
> +//config:      Get extended attributes on files
> +
> +//applet:IF_GETFATTR(APPLET_NOEXEC(getfattr, getfattr, BB_DIR_USR_BIN, BB_SUID_DROP, getfattr))
> +
> +//kbuild:lib-$(CONFIG_GETFATTR) += getfattr.o
> +
> +#include <stdio.h>
> +#include <sys/xattr.h>
> +#include "libbb.h"
> +
> +//usage:#define getfattr_trivial_usage
> +//usage:       "[-h] -n ATTR FILE...\n"
> +//usage:       "or: getfattr [-h] -d FILE..."
> +//usage:#define getfattr_full_usage "\n\n"
> +//usage:       "Get extended attributes"
> +//usage:     "\n"
> +//usage:     "\n       -h              Do not follow symlinks"
> +//usage:     "\n       -d              Dump all attributes"
> +//usage:     "\n       -n ATTR         Get attribute ATTR"
> +int getfattr_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
> +
> +int print_attr(const char *file, const char *name, int follow, char **buf, size_t *bufsize)
> +{
> +       ssize_t len;
> +       len = (follow ? getxattr: lgetxattr)(file, name, NULL, 0);
> +       if (len == -1) {
> +               return -1;
> +       }
> +       if (*bufsize < len) {
> +               *buf = xrealloc(*buf, len);
> +               *bufsize = len;
> +       }
> +       len = (follow ? getxattr : lgetxattr)(file, name, *buf, *bufsize);
> +       if (len == -1) {
> +               return -1;
> +       }
> +       printf("%s=\"%.*s\"\n", name, len, *buf);
> +       return 0;
> +}
> +
> +ssize_t list_attr(const char *file, int follow, char **list, size_t *listsize)
> +{
> +       ssize_t len;
> +       len = (follow ? listxattr : llistxattr)(file, NULL, 0);
> +       if (len == -1) {
> +               return -1;
> +       }
> +       if (*listsize < len) {
> +               *list = xrealloc(*list, len);
> +               *listsize = len;
> +       }
> +       len = (follow ? listxattr : llistxattr)(file, *list, *listsize);
> +       if (len == -1) {
> +               return -1;
> +       }
> +       return len;
> +}
> +
> +int getfattr_main(int argc UNUSED_PARAM, char **argv)
> +{
> +       const char *name = NULL;
> +       int status;
> +       int opt;
> +       char *buf = NULL;
> +       size_t bufsize = 0;
> +       char *list = NULL;
> +       size_t listsize = 0;
> +       enum {
> +               OPT_h = (1 << 0),
> +               OPT_d = (1 << 1),
> +       };
> +
> +       opt = getopt32(argv, "^"
> +               "hdn:"
> +               /* Min one arg; exactly one of -n or -d is required. */
> +               "\0" "-1:d:n:n--d:d--n"
> +               , &name
> +       );
> +       argv += optind;
> +       status = EXIT_SUCCESS;
> +
> +       do {
> +               int r = 0;
> +               printf("# file: %s\n", *argv);
> +               if (opt & OPT_d) {
> +                       ssize_t len = list_attr(*argv, !(opt & OPT_h), &list, &listsize);
> +                       ssize_t keylen;
> +                       char *key = list;
> +                       while (len > 0 && !r) {
> +                               r = print_attr(*argv, key, !(opt & OPT_h), &buf, &bufsize);
> +                               keylen = strlen(key) + 1;
> +                               key += keylen;
> +                               len -= keylen;
> +                       }
> +               }
> +               else {
> +                       r = print_attr(*argv, name, !(opt & OPT_h), &buf, &bufsize);
> +               }
> +
> +               if (r) {
> +                       bb_simple_perror_msg(*argv);
> +                       status = EXIT_FAILURE;
> +               }
> +               printf("\n");
> +       } while (*++argv);
> +
> +       free(buf);
> +
> +       return status;
> +}
> --
> 2.34.1
>
> _______________________________________________
> busybox mailing list
> busybox@busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic