summaryrefslogtreecommitdiff
path: root/e2fsprogs/e2fsck/message.c
diff options
context:
space:
mode:
author"Vladimir N. Oleynik"2005-09-27 11:43:29 +0000
committer"Vladimir N. Oleynik"2005-09-27 11:43:29 +0000
commit3978e5576e1675c2fac631fcba07a976405b5e4b (patch)
treea7020db24bbcaebdce5a3a325967e21feacf7a89 /e2fsprogs/e2fsck/message.c
parent16ce8aa4123388c4a6237301e656c8f4e24a7e52 (diff)
downloadbusybox-3978e5576e1675c2fac631fcba07a976405b5e4b.zip
busybox-3978e5576e1675c2fac631fcba07a976405b5e4b.tar.gz
move e2fsck/* to e2fsck.c, one e2fsck_main and jornal exported, small automatic size reduction
Diffstat (limited to 'e2fsprogs/e2fsck/message.c')
-rw-r--r--e2fsprogs/e2fsck/message.c466
1 files changed, 0 insertions, 466 deletions
diff --git a/e2fsprogs/e2fsck/message.c b/e2fsprogs/e2fsck/message.c
deleted file mode 100644
index b09ae89..0000000
--- a/e2fsprogs/e2fsck/message.c
+++ /dev/null
@@ -1,466 +0,0 @@
-/*
- * message.c --- print e2fsck messages (with compression)
- *
- * Copyright 1996, 1997 by Theodore Ts'o
- *
- * %Begin-Header%
- * This file may be redistributed under the terms of the GNU Public
- * License.
- * %End-Header%
- *
- * print_e2fsck_message() prints a message to the user, using
- * compression techniques and expansions of abbreviations.
- *
- * The following % expansions are supported:
- *
- * %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
- * %Dt <dirent>->filetype
- * %d <dir> inode number
- * %g <group> integer
- * %i <ino> inode number
- * %Is <inode> -> i_size
- * %IS <inode> -> i_extra_isize
- * %Ib <inode> -> i_blocks
- * %Il <inode> -> i_links_count
- * %Im <inode> -> i_mode
- * %IM <inode> -> i_mtime
- * %IF <inode> -> i_faddr
- * %If <inode> -> i_file_acl
- * %Id <inode> -> i_dir_acl
- * %Iu <inode> -> i_uid
- * %Ig <inode> -> i_gid
- * %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
- * the containing directory. (If dirent is NULL
- * then return the pathname of directory <ino2>)
- * %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
- * %X <num> hexadecimal format
- *
- * The following '@' expansions are supported:
- *
- * @a extended attribute
- * @A error allocating
- * @b block
- * @B bitmap
- * @c compress
- * @C conflicts with some other fs block
- * @D deleted
- * @d directory
- * @e entry
- * @E Entry '%Dn' in %p (%i)
- * @f filesystem
- * @F for @i %i (%Q) is
- * @g group
- * @h HTREE directory inode
- * @i inode
- * @I illegal
- * @j journal
- * @l lost+found
- * @L is a link
- * @o orphaned
- * @p problem in
- * @r root inode
- * @s should be
- * @S superblock
- * @u unattached
- * @v device
- * @z zero-length
- */
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <ctype.h>
-#include <termios.h>
-
-#include "e2fsck.h"
-
-#include "problem.h"
-
-#ifdef __GNUC__
-#define _INLINE_ __inline__
-#else
-#define _INLINE_
-#endif
-
-/*
- * This structure defines the abbreviations used by the text strings
- * below. The first character in the string is the index letter. An
- * abbreviation of the form '@<i>' is expanded by looking up the index
- * letter <i> in the table below.
- */
-static const char *abbrevs[] = {
- N_("aextended attribute"),
- N_("Aerror allocating"),
- N_("bblock"),
- N_("Bbitmap"),
- N_("ccompress"),
- N_("Cconflicts with some other fs @b"),
- N_("iinode"),
- N_("Iillegal"),
- N_("jjournal"),
- N_("Ddeleted"),
- N_("ddirectory"),
- N_("eentry"),
- N_("E@e '%Dn' in %p (%i)"),
- N_("ffilesystem"),
- N_("Ffor @i %i (%Q) is"),
- N_("ggroup"),
- N_("hHTREE @d @i"),
- N_("llost+found"),
- N_("Lis a link"),
- N_("oorphaned"),
- N_("pproblem in"),
- N_("rroot @i"),
- N_("sshould be"),
- N_("Ssuper@b"),
- N_("uunattached"),
- N_("vdevice"),
- N_("zzero-length"),
- "@@",
- 0
- };
-
-/*
- * Give more user friendly names to the "special" inodes.
- */
-#define num_special_inodes 11
-static const char *special_inode_name[] =
-{
- N_("<The NULL inode>"), /* 0 */
- N_("<The bad blocks inode>"), /* 1 */
- "/", /* 2 */
- N_("<The ACL index inode>"), /* 3 */
- N_("<The ACL data inode>"), /* 4 */
- N_("<The boot loader inode>"), /* 5 */
- N_("<The undelete directory inode>"), /* 6 */
- N_("<The group descriptor inode>"), /* 7 */
- N_("<The journal inode>"), /* 8 */
- N_("<Reserved inode 9>"), /* 9 */
- N_("<Reserved inode 10>"), /* 10 */
-};
-
-/*
- * This function does "safe" printing. It will convert non-printable
- * ASCII characters using '^' and M- notation.
- */
-static void safe_print(const char *cp, int len)
-{
- unsigned char ch;
-
- if (len < 0)
- len = strlen(cp);
-
- while (len--) {
- ch = *cp++;
- if (ch > 128) {
- fputs("M-", stdout);
- ch -= 128;
- }
- if ((ch < 32) || (ch == 0x7f)) {
- fputc('^', stdout);
- ch ^= 0x40; /* ^@, ^A, ^B; ^? for DEL */
- }
- fputc(ch, stdout);
- }
-}
-
-
-/*
- * This function prints a pathname, using the ext2fs_get_pathname
- * function
- */
-static void print_pathname(ext2_filsys fs, ext2_ino_t dir, ext2_ino_t ino)
-{
- errcode_t retval;
- char *path;
-
- if (!dir && (ino < num_special_inodes)) {
- fputs(_(special_inode_name[ino]), stdout);
- return;
- }
-
- retval = ext2fs_get_pathname(fs, dir, ino, &path);
- if (retval)
- fputs("???", stdout);
- else {
- safe_print(path, -1);
- ext2fs_free_mem(&path);
- }
-}
-
-/*
- * This function handles the '@' expansion. We allow recursive
- * expansion; an @ expression can contain further '@' and '%'
- * expressions.
- */
-static _INLINE_ void expand_at_expression(e2fsck_t ctx, char ch,
- struct problem_context *pctx,
- int *first)
-{
- const char **cpp, *str;
-
- /* Search for the abbreviation */
- for (cpp = abbrevs; *cpp; cpp++) {
- if (ch == *cpp[0])
- break;
- }
- if (*cpp) {
- str = _(*cpp) + 1;
- if (*first && islower(*str)) {
- *first = 0;
- fputc(toupper(*str++), stdout);
- }
- print_e2fsck_message(ctx, str, pctx, *first);
- } else
- printf("@%c", ch);
-}
-
-/*
- * This function expands '%IX' expressions
- */
-static _INLINE_ void expand_inode_expression(char ch,
- struct problem_context *ctx)
-{
- struct ext2_inode *inode;
- struct ext2_inode_large *large_inode;
- char * time_str;
- time_t t;
- int do_gmt = -1;
-
- if (!ctx || !ctx->inode)
- goto no_inode;
-
- inode = ctx->inode;
- large_inode = (struct ext2_inode_large *) inode;
-
- switch (ch) {
- case 's':
- 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 'S':
- printf("%u", large_inode->i_extra_isize);
- break;
- case 'b':
- printf("%u", inode->i_blocks);
- break;
- case 'l':
- printf("%d", inode->i_links_count);
- break;
- case 'm':
- printf("0%o", inode->i_mode);
- break;
- case 'M':
- /* The diet libc doesn't respect the TZ environemnt variable */
- if (do_gmt == -1) {
- time_str = getenv("TZ");
- if (!time_str)
- time_str = "";
- do_gmt = !strcmp(time_str, "GMT");
- }
- t = inode->i_mtime;
- time_str = asctime(do_gmt ? gmtime(&t) : localtime(&t));
- printf("%.24s", time_str);
- break;
- case 'F':
- printf("%u", inode->i_faddr);
- break;
- case 'f':
- printf("%u", inode->i_file_acl);
- break;
- case 'd':
- printf("%u", (LINUX_S_ISDIR(inode->i_mode) ?
- inode->i_dir_acl : 0));
- break;
- case 'u':
- printf("%d", (inode->i_uid |
- (inode->osd2.linux2.l_i_uid_high << 16)));
- break;
- case 'g':
- printf("%d", (inode->i_gid |
- (inode->osd2.linux2.l_i_gid_high << 16)));
- break;
- default:
- no_inode:
- printf("%%I%c", ch);
- break;
- }
-}
-
-/*
- * This function expands '%dX' expressions
- */
-static _INLINE_ void expand_dirent_expression(char ch,
- struct problem_context *ctx)
-{
- struct ext2_dir_entry *dirent;
- int len;
-
- if (!ctx || !ctx->dirent)
- goto no_dirent;
-
- dirent = ctx->dirent;
-
- switch (ch) {
- case 'i':
- printf("%u", dirent->inode);
- break;
- case 'n':
- len = dirent->name_len & 0xFF;
- if (len > EXT2_NAME_LEN)
- len = EXT2_NAME_LEN;
- if (len > dirent->rec_len)
- len = dirent->rec_len;
- safe_print(dirent->name, len);
- break;
- case 'r':
- printf("%u", dirent->rec_len);
- break;
- case 'l':
- printf("%u", dirent->name_len & 0xFF);
- break;
- case 't':
- printf("%u", dirent->name_len >> 8);
- break;
- default:
- no_dirent:
- printf("%%D%c", ch);
- break;
- }
-}
-
-static _INLINE_ void expand_percent_expression(ext2_filsys fs, char ch,
- struct problem_context *ctx)
-{
- if (!ctx)
- goto no_context;
-
- switch (ch) {
- case '%':
- fputc('%', stdout);
- break;
- case 'b':
- 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("%u", ctx->dir);
- break;
- case 'g':
- printf("%d", ctx->group);
- break;
- case 'i':
- printf("%u", ctx->ino);
- break;
- case 'j':
- printf("%u", 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);
- break;
- case 'P':
- print_pathname(fs, ctx->ino2,
- ctx->dirent ? ctx->dirent->inode : 0);
- break;
- case 'q':
- print_pathname(fs, ctx->dir, 0);
- break;
- case 'Q':
- print_pathname(fs, ctx->dir, ctx->ino);
- break;
- case 'S':
- printf("%d", get_backup_sb(NULL, fs, NULL, NULL));
- break;
- case 's':
- printf("%s", ctx->str ? ctx->str : "NULL");
- break;
- case 'X':
-#ifdef EXT2_NO_64_TYPE
- printf("0x%x", ctx->num);
-#else
- printf("0x%llx", ctx->num);
-#endif
- break;
- default:
- no_context:
- printf("%%%c", ch);
- break;
- }
-}
-
-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;
-
- e2fsck_clear_progbar(ctx);
- for (cp = msg; *cp; cp++) {
- if (cp[0] == '@') {
- cp++;
- expand_at_expression(ctx, *cp, pctx, &first);
- } else if (cp[0] == '%' && cp[1] == 'I') {
- cp += 2;
- expand_inode_expression(*cp, pctx);
- } else if (cp[0] == '%' && cp[1] == 'D') {
- cp += 2;
- expand_dirent_expression(*cp, pctx);
- } else if ((cp[0] == '%')) {
- cp++;
- expand_percent_expression(fs, *cp, pctx);
- } else {
- for (i=0; cp[i]; i++)
- if ((cp[i] == '@') || cp[i] == '%')
- break;
- printf("%.*s", i, cp);
- cp += i-1;
- }
- first = 0;
- }
-}