From: rpeterso@sourceware.org <rpeterso@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] cluster/gfs2/edit gfs2hex.c hexedit.c hexedit.h
Date: 13 Feb 2007 01:07:36 -0000 [thread overview]
Message-ID: <20070213010736.16246.qmail@sourceware.org> (raw)
CVSROOT: /cvs/cluster
Module name: cluster
Changes by: rpeterso at sourceware.org 2007-02-13 01:07:35
Modified files:
gfs2/edit : gfs2hex.c hexedit.c hexedit.h
Log message:
Misc improvements. Better scrolling. You can now scroll through
the rindex. The superblock now has a pseudo-extended display.
Fixed the file offset calculations for indirect pointers.
It still has some bugs but it's better than it was.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/edit/gfs2hex.c.diff?cvsroot=cluster&r1=1.8&r2=1.9
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/edit/hexedit.c.diff?cvsroot=cluster&r1=1.9&r2=1.10
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/edit/hexedit.h.diff?cvsroot=cluster&r1=1.7&r2=1.8
--- cluster/gfs2/edit/gfs2hex.c 2007/02/08 05:41:16 1.8
+++ cluster/gfs2/edit/gfs2hex.c 2007/02/13 01:07:35 1.9
@@ -44,7 +44,7 @@
extern char edit_string[1024];
extern int edit_mode INIT(0);
extern int edit_row[DMODES], edit_col[DMODES];
-extern int edit_size[DMODES], edit_last[DMODES];
+extern int edit_size[DMODES], last_entry_onscreen[DMODES];
extern char edit_string[1024], edit_fmt[80];
extern enum dsp_mode dmode INIT(HEX_MODE); /* display mode */
@@ -76,6 +76,33 @@
va_end(args);
}
+void check_highlight(int highlight)
+{
+ if (!termlines || line >= termlines) /* If printing or out of bounds */
+ return;
+ if (dmode == HEX_MODE) {
+ if (line == (edit_row[dmode] * lines_per_row[dmode]) + 4) {
+ if (highlight) {
+ COLORS_HIGHLIGHT;
+ last_entry_onscreen[dmode] = print_entry_ndx;
+ }
+ else
+ COLORS_NORMAL;
+ }
+ }
+ else {
+ if ((line * lines_per_row[dmode]) - 4 ==
+ (edit_row[dmode] - start_row[dmode]) * lines_per_row[dmode]) {
+ if (highlight) {
+ COLORS_HIGHLIGHT;
+ last_entry_onscreen[dmode] = print_entry_ndx;
+ }
+ else
+ COLORS_NORMAL;
+ }
+ }
+}
+
void print_it(const char *label, const char *fmt, const char *fmt2, ...)
{
va_list args;
@@ -85,13 +112,10 @@
if (!termlines || line < termlines) {
va_start(args, fmt2);
+ check_highlight(TRUE);
if (termlines) {
- if (line == edit_row[dmode] + 4)
- COLORS_HIGHLIGHT;
move(line,0);
printw("%s", label);
- if (line == edit_row[dmode] + 4)
- COLORS_NORMAL;
move(line,24);
}
else {
@@ -102,28 +126,21 @@
}
vsprintf(tmp_string, fmt, args);
- if (termlines) {
- if (line == edit_row[dmode] + 4)
- COLORS_HIGHLIGHT;
+ if (termlines)
printw(tmp_string);
- if (line == edit_row[dmode] + 4)
- COLORS_NORMAL;
- }
else
printf(tmp_string);
+ check_highlight(FALSE);
if (fmt2) {
decimalsize = strlen(tmp_string);
va_end(args);
va_start(args, fmt2);
vsprintf(tmp_string, fmt2, args);
+ check_highlight(TRUE);
if (termlines) {
move(line, 50);
- if (line == edit_row[dmode] + 4)
- COLORS_HIGHLIGHT;
printw("%s", tmp_string);
- if (line == edit_row[dmode] + 4)
- COLORS_NORMAL;
}
else {
int i;
@@ -131,6 +148,7 @@
printf(" ");
printf("%s", tmp_string);
}
+ check_highlight(FALSE);
}
else {
if (strstr(fmt,"X") || strstr(fmt,"x"))
@@ -148,14 +166,13 @@
}
if (termlines) {
refresh();
- if (line == edit_row[dmode] + 4) {
+ if (line == (edit_row[dmode] * lines_per_row[dmode]) + 4) {
strcpy(edit_string, tmp_string);
strcpy(edit_fmt, fmt);
edit_size[dmode] = strlen(edit_string);
COLORS_NORMAL;
}
- if (line - 3 > edit_last[dmode])
- edit_last[dmode] = line - 4;
+ last_entry_onscreen[dmode] = (line / lines_per_row[dmode]) - 4;
}
eol(0);
va_end(args);
@@ -327,7 +344,7 @@
unsigned int x;
eol(0);
- printf("Directory Entries:");
+ print_gfs2("Directory Entries:");
eol(0);
for (x = sizeof(struct gfs2_leaf); x < bufsize; x += de.de_rec_len) {
@@ -361,7 +378,7 @@
unsigned int x;
eol(0);
- printf("Eattr Entries:");
+ print_gfs2("Eattr Entries:");
eol(0);
for (x = sizeof(struct gfs2_meta_header); x < bufsize; x += ea.ea_rec_len)
@@ -375,8 +392,10 @@
void gfs2_inum_print2(const char *title,struct gfs2_inum *no)
{
if (termlines) {
+ check_highlight(TRUE);
move(line,2);
printw(title);
+ check_highlight(FALSE);
}
else
printf(" %s:",title);
--- cluster/gfs2/edit/hexedit.c 2007/02/08 05:41:16 1.9
+++ cluster/gfs2/edit/hexedit.c 2007/02/13 01:07:35 1.10
@@ -42,7 +42,7 @@
#include <syslog.h>
-int display(enum dsp_mode dmode, int identify_only);
+int display(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(dmode, FALSE);
+ display(FALSE);
signal(SIGWINCH, UpdateSize);
}
@@ -465,6 +465,7 @@
pointer = (unsigned char *)lpBuffer + offset;
ptr2 = (unsigned char *)lpBuffer + offset;
l = offset;
+ print_entry_ndx = 0;
while (((termlines &&
line < termlines &&
line <= ((screen_chunk_size / 16) + 2)) ||
@@ -524,10 +525,11 @@
ptr2++;
}
print_gfs2("] ");
- if (line - 3 > edit_last[dmode])
- edit_last[dmode] = line - 3;
+ if (line - 3 > last_entry_onscreen[dmode])
+ last_entry_onscreen[dmode] = line - 3;
eol(0);
l+=16;
+ print_entry_ndx++;
} /* while */
if (gfs1) {
COLORS_NORMAL;
@@ -556,24 +558,40 @@
/* ------------------------------------------------------------------------ */
int print_rindex(struct gfs2_inode *di)
{
- int rgs, error;
+ int error, start_line;
struct gfs2_rindex ri;
char buf[sizeof(struct gfs2_rindex)];
+ start_line = line;
error = 0;
print_gfs2("RG index entries found: %d.",
di->i_di.di_size / sizeof(struct gfs2_rindex));
eol(0);
- for (rgs=0; ; rgs++) {
- error = gfs2_readi(di, (void *)&buf, rgs * sizeof(struct gfs2_rindex),
+ lines_per_row[dmode] = 6;
+ for (print_entry_ndx=0; ; print_entry_ndx++) {
+ error = gfs2_readi(di, (void *)&buf,
+ print_entry_ndx * sizeof(struct gfs2_rindex),
sizeof(struct gfs2_rindex));
gfs2_rindex_in(&ri, buf);
if (!error) /* end of file */
break;
- print_gfs2("RG #%d", rgs + 1);
- eol(0);
- gfs2_rindex_print(&ri);
+ if (!termlines ||
+ (print_entry_ndx >= start_row[dmode] &&
+ ((print_entry_ndx - start_row[dmode])+1) * lines_per_row[dmode] <=
+ termlines - start_line - 2)) {
+ if (edit_row[dmode] == print_entry_ndx) {
+ COLORS_HIGHLIGHT;
+ sprintf(edit_string, "%" PRIx64, ri.ri_addr);
+ }
+ print_gfs2("RG #%d", print_entry_ndx);
+ eol(0);
+ if (edit_row[dmode] == print_entry_ndx)
+ COLORS_NORMAL;
+ gfs2_rindex_print(&ri);
+ last_entry_onscreen[dmode] = print_entry_ndx;
+ }
}
+ end_row[dmode] = print_entry_ndx;
return error;
}
@@ -644,213 +662,251 @@
}
/* ------------------------------------------------------------------------ */
-/* display_extended */
+/* has_indirect_blocks */
/* ------------------------------------------------------------------------ */
-int display_extended(void)
+int has_indirect_blocks(void)
{
- int e, start_line, total_dirents, indir_blocks;
- struct gfs2_inode *tmp_inode;
+ if (indirect_blocks || gfs2_struct_type == GFS2_METATYPE_SB ||
+ (gfs2_struct_type == GFS2_METATYPE_DI &&
+ (S_ISDIR(di.di_mode) || (gfs1 && di.__pad1 == GFS_FILE_DIR))))
+ return TRUE;
+ return FALSE;
+}
- edit_last[dmode] = 0;
+/* ------------------------------------------------------------------------ */
+/* print_inode_type */
+/* ------------------------------------------------------------------------ */
+void print_inode_type(__be16 de_type)
+{
+ switch(de_type) {
+ case DT_UNKNOWN:
+ print_gfs2("Unknown");
+ break;
+ case DT_REG:
+ print_gfs2("File ");
+ break;
+ case DT_DIR:
+ print_gfs2("Dir ");
+ break;
+ case DT_LNK:
+ print_gfs2("Symlink");
+ break;
+ case DT_BLK:
+ print_gfs2("BlkDev ");
+ break;
+ case DT_CHR:
+ print_gfs2("ChrDev ");
+ break;
+ case DT_FIFO:
+ print_gfs2("Fifo ");
+ break;
+ case DT_SOCK:
+ print_gfs2("Socket ");
+ break;
+ default:
+ print_gfs2("%04x ", de_type);
+ break;
+ }
+}
+
+/* ------------------------------------------------------------------------ */
+/* display_indirect */
+/* ------------------------------------------------------------------------ */
+int display_indirect(void)
+{
+ int start_line, total_dirents, indir_blocks;
+ int i, cur_height = -1;
+ uint64_t factor[5];
+ int offsets[5];
+
+ last_entry_onscreen[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];
+ if (!has_indirect_blocks())
+ return -01;
- indir_blocks = indirect_blocks;
- if (!indirect_blocks) {
+ indir_blocks = indirect_blocks;
+ if (!indirect_blocks) {
+ if (gfs2_struct_type == GFS2_METATYPE_SB)
+ print_gfs2("The superblock has 2 directories");
+ else
print_gfs2("This directory contains %d directory entries.",
indirect[0].dirents);
- indir_blocks = 1; /* not really an indirect block, but treat it as one */
- }
- else {
- 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);
- }
+ indir_blocks = 1; /* not really an indirect block, but treat it as one */
+ }
+ else {
+ 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 indirect block contains %d indirect blocks",
+ print_gfs2("This inode 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. */
+ else
+ 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;
- 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:");
+ 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] * (gfs1 ? 501 : 509);
}
+ print_gfs2(" (at height=%d)", cur_height);
+ }
+ if (indirect_blocks) {
eol(0);
- for (e = start_row[dmode];
- (!termlines ||
- e < termlines - start_line - 2 + start_row[dmode]) &&
- e < indir_blocks; e++) {
+ print_gfs2("Indirect blocks:");
+ }
+ eol(0);
+ for (print_entry_ndx = start_row[dmode];
+ (!termlines || print_entry_ndx < termlines - start_line - 2
+ + start_row[dmode]) && print_entry_ndx < indir_blocks;
+ print_entry_ndx++) {
+ if (termlines) {
+ if (edit_row[dmode] >= 0 &&
+ line - start_line - 2 == edit_row[dmode] -
+ start_row[dmode])
+ COLORS_HIGHLIGHT;
+ move(line, 1);
+ }
+ if (indir_blocks == indirect_blocks) {
+ print_gfs2("%d => ", print_entry_ndx);
+ if (termlines)
+ move(line,9);
+ print_gfs2("0x%llx / %lld", indirect[print_entry_ndx].block,
+ indirect[print_entry_ndx].block);
if (termlines) {
if (edit_row[dmode] >= 0 &&
line - start_line - 2 == edit_row[dmode] -
- start_row[dmode])
- COLORS_HIGHLIGHT;
- move(line, 1);
- }
- if (indir_blocks == indirect_blocks) {
- print_gfs2("%d => ", e);
- if (termlines)
- move(line,9);
- print_gfs2("0x%llx / %lld", indirect[e].block,
- indirect[e].block);
+ start_row[dmode]) {
+ sprintf(edit_string, "%"PRIx64,
+ indirect[print_entry_ndx].block);
+ strcpy(edit_fmt, "%"PRIx64);
+ edit_size[dmode] = strlen(edit_string);
+ COLORS_NORMAL;
+ }
+ }
+ if (!S_ISDIR(di.di_mode)) {
+ int hgt;
+ uint64_t file_offset = 0ull;
+ float human_off;
+ char h;
+
+ /* 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] = print_entry_ndx;
+ for (hgt = cur_height; hgt >= 0; hgt--)
+ file_offset += offsets[cur_height - hgt] *
+ factor[di.di_height - hgt - 1] * bufsize;
+ print_gfs2(" ");
+ h = 'K';
+ human_off = (file_offset / 1024.0);
+ if (human_off > 1024.0) { h = 'M'; human_off /= 1024.0; }
+ if (human_off > 1024.0) { h = 'G'; human_off /= 1024.0; }
+ if (human_off > 1024.0) { h = 'T'; human_off /= 1024.0; }
+ if (human_off > 1024.0) { h = 'P'; human_off /= 1024.0; }
+ if (human_off > 1024.0) { h = 'E'; human_off /= 1024.0; }
+ print_gfs2("(data offset 0x%llx / %lld / %6.2f%c)",
+ file_offset, file_offset, human_off, h);
+ print_gfs2(" ");
+ }
+ }
+ if (indirect[print_entry_ndx].is_dir) {
+ int d;
+
+ if (indirect[print_entry_ndx].dirents > 1 &&
+ indir_blocks == indirect_blocks)
+ print_gfs2("(directory leaf with %d entries)",
+ indirect[print_entry_ndx].dirents);
+ for (d = 0; d < indirect[print_entry_ndx].dirents; d++) {
+ total_dirents++;
+ if (indirect[print_entry_ndx].dirents > 1) {
+ eol(5);
+ if (termlines) {
+ if (edit_row[dmode] >=0 &&
+ line - start_line - 2 ==
+ edit_row[dmode] -
+ start_row[dmode]) {
+ COLORS_HIGHLIGHT;
+ sprintf(edit_string, "%"PRIx64,
+ indirect[print_entry_ndx].dirent[d].block);
+ strcpy(edit_fmt, "%"PRIx64);
+ }
+ }
+ print_gfs2("%d. (%d). %lld (0x%llx) / %lld (0x%llx): ",
+ total_dirents, d + 1,
+ indirect[print_entry_ndx].dirent[d].dirent.de_inum.no_formal_ino,
+ indirect[print_entry_ndx].dirent[d].dirent.de_inum.no_formal_ino,
+ indirect[print_entry_ndx].dirent[d].block,
+ indirect[print_entry_ndx].dirent[d].block);
+ }
+ print_inode_type(indirect[print_entry_ndx].dirent[d].dirent.de_type);
+ print_gfs2(" %s", indirect[print_entry_ndx].dirent[d].filename);
if (termlines) {
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[dmode] = strlen(edit_string);
+ start_row[dmode])
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 (indirect[e].is_dir) {
- int d;
-
- if (indirect[e].dirents > 1 && indir_blocks == indirect_blocks)
- print_gfs2("(directory leaf with %d entries)",
- indirect[e].dirents);
- for (d = 0; d < indirect[e].dirents; d++) {
- total_dirents++;
- if (indirect[e].dirents > 1) {
- eol(5);
- if (termlines) {
- 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);
- strcpy(edit_fmt, "%"PRIx64);
- }
- }
- print_gfs2("%d. (%d). %lld (0x%llx) / %lld (0x%llx): ",
- total_dirents, d + 1,
- indirect[e].dirent[d].dirent.de_inum.no_formal_ino,
- indirect[e].dirent[d].dirent.de_inum.no_formal_ino,
- indirect[e].dirent[d].block,
- indirect[e].dirent[d].block);
- }
- switch(indirect[e].dirent[d].dirent.de_type) {
- case DT_UNKNOWN:
- print_gfs2("Unknown");
- break;
- case DT_REG:
- print_gfs2("File ");
- break;
- case DT_DIR:
- print_gfs2("Dir ");
- break;
- case DT_LNK:
- print_gfs2("Symlink");
- break;
- case DT_BLK:
- print_gfs2("BlkDev ");
- break;
- case DT_CHR:
- print_gfs2("ChrDev ");
- break;
- case DT_FIFO:
- print_gfs2("Fifo ");
- break;
- case DT_SOCK:
- print_gfs2("Socket ");
- break;
- default:
- print_gfs2("%04x ",
- indirect[e].dirent[d].dirent.de_type);
- break;
- }
-
- print_gfs2(" %s", indirect[e].dirent[d].filename);
- if (termlines) {
- if (edit_row[dmode] >= 0 &&
- line - start_line - 2 == edit_row[dmode] -
- start_row[dmode])
- COLORS_NORMAL;
- }
}
- } /* if isdir */
- eol(0);
- } /* for termlines */
- if (line >= 7) /* 7 because it was bumped at the end */
- edit_last[dmode] = line - 7;
- } /* if (indirect_blocks) */
- else
- print_gfs2("This block does not have indirect blocks.");
+ }
+ } /* if isdir */
+ eol(0);
+ } /* for each display row */
+ if (line >= 7) /* 7 because it was bumped at the end */
+ last_entry_onscreen[dmode] = line - 7;
eol(0);
+ end_row[dmode] = (indirect_blocks ? indirect_blocks:indirect[0].dirents);
+ if (end_row[dmode] < last_entry_onscreen[dmode])
+ end_row[dmode] = last_entry_onscreen[dmode];
+ lines_per_row[dmode] = 1;
+ return 0;
+}
+
+/* ------------------------------------------------------------------------ */
+/* display_extended */
+/* ------------------------------------------------------------------------ */
+int display_extended(void)
+{
+ struct gfs2_inode *tmp_inode;
+ struct gfs2_buffer_head *tmp_bh;
+
+ /* Display any indirect pointers that we have. */
+ if (display_indirect() < 0)
+ return -1;
if ((gfs1 && block == sbd1->sb_rindex_di.no_addr) ||
(block == masterblock("rindex"))) {
- struct gfs2_buffer_head *tmp_bh;
-
tmp_bh = bread(&sbd, block);
tmp_inode = inode_get(&sbd, tmp_bh);
print_rindex(tmp_inode);
brelse(tmp_bh, not_updated);
}
else if (!gfs1 && block == masterblock("inum")) {
- struct gfs2_buffer_head *tmp_bh;
-
tmp_bh = bread(&sbd, block);
tmp_inode = inode_get(&sbd, tmp_bh);
print_inum(tmp_inode);
brelse(tmp_bh, not_updated);
}
else if (!gfs1 && block == masterblock("statfs")) {
- struct gfs2_buffer_head *tmp_bh;
-
tmp_bh = bread(&sbd, block);
tmp_inode = inode_get(&sbd, tmp_bh);
print_statfs(tmp_inode);
@@ -858,8 +914,6 @@
}
else if ((gfs1 && block == gfs1_quota_di.no_addr) ||
(block == masterblock("quota"))) {
- struct gfs2_buffer_head *tmp_bh;
-
tmp_bh = bread(&sbd, block);
tmp_inode = inode_get(&sbd, tmp_bh);
print_quota(tmp_inode);
@@ -925,7 +979,7 @@
/* ------------------------------------------------------------------------ */
/* display */
/* ------------------------------------------------------------------------ */
-int display(enum dsp_mode dmode, int identify_only)
+int display(int identify_only)
{
if (termlines) {
display_title_lines();
@@ -943,8 +997,30 @@
if (identify_only)
return 0;
indirect_blocks = 0;
- if (gfs2_struct_type == GFS2_METATYPE_SB || block == 0x10)
+ lines_per_row[dmode] = 1;
+ if (gfs2_struct_type == GFS2_METATYPE_SB || block == 0x10) {
gfs2_sb_in(&sbd.sd_sb, buf); /* parse it out into the sb structure */
+ memset(&indirect, 0, sizeof(indirect));
+ indirect[0].block = sbd.sd_sb.sb_master_dir.no_addr;
+ indirect[0].is_dir = TRUE;
+ indirect[0].dirents = 2;
+
+ memcpy(&indirect[0].dirent[0].filename, "root", 4);
+ indirect[0].dirent[0].dirent.de_inum.no_formal_ino =
+ sbd.sd_sb.sb_root_dir.no_formal_ino;
+ indirect[0].dirent[0].dirent.de_inum.no_addr =
+ sbd.sd_sb.sb_root_dir.no_addr;
+ indirect[0].dirent[0].block = sbd.sd_sb.sb_root_dir.no_addr;
+ indirect[0].dirent[0].dirent.de_type = DT_DIR;
+
+ memcpy(&indirect[0].dirent[1].filename, "master", 7);
+ indirect[0].dirent[1].dirent.de_inum.no_formal_ino =
+ sbd.sd_sb.sb_master_dir.no_formal_ino;
+ indirect[0].dirent[1].dirent.de_inum.no_addr =
+ sbd.sd_sb.sb_master_dir.no_addr;
+ indirect[0].dirent[1].block = sbd.sd_sb.sb_master_dir.no_addr;
+ indirect[0].dirent[1].dirent.de_type = DT_DIR;
+ }
else if (gfs2_struct_type == GFS2_METATYPE_DI) {
gfs2_dinode_in(&di, buf); /* parse disk inode into structure */
do_dinode_extended(&di, buf); /* get extended data, if any */
@@ -973,14 +1049,22 @@
}
}
}
- edit_last[dmode] = 0;
+ last_entry_onscreen[dmode] = 0;
+ if (dmode == EXTENDED_MODE && !has_indirect_blocks())
+ dmode = HEX_MODE;
+ if (termlines) {
+ move(termlines, 63);
+ printw("Mode: %s", (dmode==HEX_MODE?"Hex edit ":(dmode==GFS2_MODE?"Structure":"Pointers ")));
+ move(line, 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 (dmode == GFS2_MODE) /* if structure display */
display_gfs2(); /* display the gfs2 structure */
- else /* otherwise */
+ else
display_extended(); /* display extended blocks */
+ /* No else here, because display_extended can switch back to hex mode */
if (termlines)
refresh();
return(0);
@@ -998,8 +1082,10 @@
blockstack[bhst].dmode = dmode;
for (i = 0; i < DMODES; i++) {
blockstack[bhst].start_row[i] = start_row[i];
+ blockstack[bhst].end_row[i] = end_row[i];
blockstack[bhst].edit_row[i] = edit_row[i];
blockstack[bhst].edit_col[i] = edit_col[i];
+ blockstack[bhst].lines_per_row[i] = lines_per_row[i];
}
blockstack[bhst].gfs2_struct_type = gfs2_struct_type;
blockhist++;
@@ -1021,8 +1107,10 @@
dmode = blockstack[bhst].dmode;
for (i = 0; i < DMODES; i++) {
start_row[i] = blockstack[bhst].start_row[i];
+ end_row[i] = blockstack[bhst].end_row[i];
edit_row[i] = blockstack[bhst].edit_row[i];
edit_col[i] = blockstack[bhst].edit_col[i];
+ lines_per_row[i] = blockstack[bhst].lines_per_row[i];
}
gfs2_struct_type = blockstack[bhst].gfs2_struct_type;
return blockstack[bhst].block;
@@ -1093,7 +1181,7 @@
init_pair(COLOR_NORMAL, COLOR_BLACK, COLOR_WHITE); /* normal text */
init_pair(COLOR_INVERSE, COLOR_WHITE, COLOR_BLACK); /* inverse text */
init_pair(COLOR_SPECIAL, COLOR_RED, COLOR_WHITE); /* special text */
- init_pair(COLOR_HIGHLIGHT, COLOR_GREEN, COLOR_WHITE); /* highlighted */
+ init_pair(COLOR_HIGHLIGHT, COLOR_MAGENTA, COLOR_WHITE); /* highlighted */
init_pair(COLOR_OFFSETS, COLOR_CYAN, COLOR_WHITE); /* offsets */
init_pair(COLOR_CONTENTS, COLOR_BLUE, COLOR_WHITE); /* file data */
}
@@ -1127,7 +1215,7 @@
/* Accept keystrokes and act on them accordingly */
Quit = FALSE;
while (!Quit) {
- display(dmode, FALSE);
+ display(FALSE);
while ((ch=getch()) == 0); // wait for input
switch (ch)
{
@@ -1144,7 +1232,7 @@
/* -------------------------------------------------------------- */
case KEY_HOME:
if (dmode == EXTENDED_MODE) {
- start_row[dmode] = 0;
+ start_row[dmode] = end_row[dmode] = 0;
edit_row[dmode] = 0;
}
else {
@@ -1189,16 +1277,14 @@
/* -------------------------------------------------------------- */
case KEY_DOWN:
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])
+ if (edit_row[dmode] + 1 < end_row[dmode]) {
+ if (edit_row[dmode] >= last_entry_onscreen[dmode])
start_row[dmode]++;
edit_row[dmode]++;
}
}
else {
- if (edit_row[dmode] < edit_last[dmode])
+ if (edit_row[dmode] < last_entry_onscreen[dmode])
edit_row[dmode]++;
}
break;
@@ -1251,7 +1337,7 @@
block = temp_blk;
push_block(block);
for (i = 0; i < DMODES; i++) {
- start_row[i] = edit_row[i] = 0;
+ start_row[i] = end_row[i] = edit_row[i] = 0;
edit_col[i] = 0;
}
}
@@ -1269,10 +1355,16 @@
print_usage();
break;
/* -------------------------------------------------------------- */
+ /* e - change to extended mode */
+ /* -------------------------------------------------------------- */
+ case 'e':
+ dmode = EXTENDED_MODE;
+ break;
+ /* -------------------------------------------------------------- */
/* b - Back one 4K block */
/* -------------------------------------------------------------- */
case 'b':
- start_row[dmode] = edit_row[dmode] = 0;
+ start_row[dmode] = end_row[dmode] = edit_row[dmode] = 0;
if (block > 0)
block--;
offset = 0;
@@ -1294,9 +1386,9 @@
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;
+ if (edit_row[dmode] - (lines_of_display / lines_per_row[dmode]) > 0) {
+ start_row[dmode] -= (lines_of_display / lines_per_row[dmode]);
+ edit_row[dmode] -= (lines_of_display / lines_per_row[dmode]);
}
else {
start_row[dmode] = 0;
@@ -1323,9 +1415,20 @@
/* -------------------------------------------------------------- */
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);
+ int lines_of_display = termlines - 6;
+ int entries_per_screen = lines_of_display /
+ lines_per_row[dmode];
+
+ edit_row[dmode] = end_row[dmode] - 1;
+ if ((edit_row[dmode] - entries_per_screen) + 1 > 0)
+ start_row[dmode] = edit_row[dmode] - entries_per_screen + 1;
+ /*
+ if (edit_row[dmode] * lines_per_row[dmode] > (termlines - 7))
+ start_row[dmode] = (edit_row[dmode] - (termlines - 7)) /
+ lines_per_row[dmode];
+ */
+ else
+ start_row[dmode] = 0;
}
/* TODO: Make "end" key work for other display modes. */
break;
@@ -1333,7 +1436,8 @@
/* f - Forward one 4K block */
/* -------------------------------------------------------------- */
case 'f':
- start_row[dmode] = edit_row[dmode] = 0;
+ start_row[dmode] = end_row[dmode] = edit_row[dmode] = 0;
+ lines_per_row[dmode] = 1;
block++;
offset = 0;
break;
@@ -1346,15 +1450,12 @@
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);
+ if ((edit_row[dmode] + lines_of_display) / lines_per_row[dmode] + 1 < end_row[dmode]) {
+ start_row[dmode] += lines_of_display / lines_per_row[dmode];
+ edit_row[dmode] += lines_of_display / lines_per_row[dmode];
}
+ else
+ edit_row[dmode] = end_row[dmode] - 1;
}
else {
start_row[dmode] = edit_row[dmode] = 0;
@@ -1594,10 +1695,12 @@
prog_name = argv[0];
memset(start_row, 0, sizeof(start_row));
+ memset(lines_per_row, 0, sizeof(lines_per_row));
+ memset(end_row, 0, sizeof(end_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));
+ memset(last_entry_onscreen, 0, sizeof(last_entry_onscreen));
dmode = HEX_MODE;
type_alloc(buf, char, bufsize); /* allocate/malloc a new 4K buffer */
block = 0x10;
@@ -1606,8 +1709,10 @@
blockstack[i].block = block;
for (j = 0; j < DMODES; j++) {
blockstack[i].start_row[j] = 0;
+ blockstack[i].end_row[j] = 0;
blockstack[i].edit_row[j] = 0;
blockstack[i].edit_col[j] = 0;
+ blockstack[i].lines_per_row[j] = 0;
}
}
@@ -1632,7 +1737,7 @@
else { /* print all the structures requested */
for (i = 0; i <= blockhist; i++) {
block = blockstack[i + 1].block;
- display(dmode, identify);
+ display(identify);
if (!identify) {
display_extended();
printf("-------------------------------------" \
--- cluster/gfs2/edit/hexedit.h 2007/02/08 05:41:16 1.7
+++ cluster/gfs2/edit/hexedit.h 2007/02/13 01:07:35 1.8
@@ -76,9 +76,9 @@
EXTERN int line INIT(1);
EXTERN int struct_len INIT(0);
EXTERN unsigned int offset;
-EXTERN int edit_row[DMODES], edit_col[DMODES];
-EXTERN int start_row[DMODES];
-EXTERN int edit_size[DMODES], edit_last[DMODES];
+EXTERN int edit_row[DMODES], edit_col[DMODES], print_entry_ndx;
+EXTERN int start_row[DMODES], end_row[DMODES], lines_per_row[DMODES];
+EXTERN int edit_size[DMODES], last_entry_onscreen[DMODES];
EXTERN char edit_string[1024], edit_fmt[80];
EXTERN struct gfs2_sbd sbd;
EXTERN struct gfs_sb *sbd1;
@@ -116,6 +116,8 @@
struct blkstack_info {
uint64_t block;
int start_row[DMODES];
+ int end_row[DMODES];
+ int lines_per_row[DMODES];
int edit_row[DMODES];
int edit_col[DMODES];
enum dsp_mode dmode;
next reply other threads:[~2007-02-13 1:07 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-02-13 1:07 rpeterso [this message]
-- strict thread matches above, loose matches on Subject: below --
2007-11-13 17:22 [Cluster-devel] cluster/gfs2/edit gfs2hex.c hexedit.c hexedit.h rpeterso
2007-02-28 21:58 rpeterso
2007-02-08 5:41 rpeterso
2006-11-14 20:13 rpeterso
2006-11-14 20:11 rpeterso
2006-11-09 15:31 rpeterso
2006-11-09 15:29 rpeterso
2006-06-19 20:49 rpeterso
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070213010736.16246.qmail@sourceware.org \
--to=rpeterso@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.