COMPILATION LISTING OF SEGMENT logout Compiled by: Multics PL/I Compiler, Release 29, of July 28, 1986 Compiled at: Honeywell Bull, Phx. Az., Sys-M Compiled on: 08/04/87 1333.0 mst Tue Options: optimize map 1 /****^ *********************************************************** 2* * * 3* * Copyright, (C) Honeywell Bull Inc., 1987 * 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 /* format: style4 */ 13 14 /* LOGOUT - Command to destroy a process and log the user off the system. 15* 16* logout -hold don't hangup the line...let another user login on this terminal 17* logout -brief don't print logout message 18* 19* 20* NEW_PROC - Command to destroy a process and create a new one for the same user. 21* 22* new_proc create a new process with same attributes as this one 23* new_proc -auth new_authorization create a new process whose authorization is new_authorization 24* 25* 26* Written 750406 by PG (split off from terminate_process_) 27* Modified Aug 25, 1977 by S. Webber to add term_signal_handler_ 28* Modified April 1979 by T. Casey for MR7.0a to make process type determination work right for foreground absentee jobs. 29* Modified December 1980 by E. N. Kittlitz for absentee cancellation message 30* Modified 3/82 BIM for new print_abs_msg_, finish_info.incl.pl1 31* Modified 84-06-24 BIM to check strict trusted path. 32**/ 33 34 35 /****^ HISTORY COMMENTS: 36* 1) change(86-05-19,GDixon), approve(86-09-26,MCR7499), 37* audit(86-10-08,Beattie), install(86-10-13,MR12.0-1183): 38* Resolve uninitialized variable (logout_string) in new_proc command by 39* moving no_more_arguments label so variable doesn't get referenced by the 40* new_proc control path. (phx20351) 41* 2) change(87-04-08,Parisek), approve(87-07-14,MCR7644), 42* audit(87-07-24,GDixon), install(87-08-04,MR12.1-1055): 43* Added the "disconnect" entry point. 44* END HISTORY COMMENTS */ 45 46 47 logout: 48 procedure options (variable); 49 50 /* automatic */ 51 52 dcl process_type fixed bin; /* = 2 if this is an absentee process */ 53 dcl argno fixed bin; 54 dcl arg_length fixed bin (21); 55 dcl arg_ptr ptr; 56 dcl attr char (128) varying; 57 dcl authorization bit (72) aligned; 58 dcl code fixed bin (35); 59 dcl my_name char (12); 60 dcl term_structure_ptr ptr; 61 62 63 dcl 1 logout_string aligned, /* information about logouts */ 64 2 version fixed bin, /* this is version 0 */ 65 2 hold bit (1) unaligned, /* don't hangup line */ 66 2 brief bit (1) unaligned, /* don't print logout message */ 67 2 pad bit (34) unaligned; /* must be zero */ 68 69 dcl 1 new_proc_string aligned, /* information about new_procs */ 70 2 version fixed bin, /* this is version 1 */ 71 2 authorization_option bit (1) unaligned, /* use value of new_authorization, below */ 72 2 pad bit (35) unaligned, /* must be zero */ 73 2 new_authorization bit (72) aligned; /* authorization of new process */ 74 75 dcl 1 disc_string aligned, /* info about user invoked disconnect */ 76 2 version fixed bin, /* this is version 0 */ 77 2 pad bit(36) aligned; /* init "0"b */ 78 79 dcl 1 local_finish_info aligned like finish_info; 80 1 1 /* Begin include file finish_info.incl.pl1 3/82 BIM */ 1 2 /* format: style3 */ 1 3 /* condition_info_header.incl.pl1 must be included with this file */ 1 4 1 5 declare finish_info_ptr pointer; 1 6 declare 1 finish_info aligned based (finish_info_ptr), 1 7 2 header aligned like condition_info_header, 1 8 2 type character (8) aligned; 1 9 1 10 /* End include file finish_info.incl.pl1 */ 81 2 1 /* BEGIN INCLUDE FILE condition_info_header.incl.pl1 BIM 1981 */ 2 2 /* format: style2 */ 2 3 2 4 declare condition_info_header_ptr 2 5 pointer; 2 6 declare 1 condition_info_header 2 7 aligned based (condition_info_header_ptr), 2 8 2 length fixed bin, /* length in words of this structure */ 2 9 2 version fixed bin, /* version number of this structure */ 2 10 2 action_flags aligned, /* tell handler how to proceed */ 2 11 3 cant_restart bit (1) unaligned, /* caller doesn't ever want to be returned to */ 2 12 3 default_restart bit (1) unaligned, /* caller can be returned to with no further action */ 2 13 3 quiet_restart bit (1) unaligned, /* return, and print no message */ 2 14 3 support_signal bit (1) unaligned, /* treat this signal as if the signalling procedure had the support bit set */ 2 15 /* if the signalling procedure had the support bit set, do the same for its caller */ 2 16 3 pad bit (32) unaligned, 2 17 2 info_string char (256) varying, /* may contain printable message */ 2 18 2 status_code fixed bin (35); /* if^=0, code interpretable by com_err_ */ 2 19 2 20 /* END INCLUDE FILE condition_info_header.incl.pl1 */ 82 3 1 /* Begin include file trusted_path_flags.incl.pl1 BIM 1984-07-26 */ 3 2 3 3 3 4 /****^ HISTORY COMMENTS: 3 5* 1) change(86-05-19,GDixon), approve(86-09-26,MCR7499), 3 6* audit(86-10-08,Beattie), install(86-10-13,MR12.0-1183): 3 7* Correct alignnment problem to make entire structure aligned, with flags in 3 8* the structure unaligned. 3 9* END HISTORY COMMENTS */ 3 10 3 11 3 12 /* format: style4 */ 3 13 3 14 declare 1 trusted_path_flags aligned, 3 15 2 login bit (1) unal, /* Require disconnection to change auth */ 3 16 2 pad bit (35) unal; 3 17 3 18 /* End include file trusted_path_flags.incl.pl1 */ 83 84 85 /* based */ 86 87 dcl argument char (arg_length) based (arg_ptr); 88 89 /* builtins */ 90 91 dcl (addr, index, null, size, string, unspec) builtin; 92 93 /* external static */ 94 95 dcl error_table_$badopt fixed bin (35) external static; 96 97 /* entries */ 98 99 dcl aim_check_$equal entry (bit (72) aligned, bit (72) aligned) returns (bit (1) aligned); 100 dcl aim_check_$greater_or_equal entry (bit (72) aligned, bit (72) aligned) returns (bit (1) aligned); 101 dcl com_err_ entry options (variable); 102 dcl convert_access_class_$from_string entry (bit (72) aligned, char (*), fixed bin (35)); 103 dcl cu_$arg_ptr entry (fixed bin, ptr, fixed bin (21), fixed bin (35)); 104 dcl execute_epilogue_ entry (bit (1) aligned); 105 dcl get_process_authorization_ entry () returns (bit (72) aligned); 106 dcl get_process_max_authorization_ entry returns (bit (72) aligned); 107 dcl ioa_ entry options (variable); 108 dcl print_abs_msg_$logout entry (); 109 dcl save_on_disconnect entry; 110 dcl signal_ entry (char (*), ptr, ptr); 111 dcl system_info_$trusted_path_flags entry returns (bit (36) aligned); 112 dcl terminate_process_ entry (char (*), ptr); 113 dcl user_info_$attributes entry (char(*) varying); 114 dcl user_info_$process_type entry (fixed bin); 115 116 117 /* program */ 118 119 my_name = "logout"; 120 finish_info_ptr = addr (local_finish_info); 121 finish_info.type = "logout"; 122 123 call user_info_$process_type (process_type); /* we will need to know if this is absentee later */ 124 125 logout_string.version = 0; 126 logout_string.hold = "0"b; /* set default values for arguments */ 127 logout_string.brief = "0"b; /* .. */ 128 logout_string.pad = ""b; 129 term_structure_ptr = addr (logout_string); 130 131 do argno = 1 by 1; /* read all arguments */ 132 call cu_$arg_ptr (argno, arg_ptr, arg_length, code); 133 if code ^= 0 then go to no_more_logout_arguments; 134 135 if argument = "-hold" | argument = "-hd" 136 then logout_string.hold = "1"b; /* user doesn't want line hung up */ 137 138 else if argument = "-brief" | argument = "-bf" 139 then logout_string.brief = "1"b; /* user doesn't want logout message printed */ 140 141 else go to bad_argument; 142 end; 143 144 no_more_logout_arguments: 145 if ^logout_string.brief then do; /* print absentee logout message */ 146 if process_type = 2 then call print_abs_msg_$logout; 147 end; 148 149 if logout_string.hold 150 then do; 151 string (trusted_path_flags) = system_info_$trusted_path_flags (); 152 if trusted_path_flags.login then do; 153 if logout_string.hold & my_name = "logout" then do; 154 call com_err_ (0, my_name, "logout -hold is not permitted at this site to ensure secure logins."); 155 return; 156 end; 157 end; 158 end; 159 160 no_more_arguments: 161 if my_name = "disconnect" then do; 162 call user_info_$attributes (attr); /* check for disconnect_ok */ 163 if index (attr, "disconnect_ok") = 0 then do; 164 call com_err_ (0, my_name, "You lack permission to disconnect your process. 165 Check with your project administrator for more information."); 166 return; 167 end; 168 call save_on_disconnect; /* Ensure process will be saved. */ 169 call terminate_process_ (my_name, term_structure_ptr); 170 return; 171 end; 172 /* assume that's what we want */ 173 else do; 174 finish_info.length = size (finish_info); 175 finish_info.version = 1; 176 finish_info.info_string = ""; 177 unspec (finish_info.action_flags) = ""b; 178 finish_info.status_code = 0; 179 call signal_ ("finish", null (), addr (finish_info)); 180 call execute_epilogue_ ("0"b); /* The "0"b says not just a run unit */ 181 call terminate_process_ (my_name, term_structure_ptr); 182 go to no_more_arguments; /* and don't come back */ 183 end; 184 185 new_proc: 186 entry; /* entry to create a new process */ 187 188 my_name = "new_proc"; 189 finish_info_ptr = addr (local_finish_info); 190 finish_info.type = "new_proc"; 191 192 call user_info_$process_type (process_type); /* is this an process_type process? */ 193 194 if process_type = 2 then do; /* yes! */ 195 call com_err_ (0, my_name, "Invalid command for absentee process."); 196 return; 197 end; 198 199 new_proc_string.version = 1; 200 new_proc_string.authorization_option = "0"b; /* initialize options */ 201 new_proc_string.new_authorization = ""b; /* .. */ 202 new_proc_string.pad = ""b; 203 term_structure_ptr = addr (new_proc_string); /* set ptr to argument */ 204 205 do argno = 1 by 1; /* read all arguments */ 206 call cu_$arg_ptr (argno, arg_ptr, arg_length, code); 207 if code ^= 0 then go to no_more_arguments; /* go do it */ 208 209 if argument = "-authorization" | argument = "-auth" 210 then do; 211 new_proc_string.authorization_option = "1"b; 212 argno = argno + 1; 213 call cu_$arg_ptr (argno, arg_ptr, arg_length, code); 214 if code ^= 0 then do; 215 call com_err_ (code, my_name, "-authorization must be followed by an authorization."); 216 return; 217 end; 218 219 call convert_access_class_$from_string (authorization, argument, code); 220 if code ^= 0 then do; 221 call com_err_ (code, my_name, "^a", argument); 222 return; 223 end; 224 225 /* get the max authorization of this process */ 226 227 if ^aim_check_$greater_or_equal (get_process_max_authorization_ (), authorization) then do; 228 call com_err_ (0, my_name, "You cannot new_proc to the requested authorization."); 229 return; 230 end; 231 232 string (trusted_path_flags) = system_info_$trusted_path_flags (); 233 if trusted_path_flags.login then if 234 ^aim_check_$equal (get_process_authorization_ (), authorization) 235 then do; 236 call com_err_ (0, my_name, "new_proc -authorization is not permitted at this site to ensure secure logins."); 237 return; 238 end; 239 240 new_proc_string.new_authorization = authorization; /* pass to terminate_process_ */ 241 end; 242 else go to bad_argument; 243 end; 244 245 bad_argument: 246 call com_err_ (error_table_$badopt, my_name, argument); 247 return; 248 249 term_signal_handler_: entry; 250 251 my_name = "term_signal"; 252 finish_info_ptr = addr (local_finish_info); 253 finish_info.type = "termsgnl"; 254 255 call user_info_$process_type (process_type); 256 257 if process_type = 2 then /* absentee cancellation */ 258 call ioa_ ("^2/Process terminated by the system. The reason will be sent by Multics mail."); 259 260 logout_string.version = 0; 261 logout_string.hold = "0"b; 262 logout_string.brief = "0"b; 263 logout_string.pad = "0"b; 264 term_structure_ptr = addr (logout_string); 265 266 goto no_more_logout_arguments; 267 268 disconnect: 269 entry; 270 271 my_name = "disconnect"; 272 273 call user_info_$process_type (process_type); 274 275 if process_type ^= 1 then do; 276 call com_err_ (0, my_name, "Command valid for interactive processes only."); 277 return; 278 end; 279 280 disc_string.version = 0; 281 disc_string.pad = ""b; 282 term_structure_ptr = addr (disc_string); 283 284 do argno = 1 by 1; 285 call cu_$arg_ptr (argno, arg_ptr, arg_length, code); 286 if code ^= 0 then go to no_more_arguments; 287 else go to bad_argument; 288 end; 289 290 end logout; SOURCE FILES USED IN THIS COMPILATION. LINE NUMBER DATE MODIFIED NAME PATHNAME 0 08/04/87 1221.3 logout.pl1 >special_ldd>install>MR12.1-1054>logout.pl1 81 1 04/21/82 1211.8 finish_info.incl.pl1 >ldd>include>finish_info.incl.pl1 82 2 03/24/82 1347.2 condition_info_header.incl.pl1 >ldd>include>condition_info_header.incl.pl1 83 3 10/13/86 1239.3 trusted_path_flags.incl.pl1 >ldd>include>trusted_path_flags.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. action_flags 2 based structure level 3 dcl 1-6 set ref 177* addr builtin function dcl 91 ref 120 129 179 179 189 203 252 264 282 aim_check_$equal 000012 constant entry external dcl 99 ref 233 aim_check_$greater_or_equal 000014 constant entry external dcl 100 ref 227 arg_length 000102 automatic fixed bin(21,0) dcl 54 set ref 132* 135 135 138 138 206* 209 209 213* 219 219 221 221 245 245 285* arg_ptr 000104 automatic pointer dcl 55 set ref 132* 135 135 138 138 206* 209 209 213* 219 221 245 285* argno 000101 automatic fixed bin(17,0) dcl 53 set ref 131* 132* 205* 206* 212* 212 213* 284* 285* argument based char unaligned dcl 87 set ref 135 135 138 138 209 209 219* 221* 245* attr 000106 automatic varying char(128) dcl 56 set ref 162* 163 authorization 000150 automatic bit(72) dcl 57 set ref 219* 227* 233* 240 authorization_option 1 000162 automatic bit(1) level 2 packed unaligned dcl 69 set ref 200* 211* brief 1(01) 000160 automatic bit(1) level 2 packed unaligned dcl 63 set ref 127* 138* 144 262* code 000152 automatic fixed bin(35,0) dcl 58 set ref 132* 133 206* 207 213* 214 215* 219* 220 221* 285* 286 com_err_ 000016 constant entry external dcl 101 ref 154 164 195 215 221 228 236 245 276 condition_info_header based structure level 1 dcl 2-6 convert_access_class_$from_string 000020 constant entry external dcl 102 ref 219 cu_$arg_ptr 000022 constant entry external dcl 103 ref 132 206 213 285 disc_string 000166 automatic structure level 1 dcl 75 set ref 282 error_table_$badopt 000010 external static fixed bin(35,0) dcl 95 set ref 245* execute_epilogue_ 000024 constant entry external dcl 104 ref 180 finish_info based structure level 1 dcl 1-6 set ref 174 179 179 finish_info_ptr 000300 automatic pointer dcl 1-5 set ref 120* 121 174 174 175 176 177 178 179 179 189* 190 252* 253 get_process_authorization_ 000026 constant entry external dcl 105 ref 233 233 get_process_max_authorization_ 000030 constant entry external dcl 106 ref 227 227 header based structure level 2 dcl 1-6 hold 1 000160 automatic bit(1) level 2 packed unaligned dcl 63 set ref 126* 135* 149 153 261* index builtin function dcl 91 ref 163 info_string 3 based varying char(256) level 3 dcl 1-6 set ref 176* ioa_ 000032 constant entry external dcl 107 ref 257 length based fixed bin(17,0) level 3 dcl 1-6 set ref 174* local_finish_info 000170 automatic structure level 1 dcl 79 set ref 120 189 252 login 000302 automatic bit(1) level 2 packed unaligned dcl 3-14 set ref 152 233 logout_string 000160 automatic structure level 1 dcl 63 set ref 129 264 my_name 000153 automatic char(12) unaligned dcl 59 set ref 119* 153 154* 160 164* 169* 181* 188* 195* 215* 221* 228* 236* 245* 251* 271* 276* new_authorization 2 000162 automatic bit(72) level 2 dcl 69 set ref 201* 240* new_proc_string 000162 automatic structure level 1 dcl 69 set ref 203 null builtin function dcl 91 ref 179 179 pad 1 000166 automatic bit(36) level 2 in structure "disc_string" dcl 75 in procedure "logout" set ref 281* pad 1(02) 000160 automatic bit(34) level 2 in structure "logout_string" packed unaligned dcl 63 in procedure "logout" set ref 128* 263* pad 1(01) 000162 automatic bit(35) level 2 in structure "new_proc_string" packed unaligned dcl 69 in procedure "logout" set ref 202* print_abs_msg_$logout 000034 constant entry external dcl 108 ref 146 process_type 000100 automatic fixed bin(17,0) dcl 52 set ref 123* 146 192* 194 255* 257 273* 275 save_on_disconnect 000036 constant entry external dcl 109 ref 168 signal_ 000040 constant entry external dcl 110 ref 179 size builtin function dcl 91 ref 174 status_code 104 based fixed bin(35,0) level 3 dcl 1-6 set ref 178* string builtin function dcl 91 set ref 151* 232* system_info_$trusted_path_flags 000042 constant entry external dcl 111 ref 151 232 term_structure_ptr 000156 automatic pointer dcl 60 set ref 129* 169* 181* 203* 264* 282* terminate_process_ 000044 constant entry external dcl 112 ref 169 181 trusted_path_flags 000302 automatic structure level 1 dcl 3-14 set ref 151* 232* type 105 based char(8) level 2 dcl 1-6 set ref 121* 190* 253* unspec builtin function dcl 91 set ref 177* user_info_$attributes 000046 constant entry external dcl 113 ref 162 user_info_$process_type 000050 constant entry external dcl 114 ref 123 192 255 273 version 000160 automatic fixed bin(17,0) level 2 in structure "logout_string" dcl 63 in procedure "logout" set ref 125* 260* version 000162 automatic fixed bin(17,0) level 2 in structure "new_proc_string" dcl 69 in procedure "logout" set ref 199* version 1 based fixed bin(17,0) level 3 in structure "finish_info" dcl 1-6 in procedure "logout" set ref 175* version 000166 automatic fixed bin(17,0) level 2 in structure "disc_string" dcl 75 in procedure "logout" set ref 280* NAME DECLARED BY DECLARE STATEMENT AND NEVER REFERENCED. condition_info_header_ptr automatic pointer dcl 2-4 NAMES DECLARED BY EXPLICIT CONTEXT. bad_argument 001275 constant label dcl 245 ref 138 209 287 disconnect 001401 constant entry external dcl 268 logout 000273 constant entry external dcl 47 new_proc 000654 constant entry external dcl 185 no_more_arguments 000471 constant label dcl 160 ref 182 207 286 no_more_logout_arguments 000402 constant label dcl 144 ref 133 266 term_signal_handler_ 001323 constant entry external dcl 249 THERE WERE NO NAMES DECLARED BY CONTEXT OR IMPLICATION. STORAGE REQUIREMENTS FOR THIS PROGRAM. Object Text Link Symbol Defs Static Start 0 0 1766 2040 1503 1776 Length 2324 1503 52 247 263 0 BLOCK NAME STACK SIZE TYPE WHY NONQUICK/WHO SHARES STACK FRAME logout 276 external procedure is an external procedure. STORAGE FOR AUTOMATIC VARIABLES. STACK FRAME LOC IDENTIFIER BLOCK NAME logout 000100 process_type logout 000101 argno logout 000102 arg_length logout 000104 arg_ptr logout 000106 attr logout 000150 authorization logout 000152 code logout 000153 my_name logout 000156 term_structure_ptr logout 000160 logout_string logout 000162 new_proc_string logout 000166 disc_string logout 000170 local_finish_info logout 000300 finish_info_ptr logout 000302 trusted_path_flags logout THE FOLLOWING EXTERNAL OPERATORS ARE USED BY THIS PROGRAM. call_ext_out_desc call_ext_out return_mac ext_entry set_chars_eis index_chars_eis THE FOLLOWING EXTERNAL ENTRIES ARE CALLED BY THIS PROGRAM. aim_check_$equal aim_check_$greater_or_equal com_err_ convert_access_class_$from_string cu_$arg_ptr execute_epilogue_ get_process_authorization_ get_process_max_authorization_ ioa_ print_abs_msg_$logout save_on_disconnect signal_ system_info_$trusted_path_flags terminate_process_ user_info_$attributes user_info_$process_type THE FOLLOWING EXTERNAL VARIABLES ARE USED BY THIS PROGRAM. error_table_$badopt LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC 47 000272 119 000300 120 000303 121 000305 123 000310 125 000316 126 000317 127 000321 128 000323 129 000325 131 000327 132 000332 133 000347 135 000351 138 000366 142 000400 144 000402 146 000405 149 000415 151 000420 152 000431 153 000434 154 000443 155 000470 160 000471 162 000475 163 000506 164 000515 166 000542 168 000543 169 000550 170 000565 174 000566 175 000570 176 000573 177 000574 178 000575 179 000576 180 000624 181 000635 182 000652 185 000653 188 000661 189 000664 190 000666 192 000671 194 000700 195 000703 196 000730 199 000731 200 000733 201 000735 202 000737 203 000741 205 000743 206 000746 207 000763 209 000765 211 000777 212 001001 213 001002 214 001017 215 001021 216 001045 219 001046 220 001072 221 001074 222 001126 227 001127 228 001154 229 001201 232 001202 233 001213 236 001243 237 001270 240 001271 243 001273 245 001275 247 001321 249 001322 251 001330 252 001333 253 001335 255 001340 257 001347 260 001366 261 001367 262 001371 263 001373 264 001375 266 001377 268 001400 271 001406 273 001411 275 001420 276 001423 277 001450 280 001451 281 001452 282 001453 284 001455 285 001460 286 001475 287 001477 290 001500 ----------------------------------------------------------- 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