Implement: hammer snapshot <softlink-dir> [<filesystem>]
[games.git] / sbin / hammer / cmd_snapshot.c
1 /*
2  * Copyright (c) 2008 The DragonFly Project.  All rights reserved.
3  * 
4  * This code is derived from software contributed to The DragonFly Project
5  * by Matthew Dillon <dillon@backplane.com>
6  * 
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  * 3. Neither the name of The DragonFly Project nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific, prior written permission.
20  * 
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
25  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  * 
34  * $DragonFly: src/sbin/hammer/cmd_snapshot.c,v 1.1 2008/06/25 13:10:06 mneumann Exp $
35  */
36
37 #include "hammer.h"
38 #include <sys/param.h>
39 #include <sys/mount.h>
40 #include <unistd.h>
41
42 static void snapshot_usage(int exit_code);
43
44 /*
45  * snapshot <softlink-dir> [<filesystem>]
46  */
47 void
48 hammer_cmd_snapshot(char **av, int ac)
49 {
50         char *softlink_dir;
51         const char *filesystem;
52         struct statfs buf;
53         struct hammer_ioc_synctid synctid;
54         int fd;
55         char *from;
56         char *to;
57
58         if (ac == 0 || ac > 2)
59                 snapshot_usage(1);
60
61         softlink_dir = av[0];
62
63         if (ac > 1) 
64                 filesystem = av[1];
65         else if (statfs(softlink_dir, &buf) == 0)
66                 filesystem = buf.f_mntonname;
67         else
68                 err(2, "Unable to determine filesystem of %s", softlink_dir);
69
70         bzero(&synctid, sizeof(synctid));
71         synctid.op = HAMMER_SYNCTID_SYNC2;
72
73         fd = open(filesystem, O_RDONLY);
74         if (fd < 0)
75                 err(2, "Unable to open %s", filesystem);
76         if (ioctl(fd, HAMMERIOC_SYNCTID, &synctid) < 0) {
77                 err(2, "Synctid %s failed", filesystem);
78         } else {
79                 asprintf(&from, "%s@@0x%016llx", filesystem, synctid.tid); 
80
81                 if (from == NULL)
82                         err(2, "Couldn't generate string");
83
84                 if (softlink_dir[strlen(softlink_dir)-1] == '/')
85                         asprintf(&to, "%s0x%016llx", softlink_dir, synctid.tid);
86                 else
87                         asprintf(&to, "%s/0x%016llx", softlink_dir, synctid.tid);
88                 
89                 if (to == NULL)
90                         err(2, "Couldn't generate string");
91
92                 if (symlink(from, to) != 0)
93                         err(2, "Unable to symlink %s to %s", from, to);
94
95                 printf("%s\n", to);
96         }
97         close(fd);
98 }
99
100 static
101 void
102 snapshot_usage(int exit_code)
103 {
104         fprintf(stderr, "hammer snapshot <softlink-dir> [<filesystem>]\n");
105         exit(exit_code);
106 }
107