changeset 248:10afa4d39a7b

tiffs xtr implemented
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Mon, 27 Jan 2014 07:20:53 +0000
parents 190121a34b3b
children 66a6f1652909
files ffstools/tiffs-rd/Makefile ffstools/tiffs-rd/ls.c ffstools/tiffs-rd/main.c ffstools/tiffs-rd/xtr.c
diffstat 4 files changed, 107 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/ffstools/tiffs-rd/Makefile	Mon Jan 27 06:42:03 2014 +0000
+++ b/ffstools/tiffs-rd/Makefile	Mon Jan 27 07:20:53 2014 +0000
@@ -1,7 +1,7 @@
 CC=	gcc
 CFLAGS=	-O2
 PROG=	tiffs
-OBJS=	basics.o cat.o globals.o inode.o ls.o main.o object.o tree.o
+OBJS=	basics.o cat.o globals.o inode.o ls.o main.o object.o tree.o xtr.o
 HDRS=	globals.h pathname.h struct.h types.h
 INSTBIN=/usr/local/bin
 
--- a/ffstools/tiffs-rd/ls.c	Mon Jan 27 06:42:03 2014 +0000
+++ b/ffstools/tiffs-rd/ls.c	Mon Jan 27 07:20:53 2014 +0000
@@ -97,7 +97,7 @@
 		return;
 	default:
 		fprintf(stderr,
-			"BUG: bad inode byte %02X reached ls_callback()\n",
+			"BUG: bad inode byte %02X reached ls_tree_callback()\n",
 			inf->type);
 		exit(1);
 	}
--- a/ffstools/tiffs-rd/main.c	Mon Jan 27 06:42:03 2014 +0000
+++ b/ffstools/tiffs-rd/main.c	Mon Jan 27 07:20:53 2014 +0000
@@ -59,6 +59,7 @@
 extern int cmd_fsinfo();
 extern int cmd_ls();
 extern int cmd_lsino();
+extern int cmd_xtr();
 
 static struct cmdtab {
 	char *cmd;
@@ -71,7 +72,7 @@
 	{"fsinfo", cmd_fsinfo},
 	{"ls", cmd_ls},
 	{"lsino", cmd_lsino},
-	{"xtr", NULL},
+	{"xtr", cmd_xtr},
 	{NULL, NULL}
 };
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ffstools/tiffs-rd/xtr.c	Mon Jan 27 07:20:53 2014 +0000
@@ -0,0 +1,103 @@
+/*
+ * This C module implements the xtr command.
+ */
+
+#include <sys/types.h>
+#include <sys/file.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <unistd.h>
+#include "types.h"
+#include "struct.h"
+#include "globals.h"
+#include "pathname.h"
+
+static void
+dump_head_chunk(fd, headino)
+{
+	struct inode_info *inf = inode_info[headino];
+	struct chunkinfo chi;
+
+	if (size_head_chunk(inf, &chi))
+		write(fd, chi.start, chi.len);
+}
+
+static void
+dump_extra_chunk(inf, opaque)
+	struct inode_info *inf;
+	u_long opaque;
+{
+	int fd = (int)opaque;
+	struct chunkinfo chi;
+
+	size_extra_chunk(inf, &chi);
+	write(fd, chi.start, chi.len);
+}
+
+extract_file(relpath, headino)
+	char *relpath;
+{
+	int fd;
+
+	fd = open(relpath, O_WRONLY|O_CREAT|O_TRUNC, 0666);
+	if (fd < 0) {
+		perror(relpath);
+		exit(1);
+	}
+	dump_head_chunk(fd, headino);
+	iterate_seg_file(headino, dump_extra_chunk, (u_long)fd, 0, 0);
+	close(fd);
+}
+
+void
+xtr_tree_callback(pathname, ino, depth)
+	char *pathname;
+{
+	struct inode_info *inf = inode_info[ino];
+
+	switch (inf->type) {
+	case 0xE1:
+	case 0xF1:
+		extract_file(pathname + 1, ino);
+		return;
+	case 0xE2:
+	case 0xF2:
+		if (mkdir(pathname + 1, 0777) < 0) {
+			perror(pathname + 1);
+			exit(1);
+		}
+		return;
+	case 0xE3:
+	case 0xF3:
+		fprintf(stderr,
+	"symlink at %s ignored: symlink extraction not implemented yet\n",
+			pathname);
+		return;
+	default:
+		fprintf(stderr,
+		"BUG: bad inode byte %02X reached xtr_tree_callback()\n",
+			inf->type);
+		exit(1);
+	}
+}
+
+cmd_xtr(argc, argv)
+	char **argv;
+{
+	if (argc != 2) {
+		fprintf(stderr, "usage: xtr dest-dir\n");
+		exit(1);
+	}
+	read_ffs_image();
+	find_inode_block();
+	alloc_inode_table();
+	find_root_inode();
+	if (chdir(argv[1]) < 0) {
+		perror(argv[1]);
+		exit(1);
+	}
+	traverse_visible_tree(xtr_tree_callback);
+	exit(0);
+}