// SPDX-License-Identifier: GPL-2.0 /* * Copyright (c) 2004-2005 Silicon Graphics, Inc. * Copyright (c) 2012 Red Hat, Inc. * All Rights Reserved. */ #include "libxfs.h" #include #include "command.h" #include "input.h" #include "init.h" #include "libfrog/logging.h" #include "libfrog/paths.h" #include "libfrog/fsgeom.h" #include "space.h" static cmdinfo_t print_cmd; struct fileio *filetable; int filecount; struct fileio *file; static void print_fileio( struct fileio *file, int index, int braces) { printf(_("%c%03d%c %-14s\n"), braces? '[' : ' ', index, braces? ']' : ' ', file->name); } static int print_f( int argc, char **argv) { int i; for (i = 0; i < filecount; i++) print_fileio(&filetable[i], i, &filetable[i] == file); return 0; } int openfile( char *path, struct xfs_fd *xfd, struct fs_path *fs_path) { struct fs_path *fsp; int ret; ret = -xfd_open(xfd, path, O_RDONLY); if (ret) { if (ret == ENOTTY) fprintf(stderr, _("%s: Not on a mounted XFS filesystem.\n"), path); else xfrog_perror(ret, path); return -1; } fsp = fs_table_lookup(path, FS_MOUNT_POINT); if (!fsp) { fprintf(stderr, _("%s: cannot find mount point."), path); xfd_close(xfd); return -1; } memcpy(fs_path, fsp, sizeof(struct fs_path)); return xfd->fd; } int addfile( char *name, struct xfs_fd *xfd, struct fs_path *fs_path) { char *filename; filename = strdup(name); if (!filename) { perror("strdup"); xfd_close(xfd); return -1; } /* Extend the table of currently open files */ filetable = (struct fileio *)realloc(filetable, /* growing */ ++filecount * sizeof(struct fileio)); if (!filetable) { perror("realloc"); filecount = 0; free(filename); xfd_close(xfd); return -1; } /* Finally, make this the new active open file */ file = &filetable[filecount - 1]; file->name = filename; memcpy(&file->xfd, xfd, sizeof(struct xfs_fd)); memcpy(&file->fs_path, fs_path, sizeof(file->fs_path)); return 0; } void print_init(void) { print_cmd.name = "print"; print_cmd.altname = "p"; print_cmd.cfunc = print_f; print_cmd.argmin = 0; print_cmd.argmax = 0; print_cmd.flags = CMD_FLAG_ONESHOT; print_cmd.oneline = _("list current open files"); add_command(&print_cmd); }