diff options
-rw-r--r-- | plugins/check_disk.c | 59 |
1 files changed, 42 insertions, 17 deletions
diff --git a/plugins/check_disk.c b/plugins/check_disk.c index f9a9a84..9746511 100644 --- a/plugins/check_disk.c +++ b/plugins/check_disk.c | |||
@@ -91,10 +91,10 @@ static int require_sync = 0; | |||
91 | 91 | ||
92 | /* A filesystem type to display. */ | 92 | /* A filesystem type to display. */ |
93 | 93 | ||
94 | struct fs_type_list | 94 | struct name_list |
95 | { | 95 | { |
96 | char *fs_name; | 96 | char *name; |
97 | struct fs_type_list *fs_next; | 97 | struct name_list *name_next; |
98 | }; | 98 | }; |
99 | 99 | ||
100 | /* Linked list of filesystem types to display. | 100 | /* Linked list of filesystem types to display. |
@@ -108,12 +108,16 @@ struct fs_type_list | |||
108 | Some filesystem types: | 108 | Some filesystem types: |
109 | 4.2 4.3 ufs nfs swap ignore io vm efs dbg */ | 109 | 4.2 4.3 ufs nfs swap ignore io vm efs dbg */ |
110 | 110 | ||
111 | static struct fs_type_list *fs_select_list; | 111 | static struct name_list *fs_select_list; |
112 | 112 | ||
113 | /* Linked list of filesystem types to omit. | 113 | /* Linked list of filesystem types to omit. |
114 | If the list is empty, don't exclude any types. */ | 114 | If the list is empty, don't exclude any types. */ |
115 | 115 | ||
116 | static struct fs_type_list *fs_exclude_list; | 116 | static struct name_list *fs_exclude_list; |
117 | |||
118 | static struct name_list *path_select_list; | ||
119 | |||
120 | static struct name_list *dev_select_list; | ||
117 | 121 | ||
118 | /* Linked list of mounted filesystems. */ | 122 | /* Linked list of mounted filesystems. */ |
119 | static struct mount_entry *mount_list; | 123 | static struct mount_entry *mount_list; |
@@ -169,28 +173,36 @@ main (int argc, char **argv) | |||
169 | struct fs_usage fsp; | 173 | struct fs_usage fsp; |
170 | char *disk; | 174 | char *disk; |
171 | 175 | ||
176 | mount_list = read_filesystem_list (0); | ||
177 | |||
172 | if (process_arguments (argc, argv) != OK) | 178 | if (process_arguments (argc, argv) != OK) |
173 | usage ("Could not parse arguments\n"); | 179 | usage ("Could not parse arguments\n"); |
174 | 180 | ||
175 | mount_list = read_filesystem_list (0); | ||
176 | |||
177 | for (me = mount_list; me; me = me->me_next) { | 181 | for (me = mount_list; me; me = me->me_next) { |
178 | get_fs_usage (me->me_mountdir, me->me_devname, &fsp); | 182 | |
183 | if ((dev_select_list && | ||
184 | ! strcmp (dev_select_list->name, me->me_devname)) || | ||
185 | (path_select_list && | ||
186 | ! strcmp (path_select_list->name, me->me_mountdir))) | ||
187 | get_fs_usage (me->me_mountdir, me->me_devname, &fsp); | ||
188 | else if (dev_select_list || path_select_list) | ||
189 | continue; | ||
190 | else | ||
191 | get_fs_usage (me->me_mountdir, me->me_devname, &fsp); | ||
192 | |||
179 | if (fsp.fsu_blocks && strcmp ("none", me->me_mountdir)) { | 193 | if (fsp.fsu_blocks && strcmp ("none", me->me_mountdir)) { |
180 | usp = (fsp.fsu_blocks - fsp.fsu_bavail) * 100 / fsp.fsu_blocks; | 194 | usp = (fsp.fsu_blocks - fsp.fsu_bavail) * 100 / fsp.fsu_blocks; |
181 | disk_result = check_disk (usp, fsp.fsu_bavail); | 195 | disk_result = check_disk (usp, fsp.fsu_bavail); |
182 | result = max_state (disk_result, result); | 196 | result = max_state (disk_result, result); |
183 | asprintf (&output, "%s %llu of %llu kB (%2.0f%%) free (%d-byte blocks) on %s (%s) %d\n", | 197 | asprintf (&output, "%s %llu of %llu MB (%2.0f%%) free on %s\n", |
184 | output, | 198 | output, |
185 | fsp.fsu_bavail*fsp.fsu_blocksize/1024, | 199 | fsp.fsu_bavail*fsp.fsu_blocksize/1024/1024, |
186 | fsp.fsu_blocks*fsp.fsu_blocksize/1024, | 200 | fsp.fsu_blocks*fsp.fsu_blocksize/1024/1024, |
187 | (double)fsp.fsu_bavail*100/fsp.fsu_blocks, | 201 | (double)fsp.fsu_bavail*100/fsp.fsu_blocks, |
188 | fsp.fsu_blocksize, | 202 | display_mntp ? me->me_devname : me->me_mountdir); |
189 | me->me_mountdir, | ||
190 | me->me_type, usp); | ||
191 | } | 203 | } |
192 | } | ||
193 | 204 | ||
205 | } | ||
194 | 206 | ||
195 | terminate (result, "DISK %s %s\n", state_text (result), output); | 207 | terminate (result, "DISK %s %s\n", state_text (result), output); |
196 | } | 208 | } |
@@ -200,6 +212,9 @@ int | |||
200 | process_arguments (int argc, char **argv) | 212 | process_arguments (int argc, char **argv) |
201 | { | 213 | { |
202 | int c; | 214 | int c; |
215 | struct name_list *se; | ||
216 | struct name_list **pathtail = &path_select_list; | ||
217 | struct name_list **devtail = &dev_select_list; | ||
203 | 218 | ||
204 | int option_index = 0; | 219 | int option_index = 0; |
205 | static struct option long_options[] = { | 220 | static struct option long_options[] = { |
@@ -213,6 +228,7 @@ process_arguments (int argc, char **argv) | |||
213 | {"errors-only", no_argument, 0, 'e'}, | 228 | {"errors-only", no_argument, 0, 'e'}, |
214 | {"help", no_argument, 0, 'h'}, | 229 | {"help", no_argument, 0, 'h'}, |
215 | {"mountpoint", no_argument, 0, 'm'}, | 230 | {"mountpoint", no_argument, 0, 'm'}, |
231 | {"device", no_argument, 0, 'd'}, | ||
216 | {"exclude_device", required_argument, 0, 'x'}, | 232 | {"exclude_device", required_argument, 0, 'x'}, |
217 | {"quiet", no_argument, 0, 'q'}, | 233 | {"quiet", no_argument, 0, 'q'}, |
218 | 234 | ||
@@ -227,7 +243,7 @@ process_arguments (int argc, char **argv) | |||
227 | strcpy (argv[c], "-t"); | 243 | strcpy (argv[c], "-t"); |
228 | 244 | ||
229 | while (1) { | 245 | while (1) { |
230 | c = getopt_long (argc, argv, "+?Vqhvet:c:w:p:x:m", long_options, &option_index); | 246 | c = getopt_long (argc, argv, "+?Vqhvet:c:w:p:d:x:m", long_options, &option_index); |
231 | 247 | ||
232 | if (c == -1 || c == EOF) | 248 | if (c == -1 || c == EOF) |
233 | break; | 249 | break; |
@@ -274,7 +290,16 @@ process_arguments (int argc, char **argv) | |||
274 | usage ("Timeout Interval must be an integer!\n"); | 290 | usage ("Timeout Interval must be an integer!\n"); |
275 | } | 291 | } |
276 | case 'p': /* path or partition */ | 292 | case 'p': /* path or partition */ |
277 | path = optarg; | 293 | se = (struct name_list *) malloc (sizeof (struct name_list)); |
294 | se->name = strdup (optarg); | ||
295 | *pathtail = se; | ||
296 | pathtail = &se->name_next; | ||
297 | break; | ||
298 | case 'd': /* path or partition */ | ||
299 | se = (struct name_list *) malloc (sizeof (struct name_list)); | ||
300 | se->name = strdup (optarg); | ||
301 | *devtail = se; | ||
302 | devtail = &se->name_next; | ||
278 | break; | 303 | break; |
279 | case 'v': /* verbose */ | 304 | case 'v': /* verbose */ |
280 | verbose++; | 305 | verbose++; |