Current File : //usr/include/shadow_svc.h
/*
 * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
 */

#ifndef	_SHADOW_SVC_H
#define	_SHADOW_SVC_H

#include <libnvpair.h>

#ifdef	__cplusplus
extern "C" {
#endif

typedef int shadow_svc_handle_t;

/* door call return values */
typedef enum {
	SHADOW_SVC_RET_SUCCESS = 0,	/* General success */
	SHADOW_SVC_RET_FAIL,		/* General failure */
	SHADOW_SVC_RET_PERMISSION_DENIED, /* Insufficient privilege */
	SHADOW_SVC_RET_BAD_REQUEST,	/* Bad command or argument */
	SHADOW_SVC_RET_BAD_HANDLE,	/* Bad service handle */
	SHADOW_SVC_RET_ALREADY_STARTED,	/* Migration already in progress */
	SHADOW_SVC_RET_IN_PROGRESS,	/* Command not yet complete */
	SHADOW_SVC_RET_INTERNAL_ERROR,	/* Unexpected error */
	SHADOW_SVC_RET_IO_ERROR,	/* Error reading/writing data */
	SHADOW_SVC_RET_NO_SUCH_DATASET,	/* Dataset not found */
	SHADOW_SVC_RET_NO_SUCH_MOUNTPT,	/* Mountpoint not found */
	SHADOW_SVC_RET_OUT_OF_MEMORY,	/* Insufficient memory */
	SHADOW_SVC_RET_OUT_OF_FDS,	/* No more file handles */
	SHADOW_SVC_RET_NO_MIGRATIONS,	/* No migrations in progress */
	SHADOW_SVC_RET_STOPPED		/* Migration of dataset was stopped */
} shadow_svc_rv_t;

/*
 * Status result nvlist content
 *
 * The nvlist returned on successful statistics retrieval contains:
 *
 *  {
 *    uint64 SHADOW_SVC_STATUS_COUNT
 *    nvlist_t_array[SHADOW_SVC_STATUS_COUNT] SHADOW_SVC_STATUS_WRAPPER
 *  }
 *
 *  The SHADOW_SVC_STATUS_COUNT may be zero, in which case no array will
 *  be present.
 *
 *  Each element of the SHADOW_SVC_STATUS_WRAPPER array is an nvlist_t with
 *    {
 *      string   SHADOW_SVC_STATUS_DATASET
 *      uint64   SHADOW_SVC_STATUS_XFERD
 *      uint64   SHADOW_SVC_STATUS_LEFT
 *       int32   SHADOW_SVC_STATUS_ERRORS
 *      uint64   SHADOW_SVC_STATUS_ELAPSED
 *      boolean  SHADOW_SVC_STATUS_COMPLETE
 *    }
 */
#define	SHADOW_SVC_STATUS_COUNT	"status-count"	/* int count datasets */
#define	SHADOW_SVC_STATUS_WRAPPER "status-array" /* nvlist_t[] statii */
#define	SHADOW_SVC_STATUS_DATASET "dataset"	/* string */
#define	SHADOW_SVC_STATUS_XFERD	"xferd"		/* uint64_t bytes */
#define	SHADOW_SVC_STATUS_LEFT	"remaining"	/* uint64_t bytes */
#define	SHADOW_SVC_STATUS_ERRORS "errors"	/* int count of errors */
#define	SHADOW_SVC_STATUS_ELAPSED "elapsed"	/* uint64_t secs */
#define	SHADOW_SVC_STATUS_COMPLETE "complete"	/* boolean_t finished? */

/*
 * Errors result nvlist content
 *
 * The nvlist returned on successful error info retrieval contains:
 *  {
 *    uint64   SHADOW_SVC_ERRORS_COUNT
 *    nvlist_t_array[SHADOW_SVC_ERRORS_COUNT] SHADOW_SVC_ERRORS_WRAPPER
 *  }
 *
 *  The SHADOW_SVC_ERRORS_COUNT may be zero, in which case no array will
 *  be present.
 *
 *  Each element of the SHADOW_SVC_ERRORS_WRAPPER array is an nvlist_t with
 *    {
 *      string   SHADOW_SVC_ERROR_DATASET
 *      uint64   SHADOW_SVC_ERROR_COUNT
 *      nvlist_t_array[SHADOW_SVC_ERROR_COUNT] SHADOW_SVC_ERROR_LIST
 *    }
 *
 *  The SHADOW_SVC_ERROR_COUNT may be zero, in which case no array will
 *  be present.
 *
 *  Each element of the SHADOW_SVC_ERROR_LIST array is an nvlist_t with
 *    {
 *       int32   SHADOW_SVC_ERROR_ERR
 *       string  SHADOW_SVC_ERROR_PATH
 *    }
 */
#define	SHADOW_SVC_ERRORS_COUNT	"errors-datasets" /* int count datasets */
#define	SHADOW_SVC_ERRORS_WRAPPER "errors-array" /* nvlist_t[] statii */
#define	SHADOW_SVC_ERROR_DATASET "dataset"	/* string */
#define	SHADOW_SVC_ERROR_COUNT	"nerrs"		/* array sizes */
#define	SHADOW_SVC_ERROR_LIST	"errs"		/* array */
#define	SHADOW_SVC_ERROR_PATH	"path"		/* path with issue */
#define	SHADOW_SVC_ERROR_ERR	"errno"		/* issue */

extern shadow_svc_handle_t shadow_svc_open(void);

extern shadow_svc_rv_t shadow_svc_isstopped(shadow_svc_handle_t, const char *);
extern shadow_svc_rv_t shadow_svc_cancel(shadow_svc_handle_t, const char *);
extern shadow_svc_rv_t shadow_svc_start(shadow_svc_handle_t, const char *);
extern shadow_svc_rv_t shadow_svc_stop(shadow_svc_handle_t, const char *);
extern shadow_svc_rv_t shadow_svc_errors(shadow_svc_handle_t, const char *,
    nvlist_t **);
extern shadow_svc_rv_t shadow_svc_status(shadow_svc_handle_t, const char *,
    nvlist_t **);

extern const char *shadow_svc_strerror(shadow_svc_rv_t);
extern const char *shadow_svc_errname(shadow_svc_rv_t);

extern void shadow_svc_close(shadow_svc_handle_t);

#ifdef	__cplusplus
}
#endif

#endif	/* _SHADOW_SVC_H */