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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <syserr.h>
include "mtio.h"
# MT_GTYOPEN -- Given a logical device name, open the tapecap file and extract
# the entry for the named device into an open GTY descriptor. The descriptor
# pointer is returned as the function value. The last entry accessed is
# cached indefinitely so that repeated references cause the tapecap file to
# be scanned only once.
#
# The tapecap file may be defined in the user environment, otherwise it
# defaults to the compiled in default TAPECAP (dev$tapecap). The format
# of the "tapecap" environment variable is "filename[:devcap]", e.g.
#
# home$tapecap:so
#
#
# would cause the file home$tapecap to be used as the tapecap file, adding the
# device capabilities :so to each tapecap device access (any devcap fields
# given on the command line will override these). Either the filename or
# devcap field may be omitted. For example, reset tapecap = ":so" causes
# the default tapecap file dev$tapecap to be used, but enables status output
# logging in each magtape access.
pointer procedure mt_gtyopen (device, ufields)
char device[ARB] #I local device name (incl node)
char ufields[ARB] #I optional user tapecap fields
int len_ufields, junk
char c_device[SZ_DEVICE]
char c_ufields[SZ_DEVCAP]
bool first_time, capseen, remote
pointer c_gty, gty, sp, tapecap, devcap, ip, op
pointer fname, dname, nname, tname
bool streq()
pointer gtyopen()
int envfind(), stridxs(), strlen(), gstrcpy(), ki_gnode()
errchk gtyopen, syserrs
data first_time /true/
begin
# First time initialization.
if (first_time) {
c_gty = NULL
first_time = false
}
# Check the cache.
if (c_gty != NULL && streq(device,c_device) && streq(ufields,c_ufields))
return (c_gty)
# Cache miss. Free the old descriptor.
if (c_gty != NULL)
call gtyclose (c_gty)
call smark (sp)
call salloc (tapecap, SZ_DEVCAP, TY_CHAR)
call salloc (devcap, SZ_DEVCAP, TY_CHAR)
call salloc (fname, SZ_PATHNAME, TY_CHAR)
call salloc (tname, SZ_PATHNAME, TY_CHAR)
call salloc (dname, SZ_FNAME, TY_CHAR)
call salloc (nname, SZ_FNAME, TY_CHAR)
# Get tapecap definition.
if (envfind ("tapecap", Memc[tapecap], SZ_DEVCAP) <= 0)
call strcpy (TAPECAP, Memc[tapecap], SZ_DEVCAP)
# Parse into filename and devcap fields.
op = fname
capseen = false
len_ufields = gstrcpy (ufields, Memc[devcap], SZ_DEVCAP)
for (ip=tapecap; Memc[ip] != EOS; ip=ip+1) {
if (Memc[ip] == ':' && !capseen) {
Memc[op] = EOS
op = devcap + len_ufields
capseen = true
}
Memc[op] = Memc[ip]
op = op + 1
}
Memc[op] = EOS
# Supply default filename if none given.
if (Memc[fname] == EOS)
call strcpy (TAPECAP, Memc[fname], SZ_PATHNAME)
# If no node is specified for the tapecap file, access the tapecap
# file on the same node as the magtape device file.
if (stridxs ("!", Memc[fname]) <= 0)
call ki_xnode (device, Memc[fname], SZ_PATHNAME)
# Get the node name the device is on.
remote = (ki_gnode (Memc[fname], Memc[nname], junk) != 0)
# Get the tapecap device name minus any node prefix.
call strcpy (device, Memc[dname], SZ_FNAME)
call ki_xnode ("", Memc[dname], SZ_FNAME)
# Open the tapecap entry. Try "tapecap.<node>" first then "tapecap".
# <node> is the hostname of the host the tape device is on, i.e. the
# network server on which the drive is located. The "tapecap.<node>"
# feature allows a shared common IRAF installation to support distinct
# tapecap files for different servers, falling back on the standard
# tapecap file if no node-specific file is found.
call strcpy (Memc[fname], Memc[tname], SZ_PATHNAME)
call strcat (".", Memc[tname], SZ_PATHNAME)
call strcat (Memc[nname], Memc[tname], SZ_PATHNAME)
iferr (gty = gtyopen (Memc[tname], Memc[dname], Memc[devcap]))
iferr (gty = gtyopen (Memc[fname], Memc[dname], Memc[devcap]))
call syserrs (SYS_MTTAPECAP, device)
if (gty == NULL)
call syserrs (SYS_MTTAPECAP, device)
# Update the cache.
if (strlen(ufields) <= SZ_DEVCAP) {
call strcpy (device, c_device, SZ_DEVICE)
call strcpy (Memc[devcap], c_ufields, SZ_DEVCAP)
c_gty = gty
}
call sfree (sp)
return (gty)
end
|