| /* |
| * Copyright 1996-2004 by Hans Reiser, licensing governed by |
| * reiserfsprogs/README |
| */ |
| |
| #ifdef HAVE_CONFIG_H |
| # include <config.h> |
| #endif |
| |
| #include "reiserfs/libreiserfs.h" |
| #include "misc/device.h" |
| |
| #include <sys/stat.h> |
| #include <printf.h> |
| #include <stdarg.h> |
| |
| #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H) |
| # include <uuid/uuid.h> |
| #endif |
| |
| #define PA_KEY (PA_LAST) |
| #define PA_BUFFER_HEAD (PA_LAST + 1) |
| #define PA_ITEM_HEAD (PA_LAST + 2) |
| #define PA_DISK_CHILD (PA_LAST + 3) |
| |
| static int _arginfo_b (const struct printf_info *info, size_t n, int *argtypes) { |
| if (n > 0) |
| argtypes[0] = PA_BUFFER_HEAD | PA_FLAG_PTR; |
| return 1; |
| } |
| |
| static int _arginfo_K (const struct printf_info *info, size_t n, int *argtypes) { |
| if (n > 0) |
| argtypes[0] = PA_KEY | PA_FLAG_PTR; |
| return 1; |
| } |
| |
| static int _arginfo_H (const struct printf_info *info, size_t n, int *argtypes) { |
| if (n > 0) |
| argtypes[0] = PA_ITEM_HEAD | PA_FLAG_PTR; |
| return 1; |
| } |
| |
| static int _arginfo_y (const struct printf_info *info, size_t n, int *argtypes) { |
| if (n > 0) |
| argtypes[0] = PA_DISK_CHILD | PA_FLAG_PTR; |
| return 1; |
| } |
| |
| static int _arginfo_M (const struct printf_info *info, size_t n, int *argtypes) { |
| if (n > 0) |
| argtypes[0] = PA_INT | PA_FLAG_SHORT | PA_FLAG_PTR; |
| return 1; |
| } |
| |
| static int _arginfo_U (const struct printf_info *info, size_t n, int *argtypes) { |
| if (n > 0) |
| argtypes[0] = (PA_CHAR|PA_FLAG_PTR); |
| return 1; |
| } |
| |
| /* %b */ |
| static int print_block_head (FILE * stream, |
| const struct printf_info *info, |
| const void *const *args) |
| { |
| const reiserfs_bh_t * bh; |
| |
| bh = *((const reiserfs_bh_t **)(args[0])); |
| return fprintf(stream, "level=%d, nr_items=%d, free_space=%d rdkey", |
| reiserfs_node_level (bh), reiserfs_node_items (bh), |
| reiserfs_node_free (bh)); |
| } |
| |
| |
| /* %K */ |
| static int print_short_key (FILE * stream, |
| const struct printf_info *info, |
| const void *const *args) |
| { |
| const reiserfs_key_t * key; |
| |
| key = *((const reiserfs_key_t **)(args[0])); |
| return fprintf(stream, "[%u %u]", reiserfs_key_get_did (key), |
| reiserfs_key_get_oid (key)); |
| } |
| |
| |
| /* %k */ |
| static int print_key (FILE * stream, |
| const struct printf_info *info, |
| const void *const *args) |
| { |
| const reiserfs_key_t * key; |
| |
| key = *((const reiserfs_key_t **)(args[0])); |
| return fprintf(stream, "[%u %u 0x%Lx %s (%d)]", |
| reiserfs_key_get_did (key), reiserfs_key_get_oid (key), |
| (unsigned long long)reiserfs_key_get_off (key), |
| reiserfs_key_name (key), reiserfs_key_get_type (key)); |
| } |
| |
| |
| /* %H */ |
| static int print_item_head (FILE * stream, |
| const struct printf_info *info, |
| const void *const *args) |
| { |
| const reiserfs_ih_t * ih; |
| |
| ih = *((const reiserfs_ih_t **)(args[0])); |
| return fprintf(stream, "%u %u 0x%Lx %s (%d), len %u, location " |
| "%u entry count %u, fsck need %u, format %s", |
| reiserfs_key_get_did (&ih->ih_key), |
| reiserfs_key_get_oid (&ih->ih_key), |
| (unsigned long long)reiserfs_key_get_off (&ih->ih_key), |
| reiserfs_key_name (&ih->ih_key), |
| reiserfs_key_get_type (&ih->ih_key), |
| reiserfs_ih_get_len (ih), reiserfs_ih_get_loc (ih), |
| reiserfs_ih_get_entries (ih), reiserfs_ih_get_flags (ih), |
| reiserfs_ih_get_format (ih) == KEY_FORMAT_2 ? "new" : |
| ((reiserfs_ih_get_format (ih) == KEY_FORMAT_1) ? "old" : "BAD")); |
| } |
| |
| |
| static int print_disk_child (FILE * stream, |
| const struct printf_info *info, |
| const void *const *args) |
| { |
| const reiserfs_dc_t * dc; |
| |
| dc = *((const reiserfs_dc_t **)(args[0])); |
| return fprintf(stream, "[dc_number=%u, dc_size=%u]", |
| reiserfs_dc_get_nr (dc), reiserfs_dc_get_size (dc)); |
| } |
| |
| static int rwx (FILE * stream, mode_t mode) |
| { |
| return fprintf (stream, "%c%c%c", |
| (mode & S_IRUSR) ? 'r' : '-', |
| (mode & S_IWUSR) ? 'w' : '-', |
| (mode & S_IXUSR) ? 'x' : '-'); |
| } |
| |
| |
| /* %M */ |
| static int print_sd_mode (FILE * stream, |
| const struct printf_info *info, |
| const void *const *args) |
| { |
| int len = 0; |
| __u16 mode; |
| |
| mode = *(mode_t *)args[0]; |
| len = fprintf (stream, "%c", misc_device_typec (mode)); |
| len += rwx (stream, (mode & 0700) << 0); |
| len += rwx (stream, (mode & 0070) << 3); |
| len += rwx (stream, (mode & 0007) << 6); |
| return len; |
| } |
| |
| /* %U */ |
| static int print_sd_uuid (FILE * stream, |
| const struct printf_info *info, |
| const void *const *args) |
| { |
| #if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H) |
| const unsigned char *uuid = *((const unsigned char **)(args[0])); |
| char buf[37]; |
| |
| buf[36] = '\0'; |
| uuid_unparse(uuid, buf); |
| return fprintf(stream, "%s", buf); |
| #else |
| return fprintf(stream, "<no libuuid installed>"); |
| #endif |
| } |
| |
| void reiserfs_warning (FILE * fp, const char * fmt, ...) |
| { |
| static int registered = 0; |
| va_list args; |
| |
| if (!registered) { |
| registered = 1; |
| |
| register_printf_function ('K', print_short_key, _arginfo_K); |
| register_printf_function ('k', print_key, _arginfo_K); |
| register_printf_function ('H', print_item_head, _arginfo_H); |
| register_printf_function ('b', print_block_head, _arginfo_b); |
| register_printf_function ('y', print_disk_child, _arginfo_y); |
| register_printf_function ('M', print_sd_mode, _arginfo_M); |
| register_printf_function ('U', print_sd_uuid, _arginfo_U); |
| } |
| |
| va_start (args, fmt); |
| vfprintf (fp, fmt, args); |
| va_end (args); |
| } |
| |