Use xfs.h rather than libxfs.h
[xfstests-dev.git] / src / godown.c
1 /*
2  * Copyright (c) 2004 Silicon Graphics, Inc.
3  * All Rights Reserved.
4  *
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.
8  *
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.
13  *
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
17  */
18
19 #include "global.h"
20
21 static char *xprogname;
22
23
24 static void
25 usage(void)
26 {
27         fprintf(stderr, "usage: %s [-f] [-v] mnt-dir\n", xprogname);
28 }
29
30 int
31 main(int argc, char *argv[])
32 {
33         int c;
34         int flag;
35         int flushlog_opt = 0;
36         int verbose_opt = 0;
37         struct stat st;
38         char *mnt_dir;
39         int fd;
40
41         xprogname = argv[0];
42
43         while ((c = getopt(argc, argv, "fv")) != -1) {
44                 switch (c) {
45                 case 'f':
46                         flushlog_opt = 1;
47                         break;
48                 case 'v':
49                         verbose_opt = 1;
50                         break;
51                 case '?':
52                         usage();
53                         return 1;
54                 }
55         }
56
57         /* process required cmd argument */
58         if (optind == argc-1) {
59                 mnt_dir = argv[optind];
60         }
61         else {
62                 usage();
63                 return 1;
64         }
65
66         if ((stat(mnt_dir, &st)) == -1) {
67                 fprintf(stderr, "%s: error on stat \"%s\": %s\n",
68                         xprogname, mnt_dir, strerror(errno));
69                 return 1;
70         }
71
72         if (!S_ISDIR(st.st_mode)) {
73                 fprintf(stderr, "%s: argument \"%s\" is not a directory\n",
74                         xprogname, mnt_dir);
75                 return 1;
76         }
77
78         
79 #if 0
80         {
81                 struct statvfs stvfs;
82                 if ((statvfs(mnt_dir, &stvfs)) == -1) {
83                         fprintf(stderr, "%s: error on statfs \"%s\": %s\n",
84                                 xprogname, mnt_dir, strerror(errno));
85                         return 1;
86                 }
87
88                 if (strcmp(stvfs.f_basetype, "xfs") != 0) {
89                         fprintf(stderr, "%s: filesys for \"%s\" is not XFS:\"%s\"\n",
90                                 xprogname, mnt_dir, stvfs.f_basetype);
91                         return 1;
92                 }
93         }
94 #endif
95
96
97         flag = (flushlog_opt ? XFS_FSOP_GOING_FLAGS_LOGFLUSH 
98                             : XFS_FSOP_GOING_FLAGS_NOLOGFLUSH);
99
100         if (verbose_opt) {
101                 printf("Opening \"%s\"\n", mnt_dir);
102         }
103         if ((fd = open(mnt_dir, O_RDONLY)) == -1) {
104                 fprintf(stderr, "%s: error on open of \"%s\": %s\n",
105                         xprogname, mnt_dir, strerror(errno));
106                 return 1;
107         }
108
109         if (verbose_opt) {
110                 printf("Calling XFS_IOC_GOINGDOWN\n");
111         }
112         if ((xfsctl(mnt_dir, fd, XFS_IOC_GOINGDOWN, &flag)) == -1) {
113                 fprintf(stderr, "%s: error on xfsctl(GOINGDOWN) of \"%s\": %s\n",
114                         xprogname, mnt_dir, strerror(errno));
115                 return 1;
116         }
117
118         close(fd);
119
120         return 0;
121 }