/*
 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
 * All Rights Reserved.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it would be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
 */

#ifndef QEMU_IO_H
#define QEMU_IO_H

#include "qemu-common.h"

#define CMD_FLAG_GLOBAL ((int)0x80000000) /* don't iterate "args" */

/* Implement a qemu-io command.
 * Operate on @blk using @argc/@argv as the command's arguments, and
 * return 0 on success or negative errno on failure.
 */
typedef int (*cfunc_t)(BlockBackend *blk, int argc, char **argv);

typedef void (*helpfunc_t)(void);

typedef struct cmdinfo {
    const char* name;
    const char* altname;
    cfunc_t     cfunc;
    int         argmin;
    int         argmax;
    int         canpush;
    int         flags;
    const char  *args;
    const char  *oneline;
    helpfunc_t  help;
    uint64_t    perm;
} cmdinfo_t;

extern bool qemuio_misalign;

int qemuio_command(BlockBackend *blk, const char *cmd);

void qemuio_add_command(const cmdinfo_t *ci);
void qemuio_command_usage(const cmdinfo_t *ci);
void qemuio_complete_command(const char *input,
                             void (*fn)(const char *cmd, void *opaque),
                             void *opaque);

#endif /* QEMU_IO_H */
