doveadm-dump.c revision bde78a7bf5f9000f1ae4dc7ce6cabd012e1f8b79
6643N/A/* Copyright (C) 2004 Joshua Goodall */
6643N/A
6643N/A#include "lib.h"
6643N/A#include "doveadm.h"
6643N/A#include "doveadm-dump.h"
6643N/A
6643N/A#include <stdio.h>
6643N/A#include <unistd.h>
6643N/A
6643N/Astatic const struct doveadm_cmd_dump *dumps[] = {
6643N/A &doveadm_cmd_dump_index,
6643N/A &doveadm_cmd_dump_log,
6643N/A &doveadm_cmd_dump_mailboxlog,
6643N/A &doveadm_cmd_dump_thread
6643N/A};
6643N/A
6643N/Astatic const struct doveadm_cmd_dump *
6643N/Adump_find_name(const char *name)
6643N/A{
6643N/A unsigned int i;
6643N/A
6643N/A for (i = 0; i < N_ELEMENTS(dumps); i++) {
6643N/A if (strcmp(dumps[i]->name, name) == 0)
6643N/A return dumps[i];
6643N/A }
6643N/A return NULL;
6643N/A}
6643N/A
6643N/Astatic const struct doveadm_cmd_dump *
6643N/Adump_find_test(const char *path)
6643N/A{
6643N/A unsigned int i;
6643N/A
6643N/A for (i = 0; i < N_ELEMENTS(dumps); i++) {
6643N/A if (dumps[i]->test(path))
6643N/A return dumps[i];
6643N/A }
6643N/A return NULL;
6643N/A}
6643N/A
6643N/Astatic void cmd_dump(int argc, char *argv[])
6643N/A{
6643N/A const struct doveadm_cmd_dump *dump;
6643N/A const char *type = NULL;
6643N/A int c;
6643N/A
6643N/A while ((c = getopt(argc, argv, "t:")) > 0) {
6643N/A switch (c) {
6643N/A case 't':
6643N/A type = optarg;
6643N/A break;
6643N/A default:
6643N/A help(&doveadm_cmd_dump);
6643N/A }
6643N/A }
6643N/A if (optind == argc)
6643N/A help(&doveadm_cmd_dump);
6643N/A
6643N/A optind--;
6643N/A argc -= optind;
6643N/A argv += optind;
6643N/A
6643N/A dump = type != NULL ? dump_find_name(type) : dump_find_test(argv[1]);
6643N/A if (dump == NULL) {
6643N/A if (type != NULL)
6643N/A i_fatal("Unknown type: %s", type);
6643N/A else
6643N/A i_fatal("Can't autodetect file type: %s", argv[1]);
6643N/A } else {
6643N/A if (type == NULL)
6643N/A printf("Detected file type: %s\n", dump->name);
6643N/A }
6643N/A dump->cmd(argc, argv);
6643N/A}
6643N/A
struct doveadm_cmd doveadm_cmd_dump = {
cmd_dump, "dump", "[-t <type>] <path>"
};