COMPILATION LISTING OF SEGMENT lm_log_ Compiled by: Multics PL/I Compiler, Release 33e, of October 6, 1992 Compiled at: CGI Compiled on: 2000-04-17_1939.88_Mon_mdt Options: optimize map 1 /* *********************************************************** 2* * * 3* * Copyright, (C) Honeywell Information Systems Inc., 1983 * 4* * * 5* *********************************************************** */ 6 lm_log_: 7 procedure () options (variable); 8 9 /* 10* lm_log_ - primitive interface to the data manatement log, to be used by 11* all processes that need to leave a message in an accessable place 12* for future use. This procedure contains a locking protocol for the 13* data management system log. The actual writing is handled by write_log_. 14* 15* Two calling sequences are recognized by lm_log_, one for error reporting 16* and one for simple reporting. Error reports will generate two entries 17* in the log, simple reports will generate one entry. The calling sequences 18* are: 19* 20* call lm_log_ (severity, code, caller, ioa_ctl_string, ioa_arg1, ..., ioa_argN); 21* call lm_log_ (severity, ioa_ctl_string, ioa_arg1, ..., ioa_argN); 22* 23* the fundamental flow of this program is: 24* 25* DM_LOG_ 26* 27* MAKE_MESSAGE 28* 29* LOCK_LOG 30* if CANNOT_LOCK_LOG 31* then 32* else do 33* WRITE_INTO_LOG (time, severity, id || message) 34* UNLOCK_LOG 35* end 36* 37* end DM_LOG_ 38* 39**/ 40 41 /* 42* written 11jan83 by M. Pandolf 43* modified 01feb83 by M. Pandolf to accept pointer to arg list in addition 44* to accepting an arglist directly. 45* modified 830426 BIM to reconstitute as lm_log_. a hack. 46**/ 47 48 49 50 /* entrypoint to accept arg ptr as an argument */ 51 52 need_to_get_arglist_ptr = "1"b; 53 goto setup_handler; 54 55 from_arg_ptr: 56 entry (p_arglist_ptr); 57 58 need_to_get_arglist_ptr = "0"b; 59 arglist_ptr = p_arglist_ptr; 60 61 /* first, get ready to give up at the first sign of trouble */ 62 63 setup_handler: 64 on any_other begin; 65 if dm_system_data_$log_lock ^= ZERO 66 then call set_lock_$unlock (dm_system_data_$log_lock, status); 67 68 goto lm_log_returns; 69 end; 70 71 /* get process identity and pointer to arglist for this block */ 72 73 call user_info_$whoami (person_id, project_id, acct); 74 if need_to_get_arglist_ptr 75 then call cu_$arg_list_ptr (arglist_ptr); 76 77 /* there can be no less than two arguments to this program, so verify it */ 78 79 if arglist_ptr -> arg_list.arg_count < 2 80 then return; 81 82 /* get some values that will be required for calls to write_log_ */ 83 84 message_time = clock (); 85 message_severity = FIXED_BIN_17 (1); 86 87 /* lock the log lock */ 88 89 call set_lock_$lock (dm_system_data_$log_lock, FIFTEEN_SECOND_WAIT, status); 90 if status = error_table_$lock_wait_time_exceeded | 91 status = error_table_$no_w_permission 92 then goto lm_log_returns; 93 94 /* if this is an error call, the second parameter will be fixed bin (35) */ 95 96 if arglist_ptr -> arg_list.desc_ptrs (2) -> arg_descriptor.type = FIXED_BIN_SHORT 97 then do; 98 99 /* log the first of a two line message */ 100 101 error_code = FIXED_BIN_35 (2); /* from parm 2 */ 102 caller = CHAR_32 (3); /* from parm 3 */ 103 104 if error_code = 0 105 then short_report, long_report = ""; 106 else call convert_status_code_ (error_code, short_report, long_report); 107 message = "(" || substr (person_id, 1, 8) || " " || substr (project_id, 1, 8) || ") " || rtrim (caller) || ": " || rtrim (long_report); 108 109 call write_log_$write_log_file (message_time, message_severity, message, DMS_LOG, Log_ptr); 110 111 /* log the second line of the two line message, if it exists */ 112 113 if arglist_ptr -> arg_list.arg_count > 3 114 then do; 115 message_len = 116; 116 call formline_ (4, 5, addr (message), message_len, 1, arglist_ptr); 117 message = "(" || substr (person_id, 1, 8) || " " || substr (project_id, 1, 8) || ") " || message; 118 119 call write_log_$write_log_file (message_time, message_severity, message, DMS_LOG, Log_ptr); 120 end; 121 122 end; 123 124 /* not an error call, print one line of message */ 125 126 else do; 127 128 message_len = 116; 129 call formline_ (2, 3, addr (message), message_len, 1, arglist_ptr); 130 message = "(" || substr (person_id, 1, 8) || " " || substr (project_id, 1, 8) || ") " || message; 131 132 call write_log_$write_log_file (message_time, message_severity, message, DMS_LOG, Log_ptr); 133 134 end; 135 136 call set_lock_$unlock (dm_system_data_$log_lock, status); 137 138 lm_log_returns: 139 return; 140 141 set_dir: 142 entry (p_log_dir); 143 144 /* this entrypoint is used to set the dir for the log */ 145 146 if p_log_dir ^= "" 147 then call write_log_$write_log_test (p_log_dir); 148 else call write_log_$write_log_test (get_default_wdir_ ()); 149 150 return; 151 152 153 154 /* INTERNAL PROCEDURES */ 155 156 FIXED_BIN_17: 157 procedure (p_arg_no) returns (fixed bin (17)); 158 159 dcl p_arg_no fixed bin parameter; 160 dcl fb17 fixed bin (17) based; 161 162 if arglist_ptr -> arg_list.arg_count >= p_arg_no 163 then return (arglist_ptr -> arg_list.arg_ptrs (p_arg_no) -> fb17); 164 else return (0); 165 166 end FIXED_BIN_17; 167 168 FIXED_BIN_35: 169 procedure (p_arg_no) returns (fixed bin (35)); 170 171 dcl p_arg_no fixed bin parameter; 172 dcl fb35 fixed bin (35) based; 173 174 if arglist_ptr -> arg_list.arg_count >= p_arg_no 175 then return (arglist_ptr -> arg_list.arg_ptrs (p_arg_no) -> fb35); 176 else return (0); 177 178 end FIXED_BIN_35; 179 180 CHAR_32: 181 procedure (p_arg_no) returns (char (32)); 182 183 dcl p_arg_no fixed bin parameter; 184 dcl c32 char (32) based; 185 186 if arglist_ptr -> arg_list.desc_count >= p_arg_no 187 then return (substr (arglist_ptr -> arg_list.arg_ptrs (p_arg_no) -> c32, 188 1, 189 arglist_ptr -> arg_list.desc_ptrs (p_arg_no) -> arg_descriptor.size)); 190 else return (""); 191 192 end CHAR_32; 193 194 195 196 /* DECLARATIONS */ 197 198 /* Parameter */ 199 200 dcl p_arglist_ptr pointer parameter; /* explicit pointer to arglist */ 201 dcl p_log_dir char (*) parameter; /* dir in which the current log is to be found */ 202 203 /* Automatic */ 204 205 dcl need_to_get_arglist_ptr bit (1) aligned; /* true if arglist_ptr is implicitly received */ 206 dcl status fixed bin (35); /* standard system status code */ 207 dcl person_id char (22); /* of this process */ 208 dcl project_id char (9); /* of this process */ 209 dcl acct char (32); /* process account, is ignored here */ 210 dcl arglist_ptr pointer; /* pointer to argument list for this block */ 211 dcl message_time fixed bin (71); /* time message was received for logging */ 212 dcl message_severity fixed bin (17); /* nonstandard code indicating nature of message */ 213 dcl error_code fixed bin (35); /* standard status code to be translated for output */ 214 dcl caller char (32); /* name of block calling this procedure */ 215 dcl short_report char (8) aligned; /* short status message from error_code */ 216 dcl long_report char (100) aligned; /* long status message from error_code */ 217 dcl message char (116); /* message to be logged */ 218 dcl message_len fixed bin (21); /* length of message, in bytes */ 219 220 /* Static, Internal */ 221 222 dcl Log_ptr pointer internal static init (null ()); /* pointer to current log segment */ 223 224 /* Static, External */ 225 226 dcl dm_system_data_$log_lock bit (36) aligned external static; 227 dcl error_table_$lock_wait_time_exceeded fixed bin(35) ext static; 228 dcl error_table_$no_w_permission fixed bin(35) ext static; 229 230 /* Constant */ 231 232 dcl ZERO bit (36) internal static options (constant) 233 init ((36)"0"b); 234 dcl FIXED_BIN_SHORT fixed bin (6) unsigned unaligned internal static options (constant) 235 init (1); 236 dcl FIFTEEN_SECOND_WAIT fixed bin internal static options (constant) 237 init (15); 238 dcl DMS_LOG char (32) internal static options (constant) 239 init ("lm_log"); 240 241 /* Entry */ 242 243 dcl set_lock_$lock entry (bit(36) aligned, fixed bin, fixed bin(35)); 244 dcl set_lock_$unlock entry (bit(36) aligned, fixed bin(35)); 245 dcl user_info_$whoami entry (char(*), char(*), char(*)); 246 dcl cu_$arg_list_ptr entry (ptr); 247 dcl convert_status_code_ entry (fixed bin(35), char(8) aligned, char(100) aligned); 248 dcl formline_ entry options (variable); 249 dcl write_log_$write_log_file entry (fixed bin(71), fixed bin, char(*), char(*), ptr); 250 dcl write_log_$write_log_test entry (char(*)); 251 dcl get_default_wdir_ entry() returns(char(168) aligned); 252 253 /* Condition */ 254 255 dcl any_other condition; 256 257 /* Builtin */ 258 259 dcl clock builtin; 260 dcl substr builtin; 261 dcl rtrim builtin; 262 263 /* Include Files */ 264 265 1 1 /* BEGIN INCLUDE FILE ... arg_list.incl.pl1 1 2* 1 3* James R. Davis 10 May 79 */ 1 4 1 5 1 6 1 7 /****^ HISTORY COMMENTS: 1 8* 1) change(86-05-15,DGHowe), approve(86-05-15,MCR7375), 1 9* audit(86-07-15,Schroth): 1 10* added command_name_arglist declaration to allow the storage of the 1 11* command name given to the command processor 1 12* END HISTORY COMMENTS */ 1 13 1 14 dcl 1 arg_list aligned based, 1 15 2 header, 1 16 3 arg_count fixed bin (17) unsigned unal, 1 17 3 pad1 bit (1) unal, 1 18 3 call_type fixed bin (18) unsigned unal, 1 19 3 desc_count fixed bin (17) unsigned unal, 1 20 3 pad2 bit (19) unal, 1 21 2 arg_ptrs (arg_list_arg_count refer (arg_list.arg_count)) ptr, 1 22 2 desc_ptrs (arg_list_arg_count refer (arg_list.arg_count)) ptr; 1 23 1 24 1 25 dcl 1 command_name_arglist aligned based, 1 26 2 header, 1 27 3 arg_count fixed bin (17) unsigned unal, 1 28 3 pad1 bit (1) unal, 1 29 3 call_type fixed bin (18) unsigned unal, 1 30 3 desc_count fixed bin (17) unsigned unal, 1 31 3 mbz bit(1) unal, 1 32 3 has_command_name bit(1) unal, 1 33 3 pad2 bit (17) unal, 1 34 2 arg_ptrs (arg_list_arg_count refer (command_name_arglist.arg_count)) ptr, 1 35 2 desc_ptrs (arg_list_arg_count refer (command_name_arglist.arg_count)) ptr, 1 36 2 name, 1 37 3 command_name_ptr pointer, 1 38 3 command_name_length fixed bin (21); 1 39 1 40 1 41 1 42 dcl 1 arg_list_with_envptr aligned based, /* used with non-quick int and entry-var calls */ 1 43 2 header, 1 44 3 arg_count fixed bin (17) unsigned unal, 1 45 3 pad1 bit (1) unal, 1 46 3 call_type fixed bin (18) unsigned unal, 1 47 3 desc_count fixed bin (17) unsigned unal, 1 48 3 pad2 bit (19) unal, 1 49 2 arg_ptrs (arg_list_arg_count refer (arg_list_with_envptr.arg_count)) ptr, 1 50 2 envptr ptr, 1 51 2 desc_ptrs (arg_list_arg_count refer (arg_list_with_envptr.arg_count)) ptr; 1 52 1 53 1 54 dcl ( 1 55 Quick_call_type init (0), 1 56 Interseg_call_type init (4), 1 57 Envptr_supplied_call_type 1 58 init (8) 1 59 ) fixed bin (18) unsigned unal int static options (constant); 1 60 1 61 /* The user must declare arg_list_arg_count - if an adjustable automatic structure 1 62* is being "liked" then arg_list_arg_count may be a parameter, in order to allocate 1 63* an argument list of the proper size in the user's stack 1 64* 1 65**/ 1 66 /* END INCLUDE FILE ... arg_list.incl.pl1 */ 266 267 2 1 /* BEGIN INCLUDE FILE ... arg_descriptor.incl.pl1 2 2* 2 3* James R. Davis 1 Mar 79 */ 2 4 /* Modified June 83 JMAthane for extended arg descriptor format */ 2 5 2 6 dcl 1 arg_descriptor based (arg_descriptor_ptr) aligned, 2 7 2 flag bit (1) unal, 2 8 2 type fixed bin (6) unsigned unal, 2 9 2 packed bit (1) unal, 2 10 2 number_dims fixed bin (4) unsigned unal, 2 11 2 size fixed bin (24) unsigned unal; 2 12 2 13 dcl 1 fixed_arg_descriptor based (arg_descriptor_ptr) aligned, 2 14 2 flag bit (1) unal, 2 15 2 type fixed bin (6) unsigned unal, 2 16 2 packed bit (1) unal, 2 17 2 number_dims fixed bin (4) unsigned unal, 2 18 2 scale fixed bin (11) unal, 2 19 2 precision fixed bin (12) unsigned unal; 2 20 2 21 dcl 1 extended_arg_descriptor based (arg_descriptor_ptr) aligned, 2 22 2 flag bit (1) unal, /* = "1"b */ 2 23 2 type fixed bin (6) unsigned unal, /* = 58 */ 2 24 2 packed bit (1) unal, /* significant if number_dims ^= 0 */ 2 25 2 number_dims fixed (4) unsigned unal,/* number of variable dimensions */ 2 26 2 size bit (24) unal, 2 27 2 dims (0 refer (extended_arg_descriptor.number_dims)), /* part referenced by called generated code */ 2 28 3 low fixed bin (35), 2 29 3 high fixed bin (35), 2 30 3 multiplier fixed bin (35), /* in bits if packed, in words if not */ 2 31 2 real_type fixed bin (18) unsigned unal, 2 32 2 type_offset fixed bin (18) unsigned unal; /* offset rel to symbol tree to symbol node for type, if any */ 2 33 2 34 dcl arg_descriptor_ptr ptr; 2 35 2 36 dcl extended_arg_type fixed bin init (58); 2 37 2 38 /* END INCLUDE file .... arg_descriptor.incl.pl1 */ 268 269 270 271 end lm_log_; SOURCE FILES USED IN THIS COMPILATION. LINE NUMBER DATE MODIFIED NAME PATHNAME 0 04/17/00 1939.8 lm_log_.pl1 >udd>sm>ds>w>ml>lm_log_.pl1 266 1 08/05/86 0956.8 arg_list.incl.pl1 >ldd>incl>arg_list.incl.pl1 268 2 11/02/83 1945.0 arg_descriptor.incl.pl1 >ldd>incl>arg_descriptor.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. DMS_LOG 000000 constant char(32) initial packed unaligned dcl 238 set ref 109* 119* 132* FIFTEEN_SECOND_WAIT 000010 constant fixed bin(17,0) initial dcl 236 set ref 89* FIXED_BIN_SHORT constant fixed bin(6,0) initial packed unsigned unaligned dcl 234 ref 96 Log_ptr 000010 internal static pointer initial dcl 222 set ref 109* 119* 132* ZERO constant bit(36) initial packed unaligned dcl 232 ref 65 acct 000113 automatic char(32) packed unaligned dcl 209 set ref 73* any_other 000234 stack reference condition dcl 255 ref 63 arg_count based fixed bin(17,0) level 3 packed packed unsigned unaligned dcl 1-14 ref 79 96 113 162 174 186 arg_descriptor based structure level 1 dcl 2-6 arg_list based structure level 1 dcl 1-14 arg_ptrs 2 based pointer array level 2 dcl 1-14 ref 162 174 186 arglist_ptr 000124 automatic pointer dcl 210 set ref 59* 74* 79 96 113 116* 129* 162 162 174 174 186 186 186 c32 based char(32) packed unaligned dcl 184 ref 186 caller 000132 automatic char(32) packed unaligned dcl 214 set ref 102* 107 clock builtin function dcl 259 ref 84 convert_status_code_ 000030 constant entry external dcl 247 ref 106 cu_$arg_list_ptr 000026 constant entry external dcl 246 ref 74 desc_count 1 based fixed bin(17,0) level 3 packed packed unsigned unaligned dcl 1-14 ref 186 desc_ptrs based pointer array level 2 dcl 1-14 ref 96 186 dm_system_data_$log_lock 000012 external static bit(36) dcl 226 set ref 65 65* 89* 136* error_code 000131 automatic fixed bin(35,0) dcl 213 set ref 101* 104 106* error_table_$lock_wait_time_exceeded 000014 external static fixed bin(35,0) dcl 227 ref 90 error_table_$no_w_permission 000016 external static fixed bin(35,0) dcl 228 ref 90 extended_arg_type 000242 automatic fixed bin(17,0) initial dcl 2-36 set ref 2-36* fb17 based fixed bin(17,0) dcl 160 ref 162 fb35 based fixed bin(35,0) dcl 172 ref 174 formline_ 000032 constant entry external dcl 248 ref 116 129 get_default_wdir_ 000040 constant entry external dcl 251 ref 148 148 header based structure level 2 dcl 1-14 long_report 000144 automatic char(100) dcl 216 set ref 104* 106* 107 message 000175 automatic char(116) packed unaligned dcl 217 set ref 107* 109* 116 116 117* 117 119* 129 129 130* 130 132* message_len 000232 automatic fixed bin(21,0) dcl 218 set ref 115* 116* 128* 129* message_severity 000130 automatic fixed bin(17,0) dcl 212 set ref 85* 109* 119* 132* message_time 000126 automatic fixed bin(71,0) dcl 211 set ref 84* 109* 119* 132* need_to_get_arglist_ptr 000100 automatic bit(1) dcl 205 set ref 52* 58* 74 p_arg_no parameter fixed bin(17,0) dcl 171 in procedure "FIXED_BIN_35" ref 168 174 174 p_arg_no parameter fixed bin(17,0) dcl 183 in procedure "CHAR_32" ref 180 186 186 186 p_arg_no parameter fixed bin(17,0) dcl 159 in procedure "FIXED_BIN_17" ref 156 162 162 p_arglist_ptr parameter pointer dcl 200 ref 55 59 p_log_dir parameter char packed unaligned dcl 201 set ref 141 146 146* person_id 000102 automatic char(22) packed unaligned dcl 207 set ref 73* 107 117 130 project_id 000110 automatic char(9) packed unaligned dcl 208 set ref 73* 107 117 130 rtrim builtin function dcl 261 ref 107 107 set_lock_$lock 000020 constant entry external dcl 243 ref 89 set_lock_$unlock 000022 constant entry external dcl 244 ref 65 136 short_report 000142 automatic char(8) dcl 215 set ref 104* 106* size 0(12) based fixed bin(24,0) level 2 packed packed unsigned unaligned dcl 2-6 ref 186 status 000101 automatic fixed bin(35,0) dcl 206 set ref 65* 89* 90 90 136* substr builtin function dcl 260 ref 107 107 117 117 130 130 186 type 0(01) based fixed bin(6,0) level 2 packed packed unsigned unaligned dcl 2-6 ref 96 user_info_$whoami 000024 constant entry external dcl 245 ref 73 write_log_$write_log_file 000034 constant entry external dcl 249 ref 109 119 132 write_log_$write_log_test 000036 constant entry external dcl 250 ref 146 148 NAMES DECLARED BY DECLARE STATEMENT AND NEVER REFERENCED. Envptr_supplied_call_type internal static fixed bin(18,0) initial packed unsigned unaligned dcl 1-54 Interseg_call_type internal static fixed bin(18,0) initial packed unsigned unaligned dcl 1-54 Quick_call_type internal static fixed bin(18,0) initial packed unsigned unaligned dcl 1-54 arg_descriptor_ptr automatic pointer dcl 2-34 arg_list_with_envptr based structure level 1 dcl 1-42 command_name_arglist based structure level 1 dcl 1-25 extended_arg_descriptor based structure level 1 dcl 2-21 fixed_arg_descriptor based structure level 1 dcl 2-13 NAMES DECLARED BY EXPLICIT CONTEXT. CHAR_32 001054 constant entry internal dcl 180 ref 102 FIXED_BIN_17 001020 constant entry internal dcl 156 ref 85 FIXED_BIN_35 001036 constant entry internal dcl 168 ref 101 from_arg_ptr 000055 constant entry external dcl 55 lm_log_ 000041 constant entry external dcl 6 lm_log_returns 000732 constant label dcl 138 ref 68 90 set_dir 000736 constant entry external dcl 141 setup_handler 000070 constant label dcl 63 ref 53 NAME DECLARED BY CONTEXT OR IMPLICATION. addr builtin function ref 116 116 129 129 STORAGE REQUIREMENTS FOR THIS PROGRAM. Object Text Link Symbol Defs Static Start 0 0 1350 1412 1140 1360 Length 1634 1140 42 205 210 2 BLOCK NAME STACK SIZE TYPE WHY NONQUICK/WHO SHARES STACK FRAME lm_log_ 338 external procedure is an external procedure. on unit on line 63 70 on unit FIXED_BIN_17 internal procedure shares stack frame of external procedure lm_log_. FIXED_BIN_35 internal procedure shares stack frame of external procedure lm_log_. CHAR_32 internal procedure shares stack frame of external procedure lm_log_. STORAGE FOR INTERNAL STATIC VARIABLES. LOC IDENTIFIER BLOCK NAME 000010 Log_ptr lm_log_ STORAGE FOR AUTOMATIC VARIABLES. STACK FRAME LOC IDENTIFIER BLOCK NAME lm_log_ 000100 need_to_get_arglist_ptr lm_log_ 000101 status lm_log_ 000102 person_id lm_log_ 000110 project_id lm_log_ 000113 acct lm_log_ 000124 arglist_ptr lm_log_ 000126 message_time lm_log_ 000130 message_severity lm_log_ 000131 error_code lm_log_ 000132 caller lm_log_ 000142 short_report lm_log_ 000144 long_report lm_log_ 000175 message lm_log_ 000232 message_len lm_log_ 000242 extended_arg_type lm_log_ THE FOLLOWING EXTERNAL OPERATORS ARE USED BY THIS PROGRAM. alloc_char_temp cat_realloc_chars call_ext_out_desc call_ext_out return_mac tra_ext_1 enable_op shorten_stack ext_entry ext_entry_desc int_entry clock_mac THE FOLLOWING EXTERNAL ENTRIES ARE CALLED BY THIS PROGRAM. convert_status_code_ cu_$arg_list_ptr formline_ get_default_wdir_ set_lock_$lock set_lock_$unlock user_info_$whoami write_log_$write_log_file write_log_$write_log_test THE FOLLOWING EXTERNAL VARIABLES ARE USED BY THIS PROGRAM. dm_system_data_$log_lock error_table_$lock_wait_time_exceeded error_table_$no_w_permission LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC 2 36 000034 6 000040 52 000047 53 000051 55 000052 58 000063 59 000064 63 000070 65 000104 68 000117 73 000122 74 000143 79 000154 84 000161 85 000163 89 000167 90 000202 96 000210 101 000226 102 000232 104 000236 106 000246 107 000261 109 000371 113 000423 115 000427 116 000431 117 000473 119 000532 122 000564 128 000565 129 000567 130 000630 132 000667 136 000721 138 000732 141 000733 146 000752 148 000774 150 001017 156 001020 162 001022 164 001034 168 001036 174 001040 176 001052 180 001054 186 001056 190 001104 ----------------------------------------------------------- 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