summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorMaxim Sobolev <sobomax@FreeBSD.org>2006-05-26 00:51:11 +0000
committerMaxim Sobolev <sobomax@FreeBSD.org>2006-05-26 00:51:11 +0000
commite50f94944e530d9b85d738d6f1c06228dbffa8e2 (patch)
treef3ef708dc4592da751818d55fd3d3a5c20d9f3cc /tools
parente414838fa10276841c88c7887d6e75a2cc0bf3dc (diff)
Notes
Diffstat (limited to 'tools')
-rw-r--r--tools/tools/find-sb/find-sb.c59
1 files changed, 46 insertions, 13 deletions
diff --git a/tools/tools/find-sb/find-sb.c b/tools/tools/find-sb/find-sb.c
index 72a5546c8258..dcfe34bbd9b5 100644
--- a/tools/tools/find-sb/find-sb.c
+++ b/tools/tools/find-sb/find-sb.c
@@ -26,20 +26,49 @@ static union {
int
main(int argc, char **argv)
{
- off_t end, last;
+ off_t end, last1, last2;
size_t len;
ssize_t justread;
int fd;
+ char *ch;
+ char c;
+ intmax_t offset;
- if (argv[1] == NULL)
+ while ((c = getopt(argc, argv, "o:")) != -1) {
+ switch (c) {
+ case 'o':
+ if (optarg[0] == '\0')
+ errx(1, "usage");
+ offset = strtoimax(optarg, &ch, 10);
+ if (*ch != '\0' || offset < 0)
+ errx(1, "usage");
+ offset -= offset % DEV_BSIZE;
+ break;
+
+ default:
+ errx(1, "usage");
+ }
+ }
+ argc -= optind;
+ argv += optind;
+
+ if (argc != 1)
errx(1, "usage");
- fd = open(argv[1], O_RDONLY, 0);
+ fd = open(argv[0], O_RDONLY, 0);
if (fd < 0)
- err(1, "%s", argv[1]);
+ err(1, "%s", argv[0]);
+
+ if (offset != 0) {
+ end = lseek(fd, offset, SEEK_SET);
+ if (end == -1)
+ err(1, "%s", argv[0]);
+ } else {
+ end = 0;
+ }
+ len = 0;
+ last1 = last2 = -1;
- end = len = 0;
- last = -1;
while (1) {
justread = read(fd, &u.buf[len], DEV_BSIZE);
if (justread != DEV_BSIZE) {
@@ -56,7 +85,7 @@ main(int argc, char **argv)
len += DEV_BSIZE;
end += DEV_BSIZE;
if (len >= sizeof(struct fs)) {
- intmax_t offset = end - len;
+ offset = end - len;
if (u.sblock.fs_magic == FS_UFS1_MAGIC) {
intmax_t fsbegin = offset - SBLOCK_UFS1;
@@ -66,11 +95,13 @@ main(int argc, char **argv)
printf("Filesystem might begin at offset %jd, "
"block %jd\n", fsbegin,
fsbegin / DEV_BSIZE);
- if (last >= 0) {
+ if (last1 >= 0) {
printf("%jd blocks from last guess\n",
- fsbegin / DEV_BSIZE - last);
+ fsbegin / DEV_BSIZE - last1);
}
- last = fsbegin / DEV_BSIZE;
+ last1 = fsbegin / DEV_BSIZE;
+ len -= DEV_BSIZE;
+ memmove(u.buf, &u.buf[DEV_BSIZE], len);
} else if (u.sblock.fs_magic == FS_UFS2_MAGIC) {
intmax_t fsbegin = offset - SBLOCK_UFS1;
printf("Found UFS2 superblock at offset %jd, "
@@ -79,11 +110,13 @@ main(int argc, char **argv)
printf("Filesystem might begin at offset %jd, "
"block %jd\n", fsbegin,
fsbegin / DEV_BSIZE);
- if (last >= 0) {
+ if (last2 >= 0) {
printf("%jd blocks from last guess\n",
- fsbegin / DEV_BSIZE - last);
+ fsbegin / DEV_BSIZE - last2);
}
- last = fsbegin / DEV_BSIZE;
+ last2 = fsbegin / DEV_BSIZE;
+ len -= DEV_BSIZE;
+ memmove(u.buf, &u.buf[DEV_BSIZE], len);
}
}
if (len >= SBLOCKSIZE) {