2 * Copyright (c) 2000-2001 Silicon Graphics, Inc.
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it would be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write the Free Software Foundation,
16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
28 /*---------------------------------------------------------------------------
30 Test program used to test the DMAPI function dm_probe_hole(). The
33 probe_hole [-o offset] [-l length] [-s sid] pathname
35 where pathname is the name of a file, offset is the offset of the start of
36 the proposed punch, and length is the length of the punch. sid is the
37 session ID whose events you you are interested in.
39 ----------------------------------------------------------------------------*/
42 extern char *sys_errlist[];
50 #define METHOD_DMAPI_PROBE 0
51 #define METHOD_DMAPI_PUNCH 1
52 #define METHOD_XFSCTL 2
54 char *methodmap[] = {"DMAPI probe hole",
56 "Punch hole with xfsctl(XFS_IOC_FREESP64)"};
61 fprintf(stderr, "usage:\t%s [-x|-p] [-o offset] [-l length] "
62 "[-s sid] pathname\n", Progname);
75 if ((fd = open(path, O_RDWR|O_CREAT, 0600)) < 0) {
81 flock.l_start = offset;
84 if (xfsctl(path, fd, XFS_IOC_FREESP64, &flock)) {
85 fprintf(stderr, "can't XFS_IOC_FREESP64 %s: %s\n",
86 path, strerror(errno));
101 dm_sessid_t sid = DM_NO_SESSION;
102 char *pathname = NULL;
104 dm_size_t length = 0;
112 int method = METHOD_DMAPI_PROBE;
114 Progname = strrchr(argv[0], '/');
121 /* Crack and validate the command line options. */
123 while ((opt = getopt(argc, argv, "o:l:s:xp")) != EOF) {
126 offset = strtoll(optarg, &p, 10);
127 if (p && (*p == 'k' || *p == 'K'))
131 length = strtoll(optarg, &p, 10);
132 if (p && (*p == 'k' || *p == 'K'))
139 method = METHOD_XFSCTL;
142 method = METHOD_DMAPI_PUNCH;
148 if (optind + 1 != argc)
150 pathname = argv[optind];
155 printf("Running %s on %s with settings:\n", methodmap[method], pathname);
156 printf(" offset = '%lld', length = '%lld', sid = '%lld'\n",
157 (long long) offset, (unsigned long long) length, (long long) sid);
159 if (method == METHOD_XFSCTL)
160 return xfsctl_punch_hole(pathname, offset, length);
162 if (dm_init_service(&name) == -1) {
163 fprintf(stderr, "Can't initialize the DMAPI\n");
166 if (sid == DM_NO_SESSION)
167 find_test_session(&sid);
169 /* Get the file's handle. */
171 if (dm_path_to_handle(pathname, &hanp, &hlen)) {
172 fprintf(stderr, "can't get handle for file %s\n", pathname);
177 case METHOD_DMAPI_PROBE:
178 if (dm_probe_hole(sid, hanp, hlen, DM_NO_TOKEN, offset, length,
180 fprintf(stderr, "dm_probe_hole failed, %s\n",
184 fprintf(stdout, "roffp is %lld, rlenp is %llu\n",
185 (long long) roffp, (unsigned long long) rlenp);
187 case METHOD_DMAPI_PUNCH:
188 if (dm_punch_hole(sid, hanp, hlen, DM_NO_TOKEN, offset, length)) {
189 fprintf(stderr, "dm_punch_hole failed, %s\n",
195 dm_handle_free(hanp, hlen);