From dd249c5d4bbce1c1250322dab8c8d0d69b0dca34 Mon Sep 17 00:00:00 2001 From: christian-2 <49752982+christian-2@users.noreply.github.com> Date: Tue, 13 Dec 2022 23:48:36 +0100 Subject: check_disk: Find accessible mount path if multiple are available (#1820) * fixes #1819 * mount entries also have to be accessible according to get_fs_usage() --- lib/utils_disk.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'lib/utils_disk.c') diff --git a/lib/utils_disk.c b/lib/utils_disk.c index c7c9126e..4f16068a 100644 --- a/lib/utils_disk.c +++ b/lib/utils_disk.c @@ -28,6 +28,7 @@ #include "common.h" #include "utils_disk.h" +#include "gl/fsusage.h" void np_add_name (struct name_list **list, const char *name) @@ -127,9 +128,12 @@ np_set_best_match(struct parameter_list *desired, struct mount_entry *mount_list size_t name_len = strlen(d->name); size_t best_match_len = 0; struct mount_entry *best_match = NULL; + struct fs_usage fsp; /* set best match if path name exactly matches a mounted device name */ for (me = mount_list; me; me = me->me_next) { + if (get_fs_usage(me->me_mountdir, me->me_devname, &fsp) < 0) + continue; /* skip if permissions do not suffice for accessing device */ if (strcmp(me->me_devname, d->name)==0) best_match = me; } @@ -137,6 +141,8 @@ np_set_best_match(struct parameter_list *desired, struct mount_entry *mount_list /* set best match by directory name if no match was found by devname */ if (! best_match) { for (me = mount_list; me; me = me->me_next) { + if (get_fs_usage(me->me_mountdir, me->me_devname, &fsp) < 0) + continue; /* skip if permissions do not suffice for accessing device */ size_t len = strlen (me->me_mountdir); if ((exact == FALSE && (best_match_len <= len && len <= name_len && (len == 1 || strncmp (me->me_mountdir, d->name, len) == 0))) -- cgit v1.2.3-74-g34f1 From 9898a8ad7dabfabfe80785585a5bbc30b678bdb0 Mon Sep 17 00:00:00 2001 From: Kristian Schuster <116557017+KriSchu@users.noreply.github.com> Date: Sun, 19 Feb 2023 13:44:04 +0100 Subject: utils_disk: add name_prev pointer to struct parameter_list Also added handling of name_prev in np_add_parameter and np_delete_parameter. This make calling the np_delete_parameter function easier, because it requires the previous element as second argument. --- lib/utils_disk.c | 19 +++++++++++++++++-- lib/utils_disk.h | 1 + 2 files changed, 18 insertions(+), 2 deletions(-) (limited to 'lib/utils_disk.c') diff --git a/lib/utils_disk.c b/lib/utils_disk.c index c7c9126e..a1181d37 100644 --- a/lib/utils_disk.c +++ b/lib/utils_disk.c @@ -46,9 +46,10 @@ np_add_parameter(struct parameter_list **list, const char *name) struct parameter_list *current = *list; struct parameter_list *new_path; new_path = (struct parameter_list *) malloc (sizeof *new_path); - new_path->name = (char *) name; + new_path->name = (char *) malloc(strlen(name) + 1); new_path->best_match = NULL; new_path->name_next = NULL; + new_path->name_prev = NULL; new_path->freespace_bytes = NULL; new_path->freespace_units = NULL; new_path->freespace_percent = NULL; @@ -74,13 +75,17 @@ np_add_parameter(struct parameter_list **list, const char *name) new_path->dused_inodes_percent = 0; new_path->dfree_inodes_percent = 0; + strcpy(new_path->name, name); + if (current == NULL) { *list = new_path; + new_path->name_prev = NULL; } else { while (current->name_next) { current = current->name_next; } current->name_next = new_path; + new_path->name_prev = current; } return new_path; } @@ -89,6 +94,9 @@ np_add_parameter(struct parameter_list **list, const char *name) struct parameter_list * np_del_parameter(struct parameter_list *item, struct parameter_list *prev) { + if (item == NULL) { + return NULL; + } struct parameter_list *next; if (item->name_next) @@ -96,10 +104,17 @@ np_del_parameter(struct parameter_list *item, struct parameter_list *prev) else next = NULL; - free(item); + if (next) + next->name_prev = prev; + if (prev) prev->name_next = next; + if (item->name) { + free(item->name); + } + free(item); + return next; } diff --git a/lib/utils_disk.h b/lib/utils_disk.h index bf52e4ce..3b5a45f8 100644 --- a/lib/utils_disk.h +++ b/lib/utils_disk.h @@ -24,6 +24,7 @@ struct parameter_list char *group; struct mount_entry *best_match; struct parameter_list *name_next; + struct parameter_list *name_prev; uintmax_t total, available, available_to_root, used, inodes_free, inodes_free_to_root, inodes_used, inodes_total; double dfree_pct, dused_pct; -- cgit v1.2.3-74-g34f1