|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/2] tools/xenstore: Accumulate errors in xenstore-ls and exit appropriately
> -----Original Message-----
> From: Xen-devel <xen-devel-bounces@xxxxxxxxxxxxxxxxxxxx> On Behalf Of David
> Woodhouse
> Sent: 19 March 2020 20:40
> To: xen-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Juergen Gross <jgross@xxxxxxxx>; Ian Jackson <ian.jackson@xxxxxxxxxxxxx>;
> Wei Liu <wl@xxxxxxx>
> Subject: [Xen-devel] [PATCH 2/2] tools/xenstore: Accumulate errors in
> xenstore-ls and exit
> appropriately
>
> From: David Woodhouse <dwmw@xxxxxxxxxxxx>
>
> Report only one error to stderr for each node, regardless of whether it's
> xs_read, xs_get_permissions or xs_directory on the child that fails.
>
> Always exit with a non-zero code if any failure happens, reporting the
> last error that occurred.
>
> Signed-off-by: David Woodhouse <dwmw@xxxxxxxxxxxx>
> ---
> tools/xenstore/xenstore_client.c | 35 ++++++++++++++++++++++++--------
> 1 file changed, 26 insertions(+), 9 deletions(-)
>
> diff --git a/tools/xenstore/xenstore_client.c
> b/tools/xenstore/xenstore_client.c
> index ae7ed3eb9e..0c891961ae 100644
> --- a/tools/xenstore/xenstore_client.c
> +++ b/tools/xenstore/xenstore_client.c
> @@ -140,7 +140,7 @@ static int show_whole_path = 0;
>
> #define MIN(a, b) (((a) < (b))? (a) : (b))
>
> -static void do_ls(struct xs_handle *h, char *path, int cur_depth, int
> show_perms)
> +static int do_ls(struct xs_handle *h, char *path, int cur_depth, int
> show_perms, int error, int
> ignore_errors)
> {
> char **e;
> char *newpath, *val;
> @@ -150,9 +150,16 @@ static void do_ls(struct xs_handle *h, char *path, int
> cur_depth, int show_perms
>
> e = xs_directory(h, XBT_NULL, path, &num);
> if (e == NULL) {
> - if (cur_depth && errno == ENOENT) {
> - /* If a node disappears while recursing, silently move on. */
> - return;
> + if (cur_depth && (errno == ENOENT || errno == EACCES)) {
> + /*
> + * If a node disappears or becomes inaccessible while traversing,
> + * only print an error if previous operations on this node
> haven't
> + * done do. Then move on.
> + */
> + error = errno;
> + if (!ignore_errors)
> + warn("xs_directory (%s)", path);
> + return error;
> }
>
> err(1, "xs_directory (%s)", path);
> @@ -197,7 +204,8 @@ static void do_ls(struct xs_handle *h, char *path, int
> cur_depth, int show_perms
>
> /* Print value */
> if (val == NULL) {
> - printf(":\n");
> + error = errno;
> + printf(": (%s)", strerror(error));
> }
> else {
> if (max_width < (linewid + len + TAG_LEN)) {
> @@ -222,7 +230,11 @@ static void do_ls(struct xs_handle *h, char *path, int
> cur_depth, int show_perms
> if (show_perms) {
> perms = xs_get_permissions(h, XBT_NULL, newpath, &nperms);
> if (perms == NULL) {
> - warn("\ncould not access permissions for %s", e[i]);
> + error = errno;
> + val = NULL;
> + /* Don't repeat an error message if xs_read() already failed
> */
> + if (val)
How can the code get here? The line above the comment always sets val to NULL.
Paul
> + warn("could not access permissions for %s", e[i]);
> }
> else {
> int i;
> @@ -238,11 +250,13 @@ static void do_ls(struct xs_handle *h, char *path, int
> cur_depth, int show_perms
> }
>
> putchar('\n');
> -
> - do_ls(h, newpath, cur_depth+1, show_perms);
> +
> + error = do_ls(h, newpath, cur_depth+1, show_perms, error, !val);
> }
> free(e);
> free(newpath);
> +
> + return error;
> }
>
> static void
> @@ -448,7 +462,10 @@ perform(enum mode mode, int optind, int argc, char
> **argv, struct xs_handle *xsh
> break;
> }
> case MODE_ls: {
> - do_ls(xsh, argv[optind], 0, prefix);
> + int error = do_ls(xsh, argv[optind], 0, prefix, 0, 0);
> + if (error) {
> + errx(1, "Errors during traversal. Last error: %s",
> strerror(error));
> + }
> optind++;
> break;
> }
> --
> 2.21.0
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxxx
> https://lists.xenproject.org/mailman/listinfo/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |