Add COPYING file
[ps3tools.git] / norunpack.c
blob4d74f568d0e3a4e0913423db598a8cd4f212c7a6
1 // Copyright 2010 Sven Peter <svenpeter@gmail.com>
2 // Licensed under the terms of the GNU GPL, version 2
3 // http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
5 #include <stdio.h>
6 #include <string.h>
7 #include <stdlib.h>
8 #include <sys/stat.h>
9 #include <unistd.h>
10 #include "tools.h"
12 #ifdef WIN32
13 #define MKDIR(x,y) mkdir(x);
14 #else
15 #define MKDIR(x,y) mkdir(x,y)
16 #endif
18 static u8 *nor = NULL;
20 static void new_dir(const char *n)
22 MKDIR(n, 0777);
23 if (chdir(n) < 0)
24 fail("chdir");
27 static void do_toc(u8 *ptr)
29 u32 n_entries;
30 u32 i;
31 u8 *p;
32 u8 *tmp;
33 u64 size;
34 char name[0x20];
36 n_entries = be32(ptr + 0x04);
37 p = ptr + 0x10;
39 for(i = 0; i < n_entries; i++) {
40 memcpy(name, p + 16, 0x20);
42 if (strncmp(name, "asecure_loader", 0x20) == 0) {
43 new_dir("asecure_loader");
44 do_toc(ptr + be64(p));
45 if (chdir("..") < 0)
46 fail("chdir(..)");
47 } else if (strncmp(name, "ros", 3) == 0) {
48 new_dir(name);
49 do_toc(ptr + be64(p) + 0x10);
50 if (chdir("..") < 0)
51 fail("chdir(..)");
52 } else {
53 tmp = ptr + be64(p);
54 size = be64(p + 0x08);
55 if (be32(tmp + 0x10) == 0x53434500) {
56 tmp += 0x10;
57 size -= 0x10;
60 memcpy_to_file(name, tmp, size);
62 p += 0x30;
66 int main(int argc, char *argv[])
68 if (argc != 3)
69 fail("usage: norunpack dump.b directory");
71 nor = mmap_file(argv[1]);
73 new_dir(argv[2]);
75 do_toc(nor + 0x400);
77 return 0;