/* * Given information returned from statfs(2) either create a new entry into * the fs_tbl or refresh the entry if it is already there. */ void fs_tbl_process_statfs_entry(const struct statfs *fs_p, int32_t storage_idx) { struct fs_entry *entry; assert(fs_p != 0); HRDBG("for hrStorageEntry::index %d", storage_idx); if (fs_p == NULL) return; if ((entry = fs_find_by_name(fs_p->f_mntonname)) != NULL || (entry = fs_entry_create(fs_p->f_mntonname)) != NULL) { entry->flags |= HR_FS_FOUND; if (!(fs_p->f_flags & MNT_LOCAL)) { /* this is a remote mount */ entry->remoteMountPoint = strdup(fs_p->f_mntfromname); /* if strdup failed, let it be NULL */ } else { entry->remoteMountPoint = strdup(""); /* if strdup failed, let it be NULL */ } entry->type = fs_get_type(fs_p); if ((fs_p->f_flags & MNT_RDONLY) == MNT_RDONLY) entry->access = FS_READ_ONLY; else entry->access = FS_READ_WRITE; /* FIXME - bootable fs ?! */ entry->bootable = TRUTH_MK((fs_p->f_flags & MNT_ROOTFS) == MNT_ROOTFS); entry->storageIndex = storage_idx; /* Info not available */ memset(entry->lastFullBackupDate, 0, sizeof(entry->lastFullBackupDate)); /* Info not available */ memset(entry->lastPartialBackupDate, 0, sizeof(entry->lastPartialBackupDate)); handle_partition_fs_index(fs_p->f_mntfromname, entry->index); } }
/** * Query the underlaying OS for the mounted file systems * anf fill in the respective lists (for hrStorageTable and for hrFSTable) */ static void storage_OS_get_fs(void) { struct storage_entry *entry; uint64_t size, used; int i, mounted_fs_count, units; char fs_string[SE_DESC_MLEN]; if ((mounted_fs_count = getfsstat(NULL, 0, MNT_NOWAIT)) < 0) { syslog(LOG_ERR, "hrStorageTable: getfsstat() failed: %m"); return; /* out of luck this time */ } if (mounted_fs_count != (int)fs_buf_count || fs_buf == NULL) { fs_buf_count = mounted_fs_count; fs_buf = reallocf(fs_buf, fs_buf_count * sizeof(struct statfs)); if (fs_buf == NULL) { fs_buf_count = 0; assert(0); return; } } if ((mounted_fs_count = getfsstat(fs_buf, fs_buf_count * sizeof(struct statfs), MNT_NOWAIT)) < 0) { syslog(LOG_ERR, "hrStorageTable: getfsstat() failed: %m"); return; /* out of luck this time */ } HRDBG("got %d mounted FS", mounted_fs_count); fs_tbl_pre_refresh(); for (i = 0; i < mounted_fs_count; i++) { snprintf(fs_string, sizeof(fs_string), "%s, type: %s, dev: %s", fs_buf[i].f_mntonname, fs_buf[i].f_fstypename, fs_buf[i].f_mntfromname); entry = storage_find_by_name(fs_string); if (entry == NULL) entry = storage_entry_create(fs_string); assert (entry != NULL); if (entry == NULL) return; /* Out of luck */ entry->flags |= HR_STORAGE_FOUND; entry->type = fs_get_type(&fs_buf[i]); /*XXX - This is wrong*/ units = fs_buf[i].f_bsize; size = fs_buf[i].f_blocks; used = fs_buf[i].f_blocks - fs_buf[i].f_bfree; while (size > INT_MAX) { units <<= 1; size >>= 1; used >>= 1; } entry->allocationUnits = units; entry->size = size; entry->used = used; entry->allocationFailures = 0; /* take care of hrFSTable */ fs_tbl_process_statfs_entry(&fs_buf[i], entry->index); } fs_tbl_post_refresh(); }