Mercurial > flash_v2
diff packages/io/fileio/current/include/fileio.h @ 115:6ed91473a1cd ecos-sw-2000-08-21
Merge from eCos master repository on 2000-08-21-22:40:54-BST
| author | jlarmour |
|---|---|
| date | Fri, 25 Aug 2000 17:32:38 +0000 |
| parents | |
| children | 6bd9d475ed4b |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/io/fileio/current/include/fileio.h @@ -0,0 +1,410 @@ +#ifndef CYGONCE_FILEIO_H +#define CYGONCE_FILEIO_H +//============================================================================= +// +// fileio.h +// +// Fileio header +// +//============================================================================= +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//============================================================================= +//#####DESCRIPTIONBEGIN#### +// +// Author(s): nickg +// Contributors: nickg +// Date: 2000-05-25 +// Purpose: Fileio header +// Description: This header contains the external definitions of the general file +// IO subsystem for POSIX and EL/IX compatability. +// +// Usage: +// #include <fileio.h> +// ... +// +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include <pkgconf/hal.h> +#include <pkgconf/kernel.h> +#include <pkgconf/io_fileio.h> + +#include <cyg/infra/cyg_type.h> +#include <cyg/hal/hal_tables.h> + +#include <stddef.h> // NULL, size_t +#include <limits.h> +#include <sys/types.h> +#include <fcntl.h> +#include <sys/stat.h> + +//============================================================================= +// forward definitions + +struct cyg_mtab_entry; +typedef struct cyg_mtab_entry cyg_mtab_entry; + +struct cyg_fstab_entry; +typedef struct cyg_fstab_entry cyg_fstab_entry; + +struct CYG_FILEOPS_TAG; +typedef struct CYG_FILEOPS_TAG cyg_fileops; + +struct CYG_FILE_TAG; +typedef struct CYG_FILE_TAG cyg_file; + +struct CYG_IOVEC_TAG; +typedef struct CYG_IOVEC_TAG cyg_iovec; + +struct CYG_UIO_TAG; +typedef struct CYG_UIO_TAG cyg_uio; + +struct CYG_SELINFO_TAG; +typedef struct CYG_SELINFO_TAG cyg_selinfo; + +//============================================================================= +// Directory pointer + +typedef CYG_ADDRWORD cyg_dir; + +#define CYG_DIR_NULL 0 + +//============================================================================= +// Filesystem table entry + +typedef int cyg_fsop_mount ( cyg_fstab_entry *fste, cyg_mtab_entry *mte ); +typedef int cyg_fsop_umount ( cyg_mtab_entry *mte ); +typedef int cyg_fsop_open ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, + int mode, cyg_file *fte ); +typedef int cyg_fsop_unlink ( cyg_mtab_entry *mte, cyg_dir dir, const char *name ); +typedef int cyg_fsop_mkdir ( cyg_mtab_entry *mte, cyg_dir dir, const char *name ); +typedef int cyg_fsop_rmdir ( cyg_mtab_entry *mte, cyg_dir dir, const char *name ); +typedef int cyg_fsop_rename ( cyg_mtab_entry *mte, cyg_dir dir1, const char *name1, + cyg_dir dir2, const char *name2 ); +typedef int cyg_fsop_link ( cyg_mtab_entry *mte, cyg_dir dir1, const char *name1, + cyg_dir dir2, const char *name2, int type ); +typedef int cyg_fsop_opendir ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, + cyg_file *fte ); +typedef int cyg_fsop_chdir ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, + cyg_dir *dir_out ); +typedef int cyg_fsop_stat ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, + struct stat *buf); +typedef int cyg_fsop_getinfo ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, + int key, void *buf, int len ); +typedef int cyg_fsop_setinfo ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, + int key, void *buf, int len ); + + +struct cyg_fstab_entry +{ + const char *name; // filesystem name + CYG_ADDRWORD data; // private data value + cyg_uint32 syncmode; // synchronization mode + + cyg_fsop_mount *mount; + cyg_fsop_umount *umount; + cyg_fsop_open *open; + cyg_fsop_unlink *unlink; + cyg_fsop_mkdir *mkdir; + cyg_fsop_rmdir *rmdir; + cyg_fsop_rename *rename; + cyg_fsop_link *link; + cyg_fsop_opendir *opendir; + cyg_fsop_chdir *chdir; + cyg_fsop_stat *stat; + cyg_fsop_getinfo *getinfo; + cyg_fsop_setinfo *setinfo; +}; + +//----------------------------------------------------------------------------- +// Keys for getinfo() and setinfo() + +#define FS_INFO_CONF 1 /* pathconf() */ +#define FS_INFO_ACCESS 2 /* access() */ + +//----------------------------------------------------------------------------- +// Types for link() + +#define CYG_FSLINK_HARD 1 /* form a hard link */ +#define CYG_FSLINK_SOFT 2 /* form a soft link */ + +//----------------------------------------------------------------------------- +// Macro to define an initialized fstab entry + +#define FSTAB_ENTRY( _l, _name, _data, _syncmode, _mount, _umount, \ + _open, _unlink, _mkdir, _rmdir, _rename, _link, \ + _opendir, _chdir, _stat, _getinfo, _setinfo) \ +struct cyg_fstab_entry _l CYG_HAL_TABLE_ENTRY( fstab ) = \ +{ \ + _name, \ + _data, \ + _syncmode, \ + _mount, \ + _umount, \ + _open, \ + _unlink, \ + _mkdir, \ + _rmdir, \ + _rename, \ + _link, \ + _opendir, \ + _chdir, \ + _stat, \ + _getinfo, \ + _setinfo \ +}; + +//============================================================================= +// Mount table entry + +struct cyg_mtab_entry +{ + const char *name; // name of mount point + const char *fsname; // name of implementing filesystem + const char *devname; // name of hardware device + CYG_ADDRWORD data; // private data value + + // The following are filled in after a successful mount operation + cyg_bool valid; // Valid entry? + cyg_fstab_entry *fs; // pointer to fstab entry + cyg_dir root; // root directory pointer +}; + + +// This macro defines an initialized mtab entry + +#define MTAB_ENTRY( _l, _name, _fsname, _devname, _data ) \ +struct cyg_mtab_entry _l CYG_HAL_TABLE_ENTRY( mtab ) = \ +{ \ + _name, \ + _fsname, \ + _devname, \ + _data, \ + false, \ + NULL, \ + CYG_DIR_NULL \ +}; + +//============================================================================= +// IO vector descriptors + +struct CYG_IOVEC_TAG +{ + void *iov_base; /* Base address. */ + ssize_t iov_len; /* Length. */ +}; + +enum cyg_uio_rw { UIO_READ, UIO_WRITE }; + +/* Segment flag values. */ +enum cyg_uio_seg +{ + UIO_USERSPACE, /* from user data space */ + UIO_SYSSPACE /* from system space */ +}; + +struct CYG_UIO_TAG +{ + struct CYG_IOVEC_TAG *uio_iov; /* pointer to array of iovecs */ + int uio_iovcnt; /* number of iovecs in array */ + off_t uio_offset; /* offset into file this uio corresponds to */ + ssize_t uio_resid; /* residual i/o count */ + enum cyg_uio_seg uio_segflg; /* see above */ + enum cyg_uio_rw uio_rw; /* see above */ +}; + +// Limits +#define UIO_SMALLIOV 8 /* 8 on stack, else malloc */ + +//============================================================================= +// Description of open file + +typedef int cyg_fileop_read (struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio); +typedef int cyg_fileop_write (struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio); +typedef int cyg_fileop_lseek (struct CYG_FILE_TAG *fp, off_t *pos, int whence ); +typedef int cyg_fileop_ioctl (struct CYG_FILE_TAG *fp, CYG_ADDRWORD com, + CYG_ADDRWORD data); +typedef int cyg_fileop_select (struct CYG_FILE_TAG *fp, int which, CYG_ADDRWORD info); +typedef int cyg_fileop_fsync (struct CYG_FILE_TAG *fp, int mode ); +typedef int cyg_fileop_close (struct CYG_FILE_TAG *fp); +typedef int cyg_fileop_fstat (struct CYG_FILE_TAG *fp, struct stat *buf ); +typedef int cyg_fileop_getinfo (struct CYG_FILE_TAG *fp, int key, void *buf, int len ); +typedef int cyg_fileop_setinfo (struct CYG_FILE_TAG *fp, int key, void *buf, int len ); + +struct CYG_FILEOPS_TAG +{ + cyg_fileop_read *fo_read; + cyg_fileop_write *fo_write; + cyg_fileop_lseek *fo_lseek; + cyg_fileop_ioctl *fo_ioctl; + cyg_fileop_select *fo_select; + cyg_fileop_fsync *fo_fsync; + cyg_fileop_close *fo_close; + cyg_fileop_fstat *fo_fstat; + cyg_fileop_getinfo *fo_getinfo; + cyg_fileop_setinfo *fo_setinfo; +}; + +struct CYG_FILE_TAG +{ + cyg_uint32 f_flag; /* file state */ + cyg_uint16 f_ucount; /* use count */ + cyg_uint16 f_type; /* descriptor type */ + cyg_uint32 f_syncmode; /* synchronization protocol */ + struct CYG_FILEOPS_TAG *f_ops; /* file operations */ + off_t f_offset; /* current offset */ + CYG_ADDRWORD f_data; /* file or socket */ + CYG_ADDRWORD f_xops; /* extra type specific ops */ + cyg_mtab_entry *f_mte; /* mount table entry */ +}; + +//----------------------------------------------------------------------------- +// File flags + +// Allocation here is that bits 0..15 are copies of bits from the open +// flags, bits 16..23 are extra bits that are visible to filesystems but +// are not derived from the open call, and bits 24..31 are reserved for +// the fileio infrastructure. +#define CYG_FREAD O_RDONLY +#define CYG_FWRITE O_WRONLY +#define CYG_FNONBLOCK O_NONBLOCK +#define CYG_FAPPEND O_APPEND +#define CYG_FASYNC 0x00010000 +#define CYG_FDIR 0x00020000 + +#define CYG_FLOCKED 0x01000000 // Set if file is locked +#define CYG_FLOCK 0x02000000 // Lock during file ops +#define CYG_FALLOC 0x80000000 // File is "busy", i.e. allocated + +// Mask for open mode bits stored in file object +#define CYG_FILE_MODE_MASK (CYG_FREAD|CYG_FWRITE|CYG_FNONBLOCK|CYG_FAPPEND) + +//----------------------------------------------------------------------------- +// Type of file + +#define CYG_FILE_TYPE_FILE 1 /* file */ +#define CYG_FILE_TYPE_SOCKET 2 /* communications endpoint */ +#define CYG_FILE_TYPE_DEVICE 3 /* device */ + +//----------------------------------------------------------------------------- +// Keys for getinf() and setinfo() + +#define FILE_INFO_CONF 1 /* fpathconf() */ + +//----------------------------------------------------------------------------- +// Modes for fsync() + +#define CYG_FSYNC 1 +#define CYG_FDATASYNC 2 + +//----------------------------------------------------------------------------- +// Get/set info buffer structures + +// This is used for pathconf() and fpathconf() +struct cyg_pathconf_info +{ + int name; // POSIX defined variable name + long value; // Returned variable value +}; + +//============================================================================= +// Synchronization modes +// These values are filled into the syncmode fields of the above structures +// and define the synchronization protocol used when accessing the object in +// question. + +#define CYG_SYNCMODE_NONE (0) // no locking required + +#define CYG_SYNCMODE_FILE_FILESYSTEM 0x0002 // lock fs during file ops +#define CYG_SYNCMODE_FILE_MOUNTPOINT 0x0004 // lock mte during file ops +#define CYG_SYNCMODE_IO_FILE 0x0010 // lock file during io ops +#define CYG_SYNCMODE_IO_FILESYSTEM 0x0020 // lock fs during io ops +#define CYG_SYNCMODE_IO_MOUNTPOINT 0x0040 // lock mte during io ops +#define CYG_SYNCMODE_SOCK_FILE 0x0100 // lock socket during socket ops +#define CYG_SYNCMODE_SOCK_NETSTACK 0x0800 // lock netstack during socket ops + +#define CYG_SYNCMODE_IO_SHIFT (4) // shift for IO to file bits +#define CYG_SYNCMODE_SOCK_SHIFT (8) // shift for sock to file bits + +//============================================================================= +// Mount and umount functions + +__externC int mount( const char *devname, + const char *dir, + const char *fsname); + +__externC int umount( const char *name); + +//============================================================================= +// Select support + +//----------------------------------------------------------------------------- +// Data structure for embedding in client data structures. A pointer to this +// must be passed to cyg_selrecord() and cyg_selwakeup(). + +struct CYG_SELINFO_TAG +{ + CYG_ADDRWORD si_info; // info passed through from fo_select() + CYG_ADDRESS si_thread; // selecting thread pointer +}; + +//----------------------------------------------------------------------------- +// Select support functions. + +// cyg_selinit() is used to initialize a selinfo structure. +__externC void cyg_selinit( struct CYG_SELINFO_TAG *sip ); + +// cyg_selrecord() is called when a client device needs to register +// the current thread for selection. +__externC void cyg_selrecord( CYG_ADDRWORD info, struct CYG_SELINFO_TAG *sip ); + +// cyg_selwakeup() is called when the client device matches the select +// criterion, and needs to wake up a selector. +__externC void cyg_selwakeup( struct CYG_SELINFO_TAG *sip ); + +//============================================================================= +// Timestamp support + +// Provides the current time as a time_t timestamp for use in filesystem +// data strucures. + +__externC time_t cyg_timestamp(void); + +//============================================================================= +// Default functions. +// Cast to the appropriate type, these functions can be put into any of +// the operation table slots to provide the defined error code. + +__externC int cyg_fileio_enosys(void); +__externC int cyg_fileio_erofs(void); +__externC int cyg_fileio_enoerr(void); +__externC int cyg_fileio_enotdir(void); +__externC cyg_fileop_select cyg_fileio_seltrue; + +//----------------------------------------------------------------------------- +#endif // ifndef CYGONCE_FILEIO_H +// End of fileio.h
