1 /*****************************************************************************
3 * Library for check_disk
6 * Copyright (c) 1999-2007 Nagios 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
;
62 if (current
== NULL
) {
65 while (current
->name_next
) {
66 current
= current
->name_next
;
68 current
->name_next
= new_path
;
73 /* Delete a given parameter from list and return pointer to next element*/
74 struct parameter_list
*
75 np_del_parameter(struct parameter_list
*item
, struct parameter_list
*prev
)
77 struct parameter_list
*next
;
80 next
= item
->name_next
;
86 prev
->name_next
= next
;
92 /* returns a pointer to the struct found in the list */
93 struct parameter_list
*
94 np_find_parameter(struct parameter_list
*list
, const char *name
)
96 struct parameter_list
*temp_list
;
97 for (temp_list
= list
; temp_list
; temp_list
= temp_list
->name_next
) {
98 if (! strcmp(temp_list
->name
, name
))
106 np_set_best_match(struct parameter_list
*desired
, struct mount_entry
*mount_list
, int exact
)
108 struct parameter_list
*d
;
109 for (d
= desired
; d
; d
= d
->name_next
) {
110 if (! d
->best_match
) {
111 struct mount_entry
*me
;
112 size_t name_len
= strlen(d
->name
);
113 size_t best_match_len
= 0;
114 struct mount_entry
*best_match
= NULL
;
116 /* set best match if path name exactly matches a mounted device name */
117 for (me
= mount_list
; me
; me
= me
->me_next
) {
118 if (strcmp(me
->me_devname
, d
->name
)==0)
122 /* set best match by directory name if no match was found by devname */
124 for (me
= mount_list
; me
; me
= me
->me_next
) {
125 size_t len
= strlen (me
->me_mountdir
);
126 if ((exact
== FALSE
&& (best_match_len
<= len
&& len
<= name_len
&&
127 (len
== 1 || strncmp (me
->me_mountdir
, d
->name
, len
) == 0)))
128 || (exact
== TRUE
&& strcmp(me
->me_mountdir
, d
->name
)==0))
131 best_match_len
= len
;
137 d
->best_match
= best_match
;
139 d
->best_match
= NULL
; /* Not sure why this is needed as it should be null on initialisation */
145 /* Returns TRUE if name is in list */
147 np_find_name (struct name_list
*list
, const char *name
)
149 const struct name_list
*n
;
151 if (list
== NULL
|| name
== NULL
) {
154 for (n
= list
; n
; n
= n
->next
) {
155 if (!strcmp(name
, n
->name
)) {
163 np_seen_name(struct name_list
*list
, const char *name
)
165 const struct name_list
*s
;
166 for (s
= list
; s
; s
=s
->next
) {
167 if (!strcmp(s
->name
, name
)) {
175 np_regex_match_mount_entry (struct mount_entry
* me
, regex_t
* re
)
177 if (regexec(re
, me
->me_devname
, (size_t) 0, NULL
, 0) == 0 ||
178 regexec(re
, me
->me_mountdir
, (size_t) 0, NULL
, 0) == 0 ) {