*
* %b <blk> block number
* %B <blkcount> integer
+ * %c <blk2> block number
* %di <dirent>->ino inode number
* %dn <dirent>->name string
+ * %dr <dirent>->rec_len
+ * %dl <dirent>->name_len
* %D <dir> inode number
* %g <group> integer
* %i <ino> inode number
* %If <inode> -> i_file_acl
* %Id <inode> -> i_dir_acl
* %j <ino2> inode number
+ * %m <com_err error message>
* %N <num>
* %p ext2fs_get_pathname of directory <ino>
* %P ext2fs_get_pathname of <dirent>->ino with <ino2> as
* %q ext2fs_get_pathname of directory <dir>
* %Q ext2fs_get_pathname of directory <ino> with <dir> as
* the containing directory.
+ * %s <str> miscellaneous string
+ * %S backup superblock
*
* The following '@' expansions are supported:
*
+ * @A error allocating
* @b block
* @B bitmap
* @C conflicts with some other fs block
* @d directory
* @e entry
* @E Entry '%Dn' in %p (%i)
+ * @f filesystem
* @F for @i %i (%Q) is
* @g group
* @l lost+found
* @L is a link
* @u unattached
* @r root inode
+ * @s should be
+ * @S superblock
* @z zero-length
*/
* letter <i> in the table below.
*/
static const char *abbrevs[] = {
+ "Aerror allocating",
"bblock",
"Bbitmap",
"Cconflicts with some other fs @b",
"ddirectory",
"eentry",
"E@e '%Dn' in %p (%i)",
+ "ffilesystem",
"Ffor @i %i (%Q) is",
"ggroup",
"llost+found",
"uunattached",
"rroot @i",
"sshould be",
+ "Ssuper@b",
"zzero-length",
"@@",
0
fputs("???", stdout);
else {
fputs(path, stdout);
- free(path);
+ ext2fs_free_mem((void **) &path);
}
}
* expansion; an @ expression can contain further '@' and '%'
* expressions.
*/
-static _INLINE_ void expand_at_expression(ext2_filsys fs, char ch,
- struct problem_context *ctx,
+static _INLINE_ void expand_at_expression(e2fsck_t ctx, char ch,
+ struct problem_context *pctx,
int *first)
{
const char **cpp, *str;
*first = 0;
fputc(toupper(*str++), stdout);
}
- print_e2fsck_message(fs, str, ctx, *first);
+ print_e2fsck_message(ctx, str, pctx, *first);
} else
printf("@%c", ch);
}
switch (ch) {
case 's':
- printf("%u", inode->i_size);
+ if (LINUX_S_ISDIR(inode->i_mode))
+ printf("%u", inode->i_size);
+ else {
+#ifdef EXT2_NO_64_TYPE
+ if (inode->i_size_high)
+ printf("0x%x%08x", inode->i_size_high,
+ inode->i_size);
+ else
+ printf("%u", inode->i_size);
+#else
+ printf("%llu", (inode->i_size |
+ ((__u64) inode->i_size_high << 32)));
+#endif
+ }
break;
case 'b':
printf("%u", inode->i_blocks);
printf("%u", inode->i_file_acl);
break;
case 'd':
- printf("%u", inode->i_dir_acl);
+ printf("%u", (LINUX_S_ISDIR(inode->i_mode) ?
+ inode->i_dir_acl : 0));
break;
default:
no_inode:
printf("%u", dirent->inode);
break;
case 'n':
- len = dirent->name_len;
+ len = dirent->name_len & 0xFF;
if (len > EXT2_NAME_LEN)
len = EXT2_NAME_LEN;
if (len > dirent->rec_len)
len = dirent->rec_len;
- printf("%.*s", dirent->name_len, dirent->name);
+ printf("%.*s", len, dirent->name);
+ break;
+ case 'r':
+ printf("%u", dirent->rec_len);
+ break;
+ case 'l':
+ printf("%u", dirent->name_len & 0xFF);
break;
default:
no_dirent:
printf("%u", ctx->blk);
break;
case 'B':
+#ifdef EXT2_NO_64_TYPE
printf("%d", ctx->blkcount);
+#else
+ printf("%lld", ctx->blkcount);
+#endif
+ break;
+ case 'c':
+ printf("%u", ctx->blk2);
break;
case 'd':
printf("%lu", ctx->dir);
case 'j':
printf("%lu", ctx->ino2);
break;
+ case 'm':
+ printf("%s", error_message(ctx->errcode));
+ break;
case 'N':
+#ifdef EXT2_NO_64_TYPE
printf("%u", ctx->num);
+#else
+ printf("%llu", ctx->num);
+#endif
break;
case 'p':
print_pathname(fs, ctx->ino, 0);
case 'Q':
print_pathname(fs, ctx->dir, ctx->ino);
break;
+ case 'S':
+ printf("%d", get_backup_sb(fs));
+ break;
+ case 's':
+ printf("%s", ctx->str);
+ break;
default:
no_context:
printf("%%%c", ch);
}
}
-void print_e2fsck_message(ext2_filsys fs, const char *msg,
- struct problem_context *ctx, int first)
+void print_e2fsck_message(e2fsck_t ctx, const char *msg,
+ struct problem_context *pctx, int first)
{
+ ext2_filsys fs = ctx->fs;
const char * cp;
int i;
for (cp = msg; *cp; cp++) {
if (cp[0] == '@') {
cp++;
- expand_at_expression(fs, *cp, ctx, &first);
+ expand_at_expression(ctx, *cp, pctx, &first);
} else if (cp[0] == '%' && cp[1] == 'I') {
cp += 2;
- expand_inode_expression(*cp, ctx);
+ expand_inode_expression(*cp, pctx);
} else if (cp[0] == '%' && cp[1] == 'D') {
cp += 2;
- expand_dirent_expression(*cp, ctx);
+ expand_dirent_expression(*cp, pctx);
} else if ((cp[0] == '%')) {
cp++;
- expand_percent_expression(fs, *cp, ctx);
+ expand_percent_expression(fs, *cp, pctx);
} else {
for (i=0; cp[i]; i++)
if ((cp[i] == '@') || cp[i] == '%')