/* SPDX-License-Identifier: BSD-2-Clause */
/*******************************************************************************
 * Copyright 2018-2019, Fraunhofer SIT sponsored by Infineon Technologies AG
 * All rights reserved.
 ******************************************************************************/

#ifndef IFAPI_IO_H
#define IFAPI_IO_H

#include <stdbool.h> // for bool
#include <stdint.h>  // for uint8_t
#include <stdio.h>   // for size_t, FILE

#include "tss2_common.h" // for TSS2_RC
#include "tss2_fapi.h"   // for FAPI_POLL_HANDLE

typedef struct IFAPI_IO {
    FILE       *stream;
    short       pollevents;
    const char *char_buffer;
    char       *char_rbuffer;
    size_t      buffer_length;
    size_t      buffer_idx;
} IFAPI_IO;

#ifdef TEST_FAPI_ASYNC
#define _IFAPI_IO_RETRIES 1
#else /* TEST_FAPI_ASYNC */
#define IFAPI_IO_RETRIES 0
#endif /* TEST_FAPI_ASYNC */

static int ifapi_io_retry __attribute__((unused)) = IFAPI_IO_RETRIES;

#define IFAPI_IO_STREAM  context->io.stream
#define IFAPI_IO_BUFF    context->io.char_buffer
#define IFAPI_IO_RBUFF   context->io.char_rbuffer
#define IFAPI_IO_BUFFLEN context->io.buffer_length
#define IFAPI_IO_BUFFIDX context->io.buffer_idx

TSS2_RC
ifapi_io_read_async(struct IFAPI_IO *io, const char *filename);

TSS2_RC
ifapi_io_read_finish(struct IFAPI_IO *io, uint8_t **buffer, size_t *length);

TSS2_RC
ifapi_io_write_async(struct IFAPI_IO *io,
                     const char      *filename,
                     const uint8_t   *buffer,
                     size_t           length);

TSS2_RC
ifapi_io_write_finish(struct IFAPI_IO *io);

TSS2_RC
ifapi_io_check_file_writeable(const char *file);

TSS2_RC
ifapi_io_check_create_dir(const char *dirname, int mode);

TSS2_RC
ifapi_io_remove_file(const char *file);

TSS2_RC
ifapi_io_remove_directories(const char *dirname, const char *keystore_path, const char *sub_dir);

TSS2_RC
ifapi_io_dirfiles(const char *dirname, char ***files, size_t *numfiles);

TSS2_RC
ifapi_io_dirfiles_all(const char *searchPath, char ***pathlist, size_t *numPaths);

bool ifapi_io_path_exists(const char *path);

TSS2_RC
ifapi_io_poll(IFAPI_IO *io);

TSS2_RC
ifapi_io_poll_handles(IFAPI_IO *io, FAPI_POLL_HANDLE **handles, size_t *num_handles);

#endif /* IFAPI_IO_H */
