/* Copyright (C) 2007-2010 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** This program is distributed in the hope that it will 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.
*/

/*
 * Contains declarations of routines that implement platform-independent
 * file I/O.
 */

#ifndef _ANDROID_UTILS_FILEIO_H
#define _ANDROID_UTILS_FILEIO_H

#include "android/utils/compiler.h"

#include <stddef.h>
#include <unistd.h>

ANDROID_BEGIN_HEADER

typedef struct MapFile MapFile;

#ifdef WIN32
/* Declare constants that are missing in Win32 headers. */
#define PROT_READ   0x1
#define PROT_WRITE  0x2
#define PROT_EXEC   0x4
#define PROT_NONE   0x0
#endif

/* Checks if file handle is a valid one.
 * Return:
 *  boolean: 1 if handle is valid, or 0 if it's not valid.
 */
static inline int
mapfile_is_valid(MapFile* handle)
{
    return handle != (void*)(ptrdiff_t)-1;
}

/* Opens file in selected mode.
 * Param:
 *  path - Path to the file to open.
 *  oflag - Defines mode in which file is to be opened. This value follows the
 *      symantics of O_XXX flags defined for standard open routine.
 *  share_mode Defines sharing mode for the opened file. This value follows the
 *      symantics of S_IXXX flags defined for standard open routine.
 * Return:
 *  A valid handle to the opened file on success, or an invalid value on
 *  failure. In case of failure errno contains error code.
 */
extern MapFile* mapfile_open(const char* path, int oflag, int share_mode);

/* Closes a file handle opened with mapfile_open routine.
 * Param:
 *  handle - A handle to a file previously obtained via successful call to
 *      mapfile_open routine.
 * Return:
 *  0 on success, or -1 on failure with errno containing the error code.
 */
extern int mapfile_close(MapFile* handle);

/* Reads from a file opened with mapfile_open routine.
 * Except for handle parameter, semantics of this call are the same as for
 * the regualar read routine.
 * Param:
 *  handle - A handle to a file previously obtained via successful call to
 *      mapfile_open routine.
 */
extern ssize_t mapfile_read(MapFile* handle, void* buf, size_t nbyte);

/* Reads from a specific offset in a file opened with mapfile_open routine.
 * Param:
 *  handle - A handle to a file previously obtained via successful call to
 *      mapfile_open routine.
 *  offset - Offset in the file where to start reading from.
 *  Rest of the parameters and return value are the same as in file_read.
 */
extern ssize_t mapfile_read_at(MapFile* handle,
                               size_t offset,
                               void* buf,
                               size_t nbyte);

/* Maps a section of a file to memory.
 * Param:
 *  handle - A handle to a file previously obtained via successful call to
 *      mapfile_open routine.
 *  offset - Offset in the file where mapping should begin.
 *  size - Number of bytes starting with offset that should be mapped.
 *  prot - Determines whether read, write, execute, or some combination of
 *      accesses are permitted to the data being mapped. This parameter has the
 *      same semantics as in regular mmap routene.
 *  mapped_offset - Upon success, contains pointer to the requested offset
 *      within the mapped section of the file.
 *  size - Upon success, contains total number of bytes that were actually
 *      mapped.
 * Return:
 *  Upon successful completion returns pointer to the beginning of memory
 *  mapping, containing mapping of the requested section of a file. Note that
 *  value returned from this routine doesn't necessarily points to the beginning
 *  of the requested section mapping. Use value returned in mapped_offset
 *  parameter to get actual pointer to the beginning of the requested section
 *  mapping. Value returned from this routine must eventually be passed to
 *  file_unmap_section reoutine to unmap section mapped with this routine.
 *  This routine returns NULL on failure and sets errno to indicate the error.
 */
extern void* mapfile_map(MapFile* handle,
                         size_t offset,
                         size_t size,
                         int prot,
                         void** mapped_offset,
                         size_t* mapped_size);

/* Umaps section of a file previously mapped with mapfile_map routine.
 * Param:
 *  mapped_at - A pointer to the base address of the mapped section of a file
 *      that is to be unmapped.
 *  len - Byte size of the section that is to be unmapped.
 * Return:
 *  Upon successful completion returns 0. Otherwise, returns -1 and sets
 *  errno to indicate the error.
 */
extern int mapfile_unmap(void* mapped_at, size_t len);

ANDROID_END_HEADER

#endif  // _ANDROID_UTILS_FILEIO_H
