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 <finfo.h>
include <xalloc.h>
include "mtio.h"
# MTCLEAN -- Clean the lock file area. This routine is called periodically
# by the system (e.g. during CL startup) to scan the lock file area and
# deleted old lock files. This prevents old lock files which are no longer
# valid from erroneously being used to indicate the current tape position.
#
# What mtclean does is similar to "delete tmp$mt*.lok" except that, since all
# users store lok files in the same area, we don't want to delete all the
# files indiscriminately. The default action is to delete only files for
# unallocated devices, or for devices allocated to the current user for which
# the lok file is more than STALE seconds old. It is harmless to delete a
# lok file unnecessarily in that MTIO will recover automatically, but doing
# so will force the tape to be rewound to regain a known position.
procedure mtclean (level, stale, out)
int level #I 0 for default; 1 to delete all .lok files
int stale #I delete lok file if older than stale seconds
int out #I if nonzero, print messages to this file
int fd, status
pointer list, ip, cp, device
pointer sp, fname, owner, template, lbuf
long fi[LEN_FINFO]
pointer fntopn()
long clktime()
int gstrmatch(), xdevowner()
int open(), getline(), finfo(), fntgfn()
define del_ 91
begin
call smark (sp)
call salloc (lbuf, SZ_LINE, TY_CHAR)
call salloc (fname, SZ_FNAME, TY_CHAR)
call salloc (owner, SZ_FNAME, TY_CHAR)
call salloc (template, SZ_FNAME, TY_CHAR)
# Get file name template matching all lock files.
call sprintf (Memc[template], SZ_FNAME, "%s%s*%s")
call pargstr (LOCKLDIR)
call pargstr (LOCKFILE)
call pargstr (LOCKEXTN)
# Open a file list.
list = fntopn (Memc[template])
# Examine each file in turn and delete if delete criteria satisfied.
while (fntgfn (list, Memc[fname], SZ_FNAME) != EOF) {
# If level is nonzero (force-delete) delete unconditionally.
if (level != 0)
goto del_
# Open lok file and get device name.
iferr (fd = open (Memc[fname], READ_ONLY, TEXT_FILE))
next
if (getline (fd, Memc[lbuf]) == EOF) {
call close (fd)
goto del_
}
if (gstrmatch (Memc[lbuf], "unit ", status, ip) <= 0) {
call close (fd)
goto del_
}
device = lbuf + ip
for (cp=device; Memc[cp] != EOS && Memc[cp] != ' '; cp=cp+1)
;
Memc[cp] = EOS
call close (fd)
# Determine if the device is currently allocated. If the device
# is not allocated delete the lok file unconditionally. If the
# device is allocated to someone else leave the lok file alone.
# If the lok file is allocated to the current user delete it if
# the file is older than the stale value.
status = xdevowner (Memc[device], Memc[owner], SZ_FNAME)
switch (status) {
case DV_DEVFREE:
goto del_
case DV_DEVINUSE:
# Do nothing.
case DV_DEVALLOC:
# Delete the file if older than the stale value.
if (finfo (Memc[fname], fi) == ERR)
goto del_
if (clktime(FI_MTIME(fi)) > stale) {
# Delete the file.
del_ if (out != NULL) {
call fprintf (out, "delete lok file %s\n")
call pargstr (Memc[fname])
}
iferr (call delete (Memc[fname]))
;
}
}
}
call fntcls (list)
call sfree (sp)
end
|