1 /*****************************************************************************
3 * Library for check_disk
6 * Copyright (c) 1999-2007 Monitoring Plugins Development Team
10 * This file contains utilities for check_disk. These are tested by libtap
13 * This program is free software: you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation, either version 3 of the License, or
16 * (at your option) any later version.
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License
24 * along with this program. If not, see <http://www.gnu.org/licenses/>.
27 *****************************************************************************/
30 #include "utils_disk.h"
33 np_add_name (struct name_list
**list
, const char *name
)
35 struct name_list
*new_entry
;
36 new_entry
= (struct name_list
*) malloc (sizeof *new_entry
);
37 new_entry
->name
= (char *) name
;
38 new_entry
->next
= *list
;
42 /* Initialises a new parameter at the end of list */
43 struct parameter_list
*
44 np_add_parameter(struct parameter_list
**list
, const char *name
)
46 struct parameter_list
*current
= *list
;
47 struct parameter_list
*new_path
;
48 new_path
= (struct parameter_list
*) malloc (sizeof *new_path
);
49 new_path
->name
= (char *) name
;
50 new_path
->best_match
= NULL
;
51 new_path
->name_next
= NULL
;
52 new_path
->freespace_bytes
= NULL
;
53 new_path
->freespace_units
= NULL
;
54 new_path
->freespace_percent
= NULL
;
55 new_path
->usedspace_bytes
= NULL
;
56 new_path
->usedspace_units
= NULL
;
57 new_path
->usedspace_percent
= NULL
;
58 new_path
->usedinodes_percent
= NULL
;
59 new_path
->freeinodes_percent
= NULL
;
60 new_path
->group
= NULL
;
61 new_path
->dfree_pct
= -1;
62 new_path
->dused_pct
= -1;
64 new_path
->available
= 0;
65 new_path
->available_to_root
= 0;
67 new_path
->dused_units
= 0;
68 new_path
->dfree_units
= 0;
69 new_path
->dtotal_units
= 0;
70 new_path
->inodes_total
= 0;
71 new_path
->inodes_free
= 0;
72 new_path
->inodes_free_to_root
= 0;
73 new_path
->inodes_used
= 0;
74 new_path
->dused_inodes_percent
= 0;
75 new_path
->dfree_inodes_percent
= 0;
77 if (current
== NULL
) {
80 while (current
->name_next
) {
81 current
= current
->name_next
;
83 current
->name_next
= new_path
;
88 /* Delete a given parameter from list and return pointer to next element*/
89 struct parameter_list
*
90 np_del_parameter(struct parameter_list
*item
, struct parameter_list
*prev
)
92 struct parameter_list
*next
;
95 next
= item
->name_next
;
101 prev
->name_next
= next
;
107 /* returns a pointer to the struct found in the list */
108 struct parameter_list
*
109 np_find_parameter(struct parameter_list
*list
, const char *name
)
111 struct parameter_list
*temp_list
;
112 for (temp_list
= list
; temp_list
; temp_list
= temp_list
->name_next
) {
113 if (! strcmp(temp_list
->name
, name
))
121 np_set_best_match(struct parameter_list
*desired
, struct mount_entry
*mount_list
, int exact
)
123 struct parameter_list
*d
;
124 for (d
= desired
; d
; d
= d
->name_next
) {
125 if (! d
->best_match
) {
126 struct mount_entry
*me
;
127 size_t name_len
= strlen(d
->name
);
128 size_t best_match_len
= 0;
129 struct mount_entry
*best_match
= NULL
;
131 /* set best match if path name exactly matches a mounted device name */
132 for (me
= mount_list
; me
; me
= me
->me_next
) {
133 if (strcmp(me
->me_devname
, d
->name
)==0)
137 /* set best match by directory name if no match was found by devname */
139 for (me
= mount_list
; me
; me
= me
->me_next
) {
140 size_t len
= strlen (me
->me_mountdir
);
141 if ((exact
== FALSE
&& (best_match_len
<= len
&& len
<= name_len
&&
142 (len
== 1 || strncmp (me
->me_mountdir
, d
->name
, len
) == 0)))
143 || (exact
== TRUE
&& strcmp(me
->me_mountdir
, d
->name
)==0))
146 best_match_len
= len
;
152 d
->best_match
= best_match
;
154 d
->best_match
= NULL
; /* Not sure why this is needed as it should be null on initialisation */
160 /* Returns TRUE if name is in list */
162 np_find_name (struct name_list
*list
, const char *name
)
164 const struct name_list
*n
;
166 if (list
== NULL
|| name
== NULL
) {
169 for (n
= list
; n
; n
= n
->next
) {
170 if (!strcmp(name
, n
->name
)) {
178 np_seen_name(struct name_list
*list
, const char *name
)
180 const struct name_list
*s
;
181 for (s
= list
; s
; s
=s
->next
) {
182 if (!strcmp(s
->name
, name
)) {
190 np_regex_match_mount_entry (struct mount_entry
* me
, regex_t
* re
)
192 if (regexec(re
, me
->me_devname
, (size_t) 0, NULL
, 0) == 0 ||
193 regexec(re
, me
->me_mountdir
, (size_t) 0, NULL
, 0) == 0 ) {