[Cluster-devel] cluster/gfs2/edit gfs2hex.c hexedit.c hexedit.h
rpeterso at sourceware.org
rpeterso at sourceware.org
Thu Feb 8 05:41:17 UTC 2007
CVSROOT: /cvs/cluster
Module name: cluster
Changes by: rpeterso at sourceware.org 2007-02-08 05:41:16
Modified files:
gfs2/edit : gfs2hex.c hexedit.c hexedit.h
Log message:
Fixed some bugs and made some improvements.
When displaying indirect blocks, it now gives the data offset.
Also added page-up/page-down/home/end navigation to block list display.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/edit/gfs2hex.c.diff?cvsroot=cluster&r1=1.7&r2=1.8
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/edit/hexedit.c.diff?cvsroot=cluster&r1=1.8&r2=1.9
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/edit/hexedit.h.diff?cvsroot=cluster&r1=1.6&r2=1.7
--- cluster/gfs2/edit/gfs2hex.c 2006/11/14 20:11:10 1.7
+++ cluster/gfs2/edit/gfs2hex.c 2007/02/08 05:41:16 1.8
@@ -43,10 +43,10 @@
extern char edit_fmt[80];
extern char edit_string[1024];
extern int edit_mode INIT(0);
-extern int edit_row[DISPLAY_MODES], edit_col[DISPLAY_MODES];
-extern int edit_size[DISPLAY_MODES], edit_last[DISPLAY_MODES];
+extern int edit_row[DMODES], edit_col[DMODES];
+extern int edit_size[DMODES], edit_last[DMODES];
extern char edit_string[1024], edit_fmt[80];
-extern enum dsp_mode display_mode INIT(HEX_MODE);
+extern enum dsp_mode dmode INIT(HEX_MODE); /* display mode */
void eol(int col) /* end of line */
{
@@ -86,11 +86,11 @@
if (!termlines || line < termlines) {
va_start(args, fmt2);
if (termlines) {
- if (line == edit_row[display_mode] + 4)
+ if (line == edit_row[dmode] + 4)
COLORS_HIGHLIGHT;
move(line,0);
printw("%s", label);
- if (line == edit_row[display_mode] + 4)
+ if (line == edit_row[dmode] + 4)
COLORS_NORMAL;
move(line,24);
}
@@ -103,10 +103,10 @@
vsprintf(tmp_string, fmt, args);
if (termlines) {
- if (line == edit_row[display_mode] + 4)
+ if (line == edit_row[dmode] + 4)
COLORS_HIGHLIGHT;
printw(tmp_string);
- if (line == edit_row[display_mode] + 4)
+ if (line == edit_row[dmode] + 4)
COLORS_NORMAL;
}
else
@@ -119,10 +119,10 @@
vsprintf(tmp_string, fmt2, args);
if (termlines) {
move(line, 50);
- if (line == edit_row[display_mode] + 4)
+ if (line == edit_row[dmode] + 4)
COLORS_HIGHLIGHT;
printw("%s", tmp_string);
- if (line == edit_row[display_mode] + 4)
+ if (line == edit_row[dmode] + 4)
COLORS_NORMAL;
}
else {
@@ -148,14 +148,14 @@
}
if (termlines) {
refresh();
- if (line == edit_row[display_mode] + 4) {
+ if (line == edit_row[dmode] + 4) {
strcpy(edit_string, tmp_string);
strcpy(edit_fmt, fmt);
- edit_size[display_mode] = strlen(edit_string);
+ edit_size[dmode] = strlen(edit_string);
COLORS_NORMAL;
}
- if (line - 3 > edit_last[display_mode])
- edit_last[display_mode] = line - 4;
+ if (line - 3 > edit_last[dmode])
+ edit_last[dmode] = line - 4;
}
eol(0);
va_end(args);
@@ -293,7 +293,8 @@
indirect_blocks = 0;
memset(&indirect, 0, sizeof(indirect));
- for (x = sizeof(struct gfs_indirect), y = 0;
+ for (x = (gfs1 ? sizeof(struct gfs_indirect):
+ sizeof(struct gfs2_meta_header)), y = 0;
x < bufsize;
x += sizeof(uint64_t), y++) {
p = be64_to_cpu(*(uint64_t *)(buf + x));
--- cluster/gfs2/edit/hexedit.c 2006/11/14 20:11:10 1.8
+++ cluster/gfs2/edit/hexedit.c 2007/02/08 05:41:16 1.9
@@ -42,7 +42,7 @@
#include <syslog.h>
-int display(enum dsp_mode display_mode, int identify_only);
+int display(enum dsp_mode dmode, int identify_only);
extern void eol(int col);
extern void do_indirect_extended(char *buf);
@@ -70,7 +70,7 @@
else
perror("Error: tgetent failed.");
termlines--; /* last line is number of lines -1 */
- display(display_mode, FALSE);
+ display(dmode, FALSE);
signal(SIGWINCH, UpdateSize);
}
@@ -323,12 +323,12 @@
}
print_gfs2("Block #");
if (termlines) {
- if (edit_row[display_mode] == -1)
+ if (edit_row[dmode] == -1)
COLORS_HIGHLIGHT;
}
print_gfs2("%lld (0x%"PRIx64")", block, block);
if (termlines) {
- if (edit_row[display_mode] == -1)
+ if (edit_row[dmode] == -1)
COLORS_NORMAL;
move(line,30);
}
@@ -401,7 +401,7 @@
else
struct_len = 512;
eol(0);
- if (termlines && display_mode == HEX_MODE) {
+ if (termlines && dmode == HEX_MODE) {
/* calculate how much of the buffer we can fit on screen */
screen_chunk_size = ((termlines - 4) * 16) >> 8 << 8;
if (!screen_chunk_size)
@@ -413,7 +413,7 @@
/*eol(9);*/
}
if (block == sbd.sd_sb.sb_root_dir.no_addr)
- print_gfs2("-------------------- Root direcory -------------------");
+ print_gfs2("-------------------- Root directory ------------------");
else if (!gfs1 && block == sbd.sd_sb.sb_master_dir.no_addr)
print_gfs2("------------------- Master directory -----------------");
else {
@@ -499,15 +499,15 @@
}
if (i%4 == 0)
print_gfs2(" ");
- if (termlines && line == edit_row[display_mode] + 3 &&
- i == edit_col[display_mode]) {
+ if (termlines && line == edit_row[dmode] + 3 &&
+ i == edit_col[dmode]) {
COLORS_HIGHLIGHT; /* normal part of the structure */
memset(edit_string,0,3);
sprintf(edit_string,"%02X",*pointer);
}
print_gfs2("%02X",*pointer);
- if (termlines && line == edit_row[display_mode] + 3 &&
- i == edit_col[display_mode]) {
+ if (termlines && line == edit_row[dmode] + 3 &&
+ i == edit_col[dmode]) {
if (l < struct_len + offset)
COLORS_NORMAL; /* normal part of the structure */
else
@@ -524,8 +524,8 @@
ptr2++;
}
print_gfs2("] ");
- if (line - 3 > edit_last[display_mode])
- edit_last[display_mode] = line - 3;
+ if (line - 3 > edit_last[dmode])
+ edit_last[dmode] = line - 3;
eol(0);
l+=16;
} /* while */
@@ -651,36 +651,73 @@
int e, start_line, total_dirents, indir_blocks;
struct gfs2_inode *tmp_inode;
- edit_last[display_mode] = 0;
+ edit_last[dmode] = 0;
eol(0);
start_line = line;
if (indirect_blocks ||
(gfs2_struct_type == GFS2_METATYPE_DI &&
(S_ISDIR(di.di_mode) || (gfs1 && di.__pad1 == GFS_FILE_DIR)))) {
+ int i, cur_height = -1;
+ uint64_t factor[5];
+ int offsets[5];
+
indir_blocks = indirect_blocks;
if (!indirect_blocks) {
print_gfs2("This directory contains %d directory entries.",
indirect[0].dirents);
- eol(0);
indir_blocks = 1; /* not really an indirect block, but treat it as one */
}
else {
- if (gfs2_struct_type == GFS2_METATYPE_DI && S_ISDIR(di.di_mode))
- print_gfs2("This directory contains %d indirect blocks",
- indirect_blocks);
+ if (gfs2_struct_type == GFS2_METATYPE_DI) {
+ if (S_ISDIR(di.di_mode))
+ print_gfs2("This directory contains %d indirect blocks",
+ indirect_blocks);
+ else
+ print_gfs2("This inode contains %d indirect blocks",
+ indirect_blocks);
+ }
else
- print_gfs2("This inode contains %d indirect blocks",
+ print_gfs2("This indirect block contains %d indirect blocks",
indirect_blocks);
+ }
+ total_dirents = 0;
+ /* Figure out multiplication factors for indirect pointers. */
+ if ((indir_blocks == indirect_blocks) && !S_ISDIR(di.di_mode)) {
+ memset(&offsets, 0, sizeof(offsets));
+ /* See if we are on an inode or have one in history. */
+ cur_height = 0;
+ if (gfs2_struct_type != GFS2_METATYPE_DI) {
+ cur_height = 0;
+ for (i = 0; i <= blockhist && i < 5; i++) {
+ offsets[i] = blockstack[(blockhist - i) % BLOCK_STACK_SIZE].edit_row[dmode];
+ if (blockstack[(blockhist - i) % BLOCK_STACK_SIZE].gfs2_struct_type == GFS2_METATYPE_DI)
+ break;
+ cur_height++;
+ }
+ }
+ if (cur_height >= 0) {
+ /* Multiply out the max factor based on inode height.*/
+ /* This is how much data is represented by each */
+ /* indirect pointer at each height. */
+ factor[0] = 1ull;
+ for (i = 0; i < di.di_height; i++)
+ factor[i + 1] = factor[i] * 509;
+ }
+ print_gfs2(" (at height=%d)", cur_height);
+ }
+ if (indirect_blocks) {
eol(0);
print_gfs2("Indirect blocks for this inode:");
- eol(0);
}
- total_dirents = 0;
- for (e = 0; (!termlines || e < termlines - start_line - 2) &&
+ eol(0);
+ for (e = start_row[dmode];
+ (!termlines ||
+ e < termlines - start_line - 2 + start_row[dmode]) &&
e < indir_blocks; e++) {
if (termlines) {
- if (edit_row[display_mode] >= 0 &&
- line - start_line - 2 == edit_row[display_mode])
+ if (edit_row[dmode] >= 0 &&
+ line - start_line - 2 == edit_row[dmode] -
+ start_row[dmode])
COLORS_HIGHLIGHT;
move(line, 1);
}
@@ -691,17 +728,33 @@
print_gfs2("0x%llx / %lld", indirect[e].block,
indirect[e].block);
if (termlines) {
- if (edit_row[display_mode] >= 0 &&
- line - start_line - 2 == edit_row[display_mode]) {
+ if (edit_row[dmode] >= 0 &&
+ line - start_line - 2 == edit_row[dmode] -
+ start_row[dmode]) {
sprintf(edit_string, "%"PRIx64, indirect[e].block);
strcpy(edit_fmt, "%"PRIx64);
- edit_size[display_mode] = strlen(edit_string);
+ edit_size[dmode] = strlen(edit_string);
COLORS_NORMAL;
}
}
+ if (!S_ISDIR(di.di_mode)) {
+ int hgt;
+ uint64_t file_offset = 0ull;
+
+ /* Now divide by how deep we are at the moment. */
+ /* This is how much data is represented by each */
+ /* indirect pointer for each height we've traversed. */
+ offsets[0] = e;
+ for (hgt = cur_height; hgt >= 0; hgt--)
+ file_offset += offsets[cur_height - hgt] *
+ factor[di.di_height - hgt - 1] *
+ (bufsize - sizeof(struct gfs2_meta_header));
+ print_gfs2(" ");
+ print_gfs2("(data offset 0x%llx / %lld)", file_offset,
+ file_offset);
+ print_gfs2(" ");
+ }
}
- if (indir_blocks == indirect_blocks)
- print_gfs2(" ");
if (indirect[e].is_dir) {
int d;
@@ -713,8 +766,10 @@
if (indirect[e].dirents > 1) {
eol(5);
if (termlines) {
- if (edit_row[display_mode] >=0 &&
- line - start_line - 2 == edit_row[display_mode]) {
+ if (edit_row[dmode] >=0 &&
+ line - start_line - 2 ==
+ edit_row[dmode] -
+ start_row[dmode]) {
COLORS_HIGHLIGHT;
sprintf(edit_string, "%"PRIx64,
indirect[e].dirent[d].block);
@@ -761,18 +816,17 @@
print_gfs2(" %s", indirect[e].dirent[d].filename);
if (termlines) {
- if (edit_row[display_mode] >= 0 &&
- line - start_line - 2 == edit_row[display_mode])
+ if (edit_row[dmode] >= 0 &&
+ line - start_line - 2 == edit_row[dmode] -
+ start_row[dmode])
COLORS_NORMAL;
}
}
} /* if isdir */
- else
- print_gfs2("indirect block");
eol(0);
} /* for termlines */
if (line >= 7) /* 7 because it was bumped at the end */
- edit_last[display_mode] = line - 7;
+ edit_last[dmode] = line - 7;
} /* if (indirect_blocks) */
else
print_gfs2("This block does not have indirect blocks.");
@@ -871,7 +925,7 @@
/* ------------------------------------------------------------------------ */
/* display */
/* ------------------------------------------------------------------------ */
-int display(enum dsp_mode display_mode, int identify_only)
+int display(enum dsp_mode dmode, int identify_only)
{
if (termlines) {
display_title_lines();
@@ -919,11 +973,11 @@
}
}
}
- edit_last[display_mode] = 0;
- if (display_mode == HEX_MODE) /* if hex display mode */
+ edit_last[dmode] = 0;
+ if (dmode == HEX_MODE) /* if hex display mode */
hexdump(dev_offset, buf, (gfs2_struct_type == GFS2_METATYPE_DI)?
struct_len + di.di_size:bufsize); /* show block in hex */
- else if (display_mode == GFS2_MODE) /* if structure display */
+ else if (dmode == GFS2_MODE) /* if structure display */
display_gfs2(); /* display the gfs2 structure */
else /* otherwise */
display_extended(); /* display extended blocks */
@@ -937,14 +991,17 @@
/* ------------------------------------------------------------------------ */
void push_block(uint64_t blk)
{
- int i;
+ int i, bhst;
+ bhst = blockhist % BLOCK_STACK_SIZE;
if (blk) {
- blockstack[blockhist % BLOCK_STACK_SIZE].display_mode = display_mode;
- for (i = 0; i < DISPLAY_MODES; i++) {
- blockstack[blockhist % BLOCK_STACK_SIZE].edit_row[i] = edit_row[i];
- blockstack[blockhist % BLOCK_STACK_SIZE].edit_col[i] = edit_col[i];
+ blockstack[bhst].dmode = dmode;
+ for (i = 0; i < DMODES; i++) {
+ blockstack[bhst].start_row[i] = start_row[i];
+ blockstack[bhst].edit_row[i] = edit_row[i];
+ blockstack[bhst].edit_col[i] = edit_col[i];
}
+ blockstack[bhst].gfs2_struct_type = gfs2_struct_type;
blockhist++;
blockstack[blockhist % BLOCK_STACK_SIZE].block = blk;
}
@@ -955,17 +1012,20 @@
/* ------------------------------------------------------------------------ */
uint64_t pop_block(void)
{
- int i;
+ int i, bhst;
if (!blockhist)
return block;
blockhist--;
- display_mode = blockstack[blockhist % BLOCK_STACK_SIZE].display_mode;
- for (i = 0; i < DISPLAY_MODES; i++) {
- edit_row[i] = blockstack[blockhist % BLOCK_STACK_SIZE].edit_row[i];
- edit_col[i] = blockstack[blockhist % BLOCK_STACK_SIZE].edit_col[i];
+ bhst = blockhist % BLOCK_STACK_SIZE;
+ dmode = blockstack[bhst].dmode;
+ for (i = 0; i < DMODES; i++) {
+ start_row[i] = blockstack[bhst].start_row[i];
+ edit_row[i] = blockstack[bhst].edit_row[i];
+ edit_col[i] = blockstack[bhst].edit_col[i];
}
- return blockstack[blockhist % BLOCK_STACK_SIZE].block;
+ gfs2_struct_type = blockstack[bhst].gfs2_struct_type;
+ return blockstack[bhst].block;
}
/* ------------------------------------------------------------------------ */
@@ -981,8 +1041,12 @@
if (bobgets(string, 1, 7, 16)) {
if (!strcmp(string,"root"))
temp_blk = sbd.sd_sb.sb_root_dir.no_addr;
- else if (!gfs1 && !strcmp(string,"master"))
- temp_blk = sbd.sd_sb.sb_master_dir.no_addr;
+ else if (!strcmp(string,"master")) {
+ if (!gfs1)
+ temp_blk = sbd.sd_sb.sb_master_dir.no_addr;
+ else
+ ; /* maybe put out an error message at some point */
+ }
else if (isalpha(string[0])) {
if (gfs1) {
if (!strcmp(string, "jindex"))
@@ -1063,7 +1127,7 @@
/* Accept keystrokes and act on them accordingly */
Quit = FALSE;
while (!Quit) {
- display(display_mode, FALSE);
+ display(dmode, FALSE);
while ((ch=getch()) == 0); // wait for input
switch (ch)
{
@@ -1079,9 +1143,15 @@
/* home - return to the superblock */
/* -------------------------------------------------------------- */
case KEY_HOME:
- block = 0x10;
- push_block(block);
- offset = 0;
+ if (dmode == EXTENDED_MODE) {
+ start_row[dmode] = 0;
+ edit_row[dmode] = 0;
+ }
+ else {
+ block = 0x10;
+ push_block(block);
+ offset = 0;
+ }
break;
/* -------------------------------------------------------------- */
/* backspace - return to the previous block on the stack */
@@ -1103,54 +1173,73 @@
/* arrow up */
/* -------------------------------------------------------------- */
case KEY_UP:
- if (edit_row[display_mode] >= 0) /* -1 means change block number */
- edit_row[display_mode]--;
+ if (dmode == EXTENDED_MODE) {
+ if (edit_row[dmode] > 0)
+ edit_row[dmode]--;
+ if (edit_row[dmode] < start_row[dmode])
+ start_row[dmode] = edit_row[dmode];
+ }
+ else {
+ if (edit_row[dmode] >= 0)
+ edit_row[dmode]--;
+ }
break;
/* -------------------------------------------------------------- */
/* arrow down */
/* -------------------------------------------------------------- */
case KEY_DOWN:
- if (edit_row[display_mode] < edit_last[display_mode])
- edit_row[display_mode]++;
+ if (dmode == EXTENDED_MODE) {
+ if (edit_row[dmode] + 1 <
+ (indirect_blocks ? indirect_blocks:indirect[0].dirents)) {
+ if (edit_row[dmode] >= edit_last[dmode] +
+ start_row[dmode])
+ start_row[dmode]++;
+ edit_row[dmode]++;
+ }
+ }
+ else {
+ if (edit_row[dmode] < edit_last[dmode])
+ edit_row[dmode]++;
+ }
break;
/* -------------------------------------------------------------- */
/* arrow left */
/* -------------------------------------------------------------- */
case KEY_LEFT:
- if (display_mode == HEX_MODE) {
- if (edit_col[display_mode] > 0)
- edit_col[display_mode]--;
+ if (dmode == HEX_MODE) {
+ if (edit_col[dmode] > 0)
+ edit_col[dmode]--;
else
- edit_col[display_mode] = 15;
+ edit_col[dmode] = 15;
}
break;
/* -------------------------------------------------------------- */
/* arrow right */
/* -------------------------------------------------------------- */
case KEY_RIGHT:
- if (display_mode == HEX_MODE) {
- if (edit_col[display_mode] < 15)
- edit_col[display_mode]++;
+ if (dmode == HEX_MODE) {
+ if (edit_col[dmode] < 15)
+ edit_col[dmode]++;
else
- edit_col[display_mode] = 0;
+ edit_col[dmode] = 0;
}
break;
/* -------------------------------------------------------------- */
/* m - change display mode key */
/* -------------------------------------------------------------- */
case 'm':
- display_mode = ((display_mode + 1) % DISPLAY_MODES);
+ dmode = ((dmode + 1) % DMODES);
break;
/* -------------------------------------------------------------- */
/* J - Jump to highlighted block number */
/* -------------------------------------------------------------- */
case 'j':
- if (display_mode == HEX_MODE) {
+ if (dmode == HEX_MODE) {
unsigned int col2;
uint64_t *b;
- col2 = edit_col[display_mode] & 0x08;/* thus 0-7->0, 8-15->8 */
- b = (uint64_t *)&buf[edit_row[display_mode]*16 + offset + col2];
+ col2 = edit_col[dmode] & 0x08;/* thus 0-7->0, 8-15->8 */
+ b = (uint64_t *)&buf[edit_row[dmode]*16 + offset + col2];
temp_blk=be64_to_cpu(*b);
}
else
@@ -1161,8 +1250,8 @@
offset = 0;
block = temp_blk;
push_block(block);
- for (i = 0; i < DISPLAY_MODES; i++) {
- edit_row[i] = 0;
+ for (i = 0; i < DMODES; i++) {
+ start_row[i] = edit_row[i] = 0;
edit_col[i] = 0;
}
}
@@ -1183,10 +1272,9 @@
/* b - Back one 4K block */
/* -------------------------------------------------------------- */
case 'b':
- edit_row[display_mode] = 0;
- if (block > 0) {
+ start_row[dmode] = edit_row[dmode] = 0;
+ if (block > 0)
block--;
- }
offset = 0;
break;
/* -------------------------------------------------------------- */
@@ -1203,24 +1291,49 @@
case KEY_PPAGE: // PgUp
case 0x15: // ctrl-u for vi compat.
case 0x02: // ctrl-b for less compat.
- edit_row[display_mode] = 0;
- if (display_mode == GFS2_MODE || offset==0) {
- block--;
- if (display_mode == HEX_MODE)
- offset = (bufsize % screen_chunk_size) > 0 ?
- screen_chunk_size * (bufsize / screen_chunk_size) :
- bufsize - screen_chunk_size;
+ if (dmode == EXTENDED_MODE) {
+ int lines_of_display = termlines - 6;
+
+ if (edit_row[dmode] - lines_of_display > 0) {
+ start_row[dmode] -= lines_of_display;
+ edit_row[dmode] -= lines_of_display;
+ }
+ else {
+ start_row[dmode] = 0;
+ edit_row[dmode] = 0;
+ }
+ }
+ else {
+ start_row[dmode] = edit_row[dmode] = 0;
+ if (dmode == GFS2_MODE || offset==0) {
+ block--;
+ if (dmode == HEX_MODE)
+ offset = (bufsize % screen_chunk_size) > 0 ?
+ screen_chunk_size * (bufsize / screen_chunk_size) :
+ bufsize - screen_chunk_size;
+ else
+ offset = 0;
+ }
else
- offset = 0;
+ offset -= screen_chunk_size;
}
- else
- offset -= screen_chunk_size;
+ break;
+ /* -------------------------------------------------------------- */
+ /* end - Jump to the end of the list */
+ /* -------------------------------------------------------------- */
+ case 0x168:
+ if (dmode == EXTENDED_MODE) {
+ edit_row[dmode] =
+ (indirect_blocks? indirect_blocks - 1:indirect[0].dirents - 1);
+ start_row[dmode] = edit_row[dmode] - (termlines - 7);
+ }
+ /* TODO: Make "end" key work for other display modes. */
break;
/* -------------------------------------------------------------- */
/* f - Forward one 4K block */
/* -------------------------------------------------------------- */
case 'f':
- edit_row[display_mode] = 0;
+ start_row[dmode] = edit_row[dmode] = 0;
block++;
offset = 0;
break;
@@ -1230,14 +1343,29 @@
case 0x16: // ctrl-v for vt100
case KEY_NPAGE: // PgDown
case 0x04: // ctrl-d for vi compat.
- edit_row[display_mode] = 0;
- if (display_mode == GFS2_MODE ||
- offset + screen_chunk_size >= bufsize) {
- block++;
- offset = 0;
+ if (dmode == EXTENDED_MODE) {
+ int lines_of_display = termlines - 6;
+
+ if (edit_row[dmode] + lines_of_display + 1 <
+ (indirect_blocks ? indirect_blocks:indirect[0].dirents)) {
+ start_row[dmode] += lines_of_display;
+ edit_row[dmode] += lines_of_display;
+ }
+ else {
+ edit_row[dmode] =
+ (indirect_blocks ? indirect_blocks - 1:indirect[0].dirents - 1);
+ }
+ }
+ else {
+ start_row[dmode] = edit_row[dmode] = 0;
+ if (dmode == GFS2_MODE ||
+ offset + screen_chunk_size >= bufsize) {
+ block++;
+ offset = 0;
+ }
+ else
+ offset += screen_chunk_size;
}
- else
- offset += screen_chunk_size;
break;
/* -------------------------------------------------------------- */
/* enter key - change a value */
@@ -1245,22 +1373,22 @@
case(KEY_ENTER):
case('\n'):
case('\r'):
- if (edit_row[display_mode] == -1)
+ if (edit_row[dmode] == -1)
block = goto_block();
else {
- if (display_mode == HEX_MODE) {
+ if (dmode == HEX_MODE) {
left_off = ((block * bufsize) < 0xffffffff) ? 9 : 17;
/* 8 and 16 char addresses on screen */
- if (bobgets(edit_string, edit_row[display_mode] + 3,
- (edit_col[display_mode] * 2) +
- (edit_col[display_mode] / 4) + left_off, 2)) {
+ if (bobgets(edit_string, edit_row[dmode] + 3,
+ (edit_col[dmode] * 2) +
+ (edit_col[dmode] / 4) + left_off, 2)) {
if (strstr(edit_fmt,"X") || strstr(edit_fmt,"x")) {
int hexoffset;
unsigned char ch;
- hexoffset = (edit_row[display_mode] * 16) +
- edit_col[display_mode];
+ hexoffset = (edit_row[dmode] * 16) +
+ edit_col[dmode];
ch = 0x00;
if (isdigit(edit_string[0]))
ch = (edit_string[0] - '0') * 0x10;
@@ -1285,17 +1413,17 @@
}
}
}
- else if (display_mode == GFS2_MODE)
- bobgets(edit_string, edit_row[display_mode] + 4, 24,
- edit_size[display_mode]);
+ else if (dmode == GFS2_MODE)
+ bobgets(edit_string, edit_row[dmode] + 4, 24,
+ edit_size[dmode]);
else
- bobgets(edit_string, edit_row[display_mode] + 6, 14,
- edit_size[display_mode]);
+ bobgets(edit_string, edit_row[dmode] + 6, 14,
+ edit_size[dmode]);
}
break;
default:
move(termlines - 1, 0);
- printw("Keystroke not understood: %02X",ch);
+ printw("Keystroke not understood: 0x%03X",ch);
refresh();
sleep(1);
break;
@@ -1376,7 +1504,7 @@
else if (!strcasecmp(argv[i], "-p") ||
!strcasecmp(argv[i], "-print")) {
termlines = 0; /* initial value--we'll figure it out later */
- display_mode = GFS2_MODE;
+ dmode = GFS2_MODE;
}
else if (strchr(argv[i],'/'))
strcpy(device, argv[i]);
@@ -1386,7 +1514,7 @@
uint64_t temp_blk;
if (!strcasecmp(argv[i], "-x"))
- display_mode = HEX_MODE;
+ dmode = HEX_MODE;
else if (argv[i][0] == '-') /* if it starts with a dash */
; /* ignore it--meant for pass == 0 */
else if (!strcmp(argv[i], "identify"))
@@ -1400,8 +1528,12 @@
else if (!strcmp(argv[i], "root") ||
!strcmp(argv[i], "rootdir"))
push_block(sbd.sd_sb.sb_root_dir.no_addr);
- else if (!gfs1 && !strcmp(argv[i], "master"))
- push_block(sbd.sd_sb.sb_master_dir.no_addr);
+ else if (!strcmp(argv[i], "master")) {
+ if (!gfs1)
+ push_block(sbd.sd_sb.sb_master_dir.no_addr);
+ else
+ fprintf(stderr, "This is GFS1; there's no master directory.\n");
+ }
else if (!strcmp(argv[i], "jindex")) {
if (gfs1)
push_block(sbd1->sb_jindex_di.no_addr);
@@ -1461,17 +1593,19 @@
prog_name = argv[0];
+ memset(start_row, 0, sizeof(start_row));
memset(edit_row, 0, sizeof(edit_row));
memset(edit_col, 0, sizeof(edit_col));
memset(edit_size, 0, sizeof(edit_size));
memset(edit_last, 0, sizeof(edit_last));
- display_mode = HEX_MODE;
+ dmode = HEX_MODE;
type_alloc(buf, char, bufsize); /* allocate/malloc a new 4K buffer */
block = 0x10;
for (i = 0; i < BLOCK_STACK_SIZE; i++) {
- blockstack[i].display_mode = display_mode;
+ blockstack[i].dmode = dmode;
blockstack[i].block = block;
- for (j = 0; j < DISPLAY_MODES; j++) {
+ for (j = 0; j < DMODES; j++) {
+ blockstack[i].start_row[j] = 0;
blockstack[i].edit_row[j] = 0;
blockstack[i].edit_col[j] = 0;
}
@@ -1498,7 +1632,7 @@
else { /* print all the structures requested */
for (i = 0; i <= blockhist; i++) {
block = blockstack[i + 1].block;
- display(display_mode, identify);
+ display(dmode, identify);
if (!identify) {
display_extended();
printf("-------------------------------------" \
--- cluster/gfs2/edit/hexedit.h 2006/11/14 20:11:10 1.6
+++ cluster/gfs2/edit/hexedit.h 2007/02/08 05:41:16 1.7
@@ -39,7 +39,7 @@
#define INIT(X) =X
#endif
-#define DISPLAY_MODES 3
+#define DMODES 3
enum dsp_mode { HEX_MODE = 0, GFS2_MODE = 1, EXTENDED_MODE = 2 };
#define BLOCK_STACK_SIZE 256
@@ -76,8 +76,9 @@
EXTERN int line INIT(1);
EXTERN int struct_len INIT(0);
EXTERN unsigned int offset;
-EXTERN int edit_row[DISPLAY_MODES], edit_col[DISPLAY_MODES];
-EXTERN int edit_size[DISPLAY_MODES], edit_last[DISPLAY_MODES];
+EXTERN int edit_row[DMODES], edit_col[DMODES];
+EXTERN int start_row[DMODES];
+EXTERN int edit_size[DMODES], edit_last[DMODES];
EXTERN char edit_string[1024], edit_fmt[80];
EXTERN struct gfs2_sbd sbd;
EXTERN struct gfs_sb *sbd1;
@@ -114,9 +115,15 @@
struct blkstack_info {
uint64_t block;
- int edit_row[DISPLAY_MODES];
- int edit_col[DISPLAY_MODES];
- enum dsp_mode display_mode;
+ int start_row[DMODES];
+ int edit_row[DMODES];
+ int edit_col[DMODES];
+ enum dsp_mode dmode;
+ int gfs2_struct_type;
+};
+
+struct metapath {
+ uint64_t mp_list[GFS2_MAX_META_HEIGHT];
};
struct gfs_sb {
@@ -154,7 +161,7 @@
4K block */
EXTERN struct indirect_info masterdir; /* Master directory info */
EXTERN int indirect_blocks INIT(0); /* count of indirect blocks */
-EXTERN enum dsp_mode display_mode INIT(HEX_MODE);
+EXTERN enum dsp_mode dmode INIT(HEX_MODE);
#define SCREEN_HEIGHT (16)
#define SCREEN_WIDTH (16)
More information about the Cluster-devel
mailing list