COMPILATION LISTING OF SEGMENT hasp_host_operators_console Compiled by: Multics PL/I Compiler, Release 27d, of October 11, 1982 Compiled at: Honeywell LISD Phoenix, System M Compiled on: 11/18/82 1651.2 mst Thu Options: optimize map 1 /* *********************************************************** 2* * * 3* * Copyright, (C) Honeywell Information Systems Inc., 1982 * 4* * * 5* * Copyright (c) 1972 by Massachusetts Institute of * 6* * Technology and Honeywell Information Systems, Inc. * 7* * * 8* *********************************************************** */ 9 10 11 /* Command for a Multics process to communicate with a foreign HASP host as a HASP workstation's operator's console: 12* 13* Usage: hasp_host_operators_console channel {-control_args} {attach_arguments} 14* 15* where: 16* channel -- is the name of the HASP operator's channel (eg: a.h014.opr), 17* control_args -- may be either "-no_signon" or "-signon STR", and 18* attach_arguments -- are optional arguments to supply in the attach description */ 19 20 /* Created: February 1980 by G. Palter */ 21 /* Modified: 15 October 1980 by G. Palter to establish a hangup handler */ 22 /* Modified: 22 July 1981 by G. Palter to support -signon/-no_signon directly */ 23 24 25 hasp_host_operators_console: 26 hhoc: 27 procedure () options (variable); 28 29 30 dcl n_arguments fixed binary; 31 32 dcl argument character (argument_lth) unaligned based (argument_ptr); 33 dcl argument_lth fixed binary (21); 34 dcl argument_ptr pointer; 35 36 dcl tty_channel character (32); /* MCS channel for the operator's console */ 37 38 dcl 1 sri aligned like signon_record_info; 39 dcl signon_record bit (1) aligned; /* ON => caller wants a SIGNON record transmitted */ 40 dcl signon_response fixed binary (71); /* results of sending the SIGNON record */ 41 42 dcl operators_console pointer; /* -> IOCB for the console */ 43 dcl switch_name character (32); 44 dcl attach_description character (512) varying; /* attach description for operator's console */ 45 46 dcl terminal_io_record_header_lth fixed binary (21); /* needed to compute size of buffer to read from user_input */ 47 48 dcl code fixed binary (35); 49 50 dcl idx fixed binary; 51 52 dcl processing bit (1) aligned; 53 54 dcl 1 hangup_info aligned, /* structure to establish handler for hangups */ 55 2 entry entry variable, /* the procedure to call */ 56 2 data_ptr pointer, /* -> arbitrary data to pass to the procedure */ 57 2 priority fixed binary; /* IPC priority of handler */ 58 59 dcl 1 ui_status aligned, /* result of "read_status" on user_input */ 60 2 event_channel fixed binary (71), 61 2 input_available bit (1); /* ON => something is available to be read from user_input */ 62 63 dcl 1 oc_status aligned, /* result of "read_status" on operator's console channel */ 64 2 event_channel fixed binary (71), 65 2 input_available bit (1); /* ON => foreign system has something to print */ 66 67 dcl 1 event_wait_list aligned, /* for waiting for input from either user_input or host */ 68 2 n_channels fixed binary, 69 2 pad bit (36), 70 2 channels (2) fixed binary (71); 71 72 dcl 1 local_event_wait_info aligned like event_wait_info; 73 74 dcl NO_CONTROL_CHARS character (512) initial (copy (SP, 32) || substr (collate, 33) || copy (SP, 384)); 75 76 dcl NAME character (32) static options (constant) initial ("hasp_host_operators_console"); 77 dcl (MAJOR_VERSION initial (2), 78 MINOR_VERSION initial (0)) 79 fixed binary static options (constant); 80 81 dcl (UPPERCASE initial ("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 82 LOWERCASE initial ("abcdefghijklmnopqrstuvwxyz")) 83 character (26) static options (constant); 84 85 dcl (NL initial (" 86 "), 87 SP initial (" ")) 88 character (1) static options (constant); 89 90 dcl (iox_$user_input, iox_$user_output) pointer external; 91 92 dcl sys_info$max_seg_size fixed binary (19) external; 93 94 dcl (error_table_$bigarg, error_table_$invalid_state, error_table_$noarg, error_table_$out_of_sequence) 95 fixed binary (35) external; 96 97 dcl (com_err_, com_err_$suppress_name) entry () options (variable); 98 dcl convert_ipc_code_ entry (fixed binary (35)); 99 dcl cu_$arg_count entry (fixed binary, fixed binary (35)); 100 dcl cu_$arg_ptr entry (fixed binary, pointer, fixed binary (21), fixed binary (35)); 101 dcl cu_$cp entry (pointer, fixed binary (21), fixed binary (35)); 102 dcl get_temp_segment_ entry (character (*), pointer, fixed binary (35)); 103 dcl (ioa_, ioa_$nnl) entry () options (variable); 104 dcl iox_$attach_name entry (character (*), pointer, character (*), pointer, fixed binary (35)); 105 dcl iox_$destroy_iocb entry (pointer, fixed binary (35)); 106 dcl iox_$detach_iocb entry (pointer, fixed binary (35)); 107 dcl iox_$close entry (pointer, fixed binary (35)); 108 dcl iox_$control entry (pointer, character (*), pointer, fixed binary (35)); 109 dcl iox_$get_line entry (pointer, pointer, fixed binary (24), fixed binary (24), fixed binary (35)); 110 dcl iox_$open entry (pointer, fixed binary, bit (1) aligned, fixed binary (35)); 111 dcl iox_$put_chars entry (pointer, pointer, fixed binary (24), fixed binary (35)); 112 dcl iox_$read_record entry (pointer, pointer, fixed binary (24), fixed binary (24), fixed binary (35)); 113 dcl iox_$write_record entry (pointer, pointer, fixed binary (24), fixed binary (35)); 114 dcl ipc_$block entry (pointer, pointer, fixed binary (35)); 115 dcl ipc_$create_ev_chn entry (fixed binary (71), fixed binary (35)); 116 dcl ipc_$delete_ev_chn entry (fixed binary (71), fixed binary (35)); 117 dcl release_temp_segment_ entry (character (*), pointer, fixed binary (35)); 118 dcl requote_string_ entry (character (*)) returns (character (*)); 119 dcl unique_chars_ entry (bit (*)) returns (character (15)); 120 121 dcl (addr, binary, codeptr, collate, copy, currentsize, length, min, null, rel, rtrim, substr, string, translate, unspec) 122 builtin; 123 124 dcl (cleanup, hhoc_hangup_, program_interrupt) condition; 125 1 1 /* BEGIN INCLUDE FILE ... terminal_io_record.incl.pl1 */ 1 2 /* Created: November 1979 by G. Palter */ 1 3 /* Modified: 26 March 1982 by G. Palter to make the structure more compatible with use of the like attribute */ 1 4 1 5 1 6 /* Record format used by I/O modules designed for communcation with remote I/O daemon stations */ 1 7 1 8 dcl 1 terminal_io_record aligned based (terminal_io_record_ptr), 1 9 2 header, 1 10 3 version fixed binary, 1 11 3 device_type fixed binary, /* type of device sending/receiving this record -- 1 12* reader/printer/punch/teleprinter */ 1 13 3 slew_control, /* slew control data: used for printer and teleprinter only */ 1 14 4 slew_type fixed binary (18) unaligned unsigned, /* type of slewing operation before/after this line -- 1 15* by-count/top-of-form/inside-page/outside-page/to-channel */ 1 16 4 slew_count fixed binary (18) unaligned unsigned,/* # of lines if by count; channel # if to channel */ 1 17 3 flags, 1 18 4 binary bit (1) unaligned, /* ON => data in record should be written in binary mode */ 1 19 4 preslew bit (1) unaligned, /* ON => perform above slew before printing data; 1 20* OFF => perform above slew after printing data */ 1 21 4 pad bit (34) unaligned, 1 22 3 element_size fixed binary, /* # of bits in a data element */ 1 23 3 n_elements fixed binary (24), /* # of elements in the record */ 1 24 2 data, /* force word alignment */ 1 25 3 bits (terminal_io_record_n_elements refer (terminal_io_record.n_elements)) 1 26 bit (terminal_io_record_element_size refer (terminal_io_record.element_size)) unaligned; 1 27 1 28 dcl terminal_io_record_ptr pointer; 1 29 1 30 dcl terminal_io_record_element_size fixed binary; /* used for allocating terminal_io_record structures */ 1 31 dcl terminal_io_record_n_elements fixed binary (24); 1 32 1 33 1 34 /* Manifest constants */ 1 35 1 36 dcl terminal_io_record_version_1 fixed binary static options (constant) initial (1); 1 37 1 38 dcl (TELEPRINTER_DEVICE initial (1), 1 39 READER_DEVICE initial (2), 1 40 PRINTER_DEVICE initial (3), 1 41 PUNCH_DEVICE initial (4)) 1 42 fixed binary static options (constant); 1 43 1 44 dcl (SLEW_BY_COUNT initial (1), 1 45 SLEW_TO_TOP_OF_PAGE initial (2), 1 46 SLEW_TO_INSIDE_PAGE initial (3), /* skip to top of next inside page (head sheet) */ 1 47 SLEW_TO_OUTSIDE_PAGE initial (4), /* skip to top of next outside page (tail sheet) */ 1 48 SLEW_TO_CHANNEL initial (5)) /* skip to specified channel stop */ 1 49 fixed binary static options (constant); 1 50 1 51 1 52 /* Data in record as a character string (terminal_io_record.element_size = 9) */ 1 53 1 54 dcl terminal_io_record_data_chars character (terminal_io_record.n_elements) unaligned 1 55 based (addr (terminal_io_record.bits)); 1 56 1 57 dcl terminal_io_record_data_chars_varying_max_len fixed binary (21); /* Set this before using the varying string. */ 1 58 dcl terminal_io_record_data_chars_varying character (terminal_io_record_data_chars_varying_max_len) varying 1 59 based (addr (terminal_io_record.n_elements)); /* varying string consists of length and data */ 1 60 1 61 1 62 /* Data in record as a bit string (terminal_io_record.element_size = 1) */ 1 63 1 64 dcl terminal_io_record_data_bits bit (terminal_io_record.n_elements) unaligned based (addr (terminal_io_record.bits)); 1 65 1 66 /* END INCLUDE FILE ... terminal_io_record.incl.pl1 */ 126 127 2 1 /* BEGIN INCLUDE FILE ... hasp_signon_record_info.incl.pl1 */ 2 2 /* Created: July 1981 by G. Palter */ 2 3 2 4 /* Structure used by the signon_record control order of a HASP sub-channel */ 2 5 2 6 dcl 1 signon_record_info aligned based (signon_record_info_ptr), 2 7 2 version fixed binary, 2 8 2 pad bit (36), 2 9 2 event_channel fixed binary (71), /* IPC wait channel over which success/failure is signalled */ 2 10 2 record character (80) unaligned; /* actual record: hasp_host_ does necessary translations */ 2 11 2 12 dcl signon_record_info_ptr pointer; 2 13 2 14 dcl SIGNON_RECORD_INFO_VERSION_1 fixed binary static options (constant) initial (1); 2 15 2 16 2 17 /* Possible results of transmitting the SIGNON record: returned as the event message signalled by the multiplexer on the 2 18* supplied IPC event-wait channel */ 2 19 2 20 dcl (HASP_SIGNON_OK initial (1), /* remote system accepted the SIGNON record */ 2 21 HASP_SIGNON_REJECTED initial (2), /* remote system rejected it but allows a retry */ 2 22 HASP_SIGNON_HANGUP initial (3)) /* remote system rejected it and disconnected the line */ 2 23 fixed binary (71) static options (constant); 2 24 2 25 /* END INCLUDE FILE ... hasp_signon_record_info.incl.pl1 */ 128 129 3 1 /* Begin include file ..... iox_modes.incl.pl1 */ 3 2 3 3 /* Written by C. D. Tavares, 03/17/75 */ 3 4 /* Updated 10/31/77 by CDT to include short iox mode strings */ 3 5 3 6 dcl iox_modes (13) char (24) int static options (constant) aligned initial 3 7 ("stream_input", "stream_output", "stream_input_output", 3 8 "sequential_input", "sequential_output", "sequential_input_output", "sequential_update", 3 9 "keyed_sequential_input", "keyed_sequential_output", "keyed_sequential_update", 3 10 "direct_input", "direct_output", "direct_update"); 3 11 3 12 dcl short_iox_modes (13) char (4) int static options (constant) aligned initial 3 13 ("si", "so", "sio", "sqi", "sqo", "sqio", "squ", "ksqi", "ksqo", "ksqu", "di", "do", "du"); 3 14 3 15 dcl (Stream_input initial (1), 3 16 Stream_output initial (2), 3 17 Stream_input_output initial (3), 3 18 Sequential_input initial (4), 3 19 Sequential_output initial (5), 3 20 Sequential_input_output initial (6), 3 21 Sequential_update initial (7), 3 22 Keyed_sequential_input initial (8), 3 23 Keyed_sequential_output initial (9), 3 24 Keyed_sequential_update initial (10), 3 25 Direct_input initial (11), 3 26 Direct_output initial (12), 3 27 Direct_update initial (13)) fixed bin int static options (constant); 3 28 3 29 /* End include file ..... iox_modes.incl.pl1 */ 130 131 4 1 /* BEGIN INCLUDE FILE event_wait_info.incl.pl1 */ 4 2 4 3 /* T. Casey, May 1978 */ 4 4 4 5 dcl event_wait_info_ptr ptr; 4 6 4 7 dcl 1 event_wait_info aligned based (event_wait_info_ptr), /* argument structure filled in on return from ipc_$block */ 4 8 2 channel_id fixed bin (71), /* event channel on which wakeup occurred */ 4 9 2 message fixed bin (71), /* 72 bits of information passed by sender of wakeup */ 4 10 2 sender bit (36), /* process id of sender */ 4 11 2 origin, 4 12 3 dev_signal bit (18) unaligned, /* "1"b if device signal */ 4 13 3 ring fixed bin (17) unaligned, /* ring from which sent */ 4 14 2 channel_index fixed bin; /* index of this channel in the event wait list */ 4 15 4 16 /* END INCLUDE FILE event_wait_info.incl.pl1 */ 132 133 134 call cu_$arg_count (n_arguments, code); 135 if code ^= 0 then do; /* not invoked as command */ 136 call com_err_ (code, NAME); 137 return; 138 end; 139 140 if n_arguments = 0 then do; 141 call com_err_$suppress_name (0, NAME, 142 "Usage: hasp_host_operators_console tty_channel {-control_args} {attach_arguments}"); 143 return; 144 end; 145 146 signon_record = "0"b; /* assume caller doesn't want to send a SIGNON record */ 147 148 call cu_$arg_ptr (1, argument_ptr, argument_lth, (0)); 149 150 if index (argument, "-") = 1 then do; 151 call com_err_ (0, NAME, 152 "First argument must be a channel name; not the control argument ""^a"".", 153 argument); 154 return; 155 end; 156 157 if argument_lth > length (tty_channel) then do; 158 call com_err_ (error_table_$bigarg, NAME, "Channel name must be 32 characters or less; not ""^a"".", 159 tty_channel); 160 return; 161 end; 162 163 tty_channel = argument; 164 165 attach_description = "hasp_host_ -comm hasp -tty "; 166 attach_description = attach_description || requote_string_ (rtrim (tty_channel)); 167 attach_description = attach_description || " -device teleprinter"; 168 169 170 /* Process optional arguments: -signon/-no_signon may be freely intermixed with the attach options (if any) */ 171 172 do idx = 2 to n_arguments; 173 174 call cu_$arg_ptr (idx, argument_ptr, argument_lth, (0)); 175 176 if (argument = "-no_signon") then /* caller doesn't want a SIGNON record sent */ 177 signon_record = "0"b; 178 179 else if (argument = "-signon") 180 then do; /* caller supplies a SIGNON record */ 181 if idx = n_arguments then do; 182 call com_err_ (error_table_$noarg, NAME, "Character string after ""-signon""."); 183 return; 184 end; 185 idx = idx + 1; /* move on to next the argument */ 186 call cu_$arg_ptr (idx, argument_ptr, argument_lth, (0)); 187 if argument_lth > length (sri.record) then do; 188 call com_err_ (error_table_$bigarg, NAME, 189 "SIGNON record can not be longer than ^d characters; not ""^a"".", 190 length (sri.record), argument); 191 return; 192 end; 193 sri.record = argument; 194 signon_record = "1"b; /* now will send a SIGNON record */ 195 end; 196 197 else do; /* anything else goes into the attach description */ 198 attach_description = attach_description || " "; 199 attach_description = attach_description || requote_string_ (argument); 200 end; 201 end; 202 203 204 /* Attach the operator's console */ 205 206 operators_console, /* for cleanup handler */ 207 terminal_io_record_ptr = null (); 208 sri.event_channel = -1; 209 210 on condition (cleanup) 211 call release_console (); 212 213 call get_temp_segment_ (NAME, terminal_io_record_ptr, code); 214 if code ^= 0 then do; 215 call com_err_ (code, NAME, "Obtaining buffer space."); 216 return; 217 end; 218 219 terminal_io_record_header_lth = 4 * binary (rel (addr (terminal_io_record.data)), 18, 0); 220 221 terminal_io_record.version = terminal_io_record_version_1; 222 terminal_io_record.device_type = TELEPRINTER_DEVICE; 223 terminal_io_record.slew_type = SLEW_BY_COUNT; 224 terminal_io_record.slew_count = 1; 225 string (terminal_io_record.flags) = ""b; 226 terminal_io_record.element_size = 9; 227 228 switch_name = substr (tty_channel, 1, min (length (rtrim (tty_channel)), 16)) || "." || unique_chars_ (""b); 229 230 call iox_$attach_name (switch_name, operators_console, (attach_description), codeptr (hasp_host_operators_console), code); 231 if code ^= 0 then do; 232 call com_err_ (code, NAME, "^/^-Attaching ^a using attach description: ^a", switch_name, 233 attach_description); 234 go to RETURN_FROM_COMMAND; 235 end; 236 237 call iox_$open (operators_console, Sequential_input_output, "0"b, code); 238 if code ^= 0 then do; 239 call com_err_ (code, NAME, "Opening ^a (channel ^a) for sequential input/output.", switch_name, 240 tty_channel); 241 go to RETURN_FROM_COMMAND; 242 end; 243 244 245 /* Validate the caller specified SIGNON processing: transmits the SIGNON record if need be */ 246 247 if signon_record 248 then do; /* send the SIGNON */ 249 call ioa_ ("Sending the SIGNON record: ^a", translate (sri.record, UPPERCASE, LOWERCASE)); 250 sri.version = SIGNON_RECORD_INFO_VERSION_1; 251 call ipc_$create_ev_chn (sri.event_channel, code); 252 if code ^= 0 then call convert_ipc_code_ (code); 253 if code ^= 0 then do; 254 call com_err_ (code, NAME, "Creating event channel for SIGNON record control order."); 255 go to RETURN_FROM_COMMAND; 256 end; 257 sri.pad = ""b; 258 call iox_$control (operators_console, "signon_record", addr (sri), code); 259 if (code = 0) 260 then do; /* multiplexer accepted the call: wait for response */ 261 event_wait_list.n_channels = 1; 262 event_wait_list.channels (1) = sri.event_channel; 263 RETRY_WAIT_FOR_RESPONSE: 264 call ipc_$block (addr (event_wait_list), addr (local_event_wait_info), code); 265 if code ^= 0 then call convert_ipc_code_ (code); 266 if code ^= 0 then do; 267 call com_err_ (code, NAME, "Blocking to await response to SIGNON record control order."); 268 go to RETURN_FROM_COMMAND; 269 end; 270 if local_event_wait_info.ring ^= 0 then do; 271 call com_err_ (0, NAME, 272 "Ignoring extraneous wakeup while waiting for response to SIGNON record control order."); 273 go to RETRY_WAIT_FOR_RESPONSE; 274 end; 275 signon_response = local_event_wait_info.message; 276 if (signon_response = HASP_SIGNON_OK) then 277 call ioa_$nnl ("SIGNON record accepted... "); 278 else if (signon_response = HASP_SIGNON_REJECTED) | (signon_response = HASP_SIGNON_HANGUP) 279 then do; /* foreign system didn't like what we sent */ 280 call com_err_ (0, NAME, 281 "Foreign system rejected SIGNON record^; ^[ please retry^;foreign system has disconnected^].", 282 (signon_response = HASP_SIGNON_REJECTED)); 283 go to RETURN_FROM_COMMAND; 284 end; 285 else do; /* unknown response */ 286 call com_err_ (0, NAME, "Unknown reponse to SIGNON control record order: ^d", signon_response); 287 go to RETURN_FROM_COMMAND; 288 end; 289 end; 290 else if (code = error_table_$out_of_sequence) 291 then do; /* SIGNON record was sent once before... */ 292 call com_err_ (0, NAME, 293 "A SIGNON record was previously transmitted to this remote system."); 294 call ioa_$nnl ("SIGNON record ignored... "); 295 end; /* ... but that's not fatal */ 296 else do; /* multiplexer rejected the control order: explain why */ 297 if (code = error_table_$invalid_state) then 298 call com_err_ (0, NAME, "Local multiplexer is not configured to transmit a SIGNON record."); 299 else call com_err_ (code, NAME, "Requesting SIGNON record transmission."); 300 go to RETURN_FROM_COMMAND; 301 end; 302 end; 303 304 else do; /* caller doesn't want a SIGNON record transmitted */ 305 call iox_$control (operators_console, "no_signon_record", null (), code); 306 if code ^= 0 then do; /* ... but the multiplexer doesn't like that */ 307 if (code = error_table_$invalid_state) then 308 call com_err_ (0, NAME, "Local multiplexer is configured to transmit a SIGNON record."); 309 else call com_err_ (code, NAME, "Validating that no SIGNON record need be transmitted."); 310 go to RETURN_FROM_COMMAND; 311 end; 312 end; 313 314 315 /* Establish a handler for hangup to terminate the command */ 316 317 hangup_info.entry = hhoc_hangup_handler_; 318 hangup_info.data_ptr = null (); 319 hangup_info.priority = 1; 320 321 call iox_$control (operators_console, "hangup_proc", addr (hangup_info), code); 322 if code ^= 0 then do; 323 call com_err_ (code, NAME, "Attempting to establish hangup handler for ^a (channel ^a)", switch_name, 324 tty_channel); 325 go to RETURN_FROM_COMMAND; 326 end; 327 328 on condition (hhoc_hangup_) 329 begin; /* signaled when a hangup occurs */ 330 call com_err_ (0, NAME, "Hangup detected on channel ^a.", tty_channel); 331 go to RETURN_FROM_COMMAND; 332 end; 333 334 335 /* Main processing loop */ 336 337 call ioa_ ("Input:"); 338 339 processing = "1"b; 340 341 on condition (program_interrupt) 342 go to CONTINUE_TO_READ_FROM_SWITCHES; 343 344 do while (processing); 345 346 CONTINUE_TO_READ_FROM_SWITCHES: 347 call iox_$control (iox_$user_input, "read_status", addr (ui_status), code); 348 if code ^= 0 then do; 349 call com_err_ (code, NAME, "Performing ""read_status"" on user_input."); 350 go to RETURN_FROM_COMMAND; 351 end; 352 353 call iox_$control (operators_console, "read_status", addr (oc_status), code); 354 if code ^= 0 then do; 355 call com_err_ (code, NAME, "Performing ""read_status"" on channel ^a.", tty_channel); 356 go to RETURN_FROM_COMMAND; 357 end; 358 359 if ui_status.input_available then do; /* process input (if any) */ 360 call iox_$get_line (iox_$user_input, addr (terminal_io_record.data), 361 (4 * sys_info$max_seg_size - terminal_io_record_header_lth), 362 terminal_io_record.n_elements, code); 363 if code ^= 0 then do; 364 call com_err_ (code, NAME, "Reading from user_input."); 365 go to RETURN_FROM_COMMAND; 366 end; 367 terminal_io_record.n_elements = terminal_io_record.n_elements - 1; /* ignore the newline */ 368 if terminal_io_record.n_elements > 0 then 369 if (substr (terminal_io_record_data_chars, 1, 1) = "!") then 370 call interpret_escape_request (); /* user requests to do something special */ 371 terminal_io_record_data_chars = translate (terminal_io_record_data_chars, NO_CONTROL_CHARS); 372 /* convert control characters and non-ASCII to spaces */ 373 call iox_$write_record (operators_console, terminal_io_record_ptr, 374 (4 * currentsize (terminal_io_record)), code); 375 if code ^= 0 then do; 376 call com_err_ (code, NAME, "Writing to channel ^a.", tty_channel); 377 go to RETURN_FROM_COMMAND; 378 end; 379 end; 380 381 CHECK_FOR_FOREIGN_MESSAGES: 382 if oc_status.input_available then do; /* process messages from foreign host */ 383 call iox_$read_record (operators_console, terminal_io_record_ptr, (4 * sys_info$max_seg_size), (0), 384 code); 385 if code ^= 0 then do; 386 call com_err_ (code, NAME, "Reading from channel ^a.", tty_channel); 387 go to RETURN_FROM_COMMAND; 388 end; 389 call iox_$put_chars (iox_$user_output, addr (terminal_io_record.data), terminal_io_record.n_elements, (0)); 390 call iox_$put_chars (iox_$user_output, addr (NL), length (NL), (0)); 391 end; 392 393 if ^ui_status.input_available & ^oc_status.input_available 394 then do; /* no input from anywhere right now: wait for some */ 395 event_wait_list.n_channels = 2; 396 event_wait_list.channels (1) = ui_status.event_channel; 397 event_wait_list.channels (2) = oc_status.event_channel; 398 call ipc_$block (addr (event_wait_list), addr (local_event_wait_info), code); 399 if code ^= 0 then call convert_ipc_code_ (code); 400 if code ^= 0 then do; 401 call com_err_ (code, NAME, "Attempting to wait for input from user_input or ^a.", 402 tty_channel); 403 go to RETURN_FROM_COMMAND; 404 end; 405 end; 406 end; 407 408 RETURN_FROM_COMMAND: 409 call release_console (); 410 return; 411 412 413 414 /* Invoked when the operator's console channel hangs up: abort the command */ 415 416 hhoc_hangup_handler_: 417 entry (); 418 419 signal condition (hhoc_hangup_); 420 421 return; /* shouldn't get here... */ 422 423 /* Interpret escape requests: Currently, the only defined escape requests are -- 424* 425* !e command_line -- execute the given Multics command line, 426* !..command_line -- execute the given Multics command line, 427* !. -- identify this program and the channel being used, or 428* !quit -- disconnect the channel and return to Multics command level */ 429 430 interpret_escape_request: 431 procedure (); 432 433 if terminal_io_record.n_elements < 2 then do; /* must have more than just "!" */ 434 call com_err_ (0, NAME, "No request supplied after ""!""."); 435 go to CHECK_FOR_FOREIGN_MESSAGES; 436 end; 437 438 if (substr (terminal_io_record_data_chars, 2, 2) = "e ") | 439 (substr (terminal_io_record_data_chars, 2, 2) = "..") 440 then call cu_$cp (addr (terminal_io_record.data.bits (4)), (terminal_io_record.n_elements - 3), (0)); 441 442 else if (terminal_io_record.n_elements = 2) & (terminal_io_record_data_chars = "!.") 443 then call ioa_ ("^a version ^d.^d; connected to channel ^a.", NAME, MAJOR_VERSION, MINOR_VERSION, 444 tty_channel); 445 446 else if (terminal_io_record.n_elements = length ("!quit")) & (terminal_io_record_data_chars = "!quit") 447 then go to RETURN_FROM_COMMAND; /* WARNING: this method can lose messages from host */ 448 449 else call com_err_ (0, NAME, "Unrecognized request line: ^a", terminal_io_record_data_chars); 450 451 go to CHECK_FOR_FOREIGN_MESSAGES; 452 453 end interpret_escape_request; 454 455 /* Release operator's console (if attached) and perform other necessary cleanup */ 456 457 release_console: 458 procedure (); 459 460 if terminal_io_record_ptr ^= null () then do; 461 call release_temp_segment_ (NAME, terminal_io_record_ptr, (0)); 462 terminal_io_record_ptr = null (); 463 end; 464 465 if operators_console ^= null () then do; /* have the I/O switch */ 466 call iox_$close (operators_console, (0)); 467 call iox_$detach_iocb (operators_console, (0)); 468 call iox_$destroy_iocb (operators_console, (0)); 469 operators_console = null (); 470 end; 471 472 if sri.event_channel ^= -1 then do; /* created an IPC channel for SIGNON records */ 473 call ipc_$delete_ev_chn (sri.event_channel, (0)); 474 sri.event_channel = -1; 475 end; 476 477 return; 478 479 end release_console; 480 481 end hasp_host_operators_console; SOURCE FILES USED IN THIS COMPILATION. LINE NUMBER DATE MODIFIED NAME PATHNAME 0 11/18/82 1629.5 hasp_host_operators_console.pl1 >dumps>old>recomp>hasp_host_operators_console.pl1 126 1 11/12/82 1624.8 terminal_io_record.incl.pl1 >ldd>include>terminal_io_record.incl.pl1 128 2 03/27/82 0429.7 hasp_signon_record_info.incl.pl1 >ldd>include>hasp_signon_record_info.incl.pl1 130 3 02/02/78 1229.7 iox_modes.incl.pl1 >ldd>include>iox_modes.incl.pl1 132 4 06/29/79 1727.8 event_wait_info.incl.pl1 >ldd>include>event_wait_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. HASP_SIGNON_HANGUP 000000 constant fixed bin(71,0) initial dcl 2-20 ref 278 HASP_SIGNON_OK 000004 constant fixed bin(71,0) initial dcl 2-20 ref 276 HASP_SIGNON_REJECTED 000002 constant fixed bin(71,0) initial dcl 2-20 ref 278 280 LOWERCASE 000007 constant char(26) initial unaligned dcl 81 ref 249 249 MAJOR_VERSION 000113 constant fixed bin(17,0) initial dcl 77 set ref 442* MINOR_VERSION 000110 constant fixed bin(17,0) initial dcl 77 set ref 442* NAME 000025 constant char(32) initial unaligned dcl 76 set ref 136* 141* 151* 158* 182* 188* 213* 215* 232* 239* 254* 267* 271* 280* 286* 292* 297* 299* 307* 309* 323* 330* 349* 355* 364* 376* 386* 401* 434* 442* 449* 461* NL 000006 constant char(1) initial unaligned dcl 85 set ref 390 390 390 390 NO_CONTROL_CHARS 000425 automatic char(512) initial unaligned dcl 74 set ref 74* 371 SIGNON_RECORD_INFO_VERSION_1 constant fixed bin(17,0) initial dcl 2-14 ref 250 SLEW_BY_COUNT constant fixed bin(17,0) initial dcl 1-44 ref 223 SP constant char(1) initial unaligned dcl 85 ref 74 74 Sequential_input_output 000111 constant fixed bin(17,0) initial dcl 3-15 set ref 237* TELEPRINTER_DEVICE constant fixed bin(17,0) initial dcl 1-38 ref 222 UPPERCASE 000016 constant char(26) initial unaligned dcl 81 ref 249 249 addr builtin function dcl 121 ref 219 258 258 263 263 263 263 321 321 346 346 353 353 360 360 368 371 371 389 389 390 390 398 398 398 398 438 438 438 438 442 446 449 argument based char unaligned dcl 32 set ref 150 151* 163 176 179 188* 193 199* argument_lth 000101 automatic fixed bin(21,0) dcl 33 set ref 148* 150 151 151 157 163 174* 176 179 186* 187 188 188 193 199 199 argument_ptr 000102 automatic pointer dcl 34 set ref 148* 150 151 163 174* 176 179 186* 188 193 199 attach_description 000162 automatic varying char(512) dcl 44 set ref 165* 166* 166 167* 167 198* 198 199* 199 230 232* binary builtin function dcl 121 ref 219 bits 6 based bit array level 3 packed unaligned dcl 1-8 set ref 368 371 371 438 438 438 438 442 446 449 channels 2 000410 automatic fixed bin(71,0) array level 2 dcl 67 set ref 262* 396* 397* cleanup 000626 stack reference condition dcl 124 ref 210 code 000364 automatic fixed bin(35,0) dcl 48 set ref 134* 135 136* 213* 214 215* 230* 231 232* 237* 238 239* 251* 252 252* 253 254* 258* 259 263* 265 265* 266 267* 290 297 299* 305* 306 307 309* 321* 322 323* 346* 348 349* 353* 354 355* 360* 363 364* 373* 375 376* 383* 385 386* 398* 399 399* 400 401* codeptr builtin function dcl 121 ref 230 230 collate builtin function dcl 121 ref 74 com_err_ 000026 constant entry external dcl 97 ref 136 151 158 182 188 215 232 239 254 267 271 280 286 292 297 299 307 309 323 330 349 355 364 376 386 401 434 449 com_err_$suppress_name 000030 constant entry external dcl 97 ref 141 convert_ipc_code_ 000032 constant entry external dcl 98 ref 252 265 399 copy builtin function dcl 121 ref 74 74 cu_$arg_count 000034 constant entry external dcl 99 ref 134 cu_$arg_ptr 000036 constant entry external dcl 100 ref 148 174 186 cu_$cp 000040 constant entry external dcl 101 ref 438 currentsize builtin function dcl 121 ref 373 data 6 based structure level 2 dcl 1-8 set ref 219 360 360 389 389 data_ptr 4 000370 automatic pointer level 2 dcl 54 set ref 318* device_type 1 based fixed bin(17,0) level 3 dcl 1-8 set ref 222* element_size 4 based fixed bin(17,0) level 3 dcl 1-8 set ref 226* 368 371 371 373 438 438 438 438 438 438 438 438 442 446 449 entry 000370 automatic entry variable level 2 dcl 54 set ref 317* error_table_$bigarg 000016 external static fixed bin(35,0) dcl 94 set ref 158* 188* error_table_$invalid_state 000020 external static fixed bin(35,0) dcl 94 ref 297 307 error_table_$noarg 000022 external static fixed bin(35,0) dcl 94 set ref 182* error_table_$out_of_sequence 000024 external static fixed bin(35,0) dcl 94 ref 290 event_channel 2 000114 automatic fixed bin(71,0) level 2 in structure "sri" dcl 38 in procedure "hhoc" set ref 208* 251* 262 472 473* 474* event_channel 000404 automatic fixed bin(71,0) level 2 in structure "oc_status" dcl 63 in procedure "hhoc" set ref 397 event_channel 000400 automatic fixed bin(71,0) level 2 in structure "ui_status" dcl 59 in procedure "hhoc" set ref 396 event_wait_info based structure level 1 dcl 4-7 event_wait_list 000410 automatic structure level 1 dcl 67 set ref 263 263 398 398 flags 3 based structure level 3 dcl 1-8 set ref 225* get_temp_segment_ 000042 constant entry external dcl 102 ref 213 hangup_info 000370 automatic structure level 1 dcl 54 set ref 321 321 header based structure level 2 dcl 1-8 hhoc_hangup_ 000634 stack reference condition dcl 124 ref 328 419 idx 000365 automatic fixed bin(17,0) dcl 50 set ref 172* 174* 181 185* 185 186* input_available 2 000400 automatic bit(1) level 2 in structure "ui_status" dcl 59 in procedure "hhoc" set ref 359 393 input_available 2 000404 automatic bit(1) level 2 in structure "oc_status" dcl 63 in procedure "hhoc" set ref 381 393 ioa_ 000044 constant entry external dcl 103 ref 249 337 442 ioa_$nnl 000046 constant entry external dcl 103 ref 276 294 iox_$attach_name 000050 constant entry external dcl 104 ref 230 iox_$close 000056 constant entry external dcl 107 ref 466 iox_$control 000060 constant entry external dcl 108 ref 258 305 321 346 353 iox_$destroy_iocb 000052 constant entry external dcl 105 ref 468 iox_$detach_iocb 000054 constant entry external dcl 106 ref 467 iox_$get_line 000062 constant entry external dcl 109 ref 360 iox_$open 000064 constant entry external dcl 110 ref 237 iox_$put_chars 000066 constant entry external dcl 111 ref 389 390 iox_$read_record 000070 constant entry external dcl 112 ref 383 iox_$user_input 000010 external static pointer dcl 90 set ref 346* 360* iox_$user_output 000012 external static pointer dcl 90 set ref 389* 390* iox_$write_record 000072 constant entry external dcl 113 ref 373 ipc_$block 000074 constant entry external dcl 114 ref 263 398 ipc_$create_ev_chn 000076 constant entry external dcl 115 ref 251 ipc_$delete_ev_chn 000100 constant entry external dcl 116 ref 473 length builtin function dcl 121 ref 157 187 188 188 228 390 390 446 local_event_wait_info 000416 automatic structure level 1 dcl 72 set ref 263 263 398 398 message 2 000416 automatic fixed bin(71,0) level 2 dcl 72 set ref 275 min builtin function dcl 121 ref 228 n_arguments 000100 automatic fixed bin(17,0) dcl 30 set ref 134* 140 172 181 n_channels 000410 automatic fixed bin(17,0) level 2 dcl 67 set ref 261* 395* n_elements 5 based fixed bin(24,0) level 3 dcl 1-8 set ref 360* 367* 367 368 368 371 371 373 389* 433 438 438 438 442 442 446 446 449 449 null builtin function dcl 121 ref 206 305 305 318 460 462 465 469 oc_status 000404 automatic structure level 1 dcl 63 set ref 353 353 operators_console 000150 automatic pointer dcl 42 set ref 206* 230* 237* 258* 305* 321* 353* 373* 383* 465 466* 467* 468* 469* origin 5 000416 automatic structure level 2 dcl 72 pad 1 000114 automatic bit(36) level 2 dcl 38 set ref 257* priority 6 000370 automatic fixed bin(17,0) level 2 dcl 54 set ref 319* processing 000366 automatic bit(1) dcl 52 set ref 339* 344 program_interrupt 000642 stack reference condition dcl 124 ref 341 record 4 000114 automatic char(80) level 2 packed unaligned dcl 38 set ref 187 188 188 193* 249 249 rel builtin function dcl 121 ref 219 release_temp_segment_ 000102 constant entry external dcl 117 ref 461 requote_string_ 000104 constant entry external dcl 118 ref 166 199 ring 5(18) 000416 automatic fixed bin(17,0) level 3 packed unaligned dcl 72 set ref 270 rtrim builtin function dcl 121 ref 166 166 228 signon_record 000144 automatic bit(1) dcl 39 set ref 146* 176* 194* 247 signon_record_info based structure level 1 dcl 2-6 signon_response 000146 automatic fixed bin(71,0) dcl 40 set ref 275* 276 278 278 280 286* slew_control 2 based structure level 3 dcl 1-8 slew_count 2(18) based fixed bin(18,0) level 4 packed unsigned unaligned dcl 1-8 set ref 224* slew_type 2 based fixed bin(18,0) level 4 packed unsigned unaligned dcl 1-8 set ref 223* sri 000114 automatic structure level 1 dcl 38 set ref 258 258 string builtin function dcl 121 set ref 225* substr builtin function dcl 121 ref 74 228 368 438 438 switch_name 000152 automatic char(32) unaligned dcl 43 set ref 228* 230* 232* 239* 323* sys_info$max_seg_size 000014 external static fixed bin(19,0) dcl 92 ref 360 383 terminal_io_record based structure level 1 dcl 1-8 set ref 373 terminal_io_record_data_chars based char unaligned dcl 1-54 set ref 368 371* 371 438 438 442 446 449* terminal_io_record_header_lth 000363 automatic fixed bin(21,0) dcl 46 set ref 219* 360 terminal_io_record_ptr 000650 automatic pointer dcl 1-28 set ref 206* 213* 219 221 222 223 224 225 226 360 360 360 367 367 368 368 368 371 371 371 371 373* 373 383* 389 389 389 433 438 438 438 438 438 438 438 442 442 442 446 446 446 449 449 449 460 461* 462* terminal_io_record_version_1 constant fixed bin(17,0) initial dcl 1-36 ref 221 translate builtin function dcl 121 ref 249 249 371 tty_channel 000104 automatic char(32) unaligned dcl 36 set ref 157 158* 163* 166 166 228 228 239* 323* 330* 355* 376* 386* 401* 442* ui_status 000400 automatic structure level 1 dcl 59 set ref 346 346 unique_chars_ 000106 constant entry external dcl 119 ref 228 version 000114 automatic fixed bin(17,0) level 2 in structure "sri" dcl 38 in procedure "hhoc" set ref 250* version based fixed bin(17,0) level 3 in structure "terminal_io_record" dcl 1-8 in procedure "hhoc" set ref 221* NAMES DECLARED BY DECLARE STATEMENT AND NEVER REFERENCED. Direct_input internal static fixed bin(17,0) initial dcl 3-15 Direct_output internal static fixed bin(17,0) initial dcl 3-15 Direct_update internal static fixed bin(17,0) initial dcl 3-15 Keyed_sequential_input internal static fixed bin(17,0) initial dcl 3-15 Keyed_sequential_output internal static fixed bin(17,0) initial dcl 3-15 Keyed_sequential_update internal static fixed bin(17,0) initial dcl 3-15 PRINTER_DEVICE internal static fixed bin(17,0) initial dcl 1-38 PUNCH_DEVICE internal static fixed bin(17,0) initial dcl 1-38 READER_DEVICE internal static fixed bin(17,0) initial dcl 1-38 SLEW_TO_CHANNEL internal static fixed bin(17,0) initial dcl 1-44 SLEW_TO_INSIDE_PAGE internal static fixed bin(17,0) initial dcl 1-44 SLEW_TO_OUTSIDE_PAGE internal static fixed bin(17,0) initial dcl 1-44 SLEW_TO_TOP_OF_PAGE internal static fixed bin(17,0) initial dcl 1-44 Sequential_input internal static fixed bin(17,0) initial dcl 3-15 Sequential_output internal static fixed bin(17,0) initial dcl 3-15 Sequential_update internal static fixed bin(17,0) initial dcl 3-15 Stream_input internal static fixed bin(17,0) initial dcl 3-15 Stream_input_output internal static fixed bin(17,0) initial dcl 3-15 Stream_output internal static fixed bin(17,0) initial dcl 3-15 event_wait_info_ptr automatic pointer dcl 4-5 iox_modes internal static char(24) initial array dcl 3-6 short_iox_modes internal static char(4) initial array dcl 3-12 signon_record_info_ptr automatic pointer dcl 2-12 terminal_io_record_data_bits based bit unaligned dcl 1-64 terminal_io_record_data_chars_varying based varying char dcl 1-58 terminal_io_record_data_chars_varying_max_len automatic fixed bin(21,0) dcl 1-57 terminal_io_record_element_size automatic fixed bin(17,0) dcl 1-30 terminal_io_record_n_elements automatic fixed bin(24,0) dcl 1-31 unspec builtin function dcl 121 NAMES DECLARED BY EXPLICIT CONTEXT. CHECK_FOR_FOREIGN_MESSAGES 003621 constant label dcl 381 ref 435 451 CONTINUE_TO_READ_FROM_SWITCHES 003262 constant label dcl 346 ref 341 RETRY_WAIT_FOR_RESPONSE 002377 constant label dcl 263 ref 273 RETURN_FROM_COMMAND 004043 constant label dcl 408 ref 234 241 255 268 283 287 300 310 325 331 350 356 365 377 387 403 446 hasp_host_operators_console 001103 constant entry external dcl 25 ref 230 230 hhoc 001073 constant entry external dcl 25 hhoc_hangup_handler_ 004051 constant entry external dcl 416 ref 317 interpret_escape_request 004063 constant entry internal dcl 430 ref 368 release_console 004262 constant entry internal dcl 457 ref 210 408 NAME DECLARED BY CONTEXT OR IMPLICATION. index builtin function ref 150 STORAGE REQUIREMENTS FOR THIS PROGRAM. Object Text Link Symbol Defs Static Start 0 0 5242 5352 4617 5252 Length 5736 4617 110 347 423 0 BLOCK NAME STACK SIZE TYPE WHY NONQUICK/WHO SHARES STACK FRAME hhoc 620 external procedure is an external procedure. on unit on line 210 64 on unit on unit on line 328 92 on unit on unit on line 341 64 on unit interpret_escape_request internal procedure shares stack frame of external procedure hhoc. release_console 80 internal procedure is called by several nonquick procedures. STORAGE FOR AUTOMATIC VARIABLES. STACK FRAME LOC IDENTIFIER BLOCK NAME hhoc 000100 n_arguments hhoc 000101 argument_lth hhoc 000102 argument_ptr hhoc 000104 tty_channel hhoc 000114 sri hhoc 000144 signon_record hhoc 000146 signon_response hhoc 000150 operators_console hhoc 000152 switch_name hhoc 000162 attach_description hhoc 000363 terminal_io_record_header_lth hhoc 000364 code hhoc 000365 idx hhoc 000366 processing hhoc 000370 hangup_info hhoc 000400 ui_status hhoc 000404 oc_status hhoc 000410 event_wait_list hhoc 000416 local_event_wait_info hhoc 000425 NO_CONTROL_CHARS hhoc 000650 terminal_io_record_ptr hhoc THE FOLLOWING EXTERNAL OPERATORS ARE USED BY THIS PROGRAM. r_e_as alloc_cs cat_realloc_cs call_ext_out_desc call_ext_out call_int_this call_int_other return tra_ext signal enable shorten_stack ext_entry int_entry set_cs_eis translate_2 THE FOLLOWING EXTERNAL ENTRIES ARE CALLED BY THIS PROGRAM. com_err_ com_err_$suppress_name convert_ipc_code_ cu_$arg_count cu_$arg_ptr cu_$cp get_temp_segment_ ioa_ ioa_$nnl iox_$attach_name iox_$close iox_$control iox_$destroy_iocb iox_$detach_iocb iox_$get_line iox_$open iox_$put_chars iox_$read_record iox_$write_record ipc_$block ipc_$create_ev_chn ipc_$delete_ev_chn release_temp_segment_ requote_string_ unique_chars_ THE FOLLOWING EXTERNAL VARIABLES ARE USED BY THIS PROGRAM. error_table_$bigarg error_table_$invalid_state error_table_$noarg error_table_$out_of_sequence iox_$user_input iox_$user_output sys_info$max_seg_size LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC 74 001045 25 001072 134 001111 135 001123 136 001125 137 001142 140 001143 141 001145 143 001172 146 001173 148 001174 150 001214 151 001230 154 001264 157 001265 158 001270 160 001317 163 001320 165 001323 166 001330 167 001405 172 001420 174 001427 176 001445 179 001455 181 001461 182 001464 183 001510 185 001511 186 001512 187 001530 188 001533 191 001573 193 001574 194 001600 195 001602 198 001603 199 001612 200 001652 201 001653 206 001655 208 001660 210 001662 213 001704 214 001725 215 001727 216 001756 219 001757 221 001765 222 001767 223 001771 224 001773 225 001775 226 001776 228 002000 230 002057 231 002122 232 002125 234 002160 237 002161 238 002200 239 002202 241 002234 247 002235 249 002237 250 002263 251 002265 252 002276 253 002307 254 002311 255 002335 257 002336 258 002337 259 002371 261 002373 262 002375 263 002377 265 002416 266 002427 267 002431 268 002455 270 002456 271 002462 273 002507 275 002510 276 002512 278 002531 280 002535 283 002571 286 002572 287 002623 289 002624 290 002625 292 002630 294 002654 295 002670 297 002671 299 002720 300 002743 302 002744 305 002745 306 002777 307 003001 309 003031 310 003054 317 003055 318 003061 319 003063 321 003065 322 003120 323 003122 325 003154 328 003155 330 003171 331 003221 337 003224 339 003237 341 003241 344 003260 346 003262 348 003314 349 003316 350 003342 353 003343 354 003375 355 003377 356 003426 359 003427 360 003431 363 003457 364 003461 365 003510 367 003511 368 003514 371 003523 373 003537 375 003564 376 003566 377 003620 381 003621 383 003623 385 003646 386 003650 387 003702 389 003703 390 003724 393 003746 395 003752 396 003754 397 003756 398 003760 399 003777 400 004010 401 004012 403 004041 406 004042 408 004043 410 004047 416 004050 419 004057 421 004062 430 004063 433 004064 434 004070 435 004115 438 004116 442 004155 446 004217 449 004225 451 004260 457 004261 460 004267 461 004274 462 004315 465 004320 466 004324 467 004336 468 004351 469 004364 472 004367 473 004374 474 004406 477 004411 ----------------------------------------------------------- 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