static fssh_status_t command_info(int argc, const char* const* argv) { fssh_dev_t volumeID = get_volume_id(); if (volumeID < 0) return volumeID; fssh_fs_info info; fssh_status_t status = _kern_read_fs_info(volumeID, &info); if (status != FSSH_B_OK) return status; printf("root inode: %" FSSH_B_PRIdINO "\n", info.root); printf("flags: "); print_flag(info.flags, FSSH_B_FS_HAS_QUERY, "Q", "-"); print_flag(info.flags, FSSH_B_FS_HAS_ATTR, "A", "-"); print_flag(info.flags, FSSH_B_FS_HAS_MIME, "M", "-"); print_flag(info.flags, FSSH_B_FS_IS_SHARED, "S", "-"); print_flag(info.flags, FSSH_B_FS_IS_PERSISTENT, "P", "-"); print_flag(info.flags, FSSH_B_FS_IS_REMOVABLE, "R", "-"); print_flag(info.flags, FSSH_B_FS_IS_READONLY, "-", "W"); printf("\nblock size: %" FSSH_B_PRIdOFF "\n", info.block_size); printf("I/O size: %" FSSH_B_PRIdOFF "\n", info.io_size); printf("total size: %s (%" FSSH_B_PRIdOFF " blocks)\n", byte_string(info.total_blocks, info.block_size), info.total_blocks); printf("free size: %s (%" FSSH_B_PRIdOFF " blocks)\n", byte_string(info.free_blocks, info.block_size), info.free_blocks); printf("total nodes: %" FSSH_B_PRIdOFF "\n", info.total_nodes); printf("free nodes: %" FSSH_B_PRIdOFF "\n", info.free_nodes); printf("volume name: %s\n", info.volume_name); printf("fs name: %s\n", info.fsh_name); return FSSH_B_OK; }
static fssh_status_t command_mkindex(int argc, const char* const* argv) { if (argc != 2) { fprintf(stderr, "Usage: %s <index name>\n", argv[0]); return FSSH_B_BAD_VALUE; } const char* indexName = argv[1]; // get the volume ID fssh_dev_t volumeID = get_volume_id(); if (volumeID < 0) return volumeID; // create the index fssh_status_t error =_kern_create_index(volumeID, indexName, FSSH_B_STRING_TYPE, 0); if (error != FSSH_B_OK) { fprintf(stderr, "Error: Failed to create index \"%s\": %s\n", indexName, fssh_strerror(error)); return error; } return FSSH_B_OK; }
static fssh_status_t command_query(int argc, const char* const* argv) { if (argc != 2) { fprintf(stderr, "Usage: %s <query string>\n", argv[0]); return FSSH_B_BAD_VALUE; } const char* query = argv[1]; // get the volume ID fssh_dev_t volumeID = get_volume_id(); if (volumeID < 0) return volumeID; // open query int fd = _kern_open_query(volumeID, query, strlen(query), 0, -1, -1); if (fd < 0) { fprintf(stderr, "Error: Failed to open query: %s\n", fssh_strerror(fd)); return fd; } // iterate through the entries fssh_status_t error = FSSH_B_OK; char buffer[sizeof(fssh_dirent) + FSSH_B_FILE_NAME_LENGTH]; fssh_dirent* entry = (fssh_dirent*)buffer; fssh_ssize_t entriesRead = 0; while ((entriesRead = _kern_read_dir(fd, entry, sizeof(buffer), 1)) == 1) { char path[FSSH_B_PATH_NAME_LENGTH]; error = _kern_entry_ref_to_path(volumeID, entry->d_pino, entry->d_name, path, sizeof(path)); if (error == FSSH_B_OK) { printf(" %s\n", path); } else { fprintf(stderr, " failed to resolve entry (%8" FSSH_B_PRIdINO ", \"%s\")\n", entry->d_pino, entry->d_name); } } if (entriesRead < 0) { fprintf(stderr, "Error: reading query failed: %s\n", fssh_strerror(entriesRead)); } // close query error = _kern_close(fd); if (error != FSSH_B_OK) { fprintf(stderr, "Error: Closing query (fd: %d) failed: %s\n", fd, fssh_strerror(error)); } return error; }
struct fssh_stat st; fssh_status_t error = _kern_read_stat(-1, kMountPoint, false, &st, sizeof(st)); if (error != FSSH_B_OK) return error; return st.fssh_st_dev; } static int fuse_statfs(const char *path __attribute__((unused)), struct statvfs *sfs) { PRINTD("##statfs\n"); fssh_dev_t volumeID = get_volume_id(); if (volumeID < 0) return _ERR(volumeID); fssh_fs_info info; fssh_status_t status = _kern_read_fs_info(volumeID, &info); if (status != FSSH_B_OK) return _ERR(status); sfs->f_bsize = sfs->f_frsize = info.block_size; sfs->f_blocks = info.total_blocks; sfs->f_bavail = sfs->f_bfree = info.free_blocks; return 0; }