static INT64_T do_statfs(int argc, char **argv) { struct chirp_statfs info; int metric_power = -1; if(argc > 1) { if(!strcmp(argv[1], "-k")) { metric_power = 1; } else if(!strcmp(argv[1], "-m")) { metric_power = 2; } else if(!strcmp(argv[1], "-g")) { metric_power = 3; } else if(!strcmp(argv[1], "-t")) { metric_power = 4; } else { errno = EINVAL; return -1; } } if(chirp_reli_statfs(current_host, "/", &info, stoptime) < 0) { return -1; } else { printf("/\n"); printf("%sB TOTAL\n", string_metric(info.f_blocks * info.f_bsize, metric_power, 0)); printf("%sB INUSE\n", string_metric((info.f_blocks - info.f_bfree) * info.f_bsize, metric_power, 0)); return 0; } }
INT64_T chirp_global_statfs(const char *host, const char *path, struct chirp_statfs * buf, time_t stoptime) { if(is_multi_path(host)) { char mhost[CHIRP_PATH_MAX]; char mpath[CHIRP_PATH_MAX]; parse_multi_path(path, mhost, mpath); return chirp_multi_statfs(mhost, mpath, buf, stoptime); } else if(not_empty(path)) { return chirp_reli_statfs(host, path, buf, stoptime); } else if(not_empty(host)) { return chirp_reli_statfs(host, "/", buf, stoptime); } else { memset(buf, 0, sizeof(*buf)); return 0; } }
INT64_T chirp_multi_statfs(const char *volume, const char *path, struct chirp_statfs * buf, time_t stoptime) { struct chirp_server *s; INT64_T files_total = 0; INT64_T bytes_avail = 0; INT64_T bytes_free = 0; INT64_T bytes_total = 0; INT64_T files_free = 0; INT64_T block_size = 4096; int i; if(!chirp_multi_init(volume, stoptime)) return 0; for(i = 0; i < current_volume->nservers; i++) { s = current_volume->servers[i]; struct chirp_statfs tmp; int result; result = chirp_reli_statfs(s->name, "/", &tmp, stoptime); if(result < 0) return result; bytes_total += tmp.f_blocks * (INT64_T) tmp.f_bsize; bytes_avail += tmp.f_bavail * (INT64_T) tmp.f_bsize; bytes_free += tmp.f_bfree * (INT64_T) tmp.f_bsize; files_total += tmp.f_files; files_free += tmp.f_ffree; } memset(buf, 0, sizeof(*buf)); buf->f_bsize = block_size; buf->f_blocks = bytes_total / block_size; buf->f_bavail = bytes_avail / block_size; buf->f_bfree = bytes_free / block_size; buf->f_files = files_total; buf->f_ffree = files_total; return 0; }