summaryrefslogtreecommitdiff
path: root/wrudf/wrudf.h
blob: d9edba60b1658abb61adc96483b96d495b76b604 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
/*	wrudf.h
 *
 * PURPOSE
 *  	The header file for wrudf.c and related source files.
 *
 * COPYRIGHT
 *	This file is distributed under the terms of the GNU General Public
 *	License (GPL). Copies of the GPL can be obtained from:
 *		ftp://prep.ai.mit.edu/pub/gnu/GPL
 *	Each contributing author retains all rights to their own work.
 *
 *	(C) 2001 Enno Fennema <e.fennema@dataweb.nl>
 *
 * HISTORY
 *  	16 Aug 01  ef  created.
 */


#include <sys/time.h>
#include <time.h>
#include <stdint.h>
#include <string.h>

#include "ecma_167.h"
#include "osta_udf.h"
#include "libudffs.h"

struct generic_desc
{
	tag		descTag;
	uint32_t	volDescSeqNum;
};

extern char*		hdWorkingDir;
extern int		ignoreReadError;
extern int		device;
extern int		devicetype;
#define DISK_IMAGE	0xAA

enum MEDIUM { CDR = 1, CDRW };

extern enum MEDIUM medium;

// #define CDR		'R'
// #define CDRW		'W'

extern uint32_t		trackSize;

#ifdef _GNU_SOURCE
/* I appear not to have readline.h */
char*	readline(char* prompt);
extern char	*line;
#else
extern char	line[256];
#endif

extern regid	entityWRUDF;
extern timestamp timeStamp;

enum RV { CMND_OK, CMND_FAILED, WRONG_NO_ARGS, CMND_ARG_INVALID, NOT_IN_RW_PARTITION,
	  DIR_INVALID, EXISTING_DIR, EXISTING_FILE, DELETED_DIR, DELETED_FILE, DOES_NOT_EXIST,
	  DIR_NOT_EMPTY, PERMISSION_DENIED, IS_DIRECTORY };

enum CMND { CMND_CP = 50, CMND_RM, CMND_MKDIR, CMND_RMDIR, CMND_LSC, CMND_LSH, CMND_CDC, CMND_CDH, CMND_QUIT };

extern	int	cmndc;
extern	char**	cmndv;

extern	uint32_t	options;
#define OPT_DUMMY	0x01
#define OPT_FORCE	0x02
#define OPT_RECURSIVE	0x04

extern int	spaceMapDirty, usdDirty, sparingTableDirty;

extern struct logicalVolDesc		*lvd;
extern struct partitionDesc		*pd;		/* The (re)writable partition descriptor */
extern uint16_t				virtualPartitionNum;
extern uint32_t				*vat;
extern struct unallocSpaceDesc		*usd;
extern struct spaceBitmapDesc		*spaceMap;
extern struct logicalVolIntegrityDesc	*lvid;
extern struct fileSetDesc		*fsd;
extern unsigned int			usedSparingEntries;
extern struct sparingTable		*st;

typedef struct _dir_ {
    struct _dir_	*parent, *child;
    uint32_t		dataSize;
    char		*data;
    long_ad		icb;				/* icb of this directory itself */
    char		*name;
    uint32_t		dirDirty;
    struct fileEntry	fe;
    uint8_t		spacer[2048-sizeof(struct fileEntry)];
}   Directory;

extern Directory		*rootDir, *curDir;


/*wrudf.c */
char* readLine(char *prompt);

/* wrudf-cmnd.c */
int	updateDirectory(Directory* dir);
Directory *readDirectory(Directory *parentDir, long_ad *icb, char* name);

int	cpCommand(void);
int	rmCommand(void);
int	mkdirCommand(void);
int	rmdirCommand(void);
int	cdcCommand(void);
int	cdhCommand(void);
int	lscCommand(void);
int	lshCommand(void);

/* wrudf-desc.c */
struct fileIdentDesc*	makeFileIdentDesc(char* name);
struct fileIdentDesc*	findFileIdentDesc(Directory *dir, char* name);
int			deleteFID(Directory *dir, struct fileIdentDesc *fid);
int			removeFID(Directory *dir, struct fileIdentDesc *fid);
int			insertFileIdentDesc(Directory *dir, struct fileIdentDesc* fid);
struct fileEntry*	makeFileEntry();


/* wrudf-cdrw.c */
enum markAction { FREE, ALLOC };
void markBlock(enum markAction action, uint32_t blkno);

extern	int		lastTrack;
extern	int		sectortype;
extern  struct cdrom_trackinfo	ti;

int	getExtents(uint32_t requestedLength, short_ad *extents);
int	freeShortExtents(short_ad* extent);
int	freeLongExtents(long_ad* extent);

void	getUnallocSpaceExtent(uint32_t requestLength, uint32_t requestAfter, extent_ad *alloc);

void 	setChecksum(void *descriptor);
void	updateTimestamp(time_t t, uint32_t  ut);		/* current time if t = 0 */
void	setStrictRead(int yes);
uint32_t	getPhysical(uint32_t lbn, uint16_t part);
void	updateSparingTable();

#define ABSOLUTE	0xFFFF				/* ignore partition, process physical blocknumber */
/*	actually 0xFFFF is a perfectly valid partition number
 *	could make part a uint32_t and use 0xFFFFFFFF 
 *	or have write absolute block routine
*/

#define INVALID		0xFFFFFFFF

void*	readBlock(uint32_t lbn, uint16_t part);
void	freeBlock(uint32_t lbn, uint16_t part);
void	dirtyBlock(uint32_t lbn, uint16_t part);
void	writeBlock(uint32_t lbn, uint16_t part, void* src);
void* 	readSingleBlock(uint32_t pbn);
void* 	readTaggedBlock(uint32_t lbn, uint16_t part);
int	readExtents(char* dest, int usesShort, void* extents);
int	writeExtents(char* src, int usesShort, void* extents);

int	initIO(char *filename);
int	closeIO();

/* wrudf-cdr.c */
uint32_t	newVATentry();
uint32_t	getNWA();
uint32_t	getMaxVarPktSize();
uint32_t	writeCDR(void* src);
void	syncCDR();
void	writeHDlink();
unsigned char*	readCDR(uint32_t lbn, uint16_t partition);
int	verifyCDR(struct fileEntry *fe);
void	readVATtable();
void	writeVATtable();

/* ide-pc.h */
void	fail(char* fmt, ...);