mirror of
https://github.com/open-simh/simtools.git
synced 2026-02-02 14:52:29 +00:00
file systems. It supports reading and writing as well as a number
of other operations, such as octal dump, file system initialize,
and file system check ("clean").
This was originally maintained as a Subversion repository at
svn://akdesign.dyndns.org/flx/branches/V2.6.
as suggested by Timothe Litt on the SIMH mailing list.
228 lines
7.0 KiB
C
228 lines
7.0 KiB
C
/* rstsflx common definitions */
|
|
|
|
/* define BROKEN_ANSI when compiling on systems that have a defective
|
|
* set of include files, like SunOS 4.1
|
|
*/
|
|
#ifdef BROKEN_ANSI
|
|
#define EXIT_SUCCESS 0
|
|
#define EXIT_FAILURE 1
|
|
#define strtoul strtol
|
|
#define SEEK_SET 0
|
|
#define FILENAME_MAX 160
|
|
#endif
|
|
|
|
/* Apple doesn't define __unix__ */
|
|
#ifdef __APPLE__
|
|
#define __unix__ 1
|
|
#endif
|
|
|
|
#include "rstsflx.h" /* include mainline's prototypes */
|
|
|
|
/* macro to map a struct onto a given offset of fibuf */
|
|
|
|
#define use(str,off) ((str *)(&fibuf[(off)]))
|
|
#define clumap (use(fdcm,BLKSIZE-sizeof(fdcm)))
|
|
#define fibufw ((word16 *)(&fibuf[0]))
|
|
|
|
/* block numbering conversions */
|
|
|
|
#define dcntolbn(dcn) ((dcn)*dcs) /* convert DCN to LBN */
|
|
#define pcntolbn(pcn) ((pcn)*pcs+dcs) /* convert PCN to LBN */
|
|
#define lbntodcn(lbn) ((lbn)/dcs) /* convert LBN to DCN */
|
|
#define lbntopcn(lbn) (((lbn)-dcs)/pcs) /* convert LBN to PCN */
|
|
#define dcntopcn(dcn) (((dcn)-1)*dcs/pcs) /* convert DCN to PCN */
|
|
#define pcntodcn(pcn) ((pcn)*pcs/dcs+1) /* convert PCN to DCN */
|
|
|
|
/* other handy macros */
|
|
|
|
#define UP(x,y) (((x)+(y)-1)&(-(y))) /* round x up to mult of y */
|
|
#define DOWN(x,y) ((x)&(-(y))) /* round x down to mult of y */
|
|
|
|
/* buffer marking */
|
|
|
|
#define MARKS (womsat = TRUE) /* mark SATT dirty */
|
|
#define MARKF (fiblkw = TRUE) /* mark FIBUF dirty */
|
|
|
|
/* common constants */
|
|
|
|
#define FALSE 0
|
|
#define TRUE 1
|
|
|
|
/* Useful general data types
|
|
*
|
|
* Note: "int" is being used here whenever 16 bits suffice;
|
|
* "long int" where 32 bits are needed. In some platforms,
|
|
* we'll end up with more bits than that, which is not a problem.
|
|
* Whenever data types of a specific size (rather than just a
|
|
* minimum size) are needed, the types defined in platform.h are used.
|
|
*/
|
|
|
|
typedef unsigned char byte;
|
|
typedef unsigned int word;
|
|
typedef unsigned long int lword;
|
|
|
|
/* bring in platform specific type definitions */
|
|
|
|
#include "platform.h"
|
|
|
|
/* lengths of various strings, including null terminator */
|
|
|
|
#define NAMELEN 11 /* file name.ext */
|
|
#define DATELEN 12 /* Y2k style date (4 digit year) */
|
|
#define RTIMELEN 9 /* RSTS style time */
|
|
#define RTSLEN 7 /* Runtime system name */
|
|
|
|
/* buffer sizes */
|
|
|
|
#define BLKSIZE 512 /* one disk block */
|
|
#define LSIZE 512 /* length of line buffer */
|
|
|
|
/* error codes; sometimes return codes, sometimes fatal error codes */
|
|
|
|
#define BADRE 0
|
|
#define BADLINK 1
|
|
#define BADBLK 3
|
|
#define BADDCS 4
|
|
#define CORRUPT 5
|
|
#define NOMEM 6
|
|
#define INTERNAL 7
|
|
#define DIRTY 8
|
|
#define ROPACK 9
|
|
#define DISKIO 10
|
|
#define NOMSG 11 /* used when caller generates the message */
|
|
#define BADPAK 12 /* pack cannot be rebuilt */
|
|
|
|
#define rabort(code) doabort (code, __FILE__, __LINE__)
|
|
|
|
/* file scan codes for "dofiles" */
|
|
|
|
#define NOTNULL 0
|
|
#define NULLISNULL 1
|
|
#define NULLISWILD 2
|
|
|
|
/* open modes */
|
|
|
|
#define DREADMODE "rb" /* read only disk access */
|
|
#define DWRITEMODE "r+b" /* read/write disk access */
|
|
#define DCREATEMODE "w+b" /* creating new container file */
|
|
|
|
/* data types */
|
|
|
|
typedef struct { /* switch flag table layout */
|
|
char *ascii;
|
|
char *bswitch; /* binary or brief (in list) */
|
|
char *clusiz;
|
|
char *contig;
|
|
char *create;
|
|
char *rstsdevice;
|
|
char *debug;
|
|
char *end;
|
|
char *full;
|
|
char *merge;
|
|
char *oattr;
|
|
char *odt;
|
|
char *offset;
|
|
char *prot;
|
|
char *query;
|
|
char *replace;
|
|
char *rmsvar;
|
|
char *rmsfix;
|
|
char *rmsstm;
|
|
char *size;
|
|
char *disksize;
|
|
char *start;
|
|
char *summary;
|
|
char *tree;
|
|
char *unprot;
|
|
char *verbose;
|
|
char *wide;
|
|
char *overwrite;
|
|
char *narrow;
|
|
char *user;
|
|
char *hex;
|
|
} swtab;
|
|
|
|
#define f_name 1 /* name present */
|
|
#define f_namw 2 /* name wild */
|
|
#define f_ext 4 /* extension present */
|
|
#define f_extw 8 /* extension wild */
|
|
#define f_ppn 16 /* PPN present */
|
|
#define f_ppnw 32 /* PPN wild */
|
|
#define f_prot 64 /* protection code present */
|
|
|
|
#define F_WILD (f_namw | f_extw | f_ppnw) /* something wild if set */
|
|
|
|
typedef struct {
|
|
long size; /* filesize */
|
|
int clusiz; /* cluster size */
|
|
int flags; /* parse flags */
|
|
word nlink; /* link to NE */
|
|
word alink; /* link to AE */
|
|
word rlink; /* link to first RE */
|
|
word rmslink; /* link to attributes */
|
|
word recfmt; /* record format and flags for fileio */
|
|
word recsiz; /* record size (if fixed records) */
|
|
word rechdrsiz; /* header size if vfc */
|
|
long eofblk; /* EOF block number from RMS */
|
|
int eofbyte; /* EOF byte from RMS */
|
|
word currecsiz; /* size of current (split across buffers) rec */
|
|
word recskip; /* amount to skip for vfc */
|
|
char *currec; /* current record pointer */
|
|
byte stat; /* saved file status */
|
|
byte prot; /* saved file protection */
|
|
byte proj; /* supplied PPN as two bytes */
|
|
byte prog;
|
|
char name[NAMELEN]; /* supplied file name.ext */
|
|
byte newprot; /* protection code from filespec */
|
|
byte cproj; /* current PPN as two bytes */
|
|
byte cprog;
|
|
char cname[NAMELEN]; /* current name.ext */
|
|
} firqb; /* well, sort of... :-) holds parsed filename */
|
|
|
|
/* typedefs for procedure datatypes, used to work around cc -protoi bug */
|
|
|
|
typedef void (*commandaction)(firqb *);
|
|
typedef void (*commandhandler)(int, char **);
|
|
typedef void (*iohandler)(long, long, void *);
|
|
|
|
/* external references: */
|
|
|
|
extern swtab sw; /* switch and argument pointers */
|
|
extern char *progname; /* name of this program */
|
|
extern byte fibuf[BLKSIZE]; /* buffer for directories */
|
|
extern byte *sattbufp; /* pointer to SATT buffer */
|
|
extern int sattsize; /* size of SATT in bytes */
|
|
extern long sattlbn; /* start LBN of SATT */
|
|
extern long satptr; /* current allocation pointer (PCN) */
|
|
extern int womsat; /* TRUE if SATT needs to be written */
|
|
extern long fiblk; /* current block in FIBUF */
|
|
extern int fiblkw; /* TRUE if FIBUF needs to be written */
|
|
extern long i,k; /* current directory entry pointers */
|
|
extern int pcs; /* pack clustersize */
|
|
extern long pcns; /* number of pack clusters on this disk */
|
|
extern int pflags; /* pack flags */
|
|
extern int plevel; /* pack structure rev level */
|
|
extern long mfddcn; /* DCN of start of MFD */
|
|
extern long mfdlbn; /* LBN of start of MFD */
|
|
extern char pname[7]; /* pack ID in ascii */
|
|
extern int dcs; /* device clustersize */
|
|
extern long diskblocks; /* device block count */
|
|
extern const char *rname; /* file name of disk/container */
|
|
extern const char *rssize; /* and size, as a string */
|
|
extern long rsize; /* size of RSTS disk or container file */
|
|
extern int absflag; /* flag for absolute I/O */
|
|
extern FILE *rstsfile; /* file for the rsts disk/container */
|
|
extern char **fargv; /* array of pointers to arguments */
|
|
extern int fargc; /* and count of how many we found */
|
|
extern char *iobuf; /* general file I/O buffer */
|
|
extern long iobufsize; /* size of the buffer */
|
|
extern int entptr; /* current directory entry allocation pointer */
|
|
extern word nextlink; /* link to next file (ulnk of current) */
|
|
extern word prevlink; /* link to predecessor file */
|
|
extern word nextppnlink; /* link to next PPN for RDS 0 */
|
|
extern word prevppnlink; /* link to prececessor of PPN for RDS 0 */
|
|
extern long curgfd; /* LBN of start of current GFD */
|
|
extern char *defdevice; /* default RSTS device name */
|
|
extern char *defsize; /* and size */
|
|
extern long newhistitems; /* new history items this session */
|