COMPILATION LISTING OF SEGMENT upd_install_task_ Compiled by: Multics PL/I Compiler, Release 30, of February 16, 1988 Compiled at: Honeywell Bull, Phoenix AZ, SysM Compiled on: 10/06/88 1301.3 mst Thu Options: optimize map 1 /****^ *********************************************************** 2* * * 3* * Copyright, (C) Honeywell Bull Inc., 1988 * 4* * * 5* * Copyright, (C) Honeywell Information Systems Inc., 1982 * 6* * * 7* * Copyright (c) 1972 by Massachusetts Institute of * 8* * Technology and Honeywell Information Systems, Inc. * 9* * * 10* *********************************************************** */ 11 12 13 14 15 /****^ HISTORY COMMENTS: 16* 1) change(88-09-16,GDixon), approve(88-09-20,MCR8009), 17* audit(88-09-22,Brunelle), install(88-10-06,MR12.2-1138): 18* A) Changed update_seg to avoid reference through unset pointer for 19* update_seg delete operation. 20* END HISTORY COMMENTS */ 21 22 23 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 24 /* */ 25 /* N__a_m_e: upd_install_task_ */ 26 /* */ 27 /* This procedure is the lowest-level task translator for the Multics Online Updater.*/ 28 /* Its input is a single-segment installation request, and its output is a sequence of */ 29 /* primitive subtasks which perform the installation. */ 30 /* */ 31 /* U__s_a_g_e */ 32 /* */ 33 /* dcl upd_install_task_ entry (bit(36) aligned, ptr, ptr, fixed bin(35), fixed bin, */ 34 /* ptr, fixed bin, (3) char(168), (3) char(32), (3) fixed bin(5), (3) ptr, */ 35 /* (3) fixed bin, (3) ptr, (3) fixed bin, bit(36) aligned, ptr, fixed bin(18), */ 36 /* bit(1), char(168) aligned, fixed bin(35), fixed bin(35)); */ 37 /* */ 38 /* call upd_install_task_ (ctlw, areap, parentp, acode, asev, taskp, seqno, */ 39 /* dir, seg, rb, ap, an, np, nn, options, max_length, full_recovery, log_dir, */ 40 /* installation_date, de_installation_date); */ 41 /* */ 42 /* 1) ctlw a Multics Online Updater task control word.(In) */ 43 /* 2) areap ptr to a caller-supplied area.(In) */ 44 /* 3) parentp ptr to the caller's argument list. It may be a null ptr.(In) */ 45 /* 4) acode 0.(In) */ 46 /* a status code.(Out) */ 47 /* 5) asev 0.(In) */ 48 /* a severity number.(Out) */ 49 /* 6) taskp a null ptr.(In) */ 50 /* ptr to the task control block for this call.(Out) */ 51 /* 7) seqno a Multics Online Updater task sequence number.(In) */ 52 /* 8) dir (3) new, old, and target segment directory names.(In) */ 53 /* 9) seg (3) new, old, and target segment entry names.(In) */ 54 /* 10) rb (3) ring brackets for target segment.(In) */ 55 /* 11) ap (3) replace, delete, and add ACL array ptrs.(In) */ 56 /* 12) an (3) replace, delete, and add ACL array entry dimensions.(In) */ 57 /* 13) np (3) replace, delete, and add name list ptrs.(In) */ 58 /* 14) nn (3) replace, delete, and add name list dimensions.(In) */ 59 /* 15) options option bits: */ 60 /* bit 1 on if the names of an archive's components are to be added to the */ 61 /* archive itself. */ 62 /* bit 2 on if names are to be copied from the "old" segment to the "target". */ 63 /* bit 3 on if a "special" segment is being installed. */ 64 /* bit 4 on if installation is to be recorded in a log. */ 65 /* bit 5 on if information gathering to be deferred until "run" time. */ 66 /* bit 6 on if max length setting has been explicitly specified. */ 67 /* 16) temp a null ptr.(In) */ 68 /* ptr to the information structure allocated by upd_install_task_.(Out) */ 69 /* 17) max_length the value for the maximum length attribute of added or replaced */ 70 /* segments. */ 71 /* 18) full_recovery */ 72 /* on if the "special" target segments can be deleted when the */ 73 /* ctlw says to run in "de_install" mode. */ 74 /* 19) log_dir */ 75 /* if bit 4 of "options" is "on", then this argument is the documentation*/ 76 /* directory where the description of the installation is to be recorded.*/ 77 /* 20) installation_date */ 78 /* a Multics Storage System value for the date and time at which the */ 79 /* installation of the modification was performed. */ 80 /* If this is zero, then the installation is being performed now. (In) */ 81 /* 21) de_installation_date */ 82 /* a Multics Storage System value for the date and time at which any */ 83 /* de-installation of the modification is performed. If this is zero on */ 84 /* input, then the de-installation is being performed now.(In) */ 85 /* */ 86 /* N__o_t_e_s */ 87 /* */ 88 /* The type of installation operation to be performed (replace, add, move, or delete)*/ 89 /* is determined from the directory array, as follows: */ 90 /* */ 91 /* dir(1)>seg(1) the path name of the "new" segment to be installed. */ 92 /* dir(2)>seg(2) the path name of the "old" segment to be deleted. */ 93 /* dir(3)>seg(3) the path name of the "target" segment which is the result */ 94 /* of the installation. */ 95 /* */ 96 /* The following combinations of path names invoke recognized installation operations: */ 97 /* */ 98 /* dir(1)>seg(1), dir(2)>seg(2), dir(3)>seg(3) Replace operation */ 99 /* dir(1)>seg(1), "" , dir(3)>seg(3) Add operation */ 100 /* "" , dir(2)>seg(2), dir(3)>seg(3) Move operation */ 101 /* "" , dir(2)>seg(2), "" Delete operation */ 102 /* */ 103 /* Any other combination of pathnames is considered invalid, and triggers a */ 104 /* severity 4 error in the Multics Online Updater error handler. */ 105 /* */ 106 /* If a target segment is to be installed, and an old segment is to be deleted */ 107 /* (as in a replace or move operation), special action is taken if ap(1) (ptr to */ 108 /* the replacement ACL array) and/or np(1) (ptr to the replacement name list) are null. */ 109 /* If ap(1) = null, then the ACL from the "old" segment is copied onto the "target" */ 110 /* segment. If np(1) = null, then for a move operation, the names of the "old" segment */ 111 /* are placed on the "target" segment; and for a replace operation, the names of the */ 112 /* "new" segment are placed on the "target" segment, if option bit 2 is off; */ 113 /* the names of the "old" segment are placed on the "target" segment, if option bit 2 is */ 114 /* on. Also, if a target segment is to be installed, and an old segment is to be deleted */ 115 /* (as in a replace or move operation), special action is taken if rb(1) (first ring */ 116 /* bracket for the target segment) is zero. The rings will be listed on the old segment */ 117 /* and be placed on the target segment. Otherwise, the caller is responsible for filling */ 118 /* in the ring bracket array (rb(1), rb(2), rb(3)), for the target segment. */ 119 /* */ 120 /* If option bit 1 is on, then: for a replace operation, if the "new" */ 121 /* segment is an archive, the names of its components are added to the "target" segment; */ 122 /* for an add operation, if the "new" segment is an archive, the names of its components */ 123 /* are added to the "target" segment; for a move operation, if the "old" segment */ 124 /* is an archive, the names of its components are added to the "target" segment. */ 125 /* */ 126 /* If option bit 3 is on, then the "target" segment is said to be a "special" */ 127 /* segment, which is accorded the following special attention: */ 128 /* */ 129 /* 1) "special" segments are installed last, after all other segments. */ 130 /* 2) "special" segments are not deleted, and their ACL's are left intact, when */ 131 /* upd_install_task_ is invoked in "de_install" mode (via the ctlw) after having been */ 132 /* invoked in "install" mode, if (and only if) the full_recovery switch */ 133 /* is off. If it is not off, then "special" segments are deleted as a part of */ 134 /* "de_install" mode processing. */ 135 /* */ 136 /* If option bit 5 is on, the the new and old segment unique ids, the names on */ 137 /* the new and old segments, the ACL on the old segment, and the names of new segment */ 138 /* archive components are not gathered until upd_install_task_ is executed in "run" mode. */ 139 /* Otherwise, these things are gathered the first time upd_install_task_ is executed in */ 140 /* any mode. */ 141 /* */ 142 /* If option bit 6 is off, then the max length attribute of the "target" segment */ 143 /* will acquire a default value. If the "target" segment is a "special segment", then */ 144 /* the max length attribute will be set to the segments current length. Otherwise, the */ 145 /* max length will default to sys_info$default_max_length. If option bit 6 is on, then */ 146 /* the max length will assume the value of the max_length argument passed by the caller. */ 147 /* */ 148 /* N__a_m_e: upd_install_task_$init */ 149 /* */ 150 /* This procedure is invoked only once during the installation of a modification, */ 151 /* (a group of related segments that are to be installed at the same time). Its output */ 152 /* is a sequence of primitive subtasks which type messages to the installer informing */ 153 /* him or her of the progress of the installation. */ 154 /* */ 155 /* U__s_a_g_e */ 156 /* */ 157 /* dcl upd_install_task_$init entry (bit(36) aligned, ptr, ptr, fixed bin(35), */ 158 /* fixed bin, ptr, fixed bin, bit(1), bit(1), ptr); */ 159 /* */ 160 /* call upd_install_task_$init (ctlw, areap, parentp, acode, asev, taskp, seqno, */ 161 /* special_segs, full_recovery, temp); */ 162 /* */ 163 /* 1) - 7) are as above. */ 164 /* 8) special_segs */ 165 /* on if "special" segs are being installed as part of the */ 166 /* modification.(In) */ 167 /* 9) full_recovery */ 168 /* is as above.(In) */ 169 /* 10) temp a null ptr.(In) */ 170 /* ptr to the information structure allocated by upd_install_task_$init */ 171 /* for its own use.(Out) */ 172 /* */ 173 /* S__t_a_t_u_s */ 174 /* */ 175 /* 1) Created: May, 1972 by P. R. Bos */ 176 /* 2) Modified: Dec, 1972 by G. C. Dixon - upd_install_task_$init, "special" segments, */ 177 /* full_recovery added; improved error recovery */ 178 /* message information values passed to subtasks. */ 179 /* 3) Modified: Dec, 1972 by G. C. Dixon - "deferred gathering" option added */ 180 /* 4) Modified: May, 1973 by P.B. Kelley - added upd_ring_task_ to task list to perform */ 181 /* all ring bracket tasks. */ 182 /* 5) Modified: Nov, 1974 by P.B. Kelley - added option 6 to incorporate max length */ 183 /* attribute setting. */ 184 /* 6) Modified: Mar, 1981 by E. N. Kittlitz - added get_entry_bound entry, support */ 185 /* for setting EB in copy task. */ 186 /* */ 187 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 188 189 /* */ 190 /* * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * */ 191 192 193 upd_install_task_: procedure (ctlw, areap, parentp, acode, asev, taskp, seqno, 194 dir, seg, rb, ap, an, np, nn, options, temp, max_length, 195 full_recovery_sw, log_dir, in_date, de_in_date) 196 options ( rename ((alloc_, smart_alloc_ )) ); 197 198 199 dcl ctlw bit(36) aligned, /* control word */ 200 areap ptr, /* pointer to user area */ 201 parentp ptr, /* pointer to parent task */ 202 acode fixed bin(35), /* returned status code */ 203 asev fixed bin, /* severity code to match */ 204 taskp ptr, /* pointer to task for this call */ 205 seqno fixed bin, /* task seqno for this call */ 206 dir (3) char(168), /* dirname array (upd, old, target) */ 207 seg (3) char(32), /* entryname array */ 208 rb (3) fixed bin(5), /* ring brackets for target seg */ 209 ap (3) ptr, /* acl pointer array (replace, delete, add) */ 210 an (3) fixed bin, /* corresponding acl sizes */ 211 np (3) ptr, /* name list pointer array */ 212 nn (3) fixed bin, /* name list sizes */ 213 options bit(36) aligned, /* name options */ 214 temp ptr, /* pointer to "t" or "it" structure (initially null) */ 215 max_length fixed bin(18), /* max seg length attribute */ 216 full_recovery_sw bit(1), /* on if segs can be deleted in "de_install" */ 217 special_segs_sw bit(1), /* on if special segments are being installed. */ 218 log_dir char(168) aligned, /* documentation directory */ 219 ioseg char(32) aligned, /* name of current io seg */ 220 in_date fixed bin(35), /* 0, or file system value for date of installation */ 221 de_in_date fixed bin(35); /* 0, or value for date of any de_installation */ 222 223 dcl (addr, fixed, index, length, mod, null, substr) 224 builtin; 225 226 dcl cu_$arg_list_ptr entry (ptr), 227 ioa_$ioa_stream entry options (variable), 228 upd_print_acl_ entry (ptr, fixed bin, bit(*)), 229 unique_chars_ entry (bit(*)) returns (char(15)), 230 upd_add_task_ entry (char(*), ptr), 231 upd_print_err_ entry options (variable), 232 upd_print_names_ entry (ptr, fixed bin, bit(*)), 233 upd_task_err_ entry options (variable); 234 235 dcl upd_acl_task_$add entry (bit(36) aligned, ptr, ptr, fixed bin(35), fixed bin, ptr, fixed bin, 236 char(168), char(32), char(32), bit(36) aligned, ptr, fixed bin), 237 upd_acl_task_$delete entry (bit(36) aligned, ptr, ptr, fixed bin(35), fixed bin, ptr, fixed bin, 238 char(168), char(32), char(32), bit(36) aligned, ptr, fixed bin), 239 upd_acl_task_$list entry (bit(36) aligned, ptr, ptr, fixed bin(35), fixed bin, ptr, fixed bin, 240 char(168), char(32), char(32), bit(36) aligned, ptr, fixed bin), 241 upd_acl_task_$list_inacl entry (bit(36) aligned, ptr, ptr, fixed bin(35), fixed bin, ptr, fixed bin, 242 char(168), char(32), char(32), bit(36) aligned, ptr, fixed bin, (3) fixed bin(5)), 243 upd_acl_task_$replace entry (bit(36) aligned, ptr, ptr, fixed bin(35), fixed bin, ptr, fixed bin, 244 char(168), char(32), char(32), bit(36) aligned, ptr, fixed bin, bit(1)), 245 upd_copy_seg_task_ entry (bit(36) aligned, ptr, ptr, fixed bin(35), fixed bin, ptr, fixed bin, 246 char(168), char(32), char(32), bit(36) aligned, 247 char(168), char(32), char(32), bit(36) aligned, fixed bin(18), fixed bin (14), bit(1)), 248 upd_doc_task_$get_tree entry (bit(36) aligned, ptr, ptr, fixed bin(35), fixed bin, ptr, fixed bin, 249 (3) char(168), (3) char(32), (3) bit(36) aligned, ptr), 250 upd_doc_task_$write_tree entry (bit(36) aligned, ptr, ptr, fixed bin(35), fixed bin, ptr, fixed bin, 251 ptr, fixed bin(35), fixed bin(35), char(168) aligned, bit(1) aligned), 252 upd_message_task_ entry (bit(36) aligned, ptr, ptr, fixed bin(35), fixed bin, ptr, fixed bin, 253 bit(1), bit(1), bit(1) aligned, ptr, fixed bin, ptr, fixed bin), 254 upd_name_task_$add entry (bit(36) aligned, ptr, ptr, fixed bin(35), fixed bin, ptr, fixed bin, 255 char(168), char(32), char(32), bit(36) aligned, ptr, fixed bin), 256 upd_name_task_$delete entry (bit(36) aligned, ptr, ptr, fixed bin(35), fixed bin, ptr, fixed bin, 257 char(168), char(32), char(32), bit(36) aligned, ptr, fixed bin), 258 upd_name_task_$free entry (bit(36) aligned, ptr, ptr, fixed bin(35), fixed bin, ptr, fixed bin, 259 char(168), char(32), char(32), bit(36) aligned, ptr, fixed bin), 260 upd_name_task_$list entry (bit(36) aligned, ptr, ptr, fixed bin(35), fixed bin, ptr, fixed bin, 261 char(168), char(32), char(32), bit(36) aligned, ptr, fixed bin), 262 upd_name_task_$list_archive entry (bit(36) aligned, ptr, ptr, fixed bin(35), fixed bin, ptr, fixed bin, 263 char(168), char(32), char(32), bit(36) aligned, ptr, fixed bin), 264 upd_ring_task_$list entry (bit(36) aligned, ptr, ptr, fixed bin(35), fixed bin, ptr, fixed bin, 265 char(168), char(32), char(32), bit(36) aligned, (3) fixed bin(5)), 266 upd_ring_task_$set entry (bit(36) aligned, ptr, ptr, fixed bin(35), fixed bin, ptr, fixed bin, 267 char(168), char(32), char(32), bit(36) aligned, (3) fixed bin(5), bit(1)), 268 upd_status_task_$get_uid entry (bit(36) aligned, ptr, ptr, fixed bin(35), fixed bin, ptr, fixed bin, 269 char(168), char(32), bit(36) aligned); 270 271 dcl (error_table_$badcall, 272 error_table_$not_done) ext fixed bin(35); 273 274 dcl sys_info$default_max_length ext static fixed bin(18); 275 276 dcl argp ptr, /* arglist pointer */ 277 cp ptr, /* control word pointer */ 278 sp ptr, /* for overlay on "sws" */ 279 tp ptr; /* pointer to "t" structure */ 280 281 dcl aclsw (3) bit(2) int static init ("10"b, "00"b, "10"b), 282 logsw bit(1) aligned, /* c.logsw | (c.errsw & asev ^= 0) */ 283 sws bit(18) aligned, /* define type of call, from args */ 284 state bit(36) aligned, /* = sws || ^sws */ 285 ndig_ctl bit(36) aligned, /* control word for non-deferred subtasks */ 286 no_print_ctl bit(36) aligned, /* control word for subtasks which print normally */ 287 print_ctl bit(36) aligned; /* control word for subtasks which print in detail */ 288 289 dcl ndig_mask (9) bit(36) int static init ( /* non-deferred information gathering mask */ 290 /* for the condition state word. */ 291 "010000000000000000000000000000001000"b, /* (1) dsw(2) & ^option(5) */ 292 "010000000000000000000000000000001000"b, /* (2) dsw(2) & ^option(5) */ 293 "011000000000000000000000000100001000"b, /* (3) dsw(2) & dsw(3) & ^rbsw & ^option(5) */ 294 "011000000000000000000100000000001010"b, /* (4) dsw(2) & dsw(3) & ^asw(1) & ^option(5) &^o(7)*/ 295 "001000000000000010000100000000001000"b, /* (5) dsw(3) & ^asw(1) & ^option(5) & option(7)*/ 296 "100000000000000000000001000000001000"b, /* (6) dsw(1) & ^option(5) */ 297 "001000000000000000000000100000001000"b, /* (7) dsw(3) & ^nsw(1) & ^option(5) */ 298 "001000000010000000000000000000001000"b, /* (8) dsw(3) & option(1) & ^option(5) */ 299 "000000000000010000000000000000001000"b); /* (9) option(4) & ^option(5) */ 300 301 dcl mask (30) bit(36) int static init ( /* condition masks for state word */ 302 "010000000000001000000000000000000000"b, /* (1) dsw(2) & option(5) */ 303 "010000000000001000000000000000000000"b, /* (2) dsw(2) & option(5) */ 304 "011000000000001000000000000100000000"b, /* (3) dsw(2) & dsw(3) & ^rbsw & option(5) */ 305 "011000000000001000000100000000000010"b, /* (4) dsw(2) & dsw(3) & ^asw(1) & option(5) & ^o(7)*/ 306 "001000000000001010000100000000000000"b, /* (5) dsw(3) & ^asw(1) & option(5) & option(7) */ 307 "100000000000001000000000000000000000"b, /* (6) dsw(1) & option(5) */ 308 "001000000000001000000000100000000000"b, /* (7) dsw(3) & ^nsw(1) & option(5) */ 309 "001000000010001000000000000000000000"b, /* (8) dsw(3) & option(1) & option(5) */ 310 "000000000000011000000000000000000000"b, /* (9) option(4) & option(5) */ 311 "001000000000000000000000000000100000"b, /* (10) dsw(3) & ^option(3) */ 312 "001000000000100000000000000000000000"b, /* (11) dsw(3) & option(3) */ 313 "001000000000000000000000000000100000"b, /* (12) dsw(3) & ^option(3) */ 314 "001000000000100000000000000000000000"b, /* (13) dsw(3) & option(3) */ 315 "001000000000000000000000000000100000"b, /* (14) dsw(3) & ^option(3) */ 316 "001000000000100000000000000000000000"b, /* (15) dsw(3) & option(3) */ 317 "001010000000000000000000000000000000"b, /* (16) dsw(3) & asw(2) */ 318 "001001000000000000000000000000000000"b, /* (17) dsw(3) & asw(3) */ 319 "010000000000000000000000000000000000"b, /* (18) dsw(2) */ 320 "010000000000000000000000000000100000"b, /* (19) dsw(2) & ^option(3) */ 321 "001000000000000000000000000000100000"b, /* (20) dsw(3) & ^option(3) */ 322 "001000001000000000000000000000100000"b, /* (21) dsw(3) & nsw(3) & ^option(3) */ 323 "001000000010000000000000000000100000"b, /* (22) dsw(3) & option(1) & ^option(3) */ 324 "001000010000000000000000000000100000"b, /* (23) dsw(3) & nsw(2) & ^option(3) */ 325 "010000000000100000000000000000000000"b, /* (24) dsw(2) & option(3) */ 326 "001000000000100000000000000000000000"b, /* (25) dsw(3) & option(3) */ 327 "001000001000100000000000000000000000"b, /* (26) dsw(3) & nsw(3) & option(3) */ 328 "001000000010100000000000000000000000"b, /* (27) dsw(3) & option(1) & option(3) */ 329 "001000010000100000000000000000000000"b, /* (28) dsw(3) & nsw(2) & option(3) */ 330 "001000000000000000000000000000000000"b, /* (29) dsw(3) */ 331 "000000000000010000000000000000000000"b); /* (30) option(4) */ 332 333 dcl a fixed bin, /* action index */ 334 i fixed bin; /* random */ 335 336 dcl action_table (0:7) fixed bin int static init (0, 0, 4, 3, 0, 2, 0, 1); 337 338 dcl amsg (4) char(28) int static init ("Access control list", "ACL deletions", "ACL additions", "Initial access control list"), 339 msg1 (4) char(4) int static init ("by", "Add", "", ""), 340 msg2 (4) char(8) int static init ("Replace", "", "Move", "Delete"), 341 msg3 (4) char(4) int static init ("as", "as", "to", ""), 342 nmsg (3) char(16) int static init ("Names", "Name deletions", "Name additions"), 343 install_message (5) char (58) aligned varying init ( 344 "Beginning installation of ", 345 "", 346 "Copying special target segments.", 347 "Adding names to special target segments.", 348 "Installation complete."), 349 de_install_message (5) char (61) aligned varying init ( 350 "De-installation complete.", 351 "Non-special target segments deleted.", 352 "Special target segments deleted.", 353 "Names removed from special target segments.", 354 "Beginning De-installation of "); 355 356 dcl bdir char(168) based, /* based dirname */ 357 bseg char(32) based, /* based entryname */ 358 buid bit(36) aligned based; /* based uid */ 359 360 dcl area area based (areap); /* caller-supplied area */ 361 362 dcl 1 s aligned based (sp), /* exploded version of "sws" */ 363 (2 dsw (3) bit(1), /* non-zero if dir(i) ^= "" */ 364 2 asw (3) bit(1), /* non-zero if ap(i) ^= null */ 365 2 nsw (3) bit(1), /* non-zero if np(i) ^= null */ 366 2 rbsw bit(1), /* non-zero if rb(1) ^= 0 */ 367 2 option (7) bit(1)) unal; /* 1-7: copy of option bits */ 368 369 dcl 1 c aligned based (cp), /* exploded control word */ 370 (2 de_install_sw bit(1), /* non-zero if in de_install mode */ 371 2 tasksw bit(1), /* non-zero if to set up task */ 372 2 compsw bit(1), /* non-zero if compile-only task */ 373 2 runsw bit(1), /* non-zero if call to be processed immediately */ 374 2 trunsw bit(1), /* non-zero if subtask list to be processed */ 375 2 logsw bit(1), /* non-zero if in print mode */ 376 2 errsw bit(1), /* non-zero if printing error tasks only */ 377 2 briefsw bit(1), /* non-zero if brief mode */ 378 2 detailsw bit(1), /* non-zero if to print subtasks */ 379 2 clear_code_sw bit(1), /* non-zero if to clear error codes and try again */ 380 2 clear_uid_sw bit(1)) unal; /* non-zero if to clear unique ids */ 381 382 dcl 1 t aligned based (tp), /* internal temporaries which need preserving */ 383 2 t, /* dummy name list for temp name on new seg */ 384 3 name char(32) unal, /* fudge alignment */ 385 3 pcode fixed bin(35), /* process code */ 386 3 rcode fixed bin(35), /* restore code */ 387 2 tp ptr, /* pointer to "t.t" */ 388 2 d, /* dummy name list for temp name on old seg */ 389 3 name char(32) unal, /* name (fudge alignment) */ 390 3 pcode fixed bin(35), /* process code */ 391 3 rcode fixed bin(35), /* restore code */ 392 2 dp ptr, /* pointer to "t.d" */ 393 2 nldp ptr, /* pointer to dirname of seg to have names listed */ 394 2 nlsp ptr, /* pointer to entryname of same */ 395 2 nlup ptr, /* pointer to uid of same */ 396 2 cpdp ptr, /* pointer to dirname of seg to be copied */ 397 2 cpsp ptr, /* pointer to entryname of same */ 398 2 cpup ptr, /* pointer to uid of same */ 399 2 a fixed bin, /* action code */ 400 2 state bit(36), /* state word (sws || ^sws) */ 401 2 np, /* pointers to generated name arrays */ 402 3 old ptr init (null), /* names to be removed from old seg */ 403 3 arc ptr init (null), /* component names for archive */ 404 2 nn, /* name list sizes (go with "t.np.xxx") */ 405 3 old fixed bin init (0), /* names to be removed from old seg */ 406 3 arc fixed bin init (0), /* archive component names */ 407 2 treep ptr init (null), /* ptr to modification description tree */ 408 2 maxlen fixed bin(18), /* max length */ 409 2 eb fixed bin (14), /* entry bound */ 410 2 logdir char(168) aligned init (""), /* documentation directory */ 411 2 argp ptr init (null), /* arglist pointer, for subtask parentp */ 412 2 taskp (30) ptr init ((30) null), /* task pointer array for subtasks */ 413 2 seqno (30) fixed bin init ( 414 2,3,4,5,6,7,8,9,10,12, 415 14,15,16,17,18,19,20,21,22,23, 416 24,25,26,27,28,30,31,32,33,36), 417 2 code (30) fixed bin(35) init ((30) 0), /* subtask status codes */ 418 2 sev (30) fixed bin init ((30) 0), /* subtask severity codes */ 419 2 uid (3) bit(36) init ((3) (36) "0"b), /* unique id's for all three segs */ 420 2 fwd_logging_done_sw bit(1) aligned init ("0"b), /* non-zero if installation was logged */ 421 2 log_dir_sw bit(1) aligned init ("0"b), /* non-zero if logdir cannot be changed */ 422 2 one fixed bin init (1), /* constant "1" */ 423 2 recover bit(1) unal init ("1"b); /* static for "always full recovery switch" */ 424 425 dcl 1 it aligned based (tp), /* internal temps used by upd_install_task_$init */ 426 2 argp ptr init (null), /* static ptr to our arg list */ 427 2 taskp (5) ptr init ((5) null),/* subtasks tasp ptrs. */ 428 2 code (5) fixed bin(35) init ((5) 0), 429 /* status code */ 430 2 sev (5) fixed bin init ((5) 0), 431 /* severity code. */ 432 2 seqno (5) fixed bin init (1, 11, 13, 29, 34), 433 /* sequence number of task execution order. */ 434 2 fwd_done_sw (5) bit(1) aligned init ((5)(1)"0"b), 435 /* fwd message printed switches. */ 436 2 fwd_msgp (5) ptr, /* ptr to "install" messages. */ 437 2 rev_msgp (5) ptr, /* ptr to "de_install" messages. */ 438 2 fwd_msgl (5) fixed bin, /* length of "install" messages. */ 439 2 rev_msgl (5) fixed bin, /* length of "de_install" messages. */ 440 2 print bit(1) unal init ("1"b), 441 /* static switch for "always print message" */ 442 2 noprint bit(1) unal init ("0"b); 443 /* static switch for "never print message" */ 444 445 dcl fwd_msg char (it.fwd_msgl(i)) aligned based (it.fwd_msgp(i)), 446 rev_msg char (it.rev_msgl(i)) aligned based (it.rev_msgp(i)); 447 448 /* * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * */ 449 /* */ 450 451 /* * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * */ 452 453 454 call cu_$arg_list_ptr (argp); /* get pointer to arglist */ 455 cp = addr (ctlw); /* get pointer to control word */ 456 if c.de_install_sw then /* upd_install_task_ does not run in de_install */ 457 return; /* bye.. */ 458 print_ctl = ctlw & "00010111110"b; /* form subtask control words */ 459 no_print_ctl = ctlw & "00010111010"b; /* suppresses detailed printing of some tasks */ 460 ndig_ctl = ctlw & "0001"b; 461 if c.compsw then do; /* if we're compiling subtasks, */ 462 print_ctl = print_ctl | "01"b; /* set tasksw for them */ 463 no_print_ctl = no_print_ctl | "01"b; 464 end; 465 if c.tasksw then /* if we're allocating a task, */ 466 ndig_ctl = ndig_ctl | "0001"b; /* "run" non-deferred information gatherers now. */ 467 468 if temp = null then do; /* allocated temps yet? */ 469 sp = addr (sws); /* reference sws as arrays */ 470 sws = "0"b; /* zero them first */ 471 do i = 1 to 3; /* 3 of everything */ 472 s.dsw(i) = (dir(i) ^= ""); /* test all kinds of conditions */ 473 s.asw(i) = (ap(i) ^= null); /* see which acls given */ 474 s.nsw(i) = (np(i) ^= null); /* see which name lists given */ 475 end; 476 if s.dsw(3) /* if there is to exist a target seg */ 477 then s.rbsw = (rb(1) ^= 0); /* were rings given for it? */ 478 substr (sws, 11, 7) = substr(options,1,7); /* fill in caller's option bits */ 479 a = action_table (fixed (substr (sws, 1, 3))); 480 /* s.dsw define type of call */ 481 if a = 0 then do; /* unknown action */ 482 call upd_task_err_(error_table_$badcall, 4, argp, "upd_install_task_", "Unknown action implied."); 483 return; 484 end; 485 state = sws || ^sws; /* form 36 bit state word for masking */ 486 allocate t in (area); /* allocate space for temps, etc. */ 487 t.t.name = unique_chars_("0"b); /* get temp name for new seg */ 488 t.d.name = unique_chars_("0"b); /* and a handle for old seg */ 489 t.t.pcode, t.d.pcode = error_table_$not_done;/* initialize status codes on dummy name lists */ 490 t.t.rcode, t.d.rcode = 0; 491 t.tp = addr (t.t); /* get pointers to them also */ 492 t.dp = addr (t.d); 493 if a < 3 then do; /* replace or add operation */ 494 t.cpdp, t.nldp = addr (dir(1)); /* copying, getting names from new seg */ 495 t.cpsp, t.nlsp = addr (seg(1)); 496 t.cpup, t.nlup = addr (t.uid(1)); 497 if s.dsw(2) & s.option(2) then do; /* user wants names from old seg */ 498 t.nldp = addr (dir(2)); /* so change them */ 499 t.nlsp = addr (seg(2)); 500 t.nlup = addr (t.uid(2)); 501 end; 502 end; 503 else if a = 3 then do; /* move operation */ 504 t.cpdp, t.nldp = addr (dir(2)); /* everything comes from old seg */ 505 t.cpsp, t.nlsp = addr (seg(2)); 506 t.cpup, t.nlup = addr (t.uid(2)); 507 end; 508 else do; /* delete operation */ 509 t.cpdp, t.nldp, t.cpsp, t.nlsp, t.cpup, t.nlup = null; 510 end; 511 t.a = a; /* save action code */ 512 t.logdir = log_dir; /* copy documentation directory; it gets changed later */ 513 if a < 4 then 514 call get_entry_bound (t.cpdp -> bdir, t.cpsp -> bseg, t.eb); 515 /* try for entry bound */ 516 else t.eb = 0; 517 if (options & "000001"b) then /* max length */ 518 t.maxlen = max_length; /* fill in from caller */ 519 else if (options & "001000"b) then /* give default for special segs */ 520 t.maxlen = 0; /* (will be set to curlen) */ 521 else /* give default for non-special segs */ 522 t.maxlen = sys_info$default_max_length; /* (system default) */ 523 /* perform non-deferred information gathering */ 524 t.argp = argp; 525 if (state & ndig_mask(1)) = ndig_mask(1) then/* get unique id of old seg */ 526 call upd_status_task_$get_uid (ndig_ctl, areap, t.argp, t.code(1), t.sev(1), t.taskp(1), t.seqno(1), 527 dir(2), seg(2), t.uid(2)); 528 if (state & ndig_mask(2)) = ndig_mask(2) then/* list names on old seg, to remove later */ 529 call upd_name_task_$list (ndig_ctl, areap, t.argp, t.code(2), t.sev(2), t.taskp(2), t.seqno(2), 530 dir(2), seg(2), seg(2), t.uid(2), t.np.old, t.nn.old); 531 if (state & ndig_mask(3)) = ndig_mask(3) then/* get rings of old seg to put on new seg */ 532 call upd_ring_task_$list (ndig_ctl, areap, t.argp, t.code(3), t.sev(3), t.taskp(3), t.seqno(3), 533 dir(2), seg(2), seg(2), t.uid(2), rb); 534 if (state & ndig_mask(4)) = ndig_mask(4) then/* get acl of old seg to put on new seg */ 535 call upd_acl_task_$list (ndig_ctl, areap, t.argp, t.code(4), t.sev(4), t.taskp(4), t.seqno(4), 536 dir(2), seg(2), seg(2), t.uid(2), ap(1), an(1)); 537 if (state & ndig_mask(5)) = ndig_mask(5) then/* get acl of old seg to put on new seg */ 538 call upd_acl_task_$list_inacl (ndig_ctl, areap, t.argp, t.code(4), t.sev(4), t.taskp(4), t.seqno(4), 539 dir(3), seg(3), seg(3), t.uid(3), ap(1), an(1), rb); 540 if (state & ndig_mask(6)) = ndig_mask(6) then/* get unique id of new seg */ 541 call upd_status_task_$get_uid (ndig_ctl, areap, t.argp, t.code(5), t.sev(5), t.taskp(5), t.seqno(5), 542 dir(1), seg(1), t.uid(1)); 543 if (state & ndig_mask(7)) = ndig_mask(7) then/* get name list for target seg from new seg */ 544 call upd_name_task_$list (ndig_ctl, areap, t.argp, t.code(6), t.sev(6), t.taskp(6), t.seqno(6), 545 t.nldp -> bdir, t.nlsp -> bseg, t.nlsp -> bseg, t.nlup -> buid, np(1), nn(1)); 546 if (state & ndig_mask(8)) = ndig_mask(8) then/* archive option, get name list from components */ 547 call upd_name_task_$list_archive (ndig_ctl, areap, t.argp, t.code(7), t.sev(7), t.taskp(7), t.seqno(7), 548 t.cpdp -> bdir, t.cpsp -> bseg, t.cpsp -> bseg, t.cpup -> buid, t.np.arc, t.nn.arc); 549 if (state & ndig_mask(9)) = ndig_mask(9) then/* log option; get modification description tree */ 550 call upd_doc_task_$get_tree (ndig_ctl, areap, t.argp, t.code(8), t.sev(8), t.taskp(8), t.seqno(8), 551 dir, seg, t.uid, t.treep); 552 553 t.state = state; /* save state word */ 554 temp = tp; /* have caller save pointer for us */ 555 end; 556 else do; /* already done, we were interrupted */ 557 tp = temp; /* just get it back again */ 558 a = t.a; /* make code a little more efficient */ 559 state = t.state; 560 end; 561 562 563 if c.tasksw then /* allocating a task? */ 564 call upd_add_task_("upd_install_task_", argp); 565 logsw = c.logsw; /* non-zero if printing */ 566 if c.errsw then if asev = 0 then /* error option, print if error only */ 567 logsw = "0"b; /* reset bit if no error */ 568 569 if c.clear_code_sw then do; /* user wants error codes cleared for a retry */ 570 acode, 571 asev, 572 t.code, 573 t.sev = 0; 574 end; 575 576 if c.clear_uid_sw then /* user wants unique id's cleared for a retry */ 577 t.uid = "0"b; /* reloader resets uid's on all segments. */ 578 /* uid's stored in io seg must be set to 0 to do a */ 579 /* restore after a reload has been done. */ 580 581 if ^t.log_dir_sw then /* if we can still update the log directory */ 582 t.logdir = log_dir; /* then do it */ 583 584 if logsw then do; /* user wants to know what's going on (don't we all) */ 585 sp = addr (state); /* overlay structure on it */ 586 if c.detailsw then /* space up paper a bit */ 587 call ioa_$ioa_stream ("installation_list_", "^|^/"); 588 else 589 call ioa_$ioa_stream ("installation_list_", "^/"); 590 if s.dsw(2) then /* replacing, moving or deleting somebody? */ 591 call ioa_$ioa_stream ("installation_list_", "^10a^a>^a", (msg2(a)), dir(2), seg(2)); 592 if s.dsw(1) then /* adding or replacing? */ 593 call ioa_$ioa_stream ("installation_list_", "^10a^a>^a", (msg1(a)), dir(1), seg(1)); 594 if dir(2) = dir(3) then if seg(2) = seg(3) then /* replace with target = old, omit third msg */ 595 go to skip; /* skip */ 596 if s.dsw(3) then /* somebody going in? */ 597 call ioa_$ioa_stream ("installation_list_", "^10a^a>^a", (msg3(a)), dir(3), seg(3)); 598 skip: if c.briefsw then /* brief mode? */ 599 go to brief; /* yes, skip options */ 600 if (options & "1111111"b) then do; /* tell user what options are */ 601 call ioa_$ioa_stream ("installation_list_", "^5xOptions:"); 602 if s.option(1) then 603 call ioa_$ioa_stream ("installation_list_", "^-Add component names"); 604 if s.option(2) then 605 call ioa_$ioa_stream ("installation_list_", "^-Use old names"); 606 if s.option(3) then 607 call ioa_$ioa_stream ("installation_list_", "^-Special segment"); 608 if s.option(4) then 609 call ioa_$ioa_stream ("installation_list_", "^-Log the installation"); 610 if s.option(5) then 611 call ioa_$ioa_stream ("installation_list_", "^-Deferred information gathering"); 612 if s.option(6) then 613 call ioa_$ioa_stream ("installation_list_", "^-Set maximum length"); 614 end; 615 if c.detailsw | c.errsw then /* do print args in full if they will be printed */ 616 go to end_log_print; /* later. */ 617 if s.rbsw then /* print ring brackets option, if exists */ 618 call ioa_$ioa_stream ("installation_list_", "^5xSet ring brackets:^/^10x^d,^d,^d", 619 rb(1), rb(2), rb(3) ); 620 if t.eb > 0 then 621 call ioa_$ioa_stream ("installation_list_", "^5xSet entry bound:^/^10x^d", t.eb); 622 623 if option(7) then do; /* user requested INACL */ 624 call ioa_$ioa_stream ("installation_list_", "^5x^a:", (amsg(4))); /* print header */ 625 call upd_print_acl_(ap(1), an(1), (aclsw(1))); 626 end; 627 else do i = 1 to 3; /* print acl options */ 628 if ap(i) ^= null then do; /* this one here? */ 629 call ioa_$ioa_stream ("installation_list_", "^5x^a:", (amsg(i))); /* print header */ 630 call upd_print_acl_(ap(i), an(i), (aclsw(i))); 631 end; 632 end; 633 do i = 1 to 3; /* print name options */ 634 if np(i) ^= null then do; /* this one here? */ 635 call ioa_$ioa_stream ("installation_list_", "^5x^a:", (nmsg(i))); /* print header */ 636 call upd_print_names_(np(i), nn(i), "00"b); 637 end; 638 end; 639 if s.option(1) then do; /* archive option? */ 640 call ioa_$ioa_stream ("installation_list_", "^5xArchive component names:"); /* print header */ 641 call upd_print_names_(t.np.arc, t.nn.arc, "00"b); /* print name list */ 642 end; 643 if s.option(4) then do; /* print Log information */ 644 call ioa_$ioa_stream ("installation_list_", "^5xLog Information:"); /* print header */ 645 call upd_doc_task_$write_tree ("00000100000"b, areap, null, 0, 0, null, 0, 646 t.treep, in_date, de_in_date, t.logdir, "0"b); /* pass only minimum arguments */ 647 end; 648 brief: if asev ^= 0 then /* was there an error last time? */ 649 call upd_print_err_(acode, asev); /* yes, print it */ 650 end; 651 652 end_log_print: 653 t.argp = argp; /* set parentp for subtasks in static. */ 654 ndig_ctl = ctlw & "000001110"b; /* ndig's can only print from this point on, */ 655 /* and never in detail. */ 656 if ^c.detailsw & ^c.errsw then do; /* user want subtasks printed? */ 657 print_ctl = print_ctl & "11110000010"b; /* no, mask out all print bits */ 658 no_print_ctl = no_print_ctl & "11110000010"b; 659 ndig_ctl = "0"b; 660 end; 661 662 if ndig_ctl = "0"b then /* no more ndig tasks? */ 663 go to check_dig; /* see if there are any deferred tasks to do */ 664 665 if logsw then /* don't confuse user */ 666 call ioa_$ioa_stream ("installation_list_", "Subtasks follow."); /* tell him which is which */ 667 if (state & ndig_mask(1)) = ndig_mask(1) then /* get unique id of old seg */ 668 call upd_status_task_$get_uid (ndig_ctl, areap, t.argp, t.code(1), t.sev(1), t.taskp(1), t.seqno(1), 669 dir(2), seg(2), t.uid(2)); 670 if (state & ndig_mask(2)) = ndig_mask(2) then /* list names on old seg, to remove later */ 671 call upd_name_task_$list (ndig_ctl, areap, t.argp, t.code(2), t.sev(2), t.taskp(2), t.seqno(2), 672 dir(2), seg(2), seg(2), t.uid(2), t.np.old, t.nn.old); 673 if (state & ndig_mask(3)) = ndig_mask(3) then /* get rings of old seg to put on new seg */ 674 call upd_ring_task_$list (ndig_ctl, areap, t.argp, t.code(3), t.sev(3), t.taskp(3), t.seqno(3), 675 dir(2), seg(2), seg(2), t.uid(2), rb); 676 if (state & ndig_mask(4)) = ndig_mask(4) then /* get acl of old seg to put on new seg */ 677 call upd_acl_task_$list (ndig_ctl, areap, t.argp, t.code(4), t.sev(4), t.taskp(4), t.seqno(4), 678 dir(2), seg(2), seg(2), t.uid(2), ap(1), an(1)); 679 if (state & ndig_mask(5)) = ndig_mask(5) then /* get INACL of target dir */ 680 call upd_acl_task_$list_inacl (ndig_ctl, areap, t.argp, t.code(5), t.sev(5), t.taskp(5), t.seqno(5), 681 dir(3), seg(3), seg(3), t.uid(3), ap(1), an(1), rb); 682 if (state & ndig_mask(6)) = ndig_mask(6) then /* get unique id of new seg */ 683 call upd_status_task_$get_uid (ndig_ctl, areap, t.argp, t.code(6), t.sev(6), t.taskp(6), t.seqno(6), 684 dir(1), seg(1), t.uid(1)); 685 if (state & ndig_mask(7)) = ndig_mask(7) then /* get name list for target seg from new seg */ 686 call upd_name_task_$list (ndig_ctl, areap, t.argp, t.code(7), t.sev(7), t.taskp(7), t.seqno(7), 687 t.nldp -> bdir, t.nlsp -> bseg, t.nlsp -> bseg, t.nlup -> buid, np(1), nn(1)); 688 if (state & ndig_mask(8)) = ndig_mask(8) then /* archive option, get name list from components */ 689 call upd_name_task_$list_archive (ndig_ctl, areap, t.argp, t.code(8), t.sev(8), t.taskp(8), t.seqno(8), 690 t.cpdp -> bdir, t.cpsp -> bseg, t.cpsp -> bseg, t.cpup -> buid, t.np.arc, t.nn.arc); 691 if (state & ndig_mask(9)) = ndig_mask(9) then /* log option; get modification description tree */ 692 call upd_doc_task_$get_tree (ndig_ctl, areap, t.argp, t.code(9), t.sev(9), t.taskp(9), t.seqno(9), 693 dir, seg, t.uid, t.treep); 694 695 check_dig: 696 if no_print_ctl = "0"b then /* nothing more to do */ 697 return; /* scram */ 698 699 if (no_print_ctl & "01"b) then /* if we're setting up the subtasks */ 700 t.log_dir_sw = "1"b; /* log directory cannot be changed from now on */ 701 702 if (state & mask(1)) = mask(1) then /* get unique id of old seg */ 703 call upd_status_task_$get_uid (no_print_ctl, areap, t.argp, t.code(1), t.sev(1), t.taskp(1), t.seqno(1), 704 dir(2), seg(2), t.uid(2)); 705 if (state & mask(2)) = mask(2) then /* list names on old seg, to remove later */ 706 call upd_name_task_$list (no_print_ctl, areap, t.argp, t.code(2), t.sev(2), t.taskp(2), t.seqno(2), 707 dir(2), seg(2), seg(2), t.uid(2), t.np.old, t.nn.old); 708 if (state & mask(3)) = mask(3) then /* get rings of old seg to put on new seg */ 709 call upd_ring_task_$list (no_print_ctl, areap, t.argp, t.code(3), t.sev(3), t.taskp(3), t.seqno(3), 710 dir(2), seg(2), seg(2), t.uid(2), rb); 711 if (state & mask(4)) = mask(4) then /* get acl of old seg to put on new seg */ 712 call upd_acl_task_$list (no_print_ctl, areap, t.argp, t.code(4), t.sev(4), t.taskp(4), t.seqno(4), 713 dir(2), seg(2), seg(2), t.uid(2), ap(1), an(1)); 714 if (state & mask(5)) = mask(5) then /* get acl of old seg to put on new seg */ 715 call upd_acl_task_$list_inacl (no_print_ctl, areap, t.argp, t.code(5), t.sev(5), t.taskp(5), t.seqno(5), 716 dir(2), seg(2), seg(2), t.uid(2), ap(1), an(1), rb); 717 if (state & mask(6)) = mask(6) then /* get unique id of new seg */ 718 call upd_status_task_$get_uid (no_print_ctl, areap, t.argp, t.code(6), t.sev(6), t.taskp(6), t.seqno(6), 719 dir(1), seg(1), t.uid(1)); 720 if (state & mask(7)) = mask(7) then /* get name list for target seg from new seg */ 721 call upd_name_task_$list (no_print_ctl, areap, t.argp, t.code(7), t.sev(7), t.taskp(7), t.seqno(7), 722 t.nldp -> bdir, t.nlsp -> bseg, t.nlsp -> bseg, t.nlup -> buid, np(1), nn(1)); 723 if (state & mask(8)) = mask(8) then /* archive option, get name list from components */ 724 call upd_name_task_$list_archive (no_print_ctl, areap, t.argp, t.code(8), t.sev(8), t.taskp(8), t.seqno(8), 725 t.cpdp -> bdir, t.cpsp -> bseg, t.cpsp -> bseg, t.cpup -> buid, t.np.arc, t.nn.arc); 726 if (state & mask(9)) = mask(9) then /* log option; get modification description tree */ 727 call upd_doc_task_$get_tree (no_print_ctl, areap, t.argp, t.code(9), t.sev(9), t.taskp(9), t.seqno(9), 728 dir, seg, t.uid, t.treep); 729 if (state & mask(10)) = mask(10) then /* copy segment (new/old -> target) (non-special) */ 730 call upd_copy_seg_task_(print_ctl, areap, t.argp, t.code(10), t.sev(10), t.taskp(10), t.seqno(10), 731 t.cpdp -> bdir, t.cpsp -> bseg, t.cpsp -> bseg, t.cpup -> buid, dir(3), t.t.name, seg(3), 732 t.uid(3), t.maxlen, t.eb, t.recover); 733 if (state & mask(11)) = mask(11) then /* copy segment (new/old -> target) (special) */ 734 call upd_copy_seg_task_(print_ctl, areap, t.argp, t.code(11), t.sev(11), t.taskp(11), t.seqno(11), 735 t.cpdp -> bdir, t.cpsp -> bseg, t.cpsp -> bseg, t.cpup -> buid, dir(3), t.t.name, seg(3), 736 t.uid(3), t.maxlen, t.eb, full_recovery_sw); 737 if (state & mask(12)) = mask(12) then /* set ring brackets (target) (non-special) */ 738 call upd_ring_task_$set (no_print_ctl, areap, t.argp, t.code(12), t.sev(12), t.taskp(12), t.seqno(12), 739 dir(3), t.t.name, seg(3), t.uid(3), rb, t.recover); 740 if (state & mask(13)) = mask(13) then /* set ring brackets (target) (special) */ 741 call upd_ring_task_$set (no_print_ctl, areap, t.argp, t.code(13), t.sev(13), t.taskp(13), t.seqno(13), 742 dir(3), t.t.name, seg(3), t.uid(3), rb, full_recovery_sw); 743 if (state & mask(14)) = mask(14) then /* replace acl (target) (non-special) */ 744 call upd_acl_task_$replace (print_ctl, areap, t.argp, t.code(14), t.sev(14), t.taskp(14), t.seqno(14), 745 dir(3), t.t.name, seg(3), t.uid(3), ap(1), an(1), t.recover); 746 if (state & mask(15)) = mask(15) then /* replace acl (target) (special) */ 747 call upd_acl_task_$replace (print_ctl, areap, t.argp, t.code(15), t.sev(15), t.taskp(15), t.seqno(15), 748 dir(3), t.t.name, seg(3), t.uid(3), ap(1), an(1), full_recovery_sw); 749 if (state & mask(16)) = mask(16) then /* delete from acl (target) */ 750 call upd_acl_task_$delete (print_ctl, areap, t.argp, t.code(16), t.sev(16), t.taskp(16), t.seqno(16), 751 dir(3), t.t.name, seg(3), t.uid(3), ap(2), an(2)); 752 if (state & mask(17)) = mask(17) then /* add to acl (target) */ 753 call upd_acl_task_$add (print_ctl, areap, t.argp, t.code(17), t.sev(17), t.taskp(17), t.seqno(17), 754 dir(3), t.t.name, seg(3), t.uid(3), ap(3), an(3)); 755 if (state & mask(18)) = mask(18) then /* add name (old) (unique) */ 756 call upd_name_task_$add (print_ctl, areap, t.argp, t.code(18), t.sev(18), t.taskp(18), t.seqno(18), 757 dir(2), seg(2), seg(2), t.uid(2), t.dp, t.one); 758 if (state & mask(19)) = mask(19) then /* free names (old) (non-special) */ 759 call upd_name_task_$free (print_ctl, areap, t.argp, t.code(19), t.sev(19), t.taskp(19), t.seqno(19), 760 dir(2), t.d.name, seg(2), t.uid(2), t.np.old, t.nn.old); 761 if (state & mask(20)) = mask(20) then /* add names (target) (-name) (non-special) */ 762 call upd_name_task_$add (print_ctl, areap, t.argp, t.code(20), t.sev(20), t.taskp(20), t.seqno(20), 763 dir(3), t.t.name, seg(3), t.uid(3), np(1), nn(1)); 764 if (state & mask(21)) = mask(21) then /* add names (target) (-add_name) (non-special) */ 765 call upd_name_task_$add (print_ctl, areap, t.argp, t.code(21), t.sev(21), t.taskp(21), t.seqno(21), 766 dir(3), t.t.name, seg(3), t.uid(3), np(3), nn(3)); 767 if (state & mask(22)) = mask(22) then /* add names (target) (-archive) (non-special) */ 768 call upd_name_task_$add (print_ctl, areap, t.argp, t.code(22), t.sev(22), t.taskp(22), t.seqno(22), 769 dir(3), t.t.name, seg(3), t.uid(3), t.np.arc, t.nn.arc); 770 if (state & mask(23)) = mask(23) then /* delete names (target) (-delete_name) (non-special) */ 771 call upd_name_task_$delete (print_ctl, areap, t.argp, t.code(23), t.sev(23), t.taskp(23), t.seqno(23), 772 dir(3), t.t.name, seg(3), t.uid(3), np(2), nn(2)); 773 if (state & mask(24)) = mask(24) then /* free names (old) (special) */ 774 call upd_name_task_$free (print_ctl, areap, t.argp, t.code(24), t.sev(24), t.taskp(24), t.seqno(24), 775 dir(2), t.d.name, seg(2), t.uid(2), t.np.old, t.nn.old); 776 if (state & mask(25)) = mask(25) then /* add names (target) (-name) (special) */ 777 call upd_name_task_$add (print_ctl, areap, t.argp, t.code(25), t.sev(25), t.taskp(25), t.seqno(25), 778 dir(3), t.t.name, seg(3), t.uid(3), np(1), nn(1)); 779 if (state & mask(26)) = mask(26) then /* add names (target) (-add_name) (special) */ 780 call upd_name_task_$add (print_ctl, areap, t.argp, t.code(26), t.sev(26), t.taskp(26), t.seqno(26), 781 dir(3), t.t.name, seg(3), t.uid(3), np(3), nn(3)); 782 if (state & mask(27)) = mask(27) then /* add names (target) (-archive) (special) */ 783 call upd_name_task_$add (print_ctl, areap, t.argp, t.code(27), t.sev(27), t.taskp(27), t.seqno(27), 784 dir(3), t.t.name, seg(3), t.uid(3), t.np.arc, t.nn.arc); 785 if (state & mask(28)) = mask(28) then /* delete names (target) (-delete_name) (special) */ 786 call upd_name_task_$delete (print_ctl, areap, t.argp, t.code(28), t.sev(28), t.taskp(28), t.seqno(28), 787 dir(3), t.t.name, seg(3), t.uid(3), np(2), nn(2)); 788 if (state & mask(29)) = mask(29) then /* delete names (target) (unique) */ 789 call upd_name_task_$delete (print_ctl, areap, t.argp, t.code(29), t.sev(29), t.taskp(29), t.seqno(29), 790 dir(3), seg(3), seg(3), t.uid(3), t.tp, t.one); 791 if (state & mask(30)) = mask(30) then /* log option; write formatted tree into log */ 792 call upd_doc_task_$write_tree (print_ctl, areap, t.argp, t.code(30), t.sev(30), t.taskp(30), t.seqno(30), 793 t.treep, in_date, de_in_date, t.logdir, t.fwd_logging_done_sw); 794 795 return; /* sigh */ 796 797 /* * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * */ 798 799 800 801 /* */ 802 803 804 /* * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * */ 805 806 807 get_entry_bound: entry (Dir, Seg, Eb); 808 809 dcl (Dir, Seg) char (*), 810 Eb fixed bin (14); 811 812 dcl bc fixed bin (24), /* bitcount for get_entry_bound */ 813 code fixed bin (35), 814 mode fixed bin (5), 815 segp ptr, /* seg pointer for get_entry_bound */ 816 1 obj_info like object_info aligned; 817 818 dcl (bit, unspec) builtin; 819 820 dcl cleanup condition; 821 822 dcl (get_group_id_ entry() returns(char(32)), 823 get_ring_ entry() returns(fixed bin(3)), 824 hcs_$get_user_effmode entry (char(*), char(*), char(*), fixed bin, fixed bin(5), fixed bin(35)), 825 hcs_$initiate_count entry (char(*), char(*), char(*), fixed bin(24), fixed bin(2), ptr, fixed bin(35)), 826 hcs_$terminate_noname entry (ptr, fixed bin(35)), 827 object_info_$brief entry (ptr, fixed bin(24), ptr, fixed bin(35))); 828 829 Eb = -1; /* default to no successful status */ 830 segp = null; 831 832 call hcs_$get_user_effmode ( Dir, Seg, get_group_id_ (), get_ring_ (), mode, code); 833 if code ^= 0 | (bit (mode,5) & "01000"b ^= "01000"b) then 834 return; /* no read access */ 835 836 on cleanup begin; 837 if segp ^= null then call hcs_$terminate_noname ( segp, (0)); 838 end; 839 840 call hcs_$initiate_count ( Dir, Seg, "", bc, 0, segp, code); 841 if segp = null then return; /* should never happen */ 842 unspec ( obj_info) = ""b; 843 obj_info.version_number = object_info_version_2; 844 845 call object_info_$brief ( segp, bc, addr (obj_info), code); 846 if code = 0 & obj_info.gate then /* really an object and really a gate */ 847 Eb = obj_info.entry_bound; 848 else Eb = 0; /* otherwise no entry bound */ 849 call hcs_$terminate_noname ( segp, code); 850 return; 851 852 /* * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * */ 853 /* */ 854 855 856 /* * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * */ 857 858 859 init: entry (ctlw, areap, parentp, acode, asev, taskp, seqno, special_segs_sw, full_recovery_sw, temp, ioseg); 860 /* installer message task initialization. */ 861 862 call cu_$arg_list_ptr (argp); /* get ptr to arglist for use by called pgms */ 863 cp = addr (ctlw); /* overlay the control word */ 864 if c.de_install_sw then /* upd_install_task_$init doesn't run in de_install */ 865 return; 866 867 if temp = null then do; /* allocated temps yet? */ 868 i = mod ( index(ioseg, " ") + 32, 33); /* calculate length of io seg name */ 869 install_message(1) = install_message(1)||substr(ioseg,1,i); /* form new forward msg */ 870 allocate it in (area); /* if not, allocate and fill in. */ 871 de_install_message(5) = de_install_message(5)||substr(ioseg,1,i); /* and new reverse msg */ 872 /* (bug in optimize forces this placement) */ 873 do i = 1 to 5; /* copy messages into static. */ 874 it.fwd_msgl(i) = length (install_message(i)); 875 allocate fwd_msg in (area); 876 fwd_msg = install_message(i); 877 878 it.rev_msgl(i) = length (de_install_message(i)); 879 allocate rev_msg in (area); 880 rev_msg = de_install_message(i); 881 end; 882 temp = tp; /* store ptr to it in caller-preserved argument. */ 883 end; 884 else 885 tp = temp; /* if so, get ptr to it. */ 886 887 if c.tasksw then /* allocating a task? */ 888 call upd_add_task_ ("upd_install_task_$init", argp); 889 890 no_print_ctl = ctlw & "000100000"b; /* for subtask control word (allow only runsw) */ 891 if c.compsw then /* if we're compiling a subtask list, then */ 892 no_print_ctl = no_print_ctl | "01"b; /* turn on tasksw for our subtasks. */ 893 894 if no_print_ctl = "0"b then /* nothing more to do? */ 895 return; /* then return. */ 896 897 it.argp = argp; /* set parentp for use by our subtasks */ 898 899 call upd_message_task_ (no_print_ctl, areap, it.argp, it.code(1), it.sev(1), it.taskp(1), it.seqno(1), 900 it.print, it.print, it.fwd_done_sw(1), it.fwd_msgp(1), it.fwd_msgl(1), it.rev_msgp(1), it.rev_msgl(1)); 901 /* first msg - start/end */ 902 call upd_message_task_ (no_print_ctl, areap, it.argp, it.code(2), it.sev(2), it.taskp(2), it.seqno(2), 903 it.noprint, it.print, it.fwd_done_sw(2), it.fwd_msgp(2), it.fwd_msgl(2), it.rev_msgp(2), it.rev_msgl(2)); 904 /* second msg - copy/delete (non-special) */ 905 if special_segs_sw then 906 call upd_message_task_ (no_print_ctl, areap, it.argp, it.code(3), it.sev(3), it.taskp(3), it.seqno(3), 907 special_segs_sw, full_recovery_sw, it.fwd_done_sw(3), it.fwd_msgp(3), it.fwd_msgl(3), 908 it.rev_msgp(3), it.rev_msgl(3)); 909 /* third msg - copy/delete (special) */ 910 if special_segs_sw then 911 call upd_message_task_ (no_print_ctl, areap, it.argp, it.code(4), it.sev(4), it.taskp(4), it.seqno(4), 912 special_segs_sw, special_segs_sw, it.fwd_done_sw(4), it.fwd_msgp(4), it.fwd_msgl(4), 913 it.rev_msgp(4), it.rev_msgl(4)); 914 /* fourth msg - names_on/names_off (special) */ 915 call upd_message_task_ (no_print_ctl, areap, it.argp, it.code(5), it.sev(5), it.taskp(5), it.seqno(5), 916 it.print, it.print, it.fwd_done_sw(5), it.fwd_msgp(5), it.fwd_msgl(5), it.rev_msgp(5), it.rev_msgl(5)); 917 /* fifth msg - end/start */ 918 919 /* * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * */ 920 921 1 1 /* BEGIN INCLUDE FILE ... object_info.incl.pl1 1 2*coded February 8, 1972 by Michael J. Spier */ 1 3 /* modified May 26, 1972 by M. Weaver */ 1 4 /* modified 15 April, 1975 by M. Weaver */ 1 5 1 6 declare 1 object_info aligned based, /* structure containing object info based, returned by object_info_ */ 1 7 2 version_number fixed bin, /* version number of current structure format (=2) */ 1 8 2 textp pointer, /* pointer to beginning of text section */ 1 9 2 defp pointer, /* pointer to beginning of definition section */ 1 10 2 linkp pointer, /* pointer to beginning of linkage section */ 1 11 2 statp pointer, /* pointer to beginning of static section */ 1 12 2 symbp pointer, /* pointer to beginning of symbol section */ 1 13 2 bmapp pointer, /* pointer to beginning of break map (may be null) */ 1 14 2 tlng fixed bin, /* length in words of text section */ 1 15 2 dlng fixed bin, /* length in words of definition section */ 1 16 2 llng fixed bin, /* length in words of linkage section */ 1 17 2 ilng fixed bin, /* length in words of static section */ 1 18 2 slng fixed bin, /* length in words of symbol section */ 1 19 2 blng fixed bin, /* length in words of break map */ 1 20 2 format, /* word containing bit flags about object type */ 1 21 3 old_format bit(1) unaligned, /* on if segment isn't in new format, i.e. has old style object map */ 1 22 3 bound bit(1) unaligned, /* on if segment is bound */ 1 23 3 relocatable bit(1) unaligned, /* on if seg has relocation info in its first symbol block */ 1 24 3 procedure bit(1) unaligned, /* on if segment is an executable object program */ 1 25 3 standard bit(1) unaligned, /* on if seg is in standard format (more than just standard map) */ 1 26 3 gate bit(1) unaligned, /* on if segment is a gate */ 1 27 3 separate_static bit(1) unaligned, /* on if static not in linkage */ 1 28 3 links_in_text bit(1) unaligned, /* on if there are threaded links in text */ 1 29 3 perprocess_static bit (1) unaligned, /* on if static is not to be per run unit */ 1 30 3 pad bit(27) unaligned, 1 31 2 entry_bound fixed bin, /* entry bound if segment is a gate */ 1 32 2 textlinkp pointer, /* ptr to first link in text */ 1 33 1 34 /* LIMIT OF BRIEF STRUCTURE */ 1 35 1 36 2 compiler char(8) aligned, /* name of processor which generated segment */ 1 37 2 compile_time fixed bin(71), /* clock reading of date/time object was generated */ 1 38 2 userid char(32) aligned, /* standard Multics id of creator of object segment */ 1 39 2 cvers aligned, /* generator version name in printable char string form */ 1 40 3 offset bit(18) unaligned, /* offset of name in words relative to base of symbol section */ 1 41 3 length bit(18) unaligned, /* length of name in characters */ 1 42 2 comment aligned, /* printable comment concerning generator or generation of segment */ 1 43 3 offset bit(18) unaligned, /* offset of comment in words relative to base of symbol section */ 1 44 3 length bit(18) unaligned, /* length of comment in characters */ 1 45 2 source_map fixed bin, /* offset, relative to base of symbol section, of source map structure */ 1 46 1 47 /* LIMIT OF DISPLAY STRUCTURE */ 1 48 1 49 2 rel_text pointer, /* pointer to text section relocation info */ 1 50 2 rel_def pointer, /* pointer to definition section relocation info */ 1 51 2 rel_link pointer, /* pointer to linkage section relocation info */ 1 52 2 rel_static pointer, /* pointer to static section relocation info */ 1 53 2 rel_symbol pointer, /* pointer to symbol section relocation info */ 1 54 2 text_boundary fixed bin, /* specifies mod of text section base boundary */ 1 55 2 static_boundary fixed bin, /* specifies mod of internal static base boundary */ 1 56 /* currently not used by system */ 1 57 2 default_truncate fixed bin, /* offset rel to symbp for binder to automatically trunc. symb sect. */ 1 58 2 optional_truncate fixed bin; /* offset rel to symbp for binder to optionally trunc. symb sect. */ 1 59 1 60 declare object_info_version_2 fixed bin int static init(2); 1 61 1 62 /* END INCLUDE FILE ... object_info.incl.pl1 */ 922 923 924 925 end upd_install_task_; SOURCE FILES USED IN THIS COMPILATION. LINE NUMBER DATE MODIFIED NAME PATHNAME 0 10/06/88 1301.3 upd_install_task_.pl1 >spec>install>1138>upd_install_task_.pl1 922 1 08/05/77 1022.5 object_info.incl.pl1 >ldd>include>object_info.incl.pl1 NAMES DECLARED IN THIS COMPILATION. IDENTIFIER OFFSET LOC STORAGE CLASS DATA TYPE ATTRIBUTES AND REFERENCES (* indicates a set context) NAMES DECLARED BY DECLARE STATEMENT. Dir parameter char packed unaligned dcl 809 set ref 807 832* 840* Eb parameter fixed bin(14,0) dcl 809 set ref 807 829* 846* 848* Seg parameter char packed unaligned dcl 809 set ref 807 832* 840* a 000116 automatic fixed bin(17,0) dcl 333 in procedure "upd_install_task_" set ref 479* 481 493 503 511 513 558* 590 592 596 a 44 based fixed bin(17,0) level 2 in structure "t" dcl 382 in procedure "upd_install_task_" set ref 511* 558 aclsw 000147 constant bit(2) initial array packed unaligned dcl 281 ref 625 630 acode parameter fixed bin(35,0) dcl 199 set ref 193 570* 648* 859 action_table 000070 constant fixed bin(17,0) initial array dcl 336 ref 479 addr builtin function dcl 223 ref 455 469 491 492 494 495 496 498 499 500 504 505 506 585 845 845 863 amsg 000034 constant char(28) initial array packed unaligned dcl 338 ref 624 629 an parameter fixed bin(17,0) array dcl 199 set ref 193 534* 537* 625* 630* 676* 679* 711* 714* 743* 746* 749* 752* ap parameter pointer array dcl 199 set ref 193 473 534* 537* 625* 628 630* 676* 679* 711* 714* 743* 746* 749* 752* arc 53 based fixed bin(17,0) initial level 3 in structure "t" dcl 382 in procedure "upd_install_task_" set ref 486* 546* 641* 688* 723* 767* 782* arc 50 based pointer initial level 3 in structure "t" dcl 382 in procedure "upd_install_task_" set ref 486* 546* 641* 688* 723* 767* 782* area based area(1024) dcl 360 ref 486 870 875 879 areap parameter pointer dcl 199 set ref 193 486 525* 528* 531* 534* 537* 540* 543* 546* 549* 645* 667* 670* 673* 676* 679* 682* 685* 688* 691* 702* 705* 708* 711* 714* 717* 720* 723* 726* 729* 733* 737* 740* 743* 746* 749* 752* 755* 758* 761* 764* 767* 770* 773* 776* 779* 782* 785* 788* 791* 859 870 875 879 899* 902* 905* 910* 915* argp 000100 automatic pointer dcl 276 in procedure "upd_install_task_" set ref 454* 482* 524 563* 652 862* 887* 897 argp 132 based pointer initial level 2 in structure "t" dcl 382 in procedure "upd_install_task_" set ref 486* 524* 525* 528* 531* 534* 537* 540* 543* 546* 549* 652* 667* 670* 673* 676* 679* 682* 685* 688* 691* 702* 705* 708* 711* 714* 717* 720* 723* 726* 729* 733* 737* 740* 743* 746* 749* 752* 755* 758* 761* 764* 767* 770* 773* 776* 779* 782* 785* 788* 791* argp based pointer initial level 2 in structure "it" dcl 425 in procedure "upd_install_task_" set ref 870* 897* 899* 902* 905* 910* 915* asev parameter fixed bin(17,0) dcl 199 set ref 193 566 570* 648 648* 859 asw 0(03) based bit(1) array level 2 packed packed unaligned dcl 362 set ref 473* bc 000365 automatic fixed bin(24,0) dcl 812 set ref 840* 845* bdir based char(168) packed unaligned dcl 356 set ref 513* 543* 546* 685* 688* 720* 723* 729* 733* bit builtin function dcl 818 ref 833 briefsw 0(07) based bit(1) level 2 packed packed unaligned dcl 369 ref 598 bseg based char(32) packed unaligned dcl 356 set ref 513* 543* 543* 546* 546* 685* 685* 688* 688* 720* 720* 723* 723* 729* 729* 733* 733* buid based bit(36) dcl 356 set ref 543* 546* 685* 688* 720* 723* 729* 733* c based structure level 1 dcl 369 cleanup 000460 stack reference condition dcl 820 ref 836 clear_code_sw 0(09) based bit(1) level 2 packed packed unaligned dcl 369 ref 569 clear_uid_sw 0(10) based bit(1) level 2 packed packed unaligned dcl 369 ref 576 code 14 based fixed bin(35,0) initial array level 2 in structure "it" dcl 425 in procedure "upd_install_task_" set ref 870* 870* 870* 870* 870* 899* 902* 905* 910* 915* code 266 based fixed bin(35,0) initial array level 2 in structure "t" dcl 382 in procedure "upd_install_task_" set ref 486* 525* 528* 531* 534* 537* 540* 543* 546* 549* 570* 667* 670* 673* 676* 679* 682* 685* 688* 691* 702* 705* 708* 711* 714* 717* 720* 723* 726* 729* 733* 737* 740* 743* 746* 749* 752* 755* 758* 761* 764* 767* 770* 773* 776* 779* 782* 785* 788* 791* code 000366 automatic fixed bin(35,0) dcl 812 in procedure "upd_install_task_" set ref 832* 833 840* 845* 846 849* compsw 0(02) based bit(1) level 2 packed packed unaligned dcl 369 ref 461 891 cp 000102 automatic pointer dcl 276 set ref 455* 456 461 465 563 565 566 569 576 586 598 615 615 656 656 863* 864 887 891 cpdp 36 based pointer level 2 dcl 382 set ref 494* 504* 509* 513 546 688 723 729 733 cpsp 40 based pointer level 2 dcl 382 set ref 495* 505* 509* 513 546 546 688 688 723 723 729 729 733 733 cpup 42 based pointer level 2 dcl 382 set ref 496* 506* 509* 546 688 723 729 733 ctlw parameter bit(36) dcl 199 set ref 193 455 458 459 460 654 859 863 890 cu_$arg_list_ptr 000012 constant entry external dcl 226 ref 454 862 d 14 based structure level 2 dcl 382 set ref 492 de_in_date parameter fixed bin(35,0) dcl 199 set ref 193 645* 791* de_install_message 000240 automatic varying char(61) initial array dcl 338 set ref 338* 338* 338* 338* 338* 871* 871 878 880 de_install_sw based bit(1) level 2 packed packed unaligned dcl 369 ref 456 864 detailsw 0(08) based bit(1) level 2 packed packed unaligned dcl 369 ref 586 615 656 dir parameter char(168) array packed unaligned dcl 199 set ref 193 472 494 498 504 525* 528* 531* 534* 537* 540* 549* 590* 592* 594 594 596* 667* 670* 673* 676* 679* 682* 691* 702* 705* 708* 711* 714* 717* 726* 729* 733* 737* 740* 743* 746* 749* 752* 755* 758* 761* 764* 767* 770* 773* 776* 779* 782* 785* 788* dp 26 based pointer level 2 dcl 382 set ref 492* 755* dsw based bit(1) array level 2 packed packed unaligned dcl 362 set ref 472* 476 497 590 592 596 eb 57 based fixed bin(14,0) level 2 dcl 382 set ref 513* 516* 620 620* 729* 733* entry_bound 25 000372 automatic fixed bin(17,0) level 2 dcl 812 set ref 846 error_table_$badcall 000074 external static fixed bin(35,0) dcl 271 set ref 482* error_table_$not_done 000076 external static fixed bin(35,0) dcl 271 ref 489 errsw 0(06) based bit(1) level 2 packed packed unaligned dcl 369 ref 566 615 656 fixed builtin function dcl 223 ref 479 format 24 000372 automatic structure level 2 dcl 812 full_recovery_sw parameter bit(1) packed unaligned dcl 199 set ref 193 733* 740* 746* 859 905* fwd_done_sw 33 based bit(1) initial array level 2 dcl 425 set ref 870* 870* 870* 870* 870* 899* 902* 905* 910* 915* fwd_logging_done_sw 365 based bit(1) initial level 2 dcl 382 set ref 486* 791* fwd_msg based char dcl 445 set ref 875 876* fwd_msgl 64 based fixed bin(17,0) array level 2 dcl 425 set ref 874* 875 875 876 899* 902* 905* 910* 915* fwd_msgp 40 based pointer array level 2 dcl 425 set ref 875* 876 899* 902* 905* 910* 915* gate 24(05) 000372 automatic bit(1) level 3 packed packed unaligned dcl 812 set ref 846 get_group_id_ 000102 constant entry external dcl 822 ref 832 832 get_ring_ 000104 constant entry external dcl 822 ref 832 832 hcs_$get_user_effmode 000106 constant entry external dcl 822 ref 832 hcs_$initiate_count 000110 constant entry external dcl 822 ref 840 hcs_$terminate_noname 000112 constant entry external dcl 822 ref 837 849 i 000117 automatic fixed bin(17,0) dcl 333 set ref 471* 472 472 473 473 474 474* 627* 628 629 630 630 630* 633* 634 635 636 636* 868* 869 871 873* 874 874 875 875 875 876 876 876 878 878 879 879 879 880 880 880* in_date parameter fixed bin(35,0) dcl 199 set ref 193 645* 791* index builtin function dcl 223 ref 868 install_message 000120 automatic varying char(58) initial array dcl 338 set ref 338* 338* 338* 338* 338* 869* 869 874 876 ioa_$ioa_stream 000014 constant entry external dcl 226 ref 586 588 590 592 596 601 602 604 606 608 610 612 617 620 624 629 635 640 644 665 ioseg parameter char(32) dcl 199 ref 859 868 869 871 it based structure level 1 dcl 425 set ref 870 length builtin function dcl 223 ref 874 878 log_dir parameter char(168) dcl 199 ref 193 512 581 log_dir_sw 366 based bit(1) initial level 2 dcl 382 set ref 486* 581 699* logdir 60 based char(168) initial level 2 dcl 382 set ref 486* 512* 581* 645* 791* logsw 000110 automatic bit(1) dcl 281 in procedure "upd_install_task_" set ref 565* 566* 584 665 logsw 0(05) based bit(1) level 2 in structure "c" packed packed unaligned dcl 369 in procedure "upd_install_task_" ref 565 mask 000100 constant bit(36) initial array packed unaligned dcl 301 ref 702 702 705 705 708 708 711 711 714 714 717 717 720 720 723 723 726 726 729 729 733 733 737 737 740 740 743 743 746 746 749 749 752 752 755 755 758 758 761 761 764 764 767 767 770 770 773 773 776 776 779 779 782 782 785 785 788 788 791 791 max_length parameter fixed bin(18,0) dcl 199 ref 193 517 maxlen 56 based fixed bin(18,0) level 2 dcl 382 set ref 517* 519* 521* 729* 733* mod builtin function dcl 223 ref 868 mode 000367 automatic fixed bin(5,0) dcl 812 set ref 832* 833 msg1 000030 constant char(4) initial array packed unaligned dcl 338 ref 592 msg2 000020 constant char(8) initial array packed unaligned dcl 338 ref 590 msg3 000014 constant char(4) initial array packed unaligned dcl 338 ref 596 name based char(32) level 3 in structure "t" packed packed unaligned dcl 382 in procedure "upd_install_task_" set ref 487* 729* 733* 737* 740* 743* 746* 749* 752* 761* 764* 767* 770* 776* 779* 782* 785* name 14 based char(32) level 3 in structure "t" packed packed unaligned dcl 382 in procedure "upd_install_task_" set ref 488* 758* 773* ndig_ctl 000113 automatic bit(36) dcl 281 set ref 460* 465* 465 525* 528* 531* 534* 537* 540* 543* 546* 549* 654* 659* 662 667* 670* 673* 676* 679* 682* 685* 688* 691* ndig_mask 000136 constant bit(36) initial array packed unaligned dcl 289 ref 525 525 528 528 531 531 534 534 537 537 540 540 543 543 546 546 549 549 667 667 670 670 673 673 676 676 679 679 682 682 685 685 688 688 691 691 nldp 30 based pointer level 2 dcl 382 set ref 494* 498* 504* 509* 543 685 720 nlsp 32 based pointer level 2 dcl 382 set ref 495* 499* 505* 509* 543 543 685 685 720 720 nlup 34 based pointer level 2 dcl 382 set ref 496* 500* 506* 509* 543 685 720 nmsg 000000 constant char(16) initial array packed unaligned dcl 338 ref 635 nn parameter fixed bin(17,0) array dcl 199 in procedure "upd_install_task_" set ref 193 543* 636* 685* 720* 761* 764* 770* 776* 779* 785* nn 52 based structure level 2 in structure "t" dcl 382 in procedure "upd_install_task_" no_print_ctl 000114 automatic bit(36) dcl 281 set ref 459* 463* 463 658* 658 695 699 702* 705* 708* 711* 714* 717* 720* 723* 726* 737* 740* 890* 891* 891 894 899* 902* 905* 910* 915* noprint 76(01) based bit(1) initial level 2 packed packed unaligned dcl 425 set ref 870* 902* np parameter pointer array dcl 199 in procedure "upd_install_task_" set ref 193 474 543* 634 636* 685* 720* 761* 764* 770* 776* 779* 785* np 46 based structure level 2 in structure "t" dcl 382 in procedure "upd_install_task_" nsw 0(06) based bit(1) array level 2 packed packed unaligned dcl 362 set ref 474* null builtin function dcl 223 ref 468 473 474 486 486 486 486 486 509 628 634 645 645 645 645 830 837 841 867 870 870 870 870 870 870 obj_info 000372 automatic structure level 1 dcl 812 set ref 842* 845 845 object_info based structure level 1 dcl 1-6 object_info_$brief 000114 constant entry external dcl 822 ref 845 object_info_version_2 constant fixed bin(17,0) initial dcl 1-60 ref 843 old 46 based pointer initial level 3 in structure "t" dcl 382 in procedure "upd_install_task_" set ref 486* 528* 670* 705* 758* 773* old 52 based fixed bin(17,0) initial level 3 in structure "t" dcl 382 in procedure "upd_install_task_" set ref 486* 528* 670* 705* 758* 773* one 367 based fixed bin(17,0) initial level 2 dcl 382 set ref 486* 755* 788* option 0(10) based bit(1) array level 2 packed packed unaligned dcl 362 ref 497 602 604 606 608 610 612 623 639 643 options parameter bit(36) dcl 199 ref 193 478 517 519 600 parentp parameter pointer dcl 199 ref 193 859 pcode 10 based fixed bin(35,0) level 3 in structure "t" dcl 382 in procedure "upd_install_task_" set ref 489* pcode 24 based fixed bin(35,0) level 3 in structure "t" dcl 382 in procedure "upd_install_task_" set ref 489* print 76 based bit(1) initial level 2 packed packed unaligned dcl 425 set ref 870* 899* 899* 902* 915* 915* print_ctl 000115 automatic bit(36) dcl 281 set ref 458* 462* 462 657* 657 729* 733* 743* 746* 749* 752* 755* 758* 761* 764* 767* 770* 773* 776* 779* 782* 785* 788* 791* rb parameter fixed bin(5,0) array dcl 199 set ref 193 476 531* 537* 617* 617* 617* 673* 679* 708* 714* 737* 740* rbsw 0(09) based bit(1) level 2 packed packed unaligned dcl 362 set ref 476* 617 rcode 25 based fixed bin(35,0) level 3 in structure "t" dcl 382 in procedure "upd_install_task_" set ref 490* rcode 11 based fixed bin(35,0) level 3 in structure "t" dcl 382 in procedure "upd_install_task_" set ref 490* recover 370 based bit(1) initial level 2 packed packed unaligned dcl 382 set ref 486* 729* 737* 743* rev_msg based char dcl 445 set ref 879 880* rev_msgl 71 based fixed bin(17,0) array level 2 dcl 425 set ref 878* 879 879 880 899* 902* 905* 910* 915* rev_msgp 52 based pointer array level 2 dcl 425 set ref 879* 880 899* 902* 905* 910* 915* s based structure level 1 dcl 362 seg parameter char(32) array packed unaligned dcl 199 set ref 193 495 499 505 525* 528* 528* 531* 531* 534* 534* 537* 537* 540* 549* 590* 592* 594 594 596* 667* 670* 670* 673* 673* 676* 676* 679* 679* 682* 691* 702* 705* 705* 708* 708* 711* 711* 714* 714* 717* 726* 729* 733* 737* 740* 743* 746* 749* 752* 755* 755* 758* 761* 764* 767* 770* 773* 776* 779* 782* 785* 788* 788* segp 000370 automatic pointer dcl 812 set ref 830* 837 837* 840* 841 845* 849* seqno 230 based fixed bin(17,0) initial array level 2 in structure "t" dcl 382 in procedure "upd_install_task_" set ref 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 486* 525* 528* 531* 534* 537* 540* 543* 546* 549* 667* 670* 673* 676* 679* 682* 685* 688* 691* 702* 705* 708* 711* 714* 717* 720* 723* 726* 729* 733* 737* 740* 743* 746* 749* 752* 755* 758* 761* 764* 767* 770* 773* 776* 779* 782* 785* 788* 791* seqno parameter fixed bin(17,0) dcl 199 in procedure "upd_install_task_" ref 193 859 seqno 26 based fixed bin(17,0) initial array level 2 in structure "it" dcl 425 in procedure "upd_install_task_" set ref 870* 870* 870* 870* 870* 899* 902* 905* 910* 915* sev 324 based fixed bin(17,0) initial array level 2 in structure "t" dcl 382 in procedure "upd_install_task_" set ref 486* 525* 528* 531* 534* 537* 540* 543* 546* 549* 570* 667* 670* 673* 676* 679* 682* 685* 688* 691* 702* 705* 708* 711* 714* 717* 720* 723* 726* 729* 733* 737* 740* 743* 746* 749* 752* 755* 758* 761* 764* 767* 770* 773* 776* 779* 782* 785* 788* 791* sev 21 based fixed bin(17,0) initial array level 2 in structure "it" dcl 425 in procedure "upd_install_task_" set ref 870* 870* 870* 870* 870* 899* 902* 905* 910* 915* sp 000104 automatic pointer dcl 276 set ref 469* 472 473 474 476 476 497 497 585* 590 592 596 602 604 606 608 610 612 617 623 639 643 special_segs_sw parameter bit(1) packed unaligned dcl 199 set ref 859 905 905* 910 910* 910* state 000112 automatic bit(36) dcl 281 in procedure "upd_install_task_" set ref 485* 525 528 531 534 537 540 543 546 549 553 559* 585 667 670 673 676 679 682 685 688 691 702 705 708 711 714 717 720 723 726 729 733 737 740 743 746 749 752 755 758 761 764 767 770 773 776 779 782 785 788 791 state 45 based bit(36) level 2 in structure "t" dcl 382 in procedure "upd_install_task_" set ref 553* 559 substr builtin function dcl 223 set ref 478* 478 479 869 871 sws 000111 automatic bit(18) dcl 281 set ref 469 470* 478* 479 485 485 sys_info$default_max_length 000100 external static fixed bin(18,0) dcl 274 ref 521 t based structure level 1 dcl 382 in procedure "upd_install_task_" set ref 486 t based structure level 2 in structure "t" dcl 382 in procedure "upd_install_task_" set ref 491 taskp parameter pointer dcl 199 in procedure "upd_install_task_" ref 193 859 taskp 134 based pointer initial array level 2 in structure "t" dcl 382 in procedure "upd_install_task_" set ref 486* 525* 528* 531* 534* 537* 540* 543* 546* 549* 667* 670* 673* 676* 679* 682* 685* 688* 691* 702* 705* 708* 711* 714* 717* 720* 723* 726* 729* 733* 737* 740* 743* 746* 749* 752* 755* 758* 761* 764* 767* 770* 773* 776* 779* 782* 785* 788* 791* taskp 2 based pointer initial array level 2 in structure "it" dcl 425 in procedure "upd_install_task_" set ref 870* 870* 870* 870* 870* 899* 902* 905* 910* 915* tasksw 0(01) based bit(1) level 2 packed packed unaligned dcl 369 ref 465 563 887 temp parameter pointer dcl 199 set ref 193 468 554* 557 859 867 882* 884 tp 12 based pointer level 2 in structure "t" dcl 382 in procedure "upd_install_task_" set ref 491* 788* tp 000106 automatic pointer dcl 276 in procedure "upd_install_task_" set ref 486* 487 488 489 489 490 490 491 491 492 492 494 494 495 495 496 496 496 498 499 500 500 504 504 505 505 506 506 506 509 509 509 509 509 509 511 512 513 513 513 516 517 519 521 524 525 525 525 525 525 525 528 528 528 528 528 528 528 528 531 531 531 531 531 531 534 534 534 534 534 534 537 537 537 537 537 537 540 540 540 540 540 540 543 543 543 543 543 543 543 543 543 546 546 546 546 546 546 546 546 546 546 546 549 549 549 549 549 549 549 553 554 557* 558 559 570 570 576 581 581 620 620 641 641 645 645 652 667 667 667 667 667 667 670 670 670 670 670 670 670 670 673 673 673 673 673 673 676 676 676 676 676 676 679 679 679 679 679 679 682 682 682 682 682 682 685 685 685 685 685 685 685 685 685 688 688 688 688 688 688 688 688 688 688 688 691 691 691 691 691 691 691 699 702 702 702 702 702 702 705 705 705 705 705 705 705 705 708 708 708 708 708 708 711 711 711 711 711 711 714 714 714 714 714 714 717 717 717 717 717 717 720 720 720 720 720 720 720 720 720 723 723 723 723 723 723 723 723 723 723 723 726 726 726 726 726 726 726 729 729 729 729 729 729 729 729 729 729 729 729 729 729 733 733 733 733 733 733 733 733 733 733 733 733 733 737 737 737 737 737 737 737 737 740 740 740 740 740 740 740 743 743 743 743 743 743 743 743 746 746 746 746 746 746 746 749 749 749 749 749 749 749 752 752 752 752 752 752 752 755 755 755 755 755 755 755 755 758 758 758 758 758 758 758 758 758 761 761 761 761 761 761 761 764 764 764 764 764 764 764 767 767 767 767 767 767 767 767 767 770 770 770 770 770 770 770 773 773 773 773 773 773 773 773 773 776 776 776 776 776 776 776 779 779 779 779 779 779 779 782 782 782 782 782 782 782 782 782 785 785 785 785 785 785 785 788 788 788 788 788 788 788 788 791 791 791 791 791 791 791 791 870* 874 875 875 875 876 876 878 879 879 879 880 880 882 884* 897 899 899 899 899 899 899 899 899 899 899 899 899 902 902 902 902 902 902 902 902 902 902 902 902 905 905 905 905 905 905 905 905 905 905 910 910 910 910 910 910 910 910 910 910 915 915 915 915 915 915 915 915 915 915 915 915 treep 54 based pointer initial level 2 dcl 382 set ref 486* 549* 645* 691* 726* 791* uid 362 based bit(36) initial array level 2 dcl 382 set ref 486* 486* 486* 496 500 506 525* 528* 531* 534* 537* 540* 549* 576* 667* 670* 673* 676* 679* 682* 691* 702* 705* 708* 711* 714* 717* 726* 729* 733* 737* 740* 743* 746* 749* 752* 755* 758* 761* 764* 767* 770* 773* 776* 779* 782* 785* 788* unique_chars_ 000020 constant entry external dcl 226 ref 487 488 unspec builtin function dcl 818 set ref 842* upd_acl_task_$add 000032 constant entry external dcl 235 ref 752 upd_acl_task_$delete 000034 constant entry external dcl 235 ref 749 upd_acl_task_$list 000036 constant entry external dcl 235 ref 534 676 711 upd_acl_task_$list_inacl 000040 constant entry external dcl 235 ref 537 679 714 upd_acl_task_$replace 000042 constant entry external dcl 235 ref 743 746 upd_add_task_ 000022 constant entry external dcl 226 ref 563 887 upd_copy_seg_task_ 000044 constant entry external dcl 235 ref 729 733 upd_doc_task_$get_tree 000046 constant entry external dcl 235 ref 549 691 726 upd_doc_task_$write_tree 000050 constant entry external dcl 235 ref 645 791 upd_message_task_ 000052 constant entry external dcl 235 ref 899 902 905 910 915 upd_name_task_$add 000054 constant entry external dcl 235 ref 755 761 764 767 776 779 782 upd_name_task_$delete 000056 constant entry external dcl 235 ref 770 785 788 upd_name_task_$free 000060 constant entry external dcl 235 ref 758 773 upd_name_task_$list 000062 constant entry external dcl 235 ref 528 543 670 685 705 720 upd_name_task_$list_archive 000064 constant entry external dcl 235 ref 546 688 723 upd_print_acl_ 000016 constant entry external dcl 226 ref 625 630 upd_print_err_ 000024 constant entry external dcl 226 ref 648 upd_print_names_ 000026 constant entry external dcl 226 ref 636 641 upd_ring_task_$list 000066 constant entry external dcl 235 ref 531 673 708 upd_ring_task_$set 000070 constant entry external dcl 235 ref 737 740 upd_status_task_$get_uid 000072 constant entry external dcl 235 ref 525 540 667 682 702 717 upd_task_err_ 000030 constant entry external dcl 226 ref 482 version_number 000372 automatic fixed bin(17,0) level 2 dcl 812 set ref 843* NAMES DECLARED BY EXPLICIT CONTEXT. brief 004034 constant label dcl 648 ref 598 check_dig 004631 constant label dcl 695 ref 662 end_log_print 004054 constant label dcl 652 ref 615 get_entry_bound 007077 constant entry external dcl 807 ref 513 init 007406 constant entry external dcl 859 skip 003016 constant label dcl 598 ref 594 upd_install_task_ 000702 constant entry external dcl 193 THERE WERE NO NAMES DECLARED BY CONTEXT OR IMPLICATION. STORAGE REQUIREMENTS FOR THIS PROGRAM. Object Text Link Symbol Defs Static Start 0 0 11024 11142 10366 11034 Length 11474 10366 116 315 436 0 BLOCK NAME STACK SIZE TYPE WHY NONQUICK/WHO SHARES STACK FRAME upd_install_task_ 488 external procedure is an external procedure. on unit on line 836 72 on unit STORAGE FOR AUTOMATIC VARIABLES. STACK FRAME LOC IDENTIFIER BLOCK NAME upd_install_task_ 000100 argp upd_install_task_ 000102 cp upd_install_task_ 000104 sp upd_install_task_ 000106 tp upd_install_task_ 000110 logsw upd_install_task_ 000111 sws upd_install_task_ 000112 state upd_install_task_ 000113 ndig_ctl upd_install_task_ 000114 no_print_ctl upd_install_task_ 000115 print_ctl upd_install_task_ 000116 a upd_install_task_ 000117 i upd_install_task_ 000120 install_message upd_install_task_ 000240 de_install_message upd_install_task_ 000365 bc upd_install_task_ 000366 code upd_install_task_ 000367 mode upd_install_task_ 000370 segp upd_install_task_ 000372 obj_info upd_install_task_ THE FOLLOWING EXTERNAL OPERATORS ARE USED BY THIS PROGRAM. r_ne_as call_ext_in_desc call_ext_out_desc call_ext_out return_mac mdfx1 enable_op ext_entry ext_entry_desc int_entry THE FOLLOWING EXTERNAL ENTRIES ARE CALLED BY THIS PROGRAM. cu_$arg_list_ptr get_group_id_ get_ring_ hcs_$get_user_effmode hcs_$initiate_count hcs_$terminate_noname ioa_$ioa_stream object_info_$brief smart_alloc_ unique_chars_ upd_acl_task_$add upd_acl_task_$delete upd_acl_task_$list upd_acl_task_$list_inacl upd_acl_task_$replace upd_add_task_ upd_copy_seg_task_ upd_doc_task_$get_tree upd_doc_task_$write_tree upd_message_task_ upd_name_task_$add upd_name_task_$delete upd_name_task_$free upd_name_task_$list upd_name_task_$list_archive upd_print_acl_ upd_print_err_ upd_print_names_ upd_ring_task_$list upd_ring_task_$set upd_status_task_$get_uid upd_task_err_ THE FOLLOWING EXTERNAL VARIABLES ARE USED BY THIS PROGRAM. error_table_$badcall error_table_$not_done sys_info$default_max_length LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC 338 000523 193 000665 454 000715 455 000724 456 000727 458 000732 459 000735 460 000740 461 000743 462 000746 463 000750 465 000751 468 000756 469 000762 470 000764 471 000765 472 000773 473 001011 474 001025 475 001036 476 001040 478 001052 479 001060 481 001064 482 001065 483 001131 485 001132 486 001141 487 001452 488 001475 489 001520 490 001524 491 001526 492 001530 493 001532 494 001535 495 001542 496 001546 497 001552 498 001556 499 001561 500 001564 502 001566 503 001567 504 001570 505 001576 506 001603 507 001607 509 001610 511 001617 512 001620 513 001625 516 001650 517 001651 519 001661 521 001666 524 001672 525 001674 528 001733 531 002002 534 002047 537 002116 540 002167 543 002226 546 002273 549 002340 553 002401 554 002404 555 002405 557 002406 558 002411 559 002413 563 002415 565 002443 566 002447 569 002456 570 002461 576 002507 581 002523 584 002533 585 002535 586 002537 588 002565 590 002607 592 002663 594 002733 596 002746 598 003016 600 003021 601 003025 602 003051 604 003077 606 003126 608 003157 610 003205 612 003233 615 003261 617 003264 620 003327 623 003361 624 003364 625 003415 626 003442 627 003443 628 003451 629 003460 630 003514 632 003547 633 003551 634 003557 635 003566 636 003625 638 003656 639 003660 640 003663 641 003706 643 003732 644 003735 645 003763 648 004034 652 004054 654 004057 656 004063 657 004066 658 004070 659 004071 662 004072 665 004074 667 004122 670 004163 673 004232 676 004277 679 004346 682 004417 685 004456 688 004523 691 004570 695 004631 699 004633 702 004640 705 004701 708 004750 711 005015 714 005064 717 005135 720 005174 723 005241 726 005306 729 005347 733 005430 737 005511 740 005560 743 005627 746 005700 749 005751 752 006022 755 006073 758 006142 761 006211 764 006260 767 006331 770 006400 773 006451 776 006520 779 006567 782 006640 785 006707 788 006760 791 007027 795 007072 807 007073 829 007120 830 007123 832 007125 833 007204 836 007222 837 007236 838 007254 840 007255 841 007321 842 007325 843 007330 845 007332 846 007351 848 007362 849 007364 850 007375 859 007376 862 007421 863 007430 864 007433 867 007436 868 007442 869 007456 870 007470 871 007661 873 007675 874 007703 875 007710 876 007734 878 007752 879 007757 880 010001 881 010017 882 010021 883 010023 884 010024 887 010027 890 010052 891 010056 894 010063 897 010065 899 010067 902 010131 905 010176 910 010246 915 010316 925 010361 ----------------------------------------------------------- Historical Background This edition of the Multics software materials and documentation is provided and donated to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. as a contribution to computer science knowledge. This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL and BULL HN Information Systems Inc. to the development of this operating system. Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture for managing computer hardware properly and for executing programs. Many subsequent operating systems incorporated Multics principles. Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . ----------------------------------------------------------- Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without fee is hereby granted,provided that the below copyright notice and historical background appear in all copies and that both the copyright notice and historical background and this permission notice appear in supporting documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining to distribution of the programs without specific prior written permission. Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. Copyright 2006 by BULL HN Information Systems Inc. Copyright 2006 by Bull SAS All Rights Reserved