]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blob - spaceman/file.c
xfs: use ->t_firstblock in attrfork add
[thirdparty/xfsprogs-dev.git] / spaceman / file.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (c) 2004-2005 Silicon Graphics, Inc.
4 * Copyright (c) 2012 Red Hat, Inc.
5 * All Rights Reserved.
6 */
7
8 #include "libxfs.h"
9 #include <sys/mman.h>
10 #include "command.h"
11 #include "input.h"
12 #include "init.h"
13 #include "path.h"
14 #include "space.h"
15
16 static cmdinfo_t print_cmd;
17
18 fileio_t *filetable;
19 int filecount;
20 fileio_t *file;
21
22 static void
23 print_fileio(
24 fileio_t *file,
25 int index,
26 int braces)
27 {
28 printf(_("%c%03d%c %-14s\n"), braces? '[' : ' ', index,
29 braces? ']' : ' ', file->name);
30 }
31
32 static int
33 print_f(
34 int argc,
35 char **argv)
36 {
37 int i;
38
39 for (i = 0; i < filecount; i++)
40 print_fileio(&filetable[i], i, &filetable[i] == file);
41 return 0;
42 }
43
44 int
45 openfile(
46 char *path,
47 xfs_fsop_geom_t *geom,
48 struct fs_path *fs_path)
49 {
50 struct fs_path *fsp;
51 int fd;
52
53 fd = open(path, 0);
54 if (fd < 0) {
55 perror(path);
56 return -1;
57 }
58
59 if (ioctl(fd, XFS_IOC_FSGEOMETRY, geom) < 0) {
60 if (errno == ENOTTY)
61 fprintf(stderr,
62 _("%s: Not on a mounted XFS filesystem.\n"),
63 path);
64 else
65 perror("XFS_IOC_FSGEOMETRY");
66 close(fd);
67 return -1;
68 }
69
70 if (fs_path) {
71 fsp = fs_table_lookup(path, FS_MOUNT_POINT);
72 if (!fsp) {
73 fprintf(stderr, _("%s: cannot find mount point."),
74 path);
75 close(fd);
76 return -1;
77 }
78 memcpy(fs_path, fsp, sizeof(struct fs_path));
79 }
80 return fd;
81 }
82
83 int
84 addfile(
85 char *name,
86 int fd,
87 xfs_fsop_geom_t *geometry,
88 struct fs_path *fs_path)
89 {
90 char *filename;
91
92 filename = strdup(name);
93 if (!filename) {
94 perror("strdup");
95 close(fd);
96 return -1;
97 }
98
99 /* Extend the table of currently open files */
100 filetable = (fileio_t *)realloc(filetable, /* growing */
101 ++filecount * sizeof(fileio_t));
102 if (!filetable) {
103 perror("realloc");
104 filecount = 0;
105 free(filename);
106 close(fd);
107 return -1;
108 }
109
110 /* Finally, make this the new active open file */
111 file = &filetable[filecount - 1];
112 file->fd = fd;
113 file->name = filename;
114 file->geom = *geometry;
115 memcpy(&file->fs_path, fs_path, sizeof(file->fs_path));
116 return 0;
117 }
118
119 void
120 print_init(void)
121 {
122 print_cmd.name = "print";
123 print_cmd.altname = "p";
124 print_cmd.cfunc = print_f;
125 print_cmd.argmin = 0;
126 print_cmd.argmax = 0;
127 print_cmd.flags = CMD_FLAG_ONESHOT;
128 print_cmd.oneline = _("list current open files");
129
130 add_command(&print_cmd);
131 }