/** @file
  Method declarations and structures for accessing the XenStore

  Copyright (C) 2005 Rusty Russell, IBM Corporation
  Copyright (C) 2005 XenSource Ltd.
  Copyright (C) 2009,2010 Spectra Logic Corporation
  Copyright (C) 2014, Citrix Ltd.

  This file may be distributed separately from the Linux kernel, or
  incorporated into other software packages, subject to the following license:

  SPDX-License-Identifier: MIT
**/

#ifndef _XEN_XENSTORE_XENSTOREVAR_H
#define _XEN_XENSTORE_XENSTOREVAR_H

#include "XenBusDxe.h"

#include <IndustryStandard/Xen/io/xs_wire.h>

typedef struct _XENSTORE_WATCH XENSTORE_WATCH;

/**
  Fetch the contents of a directory in the XenStore.

  @param Transaction        The XenStore transaction covering this request.
  @param DirectoryPath      The dirname of the path to read.
  @param Node               The basename of the path to read.
  @param DirectoryCountPtr  The returned number of directory entries.
  @param DirectoryListPtr   An array of directory entry strings.

  @return  On success, XENSTORE_STATUS_SUCCESS. Otherwise an errno value
           indicating the type of failure.

  @note The results buffer is alloced and should be free'd by the
        caller.
**/
XENSTORE_STATUS
XenStoreListDirectory (
  IN  CONST XENSTORE_TRANSACTION  *Transaction,
  IN  CONST CHAR8                 *DirectoryPath,
  IN  CONST CHAR8                 *Node,
  OUT UINT32                      *DirectoryCountPtr,
  OUT CONST CHAR8                 ***DirectoryListPtr
  );

/**
  Determine if a path exists in the XenStore.

  @param Transaction  The XenStore transaction covering this request.
  @param Directory    The dirname of the path to read.
  @param Node         The basename of the path to read.

  @retval TRUE  The path exists.
  @retval FALSE The path does not exist or an error occurred attempting
                to make that determination.
**/
BOOLEAN
XenStorePathExists (
  IN CONST XENSTORE_TRANSACTION  *Transaction,
  IN CONST CHAR8                 *Directory,
  IN CONST CHAR8                 *Node
  );

/**
  Get the contents of a single "file".  Returns the contents in *Result which
  should be freed after use.  The length of the value in bytes is returned in
  *LenPtr.

  @param Transaction    The XenStore transaction covering this request.
  @param DirectoryPath  The dirname of the file to read.
  @param Node           The basename of the file to read.
  @param LenPtr         The amount of data read.
  @param Result         The returned contents from this file.

  @return  On success, XENSTORE_STATUS_SUCCESS. Otherwise an errno value
           indicating the type of failure.

  @note The results buffer is malloced and should be free'd by the
        caller.
**/
XENSTORE_STATUS
XenStoreRead (
  IN  CONST XENSTORE_TRANSACTION  *Transaction,
  IN  CONST CHAR8                 *DirectoryPath,
  IN  CONST CHAR8                 *Node,
  OUT UINT32                      *LenPtr OPTIONAL,
  OUT VOID                        **Result
  );

/**
  Write to a single file.

  @param Transaction    The XenStore transaction covering this request.
  @param DirectoryPath  The dirname of the file to write.
  @param Node           The basename of the file to write.
  @param Str            The NUL terminated string of data to write.

  @return  On success, XENSTORE_STATUS_SUCCESS. Otherwise an errno value
           indicating the type of failure.
**/
XENSTORE_STATUS
XenStoreWrite (
  IN CONST XENSTORE_TRANSACTION  *Transaction,
  IN CONST CHAR8                 *DirectoryPath,
  IN CONST CHAR8                 *Node,
  IN CONST CHAR8                 *Str
  );

/**
  Remove a file or directory (directories must be empty).

  @param Transaction    The XenStore transaction covering this request.
  @param DirectoryPath  The dirname of the directory to remove.
  @param Node           The basename of the directory to remove.

  @return  On success, XENSTORE_STATUS_SUCCESS. Otherwise an errno value
           indicating the type of failure.
**/
XENSTORE_STATUS
XenStoreRemove (
  IN CONST XENSTORE_TRANSACTION  *Transaction,
  IN CONST CHAR8                 *DirectoryPath,
  IN CONST CHAR8                 *Node
  );

/**
  Start a transaction.

  Changes by others will not be seen during the lifetime of this
  transaction, and changes will not be visible to others until it
  is committed (XenStoreTransactionEnd).

  @param Transaction  The returned transaction.

  @return  On success, XENSTORE_STATUS_SUCCESS. Otherwise an errno value
           indicating the type of failure.
**/
XENSTORE_STATUS
XenStoreTransactionStart (
  OUT XENSTORE_TRANSACTION  *Transaction
  );

/**
  End a transaction.

  @param Transaction  The transaction to end/commit.
  @param Abort        If TRUE, the transaction is discarded
                      instead of committed.

  @return  On success, XENSTORE_STATUS_SUCCESS. Otherwise an errno value
           indicating the type of failure.
**/
XENSTORE_STATUS
XenStoreTransactionEnd (
  IN CONST XENSTORE_TRANSACTION  *Transaction,
  IN BOOLEAN                     Abort
  );

/**
  Printf formatted write to a XenStore file.

  @param Transaction      The XenStore transaction covering this request.
  @param DirectoryPath    The dirname of the path to read.
  @param Node             The basename of the path to read.
  @param FormatString     AsciiSPrint format string followed by a variable number
                          of arguments.

  @return  On success, XENSTORE_STATUS_SUCCESS. Otherwise an errno value
           indicating the type of write failure.
**/
XENSTORE_STATUS
EFIAPI
XenStoreSPrint (
  IN CONST XENSTORE_TRANSACTION  *Transaction,
  IN CONST CHAR8                 *DirectoryPath,
  IN CONST CHAR8                 *Node,
  IN CONST CHAR8                 *FormatString,
  ...
  );

/**
  VA_LIST version of XenStoreSPrint().

  @param Transaction    The XenStore transaction covering this request.
  @param DirectoryPath  The dirname of the path to read.
  @param Node           The basename of the path to read.
  @param FormatString   Printf format string.
  @param Marker         VA_LIST of printf arguments.

  @return  On success, XENSTORE_STATUS_SUCCESS. Otherwise an errno value
           indicating the type of write failure.
**/
XENSTORE_STATUS
EFIAPI
XenStoreVSPrint (
  IN CONST XENSTORE_TRANSACTION  *Transaction,
  IN CONST CHAR8                 *DirectoryPath,
  IN CONST CHAR8                 *Node,
  IN CONST CHAR8                 *FormatString,
  IN VA_LIST                     Marker
  );

/**
  Register a XenStore watch.

  XenStore watches allow a client to be notified via a callback (embedded
  within the watch object) of changes to an object in the XenStore.

  @param DirectoryPath  The dirname of the path to watch.
  @param Node           The basename of the path to watch.
  @param WatchPtr       A returned XENSTORE_WATCH pointer.

  @return  On success, XENSTORE_STATUS_SUCCESS. Otherwise an errno value
           indicating the type of write failure.  EEXIST errors from the
           XenStore are suppressed, allowing multiple, physically different,
           xenbus_watch objects, to watch the same path in the XenStore.
**/
XENSTORE_STATUS
XenStoreRegisterWatch (
  IN  CONST CHAR8     *DirectoryPath,
  IN  CONST CHAR8     *Node,
  OUT XENSTORE_WATCH  **WatchPtr
  );

/**
  Unregister a XenStore watch.

  @param Watch  An XENSTORE_WATCH object previously returned by a successful
                call to XenStoreRegisterWatch ().
**/
VOID
XenStoreUnregisterWatch (
  IN XENSTORE_WATCH  *Watch
  );

/**
  Allocate and return the XenStore path string <DirectoryPath>/<Node>.  If name
  is the NUL string, the returned value contains the path string
  <DirectoryPath>.

  @param DirectoryPath  The NUL terminated directory prefix for new path.
  @param Node           The NUL terminated basename for the new path.

  @return  A buffer containing the joined path.
 */
CHAR8 *
XenStoreJoin (
  IN CONST CHAR8  *DirectoryPath,
  IN CONST CHAR8  *Node
  );

/**
  Initialize the XenStore states and rings.

  @param Dev  A pointer to a XENBUS_DEVICE instance.

  @return     EFI_SUCCESS if everything went smoothly.
**/
EFI_STATUS
XenStoreInit (
  XENBUS_DEVICE  *Dev
  );

/**
  Deinitialize the XenStore states and rings.

  @param Dev  A pointer to a XENBUS_DEVICE instance.
**/
VOID
XenStoreDeinit (
  IN XENBUS_DEVICE  *Dev
  );

//
// XENBUS protocol
//

XENSTORE_STATUS
EFIAPI
XenBusWaitForWatch (
  IN XENBUS_PROTOCOL  *This,
  IN VOID             *Token
  );

XENSTORE_STATUS
EFIAPI
XenBusXenStoreRead (
  IN  XENBUS_PROTOCOL             *This,
  IN  CONST XENSTORE_TRANSACTION  *Transaction,
  IN  CONST CHAR8                 *Node,
  OUT VOID                        **Value
  );

XENSTORE_STATUS
EFIAPI
XenBusXenStoreBackendRead (
  IN  XENBUS_PROTOCOL             *This,
  IN  CONST XENSTORE_TRANSACTION  *Transaction,
  IN  CONST CHAR8                 *Node,
  OUT VOID                        **Value
  );

XENSTORE_STATUS
EFIAPI
XenBusXenStoreRemove (
  IN XENBUS_PROTOCOL             *This,
  IN CONST XENSTORE_TRANSACTION  *Transaction,
  IN CONST CHAR8                 *Node
  );

XENSTORE_STATUS
EFIAPI
XenBusXenStoreTransactionStart (
  IN  XENBUS_PROTOCOL       *This,
  OUT XENSTORE_TRANSACTION  *Transaction
  );

XENSTORE_STATUS
EFIAPI
XenBusXenStoreTransactionEnd (
  IN XENBUS_PROTOCOL             *This,
  IN CONST XENSTORE_TRANSACTION  *Transaction,
  IN BOOLEAN                     Abort
  );

XENSTORE_STATUS
EFIAPI
XenBusXenStoreSPrint (
  IN XENBUS_PROTOCOL             *This,
  IN CONST XENSTORE_TRANSACTION  *Transaction,
  IN CONST CHAR8                 *DirectoryPath,
  IN CONST CHAR8                 *Node,
  IN CONST CHAR8                 *FormatString,
  ...
  );

XENSTORE_STATUS
EFIAPI
XenBusRegisterWatch (
  IN  XENBUS_PROTOCOL  *This,
  IN  CONST CHAR8      *Node,
  OUT VOID             **Token
  );

XENSTORE_STATUS
EFIAPI
XenBusRegisterWatchBackend (
  IN  XENBUS_PROTOCOL  *This,
  IN  CONST CHAR8      *Node,
  OUT VOID             **Token
  );

VOID
EFIAPI
XenBusUnregisterWatch (
  IN XENBUS_PROTOCOL  *This,
  IN VOID             *Token
  );

#endif /* _XEN_XENSTORE_XENSTOREVAR_H */
