/* ----> DO NOT REMOVE THE FOLLOWING NOTICE <---- | |
Copyright (c) 2014-2015 Datalight, Inc. | |
All Rights Reserved Worldwide. | |
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; use version 2 of the License. | |
This program is distributed in the hope that it will be useful, | |
but "AS-IS," 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, write to the Free Software Foundation, Inc., | |
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
*/ | |
/* Businesses and individuals that for commercial or other reasons cannot | |
comply with the terms of the GPLv2 license may obtain a commercial license | |
before incorporating Reliance Edge into proprietary software for | |
distribution in any form. Visit http://www.datalight.com/reliance-edge for | |
more information. | |
*/ | |
/** @file | |
@brief Interface for the Reliance Edge POSIX-like API. | |
The POSIX-like file system API is the primary file system API for | |
Reliance Edge, which supports the full functionality of the file system. | |
This API aims to be compatible with POSIX where reasonable, but it is | |
simplified considerably to meet the needs of resource-constrained embedded | |
systems. The API has also been extended to provide access to the unique | |
features of Reliance Edge, and to cover areas (like mountins and formatting) | |
which do not have APIs in the POSIX specification. | |
*/ | |
#ifndef REDPOSIX_H | |
#define REDPOSIX_H | |
/* This header is intended for application use; some applications are written | |
in C++. | |
*/ | |
#ifdef __cplusplus | |
extern "C" { | |
#endif | |
#include <redconf.h> | |
#if REDCONF_API_POSIX == 1 | |
#include <redtypes.h> | |
#include "redapimacs.h" | |
#include "rederrno.h" | |
#include "redstat.h" | |
/** Open for reading only. */ | |
#define RED_O_RDONLY 0x00000001U | |
/** Open for writing only. */ | |
#define RED_O_WRONLY 0x00000002U | |
/** Open for reading and writing. */ | |
#define RED_O_RDWR 0x00000004U | |
/** File offset for all writes is end-of-file. */ | |
#define RED_O_APPEND 0x00000008U | |
/** Create the file. */ | |
#define RED_O_CREAT 0x00000010U | |
/** Error if path already exists. */ | |
#define RED_O_EXCL 0x00000020U | |
/** Truncate file to size zero. */ | |
#define RED_O_TRUNC 0x00000040U | |
/** @brief Last file system error (errno). | |
Under normal circumstances, each task using the file system has an | |
independent `red_errno` value. Applications do not need to worry about | |
one task obliterating an error value that another task needed to read. The | |
value is initially zero. When one of the POSIX-like APIs return an | |
indication of error, `red_errno` is set to an error value. | |
In some circumstances, `red_errno` will be a global errno location which | |
is shared by multiple tasks. If the calling task is not registered as a | |
file system user and all of the task slots are full, there can be no | |
task-specific errno, so the global errno is used. Likewise, if the file | |
system driver is uninitialized, there are no registered file system users | |
and `red_errno` always refers to the global errno. Under these | |
circumstances, multiple tasks manipulating `red_errno` could be | |
problematic. When the task count is set to one, `red_errno` always refers | |
to the global errno. | |
Note that `red_errno` is usable as an lvalue; i.e., in addition to reading | |
the error value, the error value can be set: | |
~~~{.c} | |
red_errno = 0; | |
~~~ | |
*/ | |
#define red_errno (*red_errnoptr()) | |
/** @brief Positions from which to seek within a file. | |
*/ | |
typedef enum | |
{ | |
/* 0/1/2 are the traditional values for SET/CUR/END, respectively. Prior | |
to the release of Unix System V in 1983, the SEEK_* symbols did not | |
exist and C programs hard-coded the 0/1/2 values with those meanings. | |
*/ | |
RED_SEEK_SET = 0, /**< Set file offset to given offset. */ | |
RED_SEEK_CUR = 1, /**< Set file offset to current offset plus signed offset. */ | |
RED_SEEK_END = 2 /**< Set file offset to EOF plus signed offset. */ | |
} REDWHENCE; | |
#if REDCONF_API_POSIX_READDIR == 1 | |
/** @brief Opaque directory handle. | |
*/ | |
typedef struct sREDHANDLE REDDIR; | |
/** @brief Directory entry information. | |
*/ | |
typedef struct | |
{ | |
uint32_t d_ino; /**< File serial number (inode number). */ | |
char d_name[REDCONF_NAME_MAX+1U]; /**< Name of entry. */ | |
REDSTAT d_stat; /**< File information (POSIX extension). */ | |
} REDDIRENT; | |
#endif | |
int32_t red_init(void); | |
int32_t red_uninit(void); | |
int32_t red_mount(const char *pszVolume); | |
int32_t red_umount(const char *pszVolume); | |
#if (REDCONF_READ_ONLY == 0) && (REDCONF_API_POSIX_FORMAT == 1) | |
int32_t red_format(const char *pszVolume); | |
#endif | |
#if REDCONF_READ_ONLY == 0 | |
int32_t red_transact(const char *pszVolume); | |
#endif | |
#if REDCONF_READ_ONLY == 0 | |
int32_t red_settransmask(const char *pszVolume, uint32_t ulEventMask); | |
#endif | |
int32_t red_gettransmask(const char *pszVolume, uint32_t *pulEventMask); | |
int32_t red_statvfs(const char *pszVolume, REDSTATFS *pStatvfs); | |
int32_t red_open(const char *pszPath, uint32_t ulOpenMode); | |
#if (REDCONF_READ_ONLY == 0) && (REDCONF_API_POSIX_UNLINK == 1) | |
int32_t red_unlink(const char *pszPath); | |
#endif | |
#if (REDCONF_READ_ONLY == 0) && (REDCONF_API_POSIX_MKDIR == 1) | |
int32_t red_mkdir(const char *pszPath); | |
#endif | |
#if (REDCONF_READ_ONLY == 0) && (REDCONF_API_POSIX_RMDIR == 1) | |
int32_t red_rmdir(const char *pszPath); | |
#endif | |
#if (REDCONF_READ_ONLY == 0) && (REDCONF_API_POSIX_RENAME == 1) | |
int32_t red_rename(const char *pszOldPath, const char *pszNewPath); | |
#endif | |
#if (REDCONF_READ_ONLY == 0) && (REDCONF_API_POSIX_LINK == 1) | |
int32_t red_link(const char *pszPath, const char *pszHardLink); | |
#endif | |
int32_t red_close(int32_t iFildes); | |
int32_t red_read(int32_t iFildes, void *pBuffer, uint32_t ulLength); | |
#if REDCONF_READ_ONLY == 0 | |
int32_t red_write(int32_t iFildes, const void *pBuffer, uint32_t ulLength); | |
#endif | |
#if REDCONF_READ_ONLY == 0 | |
int32_t red_fsync(int32_t iFildes); | |
#endif | |
int64_t red_lseek(int32_t iFildes, int64_t llOffset, REDWHENCE whence); | |
#if (REDCONF_READ_ONLY == 0) && (REDCONF_API_POSIX_FTRUNCATE == 1) | |
int32_t red_ftruncate(int32_t iFildes, uint64_t ullSize); | |
#endif | |
int32_t red_fstat(int32_t iFildes, REDSTAT *pStat); | |
#if REDCONF_API_POSIX_READDIR == 1 | |
REDDIR *red_opendir(const char *pszPath); | |
REDDIRENT *red_readdir(REDDIR *pDirStream); | |
void red_rewinddir(REDDIR *pDirStream); | |
int32_t red_closedir(REDDIR *pDirStream); | |
#endif | |
REDSTATUS *red_errnoptr(void); | |
#endif /* REDCONF_API_POSIX */ | |
#ifdef __cplusplus | |
} | |
#endif | |
#endif | |