-
Notifications
You must be signed in to change notification settings - Fork 6
/
CheckAccess.c
128 lines (105 loc) · 2.32 KB
/
CheckAccess.c
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
/* $Id: CheckAccess.c 1.1 1996/01/03 10:18:38 Michiel Exp Michiel $ */
/* $Log: CheckAccess.c $
* Revision 1.1 1996/01/03 10:18:38 Michiel
* Initial revision
* */
// own includes
#include "blocks.h"
#include "struct.h"
#include "disk_protos.h"
#include "allocation_protos.h"
#include "volume_protos.h"
#include "directory_protos.h"
#include "anodes_protos.h"
#include "update_protos.h"
#include "checkaccess_protos.h"
#include "kswrapper.h"
/* fileaccess that changes a file but doesn't write to it
*/
BOOL CheckChangeAccess(fileentry_t *file, SIPTR *error, globaldata *g)
{
#if DELDIR
/* delfiles cannot be altered */
if (IsDelFile (file->le.info))
{
*error = ERROR_WRITE_PROTECTED;
return FALSE;
}
#endif
/* test on type */
if (!IsFile(file->le.info))
{
*error = ERROR_OBJECT_WRONG_TYPE;
return FALSE;
}
/* volume must be or become currentvolume */
if (!CheckVolume(file->le.volume, 1, error, g))
return FALSE;
/* check reserved area lock */
if (ReservedAreaIsLocked)
{
*error = ERROR_DISK_FULL;
return FALSE;
}
return TRUE;
}
/* fileaccess that writes to a file
*/
BOOL CheckWriteAccess(fileentry_t *file, SIPTR *error, globaldata *g)
{
if (!CheckChangeAccess(file, error, g))
return FALSE;
if (file->le.info.file.direntry->protection & FIBF_WRITE)
{
*error = ERROR_WRITE_PROTECTED;
return FALSE;
}
return TRUE;
}
/* fileaccess that reads from a file
*/
BOOL CheckReadAccess(fileentry_t *file, SIPTR *error, globaldata *g)
{
*error = 0;
/* Test on read-protection, type and volume */
#if DELDIR
if (!IsDelFile(file->le.info))
{
#endif
if (!IsFile(file->le.info))
{
*error = ERROR_OBJECT_WRONG_TYPE;
return FALSE;
}
if (file->le.info.file.direntry->protection & FIBF_READ)
{
*error = ERROR_READ_PROTECTED;
return FALSE;
}
#if DELDIR
}
#endif
if (!CheckVolume(file->le.volume, 0, error, g))
return FALSE;
return TRUE;
}
/* check on operate access (like Seek)
*/
BOOL CheckOperateFile(fileentry_t *file, SIPTR *error, globaldata *g)
{
*error = 0;
/* test on type */
#if DELDIR
if (!IsDelFile(file->le.info) && !IsFile(file->le.info))
#else
if (!IsFile(file->le.info))
#endif
{
*error = ERROR_OBJECT_WRONG_TYPE;
return FALSE;
}
/* volume must be or become currentvolume */
if (!CheckVolume(file->le.volume, 0, error, g))
return FALSE;
return TRUE;
}