2 * fsfreeze.c -- Filesystem freeze/unfreeze IO for Linux
4 * Copyright (C) 2010 Hajime Taira <htaira@redhat.com>
5 * Masatake Yamato <yamato@redhat.com>
7 * This program is free software. You can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation: either version 1 or
10 * (at your option) any later version.
19 #include <sys/ioctl.h>
20 #include <sys/types.h>
27 #include "closestream.h"
36 static void __attribute__((__noreturn__
)) usage(void)
39 fputs(USAGE_HEADER
, out
);
41 _(" %s [options] <mountpoint>\n"), program_invocation_short_name
);
43 fputs(USAGE_SEPARATOR
, out
);
44 fputs(_("Suspend access to a filesystem.\n"), out
);
46 fputs(USAGE_OPTIONS
, out
);
47 fputs(_(" -f, --freeze freeze the filesystem\n"), out
);
48 fputs(_(" -u, --unfreeze unfreeze the filesystem\n"), out
);
49 fputs(USAGE_SEPARATOR
, out
);
50 printf(USAGE_HELP_OPTIONS(19));
51 printf(USAGE_MAN_TAIL("fsfreeze(8)"));
56 int main(int argc
, char **argv
)
59 int action
= NOOP
, rc
= EXIT_FAILURE
;
63 static const struct option longopts
[] = {
64 { "help", no_argument
, NULL
, 'h' },
65 { "freeze", no_argument
, NULL
, 'f' },
66 { "unfreeze", no_argument
, NULL
, 'u' },
67 { "version", no_argument
, NULL
, 'V' },
71 static const ul_excl_t excl
[] = { /* rows and cols in ASCII order */
72 { 'f','u' }, /* freeze, unfreeze */
75 int excl_st
[ARRAY_SIZE(excl
)] = UL_EXCL_STATUS_INIT
;
77 setlocale(LC_ALL
, "");
78 bindtextdomain(PACKAGE
, LOCALEDIR
);
80 close_stdout_atexit();
82 while ((c
= getopt_long(argc
, argv
, "hfuV", longopts
, NULL
)) != -1) {
84 err_exclusive_options(c
, longopts
, excl
, excl_st
);
97 print_version(EXIT_SUCCESS
);
99 errtryhelp(EXIT_FAILURE
);
104 errx(EXIT_FAILURE
, _("neither --freeze or --unfreeze specified"));
106 errx(EXIT_FAILURE
, _("no filename specified"));
107 path
= argv
[optind
++];
109 if (optind
!= argc
) {
110 warnx(_("unexpected number of arguments"));
111 errtryhelp(EXIT_FAILURE
);
114 fd
= open(path
, O_RDONLY
);
116 err(EXIT_FAILURE
, _("cannot open %s"), path
);
118 if (fstat(fd
, &sb
) == -1) {
119 warn(_("stat of %s failed"), path
);
123 if (!S_ISDIR(sb
.st_mode
)) {
124 warnx(_("%s: is not a directory"), path
);
130 if (ioctl(fd
, FIFREEZE
, 0)) {
131 warn(_("%s: freeze failed"), path
);
136 if (ioctl(fd
, FITHAW
, 0)) {
137 warn(_("%s: unfreeze failed"), path
);