245 lines
8.9 KiB
C
245 lines
8.9 KiB
C
/* rt11FsLib.h - header for RT-11 media-compatible file system library */
|
|
|
|
/* Copyright 1984-1992 Wind River Systems, Inc. */
|
|
|
|
/*
|
|
modification history
|
|
--------------------
|
|
02b,22sep92,rrr added support for c++
|
|
02a,04jul92,jcf cleaned up.
|
|
02h,26may92,rrr the tree shuffle
|
|
02g,04oct91,rrr passed through the ansification filter
|
|
-fixed #else and #endif
|
|
-changed READ, WRITE and UPDATE to O_RDONLY O_WRONLY O_RDWR
|
|
-changed VOID to void
|
|
-changed copyright notice
|
|
02f,10jun91.del added pragma for gnu960 alignment.
|
|
02e,08oct90,kdl removed declarations of functions now made LOCAL.
|
|
02d,05oct90,shl added ANSI function prototypes.
|
|
added copyright notice.
|
|
02c,10aug90,dnw added declaration of rt11FsReadyChange().
|
|
02b,09aug90,kdl changed name from rt11Lib to rt11FsLib.
|
|
02a,07aug90,shl added IMPORT type to function declarations.
|
|
01z,04may90,kdl moved volume mode from vol descriptor to BLK_DEV (blkIo.h),
|
|
added vd_changeNoWarn.
|
|
01y,23mar90,kdl added S_rt11Lib_NO_BLOCK_DEVICE.
|
|
01x,07mar90,kdl changed to support multi-filesystem device drivers.
|
|
01w,05jun88,dnw changed rtLib to rt11Lib.
|
|
01v,30may88,dnw changed to v4 names.
|
|
01u,04may88,jcf changed SEMAPHORE to SEM_ID.
|
|
01t,25may88,dnw deleted erroneous ")" in S_rtLib_ENTRY_NUMBER_TOO_BIG def'n.
|
|
01s,19aug87,dnw changed rfd_start to be int instead of short to support
|
|
disks larger than 32k blocks.
|
|
01r,21mar87,gae spelling, S_rtLib_ENTRY_NUMBER_TO_BIG.
|
|
01q,04feb87,llk made changes which allow a one segment directory to have any
|
|
number of file entries. Segments are now dynamically
|
|
allocated (vd_dir_seg). Added vd_nSegBlocks field to
|
|
volume descriptor. It tells how many blocks are in the
|
|
volume descriptor's segment.
|
|
01p,14jan87,llk added RT_MAX_FILE_SIZE. Made de_nblocks unsigned.
|
|
01o,24dec86,gae changed stsLib.h to vwModNum.h.
|
|
01n,16oct86,gae added vd_mode to RT_VOL_DESC.
|
|
01m,07apr86,dnw replaced vd_ready flag with vd_state in RT_VOL_DESC.
|
|
01l,11mar86,dnw added vd_retry to RT_VOL_DESC.
|
|
01k,04sep85,jlf added vd_ready and vd_reset to RT_VOL_DESC.
|
|
01j,14aug85,dnw added S_rtLib_INVALID_DEVICE_PARAMETERS.
|
|
01i,28may85,jlf changed RT_VOL_DESC to contain disk format info, and sec
|
|
read and write routines rather than block.
|
|
01h,13aug84,ecs changed status codes: NO_ROOM_ON_DISK to DISK_FULL,
|
|
NO_SUCH_FILE to FILE_NOT_FOUND,
|
|
NAME_IN_USE to FILE_ALREADY_EXISTS.
|
|
01g,08aug84,ecs added status codes and include of stsLib.h.
|
|
01f,01aug84,dnw removed single density disk definitions, SD_..., to fd208Drv.c.
|
|
01e,06jul84,ecs removed rfd_entry_num from RT_FILE_DESC.
|
|
added vd_sem to RT_VOL_DESC.
|
|
added include of semLib.h.
|
|
changed rfd_modified from TBOOL to BOOL.
|
|
01d,11jun84,dnw removed vd_volume and added vd_rdblk, vd_wrtblk, and vd_nblocks
|
|
to RT_VOL_DESC.
|
|
added definitions of SD_RT_... for single density specific
|
|
values.
|
|
01c,27jan84,ecs added inclusion test.
|
|
01b,14aug83,dnw replaced RT_FILE_DESC.rfd_vdnum volume descriptor number with
|
|
.rfd_vdptr volume descriptor pointer.
|
|
replaced RT_FILE_DESC.rfd_maxblock end block number with
|
|
.rfd_endptr end byte pointer.
|
|
01a,14Feb83,dnw written
|
|
*/
|
|
|
|
#ifndef __INCrt11FsLibh
|
|
#define __INCrt11FsLibh
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "iosLib.h"
|
|
#include "semLib.h"
|
|
#include "blkIo.h"
|
|
#include "vwModNum.h"
|
|
|
|
|
|
#if ((CPU_FAMILY==I960) && (defined __GNUC__))
|
|
#pragma align 1 /* tell gcc960 not to optimize alignments */
|
|
#endif /* CPU_FAMILY==I960 */
|
|
/* rt11FsLib status codes */
|
|
|
|
#define S_rt11FsLib_VOLUME_NOT_AVAILABLE (M_rt11FsLib | 1)
|
|
#define S_rt11FsLib_DISK_FULL (M_rt11FsLib | 2)
|
|
#define S_rt11FsLib_FILE_NOT_FOUND (M_rt11FsLib | 3)
|
|
#define S_rt11FsLib_NO_FREE_FILE_DESCRIPTORS (M_rt11FsLib | 4)
|
|
#define S_rt11FsLib_INVALID_NUMBER_OF_BYTES (M_rt11FsLib | 5)
|
|
#define S_rt11FsLib_FILE_ALREADY_EXISTS (M_rt11FsLib | 6)
|
|
#define S_rt11FsLib_BEYOND_FILE_LIMIT (M_rt11FsLib | 7)
|
|
#define S_rt11FsLib_INVALID_DEVICE_PARAMETERS (M_rt11FsLib | 8)
|
|
#define S_rt11FsLib_NO_MORE_FILES_ALLOWED_ON_DISK (M_rt11FsLib | 9)
|
|
#define S_rt11FsLib_ENTRY_NUMBER_TOO_BIG (M_rt11FsLib | 10)
|
|
#define S_rt11FsLib_NO_BLOCK_DEVICE (M_rt11FsLib | 11)
|
|
|
|
/* rt11Fs file system constants */
|
|
|
|
#define RT_DIR_BLOCK 6
|
|
#define RT_BYTES_PER_BLOCK 512
|
|
#define RT_FILES_FOR_2_BLOCK_SEG 72
|
|
#define RT_MAX_BLOCKS_PER_FILE 0xffff /* maximum number of blocks per file,
|
|
largest size described by an unsigned
|
|
short (de_nblocks field of
|
|
RT_DIR_ENTRY) */
|
|
|
|
|
|
/* directory entry status values */
|
|
|
|
#define DES_TENTATIVE 0x0100 /* tentative file */
|
|
#define DES_EMPTY 0x0200 /* empty space */
|
|
#define DES_PERMANENT 0x0400 /* permanent file */
|
|
#define DES_END 0x0800 /* end of directory segment marker */
|
|
|
|
#define DES_BOGUS 0x0000 /* not a real rt11Fs directory entry */
|
|
|
|
|
|
/* miscellaneous */
|
|
|
|
#define NOT_IN_USE -1 /* descriptor not-in-use flag,
|
|
* in fd.rfd_status, vd.rfd_status */
|
|
|
|
/* rt11Fs radix-50 name structure */
|
|
|
|
typedef struct /* RT_NAME */
|
|
{
|
|
unsigned short nm_name1; /* filename chars 1-3 in radix-50 */
|
|
unsigned short nm_name2; /* filename chars 4-6 in radix-50 */
|
|
unsigned short nm_type; /* file type chars 1-3 in radix-50 */
|
|
} RT_NAME;
|
|
|
|
|
|
/* directory entry */
|
|
|
|
typedef struct /* RT_DIR_ENTRY */
|
|
{
|
|
short de_status; /* file status */
|
|
RT_NAME de_name; /* filename in radix-50 structure */
|
|
unsigned short de_nblocks; /* number of blocks in file */
|
|
char de_jobnum; /* (temp file only) job with file open */
|
|
char de_channel; /* (temp file only) channel with file is open */
|
|
short de_date; /* file creation date:
|
|
* bits 14-10 = month (1-12) in decimal
|
|
* bits 9- 5 = day (1-31) in decimal
|
|
* bits 4- 0 = year minus 110 in octal
|
|
*/
|
|
} RT_DIR_ENTRY;
|
|
|
|
|
|
/* directory segment */
|
|
|
|
typedef struct /* RT_DIR_SEG */
|
|
{
|
|
short ds_nsegs; /* number of segments in directory */
|
|
short ds_next_seg; /* number of next segment (0 = end of list) */
|
|
short ds_last_seg; /* number of highest segment used */
|
|
short ds_extra; /* number of extra bytes on each dir entry */
|
|
short ds_start; /* number of first data block for this seg */
|
|
RT_DIR_ENTRY ds_entries [1]; /* directory entries,
|
|
actual size gets dynamically allocated */
|
|
} RT_DIR_SEG;
|
|
|
|
|
|
/* volume descriptor */
|
|
|
|
typedef struct /* RT_VOL_DESC */
|
|
{
|
|
DEV_HDR vd_devhdr; /* i/o system device header (MUST COME FIRST!)*/
|
|
short vd_status; /* (OK | ERROR) */
|
|
SEM_ID vd_semId; /* volume descriptor semaphore id */
|
|
BLK_DEV *vd_pBlkDev; /* pointer to block device info */
|
|
int vd_nblocks; /* number of blocks in volume */
|
|
BOOL vd_rtFmt; /* TRUE if using RT-11 skew and track offset */
|
|
int vd_secBlock; /* Number of sectors per block */
|
|
int vd_state; /* state of volume (see below) */
|
|
int vd_retry; /* retry count of disk operations */
|
|
int vd_nSegBlocks; /* number of blocks in the directory segment,
|
|
there are always at least 2 */
|
|
RT_DIR_SEG *vd_dir_seg; /* pointer to current directory segment */
|
|
BOOL vd_changeNoWarn; /* TRUE if disk changed without readyChange */
|
|
} RT_VOL_DESC;
|
|
|
|
/* volume states */
|
|
|
|
#define RT_VD_READY_CHANGED 0 /* vol not accessed since ready change*/
|
|
#define RT_VD_RESET 1 /* volume reset but not mounted */
|
|
#define RT_VD_MOUNTED 2 /* volume mounted */
|
|
#define RT_VD_CANT_RESET 3 /* volume reset failed */
|
|
#define RT_VD_CANT_MOUNT 4 /* volume mount failed */
|
|
|
|
|
|
/* rt11Fs file descriptor */
|
|
|
|
typedef struct /* RT_FILE_DESC */
|
|
{
|
|
short rfd_status; /* (OK | NOT_IN_USE) */
|
|
RT_VOL_DESC *rfd_vdptr; /* pointer to rt11Fs volume descriptor */
|
|
int rfd_start; /* number of first block in file */
|
|
short rfd_mode; /* access mode: O_RDONLY, O_WRONLY, O_RDWR */
|
|
RT_DIR_ENTRY rfd_dir_entry; /* directory entry for this file */
|
|
int rfd_curptr; /* file byte ptr of current buffer byte 0 */
|
|
int rfd_newptr; /* file byte ptr for new read/writes */
|
|
int rfd_endptr; /* file byte ptr to end of file */
|
|
BOOL rfd_modified; /* TRUE = buffer has been modified */
|
|
char rfd_buffer [RT_BYTES_PER_BLOCK];
|
|
/* file I/O buffer */
|
|
} RT_FILE_DESC;
|
|
|
|
|
|
/* Function declarations */
|
|
|
|
#if defined(__STDC__) || defined(__cplusplus)
|
|
|
|
extern RT_VOL_DESC *rt11FsDevInit (char *devName, BLK_DEV *pBlkDev,
|
|
BOOL rt11Fmt, int nEntries,
|
|
BOOL changeNoWarn);
|
|
extern RT_VOL_DESC *rt11FsMkfs (char *volName, BLK_DEV *pBlkDev);
|
|
extern STATUS rt11FsInit (int maxFiles);
|
|
extern void rt11FsDateSet (int year, int month, int day);
|
|
extern void rt11FsModeChange (RT_VOL_DESC *vdptr, int newMode);
|
|
extern void rt11FsReadyChange (RT_VOL_DESC *vdptr);
|
|
|
|
#else /* __STDC__ */
|
|
|
|
extern RT_VOL_DESC *rt11FsDevInit ();
|
|
extern RT_VOL_DESC *rt11FsMkfs ();
|
|
extern STATUS rt11FsInit ();
|
|
extern void rt11FsDateSet ();
|
|
extern void rt11FsModeChange ();
|
|
extern void rt11FsReadyChange ();
|
|
|
|
#endif /* __STDC__ */
|
|
|
|
#if ((CPU_FAMILY==I960) && (defined __GNUC__))
|
|
#pragma align 0 /* turn off alignment requirement */
|
|
#endif /* CPU_FAMILY==I960 */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __INCrt11FsLibh */
|