Merge branches 'hammer2' and 'master' of ssh://crater.dragonflybsd.org/repository...
[dragonfly.git] / lib / libstand / hammer2.c
1 /*
2  * Copyright (c) 2011-2012 The DragonFly Project.  All rights reserved.
3  *
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>
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
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
17  *    distribution.
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.
21  *
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
33  * SUCH DAMAGE.
34  */
35 #include <sys/types.h>
36 #include <sys/stat.h>
37 #include <sys/uuid.h>
38
39 #include <stdio.h>
40 #include <stdlib.h>
41 #include <stddef.h>
42 #include <stdint.h>
43 #include <unistd.h>
44 #include <fcntl.h>
45 #include <string.h>
46 #include <strings.h>
47 #include <errno.h>
48
49 #include <hammer2/hammer2_disk.h>
50
51 struct hammer2 {
52         int                             fd;     /* Device fd */
53         struct hammer2_blockref         sroot;  /* Superroot blockref */
54 };
55
56 struct inode {
57         struct hammer2_inode_data       dat;    /* raw inode data */
58         off_t                           doff;   /* disk inode offset */
59 };
60
61 off_t blockoff(ref)
62         struct hammer2_blockref ref;
63 {
64
65 }
66
67 hinit(hfs)
68         struct hammer2 *hfs;
69 {
70         struct hammer2_volume_data volhdr;
71         ssize_t rc;
72         hammer2_crc_t crc0;
73
74         rc = pread(hfs->fd, &volhdr, HAMMER2_VOLUME_SIZE, 0);
75         if (volhdr.magic == HAMMER2_VOLUME_ID_HBO) {
76                 printf("Valid HAMMER2 filesystem\n");
77         } else {
78                 return (-1);
79         }
80
81         hfs->sroot = volhdr.sroot_blockref;
82         return (0);
83 }
84
85 shread(hfs, ino, buf, off, len)
86         struct hammer2 *hfs;
87         struct inode *ino;
88         char *buf;
89         off_t off;
90         size_t len;
91 {
92         /*
93          * Read [off, off+len) from inode ino rather than from disk
94          * offsets; correctly decodes blockrefs/indirs/...
95          */
96 }
97
98 struct inode *hlookup1(hfs, ino, name)
99         struct hammer2 *hfs;
100         struct inode *ino;
101         char *name;
102 {
103         static struct inode filino;
104         off_t off;
105         int rc;
106
107         bzero(&filino, sizeof(struct inode));
108
109         for (off = 0;
110              off < ino->dat.size;
111              off += sizeof(struct hammer2_inode_data))
112         {
113                 rc = shread(hfs, ino, &filino.dat, off,
114                             sizeof(struct hammer2_inode_data));
115                 if (rc != sizeof(struct hammer2_inode_data))
116                         continue;
117                 if (strcmp(name, &filino.dat.filename) == 0)
118                         return (&filino);
119         }
120
121         return (NULL);
122 }
123
124 struct inode *hlookup(hfs, name)
125         struct hammer2 *hfs;
126         char *name;
127 {
128         /* Name is of form /SUPERROOT/a/b/c/file */
129
130 }
131
132 void hstat(hfs, ino, sb)
133         struct hammer2 *hfs;
134         struct inode *ino;
135         struct stat *sb;
136 {
137
138 }
139
140 main(argc, argv)
141         int argc;
142         char *argv[];
143 {
144         struct hammer2 hammer2;
145         struct inode *ino;
146         struct stat sb;
147         int i;
148
149         if (argc < 2) {
150                 fprintf(stderr, "usage: hammer2 <dev>\n");
151                 exit(1);
152         }
153
154         hammer2.fd = open(argv[1], O_RDONLY);
155         if (hammer2.fd < 0) {
156                 fprintf(stderr, "unable to open %s\n", argv[1]);
157                 exit(1);
158         }
159
160         if (hinit(&hammer2)) {
161                 fprintf(stderr, "invalid fs\n");
162                 close(hammer2.fd);
163                 exit(1);
164         }
165
166         for (i = 2; i < argc; i++) {
167                 ino = hlookup(&hammer2, argv[i]);
168                 if (ino == NULL) {
169                         fprintf(stderr, "hlookup %s\n", argv[i]);
170                         continue;
171                 }
172                 hstat(&hammer2, ino, &sb);
173
174                 printf("%s %lld", argv[i], sb.st_size);
175
176         }
177 }