summaryrefslogtreecommitdiffstats
path: root/main/common/tfs.h
blob: d4e21e59db628fbf7f77c6a8fc74b052b254d7d8 (plain) (blame)
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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
/**************************************************************************
 *
 * Copyright (c) 2013 Alcatel-Lucent
 * 
 * Alcatel Lucent licenses this file to You under the Apache License,
 * Version 2.0 (the "License"); you may not use this file except in
 * compliance with the License.  A copy of the License is contained the
 * file LICENSE at the top level of this repository.
 * You may also obtain a copy of the License at:
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 **************************************************************************
 *
 * tfs.h:
 *
 * Header file for TFS transactions, used by both application and monitor.
 *
 * Original author:     Ed Sutter (ed.sutter@alcatel-lucent.com)
 *
 */
#ifndef _TFS_H_
#define _TFS_H_

#define TFSINFOSIZE		23		/* Max size of info string (mod4-1). */

#ifndef TFSNAMESIZE				/* This specifies the maximum size of a file */
#define TFSNAMESIZE		23		/* name that can be used in TFS. */
#endif							/* This MUST be some value mod4 - 1. */

#ifndef TFS_CHANGELOG_FILE		/* Information used for change-log */
#define TFS_CHANGELOG_SIZE	0	/* facility within tfs. */
#define TFS_CHANGELOG_FILE	".tfschlog"
#endif

#ifndef SYMFILE					/* This specifies the default filename */
#define SYMFILE		"symtbl"	/* used by the monitor for the symbol */
#endif							/* table. */

#define MINUSRLEVEL		0		/* Minimum user level supported. */
#define MAXUSRLEVEL		3		/* Maximum user level supported. */

#ifndef TFS_RESERVED
#define TFS_RESERVED	4		/* Number of "reserved" entries (ulong) */
#endif							/* in the TFS header. */


/* Flags: */
#define TFS_EXEC	0x00000001	/* 'e': Executable script. */
#define TFS_BRUN	0x00000002	/* 'b': To be executed at boot. */
#define TFS_QRYBRUN	0x00000004	/* 'B': To be executed at boot if */
								/*      query passes. */
#define TFS_SYMLINK	0x00000008	/* 'l': Symbolic link file. */
#define TFS_EBIN	0x00000010	/* 'E': Executable binary (coff/elf/a.out). */
#define TFS_IPMOD	0x00000080	/* 'i': File is in-place modifiable. */
#define TFS_UNREAD	0x00000100	/* 'u':	File is not even readable if the */
								/*		user-level requirement is not met; */
								/*		else, it is read-only. */
#define TFS_ULVLMSK	0x00000600	/*	User level mask defines 4 access levels: */
#define TFS_ULVL0	0x00000000	/* '0'	level 0 */
#define TFS_ULVL1	0x00000200	/* '1'	level 1 */
#define TFS_ULVL2	0x00000400	/* '2'	level 2 */
#define TFS_ULVL3	0x00000600	/* '3'	level 3 */
#define TFS_NSTALE	0x00000800	/* File is NOT stale, invisible to user.
								 * When this bit is clear, the file is 
								 * considered stale (see notes in tfsadd()). 
								 * See notes in tfsclose() for this.
								 */
#define TFS_ACTIVE	0x00008000	/* Used to indicate that file is not deleted. */

#define TFS_ULVLMAX	TFS_ULVL3
#define TFS_USRLVL(f)	((f->flags & TFS_ULVLMSK) >> 9)

/* Open modes */
#define	TFS_RDONLY		0x00010000	/* File is opened for reading. */
#define	TFS_CREATE		0x00020000	/* File is to be created. Error if file */
									/* with the same name already exists. */
#define	TFS_APPEND		0x00040000	/* Append to existing file.  If OR'ed */
									/* with TFS_CREATE, then create if */
									/* necessary. */
#define	TFS_ALLFFS		0x00080000	/* File is created with all FFs. */
#define	TFS_CREATERM	0x00100000	/* File is to be created. If file with */
									/* same name already exists, then allow */
									/* tfsadd() to remove it if necessary. */

/* The function tfsrunrc() will search through the current file set and */
/* if the file defined by TFS_RCFILE exists, it will be executed. */
/* If this file exists, it will NOT be run by tfsrunboot(). */
#define TFS_RCFILE		"monrc"

/* Requests that can be made to tfsctrl(): */
#define	TFS_ERRMSG		1
#define	TFS_MEMUSE		2
#define	TFS_MEMDEAD		3
#define	TFS_DEFRAG		4
#define	TFS_TELL		5
#define	TFS_UNOPEN		7
#define	TFS_FATOB		8
#define	TFS_FBTOA		9
#define	TFS_MEMAVAIL	10
#define	TFS_TIMEFUNCS	11
#define	TFS_DOCOMMAND	12
#define	TFS_INITDEV		13
#define	TFS_CHECKDEV	14
#define	TFS_DEFRAGDEV	15
#define	TFS_DEFRAGOFF	16
#define	TFS_DEFRAGON	17
#define	TFS_HEADROOM	18
#define	TFS_FCOUNT		19
#define	TFS_RAMDEV		20

/* struct tfshdr:
 *	It is in FLASH as part of the file system to record the attributes of
 *	the file at the time of creation.
 *
 *  New as of March 2007...
 *  See tfsBase() for info on the use of the first entry of the rsvd[] array.
 */
struct tfshdr {
	unsigned short	hdrsize;		/* Size of this header.					*/
	unsigned short	hdrvrsn;		/* Header version #.					*/
	long	filsize;				/* Size of the file.					*/
	long	flags;					/* Flags describing the file.			*/
	unsigned long filcrc; 			/* 32 bit CRC of file.					*/
	unsigned long hdrcrc;			/* 32 bit CRC of the header.			*/
	unsigned long	modtime;		/* Time when file was last modified.	*/
	struct	tfshdr	*next;			/* Pointer to next file in list.		*/
	char	name[TFSNAMESIZE+1];	/* Name of file.						*/
	char	info[TFSINFOSIZE+1];	/* Miscellaneous info field.			*/
#if TFS_RESERVED
	unsigned long	rsvd[TFS_RESERVED];
#endif
};

/* struct tfsramdev:
 * Used with the tfsctrl function TFS_RAMDEV to allow the user to
 * specify the name, base address and size of a new, temporary
 * ram-based TFS device.
 */
struct tfsramdev {
	char *name;
	long base;
	long size;
};

#define TFSHDRSIZ	sizeof(struct tfshdr)

/* TFS error returns. */
#define TFS_OKAY				0
#define TFSERR_NOFILE			-1
#define TFSERR_NOSLOT			-2
#define TFSERR_EOF				-3
#define TFSERR_BADARG			-4
#define TFSERR_NOTEXEC			-5
#define TFSERR_BADCRC			-6
#define TFSERR_FILEEXISTS		-7
#define TFSERR_FLASHFAILURE		-8
#define TFSERR_WRITEMAX			-9
#define TFSERR_RDONLY			-10
#define TFSERR_BADFD			-11
#define TFSERR_BADHDR			-12
#define TFSERR_CORRUPT			-13
#define TFSERR_MEMFAIL			-14
#define TFSERR_NOTIPMOD			-16
#define TFSERR_MUTEXFAILURE		-17
#define TFSERR_FLASHFULL		-18
#define TFSERR_USERDENIED		-19
#define TFSERR_NAMETOOBIG		-20
#define TFSERR_FILEINUSE		-21
#define TFSERR_NOTAVAILABLE		-23
#define TFSERR_BADFLAG			-24
#define TFSERR_CLEANOFF			-25
#define TFSERR_FLAKEYSOURCE		-26
#define TFSERR_BADEXTENSION		-27
#define TFSERR_LINKERROR		-28
#define TFSERR_BADPREFIX		-29
#define TFSERR_ALTINUSE			-30
#define TFSERR_NORUNMONRC		-31
#define TFSERR_DSIMAX			-32
#define TFSERR_TOOSMALL			-33
#define TFSERR_MIN				-100

/* TFS seek options. */
#define TFS_BEGIN		1
#define TFS_CURRENT		2
#define TFS_END			3

/* Macros: */
#define TFS_DELETED(fp)		(!((fp)->flags & TFS_ACTIVE))
#define TFS_FILEEXISTS(fp)	((fp)->flags & TFS_ACTIVE)
#define TFS_ISEXEC(fp)		((fp)->flags & TFS_EXEC)
#define TFS_ISBOOT(fp)		((fp)->flags & TFS_BRUN)
#define TFS_ISLINK(fp)		((fp)->flags & TFS_SYMLINK)
#define TFS_STALE(fp) 		(!((fp)->flags & TFS_NSTALE))
#define TFS_FLAGS(fp)		((fp)->flags)
#define TFS_NAME(fp)		((fp)->name)
#define TFS_SIZE(fp)		((fp)->filsize)
#define TFS_TIME(fp)		((fp)->modtime)
#define TFS_INFO(fp)		((fp)->info)
#define TFS_NEXT(fp)		((fp)->next)
#define TFS_CRC(fp)			((fp)->filcrc)
#define TFS_ENTRY(fp)		((fp)->entry)
#define TFS_BASE(fp)		((char *)(fp)+(fp)->hdrsize)

typedef struct tfshdr TFILE;
typedef struct tfsramdev TRAMDEV;
#endif