COMPILATION LISTING OF SEGMENT rdm_mailbox_interface_ Compiled by: Multics PL/I Compiler, Release 32e, of September 22, 1989 Compiled at: Bull HN, Phoenix AZ, System-M Compiled on: 10/02/89 0822.9 mst Mon Options: optimize map 1 /****^ *********************************************************** 2* * * 3* * Copyright, (C) BULL HN Information Systems Inc., 1989 * 4* * * 5* * Copyright, (C) Honeywell Information Systems Inc., 1983 * 6* * * 7* *********************************************************** */ 8 9 10 11 /****^ HISTORY COMMENTS: 12* 1) change(89-04-11,Lee), approve(89-05-10,MCR8104), 13* audit(89-07-18,LZimmerman), install(89-10-02,MR12.3-1079): 14* phx18564, phx17540, phx17353, Mail 446 - added entry set_new_current_msg 15* to be used for updating the current message; it will guarantee the new 16* current message is not a deleted message; reformatting. 17* END HISTORY COMMENTS */ 18 19 20 /* format: off */ 21 22 /* Interface between the read_mail subsystem and the mail_system_ mailbox manager */ 23 24 /* Created: September 1983 by G. Palter */ 25 26 /* format: on,style4,delnl,insnl,ifthenstmt,ifthen,^indcomtxt */ 27 28 29 rdm_mailbox_interface_: 30 procedure (); 31 32 return; /* not an entrypoint */ 33 34 35 /* Parameters */ 36 37 dcl P_rdm_invocation_ptr pointer parameter; 38 dcl P_code fixed binary (35) parameter; /* open_mailbox, read_message */ 39 40 dcl P_mailbox_dirname character (*) parameter; /* open_mailbox: absolute pathname of the directory containing 41* the mailbox */ 42 dcl P_mailbox_ename character (*) parameter; /* open_mailbox: entryname of the mailbox */ 43 dcl P_open_options_ptr pointer parameter; /* open_mailbox: -> structure containing options for mail 44* system to use when opening the mailbox */ 45 46 dcl P_announce_new_messages bit (1) aligned parameter; /* read_new_messages: ON => announce how many new messages 47* were read from the mailbox */ 48 dcl P_n_new_messages fixed binary parameter; /* read_new_messages: set to the number of new messages read 49* from the mailbox */ 50 51 dcl P_message_number fixed binary parameter; /* read_message: read_mail message number for the message to 52* be read from the mailbox; 53* mark_processed, mark_processed_and_acknowledge: read_mail 54* message number of message to be marked as processed 55* (and acknowledged) */ 56 57 dcl P_message_ptr pointer parameter; /* read_message: set -> the message structure as read from the 58* mailbox */ 59 60 dcl P_delete_force bit (1) aligned parameter; /* delete_messages: ON => delete unprocessed messages without 61* asking for permission and ignore access errors */ 62 63 dcl P_error_during_expunge bit (1) aligned parameter; /* expunge_messages: set ON => an error occured while trying 64* to expunge messages in the mailbox */ 65 66 dcl P_old_current_msg fixed binary parameter; /* set_new_current_msg: specifies the message number 67* which the new current message must equal or 68* exceed */ 69 70 dcl P_new_current_msg fixed binary parameter; /* set_new_current_msg: the new current message 71* (a non-deleted message) passed back */ 72 /**** format: indcomtxt */ 73 74 /* Local copies of parameters */ 75 76 dcl n_new_messages fixed binary; 77 78 dcl message_number fixed binary; 79 80 dcl code fixed binary (35); 81 82 83 /* Remaining declarations */ 84 85 dcl 1 mdl aligned based (mdl_ptr), 86 2 n_messages fixed binary, 87 2 messages (mdl_n_messages refer (mdl.n_messages)), /* list of messages in the mailbox ... */ 88 3 message_number fixed binary, /* ... giving their read_mail message number */ 89 3 expunged bit (1) aligned; /* ... and whether or not they were just expunged */ 90 dcl mdl_ptr pointer; 91 dcl mdl_n_messages fixed binary; 92 93 dcl new_message_list_ptr pointer; 94 dcl (first_new_message_number, first_new_message_mailbox_idx) fixed binary; 95 96 dcl ok_to_delete bit (1); /* command_query_$yes_no should've used aligned... */ 97 dcl last_deleted_message fixed binary; 98 99 dcl (message_idx, idx) fixed binary; 100 dcl n_previously_expunged fixed binary; 101 102 dcl iox_$error_output pointer external; 103 104 /* format: off */ 105 dcl (emf_et_$expunged_message, error_table_$bad_index, mlsys_et_$all_messages_deleted, mlsys_et_$cant_be_deleted, 106 mlsys_et_$no_more_messages, mlsys_et_$some_messages_not_deleted) 107 fixed binary (35) external; 108 /* format: on */ 109 110 dcl command_query_$yes_no entry () options (variable); 111 dcl continue_to_signal_ entry (fixed binary (35)); 112 dcl cu_$arg_list_ptr entry () returns (pointer); 113 dcl cu_$cl entry (bit (36) aligned); 114 dcl cu_$generate_call entry (entry, pointer); 115 dcl find_condition_info_ entry (pointer, pointer, fixed binary (35)); 116 dcl ioa_ entry () options (variable); 117 dcl ioa_$ioa_switch entry () options (variable); 118 dcl mail_system_$acknowledge_message entry (pointer, fixed binary (35)); 119 dcl mail_system_$expunge_messages entry (pointer, fixed binary (35)); 120 dcl mail_system_$mark_message_for_deletion entry (pointer, fixed binary (35)); 121 dcl mail_system_$open_mailbox entry (character (*), character (*), pointer, character (8), pointer, fixed binary (35)); 122 dcl mail_system_$read_message entry (pointer, fixed binary, fixed binary (35)); 123 dcl mail_system_$read_new_messages entry (pointer, fixed binary, fixed binary, fixed binary, fixed binary (35)); 124 dcl mail_system_$unmark_message_for_deletion entry (pointer, fixed binary (35)); 125 dcl ssu_$abort_line entry () options (variable); 126 dcl ssu_$print_message entry () options (variable); 127 dcl ssu_$get_subsystem_and_request_name entry (pointer) returns (character (72) varying); 128 129 dcl sub_error_ condition; 130 131 dcl (addr, length, min, null, string) builtin; 132 133 /* Open the specified mailbox and initialize its message chains */ 134 135 open_mailbox: 136 entry (P_rdm_invocation_ptr, P_mailbox_dirname, P_mailbox_ename, P_open_options_ptr, P_code); 137 138 rdm_invocation_ptr = P_rdm_invocation_ptr; 139 140 call mail_system_$open_mailbox (P_mailbox_dirname, P_mailbox_ename, P_open_options_ptr, MAILBOX_VERSION_2, 141 rdm_invocation.mailbox_ptr, P_code); 142 if P_code ^= 0 then return; 143 144 mailbox_ptr = rdm_invocation.mailbox_ptr; 145 146 message_list_n_messages = mailbox.n_messages; 147 148 allocate message_list in (rdm_area) set (rdm_invocation.message_list_ptr); 149 do idx = 1 to message_list.n_messages; /* start with the read_mail message numbers ... */ 150 message_list.messages (idx).message_idx = idx; 151 /* ... being identical to the mail system's */ 152 string (message_list.messages (idx).flags) = ""b; 153 message_list.messages (idx).search_text_ptr = null (); 154 message_list.messages (idx).search_text_lth = 0; 155 end; 156 157 allocate all_chain in (rdm_area) set (rdm_invocation.message_chains.all); 158 all_chain.n_messages = message_list.n_messages; /* no expunged messages yet */ 159 do idx = 1 to all_chain.n_messages; 160 all_chain.messages (idx) = idx; 161 end; 162 163 allocate undeleted_chain in (rdm_area) set (rdm_invocation.message_chains.undeleted); 164 undeleted_chain.n_messages = message_list.n_messages; 165 do idx = 1 to undeleted_chain.n_messages; /* no messages have been marked for deletion */ 166 undeleted_chain.messages (idx) = idx; 167 end; 168 169 allocate deleted_chain in (rdm_area) set (rdm_invocation.message_chains.deleted); 170 deleted_chain.n_messages = 0; /* no messages have been marked for deletion */ 171 172 allocate marked_chain in (rdm_area) set (rdm_invocation.message_chains.marked); 173 marked_chain.n_messages = 0; /* haven't marked any messages yet */ 174 175 allocate marked_as_original_chain in (rdm_area) set (rdm_invocation.message_chains.marked_as_original); 176 marked_as_original_chain.n_messages = 0; /* haven't had a reply/forward request yet */ 177 178 rdm_invocation.current_message = min (1, all_chain.n_messages); 179 /* by definition the first message read is now current */ 180 181 P_code = 0; /* success */ 182 183 return; 184 185 /* Read any recently arrived messages from the mailbox and update all message chains appropriately */ 186 187 read_new_messages: 188 entry (P_rdm_invocation_ptr, P_announce_new_messages, P_n_new_messages); 189 190 rdm_invocation_ptr = P_rdm_invocation_ptr; 191 mailbox_ptr = rdm_invocation.mailbox_ptr; 192 193 first_new_message_number = message_list.n_messages + 1; 194 /* compute message number of first new message (if any) */ 195 first_new_message_mailbox_idx = mailbox.n_messages + 1; 196 /* they appear after last one presently in the mailbox */ 197 198 199 /* Read and announce the new messages (if any) */ 200 201 call mail_system_$read_new_messages (mailbox_ptr, n_new_messages, (0), (0), code); 202 if (code ^= 0) & (code ^= mlsys_et_$no_more_messages) then 203 call abort_read_new_messages (rdm_invocation.sci_ptr, code, "Unable to check for new messages in ^a.", 204 rdm_invocation.mailbox_name); 205 206 rdm_invocation.mailbox_ptr = mailbox_ptr; /* may have been changed */ 207 208 P_n_new_messages = n_new_messages; /* let the caller know */ 209 if n_new_messages = 0 then return; /* nothing to do */ 210 211 if P_announce_new_messages then /* tell the user ... */ 212 if n_new_messages = 1 then 213 call ioa_ ("A new message has arrived."); 214 else call ioa_ ("^d new messages have arrived.", n_new_messages); 215 216 217 /* Add the necessary slots to the end of read_mail's message_list */ 218 219 message_list_n_messages = message_list.n_messages + n_new_messages; 220 221 allocate message_list in (rdm_area) set (new_message_list_ptr); 222 223 do idx = 1 to message_list.n_messages; /* copy the old list */ 224 new_message_list_ptr -> message_list.messages (idx) = message_list.messages (idx); 225 end; 226 227 do idx = 1 to n_new_messages; /* add data for the new messages */ 228 message_number = first_new_message_number + (idx - 1); 229 new_message_list_ptr -> message_list.messages (message_number).message_idx = 230 first_new_message_mailbox_idx + (idx - 1); 231 string (new_message_list_ptr -> message_list.messages (message_number).flags) = ""b; 232 new_message_list_ptr -> message_list.messages (message_number).search_text_ptr = null (); 233 new_message_list_ptr -> message_list.messages (message_number).search_text_lth = 0; 234 end; 235 236 rdm_invocation.message_list_ptr = new_message_list_ptr; 237 238 239 /* Update the message chains */ 240 241 call grow_message_chain (rdm_invocation.message_chains.all); 242 do idx = 1 to n_new_messages; /* they're in the "all" chain, of course */ 243 all_chain.messages (all_chain.n_messages + idx) = first_new_message_number + (idx - 1); 244 end; 245 all_chain.n_messages = all_chain.n_messages + n_new_messages; 246 247 call grow_message_chain (rdm_invocation.message_chains.undeleted); 248 do idx = 1 to n_new_messages; /* ... and they haven't been deleted yet */ 249 undeleted_chain.messages (undeleted_chain.n_messages + idx) = first_new_message_number + (idx - 1); 250 end; 251 undeleted_chain.n_messages = undeleted_chain.n_messages + n_new_messages; 252 253 call grow_message_chain (rdm_invocation.message_chains.deleted); 254 call grow_message_chain (rdm_invocation.message_chains.marked); 255 call grow_message_chain (rdm_invocation.message_chains.marked_as_original); 256 257 if rdm_invocation.current_message = 0 then /* no current message: first one read becomes current ... */ 258 rdm_invocation.current_message = first_new_message_number; 259 260 return; 261 262 263 264 /* Expands the given message chain to insure it has enough room to list all messages now available */ 265 266 grow_message_chain: 267 procedure (p_message_chain_ptr); 268 269 dcl p_message_chain_ptr pointer parameter; 270 271 dcl (old_message_chain_ptr, new_message_chain_ptr) pointer; 272 dcl idx fixed binary; 273 274 old_message_chain_ptr = p_message_chain_ptr; 275 276 allocate message_chain in (rdm_area) set (new_message_chain_ptr); 277 278 new_message_chain_ptr -> message_chain.n_messages = old_message_chain_ptr -> message_chain.n_messages; 279 280 do idx = 1 to old_message_chain_ptr -> message_chain.n_messages; 281 new_message_chain_ptr -> message_chain.messages (idx) = 282 old_message_chain_ptr -> message_chain.messages (idx); 283 end; 284 285 p_message_chain_ptr = new_message_chain_ptr; 286 287 return; 288 289 end grow_message_chain; 290 291 292 293 /* Aborts the read_new_messages operation after printing an appropriate message: Errors during this operation can not 294* abort the request line; otherwise, it would never be possible to exit read_mail as the quit request invokes this 295* entrpyoint */ 296 297 abort_read_new_messages: 298 procedure () options (variable); 299 300 call cu_$generate_call (ssu_$print_message, cu_$arg_list_ptr ()); 301 302 if rdm_invocation.debug_mode then do; /* simulate the actions of ssu_$abort_line */ 303 call ioa_$ioa_switch (iox_$error_output, "ssu_error_: Debug mode set; calling cu_$cl."); 304 call cu_$cl (""b); 305 end; 306 307 go to RETURN_FROM_READ_NEW_MESSAGES_AFTER_ERROR; 308 309 end abort_read_new_messages; 310 311 RETURN_FROM_READ_NEW_MESSAGES_AFTER_ERROR: 312 return; 313 314 /* Read the specified message from the mailbox if it hasn't already been read */ 315 316 read_message: 317 entry (P_rdm_invocation_ptr, P_message_number, P_message_ptr, P_code); 318 319 rdm_invocation_ptr = P_rdm_invocation_ptr; 320 mailbox_ptr = rdm_invocation.mailbox_ptr; 321 322 message_number = P_message_number; 323 if (message_number < 1) | (message_number > message_list.n_messages) then do; 324 P_code = error_table_$bad_index; /* not a read_mail message number */ 325 return; 326 end; 327 328 if message_list.messages (message_number).message_idx = 0 then do; 329 P_code = emf_et_$expunged_message; 330 return; 331 end; 332 333 message_ptr = mailbox.messages (message_list.messages (message_number).message_idx).message_ptr; 334 335 if message_ptr = null () then do; /* hasn't been read yet ... */ 336 call mail_system_$read_message (mailbox_ptr, message_list.messages (message_number).message_idx, code); 337 if code = 0 then 338 message_ptr = mailbox.messages (message_list.messages (message_number).message_idx).message_ptr; 339 end; 340 else code = 0; /* have the message already */ 341 342 P_message_ptr = message_ptr; 343 P_code = code; 344 345 return; 346 347 /* Mark the specified message as having been processed: Once a message is processed by a request which causes the user to 348* "see" it in some way (eg: list, print), it is marked as processed to allow the user to delete it without being queried 349* for permission */ 350 351 mark_processed: 352 entry (P_rdm_invocation_ptr, P_message_number); 353 354 rdm_invocation_ptr = P_rdm_invocation_ptr; 355 message_number = P_message_number; 356 357 if (message_number >= 1) & (message_number <= message_list.n_messages) then 358 message_list.messages (message_number).processed = "1"b; 359 360 return; 361 362 363 364 /* Mark the specified message as processed and send an acknowledgement message if appropriate */ 365 366 mark_processed_and_acknowledge: 367 entry (P_rdm_invocation_ptr, P_message_number); 368 369 rdm_invocation_ptr = P_rdm_invocation_ptr; 370 mailbox_ptr = rdm_invocation.mailbox_ptr; 371 372 message_number = P_message_number; 373 374 if (message_number < 1) | (message_number > message_list.n_messages) then return; 375 376 message_list.messages (message_number).processed = "1"b; 377 378 if ^rdm_invocation.acknowledge then return; /* user doesn't want to acknowledge */ 379 380 if message_list.messages (message_number).message_idx ^= 0 then 381 message_ptr = mailbox.messages (message_list.messages (message_number).message_idx).message_ptr; 382 else message_ptr = null (); 383 384 if message_ptr ^= null () then /* don't bother unless it was already read ... */ 385 if message.must_be_acknowledged then /* ... but don't bother the user if it fails */ 386 call mail_system_$acknowledge_message (message_ptr, (0)); 387 388 return; 389 390 /* Delete all marked messages: Actually, the messages are only logically deleted and are not physically deleted from the 391* mailbox until the next call to the expunge_messages entrypoint below. If the delete_force parameter is not set, the 392* user will be queried for permission to deleteany unprocessed messages; if the user denies permission or the user lacks 393* access to delete any of the messages, none of the messages are deleted */ 394 395 delete_messages: 396 entry (P_rdm_invocation_ptr, P_delete_force); 397 398 rdm_invocation_ptr = P_rdm_invocation_ptr; 399 400 if ^P_delete_force then do; 401 402 /* Check that it's OK to delete all the messages */ 403 404 do message_idx = 1 to marked_chain.n_messages; 405 message_number = marked_chain.messages (message_idx); 406 407 call read_message (rdm_invocation_ptr, message_number, message_ptr, code); 408 if code ^= 0 then 409 call ssu_$abort_line (rdm_invocation.sci_ptr, code, 410 "Reading message #^d from ^a. No messages deleted.", message_number, 411 rdm_invocation.mailbox_name); 412 413 if ^message.can_be_deleted then 414 call ssu_$abort_line (rdm_invocation.sci_ptr, mlsys_et_$cant_be_deleted, 415 "Message #^d. No messages deleted.", message_number); 416 417 if ^message_list.messages (message_number).processed then do; 418 call command_query_$yes_no (ok_to_delete, 0, 419 ssu_$get_subsystem_and_request_name (rdm_invocation.sci_ptr), "", 420 "Message #^d has not been processed. OK to delete?", message_number); 421 if ^ok_to_delete then call ssu_$abort_line (rdm_invocation.sci_ptr, 0, "No messages deleted."); 422 end; 423 end; 424 end; 425 426 427 /* Perform the deletions: all errors at this point are non-fatal */ 428 429 rdm_invocation.current_message = 0; /* no current message while deleting */ 430 last_deleted_message = 0; /* we may not actually succeed in deleting anything */ 431 432 do message_idx = 1 to marked_chain.n_messages; 433 message_number = marked_chain.messages (message_idx); 434 435 call read_message (rdm_invocation_ptr, message_number, message_ptr, code); 436 if code ^= 0 then 437 call abort_deletion_of_message (rdm_invocation.sci_ptr, code, 438 "Reading message #^d from ^a. It will not be deleted.", message_number, 439 rdm_invocation.mailbox_name); 440 441 if ^message.marked_for_deletion then do; 442 message_list.messages (message_number).processed = "1"b; 443 444 call mail_system_$mark_message_for_deletion (message_ptr, code); 445 if code ^= 0 then 446 call abort_deletion_of_message (rdm_invocation.sci_ptr, code, "Message #^d will not be deleted.", 447 message_number); 448 449 call delete_message_from_chain (rdm_invocation.message_chains.undeleted, message_number); 450 call add_message_to_chain (rdm_invocation.message_chains.deleted, message_number); 451 452 last_deleted_message = message_number; /* keep track of last success */ 453 end; 454 455 DELETE_NEXT_MESSAGE: 456 end; 457 458 459 /* Set the current message to the first non-deleted message after the last deleted message */ 460 461 if undeleted_chain.n_messages <= 0 then /* just deleted the last message */ 462 if ^rdm_invocation.brief then call ioa_ ("All messages have been deleted."); 463 464 if last_deleted_message > 0 then do; 465 do message_idx = 1 to undeleted_chain.n_messages while (rdm_invocation.current_message = 0); 466 if undeleted_chain.messages (message_idx) > last_deleted_message then 467 rdm_invocation.current_message = undeleted_chain.messages (message_idx); 468 end; 469 end; 470 471 return; 472 473 474 /* sets the value of the new current message; if P_old_current_msg is a not a 475* deleted message, its value is assigned to P_new_current_msg; otherwise 476* the next non-deleted message number is assigned. There is no current 477* message (0 is assigned) if P_old_current_msg is a deleted message and no 478* more non-deleted messages follow. 479**/ 480 481 set_new_current_msg: 482 entry (P_rdm_invocation_ptr, P_old_current_msg, P_new_current_msg); 483 484 rdm_invocation_ptr = P_rdm_invocation_ptr; 485 486 /* check undeleted chain for the new current message; 487* if old current message is deleted, pass back the next 488* undeleted message number */ 489 do idx = 1 to undeleted_chain.n_messages; 490 if undeleted_chain.messages (idx) >= P_old_current_msg then do; 491 P_new_current_msg = undeleted_chain.messages (idx); 492 return; 493 end; 494 end; 495 496 /* no undeleted messages after old current message; no longer 497* a current message */ 498 P_new_current_msg = 0; 499 return; 500 501 502 503 /* Prints an explanation as to why a message could not be deleted and continues with the deletion of the remaining marked 504* messages */ 505 506 abort_deletion_of_message: 507 procedure () options (variable); 508 509 call cu_$generate_call (ssu_$print_message, cu_$arg_list_ptr ()); 510 511 if rdm_invocation.debug_mode then do; /* simulate the actions of ssu_$abort_line */ 512 call ioa_$ioa_switch (iox_$error_output, "ssu_error_: Debug mode set; calling cu_$cl."); 513 call cu_$cl (""b); 514 end; 515 516 go to DELETE_NEXT_MESSAGE; 517 518 end abort_deletion_of_message; 519 520 /* Remove the marked messages from the list of messages to be deleted by the next call to the expunge_messages entrypoint 521**/ 522 523 retrieve_messages: 524 entry (P_rdm_invocation_ptr); 525 526 rdm_invocation_ptr = P_rdm_invocation_ptr; 527 528 do message_idx = 1 to marked_chain.n_messages; 529 message_number = marked_chain.messages (message_idx); 530 531 call read_message (rdm_invocation_ptr, message_number, message_ptr, code); 532 if code ^= 0 then 533 call abort_retrieval_of_message (rdm_invocation.sci_ptr, code, 534 "Reading message #^d from ^a. It will not be retrieved.", message_number, 535 rdm_invocation.mailbox_name); 536 537 if message.marked_for_deletion then do; 538 call mail_system_$unmark_message_for_deletion (message_ptr, code); 539 if code ^= 0 then 540 call abort_retrieval_of_message (rdm_invocation.sci_ptr, code, 541 "Message #^d will not be retrieved.", message_number); 542 543 call delete_message_from_chain (rdm_invocation.message_chains.deleted, message_number); 544 call add_message_to_chain (rdm_invocation.message_chains.undeleted, message_number); 545 546 rdm_invocation.current_message = message_number; 547 end; /* last message retrieved will be current */ 548 549 RETRIEVE_NEXT_MESSAGE: 550 end; 551 552 return; 553 554 555 /* Prints an explanation as to why a message could not be retrieved and continues with the retrieval of the remaining 556* marked messages */ 557 558 abort_retrieval_of_message: 559 procedure () options (variable); 560 561 call cu_$generate_call (ssu_$print_message, cu_$arg_list_ptr ()); 562 563 if rdm_invocation.debug_mode then do; /* simulate the actions of ssu_$abort_line */ 564 call ioa_$ioa_switch (iox_$error_output, "ssu_error_: Debug mode set; calling cu_$cl."); 565 call cu_$cl (""b); 566 end; 567 568 go to RETRIEVE_NEXT_MESSAGE; 569 570 end abort_retrieval_of_message; 571 572 /* Expunge the messages marked for deletion from the mailbox and update all message chains as appropriate */ 573 574 expunge_messages: 575 entry (P_rdm_invocation_ptr, P_error_during_expunge); 576 577 rdm_invocation_ptr = P_rdm_invocation_ptr; 578 mailbox_ptr = rdm_invocation.mailbox_ptr; 579 580 P_error_during_expunge = "0"b; /* assume everything will go OK */ 581 582 if mailbox.n_deleted_messages = 0 then return; /* nothing waiting to be expunged */ 583 584 585 586 /* Construct an array parallel to the mailbox structure which lists the messages that are going to be deleted along with 587* their corresponding read_mail message numbers */ 588 589 mdl_n_messages = mailbox.n_messages; 590 591 allocate mdl in (rdm_area) set (mdl_ptr); 592 593 do message_idx = 1 to mdl.n_messages; 594 message_number = 0; 595 do idx = 1 to message_list.n_messages while (message_number = 0); 596 if message_list.messages (idx).message_idx = message_idx then message_number = idx; 597 end; 598 if message_number = 0 then 599 call abort_expunge_messages (rdm_invocation.sci_ptr, error_table_$bad_index, 600 "Unable to determine the read_mail message number for message #^d in ^a.", message_idx, 601 rdm_invocation.mailbox_name); 602 603 mdl.messages (message_idx).message_number = message_number; 604 605 message_ptr = mailbox.messages (message_idx).message_ptr; 606 if message_ptr ^= null () then /* can't be marked without having been read ... */ 607 mdl.messages (message_idx).expunged = message.marked_for_deletion; 608 else mdl.messages (message_idx).expunged = "0"b; 609 end; 610 611 612 /* Now actually delete the messages and update the above list to reflect those messages which were not deleted */ 613 614 on condition (sub_error_) 615 begin; /* in case something goes wrong while deleting */ 616 617 dcl 1 ci aligned like condition_info; 618 619 ci.version = condition_info_version_1; 620 call find_condition_info_ (null (), addr (ci), (0)); 621 622 sub_error_info_ptr = ci.info_ptr; 623 if sub_error_info.name ^= "mail_system_" then do; 624 call continue_to_signal_ ((0)); /* not being reported by the mail system */ 625 go to CONTINUE_FROM_HANDLER; 626 end; 627 628 delete_error_info_ptr = sub_error_info.info_ptr; 629 630 call ssu_$print_message (rdm_invocation.sci_ptr, delete_error_info.code, 631 "Unable to delete message #^d.^[ ^a^] Deletion of other messages continues.", 632 delete_error_info.message_number, (length (delete_error_info.additional_info) > 0), 633 delete_error_info.additional_info); 634 635 mdl.messages (delete_error_info.message_number).expunged = "0"b; 636 go to CALL_EXPUNGE_MESSAGES; 637 638 CONTINUE_FROM_HANDLER: 639 end; 640 641 CALL_EXPUNGE_MESSAGES: 642 call mail_system_$expunge_messages (mailbox_ptr, code); 643 if (code ^= 0) & (code ^= mlsys_et_$all_messages_deleted) & (code ^= mlsys_et_$some_messages_not_deleted) then 644 call abort_expunge_messages (rdm_invocation.sci_ptr, code, "Deleting messages from ^a.", 645 rdm_invocation.mailbox_name); 646 647 revert condition (sub_error_); 648 649 rdm_invocation.mailbox_ptr = mailbox_ptr; /* said structure should have been changed by the above */ 650 P_error_during_expunge = (code = mlsys_et_$some_messages_not_deleted); 651 652 653 /* Finally update the message_list structure to reflect the new mailbox message numbers and remove all expunged messages 654* from all message chains */ 655 656 n_previously_expunged = 0; /* # of messages expunged before this message */ 657 658 do message_idx = 1 to mdl.n_messages; 659 message_number = mdl.messages (message_idx).message_number; 660 if mdl.messages (message_idx).expunged then do; 661 message_list.messages (message_number).message_idx = 0; 662 call delete_message_from_chain (rdm_invocation.message_chains.all, message_number); 663 call delete_message_from_chain (rdm_invocation.message_chains.undeleted, message_number); 664 call delete_message_from_chain (rdm_invocation.message_chains.deleted, message_number); 665 call delete_message_from_chain (rdm_invocation.message_chains.marked, message_number); 666 call delete_message_from_chain (rdm_invocation.message_chains.marked_as_original, message_number); 667 n_previously_expunged = n_previously_expunged + 1; 668 end; 669 else message_list.messages (message_number).message_idx = 670 message_list.messages (message_number).message_idx - n_previously_expunged; 671 end; 672 673 return; 674 675 676 677 /* Aborts the expunge_messages operation after printing an appropriate message */ 678 679 abort_expunge_messages: 680 procedure () options (variable); 681 682 call cu_$generate_call (ssu_$print_message, cu_$arg_list_ptr ()); 683 684 if rdm_invocation.debug_mode then do; /* simulate the actions of ssu_$abort_line */ 685 call ioa_$ioa_switch (iox_$error_output, "ssu_error_: Debug mode set; calling cu_$cl."); 686 call cu_$cl (""b); 687 end; 688 689 go to RETURN_FROM_EXPUNGE_MESSAGES_AFTER_ERROR; 690 691 end abort_expunge_messages; 692 693 RETURN_FROM_EXPUNGE_MESSAGES_AFTER_ERROR: 694 P_error_during_expunge = "1"b; /* let the caller know something's very wrong */ 695 return; 696 697 /* Adds the specified message to the given message chain */ 698 699 add_message_to_chain: 700 procedure (p_message_chain_ptr, p_message_number); 701 702 dcl p_message_chain_ptr pointer parameter; 703 dcl p_message_number fixed binary parameter; 704 705 dcl (message_idx, idx) fixed binary; 706 707 708 message_chain_ptr = p_message_chain_ptr; 709 710 do message_idx = 1 to message_chain.n_messages; 711 712 if message_chain.messages (message_idx) = p_message_number then return; 713 714 if message_chain.messages (message_idx) > p_message_number then do; 715 /*** Insert it here ... */ 716 do idx = message_chain.n_messages to message_idx by -1; 717 message_chain.messages (idx + 1) = message_chain.messages (idx); 718 end; 719 message_chain.messages (message_idx) = p_message_number; 720 message_chain.n_messages = message_chain.n_messages + 1; 721 return; 722 end; 723 end; 724 725 /*** Control arrives here iff the new message should be last on the chain */ 726 message_chain.n_messages = message_chain.n_messages + 1; 727 message_chain.messages (message_chain.n_messages) = p_message_number; 728 729 return; 730 731 end add_message_to_chain; 732 733 734 735 /* Removes the specified message from the given message chain */ 736 737 delete_message_from_chain: 738 procedure (p_message_chain_ptr, p_message_number); 739 740 dcl p_message_chain_ptr pointer parameter; 741 dcl p_message_number fixed binary parameter; 742 743 dcl (idx, jdx) fixed binary; 744 745 message_chain_ptr = p_message_chain_ptr; 746 747 do idx = message_chain.n_messages to 1 by -1; /* go backwards to avoid changing loop terminator value */ 748 if message_chain.messages (idx) = p_message_number then do; 749 do jdx = (idx + 1) to message_chain.n_messages; 750 message_chain.messages (jdx - 1) = message_chain.messages (jdx); 751 end; 752 message_chain.n_messages = message_chain.n_messages - 1; 753 end; 754 end; 755 756 return; 757 758 end delete_message_from_chain; 759 760 761 1 1 /* BEGIN INCLUDE FILE ... rdm_invocation.incl.pl1 */ 1 2 /* Created: September 1983 by G. Palter from portions of emf_info.incl.pl1 */ 1 3 1 4 /* Definition of a single invocation of read_mail */ 1 5 1 6 dcl 1 rdm_invocation aligned based (rdm_invocation_ptr), 1 7 2 type character (8), /* defines this structure as a read_mail invocation */ 1 8 2 sci_ptr pointer, /* -> subsystem utilities invocation data */ 1 9 2 area_ptr pointer, /* -> area to be used by the subsystem */ 1 10 1 11 2 mailbox_info, 1 12 3 mailbox_ptr pointer, /* -> mailbox structure being examined by this invocation */ 1 13 3 message_list_ptr pointer, /* -> list of read_mail specific information retained for each 1 14* message (eg: the "processed" flag) */ 1 15 3 message_chains, /*the various message chains ... */ 1 16 4 all pointer, /* ... all unexpunged messages */ 1 17 4 undeleted pointer, /* ... all undeleted messages */ 1 18 4 deleted pointer, /* ... all deleted messages */ 1 19 4 marked pointer, /* ... messages to be processed by the current request */ 1 20 4 marked_as_original pointer, /* ... messages being processed by a reply/forward request */ 1 21 3 mailbox_name character (168) varying, /* name of the mailbox (your mailbox/logbox/pathname) */ 1 22 1 23 2 current_message fixed binary, /* index of the current message; 0 => no current message */ 1 24 1 25 2 last_search_buffer, /* describes the buffer where read_mail constructs the ... */ 1 26 3 buffer_ptr pointer, /* ... the printed representation of messages in order ... */ 1 27 3 buffer_used fixed binary (21), /* ... to speed up regular expression searching */ 1 28 1 29 2 global_options, /* command line options affecting all of read_mail ... */ 1 30 3 flags, 1 31 4 acknowledge bit (1) unaligned, /* ... ON => acknowledge messages after printing */ 1 32 4 brief bit (1) unaligned, /* ... ON => shorten some messages and omit others */ 1 33 4 debug_mode bit (1) unaligned, /* ... ON => enable debugging features */ 1 34 4 pad bit (33) unaligned, 1 35 1 36 2 print_options, /* command line options affecting the print request ... */ 1 37 3 formatting_mode fixed binary, /* ... output mode for the message header, etc. */ 1 38 1 39 2 reply_options, /* command line options affecting the reply request ... */ 1 40 3 line_length fixed binary, /* ... line length to be used by send_mail for filling */ 1 41 3 indentation fixed binary, /* ... amount to indent original text when included */ 1 42 3 flags, 1 43 4 include_original bit (1) unaligned, /* ... ON => include original message text in the reply */ 1 44 4 include_authors bit (1) unaligned, /* ... ON => include original authors as recipients */ 1 45 4 include_recipients bit (1) unaligned, /* ... ON => include original recipients as recipients */ 1 46 4 include_self bit (2) unaligned, /* ... ON => include this user as a recipient of the reply if 1 47* selected by include_authors/include_recipients */ 1 48 4 fill_control bit (2) unaligned, /* ... controls message filling by send_mail */ 1 49 4 pad bit (29) unaligned; 1 50 1 51 dcl RDM_INVOCATION character (8) static options (constant) initial ("rdm_0009"); 1 52 1 53 dcl rdm_invocation_ptr pointer; 1 54 1 55 dcl rdm_area area based (rdm_invocation.area_ptr); 1 56 1 57 1 58 /* Defined settings for reply_options.include_self */ 1 59 1 60 dcl (DEFAULT_INCLUDE_SELF initial ("00"b), /* neither -include_self nor -no_include_self given */ 1 61 NO_INCLUDE_SELF initial ("01"b), /* -no_include_self explicitly given */ 1 62 INCLUDE_SELF initial ("10"b)) /* -include_self explicitly given */ 1 63 bit (2) aligned static options (constant); 1 64 1 65 /* END INCLUDE FILE ... rdm_invocation.incl.pl1 */ 762 763 2 1 /* BEGIN INCLUDE FILE ... rdm_message_list.incl.pl1 */ 2 2 /* Created: September 1983 by G. Palter */ 2 3 2 4 /* Definition of per-message data maintained by read_mail: This list is maintined in parallel to the mailbox structure by 2 5* read_mail's interface to the mail_system_ mailbox manager (rdm_mailbox_interface_). It serves two purposes: 2 6* (1) It provides a place to store read_mail-specific per-message data (ie: the processed flag). 2 7* (2) It provides the ability to provide arbitrary mappings between read_mail message numbers and the actual indeces 2 8* within the mailbox structure. This mapping allows read_mail to preserve its message numbers for an invocation 2 9* even if messages are expunged which causes them to disappear from the mailbox structure (NB: the "expunge" 2 10* request is not yet implemented). This mapping also allows read_mail to present the messages in the mailbox to 2 11* the user in a different order than they actually appear in the mailbox (eg: sorted by date/time created) */ 2 12 2 13 dcl 1 message_list aligned based (rdm_invocation.message_list_ptr), 2 14 2 n_messages fixed binary, /* # of messages known to read_mail at present */ 2 15 2 pad bit (36), 2 16 2 messages (message_list_n_messages refer (message_list.n_messages)), 2 17 3 message_idx fixed binary, /* index of this message in the mailbox structure */ 2 18 3 flags, 2 19 4 processed bit (1) unaligned, /* ON => this message may be deleted without query */ 2 20 4 pad bit (35) unaligned, 2 21 3 search_text, /* describes copy of messages used for regexp searches */ 2 22 4 search_text_ptr pointer, /* ... -> the saved printed represetnation */ 2 23 4 search_text_lth fixed binary (21); /* ... length of said representation in characters */ 2 24 2 25 dcl message_list_n_messages fixed binary; 2 26 2 27 /* END INCLUDE FILE ... rdm_message_list.incl.pl1 */ 764 765 3 1 /* BEGIN INCLUDE FILE ... rdm_message_chains.incl.pl1 */ 3 2 /* Created: September 1983 by G. Palter */ 3 3 3 4 3 5 /* Definition of a read_mail message chain */ 3 6 3 7 dcl 1 message_chain aligned based (message_chain_ptr), 3 8 2 n_messages fixed binary, /* # of messages in the chain */ 3 9 2 messages (message_list.n_messages) fixed binary; /* read_mail message numbers of the messages in the chain */ 3 10 3 11 dcl message_chain_ptr pointer; 3 12 3 13 3 14 /* Message chains maintained by read_mail's interface to the mail_system_ mailbox manager (rdm_mailbox_interface_) -- 3 15* (1) The first chain is a list of all messages in the mailbox which have not yet been expunged and consists of all 3 16* messages whether or not they have been marked for deletion. 3 17* (2) The second chain is a list of all messages in the mailbox which have not been marked for later deletion. 3 18* (3) The third chain is a list of all messages which have been marked for later deletion. 3 19* The message specifier parser uses one of these three chains as the basis for selecting the messages to be processed by 3 20* a request based on the use of "-include_deleted", "-only_non_deleted", or "-only_deleted", respectively; in this way, 3 21* the amount of code in the parser which must distinguish between these three types of selections is minimized */ 3 22 3 23 dcl 1 all_chain aligned based (rdm_invocation.message_chains.all) like message_chain; 3 24 dcl 1 undeleted_chain aligned based (rdm_invocation.message_chains.undeleted) like message_chain; 3 25 dcl 1 deleted_chain aligned based (rdm_invocation.message_chains.deleted) like message_chain; 3 26 3 27 3 28 /* The marked chain is the list of messages that are to be processed by the current request */ 3 29 3 30 dcl 1 marked_chain aligned based (rdm_invocation.message_chains.marked) like message_chain; 3 31 3 32 3 33 /* The marked as original chain is the list of messages that are being processed by a reply or forward request: This 3 34* chain is used to define the default set of messages to be processed by the various send_mail "original" requests and 3 35* forward "original" sub-requests */ 3 36 3 37 dcl 1 marked_as_original_chain aligned based (rdm_invocation.message_chains.marked_as_original) like message_chain; 3 38 3 39 3 40 /* Definition of the acceptable message selection criteria */ 3 41 3 42 dcl (ALL_MESSAGES initial (1), /* all messages: -include_deleted */ 3 43 NON_DELETED_MESSAGES initial (2), /* only undeleted messages: -only_non_deleted (default) */ 3 44 ONLY_DELETED_MESSAGES initial (3)) /* only deleted messages: -only_deleted */ 3 45 fixed binary static options (constant); 3 46 3 47 /* END INCLUDE FILE ... rdm_message_chains.incl.pl1 */ 766 767 4 1 /* BEGIN INCLUDE FILE ... mlsys_mailbox.incl.pl1 */ 4 2 /* Created: April 1983 by G. Palter */ 4 3 4 4 /* Definition of a mailbox as used by the Multics Mail System */ 4 5 4 6 dcl 1 mailbox aligned based (mailbox_ptr), 4 7 2 version character (8) unaligned, 4 8 2 reserved bit (144), /* for exclusive use of the mail system */ 4 9 2 mailbox_address pointer, /* mail system address of this mailbox */ 4 10 2 mailbox_dirname character (168) unaligned, /* directory containing this mailbox */ 4 11 2 mailbox_ename character (32) unaligned, /* entry name of this mailbox (includes ".mbx") */ 4 12 2 mailbox_type fixed binary, /* type of mailbox (see below) */ 4 13 2 mode bit (36), /* user's effective extended access to this mailbox */ 4 14 2 flags, 4 15 3 salvaged bit (1) unaligned, /* ON => this mailbox has been salvaged since last open */ 4 16 3 reserved bit (35) unaligned, /* for exclusive use of the mail system */ 4 17 2 message_selection_mode fixed binary, /* types of messages read: all/ordinary/interactive */ 4 18 2 sender_selection_mode fixed binary, /* whose messages were read: all/own/not-own */ 4 19 2 message_reading_level fixed binary, /* how much of each message read: keys/messages */ 4 20 2 n_messages fixed binary, /* total # of messages in this mailbox structure */ 4 21 2 n_ordinary_messages fixed binary, /* ... # of ordinary messages here */ 4 22 2 n_interactive_messages fixed binary, /* ... # of interactive messages here */ 4 23 2 n_deleted_messages fixed binary, /* ... # of messages here marked for later deletion */ 4 24 2 messages (mailbox_n_messages refer (mailbox.n_messages)), 4 25 3 key bit (72), /* unique key to read this message if not already read */ 4 26 3 message_ptr pointer; /* -> the message structure */ 4 27 4 28 dcl MAILBOX_VERSION_2 character (8) static options (constant) initial ("mlsmbx02"); 4 29 4 30 dcl mailbox_ptr pointer; 4 31 4 32 dcl mailbox_n_messages fixed binary; /* for exclusive use of the mail system */ 4 33 4 34 4 35 /* Types of mailboxes distinguished by the mail system */ 4 36 4 37 dcl (USER_DEFAULT_MAILBOX initial (1), /* the user's default mailbox for receiving mail */ 4 38 USER_LOGBOX initial (2), /* the user's logbox */ 4 39 SAVEBOX initial (3), /* a savebox */ 4 40 OTHER_MAILBOX initial (4)) /* any other type of mailbox */ 4 41 fixed binary static options (constant); 4 42 4 43 /* END INCLUDE FILE ... mlsys_mailbox.incl.pl1 */ 768 769 5 1 /* BEGIN INCLUDE FILE ... mlsys_message.incl.pl1 */ 5 2 5 3 5 4 /****^ HISTORY COMMENTS: 5 5* 1) change(85-12-19,Herbst), approve(86-03-25,MCR7367), 5 6* audit(86-04-28,Margolin), install(86-05-22,MR12.0-1059): 5 7* Added seen switch to message. 5 8* END HISTORY COMMENTS */ 5 9 5 10 5 11 /* Created: June 1983 by G. Palter */ 5 12 5 13 /* Definition of a message as used by the Multics Mail System */ 5 14 5 15 dcl 1 message aligned based (message_ptr), 5 16 2 version character (8) unaligned, 5 17 2 reserved bit (144), /* for exclusive use of the mail system */ 5 18 2 n_reply_references fixed binary, /* # of messages for which this is a reply */ 5 19 2 n_user_fields fixed binary, /* # of non-standard header fields in this message */ 5 20 2 n_redistributions fixed binary, /* # of times this message has been forwarded */ 5 21 2 n_body_sections fixed binary, /* # of sections in the body */ 5 22 2 flags, 5 23 3 interactive bit (1) unaligned, /* ON => this is an interactive message */ 5 24 3 can_be_deleted bit (1) unaligned, /* ON => the user can delete this message if desired */ 5 25 3 marked_for_deletion bit (1) unaligned, /* ON => message will be deleted when mailbox is closed */ 5 26 3 must_be_acknowledged bit (1) unaligned, /* ON => an ACK should be generated when message is read */ 5 27 3 seen bit (1) unaligned, /* ON => user has printed message at least once */ 5 28 3 reserved bit (31) unaligned, /* for use by the mail system */ 5 29 2 pad bit (36), 5 30 2 envelope like message_envelope, /* who/when/how the message was mailed & delivered */ 5 31 2 header, 5 32 3 message_id bit (72), /* ID of this message (same value for all copies) */ 5 33 3 access_class bit (72), /* AIM access class of this message */ 5 34 3 date_time_created fixed binary (71), /* date/time this message was composed */ 5 35 3 from pointer, /* -> address list of author(s) of the message */ 5 36 3 reply_to pointer, /* -> address list of recipients for reply (if not authors) */ 5 37 3 to pointer, /* -> address list of primary recipients */ 5 38 3 cc pointer, /* -> address list of secondary recipients */ 5 39 3 bcc pointer, /* -> address list of blind recipients */ 5 40 3 subject like message_text_field, /* subject of the message */ 5 41 3 reply_references pointer, /* -> list of messages for which this message is a reply */ 5 42 3 user_fields_list pointer, /* -> list of user-defined fields in this message */ 5 43 2 redistributions_list pointer, /* -> redistributions list for this message */ 5 44 2 body, 5 45 3 total_lines fixed binary (21), /* total # of lines in the body or -1 if indeterminate */ 5 46 3 pad bit (36), 5 47 3 body_sections (message_n_body_sections refer (message.n_body_sections)) like message_body_section; 5 48 5 49 dcl MESSAGE_VERSION_2 character (8) static options (constant) initial ("mlsmsg02"); 5 50 5 51 dcl message_subject character (message.header.subject.text_lth) unaligned based (message.header.subject.text_ptr); 5 52 5 53 dcl message_ptr pointer; 5 54 5 55 dcl (message_n_body_sections, message_trace_n_relays, message_n_redistributions, message_n_user_fields, 5 56 message_references_list_n_references) 5 57 fixed binary; /* for exclusive use of the mail system */ 5 58 5 59 /* Definition of a message envelope: describes when, by whom, and by what route the message was mailed */ 5 60 5 61 dcl 1 message_envelope aligned based (message_envelope_ptr), 5 62 2 date_time_mailed fixed binary (71), /* date/time this message was entered into the mail system */ 5 63 2 sender pointer, /* -> address of entity that mailed the message */ 5 64 2 trace pointer, /* -> message_trace describing how it got here */ 5 65 2 date_time_delivered fixed binary (71), /* date/time this message was delivered */ 5 66 2 delivered_by pointer, /* -> address of entity that delivered the message */ 5 67 2 acknowledge_to pointer; /* -> address of entity to receive ACK when message is read */ 5 68 5 69 dcl message_envelope_ptr pointer; 5 70 5 71 5 72 /* Structure used in calls to mail_system_daemon_ entrypoints which manipulate the message envelope */ 5 73 5 74 dcl 1 message_envelope_parameter aligned based (message_envelope_parameter_ptr), 5 75 2 pad pointer, /* forces even word alignment */ 5 76 2 version character (8) unaligned, 5 77 2 envelope like message_envelope; 5 78 5 79 dcl MESSAGE_ENVELOPE_PARAMETER_VERSION_2 character (8) static options (constant) initial ("mlsenv02"); 5 80 5 81 dcl message_envelope_parameter_ptr pointer; 5 82 5 83 5 84 /* Definition of a message trace: describes the route and each relay operation by which a message was passed through the 5 85* networks to reach this recipient */ 5 86 5 87 dcl 1 message_trace aligned based (message_trace_ptr), 5 88 2 version character (8) unaligned, 5 89 2 reserved bit (144), /* ... exclusively for use by the mail system */ 5 90 2 implicit_route pointer, /* -> an address_route which defines the route it took */ 5 91 2 pad bit (36), 5 92 2 n_relays fixed binary, /* # of relay operations required to reach this site */ 5 93 2 relays (message_trace_n_relays refer (message_trace.n_relays)), 5 94 3 date_time_relayed fixed binary (71), /* ... when this relay operation took place */ 5 95 3 sending_host character (256) varying, /* ... the host which relayed the message */ 5 96 3 receiving_host character (256) varying, /* ... the host which received it */ 5 97 3 communications_media character (32) unaligned, /* ... medium over which relay took place (ARPA, Tymnet) */ 5 98 3 communications_protocol character (32) unaligned,/* ... low-level protocol used (TCP, X.25) */ 5 99 3 mail_protocol character (32) unaligned, /* ... mailer protocol used (SMTP, NBS) */ 5 100 3 relay_id bit (72), /* ... unique ID assigned by receiving system or ""b */ 5 101 3 relay_recipient pointer; /* ... -> address of recipient as given by sending system */ 5 102 5 103 dcl MESSAGE_TRACE_VERSION_2 character (8) static options (constant) initial ("mlstrc02"); 5 104 5 105 dcl message_trace_ptr pointer; 5 106 5 107 /* Definition of a message's redistributions list */ 5 108 5 109 dcl 1 message_redistributions_list aligned based (message.redistributions_list), 5 110 2 version character (8) unaligned, 5 111 2 reserved bit (144), /* ... exclusively for use by the mail system */ 5 112 2 pad bit (36), 5 113 2 n_redistributions fixed binary, /* # of redistributions */ 5 114 2 redistributions (message_n_redistributions refer (message_redistributions_list.n_redistributions)) 5 115 like message_redistribution; /* the redistributions: oldest first */ 5 116 5 117 dcl MESSAGE_REDISTRIBUTIONS_LIST_VERSION_2 character (8) static options (constant) initial ("mlsrl002"); 5 118 5 119 5 120 /* Definition of a single redistribution (forwarding) of a message */ 5 121 5 122 dcl 1 message_redistribution aligned based (message_redistribution_ptr), 5 123 2 envelope like message_envelope, 5 124 2 header, 5 125 3 message_id bit (72), /* ID of this redistribution (same for all copies) */ 5 126 3 date_time_created fixed binary (71), /* date/time when this redistribution was made */ 5 127 3 from pointer, /* -> address list of authors of this redistribution */ 5 128 3 to pointer, /* -> address list of recipients of the redistribution */ 5 129 3 comment like message_text_field; /* optional comment associated with the redistribution */ 5 130 5 131 dcl message_redistribution_comment character (message_redistribution.comment.text_lth) unaligned 5 132 based (message_redistribution.comment.text_ptr); 5 133 5 134 dcl message_redistribution_ptr pointer; 5 135 5 136 5 137 /* Structure used in calls to mail_system_daemon_ entrypoints which manipulate the redistributions of a message */ 5 138 5 139 dcl 1 message_redistribution_parameter aligned based (message_redistribution_parameter_ptr), 5 140 2 pad pointer, /* forces even word alignment */ 5 141 2 version character (8) unaligned, 5 142 2 redistribution like message_redistribution; 5 143 5 144 dcl MESSAGE_REDISTRIBUTION_PARAMETER_VERSION_2 character (8) static options (constant) initial ("mlsdist2"); 5 145 5 146 dcl message_redistribution_parameter_ptr pointer; 5 147 5 148 /* Definition of the list of user-defined fields in a message */ 5 149 5 150 dcl 1 message_user_fields_list aligned based (message.user_fields_list), 5 151 2 version character (8) unaligned, 5 152 2 reserved bit (144), /* ... exclusively for use by the mail system */ 5 153 2 pad bit (36), 5 154 2 n_user_fields fixed binary, /* # of user-defined fields in the message */ 5 155 2 user_fields (message_n_user_fields refer (message_user_fields_list.n_user_fields)) 5 156 like message_user_field; /* the actual user-defined fields */ 5 157 5 158 dcl MESSAGE_USER_FIELDS_LIST_VERSION_2 character (8) static options (constant) initial ("mlsufl02"); 5 159 5 160 5 161 /* Definition of a user defined message header field */ 5 162 5 163 dcl 1 message_user_field aligned based (message_user_field_ptr), 5 164 2 header, 5 165 3 field_id bit (36) aligned, /* identifies the purpose of this field */ 5 166 3 field_type fixed binary, /* type of data contained in this field */ 5 167 2 field_type_variable bit (144); /* the actual data (see below) */ 5 168 5 169 dcl message_user_field_ptr pointer; 5 170 5 171 5 172 /* Defined types of user defined fields */ 5 173 5 174 dcl (MESSAGE_TEXT_USER_FIELD initial (1), /* content of the field is a text string */ 5 175 MESSAGE_ADDRESS_LIST_USER_FIELD initial (2), /* content of the field is an address list */ 5 176 MESSAGE_DATE_USER_FIELD initial (3), /* content of the field is a date/time */ 5 177 MESSAGE_INTEGER_USER_FIELD initial (4)) /* content of the filed is a fixed binary value */ 5 178 fixed binary static options (constant); 5 179 5 180 5 181 /* Structures used to access the data for the different types of user defined fields */ 5 182 5 183 dcl 1 message_text_user_field aligned based (message_user_field_ptr), 5 184 2 header like message_user_field.header, 5 185 2 text like message_text_field; /* the message text */ 5 186 5 187 dcl message_text_user_field_text character (message_text_user_field.text.text_lth) unaligned 5 188 based (message_text_user_field.text.text_ptr); 5 189 5 190 dcl 1 message_address_list_user_field aligned based (message_user_field_ptr), 5 191 2 header like message_user_field.header, 5 192 2 address_list_ptr pointer, /* -> the address list */ 5 193 2 pad bit (72); 5 194 5 195 dcl 1 message_date_user_field aligned based (message_user_field_ptr), 5 196 2 header like message_user_field.header, 5 197 2 date_time fixed binary (71), /* the clock reading */ 5 198 2 pad bit (72); 5 199 5 200 dcl 1 message_integer_user_field aligned based (message_user_field_ptr), 5 201 2 header like message_user_field.header, 5 202 2 value fixed binary (35), /* the integer value */ 5 203 2 pad bit (108); 5 204 5 205 5 206 /* Structure used in calls to mail_system_ entrypoints which manipulate the user-defined fields of a message */ 5 207 5 208 dcl 1 message_user_field_parameter aligned based (message_user_field_parameter_ptr), 5 209 2 pad pointer, /* forces even word alignment */ 5 210 2 version character (8) unaligned, 5 211 2 user_field like message_user_field; 5 212 5 213 dcl MESSAGE_USER_FIELD_PARAMETER_VERSION_2 character (8) static options (constant) initial ("mlsudf02"); 5 214 5 215 dcl message_user_field_parameter_ptr pointer; 5 216 5 217 /* Definition of a list of message references used as the value of message header fields (eg: In-Reply-To) */ 5 218 5 219 dcl 1 message_references_list aligned based (message_references_list_ptr), 5 220 2 version character (8) unaligned, 5 221 2 reserved bit (144), /* ... exclusively for use by the mail system */ 5 222 2 pad bit (36), 5 223 2 n_references fixed binary, /* # of references in this list */ 5 224 2 references (message_references_list_n_references refer (message_references_list.n_references)) 5 225 like message_reference; /* the references themselves */ 5 226 5 227 dcl MESSAGE_REFERENCES_LIST_VERSION_2 character (8) static options (constant) initial ("mlsref02"); 5 228 5 229 dcl message_references_list_ptr pointer; 5 230 5 231 5 232 /* Definition of a reference to another message */ 5 233 5 234 dcl 1 message_reference aligned based (message_reference_ptr), 5 235 2 message_id bit (72), /* ID of the other message */ 5 236 2 date_time_created fixed binary (71), /* date/time the other message was created */ 5 237 2 from pointer, /* -> address list of authors of the other message */ 5 238 2 subject like message_text_field; /* subject of the other message */ 5 239 5 240 dcl message_reference_subject character (message_reference.subject.text_lth) unaligned 5 241 based (message_reference.subject.text_ptr); 5 242 5 243 dcl message_reference_ptr pointer; 5 244 5 245 5 246 /* Structure used in calls to mail_system_daemon_ entrypoints which manipulate message references */ 5 247 5 248 dcl 1 message_reference_parameter aligned based (message_reference_parameter_ptr), 5 249 2 pad pointer, /* forces even word alignment */ 5 250 2 version character (8) unaligned, 5 251 2 reference like message_reference; 5 252 5 253 dcl MESSAGE_REFERENCE_PARAMETER_VERSION_2 character (8) static options (constant) initial ("mlsref02"); 5 254 5 255 dcl message_reference_parameter_ptr pointer; 5 256 5 257 5 258 /* Definition of a text field in a message (Subject, Comment, or a user defined field) */ 5 259 5 260 dcl 1 message_text_field aligned based (message_text_field_ptr), 5 261 2 text_ptr pointer, /* -> the actual text */ 5 262 2 text_lth fixed binary (21), /* length of said text */ 5 263 2 flags, 5 264 3 multiline_text bit (1) unaligned, /* ON => the text of this field may span multiple lines; 5 265* OFF => the text will always be a single line */ 5 266 3 reserved bit (35) unaligned; /* for exclusive use of the mail system */ 5 267 5 268 dcl message_text_field_text character (message_text_field.text_lth) unaligned based (message_text_field.text_ptr); 5 269 5 270 dcl message_text_field_ptr pointer; 5 271 5 272 /* Definition of a section of the body of a message */ 5 273 5 274 dcl 1 message_body_section aligned based (message_body_section_ptr), 5 275 2 header, 5 276 3 section_type fixed binary, /* type of "text" stored in this section */ 5 277 3 section_n_lines fixed binary (21), /* # of lines in this section or -1 if indeterminate */ 5 278 2 section_type_variable bit (144); /* the actual data (see below) */ 5 279 5 280 dcl message_body_section_ptr pointer; 5 281 5 282 5 283 /* Defined types of message body sections */ 5 284 5 285 dcl (MESSAGE_PREFORMATTED_BODY_SECTION initial (1), /* text formatted by the authors/sender */ 5 286 MESSAGE_BIT_STRING_BODY_SECTION initial (2)) /* arbitrary bit string */ 5 287 fixed binary static options (constant); 5 288 5 289 5 290 /* Structures used to access the data for the different types of message body sections */ 5 291 5 292 dcl 1 message_preformatted_body_section aligned based (message_body_section_ptr), 5 293 2 header like message_body_section.header, 5 294 2 text_ptr pointer, /* -> the text */ 5 295 2 text_lth fixed binary (21), /* length of said text in characters */ 5 296 2 reserved bit (36); /* for exclusive use of the mail system */ 5 297 5 298 dcl message_preformatted_body_section_text character (message_preformatted_body_section.text_lth) unaligned 5 299 based (message_preformatted_body_section.text_ptr); 5 300 5 301 dcl 1 message_bit_string_body_section aligned based (message_body_section_ptr), 5 302 2 header like message_body_section.header, 5 303 2 bit_string_ptr pointer, /* -> the bit string */ 5 304 2 bit_string_lth fixed binary (24), /* length of said bit string in bits (obviously) */ 5 305 2 reserved bit (36); /* for exclusive use of the mail system */ 5 306 5 307 dcl message_bit_string_body_section_bit_string bit (message_bit_string_body_section.bit_string_lth) unaligned 5 308 based (message_bit_string_body_section.bit_string_ptr); 5 309 5 310 5 311 /* Structure used in calls to mail_system_ entrypoints which manipulate the sections of a message's body */ 5 312 5 313 dcl 1 message_body_section_parameter aligned based (message_body_section_parameter_ptr), 5 314 2 pad pointer, /* forces even word alignment */ 5 315 2 version character (8) unaligned, 5 316 2 section like message_body_section; 5 317 5 318 dcl MESSAGE_BODY_SECTION_PARAMETER_VERSION_2 character (8) static options (constant) initial ("mlsmbs02"); 5 319 5 320 dcl message_body_section_parameter_ptr pointer; 5 321 5 322 /* END INCLUDE FILE ... mlsys_message.incl.pl1 */ 770 771 6 1 /* BEGIN INCLUDE FILE ... mlsys_delete_error_info.incl.pl1 */ 6 2 /* Created: June 1983 by G. Palter */ 6 3 6 4 /* Describes why the mail system could not delete a message which was marked for deletion: passed to the caller of 6 5* mail_system_$close_mailbox or mail_system_$expunge_messages via sub_err_ */ 6 6 6 7 dcl 1 delete_error_info aligned based (delete_error_info_ptr), 6 8 2 version character (8) unaligned, 6 9 2 message_number fixed binary, /* set to index of message which couldn't be deleted */ 6 10 2 code fixed binary (35), /* set to indicate why message could not be deleted */ 6 11 2 additional_info character (256) varying; /* set to additional information to be displayed with the 6 12* error message for the above status code */ 6 13 6 14 dcl DELETE_ERROR_INFO_VERSION_1 character (8) static options (constant) initial ("mlsdel01"); 6 15 6 16 dcl delete_error_info_ptr pointer; 6 17 6 18 /* END INCLUDE FILE ... mlsys_delete_error_info.incl.pl1 */ 772 773 7 1 /* BEGIN INCLUDE FILE ... condition_info.incl.pl1 */ 7 2 7 3 /* Structure for find_condition_info_. 7 4* 7 5* Written 1-Mar-79 by M. N. Davidoff. 7 6**/ 7 7 7 8 /* automatic */ 7 9 7 10 declare condition_info_ptr pointer; 7 11 7 12 /* based */ 7 13 7 14 declare 1 condition_info aligned based (condition_info_ptr), 7 15 2 mc_ptr pointer, /* pointer to machine conditions at fault time */ 7 16 2 version fixed binary, /* Must be 1 */ 7 17 2 condition_name char (32) varying, /* name of condition */ 7 18 2 info_ptr pointer, /* pointer to the condition data structure */ 7 19 2 wc_ptr pointer, /* pointer to wall crossing machine conditions */ 7 20 2 loc_ptr pointer, /* pointer to location where condition occured */ 7 21 2 flags unaligned, 7 22 3 crawlout bit (1), /* on if condition occured in lower ring */ 7 23 3 pad1 bit (35), 7 24 2 pad2 bit (36), 7 25 2 user_loc_ptr pointer, /* ptr to most recent nonsupport loc before condition occurred */ 7 26 2 pad3 (4) bit (36); 7 27 7 28 /* internal static */ 7 29 7 30 declare condition_info_version_1 7 31 fixed binary internal static options (constant) initial (1); 7 32 7 33 /* END INCLUDE FILE ... condition_info.incl.pl1 */ 774 775 8 1 /* BEGIN INCLUDE FILE sub_error_info.incl.pl1 */ 8 2 /* format: style2 */ 8 3 8 4 /* The include file condition_info_header must be used with this file */ 8 5 8 6 declare sub_error_info_ptr pointer; 8 7 declare 1 sub_error_info aligned based (sub_error_info_ptr), 8 8 2 header aligned like condition_info_header, 8 9 2 retval fixed bin (35), /* return value */ 8 10 2 name char (32), /* module name */ 8 11 2 info_ptr ptr; 8 12 8 13 declare sub_error_info_version_1 8 14 internal static options (constant) fixed bin init (1); 8 15 8 16 /* END INCLUDE FILE sub_error_info.incl.pl1 */ 776 777 9 1 /* BEGIN INCLUDE FILE condition_info_header.incl.pl1 BIM 1981 */ 9 2 /* format: style2 */ 9 3 9 4 declare condition_info_header_ptr 9 5 pointer; 9 6 declare 1 condition_info_header 9 7 aligned based (condition_info_header_ptr), 9 8 2 length fixed bin, /* length in words of this structure */ 9 9 2 version fixed bin, /* version number of this structure */ 9 10 2 action_flags aligned, /* tell handler how to proceed */ 9 11 3 cant_restart bit (1) unaligned, /* caller doesn't ever want to be returned to */ 9 12 3 default_restart bit (1) unaligned, /* caller can be returned to with no further action */ 9 13 3 quiet_restart bit (1) unaligned, /* return, and print no message */ 9 14 3 support_signal bit (1) unaligned, /* treat this signal as if the signalling procedure had the support bit set */ 9 15 /* if the signalling procedure had the support bit set, do the same for its caller */ 9 16 3 pad bit (32) unaligned, 9 17 2 info_string char (256) varying, /* may contain printable message */ 9 18 2 status_code fixed bin (35); /* if^=0, code interpretable by com_err_ */ 9 19 9 20 /* END INCLUDE FILE condition_info_header.incl.pl1 */ 778 779 780 end rdm_mailbox_interface_; SOURCE FILES USED IN THIS COMPILATION. LINE NUMBER DATE MODIFIED NAME PATHNAME 0 10/02/89 0815.0 rdm_mailbox_interface_.pl1 >spec>install>1079>rdm_mailbox_interface_.pl1 762 1 10/27/83 2104.3 rdm_invocation.incl.pl1 >ldd>include>rdm_invocation.incl.pl1 764 2 10/27/83 2104.3 rdm_message_list.incl.pl1 >ldd>include>rdm_message_list.incl.pl1 766 3 10/27/83 2104.3 rdm_message_chains.incl.pl1 >ldd>include>rdm_message_chains.incl.pl1 768 4 10/27/83 2104.2 mlsys_mailbox.incl.pl1 >ldd>include>mlsys_mailbox.incl.pl1 770 5 05/22/86 1225.8 mlsys_message.incl.pl1 >ldd>include>mlsys_message.incl.pl1 772 6 10/27/83 2104.2 mlsys_delete_error_info.incl.pl1 >ldd>include>mlsys_delete_error_info.incl.pl1 774 7 06/28/79 1204.8 condition_info.incl.pl1 >ldd>include>condition_info.incl.pl1 776 8 07/18/81 1100.0 sub_error_info.incl.pl1 >ldd>include>sub_error_info.incl.pl1 778 9 03/24/82 1347.2 condition_info_header.incl.pl1 >ldd>include>condition_info_header.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. MAILBOX_VERSION_2 000000 constant char(8) initial packed unaligned dcl 4-28 set ref 140* P_announce_new_messages parameter bit(1) dcl 46 ref 187 211 P_code parameter fixed bin(35,0) dcl 38 set ref 135 140* 142 181* 316 324* 329* 343* P_delete_force parameter bit(1) dcl 60 ref 395 400 P_error_during_expunge parameter bit(1) dcl 63 set ref 574 580* 650* 693* P_mailbox_dirname parameter char packed unaligned dcl 40 set ref 135 140* P_mailbox_ename parameter char packed unaligned dcl 42 set ref 135 140* P_message_number parameter fixed bin(17,0) dcl 51 ref 316 322 351 355 366 372 P_message_ptr parameter pointer dcl 57 set ref 316 342* P_n_new_messages parameter fixed bin(17,0) dcl 48 set ref 187 208* P_new_current_msg parameter fixed bin(17,0) dcl 70 set ref 481 491* 498* P_old_current_msg parameter fixed bin(17,0) dcl 66 ref 481 490 P_open_options_ptr parameter pointer dcl 43 set ref 135 140* P_rdm_invocation_ptr parameter pointer dcl 37 ref 135 138 187 190 316 319 351 354 366 369 395 398 481 484 523 526 574 577 acknowledge 103 based bit(1) level 4 packed packed unaligned dcl 1-6 ref 378 additional_info 4 based varying char(256) level 2 dcl 6-7 set ref 630 630* addr builtin function dcl 131 ref 620 620 all 12 based pointer level 4 dcl 1-6 set ref 157* 158 159 160 178 241* 243 243 245 245 662* all_chain based structure level 1 dcl 3-23 set ref 157 area_ptr 4 based pointer level 2 dcl 1-6 ref 148 157 163 169 172 175 221 276 591 brief 103(01) based bit(1) level 4 packed packed unaligned dcl 1-6 ref 461 can_be_deleted 12(01) based bit(1) level 3 packed packed unaligned dcl 5-15 ref 413 ci 000100 automatic structure level 1 dcl 617 set ref 620 620 code 3 based fixed bin(35,0) level 2 in structure "delete_error_info" dcl 6-7 in procedure "rdm_mailbox_interface_" set ref 630* code 000102 automatic fixed bin(35,0) dcl 80 in procedure "rdm_mailbox_interface_" set ref 201* 202 202 202* 336* 337 340* 343 407* 408 408* 435* 436 436* 444* 445 445* 531* 532 532* 538* 539 539* 641* 643 643 643 643* 650 command_query_$yes_no 000026 constant entry external dcl 110 ref 418 condition_info based structure level 1 dcl 7-14 condition_info_header based structure level 1 dcl 9-6 condition_info_version_1 constant fixed bin(17,0) initial dcl 7-30 ref 619 continue_to_signal_ 000030 constant entry external dcl 111 ref 624 cu_$arg_list_ptr 000032 constant entry external dcl 112 ref 300 300 509 509 561 561 682 682 cu_$cl 000034 constant entry external dcl 113 ref 304 513 565 686 cu_$generate_call 000036 constant entry external dcl 114 ref 300 509 561 682 current_message 77 based fixed bin(17,0) level 2 dcl 1-6 set ref 178* 257 257* 429* 465 466* 546* debug_mode 103(02) based bit(1) level 4 packed packed unaligned dcl 1-6 ref 302 511 563 684 delete_error_info based structure level 1 dcl 6-7 delete_error_info_ptr 000142 automatic pointer dcl 6-16 set ref 628* 630 630 630 630 635 deleted 16 based pointer level 4 dcl 1-6 set ref 169* 170 253* 450* 543* 664* deleted_chain based structure level 1 dcl 3-25 set ref 169 emf_et_$expunged_message 000012 external static fixed bin(35,0) dcl 105 ref 329 error_table_$bad_index 000014 external static fixed bin(35,0) dcl 105 set ref 324 598* expunged 2 based bit(1) array level 3 dcl 85 set ref 606* 608* 635* 660 find_condition_info_ 000040 constant entry external dcl 115 ref 620 first_new_message_mailbox_idx 000113 automatic fixed bin(17,0) dcl 94 set ref 195* 229 first_new_message_number 000112 automatic fixed bin(17,0) dcl 94 set ref 193* 228 243 249 257 flags 103 based structure level 3 in structure "rdm_invocation" dcl 1-6 in procedure "rdm_mailbox_interface_" flags 12 based structure level 2 in structure "message" dcl 5-15 in procedure "rdm_mailbox_interface_" flags 3 based structure array level 3 in structure "message_list" dcl 2-13 in procedure "rdm_mailbox_interface_" set ref 152* 231* global_options 103 based structure level 2 dcl 1-6 header 4 based structure level 3 in structure "message_body_section_parameter" dcl 5-313 in procedure "rdm_mailbox_interface_" header 64 based structure array level 4 in structure "message" dcl 5-15 in procedure "rdm_mailbox_interface_" header 4 based structure level 3 in structure "message_user_field_parameter" dcl 5-208 in procedure "rdm_mailbox_interface_" header based structure level 2 in structure "message_user_field" dcl 5-163 in procedure "rdm_mailbox_interface_" header 10 based structure array level 3 in structure "message_user_fields_list" dcl 5-150 in procedure "rdm_mailbox_interface_" header based structure level 2 in structure "message_body_section" dcl 5-274 in procedure "rdm_mailbox_interface_" idx 000213 automatic fixed bin(17,0) dcl 705 in procedure "add_message_to_chain" set ref 716* 717 717* idx 000117 automatic fixed bin(17,0) dcl 99 in procedure "rdm_mailbox_interface_" set ref 149* 150 150 152 153 154* 159* 160 160* 165* 166 166* 223* 224 224* 227* 228 229* 242* 243 243* 248* 249 249* 489* 490 491* 595* 596 596* idx 000224 automatic fixed bin(17,0) dcl 743 in procedure "delete_message_from_chain" set ref 747* 748 749* idx 000202 automatic fixed bin(17,0) dcl 272 in procedure "grow_message_chain" set ref 280* 281 281* info_ptr 14 000100 automatic pointer level 2 in structure "ci" dcl 617 in on unit on line 614 set ref 622 info_ptr 116 based pointer level 2 in structure "sub_error_info" dcl 8-7 in procedure "rdm_mailbox_interface_" ref 628 ioa_ 000042 constant entry external dcl 116 ref 211 214 461 ioa_$ioa_switch 000044 constant entry external dcl 117 ref 303 512 564 685 iox_$error_output 000010 external static pointer dcl 102 set ref 303* 512* 564* 685* jdx 000225 automatic fixed bin(17,0) dcl 743 set ref 749* 750 750* last_deleted_message 000115 automatic fixed bin(17,0) dcl 97 set ref 430* 452* 464 466 length builtin function dcl 131 ref 630 mail_system_$acknowledge_message 000046 constant entry external dcl 118 ref 384 mail_system_$expunge_messages 000050 constant entry external dcl 119 ref 641 mail_system_$mark_message_for_deletion 000052 constant entry external dcl 120 ref 444 mail_system_$open_mailbox 000054 constant entry external dcl 121 ref 140 mail_system_$read_message 000056 constant entry external dcl 122 ref 336 mail_system_$read_new_messages 000060 constant entry external dcl 123 ref 201 mail_system_$unmark_message_for_deletion 000062 constant entry external dcl 124 ref 538 mailbox based structure level 1 dcl 4-6 mailbox_info 6 based structure level 2 dcl 1-6 mailbox_name 24 based varying char(168) level 3 dcl 1-6 set ref 202* 408* 436* 532* 598* 643* mailbox_ptr 6 based pointer level 3 in structure "rdm_invocation" dcl 1-6 in procedure "rdm_mailbox_interface_" set ref 140* 144 191 206* 320 370 578 649* mailbox_ptr 000136 automatic pointer dcl 4-30 in procedure "rdm_mailbox_interface_" set ref 144* 146 191* 195 201* 206 320* 333 336* 337 370* 380 578* 582 589 605 641* 649 marked 20 based pointer level 4 dcl 1-6 set ref 172* 173 254* 404 405 432 433 528 529 665* marked_as_original 22 based pointer level 4 dcl 1-6 set ref 175* 176 255* 666* marked_as_original_chain based structure level 1 dcl 3-37 set ref 175 marked_chain based structure level 1 dcl 3-30 set ref 172 marked_for_deletion 12(02) based bit(1) level 3 packed packed unaligned dcl 5-15 ref 441 537 606 mdl based structure level 1 dcl 85 set ref 591 mdl_n_messages 000106 automatic fixed bin(17,0) dcl 91 set ref 589* 591 591 mdl_ptr 000104 automatic pointer dcl 90 set ref 591* 593 603 606 608 635 658 659 660 message based structure level 1 dcl 5-15 message_body_section based structure level 1 dcl 5-274 message_chain based structure level 1 dcl 3-7 set ref 276 message_chain_ptr 000134 automatic pointer dcl 3-11 set ref 708* 710 712 714 716 717 717 719 720 720 726 726 727 727 745* 747 748 749 750 750 752 752 message_chains 12 based structure level 3 dcl 1-6 message_envelope based structure level 1 dcl 5-61 message_idx 000212 automatic fixed bin(17,0) dcl 705 in procedure "add_message_to_chain" set ref 710* 712 714 716 719* message_idx 000116 automatic fixed bin(17,0) dcl 99 in procedure "rdm_mailbox_interface_" set ref 404* 405* 432* 433* 465* 466 466* 528* 529* 593* 596 598* 603 605 606 608* 658* 659 660* message_idx 2 based fixed bin(17,0) array level 3 in structure "message_list" dcl 2-13 in procedure "rdm_mailbox_interface_" set ref 150* 229* 328 333 336* 337 380 380 596 661* 669* 669 message_list based structure level 1 dcl 2-13 set ref 148 221 message_list_n_messages 000132 automatic fixed bin(17,0) dcl 2-25 set ref 146* 148 148 219* 221 221 message_list_ptr 10 based pointer level 3 dcl 1-6 set ref 148* 149 150 152 153 154 157 158 163 164 169 172 175 193 219 223 224 236* 276 323 328 333 336 337 357 357 374 376 380 380 417 442 595 596 661 669 669 message_number 1 based fixed bin(17,0) array level 3 in structure "mdl" dcl 85 in procedure "rdm_mailbox_interface_" set ref 603* 659 message_number 000101 automatic fixed bin(17,0) dcl 78 in procedure "rdm_mailbox_interface_" set ref 228* 229 231 232 233 322* 323 323 328 333 336 337 355* 357 357 357 372* 374 374 376 380 380 405* 407* 408* 413* 417 418* 433* 435* 436* 442 445* 449* 450* 452 529* 531* 532* 539* 543* 544* 546 594* 595 596* 598 603 659* 661 662* 663* 664* 665* 666* 669 669 message_number 2 based fixed bin(17,0) level 2 in structure "delete_error_info" dcl 6-7 in procedure "rdm_mailbox_interface_" set ref 630* 635 message_ptr 106 based pointer array level 3 in structure "mailbox" dcl 4-6 in procedure "rdm_mailbox_interface_" ref 333 337 380 605 message_ptr 000140 automatic pointer dcl 5-53 in procedure "rdm_mailbox_interface_" set ref 333* 335 337* 342 380* 382* 384 384 384* 407* 413 435* 441 444* 531* 537 538* 605* 606 606 message_redistribution based structure level 1 dcl 5-122 message_reference based structure level 1 dcl 5-234 message_text_field based structure level 1 dcl 5-260 message_user_field based structure level 1 dcl 5-163 messages 1 based fixed bin(17,0) array level 2 in structure "all_chain" dcl 3-23 in procedure "rdm_mailbox_interface_" set ref 160* 243* messages 1 based structure array level 2 in structure "mdl" dcl 85 in procedure "rdm_mailbox_interface_" messages 1 based fixed bin(17,0) array level 2 in structure "marked_chain" dcl 3-30 in procedure "rdm_mailbox_interface_" ref 405 433 529 messages 2 based structure array level 2 in structure "message_list" dcl 2-13 in procedure "rdm_mailbox_interface_" set ref 224* 224 messages 1 based fixed bin(17,0) array level 2 in structure "undeleted_chain" dcl 3-24 in procedure "rdm_mailbox_interface_" set ref 166* 249* 466 466 490 491 messages 1 based fixed bin(17,0) array level 2 in structure "message_chain" dcl 3-7 in procedure "rdm_mailbox_interface_" set ref 281* 281 712 714 717* 717 719* 727* 748 750* 750 messages 104 based structure array level 2 in structure "mailbox" dcl 4-6 in procedure "rdm_mailbox_interface_" min builtin function dcl 131 ref 178 mlsys_et_$all_messages_deleted 000016 external static fixed bin(35,0) dcl 105 ref 643 mlsys_et_$cant_be_deleted 000020 external static fixed bin(35,0) dcl 105 set ref 413* mlsys_et_$no_more_messages 000022 external static fixed bin(35,0) dcl 105 ref 202 mlsys_et_$some_messages_not_deleted 000024 external static fixed bin(35,0) dcl 105 ref 643 650 must_be_acknowledged 12(03) based bit(1) level 3 packed packed unaligned dcl 5-15 ref 384 n_deleted_messages 103 based fixed bin(17,0) level 2 dcl 4-6 ref 582 n_messages based fixed bin(17,0) level 2 in structure "message_chain" dcl 3-7 in procedure "rdm_mailbox_interface_" set ref 278* 278 280 710 716 720* 720 726* 726 727 747 749 752* 752 n_messages based fixed bin(17,0) level 2 in structure "deleted_chain" dcl 3-25 in procedure "rdm_mailbox_interface_" set ref 170* n_messages based fixed bin(17,0) level 2 in structure "message_list" dcl 2-13 in procedure "rdm_mailbox_interface_" set ref 148* 149 157 158 163 164 169 172 175 193 219 221* 223 276 323 357 374 595 n_messages 100 based fixed bin(17,0) level 2 in structure "mailbox" dcl 4-6 in procedure "rdm_mailbox_interface_" ref 146 195 589 n_messages based fixed bin(17,0) level 2 in structure "mdl" dcl 85 in procedure "rdm_mailbox_interface_" set ref 591* 593 658 n_messages based fixed bin(17,0) level 2 in structure "marked_chain" dcl 3-30 in procedure "rdm_mailbox_interface_" set ref 173* 404 432 528 n_messages based fixed bin(17,0) level 2 in structure "all_chain" dcl 3-23 in procedure "rdm_mailbox_interface_" set ref 158* 159 178 243 245* 245 n_messages based fixed bin(17,0) level 2 in structure "marked_as_original_chain" dcl 3-37 in procedure "rdm_mailbox_interface_" set ref 176* n_messages based fixed bin(17,0) level 2 in structure "undeleted_chain" dcl 3-24 in procedure "rdm_mailbox_interface_" set ref 164* 165 249 251* 251 461 465 489 n_new_messages 000100 automatic fixed bin(17,0) dcl 76 set ref 201* 208 209 211 214* 219 227 242 245 248 251 n_previously_expunged 000120 automatic fixed bin(17,0) dcl 100 set ref 656* 667* 667 669 name 106 based char(32) level 2 dcl 8-7 ref 623 new_message_chain_ptr 000200 automatic pointer dcl 271 set ref 276* 278 281 285 new_message_list_ptr 000110 automatic pointer dcl 93 set ref 221* 224 229 231 232 233 236 null builtin function dcl 131 ref 153 232 335 382 384 606 620 620 ok_to_delete 000114 automatic bit(1) packed unaligned dcl 96 set ref 418* 421 old_message_chain_ptr 000176 automatic pointer dcl 271 set ref 274* 278 280 281 p_message_chain_ptr parameter pointer dcl 702 in procedure "add_message_to_chain" ref 699 708 p_message_chain_ptr parameter pointer dcl 740 in procedure "delete_message_from_chain" ref 737 745 p_message_chain_ptr parameter pointer dcl 269 in procedure "grow_message_chain" set ref 266 274 285* p_message_number parameter fixed bin(17,0) dcl 703 in procedure "add_message_to_chain" ref 699 712 714 719 727 p_message_number parameter fixed bin(17,0) dcl 741 in procedure "delete_message_from_chain" ref 737 748 processed 3 based bit(1) array level 4 packed packed unaligned dcl 2-13 set ref 357* 376* 417 442* rdm_area based area(1024) dcl 1-55 ref 148 157 163 169 172 175 221 276 591 rdm_invocation based structure level 1 dcl 1-6 rdm_invocation_ptr 000130 automatic pointer dcl 1-53 set ref 138* 140 144 148 148 149 150 152 153 154 157 157 157 158 158 159 160 163 163 163 164 164 165 166 169 169 169 170 172 172 172 173 175 175 175 176 178 178 190* 191 193 202 202 206 219 221 223 224 236 241 243 243 245 245 247 249 249 251 251 253 254 255 257 257 276 276 302 319* 320 323 328 333 336 337 354* 357 357 369* 370 374 376 378 380 380 398* 404 405 407* 408 408 413 417 418 421 429 432 433 435* 436 436 442 445 449 450 461 461 465 465 466 466 466 484* 489 490 491 511 526* 528 529 531* 532 532 539 543 544 546 563 577* 578 591 595 596 598 598 630 643 643 649 661 662 663 664 665 666 669 669 684 sci_ptr 2 based pointer level 2 dcl 1-6 set ref 202* 408* 413* 418* 421* 436* 445* 532* 539* 598* 630* 643* search_text 4 based structure array level 3 dcl 2-13 search_text_lth 6 based fixed bin(21,0) array level 4 dcl 2-13 set ref 154* 233* search_text_ptr 4 based pointer array level 4 dcl 2-13 set ref 153* 232* ssu_$abort_line 000064 constant entry external dcl 125 ref 408 413 421 ssu_$get_subsystem_and_request_name 000070 constant entry external dcl 127 ref 418 ssu_$print_message 000066 constant entry external dcl 126 ref 300 300 509 509 561 561 630 682 682 string builtin function dcl 131 set ref 152* 231* sub_error_ 000122 stack reference condition dcl 129 ref 614 647 sub_error_info based structure level 1 dcl 8-7 sub_error_info_ptr 000144 automatic pointer dcl 8-6 set ref 622* 623 628 undeleted 14 based pointer level 4 dcl 1-6 set ref 163* 164 165 166 247* 249 249 251 251 449* 461 465 466 466 489 490 491 544* 663* undeleted_chain based structure level 1 dcl 3-24 set ref 163 version 2 000100 automatic fixed bin(17,0) level 2 dcl 617 set ref 619* NAMES DECLARED BY DECLARE STATEMENT AND NEVER REFERENCED. ALL_MESSAGES internal static fixed bin(17,0) initial dcl 3-42 DEFAULT_INCLUDE_SELF internal static bit(2) initial dcl 1-60 DELETE_ERROR_INFO_VERSION_1 internal static char(8) initial packed unaligned dcl 6-14 INCLUDE_SELF internal static bit(2) initial dcl 1-60 MESSAGE_ADDRESS_LIST_USER_FIELD internal static fixed bin(17,0) initial dcl 5-174 MESSAGE_BIT_STRING_BODY_SECTION internal static fixed bin(17,0) initial dcl 5-285 MESSAGE_BODY_SECTION_PARAMETER_VERSION_2 internal static char(8) initial packed unaligned dcl 5-318 MESSAGE_DATE_USER_FIELD internal static fixed bin(17,0) initial dcl 5-174 MESSAGE_ENVELOPE_PARAMETER_VERSION_2 internal static char(8) initial packed unaligned dcl 5-79 MESSAGE_INTEGER_USER_FIELD internal static fixed bin(17,0) initial dcl 5-174 MESSAGE_PREFORMATTED_BODY_SECTION internal static fixed bin(17,0) initial dcl 5-285 MESSAGE_REDISTRIBUTIONS_LIST_VERSION_2 internal static char(8) initial packed unaligned dcl 5-117 MESSAGE_REDISTRIBUTION_PARAMETER_VERSION_2 internal static char(8) initial packed unaligned dcl 5-144 MESSAGE_REFERENCES_LIST_VERSION_2 internal static char(8) initial packed unaligned dcl 5-227 MESSAGE_REFERENCE_PARAMETER_VERSION_2 internal static char(8) initial packed unaligned dcl 5-253 MESSAGE_TEXT_USER_FIELD internal static fixed bin(17,0) initial dcl 5-174 MESSAGE_TRACE_VERSION_2 internal static char(8) initial packed unaligned dcl 5-103 MESSAGE_USER_FIELDS_LIST_VERSION_2 internal static char(8) initial packed unaligned dcl 5-158 MESSAGE_USER_FIELD_PARAMETER_VERSION_2 internal static char(8) initial packed unaligned dcl 5-213 MESSAGE_VERSION_2 internal static char(8) initial packed unaligned dcl 5-49 NON_DELETED_MESSAGES internal static fixed bin(17,0) initial dcl 3-42 NO_INCLUDE_SELF internal static bit(2) initial dcl 1-60 ONLY_DELETED_MESSAGES internal static fixed bin(17,0) initial dcl 3-42 OTHER_MAILBOX internal static fixed bin(17,0) initial dcl 4-37 RDM_INVOCATION internal static char(8) initial packed unaligned dcl 1-51 SAVEBOX internal static fixed bin(17,0) initial dcl 4-37 USER_DEFAULT_MAILBOX internal static fixed bin(17,0) initial dcl 4-37 USER_LOGBOX internal static fixed bin(17,0) initial dcl 4-37 condition_info_header_ptr automatic pointer dcl 9-4 condition_info_ptr automatic pointer dcl 7-10 mailbox_n_messages automatic fixed bin(17,0) dcl 4-32 message_address_list_user_field based structure level 1 dcl 5-190 message_bit_string_body_section based structure level 1 dcl 5-301 message_bit_string_body_section_bit_string based bit packed unaligned dcl 5-307 message_body_section_parameter based structure level 1 dcl 5-313 message_body_section_parameter_ptr automatic pointer dcl 5-320 message_body_section_ptr automatic pointer dcl 5-280 message_date_user_field based structure level 1 dcl 5-195 message_envelope_parameter based structure level 1 dcl 5-74 message_envelope_parameter_ptr automatic pointer dcl 5-81 message_envelope_ptr automatic pointer dcl 5-69 message_integer_user_field based structure level 1 dcl 5-200 message_n_body_sections automatic fixed bin(17,0) dcl 5-55 message_n_redistributions automatic fixed bin(17,0) dcl 5-55 message_n_user_fields automatic fixed bin(17,0) dcl 5-55 message_preformatted_body_section based structure level 1 dcl 5-292 message_preformatted_body_section_text based char packed unaligned dcl 5-298 message_redistribution_comment based char packed unaligned dcl 5-131 message_redistribution_parameter based structure level 1 dcl 5-139 message_redistribution_parameter_ptr automatic pointer dcl 5-146 message_redistribution_ptr automatic pointer dcl 5-134 message_redistributions_list based structure level 1 dcl 5-109 message_reference_parameter based structure level 1 dcl 5-248 message_reference_parameter_ptr automatic pointer dcl 5-255 message_reference_ptr automatic pointer dcl 5-243 message_reference_subject based char packed unaligned dcl 5-240 message_references_list based structure level 1 dcl 5-219 message_references_list_n_references automatic fixed bin(17,0) dcl 5-55 message_references_list_ptr automatic pointer dcl 5-229 message_subject based char packed unaligned dcl 5-51 message_text_field_ptr automatic pointer dcl 5-270 message_text_field_text based char packed unaligned dcl 5-268 message_text_user_field based structure level 1 dcl 5-183 message_text_user_field_text based char packed unaligned dcl 5-187 message_trace based structure level 1 dcl 5-87 message_trace_n_relays automatic fixed bin(17,0) dcl 5-55 message_trace_ptr automatic pointer dcl 5-105 message_user_field_parameter based structure level 1 dcl 5-208 message_user_field_parameter_ptr automatic pointer dcl 5-215 message_user_field_ptr automatic pointer dcl 5-169 message_user_fields_list based structure level 1 dcl 5-150 sub_error_info_version_1 internal static fixed bin(17,0) initial dcl 8-13 NAMES DECLARED BY EXPLICIT CONTEXT. CALL_EXPUNGE_MESSAGES 002721 constant label dcl 641 set ref 636 CONTINUE_FROM_HANDLER 002720 constant label dcl 638 set ref 625 DELETE_NEXT_MESSAGE 002071 constant label dcl 455 ref 516 RETRIEVE_NEXT_MESSAGE 002400 constant label dcl 549 ref 568 RETURN_FROM_EXPUNGE_MESSAGES_AFTER_ERROR 003115 constant label dcl 693 ref 689 RETURN_FROM_READ_NEW_MESSAGES_AFTER_ERROR 001165 constant label dcl 311 ref 307 abort_deletion_of_message 003253 constant entry internal dcl 506 ref 436 445 abort_expunge_messages 003437 constant entry internal dcl 679 ref 598 643 abort_read_new_messages 003161 constant entry internal dcl 297 ref 202 abort_retrieval_of_message 003345 constant entry internal dcl 558 ref 532 539 add_message_to_chain 003530 constant entry internal dcl 699 ref 450 544 delete_message_from_chain 003610 constant entry internal dcl 737 ref 449 543 662 663 664 665 666 delete_messages 001424 constant entry external dcl 395 expunge_messages 002405 constant entry external dcl 574 grow_message_chain 003121 constant entry internal dcl 266 ref 241 247 253 254 255 mark_processed 001306 constant entry external dcl 351 mark_processed_and_acknowledge 001334 constant entry external dcl 366 open_mailbox 000335 constant entry external dcl 135 rdm_mailbox_interface_ 000322 constant entry external dcl 29 read_message 001173 constant entry external dcl 316 ref 407 435 531 read_new_messages 000603 constant entry external dcl 187 retrieve_messages 002206 constant entry external dcl 523 set_new_current_msg 002146 constant entry external dcl 481 THERE WERE NO NAMES DECLARED BY CONTEXT OR IMPLICATION. STORAGE REQUIREMENTS FOR THIS PROGRAM. Object Text Link Symbol Defs Static Start 0 0 4372 4464 3656 4402 Length 5146 3656 72 445 513 0 BLOCK NAME STACK SIZE TYPE WHY NONQUICK/WHO SHARES STACK FRAME rdm_mailbox_interface_ 228 external procedure is an external procedure. grow_message_chain internal procedure shares stack frame of external procedure rdm_mailbox_interface_. abort_read_new_messages 102 internal procedure is declared options(variable). abort_deletion_of_message 102 internal procedure is declared options(variable). abort_retrieval_of_message 102 internal procedure is declared options(variable). on unit on line 614 150 on unit abort_expunge_messages 102 internal procedure is declared options(variable). add_message_to_chain internal procedure shares stack frame of external procedure rdm_mailbox_interface_. delete_message_from_chain internal procedure shares stack frame of external procedure rdm_mailbox_interface_. STORAGE FOR AUTOMATIC VARIABLES. STACK FRAME LOC IDENTIFIER BLOCK NAME on unit on line 614 000100 ci on unit on line 614 rdm_mailbox_interface_ 000100 n_new_messages rdm_mailbox_interface_ 000101 message_number rdm_mailbox_interface_ 000102 code rdm_mailbox_interface_ 000104 mdl_ptr rdm_mailbox_interface_ 000106 mdl_n_messages rdm_mailbox_interface_ 000110 new_message_list_ptr rdm_mailbox_interface_ 000112 first_new_message_number rdm_mailbox_interface_ 000113 first_new_message_mailbox_idx rdm_mailbox_interface_ 000114 ok_to_delete rdm_mailbox_interface_ 000115 last_deleted_message rdm_mailbox_interface_ 000116 message_idx rdm_mailbox_interface_ 000117 idx rdm_mailbox_interface_ 000120 n_previously_expunged rdm_mailbox_interface_ 000130 rdm_invocation_ptr rdm_mailbox_interface_ 000132 message_list_n_messages rdm_mailbox_interface_ 000134 message_chain_ptr rdm_mailbox_interface_ 000136 mailbox_ptr rdm_mailbox_interface_ 000140 message_ptr rdm_mailbox_interface_ 000142 delete_error_info_ptr rdm_mailbox_interface_ 000144 sub_error_info_ptr rdm_mailbox_interface_ 000176 old_message_chain_ptr grow_message_chain 000200 new_message_chain_ptr grow_message_chain 000202 idx grow_message_chain 000212 message_idx add_message_to_chain 000213 idx add_message_to_chain 000224 idx delete_message_from_chain 000225 jdx delete_message_from_chain THE FOLLOWING EXTERNAL OPERATORS ARE USED BY THIS PROGRAM. r_g_a r_e_as call_ext_in call_ext_out_desc call_ext_out call_int_this_desc return_mac tra_ext_1 enable_op ext_entry ext_entry_desc int_entry op_alloc_ THE FOLLOWING EXTERNAL ENTRIES ARE CALLED BY THIS PROGRAM. command_query_$yes_no continue_to_signal_ cu_$arg_list_ptr cu_$cl cu_$generate_call find_condition_info_ ioa_ ioa_$ioa_switch mail_system_$acknowledge_message mail_system_$expunge_messages mail_system_$mark_message_for_deletion mail_system_$open_mailbox mail_system_$read_message mail_system_$read_new_messages mail_system_$unmark_message_for_deletion ssu_$abort_line ssu_$get_subsystem_and_request_name ssu_$print_message THE FOLLOWING EXTERNAL VARIABLES ARE USED BY THIS PROGRAM. emf_et_$expunged_message error_table_$bad_index iox_$error_output mlsys_et_$all_messages_deleted mlsys_et_$cant_be_deleted mlsys_et_$no_more_messages mlsys_et_$some_messages_not_deleted LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC 29 000321 32 000327 135 000330 138 000360 140 000364 142 000421 144 000423 146 000426 148 000430 149 000443 150 000451 152 000457 153 000460 154 000462 155 000463 157 000465 158 000475 159 000477 160 000505 161 000507 163 000511 164 000521 165 000523 166 000531 167 000533 169 000535 170 000545 172 000546 173 000556 175 000557 176 000567 178 000570 181 000575 183 000576 187 000577 190 000610 191 000614 193 000616 195 000621 201 000624 202 000645 206 000702 208 000705 209 000710 211 000711 214 000733 219 000753 221 000757 223 000771 224 001001 225 001014 227 001016 228 001025 229 001031 231 001037 232 001040 233 001042 234 001043 236 001045 241 001050 242 001056 243 001065 244 001074 245 001076 247 001101 248 001107 249 001117 250 001126 251 001130 253 001133 254 001141 255 001150 257 001157 260 001164 311 001165 316 001166 319 001203 320 001207 322 001211 323 001213 324 001217 325 001222 328 001223 329 001230 330 001233 333 001234 335 001237 336 001243 337 001257 339 001272 340 001273 342 001274 343 001277 345 001301 351 001302 354 001313 355 001317 357 001321 360 001331 366 001332 369 001341 370 001345 372 001347 374 001351 376 001355 378 001361 380 001364 382 001373 384 001375 388 001417 395 001420 398 001431 400 001435 404 001440 405 001447 407 001452 408 001466 413 001525 417 001562 418 001571 421 001643 423 001677 429 001701 430 001703 432 001704 433 001713 435 001716 436 001732 441 001770 442 001774 444 002002 445 002013 449 002045 450 002056 452 002067 455 002071 461 002073 464 002115 465 002117 466 002132 468 002137 471 002141 481 002142 484 002153 489 002157 490 002167 491 002174 492 002175 494 002176 498 002200 499 002202 523 002203 526 002213 528 002217 529 002227 531 002232 532 002246 537 002304 538 002310 539 002321 543 002353 544 002364 546 002375 549 002400 552 002402 574 002403 577 002412 578 002416 580 002420 582 002421 589 002423 591 002425 593 002437 594 002445 595 002446 596 002461 597 002473 598 002475 603 002534 605 002542 606 002547 608 002561 609 002562 614 002564 619 002600 620 002602 622 002621 623 002624 624 002631 625 002641 628 002642 630 002644 635 002710 636 002715 638 002720 641 002721 643 002732 647 002771 649 002772 650 002775 656 003003 658 003004 659 003013 660 003020 661 003022 662 003026 663 003036 664 003047 665 003060 666 003071 667 003102 668 003103 669 003104 671 003112 673 003114 693 003115 695 003120 266 003121 274 003123 276 003126 278 003135 280 003137 281 003147 283 003152 285 003154 287 003157 297 003160 300 003166 302 003211 303 003216 304 003236 307 003247 506 003252 509 003260 511 003303 512 003310 513 003330 516 003341 558 003344 561 003352 563 003375 564 003402 565 003422 568 003433 679 003436 682 003444 684 003467 685 003474 686 003514 689 003525 699 003530 708 003532 710 003535 712 003545 714 003552 716 003553 717 003563 718 003567 719 003572 720 003576 721 003577 723 003600 726 003602 727 003603 729 003607 737 003610 745 003612 747 003615 748 003623 749 003627 750 003637 751 003643 752 003645 754 003647 756 003652 ----------------------------------------------------------- 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