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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <knet.h>
include <syserr.h>
include <error.h>
include <config.h>
include <fio.h>
# DELETE -- Delete a single physical file. It is an error if the file does
# not exist, is protected, or if the file simply cannot be deleted. DELETEFG
# should be called if deletion of subfiles or multiple versions is desired.
# Interrupts are disabled while the VFN database is open to protect the
# database, ensure that that the lock on the mapping file is cleared, and to
# ensure that the mapping file is closed.
procedure delete (fname)
char fname[ARB] # file to be deleted
int status
bool nosuchfile
pointer vp, sp, osfn
int vfndel()
bool fnullfile()
pointer vfnopen()
define abort_ 91
define close_ 92
begin
# The null file "dev$null" is a special case; ignore attempts to
# delete this file.
if (fnullfile (fname))
return
call smark (sp)
call salloc (osfn, SZ_PATHNAME, TY_CHAR)
call intr_disable()
iferr (vp = vfnopen (fname, VFN_WRITE))
goto abort_
# Delete the VFN and determine if the file actually exists.
nosuchfile = false
iferr (status = vfndel (vp, Memc[osfn], SZ_PATHNAME))
goto close_
if (status == ERR)
nosuchfile = true
else {
call zfacss (Memc[osfn], 0, 0, status)
if (status == NO) {
# If the file is a symlink pointing to a non-existent file,
# we'll delete the link below.
call zfacss (Memc[osfn], 0, SYMLINK_FILE, status)
if (status == YES)
nosuchfile = false
else
nosuchfile = true
}
}
# It is an error to try to delete a nonexistent file.
if (nosuchfile) {
iferr (call filerr (fname, SYS_FDELNXF))
goto close_
}
# Is the file protected?
call zfprot (Memc[osfn], QUERY_PROTECTION, status)
if (status == YES) {
iferr (call filerr (fname, SYS_FDELPROTFIL))
goto close_
} else {
# Try to delete the file. If the delete operation succeeds but
# the file still exists, an older version has surfaced and the
# VFN must not be deleted from the file table.
call zfdele (Memc[osfn], status)
if (status == ERR) {
iferr (call filerr (fname, SYS_FDELETE))
goto close_
} else {
call zfacss (Memc[osfn], 0, 0, status)
if (status == YES) {
iferr (call vfnclose (vp, VFN_NOUPDATE))
goto abort_
} else {
iferr (call vfnclose (vp, VFN_UPDATE))
goto abort_
}
}
}
call sfree (sp)
call intr_enable()
return
# Error recovery nasties.
close_
iferr (call vfnclose (vp, VFN_NOUPDATE))
;
abort_
call intr_enable()
call sfree (sp)
call erract (EA_ERROR)
end
|