Merge 1.8.0~pre4 packaging into master
[pkg-k5-afs_openafs.git] / src / afsd / afs_rtsymtab.pl.sgi_53
blob30fe40c4fe1de441d1f9a7613b153b5a1cc78c67
1 #!/bin/perl
2 # Copyright 2000, International Business Machines Corporation and others.
3 # All Rights Reserved.
4 #
5 # This software has been released under the terms of the IBM Public
6 # License. For details, see the LICENSE file in the top-level source
7 # directory or online at http://www.openafs.org/dl/license10.html
9 # afs_rtsymtab.pl (For IRIX 5.3 only)
10 # This script modifies /var/sysgen/master.d/rtsymtab file so that
11 # AFS kernel extentions can be dynamically loaded using /sbin/ml.
12 # The original version of rtsymtab is saved as
13 # /var/sysgen/master.d/rtsymtab.orig. This script must be run only
14 # once on each SGI IRIX 5.3 machine that is to be an AFS 3.4 client.
16 # Usage: afs_rtsymtab.pl -run [-force] [-help]
21 @scriptnameparts = split('/', $0);
22 $scriptname = pop @scriptnameparts;
24 $FILE = "/var/sysgen/master.d/rtsymtab";
25 $LOG = "/tmp/$scriptname.log";
28 # This script must be run by the superuser
30 die ("\n$scriptname: Sorry, this script must be run by root.\n\n")
31 if ($< != 0);
33 $USAGE="\nUsage: $scriptname -run [-force] [-help]
35 This script modifies $FILE in IRIX 5.3 so that
36 AFS 3.4 kernel extentions may be dynamically loaded using
37 /sbin/ml. A copy of $FILE is saved
38 as $FILE.orig before it is changed.
39 You will need to run this script only once after you install
40 AFS 3.4 on your clients.
42 This script will exit if it determines that
43 $FILE has already been modifed for AFS.
44 If this is incorrect, run this script again with the
45 -force flag.\n\n";
48 # Parse command line
50 $run = $force = 0;
51 for $_ (@ARGV) {
52 if (/-run/) {
53 $run = 1;
54 } elsif (/-force/) {
55 $force = 1;
56 } else {
57 die $USAGE
60 die $USAGE if (! $run);
63 # The following extern definitions are required by AFS and
64 # must be added to $FILE
65 # These headers are part of the mimimal OS configuration. They should always
66 # be present on the system.
68 $ExternHeaders =
69 "#include <sys/vnode.h>
70 #include <sys/file.h>
71 #include <netinet/in.h>
72 #include <netinet/ip_var.h>
73 #include <sys/fs_subr.h>
74 #include <sys/sema.h>";
76 $ExternDefns =
77 "extern time(), remapf(), exit(), iget(), iput(), efs_ialloc(),
78 iunlock(), estgroups(), setgroups(), setgroupsp(), afs_vfsopsp(),
79 afs_vnodeopsp(), afsidestroyp(), afsdptoipp(), afsiptodpp(),
80 hostintable(), idbg_prafsnodep(), idbg_afsvfslistp(), idbg_addfunc(),
81 qprintf(), checkauth(), __ll_rem(), exported_lock(), rfsdisptab_v3(),
82 vattr_to_wcc_data(), vattr_to_wcc_attr(), vattr_to_fattr3(),
83 puterrno3(), makefh3(), xdr_string(), xdr_u_long(), xdr_char(),
84 xdr_long(), xdr_short(), xdr_bytes(), xdr_opaque(), xdr_u_short(),
85 xdr_u_int(), xdr_int(), xdr_array(), vsync(),
86 assfail(), doass(), in_cksum(), convoff(), debug(), copyinstr(),
87 stime(), sysent(), syscallsw() ;";
89 # For each member of @NewSymtabEntries, an entry of the following type must be
90 # added (if one does not exist) to the rtsymtab[] array.
92 # {(long) &time, "time"}, /* DDI/DKI */
94 @NewSymtabEntries = (
95 "time",
96 "vmonitor",
97 "pmonitor",
98 "rmonitor",
99 "amonitor",
100 "spunlock_psema",
101 "spunlockspl_psema",
102 "vn_rele",
103 "vn_hold",
104 "vn_rdwr",
105 "vn_initlist",
106 "ptossvp",
107 "cleanlocks",
108 "crget",
109 "crdup",
110 "crhold",
111 "crfree",
112 "remapf",
113 "lookupname",
114 "exit",
115 "sys_cred",
116 "vfs_devsearch",
117 "iget",
118 "iput",
119 "efs_ialloc",
120 "falloc",
121 "iunlock",
122 "fready",
123 "vrelvm",
124 "settime",
125 "wtodc",
126 "socreate",
127 "soreserve",
128 "sobind",
129 "soclose",
130 "xdr_string",
131 "xdr_u_long",
132 "xdr_char",
133 "xdr_long",
134 "xdr_short",
135 "xdr_bytes",
136 "xdr_opaque",
137 "xdr_u_short",
138 "xdr_u_int",
139 "xdr_int",
140 "xdr_array",
141 "inetdomain",
142 "udpcksum",
143 "ifcksum",
144 "ip_stripoptions",
145 "in_cksum",
146 "stime",
147 "sysent",
148 "syscallsw",
149 "estgroups",
150 "setgroups",
151 "setgroupsp",
152 "afs_vfsopsp",
153 "afs_vnodeopsp",
154 "afsidestroyp",
155 "afsdptoipp",
156 "afsiptodpp",
157 "idbg_prafsnodep",
158 "idbg_afsvfslistp",
159 "idbg_addfunc",
160 "initmonitor",
161 "pflushinvalvp",
162 "pflushvp",
163 "pdflush",
164 "ngroups_max",
165 "pinvalfree",
166 "fs_setfl",
167 "fs_cmp",
168 "fs_nosys",
169 "fs_poll",
170 "fs_pathconf",
171 "fs_frlock",
172 "convoff",
173 "__ll_rem",
174 "chunkread",
175 "getchunk",
176 "debug",
177 "bp_mapin",
178 "bawrite",
179 "bwrite",
180 "fs_map_subr",
181 "cpsema",
182 "qprintf",
183 "copyinstr",
184 "checkauth",
185 "imon_event",
186 "imon_enabled",
187 "exported_lock",
188 "rfsdisptab_v3",
189 "getvfs",
190 "mrunlock",
191 "vattr_to_wcc_data",
192 "vattr_to_wcc_attr",
193 "vattr_to_fattr3",
194 "hostintable",
195 "puterrno3",
196 "makefh3",
197 "vsync"
201 # Check that /var/sysgen/master.d/rtsymtab exists and does not contain
202 # AFS symbols
205 die ("\n\tError: Cannot find $FILE\n" .
206 "\tCheck your Operating System installation documentation.\n")
207 if (! -f $FILE);
208 if (! $force && ! system("/bin/grep afs_vnodeops $FILE > /dev/null")) {
209 die ("\n\tError: It looks like $FILE has already been
210 modified for dynamically loading AFS. If this is incorrect, run
211 this script again with the -force flag\n\n");
215 # Read all the symbols in the rtsymtab[] table from $FILE
216 # and mark them in an associative array indexed by the symbol name.
219 open(SYMTAB, "<$FILE") || die("\nError: failed to open $FILE: $!\n");
220 $found = 0;
221 while (<SYMTAB>) { # Skip ahead to rtsymtab definition
222 last if /rtsymtab\[\]/;
224 while (<SYMTAB>) { # Extract the name of each symbol
225 if (/{.*,.*"(.*)"}/) {
226 $OldSymtabEntries{$1} = 1;
227 $found++;
231 # Make sure that the above loop worked!
233 die("Error: Could not locate the rtsymtab\[\] table in $FILE\n\n")
234 if (! $found);
236 close(SYMTAB);
240 # Check if any of the new symbols that we need to add exist in the rtsymtab
241 # table. Keep track of all symbols that we delete from NewSymtabEntries.
244 $offset=0;
245 for $var (@NewSymtabEntries) {
246 if ($OldSymtabEntries{$var}) {
247 $del = splice(@NewSymtabEntries,$offset,1);
248 push(@DelSymtabEntries, $del);
249 #print "debug: $var exists\n";
251 $offset++;
255 # Create the new rtsymtab file.
256 # Place the new extern definitions just before the rtsymtab[] table
257 # definition. Append new entries to the rtsymtab table to the end
258 # of the file.
261 open(NEWSYMTAB, ">$FILE.new") || die("Error: Could not open $File.new: $!\n");
262 open(OLDSYMTAB, "<$FILE") || die("Error: Could not open $FILE: $!\n");
264 print "Creating $FILE.new\n";
266 while (<OLDSYMTAB>) {
267 if (/rtsymtab\[\] = {/) {
268 print NEWSYMTAB "\n /*\n * The following extern definitions";
269 print NEWSYMTAB " are required by AFS\n */\n";
270 print NEWSYMTAB "$ExternHeaders\n\n";
271 print NEWSYMTAB "$ExternDefns\n\n";
272 print NEWSYMTAB "#define DEBUG 1 /* Required by AFS */\n\n";
273 print NEWSYMTAB $_;
274 } else {
275 print NEWSYMTAB $_;
280 # Append the new rtsymtab[] entries to the end of the file
283 print NEWSYMTAB "\t/*\n\t * The following symbols are required by AFS\n";
284 print NEWSYMTAB "\t */\n\n";
286 foreach $var (@NewSymtabEntries) {
287 printf(NEWSYMTAB "\t {(long) &%s,%15s},\t\t%s\n",
288 $var, "\"$var\"", "/* DDI/DDK */");
291 close(NEWSYMTAB);
292 close(OLDSYMTAB);
295 # Replace $FILE with $FILE.new
297 #print "NOT renaming files!\n";
299 die ("Error: Could not move $FILE to $FILE.orig: $!\n")
300 if (! rename($FILE, "$FILE.orig"));
301 print "Moved $FILE to $FILE.orig\n";
302 die ("Error: Could not move $FILE.new to $FILE: $!\n")
303 if (! rename("$FILE.new", $FILE));
304 print "Moved $FILE.new to $FILE\n";
308 # List rtsymtab[] entries that were not added to the new file.
311 if ($#DelSymtabEntries >= 0) {
313 open(LOGFILE,">$LOG") || die("Error: Could not open $LOG: $!");
315 print LOGFILE "\n\n\tThe following entries were already defined
316 in the rtsymtab\[\] table in $FILE.
317 View $FILE and verify the correctness of these entries.
318 Make sure that these entries are correctly defined for this
319 machine. \n\n";
321 for $var (@DelSymtabEntries) {
322 printf(LOGFILE "\t {(long) &%s,%15s},\t\t%s\n",
323 $var, "\"$var\"", "/* DDI/DDK */");
325 print LOGFILE "\n\tNOTE: This message has been saved in $LOG\n";
326 close(LOGFILE);
327 system("/bin/cat $LOG");
330 print "\n$scriptname Done. $FILE has been modified to allow
331 AFS 3.4 kernel extentions to be dynamically loaded using /sbin/ml.\n\n";