static int mount_local_statfs (const char *path, struct statvfs *stbuf) { CLEANUP_FREE_STATVFS struct guestfs_statvfs *r; DECL_G (); DEBUG_CALL ("%s, %p", path, stbuf); r = guestfs_statvfs (g, path); if (r == NULL) RETURN_ERRNO; stbuf->f_bsize = r->bsize; stbuf->f_frsize = r->frsize; stbuf->f_blocks = r->blocks; stbuf->f_bfree = r->bfree; stbuf->f_bavail = r->bavail; stbuf->f_files = r->files; stbuf->f_ffree = r->ffree; stbuf->f_favail = r->favail; stbuf->f_fsid = r->fsid; stbuf->f_flag = r->flag; stbuf->f_namemax = r->namemax; return 0; }
static int fg_statfs (const char *path, struct statvfs *stbuf) { TRACE_CALL ("%s, %p", path, stbuf); struct guestfs_statvfs *r; r = guestfs_statvfs (g, path); if (r == NULL) return error (); stbuf->f_bsize = r->bsize; stbuf->f_frsize = r->frsize; stbuf->f_blocks = r->blocks; stbuf->f_bfree = r->bfree; stbuf->f_bavail = r->bavail; stbuf->f_files = r->files; stbuf->f_ffree = r->ffree; stbuf->f_favail = r->favail; stbuf->f_fsid = r->fsid; stbuf->f_flag = r->flag; stbuf->f_namemax = r->namemax; guestfs_free_statvfs (r); return 0; }
static void try_df (const char *name, const char *uuid, const char *dev, int offset) { struct guestfs_statvfs *stat = NULL; guestfs_error_handler_cb old_error_cb; void *old_error_data; if (verbose) fprintf (stderr, "try_df %s %s %d\n", name, dev, offset); /* Try mounting and stating the device. This might reasonably fail, * so don't show errors. */ old_error_cb = guestfs_get_error_handler (g, &old_error_data); guestfs_set_error_handler (g, NULL, NULL); if (guestfs_mount_ro (g, dev, "/") == 0) { stat = guestfs_statvfs (g, "/"); guestfs_umount_all (g); } guestfs_set_error_handler (g, old_error_cb, old_error_data); if (stat) { print_stat (name, uuid, dev, offset, stat); guestfs_free_statvfs (stat); } }
/* Since we want this function to be robust against very bad failure * cases (hello, https://bugzilla.kernel.org/show_bug.cgi?id=18792) it * won't exit on guestfs failures. */ int df_on_handle (guestfs_h *g, const char *name, const char *uuid, FILE *fp) { size_t i; CLEANUP_FREE_STRING_LIST char **devices = NULL; CLEANUP_FREE_STRING_LIST char **fses = NULL; if (verbose) fprintf (stderr, "df_on_handle: %s\n", name); devices = guestfs_list_devices (g); if (devices == NULL) return -1; fses = guestfs_list_filesystems (g); if (fses == NULL) return -1; for (i = 0; fses[i] != NULL; i += 2) { if (STRNEQ (fses[i+1], "") && STRNEQ (fses[i+1], "swap") && STRNEQ (fses[i+1], "unknown")) { const char *dev = fses[i]; CLEANUP_FREE_STATVFS struct guestfs_statvfs *stat = NULL; if (verbose) fprintf (stderr, "df_on_handle: %s dev %s\n", name, dev); /* Try mounting and stating the device. This might reasonably * fail, so don't show errors. */ guestfs_push_error_handler (g, NULL, NULL); if (guestfs_mount_ro (g, dev, "/") == 0) { stat = guestfs_statvfs (g, "/"); guestfs_umount_all (g); } guestfs_pop_error_handler (g); if (stat) print_stat (fp, name, uuid, dev, stat); } } return 0; }
/* For debugging, print statvfs before and after doing the tar-in. */ static void print_stats (guestfs_h *g, const char *before_or_after) { if (!verbose) return; CLEANUP_FREE_STATVFS struct guestfs_statvfs *stats = guestfs_statvfs (g, "/"); if (stats) { fprintf (stderr, "%s uploading:\n", before_or_after); fprintf (stderr, " bsize = %" PRIi64 "\n", stats->bsize); fprintf (stderr, " frsize = %" PRIi64 "\n", stats->frsize); fprintf (stderr, " blocks = %" PRIi64 "\n", stats->blocks); fprintf (stderr, " bfree = %" PRIi64 "\n", stats->bfree); fprintf (stderr, " bavail = %" PRIi64 "\n", stats->bavail); fprintf (stderr, " files = %" PRIi64 "\n", stats->files); fprintf (stderr, " ffree = %" PRIi64 "\n", stats->ffree); fprintf (stderr, " favail = %" PRIi64 "\n", stats->favail); fprintf (stderr, " fsid = %" PRIi64 "\n", stats->fsid); fprintf (stderr, " flag = %" PRIi64 "\n", stats->flag); fprintf (stderr, " namemax = %" PRIi64 "\n", stats->namemax); } }