diff options
Diffstat (limited to 'plugins/check_disk.c')
-rw-r--r-- | plugins/check_disk.c | 71 |
1 files changed, 40 insertions, 31 deletions
diff --git a/plugins/check_disk.c b/plugins/check_disk.c index b966fab..e7a3b21 100644 --- a/plugins/check_disk.c +++ b/plugins/check_disk.c | |||
@@ -121,6 +121,7 @@ void print_path (const char *mypath); | |||
121 | int validate_arguments (uintmax_t, uintmax_t, double, double, double, double, char *); | 121 | int validate_arguments (uintmax_t, uintmax_t, double, double, double, double, char *); |
122 | void print_help (void); | 122 | void print_help (void); |
123 | void print_usage (void); | 123 | void print_usage (void); |
124 | double calculate_percent(uintmax_t, uintmax_t); | ||
124 | 125 | ||
125 | double w_dfp = -1.0; | 126 | double w_dfp = -1.0; |
126 | double c_dfp = -1.0; | 127 | double c_dfp = -1.0; |
@@ -152,7 +153,7 @@ main (int argc, char **argv) | |||
152 | char *output; | 153 | char *output; |
153 | char *details; | 154 | char *details; |
154 | char *perf; | 155 | char *perf; |
155 | float inode_space_pct; | 156 | double inode_space_pct; |
156 | uintmax_t total, available, available_to_root, used; | 157 | uintmax_t total, available, available_to_root, used; |
157 | double dfree_pct = -1, dused_pct = -1; | 158 | double dfree_pct = -1, dused_pct = -1; |
158 | double dused_units, dfree_units, dtotal_units; | 159 | double dused_units, dfree_units, dtotal_units; |
@@ -239,32 +240,13 @@ main (int argc, char **argv) | |||
239 | available_to_root = fsp.fsu_bfree; | 240 | available_to_root = fsp.fsu_bfree; |
240 | used = total - available_to_root; | 241 | used = total - available_to_root; |
241 | 242 | ||
242 | /* I don't understand the below, but it is taken from coreutils' df */ | 243 | dused_pct = calculate_percent( used, used + available ); /* used + available can never be > uintmax */ |
243 | /* Is setting dused_pct, in the best possible way */ | 244 | |
244 | if (used <= TYPE_MAXIMUM(uintmax_t) / 100) { | ||
245 | uintmax_t u100 = used * 100; | ||
246 | uintmax_t nonroot_total = used + available; | ||
247 | dused_pct = u100 / nonroot_total + (u100 % nonroot_total != 0); | ||
248 | } else { | ||
249 | /* Possible rounding errors - see coreutils' df for more explanation */ | ||
250 | double u = used; | ||
251 | double a = available; | ||
252 | double nonroot_total = u + a; | ||
253 | if (nonroot_total) { | ||
254 | long int lipct = dused_pct = u * 100 / nonroot_total; | ||
255 | double ipct = lipct; | ||
256 | |||
257 | /* Like 'pct = ceil (dpct);', but without ceil - from coreutils again */ | ||
258 | if (ipct - 1 < dused_pct && dused_pct <= ipct + 1) | ||
259 | dused_pct = ipct + (ipct < dused_pct); | ||
260 | } | ||
261 | } | ||
262 | |||
263 | dfree_pct = 100 - dused_pct; | 245 | dfree_pct = 100 - dused_pct; |
264 | dused_units = used*fsp.fsu_blocksize/mult; | 246 | dused_units = used*fsp.fsu_blocksize/mult; |
265 | dfree_units = available*fsp.fsu_blocksize/mult; | 247 | dfree_units = available*fsp.fsu_blocksize/mult; |
266 | dtotal_units = total*fsp.fsu_blocksize/mult; | 248 | dtotal_units = total*fsp.fsu_blocksize/mult; |
267 | dused_inodes_percent = (fsp.fsu_files - fsp.fsu_ffree) * 100 / fsp.fsu_files; | 249 | dused_inodes_percent = calculate_percent(fsp.fsu_files - fsp.fsu_ffree, fsp.fsu_files); |
268 | 250 | ||
269 | if (verbose >= 3) { | 251 | if (verbose >= 3) { |
270 | printf ("For %s, used_pct=%g free_pct=%g used_units=%g free_units=%g total_units=%g used_inodes_pct=%g\n", | 252 | printf ("For %s, used_pct=%g free_pct=%g used_units=%g free_units=%g total_units=%g used_inodes_pct=%g\n", |
@@ -297,9 +279,9 @@ main (int argc, char **argv) | |||
297 | 279 | ||
298 | 280 | ||
299 | 281 | ||
300 | /* Moved this computation up here so we can add it | 282 | /* Moved this computation up here so we can add it |
301 | * to perf */ | 283 | * to perf */ |
302 | inode_space_pct = (float)fsp.fsu_ffree*100/fsp.fsu_files; | 284 | inode_space_pct = (1 - dused_inodes_percent) * 100; |
303 | 285 | ||
304 | 286 | ||
305 | asprintf (&perf, "%s %s", perf, | 287 | asprintf (&perf, "%s %s", perf, |
@@ -307,23 +289,27 @@ main (int argc, char **argv) | |||
307 | dused_units, units, | 289 | dused_units, units, |
308 | FALSE, 0, /* min ((uintmax_t)dtotal_units-(uintmax_t)w_df, (uintmax_t)((1.0-w_dfp/100.0)*dtotal_units)), */ | 290 | FALSE, 0, /* min ((uintmax_t)dtotal_units-(uintmax_t)w_df, (uintmax_t)((1.0-w_dfp/100.0)*dtotal_units)), */ |
309 | FALSE, 0, /* min ((uintmax_t)dtotal_units-(uintmax_t)c_df, (uintmax_t)((1.0-c_dfp/100.0)*dtotal_units)), */ | 291 | FALSE, 0, /* min ((uintmax_t)dtotal_units-(uintmax_t)c_df, (uintmax_t)((1.0-c_dfp/100.0)*dtotal_units)), */ |
310 | FALSE, 0, /* inode_space_pct, */ | 292 | FALSE, 0, /* inode_space_pct - this is not meant to be here???, */ |
311 | FALSE, 0));; /* dtotal_units)); */ | 293 | FALSE, 0));; /* dtotal_units)); */ |
312 | 294 | ||
313 | if (disk_result==STATE_OK && erronly && !verbose) | 295 | if (disk_result==STATE_OK && erronly && !verbose) |
314 | continue; | 296 | continue; |
315 | 297 | ||
316 | if (disk_result!=STATE_OK || verbose>=0) { | 298 | if (disk_result!=STATE_OK || verbose>=0) { |
317 | asprintf (&output, ("%s %s %.0f %s (%.0f%% inode=%.0f%%);"), | 299 | asprintf (&output, "%s %s %.0f %s (%.0f%%", |
318 | output, | 300 | output, |
319 | (!strcmp(me->me_mountdir, "none") || display_mntp) ? me->me_devname : me->me_mountdir, | 301 | (!strcmp(me->me_mountdir, "none") || display_mntp) ? me->me_devname : me->me_mountdir, |
320 | dfree_units, | 302 | dfree_units, |
321 | units, | 303 | units, |
322 | dfree_pct, | 304 | dfree_pct); |
323 | inode_space_pct); | 305 | if (dused_inodes_percent < 0) { |
306 | asprintf(&output, "%s inode=-);", output); | ||
307 | } else { | ||
308 | asprintf(&output, "%s inode=%.0f%%);", output, (1 - dused_inodes_percent) * 100); | ||
309 | } | ||
324 | } | 310 | } |
325 | 311 | ||
326 | /* Need to do a similar one | 312 | /* TODO: Need to do a similar debug line |
327 | asprintf (&details, _("%s\n\ | 313 | asprintf (&details, _("%s\n\ |
328 | %.0f of %.0f %s (%.0f%% inode=%.0f%%) free on %s (type %s mounted on %s) warn:%lu crit:%lu warn%%:%.0f%% crit%%:%.0f%%"), | 314 | %.0f of %.0f %s (%.0f%% inode=%.0f%%) free on %s (type %s mounted on %s) warn:%lu crit:%lu warn%%:%.0f%% crit%%:%.0f%%"), |
329 | details, dfree_units, dtotal_units, units, dfree_pct, inode_space_pct, | 315 | details, dfree_units, dtotal_units, units, dfree_pct, inode_space_pct, |
@@ -344,6 +330,29 @@ main (int argc, char **argv) | |||
344 | } | 330 | } |
345 | 331 | ||
346 | 332 | ||
333 | double calculate_percent(uintmax_t value, uintmax_t total) { | ||
334 | double pct = -1; | ||
335 | /* I don't understand the below, but it is taken from coreutils' df */ | ||
336 | /* Seems to be calculating pct, in the best possible way */ | ||
337 | if (value <= TYPE_MAXIMUM(uintmax_t) / 100 | ||
338 | && total != 0) { | ||
339 | uintmax_t u100 = value * 100; | ||
340 | pct = u100 / total + (u100 % total != 0); | ||
341 | } else { | ||
342 | /* Possible rounding errors - see coreutils' df for more explanation */ | ||
343 | double u = value; | ||
344 | double t = total; | ||
345 | if (t) { | ||
346 | long int lipct = pct = u * 100 / t; | ||
347 | double ipct = lipct; | ||
348 | |||
349 | /* Like 'pct = ceil (dpct);', but without ceil - from coreutils again */ | ||
350 | if (ipct - 1 < pct && pct <= ipct + 1) | ||
351 | pct = ipct + (ipct < pct); | ||
352 | } | ||
353 | } | ||
354 | return pct; | ||
355 | } | ||
347 | 356 | ||
348 | /* process command-line arguments */ | 357 | /* process command-line arguments */ |
349 | int | 358 | int |