int main(int argc, char *argv[]) { xfs_mount_t *mp; xfs_inode_t *inode = NULL; char *progname; char *source_name; char *parent; int r; if (argc != 3) { printf("Usage: xfs-rcopy raw_device directory\n"); printf("Copies the named directory from an XFS file system to the current directory\n"); return 1; } progname = argv[0]; source_name = argv[1]; parent = argv[2]; mp = mount_xfs(progname, source_name); if (mp == NULL) return 1; r = find_path(mp, parent, &inode); if (r) { printf("Can't find %s\n", parent); libxfs_umount(mp); return 1; } copy_tree(mp, parent, last(parent), inode); libxfs_iput(inode, 0); libxfs_umount(mp); return 0; }
int main(int argc, char **argv) { int bl; int dl; int dv; int i; int il; xfs_mount_t m; xfs_sb_t *sbp; int mul; progname = argv[0]; if (argc > 1) { fprintf(stderr, "Usage: %s\n", progname); return 1; } memset(&m, 0, sizeof(m)); sbp = &m.m_sb; sbp->sb_magicnum = XFS_SB_MAGIC; sbp->sb_sectlog = 9; sbp->sb_sectsize = 1 << sbp->sb_sectlog; for (bl = XFS_MIN_BLOCKSIZE_LOG; bl <= XFS_MAX_BLOCKSIZE_LOG; bl++) { sbp->sb_blocklog = bl; sbp->sb_blocksize = 1 << bl; sbp->sb_agblocks = XFS_AG_MIN_BYTES / (1 << bl); for (il = XFS_DINODE_MIN_LOG; il <= XFS_DINODE_MAX_LOG; il++) { if ((1 << il) > (1 << bl) / XFS_MIN_INODE_PERBLOCK) continue; sbp->sb_inodelog = il; sbp->sb_inopblog = bl - il; sbp->sb_inodesize = 1 << il; sbp->sb_inopblock = 1 << (bl - il); for (dl = bl; dl <= XFS_MAX_BLOCKSIZE_LOG; dl++) { sbp->sb_dirblklog = dl - bl; for (dv = 1; dv <= 2; dv++) { if (dv == 1 && dl != bl) continue; sbp->sb_versionnum = XFS_SB_VERSION_4 | (dv == 2 ? XFS_SB_VERSION_DIRV2BIT : 0); libxfs_mount(&m, sbp, 0, 0, 0, 0); i = max_trans_res(&m, &mul); printf( "#define\tMAXTRRES_B%d_I%d_D%d_V%d\t%lld\t" "/* LOG_FACTOR %d */\n", bl, il, dl, dv, XFS_B_TO_FSB(&m, i), mul); libxfs_umount(&m); } } } } return 0; }
void fuse_xfs_destroy(void *userdata) { libxfs_umount(fuse_xfs_mp); }
int main(int argc, char *argv[]) { xfs_mount_t *mp; xfs_inode_t *inode = NULL; xfs_off_t ofs; struct filldir_data filldata; char *progname; char *source_name; int r, fd; char *line; char path[FILENAME_MAX] = "/"; char newpath[FILENAME_MAX] = "/"; char *buffer[BUFSIZE]; off_t offset; if (argc != 2) { printf("Usage: xfs-cli raw_device\n"); return 1; } progname = argv[0]; source_name = argv[1]; mp = mount_xfs(progname, source_name); if (mp == NULL) return 1; while (line == fetchline(mp, path)) { inode = NULL; strip(line, ' '); if (strncmp(line, "cd ", 3) == 0) { if (strcmp(line+3, "..") == 0) { goto_parent(path); } else { strcpy(newpath, path); strcat(newpath, line+3); r = find_path(mp, newpath, &inode); if ((!r) && (xfs_is_dir(inode))) { //TODO: check if it is a directory strcpy(path, newpath); strcat(path, "/"); printf("%s\n", path); } else { if (r) { printf("No such directory\n"); } else { printf("Not a directory\n"); } } } } else if (strcmp(line, "ls") == 0) { r = find_path(mp, path, &inode); if (!r) { //TODO: check if it is a directory ofs=0; filldata.mp = mp; filldata.base = inode; r = xfs_readdir(inode, (void *)&filldata, 102400, &ofs, cli_ls_xfs_filldir); if (r != 0) { printf("Not a directory\n"); } } else { printf("No such directory\n"); } } else if (strncmp(line, "cat ", 4) == 0) { strcpy(newpath, path); strcat(newpath, line+4); r = find_path(mp, newpath, &inode); if (r) printf("File not found\n"); else if (xfs_is_regular(inode)) { //TODO: check if it is a file r = 10; offset = 0; while (r) { r = xfs_readfile(inode, buffer, offset, BUFSIZE, NULL); if (r) { write(1, buffer, r); offset += r; } } } else if (xfs_is_link(inode)) { r = 10; offset = 0; while (r) { r = xfs_readlink(inode, buffer, offset, BUFSIZE, NULL); if (r) { write(1, buffer, r); offset += r; } } } else { printf("Not a regular file\n"); } } else if (strncmp(line, "get ", 4) == 0) { strcpy(newpath, path); strcat(newpath, line+4); r = find_path(mp, newpath, &inode); if ((!r) && (xfs_is_regular(inode))) { //TODO: check if it is a file r = 10; offset = 0; fd = open(line+4, O_WRONLY|O_CREAT, 0660); if (fd < 0) { printf("Failed to open local file\n"); } else { while (r) { r = xfs_readfile(inode, buffer, offset, BUFSIZE, NULL); if (r) { write(fd, buffer, r); offset += r; } } close(fd); printf("Retrieved %ld bytes\n", offset); } } else { if (r) printf("File not found\n"); else printf("Not a regular file\n"); } } else if (strcmp(line, "exit") == 0) { libxfs_umount(mp); return 0; } else if (strcmp(line, "pwd") == 0) { printf("%s\n", path); } else { printf("Unknown command\n"); } free(line); if (inode) { libxfs_iput(inode, 0); } } libxfs_umount(mp); return 0; }