295 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			295 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|     Copyright (c) 2006-2020 Chung, Hyung-Hwan. All rights reserved.
 | |
| 
 | |
|     Redistribution and use in source and binary forms, with or without
 | |
|     modification, are permitted provided that the following conditions
 | |
|     are met:
 | |
|     1. Redistributions of source code must retain the above copyright
 | |
|        notice, this list of conditions and the following disclaimer.
 | |
|     2. Redistributions in binary form must reproduce the above copyright
 | |
|        notice, this list of conditions and the following disclaimer in the
 | |
|        documentation and/or other materials provided with the distribution.
 | |
| 
 | |
|     THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
 | |
|     IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | |
|     OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 | |
|     IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 | |
|     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 | |
|     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | |
|     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | |
|     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | |
|     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 | |
|     THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | |
|  */
 | |
| 
 | |
| #ifndef _HAWK_FIO_H_
 | |
| #define _HAWK_FIO_H_
 | |
| 
 | |
| #include <hawk-cmn.h>
 | |
| 
 | |
| enum hawk_fio_flag_t
 | |
| {
 | |
| 	/* (1 << 0) to (1 << 7) reserved for hawk_sio_flag_t.
 | |
| 	 * see <hawk/cmn/sio.h>. nerver use this value. */
 | |
| 	HAWK_FIO_RESERVED      = 0xFF,
 | |
| 
 | |
| 	/** treat the file name pointer as a handle pointer */
 | |
| 	HAWK_FIO_HANDLE        = (1 << 8),
 | |
| 
 | |
| 	/** treat the file name pointer as a pointer to file name
 | |
| 	 *  template to use when making a temporary file name */
 | |
| 	HAWK_FIO_TEMPORARY     = (1 << 9),
 | |
| 
 | |
| 	/** don't close an I/O handle in hawk_fio_fini() and hawk_fio_close() */
 | |
| 	HAWK_FIO_NOCLOSE       = (1 << 10),
 | |
| 
 | |
| 	/** treat the path name as a multi-byte string */
 | |
| 	HAWK_FIO_BCSTRPATH    = (1 << 11),
 | |
| 
 | |
| 	/* normal open flags */
 | |
| 	HAWK_FIO_READ          = (1 << 14),
 | |
| 	HAWK_FIO_WRITE         = (1 << 15),
 | |
| 	HAWK_FIO_APPEND        = (1 << 16),
 | |
| 
 | |
| 	HAWK_FIO_CREATE        = (1 << 17),
 | |
| 	HAWK_FIO_TRUNCATE      = (1 << 18),
 | |
| 	HAWK_FIO_EXCLUSIVE     = (1 << 19),
 | |
| 	HAWK_FIO_SYNC          = (1 << 20),
 | |
| 
 | |
| 	/* do not follow a symbolic link, only on a supported platform */
 | |
| 	HAWK_FIO_NOFOLLOW      = (1 << 23),
 | |
| 
 | |
| 	/* for WIN32 only. harmless(no effect) when used on other platforms */
 | |
| 	HAWK_FIO_NOSHREAD      = (1 << 24),
 | |
| 	HAWK_FIO_NOSHWRITE     = (1 << 25),
 | |
| 	HAWK_FIO_NOSHDELETE    = (1 << 26),
 | |
| 
 | |
| 	/* hints to OS. harmless(no effect) when used on unsupported platforms */
 | |
| 	HAWK_FIO_RANDOM        = (1 << 27), /* hint that access be random */
 | |
| 	HAWK_FIO_SEQUENTIAL    = (1 << 28)  /* hint that access is sequential */
 | |
| };
 | |
| 
 | |
| enum hawk_fio_std_t
 | |
| {
 | |
| 	HAWK_FIO_STDIN  = 0,
 | |
| 	HAWK_FIO_STDOUT = 1,
 | |
| 	HAWK_FIO_STDERR = 2
 | |
| };
 | |
| typedef enum hawk_fio_std_t hawk_fio_std_t;
 | |
| 
 | |
| /* seek origin */
 | |
| enum hawk_fio_ori_t
 | |
| {
 | |
| 	HAWK_FIO_BEGIN   = 0,
 | |
| 	HAWK_FIO_CURRENT = 1,
 | |
| 	HAWK_FIO_END     = 2
 | |
| };
 | |
| /* file origin for seek */
 | |
| typedef enum hawk_fio_ori_t hawk_fio_ori_t;
 | |
| 
 | |
| enum hawk_fio_mode_t
 | |
| {
 | |
| 	HAWK_FIO_SUID = 04000, /* set UID */
 | |
| 	HAWK_FIO_SGID = 02000, /* set GID */
 | |
| 	HAWK_FIO_SVTX = 01000, /* sticky bit */
 | |
| 	HAWK_FIO_RUSR = 00400, /* can be read by owner */
 | |
| 	HAWK_FIO_WUSR = 00200, /* can be written by owner */
 | |
| 	HAWK_FIO_XUSR = 00100, /* can be executed by owner */
 | |
| 	HAWK_FIO_RGRP = 00040, /* can be read by group */
 | |
| 	HAWK_FIO_WGRP = 00020, /* can be written by group */
 | |
| 	HAWK_FIO_XGRP = 00010, /* can be executed by group */
 | |
| 	HAWK_FIO_ROTH = 00004, /* can be read by others */
 | |
| 	HAWK_FIO_WOTH = 00002, /* can be written by others */
 | |
| 	HAWK_FIO_XOTH = 00001  /* can be executed by others */
 | |
| };
 | |
| 
 | |
| #if defined(_WIN32)
 | |
| 	/* <winnt.h> => typedef PVOID HANDLE; */
 | |
| 	typedef void* hawk_fio_hnd_t;
 | |
| #elif defined(__OS2__)
 | |
| 	/* <os2def.h> => typedef LHANDLE HFILE;
 | |
| 	                 typedef unsigned long LHANDLE; */
 | |
| 	typedef unsigned long hawk_fio_hnd_t;
 | |
| #elif defined(__DOS__)
 | |
| 	typedef int hawk_fio_hnd_t;
 | |
| #elif defined(vms) || defined(__vms)
 | |
| 	typedef void* hawk_fio_hnd_t; /* struct FAB*, struct RAB* */
 | |
| #else
 | |
| 	typedef int hawk_fio_hnd_t;
 | |
| #endif
 | |
| 
 | |
| /* file offset */
 | |
| typedef hawk_foff_t hawk_fio_off_t;
 | |
| 
 | |
| typedef struct hawk_fio_t hawk_fio_t;
 | |
| typedef struct hawk_fio_lck_t hawk_fio_lck_t;
 | |
| 
 | |
| struct hawk_fio_t
 | |
| {
 | |
| 	hawk_gem_t*       gem;
 | |
| 	hawk_fio_hnd_t    handle;
 | |
| 	int               status;
 | |
| };
 | |
| 
 | |
| struct hawk_fio_lck_t
 | |
| {
 | |
| 	int             type;   /* READ, WRITE */
 | |
| 	hawk_fio_off_t  offset; /* starting offset */
 | |
| 	hawk_fio_off_t  length; /* length */
 | |
| 	hawk_fio_ori_t  origin; /* origin */
 | |
| };
 | |
| 
 | |
| #define HAWK_FIO_HANDLE(fio) ((fio)->handle)
 | |
| 
 | |
| #if defined(__cplusplus)
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| /**
 | |
|  * The hawk_fio_open() function opens a file.
 | |
|  * To open a file, you should set the flags with at least one of
 | |
|  * HAWK_FIO_READ, HAWK_FIO_WRITE, HAWK_FIO_APPEND.
 | |
|  *
 | |
|  * If the #HAWK_FIO_HANDLE flag is set, the @a path parameter is interpreted
 | |
|  * as a pointer to hawk_fio_hnd_t.
 | |
|  *
 | |
|  * If the #HAWK_FIO_TEMPORARY flag is set, the @a path parameter is
 | |
|  * interpreted as a path name template and an actual file name to open
 | |
|  * is internally generated using the template. The @a path parameter
 | |
|  * is filled with the last actual path name attempted when the function
 | |
|  * returns. So, you must not pass a constant string to the @a path
 | |
|  * parameter when #HAWK_FIO_TEMPORARY is set.
 | |
|  */
 | |
| HAWK_EXPORT hawk_fio_t* hawk_fio_open (
 | |
| 	hawk_gem_t*        gem,
 | |
| 	hawk_oow_t         xtnsize,
 | |
| 	const hawk_ooch_t* path,
 | |
| 	int                flags,
 | |
| 	int                mode
 | |
| );
 | |
| 
 | |
| /**
 | |
|  * The hawk_fio_close() function closes a file.
 | |
|  */
 | |
| HAWK_EXPORT void hawk_fio_close (
 | |
| 	hawk_fio_t* fio
 | |
| );
 | |
| 
 | |
| /**
 | |
|  * The hawk_fio_close() function opens a file into @a fio.
 | |
|  */
 | |
| HAWK_EXPORT int hawk_fio_init (
 | |
| 	hawk_fio_t*        fio,
 | |
| 	hawk_gem_t*        gem,
 | |
| 	const hawk_ooch_t* path,
 | |
| 	int                flags,
 | |
| 	int                mode
 | |
| );
 | |
| 
 | |
| /**
 | |
|  * The hawk_fio_close() function finalizes a file by closing the handle
 | |
|  * stored in @a fio.
 | |
|  */
 | |
| HAWK_EXPORT void hawk_fio_fini (
 | |
| 	hawk_fio_t* fio
 | |
| );
 | |
| 
 | |
| #if defined(HAWK_HAVE_INLINE)
 | |
| static HAWK_INLINE void* hawk_fio_getxtn (hawk_fio_t* fio) { return (void*)(fio + 1); }
 | |
| #else
 | |
| #define hawk_fio_getxtn(fio) ((void*)((hawk_fio_t*)(fio) + 1))
 | |
| #endif
 | |
| 
 | |
| /**
 | |
|  * The hawk_fio_gethnd() function returns the native file handle.
 | |
|  */
 | |
| HAWK_EXPORT hawk_fio_hnd_t hawk_fio_gethnd (
 | |
| 	const hawk_fio_t* fio
 | |
| );
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * The hawk_fio_seek() function changes the current file position.
 | |
|  */
 | |
| HAWK_EXPORT hawk_fio_off_t hawk_fio_seek (
 | |
| 	hawk_fio_t*    fio,
 | |
| 	hawk_fio_off_t offset,
 | |
| 	hawk_fio_ori_t origin
 | |
| );
 | |
| 
 | |
| /**
 | |
|  * The hawk_fio_truncate() function truncates a file to @a size.
 | |
|  */
 | |
| HAWK_EXPORT int hawk_fio_truncate (
 | |
| 	hawk_fio_t*    fio,
 | |
| 	hawk_fio_off_t size
 | |
| );
 | |
| 
 | |
| /**
 | |
|  * The hawk_fio_read() function reads data.
 | |
|  */
 | |
| HAWK_EXPORT hawk_ooi_t hawk_fio_read (
 | |
| 	hawk_fio_t*  fio,
 | |
| 	void*        buf,
 | |
| 	hawk_oow_t   size
 | |
| );
 | |
| 
 | |
| /**
 | |
|  * The hawk_fio_write() function writes data.
 | |
|  */
 | |
| HAWK_EXPORT hawk_ooi_t hawk_fio_write (
 | |
| 	hawk_fio_t*  fio,
 | |
| 	const void*  data,
 | |
| 	hawk_oow_t   size
 | |
| );
 | |
| 
 | |
| /**
 | |
|  * The hawk_fio_chmod() function changes the file mode.
 | |
|  *
 | |
|  * @note
 | |
|  * On _WIN32, this function is implemented on the best-effort basis and
 | |
|  * returns an error on the following conditions:
 | |
|  * - The file size is 0.
 | |
|  * - The file is opened without #HAWK_FIO_READ.
 | |
|  */
 | |
| HAWK_EXPORT int hawk_fio_chmod (
 | |
| 	hawk_fio_t* fio,
 | |
| 	int         mode
 | |
| );
 | |
| 
 | |
| /**
 | |
|  * The hawk_fio_sync() function synchronizes file contents into storage media
 | |
|  * It is useful in determining the media error, without which hawk_fio_close()
 | |
|  * may succeed despite such an error.
 | |
|  */
 | |
| HAWK_EXPORT int hawk_fio_sync (
 | |
| 	hawk_fio_t* fio
 | |
| );
 | |
| 
 | |
| HAWK_EXPORT int hawk_fio_lock (
 | |
| 	hawk_fio_t*     fio,
 | |
| 	hawk_fio_lck_t* lck,
 | |
| 	int             flags
 | |
| );
 | |
| 
 | |
| HAWK_EXPORT int hawk_fio_unlock (
 | |
| 	hawk_fio_t*     fio,
 | |
| 	hawk_fio_lck_t* lck,
 | |
| 	int             flags
 | |
| );
 | |
| 
 | |
| /**
 | |
|  * The hawk_get_std_fio_handle() returns a low-level system handle to
 | |
|  * commonly used I/O channels.
 | |
|  */
 | |
| HAWK_EXPORT int hawk_get_std_fio_handle (
 | |
| 	hawk_fio_std_t  std,
 | |
| 	hawk_fio_hnd_t* hnd
 | |
| );
 | |
| 
 | |
| #if defined(__cplusplus)
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif
 |