debugfs: fix building rdebugfs (with READ_ONLY define)

Fix bitrot for building a restricted version of debugfs, which does
not require read/write access to the file system, and which only
allows access to the file system metadata.

Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
Theodore Ts'o 2020-06-17 21:43:37 -04:00
parent 6338a84675
commit 6cdd4b9309
4 changed files with 48 additions and 41 deletions

View File

@ -276,7 +276,11 @@ void do_open_filesys(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)),
return;
break;
case 'z':
#ifdef READ_ONLY
goto print_usage;
#else
undo_file = optarg;
#endif
break;
default:
goto print_usage;
@ -294,9 +298,10 @@ void do_open_filesys(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)),
print_usage:
fprintf(stderr, "%s: Usage: open [-s superblock] [-b blocksize] "
#ifdef READ_ONLY
"[-d image_filename] [-z undo_file] [-c] [-i] [-f] [-e] [-D] "
#ifndef READ_ONLY
"[-w] "
#else
"[-d image_filename] [-c] [-i] [-f] [-e] [-D] [-w] "
#endif
"<device>\n", argv[0]);
}
@ -2379,7 +2384,6 @@ void do_fallocate(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
return;
}
}
#endif /* READ_ONLY */
void do_symlink(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
void *infop EXT2FS_ATTR((unused)))
@ -2395,6 +2399,7 @@ void do_symlink(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
com_err(argv[0], retval, 0);
}
#endif /* READ_ONLY */
#if CONFIG_MMP
void do_dump_mmp(int argc EXT2FS_ATTR((unused)), char *argv[],
@ -2539,8 +2544,8 @@ int main(int argc, char **argv)
const char *opt_string = "nicR:f:b:s:Vd:D";
#else
const char *opt_string = "niwcR:f:b:s:Vd:Dz:";
char *undo_file = NULL;
#endif
char *undo_file = NULL;
#ifdef CONFIG_JBD_DEBUG
char *jbd_debug;
#endif
@ -2612,9 +2617,11 @@ int main(int argc, char **argv)
fprintf(stderr, "\tUsing %s\n",
error_message(EXT2_ET_BASE));
exit(0);
#ifndef READ_ONLY
case 'z':
undo_file = optarg;
break;
#endif
default:
com_err(argv[0], 0, usage, debug_prog_name);
return 1;

View File

@ -193,7 +193,8 @@ extern void do_get_quota(int argc, char *argv[], int sci_idx, void *infop);
/* util.c */
extern __s64 string_to_time(const char *arg);
errcode_t read_list(char *str, blk64_t **list, size_t *len);
extern errcode_t read_list(char *str, blk64_t **list, size_t *len);
extern void do_byte_hexdump(FILE *fp, unsigned char *buf, size_t bufsize);
/* xattrs.c */
void dump_inode_attributes(FILE *out, ext2_ino_t ino);
@ -207,4 +208,3 @@ void block_xattr_dump(FILE *f, unsigned char *buf, unsigned int len);
/* zap.c */
extern void do_zap_block(int argc, char **argv, int sci_idx, void *infop);
extern void do_block_dump(int argc, char **argv, int sci_idx, void *infop);
extern void do_byte_hexdump(FILE *fp, unsigned char *buf, size_t bufsize);

View File

@ -562,3 +562,38 @@ err:
free(lst);
return retval;
}
void do_byte_hexdump(FILE *fp, unsigned char *buf, size_t bufsize)
{
size_t i, j, max;
int suppress = -1;
for (i = 0; i < bufsize; i += 16) {
max = (bufsize - i > 16) ? 16 : bufsize - i;
if (suppress < 0) {
if (i && memcmp(buf + i, buf + i - max, max) == 0) {
suppress = i;
fprintf(fp, "*\n");
continue;
}
} else {
if (memcmp(buf + i, buf + suppress, max) == 0)
continue;
suppress = -1;
}
fprintf(fp, "%04o ", (unsigned int)i);
for (j = 0; j < 16; j++) {
if (j < max)
fprintf(fp, "%02x", buf[i+j]);
else
fprintf(fp, " ");
if ((j % 2) == 1)
fprintf(fp, " ");
}
fprintf(fp, " ");
for (j = 0; j < max; j++)
fprintf(fp, "%c", isprint(buf[i+j]) ? buf[i+j] : '.');
fprintf(fp, "\n");
}
fprintf(fp, "\n");
}

View File

@ -239,38 +239,3 @@ void do_block_dump(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
errout:
free(buf);
}
void do_byte_hexdump(FILE *fp, unsigned char *buf, size_t bufsize)
{
size_t i, j, max;
int suppress = -1;
for (i = 0; i < bufsize; i += 16) {
max = (bufsize - i > 16) ? 16 : bufsize - i;
if (suppress < 0) {
if (i && memcmp(buf + i, buf + i - max, max) == 0) {
suppress = i;
fprintf(fp, "*\n");
continue;
}
} else {
if (memcmp(buf + i, buf + suppress, max) == 0)
continue;
suppress = -1;
}
fprintf(fp, "%04o ", (unsigned int)i);
for (j = 0; j < 16; j++) {
if (j < max)
fprintf(fp, "%02x", buf[i+j]);
else
fprintf(fp, " ");
if ((j % 2) == 1)
fprintf(fp, " ");
}
fprintf(fp, " ");
for (j = 0; j < max; j++)
fprintf(fp, "%c", isprint(buf[i+j]) ? buf[i+j] : '.');
fprintf(fp, "\n");
}
fprintf(fp, "\n");
}