2 * Copyright (c) 2011-2012 The DragonFly Project. All rights reserved.
4 * This code is derived from software contributed to The DragonFly Project
5 * by Matthew Dillon <dillon@dragonflybsd.org>
6 * by Venkatesh Srinivas <vsrinivas@dragonflybsd.org>
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in
16 * the documentation and/or other materials provided with the
18 * 3. Neither the name of The DragonFly Project nor the names of its
19 * contributors may be used to endorse or promote products derived
20 * from this software without specific, prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
28 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
30 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
31 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
32 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 #include <sys/types.h>
49 #include <hammer2/hammer2_disk.h>
52 int fd; /* Device fd */
53 struct hammer2_blockref sroot; /* Superroot blockref */
57 struct hammer2_inode_data dat; /* raw inode data */
58 off_t doff; /* disk inode offset */
62 struct hammer2_blockref ref;
70 struct hammer2_volume_data volhdr;
74 rc = pread(hfs->fd, &volhdr, HAMMER2_VOLUME_SIZE, 0);
75 if (volhdr.magic == HAMMER2_VOLUME_ID_HBO) {
76 printf("Valid HAMMER2 filesystem\n");
81 hfs->sroot = volhdr.sroot_blockref;
85 shread(hfs, ino, buf, off, len)
93 * Read [off, off+len) from inode ino rather than from disk
94 * offsets; correctly decodes blockrefs/indirs/...
98 struct inode *hlookup1(hfs, ino, name)
103 static struct inode filino;
107 bzero(&filino, sizeof(struct inode));
111 off += sizeof(struct hammer2_inode_data))
113 rc = shread(hfs, ino, &filino.dat, off,
114 sizeof(struct hammer2_inode_data));
115 if (rc != sizeof(struct hammer2_inode_data))
117 if (strcmp(name, &filino.dat.filename) == 0)
124 struct inode *hlookup(hfs, name)
128 /* Name is of form /SUPERROOT/a/b/c/file */
132 void hstat(hfs, ino, sb)
144 struct hammer2 hammer2;
150 fprintf(stderr, "usage: hammer2 <dev>\n");
154 hammer2.fd = open(argv[1], O_RDONLY);
155 if (hammer2.fd < 0) {
156 fprintf(stderr, "unable to open %s\n", argv[1]);
160 if (hinit(&hammer2)) {
161 fprintf(stderr, "invalid fs\n");
166 for (i = 2; i < argc; i++) {
167 ino = hlookup(&hammer2, argv[i]);
169 fprintf(stderr, "hlookup %s\n", argv[i]);
172 hstat(&hammer2, ino, &sb);
174 printf("%s %lld", argv[i], sb.st_size);