summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrobi <robi>2011-04-05 01:09:36 +0000
committerrobi <robi>2011-04-05 01:09:36 +0000
commitc98aee37f48b9523e2eceef61949aeda958ed3f8 (patch)
treed47c574fed29fb7bd7fbef0f0860460177f130de /src
parent891877f331bc93afd5fe8b33ee89acdee67ac162 (diff)
first functions of expert-mode
Diffstat (limited to 'src')
-rw-r--r--src/ext4magic.c43
-rw-r--r--src/journal.c6
2 files changed, 40 insertions, 9 deletions
diff --git a/src/ext4magic.c b/src/ext4magic.c
index 703c3d5..5ac418d 100644
--- a/src/ext4magic.c
+++ b/src/ext4magic.c
@@ -305,7 +305,11 @@ t_after = t_before - 86400 ;
// decode arguments
+#ifdef EXPERT_MODE
+while ((c = getopt (argc, argv, "TJRMLlmrQSxi:t:j:f:Vd:B:b:a:I:Hs:n:c")) != EOF) {
+#else
while ((c = getopt (argc, argv, "TJRMLlmrQSxi:t:j:f:Vd:B:b:a:I:H")) != EOF) {
+#endif
switch (c) {
case 'M':
//not active, still in development
@@ -489,10 +493,6 @@ while ((c = getopt (argc, argv, "TJRMLlmrQSxi:t:j:f:Vd:B:b:a:I:H")) != EOF) {
mode |= HIGH_QUALITY;
break;
- case 'w'://experimental not activ at default
- journal_backup=1;
- break;
-
case 'j':
j_file_name = optarg;
retval = stat (j_file_name, &filestat);
@@ -514,15 +514,44 @@ while ((c = getopt (argc, argv, "TJRMLlmrQSxi:t:j:f:Vd:B:b:a:I:H")) != EOF) {
pathname = malloc(512);
strcpy(pathname,optarg);
break;
-
- case 'v'://experimental not activ at default
+#ifdef EXPERT_MODE
+ case 'c':
+ journal_backup=1;
+ break;
+
+ case 's':
blocksize = parse_ulong(optarg, argv[0],
"block size", 0);
+ if ((!blocksize) || (blocksize % 1024)){
+ fprintf(stderr,"Error: Invalid parameter: -s %d\n", blocksize);
+ fprintf(stderr,"ERROR: blocksize allowed only 1024 ; 2048 or 4096\n");
+ exitval = EXIT_FAILURE ;
+ goto errout;
+ }
break;
- case 's'://experimental not activ at default
+ case 'n':
superblock = parse_ulong(optarg, argv[0],
"superblock number", 0);
+ if ((!superblock) || (!blocksize) || ((blocksize * 8) > superblock)){
+ fprintf(stderr,"Error: Invalid parameter: -s %d\n", superblock);
+ switch (blocksize){
+ case 1024:
+ fprintf(stderr, "blocksize 1024 posible 8193, 24577, 40961, 57345 ....\n");
+ break;
+ case 2048:
+ fprintf(stderr, "blocksize 2048 posible 16384, 49152, 81920, 114688 ....\n");
+ break;
+ case 4096:
+ fprintf(stderr, "blocksize 4096 posible 32768, 98304, 163840, 229376 ....\n");
+ break;
+ default:
+ fprintf(stderr, "blocksize unknown\n");
+ }
+ exitval = EXIT_FAILURE ;
+ goto errout;
+ }
break;
+#endif
case 'T':
mode |= PRINT_BLOCKLIST;
mode |= READ_JOURNAL;
diff --git a/src/journal.c b/src/journal.c
index c8e8810..d7c6927 100644
--- a/src/journal.c
+++ b/src/journal.c
@@ -176,7 +176,9 @@ extern int journal_open( char *journal_file_name, int journal_backup_flag )
memcpy(&journal_inode.i_block[0], jsb_pointer->s_jnl_blocks, EXT2_N_BLOCKS*4);
journal_inode.i_size = jsb_pointer->s_jnl_blocks[16];
journal_inode.i_links_count = 1;
- journal_inode.i_mode = LINUX_S_IFREG | 0600;
+ journal_inode.i_mode = LINUX_S_IFREG | 0600;
+ if (jsb_pointer->s_feature_incompat & EXT3_FEATURE_INCOMPAT_EXTENTS)
+ journal_inode.i_flags |= EXT4_EXTENTS_FL;
} else {
if (intern_read_inode(journal_inum, &journal_inode))
goto errout;
@@ -191,7 +193,7 @@ extern int journal_open( char *journal_file_name, int journal_backup_flag )
journal_source.where = JOURNAL_IS_INTERNAL;
journal_source.file = journal_file;
journal_source.fd = -1 ;
- printf("Using internal Journal at Inode %d\n",journal_inum);
+ printf("Using %s internal Journal at Inode %d\n",(journal_backup_flag)?"a recovered":"",journal_inum);
} else {
char uuid[37];