MULTICS TECHNICAL BULLETIN MTB760 To: MTB Distribution From: Mary Crawford Date: 08/06/87 Subject: Privileged Commands and Subroutines ----------------------------------- This MTB describes the internal and/or privileged Commands and Subroutines for the Multics System. ----------------------------------- Comments on this MTB should be placed in forum on System M: >udd>m>mtgs>Multics_Issues (Multics) or directed by Multics mail to: System M: GDixon.Multics or by phone to: Gary Dixon HVN: 862-3593 DDD: 602-862-3593 _________________________________________________________________ Multics project internal documentation; not to be reproduced or distributed outside the Multics project without permission of the Director of MDC. CONTENTS Page PRIVILEGED COMMANDS . . . . . . . . . 1-1 cpmc . . . . . . . . . . . . . . . 1-2 cl_intermediary . . . . . . . . 1-2 create cr . . . . . . . . . . . 1-3 destroy . . . . . . . . . . . . 1-5 enable invoke . . . . . . . . . 1-5 enabled, invoked . . . . . . . . 1-6 generate_call, gc . . . . . . . 1-6 id . . . . . . . . . . . . . . . 1-7 list, ls . . . . . . . . . . . . 1-7 pop_preferred . . . . . . . . . 1-8 preferred . . . . . . . . . . . 1-9 probe, pb . . . . . . . . . . . 1-9 program_interrupt, pi . . . . . 1-10 push_preferred . . . . . . . . . 1-10 run . . . . . . . . . . . . . . 1-11 scheduler . . . . . . . . . . . 1-13 select, sl . . . . . . . . . . . 1-13 set_cl_intermediary . . . . . . 1-14 set_preferred . . . . . . . . . 1-14 start, sr . . . . . . . . . . . 1-15 stop . . . . . . . . . . . . . . 1-15 wakeup . . . . . . . . . . . . . 1-15 PRIVILEGED SUBROUTINES . . . . . . . . 2-1 connection_list_manager_ . . . . . 2-2 add . . . . . . . . . . . . . . 2-2 priv_change_user . . . . . . . . 2-4 priv_delete_name . . . . . . . . 2-5 hpriv_delete_name . . . . . . . 2-5 priv_delete_offset . . . . . . . 2-6 hpriv_delete_offset . . . . . . 2-6 priv_delete_all_for_user . . . . 2-6 priv_get_name . . . . . . . . . 2-7 hpriv_get_name . . . . . . . . . 2-10 priv_get_next_owner . . . . . . 2-11 hpriv_get_next_owner . . . . . . 2-11 hpriv_get_next . . . . . . . . . 2-12 priv_remove_user . . . . . . . . 2-13 init . . . . . . . . . . . . . . 2-13 cpm_ . . . . . . . . . . . . . . . 2-14 block . . . . . . . . . . . . . 2-14 CONTENTS (cont) Page create . . . . . . . . . . . . . 2-14 destroy . . . . . . . . . . . . 2-17 generate_call . . . . . . . . . 2-18 generate_call_preferred . . . . 2-19 generate_call_when_ready . . . . 2-20 get_control_point_meters . . . . 2-20 get_preferred_control_point . . 2-22 get_scheduler_meters . . . . . . 2-23 get_user_cl_intermediary . . . . 2-24 pop_preferred_control_point . . 2-25 push_preferred_control_point . . 2-25 scheduler . . . . . . . . . . . 2-26 set_preferred_control_point . . 2-27 set_user_cl_intermediary . . . . 2-27 start . . . . . . . . . . . . . 2-28 stop . . . . . . . . . . . . . . 2-29 wakeup . . . . . . . . . . . . . 2-30 cpm_data_ . . . . . . . . . . . . . 2-31 n_control_points . . . . . . . . 2-31 dm_hcs_$allocate_journal . . . . . 2-31 dm_hcs_$free_journal . . . . . . . 2-32 dm_hcs_$get_journal_stamp . . . . . 2-33 dm_hcs_$get_max_held_per_journal . 2-33 dm_hcs_$get_n_journals . . . . . . 2-34 dm_hcs_$guaranteed_eligibility_off 2-34 dm_hcs_$guaranteed_eligibility_on . 2-35 dm_hcs_$set_force_write_limit . . . 2-35 dm_hcs_$set_journal_stamp . . . . . 2-36 dm_hcs_$validate_bj_uid . . . . . . 2-37 dsa_tty_ . . . . . . . . . . . . . 2-38 abort . . . . . . . . . . . . . 2-38 attach . . . . . . . . . . . . . 2-39 connect . . . . . . . . . . . . 2-39 detach . . . . . . . . . . . . . 2-41 event . . . . . . . . . . . . . 2-42 index . . . . . . . . . . . . . 2-42 order . . . . . . . . . . . . . 2-43 read . . . . . . . . . . . . . . 2-45 read_echoed . . . . . . . . . . 2-46 read_with_mark . . . . . . . . . 2-47 write . . . . . . . . . . . . . 2-48 write_whole_string . . . . . . . 2-48 get_control_point_id_ . . . . . . . 2-50 hcs_$acl_add1 . . . . . . . . . . . 2-50 hcs_$acl_add . . . . . . . . . . . 2-52 hcs_$acl_delete . . . . . . . . . . 2-55 hcs_$acl_list . . . . . . . . . . . 2-56 hcs_$acl_replace . . . . . . . . . 2-58 CONTENTS (cont) Page hcs_$assign_channel . . . . . . . . 2-61 hcs_$assign_linkage . . . . . . . . 2-61 hcs_$block . . . . . . . . . . . . 2-62 hcs_$chname . . . . . . . . . . . . 2-62 hcs_$combine_linkage . . . . . . . 2-64 hcs_$delete_channel . . . . . . . . 2-65 hcs_$dir_quota_move . . . . . . . . 2-65 hcs_$dir_quota_read . . . . . . . . 2-66 hcs_$echo_negotiate_get_chars . . . 2-68 hcs_$fblock . . . . . . . . . . . . 2-69 hcs_$flush_consecutive_pages . . . 2-70 hcs_$flush_pages . . . . . . . . . 2-71 hcs_$fs_get_brackets . . . . . . . 2-72 hcs_$fs_get_dir_name . . . . . . . 2-73 hcs_$fs_search_get_wdir . . . . . . 2-74 hcs_$fs_search_set_wdir . . . . . . 2-75 hcs_$get_alarm_timer . . . . . . . 2-76 hcs_$get_authorization . . . . . . 2-76 hcs_$get_dates . . . . . . . . . . 2-77 hcs_$get_dates_ptr . . . . . . . . 2-78 hcs_$get_defname_ . . . . . . . . . 2-78 hcs_$get_hex_exponent_control . . . 2-80 hcs_$get_ipc_operands . . . . . . . 2-81 hcs_$get_lp . . . . . . . . . . . . 2-82 hcs_$get_page_trace_signal . . . . 2-82 hcs_$get_segment_ptr_path . . . . . 2-83 hcs_$get_user_raw_mode . . . . . . 2-84 hcs_$get_volume_dump_switches . . . 2-84 hcs_$grow_lot . . . . . . . . . . . 2-85 hcs_$initiate_search_rules . . . . 2-86 hcs_$level_get . . . . . . . . . . 2-88 hcs_$level_set . . . . . . . . . . 2-88 hcs_$link_force . . . . . . . . . . 2-89 hcs_$list_acl . . . . . . . . . . . 2-90 hcs_$list_dir . . . . . . . . . . . 2-91 hcs_$set_copysw . . . . . . . . . . 2-98 hcs_$set_cpu_timer . . . . . . . . 2-99 hcs_$set_damaged_sw . . . . . . . . 2-100 hcs_$set_damaged_sw_seg . . . . . . 2-101 hcs_$set_hex_exponent_control . . . 2-102 hcs_$set_hexfp_control . . . . . . 2-103 hcs_$set_page_trace_signal . . . . 2-104 hcs_$set_pl1_machine_mode . . . . . 2-105 hcs_$set_stack_ptr . . . . . . . . 2-105 hcs_$set_synchronized_sw . . . . . 2-106 hcs_$set_timer . . . . . . . . . . 2-107 hcs_$set_volume_dump_switches . . . 2-107 hcs_$status_for_backup . . . . . . 2-108 CONTENTS (cont) Page hcs_$stop_process . . . . . . . . . 2-109 hcs_$trace_marker . . . . . . . . . 2-109 hcs_$try_to_unlock_lock . . . . . . 2-110 hcs_$tty_abort . . . . . . . . . . 2-111 hcs_$tty_attach . . . . . . . . . . 2-112 hcs_$tty_detach . . . . . . . . . . 2-113 hcs_$tty_detach_new_proc . . . . . 2-114 hcs_$tty_event . . . . . . . . . . 2-115 hcs_$tty_get_line . . . . . . . . . 2-116 hcs_$tty_get_name . . . . . . . . . 2-117 hcs_$tty_index . . . . . . . . . . 2-118 hcs_$tty_order . . . . . . . . . . 2-119 hcs_$tty_read . . . . . . . . . . . 2-137 hcs_$tty_read_echoed . . . . . . . 2-138 hcs_$tty_read_with_mark . . . . . . 2-139 hcs_$tty_state . . . . . . . . . . 2-141 hcs_$tty_write . . . . . . . . . . 2-141 hcs_$tty_write_set_mark . . . . . . 2-143 hcs_$tty_write_whole_string . . . . 2-144 hcs_$unmask_ips . . . . . . . . . . 2-145 hcs_$usage_values . . . . . . . . . 2-146 hpriv_connection_list_ . . . . . . 2-146 installation_gate_ . . . . . . . . 2-147 install_ttt . . . . . . . . . . 2-147 ioi_ . . . . . . . . . . . . . . . 2-148 connect . . . . . . . . . . . . 2-148 connect_pcw . . . . . . . . . . 2-149 get_detailed_status . . . . . . 2-149 get_special_status . . . . . . . 2-150 release_devices . . . . . . . . 2-151 set_channel_required . . . . . . 2-151 set_event . . . . . . . . . . . 2-152 set_status . . . . . . . . . . . 2-152 suspend_devices . . . . . . . . 2-153 timeout . . . . . . . . . . . . 2-154 workspace . . . . . . . . . . . 2-154 ipc_ . . . . . . . . . . . . . . . 2-155 reassign_call_channels . . . . . 2-155 wait_for_an_event . . . . . . . 2-156 list_init_ . . . . . . . . . . . . 2-160 variable_already_zero . . . . . 2-161 login_server_overseer_$test . . . . 2-164 mailbox_$accept_wakeups_index . . . 2-165 mailbox_$add_index . . . . . . . . 2-166 mailbox_$chname_file . . . . . . . 2-167 mailbox_$check_salv_bit_index . . . 2-168 mailbox_$close . . . . . . . . . . 2-169 mailbox_$compact_file . . . . . . . 2-170 CONTENTS (cont) Page mailbox_$compact_index . . . . . . 2-171 mailbox_$copy . . . . . . . . . . . 2-172 mailbox_$create . . . . . . . . . . 2-173 mailbox_$delete . . . . . . . . . . 2-174 mailbox_$delete_index . . . . . . . 2-175 mailbox_$get_mode_file . . . . . . 2-176 mailbox_$get_mode_index . . . . . . 2-177 mailbox_$get_message_count_index . 2-178 mailbox_$get_uid_file . . . . . . . 2-179 mailbox_$get_uid_index . . . . . . 2-180 mailbox_$incremental_read_index . . 2-181 mailbox_$mbx_acl_add . . . . . . . 2-183 mailbox_$mbx_acl_delete . . . . . . 2-185 mailbox_$mbx_acl_list . . . . . . . 2-186 mailbox_$mbx_acl_replace . . . . . 2-188 mailbox_$open . . . . . . . . . . . 2-189 mailbox_$open_if_full . . . . . . . 2-190 $own_incremental_read_index . . . . 2-191 mailbox_$own_read_index . . . . . . 2-193 mailbox_$read_delete_index . . . . 2-195 mailbox_$read_index . . . . . . . . 2-197 mailbox_$read_message_file . . . . 2-199 mailbox_$read_message_index . . . . 2-202 mailbox_$set_max_length_file . . . 2-206 mailbox_$set_safety_switch . . . . 2-207 mailbox_$update_message_index . . . 2-208 mailbox_$validate . . . . . . . . . 2-209 mailbox_$wakeup_add_index . . . . . 2-210 mailbox_$wakeup_aim_add_index . . . 2-212 mca_ . . . . . . . . . . . . . . . 2-214 area . . . . . . . . . . . . . . 2-214 attach_ipc . . . . . . . . . . . 2-215 attach_mca . . . . . . . . . . . 2-216 config . . . . . . . . . . . . . 2-216 config_file . . . . . . . . . . 2-217 detach_ipc . . . . . . . . . . . 2-221 detach_mca . . . . . . . . . . . 2-221 diskette . . . . . . . . . . . . 2-222 diskette_read . . . . . . . . . 2-223 display . . . . . . . . . . . . 2-225 load_ipc . . . . . . . . . . . . 2-225 process_io_event . . . . . . . . 2-226 read_data . . . . . . . . . . . 2-227 reset . . . . . . . . . . . . . 2-228 reset_ipc . . . . . . . . . . . 2-228 return_status . . . . . . . . . 2-230 tandd_read_data . . . . . . . . 2-231 tandd_write_data . . . . . . . . 2-232 CONTENTS (cont) Page tandd_write_text . . . . . . . . 2-233 work_space . . . . . . . . . . . 2-234 mca_priv_ . . . . . . . . . . . . . 2-239 force_reset . . . . . . . . . . 2-239 force_unlock . . . . . . . . . . 2-239 mca_priv_load_ipcs . . . . . . . 2-240 reset_ipcs . . . . . . . . . . . 2-241 trace . . . . . . . . . . . . . 2-241 mdc_ . . . . . . . . . . . . . . . 2-242 create_dir . . . . . . . . . . . 2-242 create_dirx . . . . . . . . . . 2-243 create_dirx_acct . . . . . . . . 2-244 delete_dir . . . . . . . . . . . 2-245 delete_volume_quota . . . . . . 2-246 find_lvid . . . . . . . . . . . 2-246 find_lvname . . . . . . . . . . 2-247 find_volname . . . . . . . . . . 2-247 get_lv_access . . . . . . . . . 2-248 lvname_info . . . . . . . . . . 2-249 pvname_info . . . . . . . . . . 2-250 read_disk_tabel . . . . . . . . 2-251 set_account_restrict_path . . . 2-251 set_mdir_account . . . . . . . . 2-252 set_mdir_owner . . . . . . . . . 2-253 set_mdir_quota . . . . . . . . . 2-253 set_volume_quota . . . . . . . . 2-254 status . . . . . . . . . . . . . 2-255 mhcs_ . . . . . . . . . . . . . . . 2-260 get_seg_usage . . . . . . . . . 2-260 get_seg_usage_ptr . . . . . . . 2-261 mseg_ . . . . . . . . . . . . . . . 2-262 find_hdr_msg . . . . . . . . . . 2-262 find_msg . . . . . . . . . . . . 2-263 message_segment_$add_file . . . . . 2-263 message_segment_$add_index . . . . 2-264 message_segment_$chname_file . . . 2-265 message_segment_$check_salv_bit_file 2-267 $check_salv_bit_index . . . . . . . 2-268 message_segment_$close . . . . . . 2-269 message_segment_$compact_file . . . 2-269 message_segment_$compact_index . . 2-270 message_segment_$copy . . . . . . . 2-271 message_segment_$create . . . . . . 2-272 message_segment_$delete . . . . . . 2-273 message_segment_$delete_file . . . 2-274 message_segment_$delete_index . . . 2-275 message_segment_$get_mode_file . . 2-276 message_segment_$get_mode_index . . 2-277 CONTENTS (cont) Page $get_message_count_file . . . . . . 2-278 $get_message_count_index . . . . . 2-279 $incremental_read_file . . . . . . 2-280 $incremental_read_index . . . . . . 2-282 message_segment_$ms_acl_add . . . . 2-284 message_segment_$ms_acl_delete . . 2-286 message_segment_$ms_acl_list . . . 2-288 message_segment_$ms_acl_replace . . 2-289 message_segment_$open . . . . . . . 2-291 $own_incremental_read_file . . . . 2-292 $own_incremental_read_index . . . . 2-294 message_segment_$own_read_file . . 2-296 message_segment_$own_read_index . . 2-298 $read_delete_file . . . . . . . . . 2-300 $read_delete_index . . . . . . . . 2-302 $read_file . . . . . . . . . . . . 2-304 message_segment_$read_index . . . . 2-306 $read_message_file . . . . . . . . 2-308 $read_message_index . . . . . . . . 2-311 message_segment_$set_max_length_file 2-314 $set_safety_switch . . . . . . . . 2-315 message_segment_$update_message_file 2-316 $update_message_index . . . . . . . 2-317 message_segment_$validate . . . . . 2-318 pnt_fs_gate_ . . . . . . . . . . . 2-319 add_acl_entries . . . . . . . . 2-319 chname_file . . . . . . . . . . 2-321 delete_acl_entries . . . . . . . 2-322 list_acl . . . . . . . . . . . . 2-324 replace_acl . . . . . . . . . . 2-325 validate . . . . . . . . . . . . 2-326 priv_connection_list_ . . . . . . . 2-327 rcp_ . . . . . . . . . . . . . . . 2-328 acquire . . . . . . . . . . . . 2-328 assign_device . . . . . . . . . 2-332 attach . . . . . . . . . . . . . 2-334 attach_lv . . . . . . . . . . . 2-337 cancel_id_string . . . . . . . . 2-338 check_assign . . . . . . . . . . 2-339 check_attach . . . . . . . . . . 2-340 check_attach_lv . . . . . . . . 2-342 copy_list . . . . . . . . . . . 2-343 detach . . . . . . . . . . . . . 2-345 detach_lv . . . . . . . . . . . 2-346 get_status . . . . . . . . . . . 2-347 list_resources . . . . . . . . . 2-348 promote . . . . . . . . . . . . 2-350 release . . . . . . . . . . . . 2-351 CONTENTS (cont) Page set_status . . . . . . . . . . . 2-355 unassign . . . . . . . . . . . . 2-357 unassign_device . . . . . . . . 2-358 run_test_as . . . . . . . . . . . . 2-359 restart_fault . . . . . . . . . . . 2-360 cleanup_entry . . . . . . . . . 2-360 restart_entry . . . . . . . . . 2-361 send_as_request_ . . . . . . . . . 2-362 block . . . . . . . . . . . . . 2-362 no_block . . . . . . . . . . . . 2-384 send_system_message_ . . . . . . . 2-387 send_system_message_ . . . . . . 2-387 set_ext_variable_ . . . . . . . . . 2-389 for_linker . . . . . . . . . . . 2-389 sys_log_ . . . . . . . . . . . . . 2-393 system_message_handler_ . . . . . . 2-404 test_system_control . . . . . . . . 2-405 user_message_ . . . . . . . . . . . 2-408 user_message_admin_ . . . . . . . . 2-411 read_message . . . . . . . . . . 2-412 user_message_priv_ . . . . . . . . 2-414 add_message . . . . . . . . . . 2-414 delete_message_id . . . . . . . 2-416 delete_process_messages . . . . 2-417 system_init . . . . . . . . . . 2-417 ws_tty_ . . . . . . . . . . . . . . 2-418 abort . . . . . . . . . . . . . 2-418 attach . . . . . . . . . . . . . 2-418 detach . . . . . . . . . . . . . 2-419 event . . . . . . . . . . . . . 2-420 order . . . . . . . . . . . . . 2-421 read . . . . . . . . . . . . . . 2-422 read_echoed . . . . . . . . . . 2-423 read_with_mark . . . . . . . . . 2-424 write . . . . . . . . . . . . . 2-425 write_whole_string . . . . . . . 2-426 SECTION 1 Privileged Commands This section provides documentation for Multics Privileged and Internal Commands. Name: cpmc This command is the command level interface to the control point management facility. SYNTAX AS A COMMAND cpmc operation {arguments} {-control_args} SYNTAX AS AN ACTIVE FUNCTION [cpmc operation {arguments}] ARGUMENTS operation identifies the operation to be performed by this invocation of control_point_manager_call. Detailed descriptions of the supported operations follow. CONTROL ARGUMENTS -control_args are specific to the requested operation and are described below. NOTES Many of the operations described below act on an arbitrary control point as opposed to the current control point. The desired control point is selected by supplying the operation with the control point's unique ID. A control point's unique ID is a 12 digit octal value which is displayed by this command's list operation. In addition, the list operation also displays a 6 digit short form of the ID which may also be used to select the control point. When using either form of the control point's unique ID, leading zeroes may be omitted Operation: cl_intermediary This operation returns or displays the identity of the user supplied command level intermediary for the specified control point. SYNTAX AS AN ACTIVE FUNCTION [cpmc cl_intermediary ID] ____ ____ cpmc cpmc ____ ____ SYNTAX AS A COMMAND cpmc cl_intermediary ID ARGUMENTS ID is the unique ID of the desired control point. NOTES When used as an active function, this operation returns the identity of the command level intermediary in a form suitable for use with the set_cl_intermediary operation described below. Operation: create cr This operation creates a new control point. SYNTAX cpmc cr ENTRY {INFO_PTR} {-control_args}" ARGUMENTS entry is the initial procedure to be run in the new control point. ENTRY is a virtual entrypoint as accepted by the cv_entry_ subroutine. info_ptr is a pointer which is passed as the single argument to the new control point's initial procedure. INFO_PTR is a virtual pointer as accepted by the cv_ptr_ subroutine. If no INFO_PTR is specified, a null pointer is passed to the initial procedure. CONTROL ARGUMENTS -brief, -bf does not display the message described above. -cl_intermediary ENTRY specifies the entrypoint to be used as the command level intermediary for the new control point. ENTRY is a virtual entrypoint as accepted by the cv_entry_ subroutine. ____ ____ cpmc cpmc ____ ____ -comment STR, -com STR specifies a description of the new control point which will be displayed by the list operation The default description is the name of the control point's initial procedure. -default_cl_intermediary specifies that the new control point is to used the standard command level intermediary provided by the control point manager. (Default) -dependent specifies that the new control point will be a child of the current control point. -independent specifies that the new control point will be independent of all other control points in the process. At present, the independence of a control point only affects when the storage it has used will be released after it is destroyed. (Default) -long, -lg displays a message giving the ID of the newly created control point. (Default) -no_start, -nsr does not mark the new control point as ready for execution. (Default) -not_preferred does not make the new control point the preferred control point. (Default) -preferred makes the new control point the preferred control point. This control argument may not be specified unless "-start" is also specified. -priority N sets the scheduling priority of the new control point to N which must be an integer. A ready control point whose priority is 1 is always scheduled before any ready control point whose priority is 2, etc. The default priority is 1. -separate_io_switches {STR}, -sepios {STR} specifies that the new control point is to have its own set of standard I/O switches (i.e., user_i/o, user_input, user_output, and error_output). If STR is supplied, it is the attach description for the new control point's user_i/o switch. If STR is not supplied, its user_i/o will be attached ____ ____ cpmc cpmc ____ ____ via the syn_ I/O module to the current control point's user_i/o. In either case, the actual attachment of the I/O switches will be performed in the new control point before its initial procedure is invoked. -shared_io_switches, -shios specifies that the new control point is to use the same set of standard I/O switches as the current control point (Default) -start, -sr marks the new control point as ready for execution. Actual execution of the control point will begin when all higher priority control points in the process are blocked waiting for an IPC wakeup. NOTES The run operation, described below, is the preferred method to execute a command line in a control point. Operation: destroy This operation destroys the specified control point. SYNTAX cpmc destroy ID ARGUMENTS ID is the unique ID of the control point to be destroyed. NOTES When a control point is destroyed, the cleanup handlers of all entrypoints still active in the control point are run, the control point's standard I/O switches are detached, and the storage used by its stack is released. Operation: enable invoke This operation enables control point management. SYNTAX cpmc enabled ____ ____ cpmc cpmc ____ ____ NOTES Control point management is enabled automatically by the first use of this command's create or run operations or by the first call to the cpm_$create entrypoint. Operation enabled, invoked This operation returns "true" if control point management is already enabled in the process and "false" otherwise. SYNTAX AS AN ACTIVE FUNCTION [cpmc enabled] SYNTAX AS A COMMAND cpmc enabled Operation: generate_call, gc This operation queues a call to an arbitrary entrypoint in a specific control point and, optionally, forces the immediate execution of said call. SYNTAX cpmc gc ID ENTRY {INFO_PTR} {-control_args} ARGUMENTS ENTRY identifies the entrypoint to be run. ENTRY is a virtual entrypoint as accepted by the cv_entry_ subroutine. ID is the unique ID of the control point in which the entrypoint is to be run. INFO_PTR is a pointer which is passed as the single argument to the above entrypoint. INFO_PTR is a virtual pointer as accepted by the cv_ptr_ subroutine. If no INFO_PTR is specified, a null pointer is passed to the entrypoint. ____ ____ cpmc cpmc ____ ____ CONTROL ARGUMENTS -defer_until_ready, -dur specifies that execution of the entrypoint is not to occur until the control point is next ready for execution and is subsequently selected for execution by the control point scheduler. If the control point is already ready for execution, execution of the entrypoint will still be delayed until said control is next scheduled. -immediate, -im specifies that execution of the entrypoint is to take place immediately. (Default) -not_preferred specifies that the target control point will not be made the preferred control point during the entrypoint's execution. (Default) -preferred specifies that the target control point is to be temporarily made the preferred control point while execution of the entrypoint takes place. This control argument is incompatible with the "-defer_until_ready" control argument. NOTES This operation enables an entry point to be executed as if it were executed by the control point itself. Operation: id This operation returns the unique ID of the current control point. SYNTAX AS AN ACTIVE FUNCTION [cpmc id] SYNTAX AS A COMMAND cpmc id Operation: list ls This operation lists the status of some or all control points active in the process. ____ ____ cpmc cpmc ____ ____ SYNTAX cpmc ls {IDs} {-control_args} ARGUMENTS IDs are the unique IDs of individual control points whose status is to be displayed. CONTROL ARGUMENTS -all, -a specifies that the status of all active control points is to be displayed. -meters specifies that the usage meters of the control points listed are also to be displayed. A control point's usage meters includes its CPU usage, segment and page faults counts, and VTOC I/O counts. -no_meters specifies that no usage meters are to be displayed. (Default) NOTES At least one control point ID or the "-all" control argument must be specified for this operation. Use of both control point IDs and the "-all" control argument is not permitted. The information always displayed for a control point is its unique ID in both long and short forms, its state (e.g., ready, blocked), and its description as supplied in the call to cpm_$create or the use of this command's create or run operations. If the status of more than one control point is requested and usage meters are also requested via the "-meters" control argument, this operation will also display the usage meters of the control point scheduler. Operation: pop_preferred This operation resets the preferred control point to the one in force before the last use of the push_preferred operation. See the push_preferred operation below for more information. ____ ____ cpmc cpmc ____ ____ SYNTAX cpmc pop_preferred FLAG ARGUMENTS FLAG is either "true" or "false" and should be the value returned by the last use of the push_preferred operation. Operation: preferred This entrypoint returns the ID of the preferred control point, if any. SYNTAX AS AN ACTIVE FUNCTION [cpmc preferred] SYNTAX AS A COMMAND cpmc preferred NOTES The preferred control point is always given priority for execution over all other control points whenever it is ready. The effect of this treatment is to cause the preferred control point to have control over the user's terminal, if it uses the terminal, as it will receive all IPC wakeups generated by the terminal. When control point management is first enabled, the root control point is made the preferred control point. Operation: probe, pb This operation invokes the probe debugger in the specified control point. SYNTAX cpmc pb ID ARGUMENTS ID is the unique ID of the control point in which probe is to be run. ____ ____ cpmc cpmc ____ ____ NOTES This operation will make the specified control point the preferred control point while probe is executing in order to insure that probe can communicate with the user's terminal. Operation: program_interrupt, pi This operation signals the program_interrupt condition on the stack of the specified control point. SYNTAX cpmc pi ID {-control_args} ARGUMENTS ID is the unique ID of the control point in which program_interrupt is to be signalled. CONTROL ARGUMENTS -not_preferred specifies that the control point will not be made the preferred control point. -preferred specifies that the control point will be made the preferred control point before program_interrupt is signalled. (Default) Operation: push_preferred This operation makes the specified control point the preferred control point on a temporary basis. SYNTAX AS AN ACTIVE FUNCTION [cpmc push_preferred ID] SYNTAX AS A COMMAND cpmc push_preferred ID ____ ____ cpmc cpmc ____ ____ ARGUMENTS ID is the unique ID of the control point which is to be made the preferred control point. NOTES This operation returns "true" if it was able to make the specified control point the preferred control point. The result of this operation should be used as input to the pop_preferred operation described above to restore the previous preferred control point when the actions requiring the new control point to be preferred are completed. The following version 2 exec_com fragment demonstrates the proper use of the push_preferred and pop_preferred operations. &set pushed false &on cleanup &begin cpmc pop_preferred &(pushed) &end &set pushed [cpmc push_preferred &1] ... cpmc pop_preferred &(pushed) Operation: run This operation creates a new control point to execute the supplied command line. The control point is destroyed when the command line completes. SYNTAX cpmc run {-control_args} COMMAND_LINE ARGUMENTS COMMAND_LINE is the command line to be executed. The command line starts with the first non-control argument supplied to the run operation. If the command line is to start with a hyphen (-), the "-string" control argument should be used to signify the start of the command line. CONTROL ARGUMENTS -brief, -bf does not display the message described above. ____ ____ cpmc cpmc ____ ____ -cl_intermediary ENTRY specifies the entrypoint to be used as the command level intermediary for the new control point. ENTRY is a virtual entrypoint as accepted by the cv_entry_ subroutine. -comment STR, -com STR specifies a description of the new control point which will be displayed by the list operation The default description is the command line which it will execute. -default_cl_intermediary specifies that the new control point is to used the standard command level intermediary provided by the control point manager. (Default) -dependent specifies that the new control point will be a child of the current control point. -independent specifies that the new control point will be independent of all other control points in the process. At present, the independence of a control point only affects when the storage it has used will be released after it is destroyed. (Default) -long, -lg displays a message giving the ID of the newly created control point. (Default) -no_start, -nsr does not make the new control point as ready for execution. -not_preferred does not make the new control point the preferred control point. -preferred makes the new control point the preferred control point. This control argument is incompatible with the "-no_start" control argument. (Default) -priority N sets the scheduling priority of the new control point to N which must be an integer. A ready control point whose priority is 1 is always scheduled before any ready control point whose priority is 2, etc. The default priority is 1. -separate_io_switches {STR}, -sepios {STR} specifies that the new control point is to have its own set of standard I/O switches (i.e., user_i/o, user_input, ____ ____ cpmc cpmc ____ ____ user_output, and error_output). If STR is supplied, it is the attach description for the new control point's user_i/o switch. If STR is not supplied, its user_i/o will be attached via the syn_ I/O module to the current control point's user_i/o. In either case, the actual attachment of the I/O switches will be performed in the new control point before its initial procedure is invoked. -shared_io_switches, -shios specifies that the new control point is to use the same set of standard I/O switches as the current control point (Default) -start, -sr marks the new control point as ready for execution. Actual execution of the control point will begin when all higher priority control points in the process are blocked waiting for an IPC wakeup. (Default) -string COMMAND_LINE, -str COMMAND_LINE specifies that the command line to be executed starts with the next argument to the run operation. Operation: scheduler This operation blocks the current control point and invokes the scheduler to run the appropriate ready control point. SYNTAX cpmc scheduler NOTES It is not usually necessary to use this operation to schedule control points, because ipc_ calls the control point scheduler when a wakeup is sent to a control point. Operation: select, sl This operation marks the specified control point as ready for execution and makes it the preferred control point. SYNTAX cpmc sl ID ____ ____ cpmc cpmc ____ ____ ARGUMENTS ID is the unique ID of the control point to be selected. Operation: set_cl_intermediary This operation sets the command level intermediary for the specified control point. SYNTAX cpmc set_cl_intermediary ID {ENTRY} {-control_args} ARGUMENTS ENTRY is the new command level intermediary for the entrypoint. ENTRY is a virtual entrypoint as accepted by the cv_entry_ subroutine. ID is the unique ID of the control point whose command level intermediary is to be set. ARGUMENTS -default, -dft specifies that the command level intermediary for the control point is to be restored to the default supplied by the control point manager. NOTES Either an entrypoint must be supplied or the "-default" control argument must be used. Both an entrypoint and "-default" may not be used in a single invocation of this command. Operation: set_preferred This entrypoint makes the specified control point the preferred control. SYNTAX cpmc set_preferred ID ____ ____ cpmc cpmc ____ ____ ARGUMENTS control_point_id (Input) is the unique ID of the control point which will become the preferred control point. Operation: start, sr This entrypoint marks the specified control point as ready for execution. SYNTAX cpmc sr ID ARGUMENTS ID is the unique ID of the control point which is to be marked ready. Operation: stop This entrypoint marks the specified control point as not ready for execution. The control point will not run until it is again made ready by this command's select or start operations or by a call to the cpm_$start entrypoint. SYNTAX cpmc stop ID ARGUMENTS ID is the unique ID of the control point which is to be stopped. Operation: wakeup This operation sends a generic wakeup to the specified control point. SYNTAX cpmc wakeup ID ____ ____ cpmc cpmc ____ ____ ID is the unique ID of the control point which is to be awakened. NOTES It is not usually necessary to use this operation to wakeup blocked control points, because ipc_ calls the control point scheduler when a wakeup is sent to a control point. SECTION 2 Privileged Subroutines This section provides documentation for Multics Privileged and Internal Subroutines. ________________________ ________________________ connection_list_manager_ connection_list_manager_ ________________________ ________________________ Name: connection_list_manager_ The connection_list_manager_ module maintains the inner-ring list of active connections. The entries in this module are used to add, delete, update, and obtain information about entries in the active connection list. Most of these entries (apart from the "get_*" entries) are usually called in the inner ring by network-specific modules, but all are available through one of the gates priv_connection_list_ or hpriv_connection_list_. The gate entries and their associated target entries are listed at the end of this module description. These entries may be viewed as being divided into two classes: privileged and highly privileged. Privileged entries are available through priv_connection_list_, and can be used on connections of which the calling process is the owner. Highly privileged entries are available through hpriv_connection_list_, and allow the caller to operate on any connection entry. In general, the presence of the string "hpriv_", or "priv_" at the beginning of the name of an entry indicates the level of privilege associated with it. Entry: connection_list_manager_$add This entry adds a connection to the list. The connection will be assigned to the calling process as the "owner", and to the specified user process as the "user". This entry is privileged. USAGE dcl connection_list_manager_$add entry (char (*), fixed bin (35), char (*), char (*), char (*), fixed bin, bit (18), fixed bin (35)) call connection_list_manager_$add (connection_name, connection_handle, network_service_type, force_disconnect_entry, force_accounting_flush_entry, usage_type, connection_offset, code) ________________________ ________________________ connection_list_manager_ connection_list_manager_ ________________________ ________________________ ARGUMENTS connection_name is the name of the connection, as returned by login_service_entries.listen. (Input) connection_handle is the unique identifier of the connection, as returned by login_service_entries.listen. (Input) network_service_type is the name of the service provided by the top-level networking entity for the connection. (Input) force_disconnect_entry is the name of the force_disconnect entrypoint returned by net_info_$get_service_entries. Note that this must be a name and not an entry variable because it may have to be used by a process other than the caller. (Input) force_accounting_flush_entry is the name of the entrypoint which can be used to force accounting for the particular process to be made. Note that this must be a name and not an entry variable because it may have to be used by a process other than the caller. (Input) usage_type is an indicator of the way in which the connection is going to be used, as described for login_service_entries.assign_connection (above). (Input) connection_offset is the offset in the connection list at which the specified connection has been added. This can be used by other entries to find and/or delete the specific connection with comparative efficiency. (Output) code is a standard system status code. (Output) NOTES The force_disconnect_entry and force_accounting_flush_entry fields are character strings defining an entrypoint to do the assigned task. The target entrypoint is expected to be declared as ________________________ ________________________ connection_list_manager_ connection_list_manager_ ________________________ ________________________ USAGE dcl module$entrypoint entry (char (*), fixed bin (35)) call module$entrypoint (connection_name, code) ARGUMENTS connection_name is the name of the connection to pass to the entry. (Input) code is a standard system status code. (Output) Entry: connection_list_manager_$priv_change_user This entry is used to change the user process in the table entry. The calling process must be the owner. USAGE dcl connection_list_manager_$priv_change_user entry (bit (18), bit (36) aligned, char (*), fixed bin, fixed bin (71), bit (72) aligned, fixed bin (35))) call connection_list_manager_$priv_change_user (connection_offset, user_process_id, user_group_id, usage_type, terminate_event_channel, initializer_handle, code) ARGUMENTS connection_offset is the offset of the connection in the list, as returned by the add entry, above. (Input) user_process_id is the process ID of the user process to which the connection is assigned. (Input) user_group_id is the process group ID (person.project.tag) of the user process to which the connection is assigned. (Input) terminate_event_channel is the name of an event channel over which a wakeup can be sent to the owner process if the user process terminates. (Input) ________________________ ________________________ connection_list_manager_ connection_list_manager_ ________________________ ________________________ initializer_handle is the handle used in requests from the login server to the Initializer concerning this connection. (Input) usage_type indicates the way the connection is to be used by the process, i.e., login, dial, etc. Its possible values are declared in ls_usage_types.incl.pl1; see the description of login_service_entries.assign_connection for the possible values. (Input) code is a standard system status code. (Output) Entry: connection_list_manager_$priv_delete_name This entry deletes the connection with the specified name from the active connection list. The calling process must be the owner of the connection. USAGE dcl connection_list_manager_$priv_delete_name entry (char (*), fixed bin (35)) call connection_list_manager_$priv_delete_name (connection_name, code) ARGUMENTS connection_name is the name of the connection, as above. (Input) code is a standard system status code. (Output) This entry deletes the connection with the specified name from the active connection list, no matter what process is the owner. The calling sequence is the same as for the priv_delete_name entry, above. ________________________ ________________________ connection_list_manager_ connection_list_manager_ ________________________ ________________________ Entry: connection_list_manager_$priv_delete_offset This entry deletes the connection with the specified offset from the active connection list. The calling process must be the owner of the connection. USAGE dcl connection_list_manager_$priv_delete_offset entry (bit (18), fixed bin (35)) call connection_list_manager_$priv_delete_offset (connection_offset, code) ARGUMENTS connection_offset is the connection offset as returned by the add entry, above. (Input) code is a standard system status code. (Output) Entry: connection_list_manager_$priv_delete_all_for_user This entry deletes the connection with the specified offset from the active connection list, no matter what process is the owner. The calling sequence is the same as for the priv_delete_offset entry, above. Entry: connection_list_manager_$priv_delete_offset This entry deletes all the connections for a specified user process for which the calling process is the owner. USAGE dcl connection_list_manager_$priv_delete_all_for_user entry (bit (36) aligned, fixed bin (35)) call connection_list_manager_$priv_delete_all_for_user (user_process_id, code) ARGUMENTS user_process_id is the process ID of the user process whose connections are to be deleted. (Input) ________________________ ________________________ connection_list_manager_ connection_list_manager_ ________________________ ________________________ code is a standard system status code. (Output) This entry deletes all the connections for a specified user process, no matter what process is the owner. It has the same calling sequence as priv_delete_all_for_user (above). Entry: connection_list_manager_$priv_get_name This entry returns information about the connection with the specified name; the calling process must be the owner of the connection. USAGE dcl connection_list_manager_$priv_get_name entry (char (*), ptr, fixed bin (35)) call connection_list_manager_$priv_get_name (connection_name, connection_info_ptr, code) ARGUMENTS connection_name is the name of the connection about which information is to be returned. (Input) connection_info_ptr is a pointer to the active_connection_info structure described in "Notes", below. (Input) code is a standard system status code. (Output) ________________________ ________________________ connection_list_manager_ connection_list_manager_ ________________________ ________________________ NOTES The connection_info_ptr points to the following structure (declared in active_connection_info.incl.pl1): dcl 1 active_connection_info aligned based, 2 version char (8), 2 connection_name char (32), 2 network_service_type char (32), 2 user_process_id bit (36), 2 user_group_id char (32), 2 owner_process_id bit (36), 2 owners_group_id char (32), 2 terminate_event_channel fixed bin (71), 2 owner_initializer_handle bit (72), 2 force_disconnect_entry char (64), 2 force_accounting_flush_entry char (64), 2 connection_handle fixed bin (35), 2 usage_type fixed bin, 2 flags, 3 delegated bit (1) unaligned, 3 mbz_bits bit (35) unaligned, 2 offset bit (18); STRUCTURE ELEMENTS ARGUMENTS version is the version of the structure. It must be filled in by the caller with the value ACT_INFO_VERSION_1. connection_name is the name of the connection. network_service_type is the name of the service provided by the top-level networking entity for the connection. user_process_id is the process ID of the user process to which the connection is assigned. user_group_id is the process group ID (person.project.tag) of the user process. owner_process_id is the process ID of the owning process. ________________________ ________________________ connection_list_manager_ connection_list_manager_ ________________________ ________________________ owner_group_id is the process group ID (person.project.tag) of the "owning" process. terminate_event_channel is the event channel over which the owner may be sent a wakeup if the user process is terminated. owner_initializer_handle is the handle used by the owner to communicate with the Initializer about the connection. It is used to notify the Initializer if the connection is terminated and the owner process no longer exists. force_disconnect_entry is the name of the entrypoint to be called to force termination of the connection. It is used during login server initialization if neither the user process nor the owner process exists. force_accounting_flush_entry is the name of the entrypoint to be called to force all current accounting data for the connection to be added to the network accounting table. It is used during during process termination to make sure the latest accounting data is available for the connection. connection_handle is the unique identifier of the connection, as described under connection_list_manager_$add, above. usage_type specifies way in which the connection is used by the process, as described under connection_list_manager_$add, above. delegated indicates that the connection has been assigned to a user other than the owner. offset is the offset of the connection in the list. ________________________ ________________________ connection_list_manager_ connection_list_manager_ ________________________ ________________________ connection_list_manager_$hpriv_get_name This entry returns information about the connection with the specified name, no matter what process is the owner. The calling sequence is the same as for the priv_get_name entry, above. Entry: connection_list_manager_$priv_get_next_user entry This entry returns information about the next connection after the one at a specified offset assigned to the specified user process, for which the calling process is the owner. USAGE dcl connection_list_manager_$priv_get_next_user entry (bit (36) aligned, bit (18), ptr, fixed bin (35)) call connection_list_manager_$priv_get_next_user (user_process_id, connection_offset, connection_info_ptr, code) ARGUMENTS user_process_id is the process ID of the user process. (Input) connection_offset is the offset in the list of the connection relative to which the next connection is to be found. If it is "0"b, information about the first connection for the specified user is returned. (Input) connection_info_ptr is a pointer to the active_connection_info structure, as above. (Input) code is a standard system status code. (Output) ________________________ ________________________ connection_list_manager_ connection_list_manager_ ________________________ ________________________ Entry: connection_list_manager_$priv_get_next_user This entry returns information about the next connection after the one at a specified offset assigned to the specified user process, no matter what process is the owner. The calling sequence is the same as for the priv_get_next_user entry, above. Entry: connection_list_manager_$priv_get_next_owner entry This entry returns information about the next connection after the one at a specified offset for which the calling process is the owner. USAGE dcl connection_list_manager_$priv_get_next_owner entry (bit (18), ptr, fixed bin (35)) call connection_list_manager_$priv_get_next_owner (connection_offset, connection_info_ptr, code) ARGUMENTS connection_offset is the offset in the list of the connection relative to which the next connection is to be found. If it is "0"b, information about the first connection for which the calling process is the owner is returned. (Input) connection_info_ptr is a pointer to the active_connection_info structure, as above. (Input) code is a standard system status code. (Output) Entry: connection_list_manager_$hpriv_get_next_owner entry This entry returns information about the next connection after the one at a specified offset for which a specified process is the owner. ________________________ ________________________ connection_list_manager_ connection_list_manager_ ________________________ ________________________ USAGE dcl connection_list_manager_$hpriv_get_next_owner entry (bit (18), bit (36), ptr, fixed bin (35)) call connection_list_manager_$hpriv_get_next_owner (connection_offset, owner_process_id, connection_info_ptr, code) ARGUMENTS connection_offset is the offset in the list of the connection relative to which the next connection is to be found. If it is "0"b, information about the first connection for the specified owner is returned. (Input) owner_process_id is the process ID of the process for which connections are to be found. (Input) connection_info_ptr is a pointer to the active_connection_info structure, as above. (Input) code is a standard system status code. (Output) Entry: connection_list_manager_$hpriv_get_next entry This entry returns information about the next connection after the one at a specified offset. USAGE dcl connection_list_manager_$hpriv_get_next entry (bit (18), ptr, fixed bin (35)) call connection_list_manager_$hpriv_get_next (connection_offset, connection_info_ptr, code) ARGUMENTS connection_offset is the offset in the list of the connection relative to which the next connection is to be found. If it is "0"b, information about the first connection in the list is returned. (Input) ________________________ ________________________ connection_list_manager_ connection_list_manager_ ________________________ ________________________ connection_info_ptr is a pointer to the active_connection_info structure, as above. (Input) code is a standard system status code. (Output) Entry: connection_list_manager_$priv_remove_user This entry is called to make the specified process cease to be the user of the specified connection. No new user process is assigned by this entry. The calling process must be the owner of the connection. USAGE dcl connection_list_manager_$priv_remove_user entry (bit (18), bit (36), fixed bin (35)) call connection_list_manager_$priv_remove_user (connection_offset, user_process_id, code) ARGUMENTS connection_offset is the offset of the connection in the list. (Input) user_process_id is the process ID of the expected current user of the connection. If the user process ID in the connection entry does not match this argument, no action is taken, and a nonzero status code is returned. (Input) code is a standard system status code. (Output) Entry: connection_list_manager_$init This entry initializes the active connection list segment. It is called once per bootload. It will create the segment if it does not already exist. USAGE dcl connection_list_manager_$init entry (fixed bin (35)) call connection_list_manager_$init (code) ________________________ ____ connection_list_manager_ cpm_ ________________________ ____ code is a standard system status code. (Output) ________________________________________ Name: cpm_ Entry: cpm_$block This entrypoint places the current control point in the blocked state. USAGE dcl cpm_$block entry (); call cpm_$block (); NOTES Once a control point is in the blocked state, it will not become eligible for execution until a subsequent call to cpm_$wakeup or cpm_$generate_call. Therefore, this entrypoint should be used with caution. The primary caller of this entrypoint is intended to be ipc_. Entry: cpm_$create This entrypoint creates a new control point. USAGE dcl cpm_$create entry (pointer, bit (36) aligned, fixed binary (35)); call cpm_$create (ccpi_ptr, control_point_id, code); ____ ____ cpm_ cpm_ ____ ____ ARGUMENTS ccpi_ptr is a pointer to the create_control_point_info structure which describes the control point to be created (see "Entry Information" below). (Input) control_point_id is set to the unique ID of the newly created control point. (Output) code is a standard system status code. (Output) Amongst the possible returned codes, the following codes have special significance to this entry: error_table_$unimplemented_version The version of the create_control_point_info structure supplied by the caller is not supported by this entrypoint. ENTRY INFORMATION This structure is declared in the cpm_create_ctrl_pt_info include file as follows: dcl 1 create_control_point_info aligned based (ccpi_ptr), 2 header, 3 version character (8) unaligned, 3 comment character (64) unaligned, 3 initproc, 4 entry entry (pointer) variable, 4 info_ptr pointer, 3 user_cl_intermediary entry (bit (1) aligned) variable, 3 priority fixed binary, 3 flags, 4 independent bit (1) unaligned, 4 separate_standard_iocbs bit (1) unaligned, 4 user_io_attach_desc_given bit (1) unaligned, 4 user_cl_intermediary_given bit (1) unaligned, 4 pad bit (32) unaligned, 3 pad bit (36) aligned, 3 user_io_attach_desc_length ____ ____ cpm_ cpm_ ____ ____ fixed binary (21), 2 user_io_attach_desc character (ccpi_user_io_attach_desc_length refer (create_control_point_info . user_io_attach_desc_length)) unaligned; STRUCTURE ELEMENTS version is the current version of this structure. The version of this structure described here is given by the value of the named constant CREATE_CONTROL_POINT_INFO_VERSION_1 which is defined in the cpm_create_ctrl_pt_info include file. comment is the description of the new control point which will be displayed by the list operation of the control_point_manager_call command. initproc.entry is the initial procedure of the new control point. initproc.info_ptr is the pointer which will be passed as the argument to the above initial procedure. user_cl_intermediary is the command level intermediary for the new control point if flags.user_cl_intermediary_given is "1"b; otherwise, this element of the structure is ignored. priority is the scheduling priority for the new control. A ready control point whose priority is 1 is always scheduled before any ready control point whose priority is 2, etc. flags.independent if "1"b, the new control point will be independent of all other control points in the process; if "0"b, the new control point will be a child of the current control point. At present, the independence of a control point only controls when its storage will be released after it is destroyed. flags.separate_standard_iocbs if "1"b, the new control point will be given its own set of standard I/O switches (i.e., user_i/o, user_input, ____ ____ cpm_ cpm_ ____ ____ user_output, and error_output); if "0"b, the new control point will share the standard switches of the root control point if it is independent or the current control point if it is dependent. flags.user_io_attach_desc_given is only valid when flags.separate_standard_iocbs is to "1"b. If "1"b, an attach description for the new control point's user_i/o switch is supplied in the user_io_attach_desc element of this structure; if "0"b, the new control point's user_i/o switch will be attached via the syn_ I/O module to its parent's user_i/o switch. flags.user_cl_intermediary_given if "1"b, the user_cl_intermediary element above contains the command level intermediary for the new control point; if "0"b, the new control point will use the standard command level intermediary supplied by the control point manager. user_io_attach_desc_length is the length of the user_io_attach_desc element of this structure. user_io_attach_desc is the attach description for the new control point's user_i/o switch if flags.user_io_attach_desc_given is "1"b; otherwise, this element of the structure is ignored. NOTES The control is created in the stopped state. It will not be scheduled for execution until after a call to cpm_$start. If the new control point is to have separate standard I/O switches, they are created and attached in the new control point before the initial procedure is invoked. Entry: cpm_$destroy This entrypoint destroys the specified control point. USAGE dcl cpm_$destroy entry (bit (36) aligned, fixed binary (35)); call cpm_$destroy (control_point_id, code); ____ ____ cpm_ cpm_ ____ ____ control_point_id is the unique ID of the control point to be destroyed. (Input) code is a standard system status code. (Output) Amongst the possible returned codes, the following codes have special significance to this entry: cpm_et_$cant_destroy_root The ID supplied above is that of the root control point which can never be destroyed. cpm_et_$control_point_not_found The ID supplied above does not identify an active control point. NOTES When a control point is destroyed, the cleanup handlers of all entrypoints still active in the control point are run, the control point's standard I/O switches are detached, and the storage used by its stack is released. Entry: cpm_$generate_call This entrypoint runs the specified entrypoint immediately in the requested control point. USAGE dcl cpm_$generate_call entry (bit (36) aligned, entry pointer, fixed binary (35)); call cpm_$generate_call (control_point_id, userproc, userproc_info_ptr, code); ARGUMENTS control_point_id is the unique ID of the control point in which the entrypoint is to be run. (Input) userproc is the entrypoint to be run. (Input) userproc_info_ptr is a pointer which is supplied as the argument to the above entrypoint. (Input) ____ ____ cpm_ cpm_ ____ ____ code is a standard system status code. Amongst the possible returned codes, the following codes have special significance to this entry: cpm_et_$control_point_not_found The ID supplied above does not identify an active control point. Entry: cpm_$generate_call_preferred This entrypoint runs the specified entrypoint immediately in the requested control point. In addition, this entrypoint makes the specified control point the preferred control point while the requested entrypoint is being executed. USAGE dcl cpm_$generate_call_preferred entry (bit (36) aligned, entry (pointer), pointer, fixed binary (35)); call cpm_$generate_call_preferred (control_point_id, userproc, userproc_info_ptr, code); ARGUMENTS control_point_id is the unique ID of the control point in which the entrypoint is to be run. (Input) userproc is the entrypoint to be run. (Input) userproc_info_ptr is a pointer which is passed as the argument to the above entrypoint. (Input) code is a standard system status code. Amongst the possible returned codes, the following codes have special significance to this entry: cpm_et_$control_point_not_found The ID supplied above does not identify an active control point. ____ ____ cpm_ cpm_ ____ ____ Entry: cpm_$generate_call_when_ready This entrypoint queues a call to the specified entrypoint in the requested control point which will be executed when the scheduler next runs said control point. USAGE dcl cpm_$generate_call_when_ready entry (bit (36) aligned, entry (pointer), pointer, fixed binary (35) call cpm_$generate_call_when_ready (control_point_id, userproc, userproc_info_ptr, code) ARGUMENTS control_point_id is the unique ID of the control point in which the entrypoint is to be run. (Input) userproc is the entrypoint to be run. (Input) userproc_info_ptr is a pointer which is passed as the argument to the above entrypoint. (Input) code is a standard system status code. Amongst the possible returned codes, the following codes have special significance to this entry: cpm_et_$control_point_not_found The ID supplied above does not identify an active control point. Entry: cpm_$get_control_point_meters This entrypoint returns the usage meters for the specified entrypoint. USAGE dcl cpm_$get_control_point_meters entry (bit (36) aligned, pointer, fixed binary (35); call cpm_$get_control_point_meters (control_point_id, cpma_ptr, code); ____ ____ cpm_ cpm_ ____ ____ control_point_id is the unique ID of the control point whose meters are to be returned. (Input) cpma_ptr is a pointer to the control_point_meters_argument structure into which this entrypoint will place the usage meters (see "Entry Information" below). (Input) code is a standard system status code. Amongst the possible returned codes, the following codes have special significance to this entry: cpm_et_$control_point_not_found The ID supplied above does not identify an active control point. error_table_$unimplemented_version The version of the control_point_meters_argument requested by the caller is not supported by this entrypoint. ENTRY INFORMATION The control_point_meters_argument structure is declared in the cpm_ctrl_pt_meters include file as follows. dcl 1 control_point_meters_argument aligned based (cpma_ptr), 2 version character (8) unaligned, 2 meters, 3 n_schedules fixed binary, 3 pad fixed binary, 3 real_time fixed binary (71), 3 usage like process_usage; STRUCTURE ELEMENTS version is the current version of this structure. (Input) The version of this structure described here is given by the value of the named constant CONTROL_POINT_METERS_ARGUMENT_VERSION_1 which is declared in the cpm_ctrl_pt_meters include file. meters.n_schedules is set to the number of times that the requested control point has actually been run by the control point scheduler. (Output) ____ ____ cpm_ cpm_ ____ ____ meters.real_time is set to the number of microseconds of wall clock time that this control point has been running. (Output) meters.usage is set to the actual usage meters for this control point. (Output) See the writeup of the hcs_$get_process_usage entrypoint for a detailed explanation of the elements of this structure. Entry: cpm_$get_preferred_control_point This entrypoint returns the unique ID of the preferred control point. USAGE dcl cpm_$get_preferred_control_point entry (bit (36) aligned; call cpm_$get_preferred_control_point (control_point_id); ARGUMENTS control_point_id is set to the unique ID of the preferred control point or to "0"b if there is presently no preferred control point in the process. (Output) NOTES The preferred control point is always given priority for execution over all other control points whenever it is ready. The effect of this treatment is to cause the preferred control point to have control over the user's terminal, if it uses the terminal, as it will receive all IPC wakeups generated by the terminal. When control point management is first enabled, the root control point is made the preferred control point. ____ ____ cpm_ cpm_ ____ ____ Entry: cpm_$get_scheduler_meters This entrypoint returns the usage meters of the control point scheduler. USAGE dcl cpm_$get_scheduler_meters entry (pointer, fixed binary (35)); call cpm_$get_scheduler_meters (cpma_ptr, code); ARGUMENTS cpma_ptr is a pointer to the control_point_meters_argument structure into which this entrypoint will place the usage meters (see "Entry Information" below). (Input) code is a standard system status code. Amongst the possible returned codes, the following codes have special significance to this entry: error_table_$unimplemented_version The version of the control_point_meters_argument requested by the caller is not supported by this entrypoint. ENTRY INFORMATION The control_point_meters_argument structure is declared in the cpm_ctrl_pt_meters include file as follows. dcl 1 control_point_meters_argument aligned based (cpma_ptr), 2 version character (8) unaligned, 2 meters, 3 n_schedules fixed binary, 3 pad fixed binary, 3 real_time fixed binary (71), 3 usage like process_usage; STRUCTURE ELEMENTS version is the current version of this structure. (Input) The version of this structure described here is given by the value of the named constant CONTROL_POINT_METERS_ARGUMENT_VERSION_1 which is declared in the cpm_ctrl_pt_meters include file. ____ ____ cpm_ cpm_ ____ ____ meters.n_schedules is set to the number of times that the scheduler has been invoked. (Output) meters.real_time is set to the number of microseconds of wall clock time that the scheduler has been in control of the process. (Output) This time includes the time spent blocked waiting for IPC wakeups from devices or other processes. meters.usage is set to the actual usage meters for the scheduler. (Output) See the writeup of the hcs_$get_process_usage entrypoint for a detailed explanation of the elements of this structure. Entry: cpm_$get_user_cl_intermediary This entrypoint returns the command level intermediary in use by the specified control point. USAGE dcl cpm_$get_user_cl_intermediary entry bit (36) aligned, entry (bit (1) aligned), (fixed binary (35)); call cpm_$get_user_cl_intermediary (control_point_id, user_cl_intermediary, code); ARGUMENTS control_point_id is the unique ID of the control point whose intermediary is desired. (Input) user_cl_intermediary is set to the entrypoint which is the command level intermediary for the specified control point. (Output) code is a standard system status code. Amongst the possible returned codes, the following codes have special significance to this entry: cpm_et_$control_point_not_found The ID supplied above does not identify an active control point. ____ ____ cpm_ cpm_ ____ ____ Entry: cpm_$pop_preferred_control_point This entrypoint restores the preferred control point to the one in force before the last call to cpm_$push_preferred_control_point. USAGE dcl cpm_$pop_preferred_control_point entry (bit (1) aligned); call cpm_$pop_preferred_control_point (pushed_preferred_control_point); ARGUMENTS pushed_preferred_control_point is the value returned by the last call to cpm_$push_preferred_control_point. (Input/Output) This entrypoint will always set this argument to "0"b before returning to its caller. EEEnnntttrrryyy::: cccpppmmm_$$$pppuuussshhh_ppprrreeefffeeerrrrrreeeddd_cccooonnntttrrrooolll_pppoooiiinnnttt This entrypoint makes the specified control point the preferred control point if possible while saving the identity of the prior preferred control point in a stack for later restoration by the cpm_$pop_preferred_control_point entrypoint. USAGE dcl cpm_$push_preferred_control_point entry (bit (36) aligned, bit (1) aligned, fixed binary (35)); call cpm_$push_preferred_control_point (control_point_id, pushed_preferred_control_point, code); ARGUMENTS control_point_id is the unique ID of the control point which is to be made the preferred control point. (Input) pushed_preferred_control_point is set to "1"b if the requested control point is successfully made the preferred control point; otherwise, this argument is set to "0"b. (Output) ____ ____ cpm_ cpm_ ____ ____ code is a standard system status code. (Output) Amongst the possible returned codes, the following codes have special significance to this entry: cpm_et_$control_point_not_found The ID supplied above does not identify an active control point. cpm_et_$preferred_cant_be_stopped The ID supplied above identifies a control point in the stopped state. A control point in the stopped state may not be made the preferred control point. cpm_et_$preferred_stack_overflow The stack of preferred control points if full. NOTES The setting of pushed_preferred_control_point is made indivisibly with making the specified control point the preferred control point. EEEnnntttrrryyy::: cccpppmmm_$$$sssccchhheeeddduuullleeerrr This entrypoint invokes the control point scheduler to run an appropriate ready control point. USAGE dcl cpm_$scheduler entry (); call cpm_$scheduler (); NOTES The primary caller of this entrypoint is intended to be ipc_ when another control point is to be scheduled to run. ____ ____ cpm_ cpm_ ____ ____ EEEnnntttrrryyy::: cccpppmmm_$$$ssseeettt_ppprrreeefffeeerrrrrreeeddd_cccooonnntttrrrooolll_pppoooiiinnnttt This entrypoint makes the specified control point the preferred control point. USAGE dcl cpm_$set_preferred_control_point entry (bit (36) aligned, fixed binary (35)); call cpm_$set_preferred_control_point (control_point_id, code); ARGUMENTS control_point_id is the unique ID of the control point which is to be made the preferred control point. (Input) code is a standard system status code. (Output) Amongst the possible returned codes, the following codes have special significance to this entry: cpm_et_$control_point_not_found The ID supplied above does not identify an active control point. cpm_et_$preferred_cant_be_stopped The ID supplied above identifies a control point in the stopped state. A control point in the stopped state may not be made the preferred control point. EEEnnntttrrryyy::: cccpppmmm_$$$ssseeettt_uuussseeerrr_ccclll_iiinnnttteeerrrmmmeeedddiiiaaarrryyy This entrypoint sets the command level intermediary for the specified control point. USAGE dcl cpm_$set_user_cl_intermediary entry (bit (36) aligned, entry (bit (1) aligned), fixed binary (35)); call cpm_$set_user_cl_intermediary (control_point_id, user_cl_intermediary, code); ARGUMENTS control_point_id is the unique ID of the control point whose command level intermediary is to be set. (Input) ____ ____ cpm_ cpm_ ____ ____ user_cl_intermediary is the entrypoint which is to be the new intermediary for the above control point. (Input) This entry is declared as dcl user_cl_intermediary entry (bit (1) aligned); call user_cl_intermediary (return_from_intermediary); Arguments return_from_intermediary is "1"b if cpm_overseer_$cl_intermediary is to return as if "start" had been typed, without getting a new command level or stopping the current control point. (Input) code is a standard system status code. (Output) Amongst the possible returned codes, the following codes have special significance to this entry: cpm_et_$control_point_not_found The ID supplied above does not identify an active control point. NOTES The cl_intermediary is always set to be cpm_overseer_$cl_intermediary, which creates a new listener level if the root control point is running, and otherwise stops the current control point and calls the cpm_$scheduler. The user_cl_intermediary, if given, is called by cpm_overseer_$cl_intermediary. EEEnnntttrrryyy::: cccpppmmm_$$$ssstttaaarrrttt This entrypoint marks a control point as ready for execution. USAGE dcl cpm_$start entry (bit (36) aligned, fixed binary (35)); call cpm_$start (control_point_id, code); ARGUMENTS control_point_id is the unique ID of the control point to be started. (Input) ____ ____ cpm_ cpm_ ____ ____ code is a standard system status code. (Output) Amongst the possible returned codes, the following codes have special significance to this entry: cpm_et_$already_started The ID supplied above identifies a control point which is already started. Such a control point is in either the ready or blocked state. cpm_et_$control_point_not_found The ID supplied above does not identify an active control point. EEEnnntttrrryyy::: cccpppmmm_$$$ssstttoooppp This entrypoint places a control point in the stopped state. Once in the stopped state, the scheduler will not run the control point until after a subsequent call to cpm_$start. USAGE dcl cpm_$stop entry (bit (36) aligned, fixed binary (35)); call cpm_$stop (control_point_id, code); ARGUMENTS control_point_id is the unique ID of the control point to be stopped. (Input) code is a standard system status code. (Output) Amongst the possible returned codes, the following codes have special significance to this entry: cpm_et_$already_stopped The ID supplied above identifies a control point which is already in the stopped state. cpm_et_$cant_stop_root The ID supplied above is that of the root control point which can never be stopped. cpm_et_$control_point_not_found The ID supplied above does not identify an active control point. ____ ____ cpm_ cpm_ ____ ____ EEEnnntttrrryyy::: cccpppmmm_$$$wwwaaakkkeeeuuuppp This entrypoint sends a generic wakeup to the specified control point. The wakeup changes the control point's state from blocked to ready and informs the scheduler that it is again eligible for execution. USAGE dcl cpm_$wakeup entry (bit (36) aligned, fixed binary (35)); call cpm_$wakeup (control_point_id, code); ARGUMENTS control_point_id is the unique ID of the control point to be awakened. (Input) code is a standard system status code. (Output) Amongst the possible returned codes, the following codes have special significance to this entry: cpm_et_$cant_wakeup_when_stopped The ID supplied above identifies a control point in the stopped state. Wakeups can only be sent to control points which are in the blocked state. cpm_et_$control_point_not_found The ID supplied above does not identify an active control point. cpm_et_$wakeup_ignored The ID supplied above identifies a control point which is already in the ready state. NOTES The primary caller of cpm_$wakeup is intended to be ipc_. This entry sets the state of the control point to ready and puts the control point into the control point ready queue. ____ ________________________ cpm_ dm_hcs_$allocate_journal ____ ________________________ NNNaaammmeee::: cccpppmmm_dddaaatttaaa_ EEEnnntttrrryyy::: cccpppmmm_dddaaatttaaa_$$$nnn_cccooonnntttrrrooolll_pppoooiiinnntttsss This datum is the number of active control points in the process. USAGE dcl cpm_data_$n_control_points fixed binary external; ________________________________________ NNNaaammmeee::: dddmmm_hhhcccsss_$$$aaallllllooocccaaattteee_jjjooouuurrrnnnaaalll This entry point gets ring-2 Data Management (DM) an unused journal index into the ring-0 dm_journal_seg_ for a new before journal. The dm_journal_seg_ is a segment that keeps track of up to 64 before journals. USAGE declare dm_hcs_$allocate_journal entry (bit(36) aligned, fixed bin, fixed bin(35)); call dm_hcs_$allocate_journal (uid, journal_idx, code); ARGUMENTS uid is the ring-2 unique ID for the new before journal. (Input) journal_idx is the index into the ring-0 dm_journal_seg_ for the new before journal. (Output) code is a storage system status code. (Output) It can have the values: error_table_$dm_not_enabled the Data Management system has not been brought up. error_table_$bad_arg the uid argument is null. The unique ID cannot be null. error_table_$no_journals_free there is no unused index available in the dm_journal_seg_. ________________________ ____________________ dm_hcs_$allocate_journal dm_hcs_$free_journal ________________________ ____________________ ACCESS REQUIRED This gate can only be called from ring-2. The access authorization of the owner is recorded in the dm_per_journal structure so that the index cannot be freed unless the requester is at the same authorization as the original owner. ________________________________________ NNNaaammmeee::: dddmmm_hhhcccsss_$$$fffrrreeeeee_jjjooouuurrrnnnaaalll This entry point allows ring-2 Data Management (DM) to free a previously allocated journal index in the ring-0 dm_journal_seg_. USAGE declare dm_hcs_$free_journal entry (fixed bin, fixed bin(35)); call dm_hcs_$free_journal (journal_idx, code); ARGUMENTS journal_idx is the journal index that was previously allocated. (Input) code is a storage system status code. (Output) It can have the possible value: error_table_$invalid_dm_journal_index the index is not a valid index or the user is attempting to free a journal index when the authorization is not the same as the authorization of the original owner. error_table_$dm_not_enabled the Data Management system has not been brought up. error_table_$dm_journal_pages_held a journal index cannot be freed when pages are held in memory. ACCESS REQUIRED This gate can only be called from ring-2. The user must be at the same access authorization as the owner who originally allocated the journal index. ____________________ ________________________________ dm_hcs_$free_journal dm_hcs_$get_max_held_per_journal ____________________ ________________________________ NNNaaammmeee::: dddmmm_hhhcccsss_$$$gggeeettt_jjjooouuurrrnnnaaalll_ssstttaaammmppp This function returns to ring-2 Data Management (DM) the value of the journal time stamp for a given ring-0 dm_journal_seg_ index. The time stamp tells Page Control when the before journal was last written to disk so all pages dependent on that before journal, modified before this time, can be written to disk. USAGE declare dm_hcs_$get_journal_stamp entry (fixed bin) returns(fixed bin(71)); call dm_hcs_$get_journal_stamp (journal_idx, time_stamp); ARGUMENTS journal_idx is the index into the dm_journal_seg_ for the before journal. (Input) time_stamp is the date and time the before journal was last written to disk. (Output) This value will be zero if the Data Management system has not been brought up, the given index is not valid, or the user does not have the correct access. ACCESS REQUIRED This gate can only be called from ring-2. The user must have read access to objects created at the authorization of the creator. ________________________________________ NNNaaammmeee::: dddmmm_hhhcccsss_$$$gggeeettt_mmmaaaxxx_hhheeelllddd_pppeeerrr_jjjooouuurrrnnnaaalll This function returns to ring-2 Data Management (DM) the value of the maximum number of pages per journal that will be held in memory until a before journal is written out. This value is from the ring-0 dm_journal_seg_. USAGE declare dm_hcs_$get_max_held_per_journal entry () returns (fixed bin); max_pages = dm_hcs_$get_max_held_per_journal (); _________________________________________________________________ dm_hcs_$get_max_held_per_journaldm_hcs_$guaranteed_eligibility_off _________________________________________________________________ max_pages contains the maximum number of pages held in memory per journal. (Output) This value will be zero if the Data Management system has not been brought up. ACCESS REQUIRED This gate can only be called from ring-2. ________________________________________ NNNaaammmeee::: dddmmm_hhhcccsss_$$$gggeeettt_nnn_jjjooouuurrrnnnaaalllsss This function returns to ring-2 Data Management (DM) the value of the number of before journal entries allocated in the ring-0 dm_journal_seg_. USAGE declare dm_hcs_$get_n_journals entry () returns (fixed bin); n_journals = dm_hcs_$get_n_journals (); ARGUMENTS n_journals contains the number of before journal entries that have been allocated. (Output) This value will be zero if the Data Management system has not been brought up. ACCESS REQUIRED This gate can only be called from ring-2. ________________________________________ NNNaaammmeee::: dddmmm_hhhcccsss_$$$ggguuuaaarrraaannnttteeeeeeddd_eeellliiigggiiibbbiiillliiitttyyy_oooffffff This entry point allows Data Management (DM) to turn off the guaranteed eligible state within process scheduling granted by guaranteed_eligibility_on. USAGE declare dm_hcs_$guaranteed_eligibility_off (); call dm_hcs_$guaranteed_eligibility_off (); __________________________________ _____________________________ dm_hcs_$guaranteed_eligibility_off dm_hcs_$set_force_write_limit __________________________________ _____________________________ ACCESS REQUIRED This gate can only be called from ring-2. ________________________________________ NNNaaammmeee::: dddmmm_hhhcccsss_$$$ggguuuaaarrraaannnttteeeeeeddd_eeellliiigggiiibbbiiillliiitttyyy_ooonnn This entry point allows Data Management (DM) to guarantee that a process will remain in the eligible state within process scheduling and be able to run. This guaranteed eligible state is in effect until turned off. USAGE declare dm_hcs_$guaranteed_eligibility_on (); call dm_hcs_$guaranteed_eligibility_on (); ACCESS REQUIRED This gate can only be called from ring-2. ________________________________________ NNNaaammmeee::: dddmmm_hhhcccsss_$$$ssseeettt_fffooorrrccceee_wwwrrriiittteee_llliiimmmiiittt This entry point allows ring-2 Data Management (DM) to set the write limit of the user's validation level. The write limit is the maximum number of pages that can be written to disk during a force write. USAGE declare dm_hcs_$set_force_write_limit entry (fixed bin, fixed bin(35)); call dm_hcs_$set_force_write_limit (write_limit, code); ARGUMENTS write_limit is the new maximum number of pages, between 1 and 256, that can be written to disk during a force write. (Input) code is a storage system status code. (Output) It can have the value: _____________________________ _________________________ dm_hcs_$set_force_write_limit dm_hcs_$set_journal_stamp _____________________________ _________________________ error_table_$argerr the limit is less than 1 or greater than 256. ACCESS REQUIRED This gate can only be called from ring-2. ________________________________________ NNNaaammmeee::: dddmmm_hhhcccsss_$$$ssseeettt_jjjooouuurrrnnnaaalll_ssstttaaammmppp This entry point allows ring-2 Data Management (DM) to set the time stamp for a specified journal in the ring-0 dm_journal_seg_. The time stamp tells Page Control when the before journal was last written to disk so all pages dependent on that before journal, modified before this time, can be written to disk. USAGE declare dm_hcs_$set_journal_stamp entry (fixed bin, fixed bin(71), fixed bin(35)); call dm_hcs_$set_journal_stamp (journal_idx, time_stamp, code); ARGUMENTS journal_idx is the index into the dm_journal_seg_ of the before journal to be changed. (Input) time_stamp is the new date and time the before journal was written to disk. (Input) code is a storage system status code. (Output) It can have values of: error_table_$invalid_dm_journal_index the index is not a valid index or the user does not have the correct access. error_table_$dm_not_enabled the Data Management system has not been brought up. ACCESS REQUIRED This gate can only be called from ring-2. The user must have write access to objects created at the authorization of the creator. _________________________ _______________________ dm_hcs_$set_journal_stamp dm_hcs_$validate_bj_uid _________________________ _______________________ NNNaaammmeee::: dddmmm_hhhcccsss_$$$vvvaaallliiidddaaattteee_bbbjjj_uuuiiiddd This function, given a valid ring-0 dm_journal_seg_ index and before journal unique ID, returns true if the supplied uid matches the uid indexed in the dm_journal_seg_ and the caller has authorization to read the information. USAGE declare dm_hcs_$validate_bj_uid entry (bit(36) aligned, fixed bin) returns(bit(1) aligned); call dm_hcs_$validate_bj_uid (uid, journal_idx, validated); ARGUMENTS uid is the unique ID for the before journal. (Input) journal_idx is the index into the dm_journal_seg_ for the before journal. (Input) validated is a bit (1) return value. (Output) 1 the specified uid is a valid unique ID for the indexed before journal. 0 the specified uid is not valid, the specified index is not valid, the Data Management system has not been brought up, or the user does not have the correct access. ACCESS REQUIRED This gate can only be called from ring-2. The user must have read access to objects created at the authorization of the creator. _______________________ ________ dm_hcs_$validate_bj_uid dsa_tty_ _______________________ ________ NNNaaammmeee::: dddsssaaa_ttttttyyy_ This subroutine provides the interface between the video system and the DSA session control and terminal manager programs. EEEnnntttrrryyy::: dddsssaaa_ttttttyyy_$$$aaabbbooorrrttt This entry resets the read and/or write buffers for a given channel. USAGE dcl dsa_tty_$abort entry (fixed bin(35), fixed bin, fixed bin, fixed bin(35)); call dsa_tty_$abort (tty_dsa_id, reset_switch, state, code); ARGUMENTS tty_dsa_id is tty_'s DSA session identifier for the channel, returned by dsa_tty_$attach. (Input) reset_switch indicates whether read or write are to be reset. (Input) 1 reset read 2 reset write 3 reset both state indicates the tty state. See tty_states.incl.pl1 for a list of possible values. (Output) code is a standard status code. (Output) ________ ________ dsa_tty_ dsa_tty_ ________ ________ EEEnnntttrrryyy::: dddsssaaa_ttttttyyy_$$$aaattttttaaaccchhh This entry attaches an existing DSA session to the process, given its channel name. It returns tty_'s DSA session identifier associated with the channel. This session ID is used in future dsa_tty_ calls to identify the channel. USAGE dcl dsa_tty_$attach entry (char(*), fixed bin(71), fixed bin(35), fixed bin, fixed bin(35)); call dsa_tty_$attach (channel_name, event, tty_dsa_id, state, code); ARGUMENTS channel_name is the channel name of the DSA channel to be attached. (Input) event is the event channel over which the caller of dsa_tty_ events are to be reported to the caller. (Input) tty_dsa_id is tty_'s DSA session identifier which dsa_tty_$attach assigns to the channel. (Output) state indicates the tty state. See tty_states.incl.pl1 for a list of possible values. (Output) code is a standard status code. (Output) EEEnnntttrrryyy::: dddsssaaa_ttttttyyy_$$$cccooonnnnnneeecccttt This entrypoint creates a new DSA session. It is used by tc_io_ to create an outbound, dial-out connection through DSA. USAGE dcl dsa_tty_$connect entry (char(*), ptr, fixed bin(71), char(*) var, ptr, char(*), fixed bin(35), ptr, fixed bin(21), char(*) var, (2) bit(72), fixed bin(35)); ________ ________ dsa_tty_ dsa_tty_ ________ ________ call dsa_tty_$connect (correspondent, area_ptr, event_channel, network_address, user_id_ptr, channel_name, session_handle, dsa_connection_info_ptr, dsa_connection_info_len, attach_description, access_class_range, code); ARGUMENTS correspondent is the name of an application which must be defined in a correspondent entry in the Network Information Table (NIT). This NIT entry describes how to access the application (eg, name of the network used to access the application, system on which the application exists, name of the endpoint which handles requests to use the application, etc). (Input) area_ptr is a pointer to an area in which dsa_connection_info can be allocated. (Input) event_channel is an event channel dsa_tty_ uses to signal events associated with this channel. If 0, then events are not signalled. (Input) network_address is the network address to use when making the dial-out connection. (Input) user_id_ptr is a pointer to a user identification structure. Currently, this is used only to dial_out from Multics to an application running on the DN8 (eg, edit or debug). Thus, information in the structure defines person_id, project_id, billing_id and password of a user application on the DN8. The submitter_id structure is declared in dsa_scu_sec_info.incl.pl1. For caller not connecting to a DN8 application, this can be a null pointer. (Input) channel_name is the name of the actual DSA channel to be used for the dial-out connection. (Output) session_handle is a handle used for communications between session control and the Login_Server. (Output) dsa_connection_info_ptr is a pointer to information about the DSA connection. This information is allocated in the area pointed to by area_ptr. This information currently isn't used. (Output) ________ ________ dsa_tty_ dsa_tty_ ________ ________ dsa_connection_info_len is the length in words of the DSA connection information. (Output) attach_description is an attach description that can be used to attach the tty_ I/O module to the dial-out channel. (Output) access_class_range is the access class of the dial-out channel. (Output) code is a standard status code. (Output) EEEnnntttrrryyy::: dddsssaaa_ttttttyyy_$$$dddeeetttaaaccchhh This entry detaches a DSA session from the process. The session may optionally be disconnected at the same time. USAGE dcl dsa_tty_$detach entry (fixed bin(35), fixed bin, fixed bin, fixed bin(35)); call dsa_tty_$detach (tty_dsa_id, dflag, state, code); ARGUMENTS tty_dsa_id is tty's DSA session identifier for the channel. (Input) dflag is the disconnection flag. (Input) 1 disconnect (destroy) the session. 0 just detach the session from the process. state indicates the tty state. See tty_states.incl.pl1 for a list of possible values. (Output) code is a standard status code. (Output) ________ ________ dsa_tty_ dsa_tty_ ________ ________ EEEnnntttrrryyy::: dddsssaaa_ttttttyyy_$$$eeevvveeennnttt This entry sets the event channel associated with the connection. USAGE dcl dsa_tty_$event entry (fixed bin(35), fixed bin(71), fixed bin, fixed bin(35)); call dsa_tty_$event (tty_dsa_id, event_channel, state, code); ARGUMENTS tty_dsa_id is tty_'s DSA session identifier for the channel. (Input) event_channel identifies the event channel to be used. (Input) state indicates the tty state. See tty_states.incl.pl1 for a list of possible values. (Output) code is a standard status code. (Output) EEEnnntttrrryyy::: dddsssaaa_ttttttyyy_$$$iiinnndddeeexxx This entry returns tty_'s DSA session identifier for a channel, given its channel name. USAGE dcl dsa_tty_$index entry (char(*), fixed bin(35), fixed bin, fixed bin(35)); call dsa_tty_$index (channel_name, tty_dsa_id, state, code); ARGUMENTS channel_name is the channel name. (Input) tty_dsa_id is tty's DSA session identifier for the channel. (Output) ________ ________ dsa_tty_ dsa_tty_ ________ ________ state indicates the tty state. See tty_states.incl.pl1 for a list of possible values. (Output) code is a standard status code. (Output) EEEnnntttrrryyy::: dddsssaaa_ttttttyyy_$$$ooorrrdddeeerrr This entry performs the specified control order on the i/o switch. USAGE dcl dsa_tty_$order entry (fixed bin(35), char(*), ptr, fixed bin, fixed bin(35)); call dsa_tty_$order (tty_dsa_id, order, info_ptr, state, code); ARGUMENTS tty_dsa_id is tty's DSA session identifier for the channel. (Input) order is the name of the control order. (Input) info_ptr is null or points to the data whose form depends on the control order. (Input) state indicates the tty state. See tty_states.incl.pl1 for a list of possible values. (Output) code is a standard status code. (Output) NOTES The following list of tty_ control requests are also supported by dsa_tty_. Requests followed by an asterisk (*) are used explicitly by tc_io_ in managing the screen. Others are available to the user from command level and from applications. get_echo_break_table quit_enable get_editing_chars read_status ________ ________ dsa_tty_ dsa_tty_ ________ ________ get_event_channel resetread get_input_conversion resetwrite get_input_translation set_echo_break_table * get_line_status_enabled set_editing_chars get_meters set_input_conversion get_output_conversion set_input_translation get_output_translation set_line_status_enabled get_special set_output_conversion hangup set_output_translation interrupt set_prompt line_length set_special line_status set_terminal_data * modes * start * printer_off * store_id printer_on terminal_info * quit_disable write_status The following tty_ control requests are supported in dsa_tty_ by ignoring the request and returning a code of 0. None are used by the video system. accept_printer_off reset_more input_flow_control_chars set_delay output_flow_control_chars set_framing_chars refuse_printer_off The following control requests are implemented especially for DSA connections. None are used by the video system, therefore they are not documented in this MTB. attention1 get_line_indicator attention2 get_modes attention3 get_network_type attention4 get_page_indicator attention5 get_switch_logical_device attention6 get_tabulation attention7 get_terminal_characteristics attention8 request_device_status attention9 select_output_device begin_ack_unit set_attention_fcn conceal_input set_delimiter_fcn conceal_next_line set_editing_fcn demand_turn set_event_info disable_input_device set_line_indicator enable_input_device set_modes end_ack_unit set_page_indicator get_attention_fcn set_switch_logical_device get_delimiter_fcn set_tabulation get_editing_fcn set_terminal_characteristics get_event_info ________ ________ dsa_tty_ dsa_tty_ ________ ________ EEEnnntttrrryyy::: dddsssaaa_ttttttyyy_$$$rrreeeaaaddd This entry reads unechoed characters from the terminal. USAGE dcl dsa_tty_$read entry (fixed bin(35), ptr, fixed bin(21), fixed bin(21), fixed bin(21), fixed bin, fixed bin(35)); call dsa_tty_$read (tty_dsa_id, buffer_ptr, offset, n_chars_to_read, n_chars_read, state, code); ARGUMENTS tty_dsa_id is tty's DSA session identifier for the channel. (Input) buffer_ptr pointer to buffer in which characters read from terminal are placed. (Input) offset is the offset in buffer at which first input character is placed. (Input) n_chars_to_read is the maximum number of characters to return. (Input) n_chars_read is the actual number of characters returned. (Output) state indicates the tty state. See tty_states.incl.pl1 for a list of possible values. (Output) code is a standard status code. (Output) ________ ________ dsa_tty_ dsa_tty_ ________ ________ EEEnnntttrrryyy::: dddsssaaa_ttttttyyy_$$$rrreeeaaaddd_eeeccchhhoooeeeddd This entry reads echoed characters from the terminal. Echo-negotiated input starts when this entrypoint is called and no unechoed characters exist in the input already read. Negotiated echoing continues until a break character is reached, or the remaining space in the current window line is filled with echoed characters. Type ahead entered before echo negotiation begins or after it stops is not echoed by the terminal. USAGE dcl dsa_tty_$read_echoed entry (fixed bin(35), ptr, fixed bin(21), fixed bin(21), fixed bin(21), fixed bin(21), fixed bin, fixed bin, fixed bin(35)); call dsa_tty_$read_echoed (tty_dsa_id, buffer_ptr, offset, n_chars_to_read, n_chars_read, echoed, screen_left, state, code); ARGUMENTS tty_dsa_id is tty's DSA session identifier for the channel. (Input) buffer_ptr pointer to buffer in which characters read from terminal are placed. (Input) offset offset in buffer at which first character is to be placed. (Input) n_chars_to_read is the maximum number of characters to return. (Input) n_chars_read is the actual number of characters returned. (Output) echoed is the number of characters echoed during echo negotiated input. (Output) screen_left is the space left on current line of current window. (Input) state indicates the tty state. See tty_states.incl.pl1 for a list of possible values. (Output) ________ ________ dsa_tty_ dsa_tty_ ________ ________ code is a standard status code. (Output) EEEnnntttrrryyy::: dddsssaaa_ttttttyyy_$$$rrreeeaaaddd_wwwiiittthhh_mmmaaarrrkkk This entry is like read, but an additional argument indicates the number of input characters read prior to the mark set in the input by dsa_tty_$write_whole_string. USAGE dcl dsa_tty_$read_with_mark entry (fixed bin(35), char(*), fixed bin(21), fixed bin(21), fixed bin, fixed bin(35)); call dsa_tty_$read_with_mark (tty_dsa_id, buffer, n_chars_read, mark_index, state, code); ARGUMENTS tty_dsa_id is tty's DSA session identifier for the channel. (Input) buffer buffer in which characters read from terminal are placed. (Input) n_chars_read is the actual number of characters returned. (Output) mark_index is the number of input characters read prior to setting of the mark (by dsa_tty_$write_whole_string) in the input. (Output) state indicates the tty state. See tty_states.incl.pl1 for a list of possible values. (Output) code is a standard status code. (Output) ________ ________ dsa_tty_ dsa_tty_ ________ ________ EEEnnntttrrryyy::: dddsssaaa_ttttttyyy_$$$wwwrrriiittteee This entry writes text to the terminal screen. USAGE dcl dsa_tty_$write entry (fixed bin(35), ptr, fixed bin(21), fixed bin(21), fixed bin(21), fixed bin, fixed bin(35)); call dsa_tty_$write (tty_dsa_id, buffer_ptr, offset, n_chars_to_write, n_chars_written, state, code); ARGUMENTS tty_dsa_id is tty's DSA session identifier for the channel. (Input) buffer_ptr pointer to buffer holding data to be written. (Input) offset offset in buffer of first character to be written. (Input) n_chars_to_write is the number of characters supplied. (Input) n_chars_written is the actual number of characters written. (Output) state indicates the tty state. See tty_states.incl.pl1 for a list of possible values. (Output) code is a standard status code. (Output) EEEnnntttrrryyy::: dddsssaaa_ttttttyyy_$$$wwwrrriiittteee_wwwhhhooollleee_ssstttrrriiinnnggg This entry is the same as $write, except that it guarantees to send the entire buffer to the terminal as a single unit, rather than sending a partial buffer. This ensures that terminal escape sequences get sent to the terminal as a single unit, rather than possibly being split across several transmissions to the terminal. ________ ________ dsa_tty_ dsa_tty_ ________ ________ USAGE dcl dsa_tty_$write_whole_string entry (fixed bin(35), char(*), bit(1), fixed bin(21), fixed bin, fixed bin(35)); call dsa_tty_$write_whole_string (tty_dsa_id, string, mark_flag, n_chars_written, state, code); ARGUMENTS tty_dsa_id is tty's DSA session identifier for the channel. (Input) string is the character string to write. The buffer can be at most 512 characters long. This is the size of the video system output holding buffer. (Input) mark_flag indicates whether to set a mark in the input stream to separate input typed prior to printing string on the terminal from characters typed after string is printed. This mark allows type-ahead input to be separated from MORE responses. (Input) "0"b do not set mark "1"b set mark n_chars_written is the actual number of characters written. This should equal the length of string, if writing was successful, or 0 if the string could not be written as a single unit. It may also be some intermediate value if an unexpected error occurs. (Output) state indicates the tty state. See tty_states.incl.pl1 for a list of possible values. (Output) code is a standard status code. (Output) _____________________ _____________ get_control_point_id_ hcs_$acl_add1 _____________________ _____________ NNNaaammmeee::: gggeeettt_cccooonnntttrrrooolll_pppoooiiinnnttt_iiiddd_ This subroutine returns the unique ID of the current control point. USAGE dcl get_control_point_id_ entry () returns (bit (36) aligned); control_point_id = get_control_point_id_ (); ARGUMENTS control_point_id (Output) is set to the unique ID of the current control point. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$aaaccclll_aaadddddd111 This entry point adds one name to the access control list (ACL) of the specified entry (segment or directory). If the name already appears on the ACL of the entry, its mode is changed to the one specified by the call. This entry also sets the ring brackets for segments. USAGE declare hcs_$acl_add1 entry (char(*), char(*), char(*), fixed bin(5), (3) fixed bin(6), fixed bin(35)); call hcs_$acl_add1 (dir_name, entryname, userid, mode, rb, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the segment or directory. (Input) _____________ _____________ hcs_$acl_add1 hcs_$acl_add1 _____________ _____________ userid is the userid (in the form Person_id.Project_id.tag) that identifies the processes to which this ACL name applies. (Input) mode contains the modes for this userid. (Input) The include file access_mode_values.incl.pl1 defines the mnemonics for these values: dcl (N_ACCESS_BIN init (00000b), R_ACCESS_BIN init (01000b), E_ACCESS_BIN init (00100b), W_ACCESS_BIN init (00010b), RW_ACCESS_BIN init (01010b), RE_ACCESS_BIN init (01100b), REW_ACCESS_BIN init (01110b), S_ACCESS_BIN init (01000b), M_ACCESS_BIN init (00010b), A_ACCESS_BIN init (00001b), SA_ACCESS_BIN init (01001b), SM_ACCESS_BIN init (01010b), SMA_ACCESS_BIN init (01011b)) fixed bin (5) internal static options (constant); rb is a three-element array that contains the ring brackets. (Input) The ring bracket variables become the ring brackets of the entry, if and only if, the entry is a segment. Ring brackets must be in the allowable range 0 through 7 and must have the ordering: rb1 <= rb2 <= rb3 code is a storage system status code. (Output) ACCESS REQUIRED The user must have status and modify permission on the containing directory. _____________ ____________ hcs_$acl_add1 hcs_$acl_add _____________ ____________ NOTES If the segment is a gate and if the validation level is greater than ring 1, then access is given only to a name that contains the same project as the user or to the SysDaemon project. If the ACL to be added is in error, no processing is performed and the subroutine returns the code error_table_$invalid_project_for_gate. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$aaaccclll_aaadddddd This entry point adds up to 100 names to the access control list (ACL) of the specified entry (segment or directory). If any name already appears on the ACL of the entry, its mode is changed to the one specified by the call. It also sets the ring brackets of the entry if it is a segment. USAGE declare hcs_$acl_add entry (char(*), char(*), ptr, fixed bin, fixed bin(35)); call hcs_$acl_add (dir_name, entryname, acl_ptr, acl_count, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the segment or directory. (Input) acl_ptr is a pointer to a user-filled acl_array structure. (Input) The structure of this array is defined in "ACL Array". acl_count is a count of the number of names in the array. (Input) code is a storage system status code. (Output) ____________ ____________ hcs_$acl_add hcs_$acl_add ____________ ____________ ACL ARRAY The acl_array structure should be declared in the following way: dcl 1 acl_array (acl_count) aligned like input_acl; The input_acl structure is as follows: dcl 1 input_acl aligned based, 2 userid char (32) aligned, 2 mode bit (5) unaligned, 2 reterr bit (13) unaligned, 2 (rb1, rb2, rb3) bit (6) unaligned; STRUCTURE ELEMENTS userid is the userid (in the form Person_id.Project_id.tag) that identifies the processes to which this ACL name applies. mode contains the modes for this userid. The include file access_mode_values.incl.pl1 defines the mnemonics for these values: dcl (N_ACCESS_BIN init (00000b), R_ACCESS_BIN init (01000b), E_ACCESS_BIN init (00100b), W_ACCESS_BIN init (00010b), RW_ACCESS_BIN init (01010b), RE_ACCESS_BIN init (01100b), REW_ACCESS_BIN init (01110b), S_ACCESS_BIN init (01000b), M_ACCESS_BIN init (00010b), A_ACCESS_BIN init (00001b), SA_ACCESS_BIN init (01001b), SM_ACCESS_BIN init (01010b), SMA_ACCESS_BIN init (01011b)) fixed bin (5) internal static options (constant); ____________ ____________ hcs_$acl_add hcs_$acl_add ____________ ____________ reterr is a 13 bit error code for this ACL name only. rb1 is ring bracket 1 for this ACL name. The ring bracket variables of the last ACL name in the array become the ring brackets of the entry, if and only if, the entry is a segment. Ring brackets must be in the allowable range 0 through 7 and must have the ordering: rb1 <= rb2 <= rb3 rb2 is ring bracket 2 for this ACL name. rb3 is ring bracket 3 for this ACL name. ACCESS REQUIRED The user must have status and modify permission on the containing directory. NOTES This entrypoint will attempt to process all names in the data array and set acl_array(i).reterr to nonzero for any name that has an error, as well as returning an error code in the system status code. If the segment is a gate and if the validation level is greater than ring 1, then access is given only to names that contain the same project as the user or to the SysDaemon project. If the ACL to be added is in error, no processing is performed and the subroutine returns the code error_table_$invalid_project_for_gate. ____________ _______________ hcs_$acl_add hcs_$acl_delete ____________ _______________ NNNaaammmeee::: hhhcccsss_$$$aaaccclll_dddeeellleeettteee This entry point deletes up to 100 names from the access control list (ACL) of the specified entry (segment or directory). If the count of names in the array is -1, the entire ACL is deleted. If the count is zero, no deletions take place. USAGE declare hcs_$acl_delete entry (char(*), char(*), ptr, fixed bin, fixed bin(35)); call hcs_$acl_delete (dir_name, entryname, acl_ptr, acl_count, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the segment or directory. (Input) acl_ptr is a pointer to a user-filled acl_array structure. (Input) The structure of this array is defined in "ACL Array". acl_count is a count of the number of names in the array. (Input) code is a storage system status code. (Output) ACL ARRAY The acl_array structure should be declared in the following way: dcl 1 acl_array (acl_count) aligned like input_acl; The input_acl structure is as follows: dcl 1 input_acl aligned based, 2 userid char (32) aligned, 2 mode bit (5) unaligned, 2 reterr bit (13) unaligned, 2 (rb1, rb2, rb3) bit (6) unaligned; _______________ _____________ hcs_$acl_delete hcs_$acl_list _______________ _____________ STRUCTURE ELEMENTS userid is the userid (in the form Person_id.Project_id.tag) that identifies the ACL name to be deleted. mode is ignored for delete. reterr is a 13 bit error code for this ACL name only. rb1 is ignored for delete. rb2 is ignored for delete. rb3 is ignored for delete. ACCESS REQUIRED The user must have status and modify permission on the containing directory. NOTES This entrypoint will attempt to process all names in the data array and set acl_array(i).reterr to nonzero for any name that has an error, as well as returning an error code in the system status code. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$aaaccclll_llliiisssttt This entry point is used either to list the entire access control list of the specified segment or to return the access modes for specified ACL entries. The segment_acl_array structure used by this entry point is described in the hcs_$add_acl_entries entry point. USAGE dcl hcs_$acl_list entry (char(*), char(*), ptr, fixed bin, ptr, fixed bin(35)); _____________ _____________ hcs_$acl_list hcs_$acl_list _____________ _____________ call hcs_$acl_list (dir_name, entry_name, acl_ptr, acl_count, area_ptr, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the directory. (Input) acl_ptr if area_ptr is null, then acl_ptr points to an ACL structure, segment_acl_array, into which mode information is to be placed for the access names specified in that same structure. If area_ptr is not null, then acl_ptr is set to point to an allocated segment_acl_array structure which is filled in with the entire ACL of the segment. (Input or Output) acl_count is the number of entries in the segment_acl_array structure pointed to by acl_ptr. (If area_ptr is null, this is Input, otherwise it is Output) area_ptr is a pointer to an area in which the segment_acl_array structure should be allocated. If this is null then only selected ACL entries are being listed, as specified by acl_ptr and acl_count. code is a storage system error code. (Output) The possible security-related codes returned are: error_table_$incorrect_access Either the caller has non-null access to the segment and no status access to the containing directory, or the caller's authorization does not dominate the containing directory's access class. error_table_$no_info The caller has null access to the parent directory and either null access to the segment or the segment does not exist. _____________ ________________ hcs_$acl_list hcs_$acl_replace _____________ ________________ NOTES If acl_ptr is used to obtain modes for specified access names (rather than obtaining modes for all access names on the initial ACL), then each initial ACL entry in the segment_acl_array structure either has status_code set to 0 and contains the segment's mode or has status_code set to error_table_$user_not_found and contains a mode of 0. ACCESS REQUIRED The caller must have status effective access on the containing directory. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$aaaccclll_rrreeeppplllaaaccceee This entry point deletes all the names on the access control list (ACL) of the specified entry (segment or directory), and then adds up to 100 new names from a user-filled array. If the count of names in the array is zero, the entire ACL is deleted and no additions take place. If the entry is a segment, the ring brackets are set. USAGE declare hcs_$acl_replace entry (char(*), char(*), ptr, fixed bin, fixed bin(35)); call hcs_$acl_replace (dir_name, entryname, acl_ptr, acl_count, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the segment or directory. (Input) acl_ptr is a pointer to a user-filled acl_array structure. (Input) The structure of this array is defined in "ACL Array". acl_count is a count of the number of names in the array. (Input) ________________ ________________ hcs_$acl_replace hcs_$acl_replace ________________ ________________ code is a storage system status code. (Output) ACL ARRAY The acl_array structure should be declared in the following way: dcl 1 acl_array (acl_count) aligned like input_acl; The input_acl structure is as follows: dcl 1 input_acl aligned based, 2 userid char (32) aligned, 2 mode bit (5) unaligned, 2 reterr bit (13) unaligned, 2 (rb1, rb2, rb3) bit (6) unaligned; STRUCTURE ELEMENTS userid is the userid (in the form Person_id.Project_id.tag) that identifies the processes to which this ACL name applies. mode contains the modes for this userid. The include file access_mode_values.incl.pl1 defines the mnemonics for these values: dcl (N_ACCESS_BIN init (00000b), R_ACCESS_BIN init (01000b), E_ACCESS_BIN init (00100b), W_ACCESS_BIN init (00010b), RW_ACCESS_BIN init (01010b), RE_ACCESS_BIN init (01100b), REW_ACCESS_BIN init (01110b), S_ACCESS_BIN init (01000b), M_ACCESS_BIN init (00010b), A_ACCESS_BIN init (00001b), SA_ACCESS_BIN init (01001b), SM_ACCESS_BIN init (01010b), SMA_ACCESS_BIN init (01011b)) fixed bin (5) internal static options (constant); reterr is a 13 bit error code for this ACL name only. ________________ ________________ hcs_$acl_replace hcs_$acl_replace ________________ ________________ rb1 is ring bracket 1 for this ACL name. The ring bracket variables of the last ACL name in the array become the ring brackets of the entry, if and only if, the entry is a segment. Ring brackets must be in the allowable range 0 through 7 and must have the ordering: rb1 <= rb2 <= rb3 rb2 is ring bracket 2 for this ACL name. rb3 is ring bracket 3 for this ACL name. ACCESS REQUIRED The user must have status and modify permission on the containing directory. NOTES This entrypoint will attempt to process all names in the data array and set acl_array(i).reterr to nonzero for any name that has an error, as well as returning an error code in the system status code. If the segment is a gate and if the validation level is greater than ring 1, then access is given only to names that contain the same project as the user or to the SysDaemon project. If the ACL to be added is in error, no processing is performed and the subroutine returns the code error_table_$invalid_project_for_gate. ___________________ ___________________ hcs_$assign_channel hcs_$assign_linkage ___________________ ___________________ NNNaaammmeee::: hhhcccsss_$$$aaassssssiiigggnnn_ccchhhaaannnnnneeelll Requests the assignment of a special event channel (also called fast channels) to the process. The special channel, if available, is assigned to the ring corresponding to the current validation level. USAGE declare hcs_$assign_channel entry (fixed bin(71), fixed bin(35)); call hcs_$assign_channel (event_channel_name, code); ARGUMENTS event_channel_name is the name of the event channel assigned. (Output) code is a standard system status code (Output). The status code error_table_$special_channels_full is returned if there are no more available special event channels. ACCESS REQUIRED There are no access requirements for this entry. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$aaassssssiiigggnnn_llliiinnnkkkaaagggeee This entry point allocates a specified amount of space in the ring's original user free area. USAGE declare hcs_$assign_linkage entry (fixed bin(18), ptr, fixed bin(35)); call hcs_$assign_linkage (amount, rp, code); ARGUMENTS amount is the number of words to be allocated. (Input) rp points to the allocated space. (Output) ___________________ ___________ hcs_$assign_linkage hcs_$chname ___________________ ___________ code is a standard storage system status code. (Output) The possible code returned is: error_table_$noalloc The requested space could not be allocated. ACCESS REQUIRED No access required. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$bbbllloooccckkk Causes the calling process to enter the blocked state until a wakeup or IPS signal is received. If a wakeup is pending, the call returns immediately. There are no arguments. USAGE declare hcs_$block (); call hcs_$block (); ACCESS REQUIRED There are no access requirements for this gate entry. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ccchhhnnnaaammmeee This entry point changes the entry name on a specified storage system entry. If an already existing name (an old name) is specified, it is deleted from the entry; if a new name is specified, it is added. Thus, if only an old name is specified, the effect is to delete a name; if only a new name is specified, the effect is to add a name; and if both are specified, the effect is to rename the entry. USAGE declare hcs_$chname entry (char(*), char(*), char(*), char(*), fixed bin(35)); call hcs_$chname (dir_name, entryname, oldname, newname, code); ___________ ___________ hcs_$chname hcs_$chname ___________ ___________ ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entry name of the segment, directory, multisegment file, or link. (Input) oldname is the name to be deleted from the entry. (Input) It can be a null character string ("") in which case no name is deleted. If oldname is null, then newname must not be null. newname is the name to be added to the entry. (Input) It must not already exist in the directory on this or another entry. It can be a null character string ("") in which case no name is added. If it is null, then oldname must not be the only name on the entry. code is a storage system status code. (Output) It can have the values: error_table_$nonamerr attempting to delete the only name of a directory entry. error_table_$namedup attempting to add a name that exists on another entry. error_table_$segnamedup attempting to add a name that already exists on this entry. error_table_$incorrect_access The caller's access class isn't equal to that of the entry. ACCESS REQUIRED The user must have modify permission on the directory containing the entry whose name is to be changed. The process' authorization must be equal to the entry's access class. NOTES The hcs_$chname_seg entry point performs a similar function using a pointer to a segment instead of its pathname. ____________________ ____________________ hcs_$combine_linkage hcs_$combine_linkage ____________________ ____________________ NNNaaammmeee::: hhhcccsss_$$$cccooommmbbbiiinnneee_llliiinnnkkkaaagggeee This entry point combines a segment's linkage section in the ring of the validation level. USAGE declare hcs_$combine_linkage entry (ptr, fixed bin, fixed bin(35)); call hcs_$combine_linkage (segment_ptr, ring, code); ARGUMENTS segment_ptr points to the segment whose linkage is to be combined. (Input) ring is the ring in which to combine; it must be the current validation level. (Input) code is a standard storage system status code. (Output) The possible security-related codes returned are: error_table_$bad_ring_brackets The caller has non-null access and the caller's ring is not in the segment's read bracket but is in the parent's read bracket. error_table_$no_info Either the caller has null access to both segment and parent or the caller's ring is in the read bracket of neither segment nor parent. NOTES A seg_fault_error condition is raised if the caller has null access to the segment, non-null access to the parent, and the caller's ring is within the segment's read bracket. ACCESS REQUIRED The access required is R access on the segment in the ring of the validation level. ___________________ ___________________ hcs_$delete_channel hcs_$dir_quota_move ___________________ ___________________ NNNaaammmeee::: hhhcccsss_$$$dddeeellleeettteee_ccchhhaaannnnnneeelll Causes the specified special event channel (also called a fast channel) to be unassigned from the process. USAGE declare hcs_$delete_channel entry (fixed bin(71), fixed bin(35)); call hcs_$delete_channel (event_channel_name, code); ARGUMENTS event_channel_name is the name of a fast event channel. (Input) code is a standard system status code. (Output). This code is error_table_$invalid_channel if the specified channel is invalid (not a valid special channel). It is error_table_$wrong_channel_ring if the ring number associated with the special channel is not equal to the caller's current validation level. ACCESS REQUIRED There are no access requirements for this gate entry. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$dddiiirrr_qqquuuoootttaaa_mmmooovvveee moves all or part of a directory quota between two directories, one of which is immediately inferior to the other. USAGE declare hcs_$dir_quota_move entry (char(*), char(*), fixed bin, fixed bin(35)); call hcs_$dir_quota_move (dir_name, entryname, quota_change, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) ___________________ ___________________ hcs_$dir_quota_move hcs_$dir_quota_read ___________________ ___________________ entryname is the entryname of the directory. (Input) quota_change is the number of records of directory quota to be moved between the superior directory and the inferior directory. (Input) (See "Notes" below.) code is a storage system status code. (Output) NOTES Notes: After the directory quota change, the remaining directory quota in each directory must be greater than the number of records used by directories in that directory. The quota_change argument can be either a positive or negative number. If it is positive, the quota is moved from dir_name to entryname. If it is negative, the move is from entryname to dir_name. If the change results in zero quota left on entryname, that directory is assumed to no longer contain a terminal quota and all of its used records are reflected up to the used records on dir_name. It is a restriction that no quota in any of the directories superior to entryname can be modified from a nonzero value to a zero value by this subroutine. It is allowed to move directory quota from a master directory to and from its parent, since master directory status applies only to the quota used by segments. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$dddiiirrr_qqquuuoootttaaa_rrreeeaaaddd returns the directory record quota and accounting information for a directory. USAGE declare hcs_$dir_quota_read entry (char(*), fixed bin(18), fixed bin(71), bit(36) aligned, bit(36), fixed bin(1), fixed bin, fixed bin(35)); call hcs_$dir_quota_read (dir_name, quota, trp, tup, sons_lvid, tacc_sw, used, code); ___________________ ___________________ hcs_$dir_quota_read hcs_$dir_quota_read ___________________ ___________________ ARGUMENTS dir_name is the pathname of the directory for which directory quota information is desired. (Input) quota is the directory record quota in the directory. (Output) trp is the directory time-record product (trp) charged to the directory. (Output) This double-precision number is in units of record-seconds. tup is the time, expressed in storage system time format (the high-order 36 bits of the 52-bit time returned by the clock_ subroutine) that the directory trp was last updated. (Output) sons_lvid is the logical volume ID for segments contained in this directory. (Output) tacc_sw is the terminal directory account switch. (Output) The setting of this switch determines how charges are made. 1 directory records are charged against the directory quota in this directory 0 directory records are charged against the directory quota in the first superior directory with a terminal directory account used is the number of records used by directories in this directory and by directories in nonterminal inferior directories. (Output) code is a storage system status code. (Output) NOTES If the directory contains a nonterminal account, the quota, trp, and tup are all zero. The variable specified by used, however, is kept up-to-date and represents the number of directory records in this directory and inferior, nonterminal directories. ___________________ _____________________________ hcs_$dir_quota_read hcs_$echo_negotiate_get_chars ___________________ _____________________________ NNNaaammmeee::: hhhcccsss_$$$eeeccchhhooo_nnneeegggoootttiiiaaattteee_gggeeettt_ccchhhaaarrrsss This entrypoint reads characters from a communications channel, echoing some or all of them under program control. Echoing is controlled by the parameters of the call as well as by a break_table supplied via a control order. This entrypoint is obsolete, replaced by hcs_$tty_read_echoed. USAGE declare hcs_$echo_negotiate_get_chars entry (fixed bin, ptr, fixed bin, fixed bin (21), fixed bin (21), fixed bin, fixed bin, fixed bin, fixed bin (35)); call hcs_$echo_negotiate_get_chars (device_index, buffer_word_ptr, buffer_word_offset, buffer_length, n_trans, n_echoed, screen_left, state, code); ARGUMENTS device_index is the device index identifying the channel to the system. The device index is obtained via a call to hcs_$tty_index or hcs_$tty_attach. (input) buffer_word_ptr is a pointer to to beginning of the word containing the first character of the data buffer. If the buffer is not on an even work boundary, the buffer_word_offset is used to specify the character position within the word. (input) buffer_word_offset is the character index (0, 1, 2, or 3) of the first character of the buffer within the first word of the buffer. (input) buffer_length is the length of the data buffer in characters. (input) n_trans is the number of characters transferred by this call. (output) n_echoed is the number of the returned characters that were echoed by the system. (output) screen_left is the number of character positions left on the screen. This is the maximum number of characters that will be echoed if no break characters are typed. (input) _____________________________ ___________ hcs_$echo_negotiate_get_chars hcs_$fblock _____________________________ ___________ state is the state of the communications channel. The possible values returned are declared in the include file tty_states.incl.pl1. The only value that can be returned to processes other than the initializer is TTY_STATE_DIALED_UP. If the channel is in any other state, the status code will be error_table_$io_no_permission and the state will be undefined. In the initializer process, any of the states declared in the initializer may be returned. (output) code is the state of the communications channel. The possible values returned are declared in the include file tty_states.incl.pl1. The only value that can be returned to processes other than the initializer is TTY_STATE_DIALED_UP. If the channel is in any other state, the status code will be error_table_$io_no_permission and the state will be undefined. In the initializer process, any of the states declared in the initializer may be returned. (output) NOTES There is a complex protocol that is used to synchronize the application using echoed input and the system. This protocol is not described here; see the source in tty_read.pl1. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$fffbbbllloooccckkk Returns only when a wakeup is received, either for a fast channel or for a regular channel. It returns information about which fast channel received a wakeup and whether any messages were emptied from the Interprocess Transmission Table (ITT) into the process' Event Channel Table (ECT). USAGE declare hcs_$fblock entry (bit (36) aligned, bit (1) aligned); call hcs_$fblock (fast_channel_events, messages_allocated_in_ect); ___________ ____________________________ hcs_$fblock hcs_$flush_consecutive_pages ___________ ____________________________ ARGUMENTS fast_channel_events indicates on which fast channels wakeups are pending. (Input/Output) Each bit corresponds to a fast channel. The other bits in the string are untouched. messages_allocated_in_ect is set to "1"b if any messages were allocated in the ECT for the validation ring. (Output) ACCESS REQUIRED There are no access requirements for this gate entry. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$fffllluuussshhh_cccooonnnssseeecccuuutttiiivvveee_pppaaagggeeesss forces the supervisor to write the modified pages from a specified set of consecutive pages in each of a set of specified segments within the process' address space out to disk. USAGE declare hcs_$flush_consecutive_pages entry (ptr, fixed bin(35)); call hcs_$flush_consecutive_pages (flush_consecp, code); ARGUMENTS flush_consecp is a pointer to a flush_consec structure as described in flush_structures.incl.pl1. (Input) See "Notes" below. code is a standard status code. (Output) See "Notes" below. NOTES The flush_consec structure referred to by flush_consecp provides a list of segments, and for each, a range of pages within each segment to be flushed. Use of this entry point may introduce substantial real time delay into execution, since the caller must wait for the movement of the disk; other usage of the system, meanwhile, may cause further delay. ____________________________ ________________ hcs_$flush_consecutive_pages hcs_$flush_pages ____________________________ ________________ This entry point protects data against an unrecoverable main memory crash. This entry point returns the following non-zero status codes. If the segment is an inner ring segment, error_table_$bad_ring_brackets is returned. If the user does not have write access to the segment, error_table_$moderr is returned. If the segment is not known, or a hardcore segment, then error_table_$invalidsegno is returned. The pages are written one segment at a time. Any error encountered will abort the list. ACCESS REQUIRED None. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$fffllluuussshhh_pppaaagggeeesss forces the supervisor to write selected non-hardcore, non-directory pages to disk. The pages are in the process' address space and are written only if they have been modified. USAGE declare hcs_$flush_pages entry (ptr, fixed bin(35)); call hcs_$flush_pages (flushp, code); ARGUMENTS flushp is a pointer to a flush structure as described in flush_structures.incl.pl1. (Input) See "Notes" below. code is a standard status code. (Output) error_table_$argerr a page number is less than 0 or greater than 255 error_table_$dirseg the segment is a directory error_table_$invalidsegno the segment is not known, or is a hardcore segment. error_table_$unimplemented_version ________________ ____________________ hcs_$flush_pages hcs_$fs_get_brackets ________________ ____________________ NOTES The flush structure referred to by flushp provides a list of selected pages within selected segments to be flushed. Use of this entry point may introduce substantial real time delay into execution, since the caller must wait for the movement of the disk; other usage of the system, meanwhile, may cause further delay. This entry point protects data against an unrecoverable main memory crash. The pages are written one segment at a time. Any error encountered will abort the list. ACCESS REQUIRED None. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$fffsss_gggeeettt_bbbrrraaaccckkkeeetttsss hcs_$fs_get_brackets returns the access mode of the user on a specified segment at the current validation level, and the ring brackets of the segment. For a discussion of access modes, see "Access Control" in the Programmer's Reference Manual. This entrypoint is obsolete. USAGE declare hcs_$fs_get_brackets entry (ptr, fixed bin(5), (3) fixed bin(3), fixed bin(35)); call hcs_$fs_get_brackets (seg_ptr, mode, ring_brackets, code); ARGUMENTS seg_ptr is a pointer to the segment whose access mode is to be returned. (Input) mode is the access mode returned. See the description of the hcs_$append_branchx entry point for the possible values of the mode argument. (Output) ring_brackets are the ring brackets of the segment. ____________________ ____________________ hcs_$fs_get_brackets hcs_$fs_get_dir_name ____________________ ____________________ code is a standard system status code. (Output) Its possible values are: error_table_$no_info the user does not have enough access to get any information. NOTES The mode and ring brackets for the segment in the user's address space are used in combination with the user's current validation level to determine the mode the user would have if the user accessed this segment. For a discussion of ring brackets and validation level, see "Intraprocess Access Control" in the Programmer's Reference Manual. ACCESS REQUIRED This entry point requires s access to the parent of the object, or non-null access to the object itself. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$fffsss_gggeeettt_dddiiirrr_nnnaaammmeee This entry point returns a name of the directory containing the specified segment. USAGE declare hcs_$fs_get_dir_name entry (ptr, char(*), fixed bin, fixed bin(35)); call hcs_$fs_get_dir_name (segment_ptr, dirname, dirname_length, code); ARGUMENTS segment_ptr is a pointer to a segment. (Input) dirname is the directory name of the segment. (Output) dirname_length is the length in words of the directory name. (Output) ____________________ _______________________ hcs_$fs_get_dir_name hcs_$fs_search_get_wdir ____________________ _______________________ code is a standard storage system status code. (Output) The possible security-related codes returned are: error_table_$incorrect_access The caller's access class is either insufficient or inconsistent with that of the directory. error_table_$no_info The caller does not have the necessary access modes. ACCESS REQUIRED The access required is non-null on the entry and S on the parent directory. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$fffsss_ssseeeaaarrrccchhh_gggeeettt_wwwdddiiirrr This entry point returns the pathname of the working directory. USAGE declare hcs_$fs_search_get_wdir entry (ptr, fixed bin); call hcs_$fs_search_get_wdir (pathname_ptr, pathname_length); ARGUMENTS pathname_ptr is a pointer to the char (168) aligned string which is to contain the pathname. (Input) pathname_length is the length in characters of the working directory pathname. (Output) ACCESS REQUIRED The access required is S on the working directory and/or S on the parent directory. _______________________ _______________________ hcs_$fs_search_set_wdir hcs_$fs_search_set_wdir _______________________ _______________________ NNNaaammmeee::: hhhcccsss_$$$fffsss_ssseeeaaarrrccchhh_ssseeettt_wwwdddiiirrr This entry point makes the specified directory the working directory in the ring of the validation level. USAGE declare hcs_$fs_search_set_wdir entry (char(*), fixed bin(35)); call hcs_$fs_search_set_wdir (wdir_name, code); ARGUMENTS wdir_name is the pathname of the new working directory. (Input) code is a standard storage system status code. (Output) The possible security-related codes returned are: error_table_$incorrect_access The specified directory's access class is either higher than or inconsistent with the caller's access class. error_table_$no_dir Some directory in the path specified does not exist and the caller has access to search the "parent" of the nonexistent directory. error_table_$no_info The caller has insufficient access to both the specified directory and its parent, where insufficient access can mean either NULL access on the directory or that the caller's ring is not in the directory's ring bracket. ACCESS REQUIRED The access required is S access on the directory to be set and/or S access on its parent directory. _______________________ ______________________ hcs_$fs_search_set_wdir hcs_$get_authorization _______________________ ______________________ NNNaaammmeee::: hhhcccsss_$$$gggeeettt_aaalllaaarrrmmm_tttiiimmmeeerrr returns the current value of the pending timer and associated event channel. USAGE declare hcs_$get_alarm_timer entry (fixed bin(71), fixed bin(71)); call hcs_$get_alarm_timer (timer_value, event_channel); ARGUMENTS timer_value time of alarm. Zero means no timer active. (Output) event_channel event channel for wakeup. (Output) ACCESS REQUIRED None. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$gggeeettt_aaauuuttthhhooorrriiizzzaaatttiiiooonnn This entry point returns the access authorization and the maximum attainable access authorization values for the process. USAGE declare hcs_$get_authorization entry (bit(72) aligned, bit(72) aligned); call hcs_$get_authorization (authorization, max_authorization); ARGUMENTS authorization is the access authorization for the process. (Output) max_authorization is the maximum access authorization the user can attain. (Output) ______________________ ______________ hcs_$get_authorization hcs_$get_dates ______________________ ______________ ACCESS REQUIRED No access is required. This entry has per-process effects only, and may be called from any ring. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$gggeeettt_dddaaattteeesss Returns the date/time used, date/time modified, date/time entry modified, date/time dumped and the date/time volume dumped for a segment. Status permission on the directory or nonnull access on the entry is required to use this entry point. USAGE declare hcs_$get_dates entry (char(*), char(*), (*) bit(36), fixed bin(35)); call hcs_$get_dates (dir_name, entryname, dates, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the segment or directory. (Input) dates is an array of dates in file system format (the high order 36 bits of the value returned by the clock_ subroutine). The dates are returned in the order: date/time used, date/time modified, date/time entry modified, date/time dumped, date/time volume dumped. Only as many values are returned as are implied by the dimension of this argument. code is a storage system status code. (Output) __________________ _________________ hcs_$get_dates_ptr hcs_$get_defname_ __________________ _________________ NNNaaammmeee::: hhhcccsss_$$$gggeeettt_dddaaattteeesss_ppptttrrr Returns the date/time used, date/time modified, date/time entry modified, date/time dumped and the date/time volume dumped for a segment. Status permission on the directory or nonnull access on the entry is required to use this entry point. USAGE declare hcs_$get_dates_ptr entry (ptr, (*) bit(36), fixed bin(35)); call hcs_$get_dates_ptr (seg_ptr, dates, code); ARGUMENTS seg_ptr is a pointer to the segment. (Input) dates is an array of dates in file system format (the high order 36 bits of the value returned by the clock_ subroutine). The dates are returned in the order: date/time used, date/time modified, date/time entry modified, date/time dumped, date/time volume dumped. Only as many values are returned as are implied by the dimension of this argument. code is a storage system status code. (Output) ________________________________________ NNNaaammmeee::: hhhcccsss_$$$gggeeettt_dddeeefffnnnaaammmeee_ Returns the entry name corresponding to a given entry offset for a segment or gate. USAGE declare hcs_$get_defname_ entry (ptr, ptr, bit(18) aligned, fixed bin, char(*), fixed bin(35)); call hcs_$get_defname_ (linkptr, defptr, offset, section, entry_name, code); _________________ _________________ hcs_$get_defname_ hcs_$get_defname_ _________________ _________________ ARGUMENTS linkptr a pointer to the active linkage section for the entry. (Input) This value must be supplied only if defptr is null. defptr a pointer to the definitions section or to the segment if the segment is a gate. (Input) If this value is null, the definitions will be found via the linkage section indicated by linkptr. offset the offset of the entry. (Input) section the object section to which the offset is relative. (Input) A value of -1 indicates that any definition class is acceptable. entry_name the entry name from the definitions. (Output) code a storage system status code. (Output) The possible codes returned are: error_table_$defs_loop The object segment's definitions are not threaded properly or there are too many of them. error_table_$no_ext_sym A definition corresponding to the given offset was not found. NOTES This primitive searches the definitions section for the given object segment looking for a definition for an entry offset equal to the supplied offset and whose class (section of the object segment) matches the supplied section. It is used by process debugging tools to determine the entrypoint called from information in the stack frame for a procedure. The user must have "e" effective access to the segment in the calling ring and have "r" effective access in the ring of execution for the segment. _________________ _____________________________ hcs_$get_defname_ hcs_$get_hex_exponent_control _________________ _____________________________ In some situations conditions are raised that are not caught and transformed into error codes. seg_fault_error is raised if the caller has null access to the object segment. not_in_read_bracket is raised if the caller's ring is not in the object segment's read bracket, although the entry will handle gates if the linkptr argument is used. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$gggeeettt_hhheeexxx_eeexxxpppooonnneeennnttt_cccooonnntttrrrooolll Returns the state of automatic hexadecimal mode floating point under flow and over flow restart. USAGE declare hcs_$get_hex_exponent_control entry (bit (1) aligned, bit (1) aligned, bit (72) aligned); call hcs_$get_hex_exponent_control (restart_underflow, restart_overflow, max_value); ARGUMENTS restart_underflow is a flag. If "1"b, floating overflows in hex mode will be automatically restarted with a result value specified by the parameter "max_value." (Output) restart_overflow is a flag. if "1"b, floating underflows in hex mode will be automatically restarted with a result value of zero. (Output) max_value is the value to be used when automatically restarting floating overflows. (Output) ACCESS REQUIRED None. _____________________________ _____________________ hcs_$get_hex_exponent_control hcs_$get_ipc_operands _____________________________ _____________________ NNNaaammmeee::: hhhcccsss_$$$gggeeettt_iiipppccc_ooopppeeerrraaannndddsss Returns the two constants used to construct event channel names for the calling process. USAGE declare hcs_$get_ipc_operands entry (fixed bin (18), fixed bin (35)); call hcs_$get_ipc_operands (r_offset, r_factor); ARGUMENTS r_offset This is a number determined at process creation time that is used to construct event channel names. (Output) See "Notes" for more information. r_factor This is a number determined at process creation time that is used to construct event channel names. (Output) See "Notes" for more information. NOTES These two constants are determined randomly (from the clock) at process creation time. Event channel names are constructed by using these numbers in a one-way algorithm. See ipc_validate_.pl1 for more information on this. These quantities should never be stored in storage readable by other processes. ACCESS REQUIRED None. ___________ __________________________ hcs_$get_lp hcs_$get_page_trace_signal ___________ __________________________ NNNaaammmeee::: hhhcccsss_$$$gggeeettt_lllppp This entry point returns a pointer to the specified segment's combined linkage section in the ring of the validation level. The LOT in the ring's initial stack is used. USAGE declare hcs_$get_lp entry (ptr, ptr); call hcs_$get_lp (segment_ptr, linkage_ptr); ARGUMENTS segment_ptr is a pointer to the segment whose linkage section is desired. (Input) linkage_ptr is a pointer to the segment's combined linkage section in the ring of the validation level. (Output) ACCESS REQUIRED No access required. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$gggeeettt_pppaaagggeee_tttrrraaaccceee_sssiiigggnnnaaalll returns information about the signalling of the pgt_ IPS signal when the per-process event trace buffer is full. USAGE declare hcs_$get_page_trace_signal entry (bit (1) aligned, fixed bin); call hcs_$get_page_trace_signal (signal_sw, threshold); ARGUMENTS signal_sw is a flag. (Output) It will be "1"b if signalling of the pgt_ condition is enabled when the trace buffer is full, and "0"b if signalling is disabled. __________________________ _________________________ hcs_$get_page_trace_signal hcs_$get_segment_ptr_path __________________________ _________________________ threshold is the fullness threshold, expressed as a number between 0 and 100. (Output) The pgt_ condition will be signalled when the trace buffer is that percent full. ACCESS REQUIRED None. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$gggeeettt_ssseeegggmmmeeennnttt_ppptttrrr_pppaaattthhh Returns the segment number and UID of a segment already known to the calling process. USAGE declare hcs_$get_segment_ptr_path entry (char(*), char(*), ptr, bit(36), fixed bin(35)); call hcs_$get_segment_ptr_path (dir_name, entryname, seg_ptr, uid, code); ARGUMENTS dir_name is the directory name of the segment. (Input) entryname is the entryname of the segment. (Input) seg_ptr is a pointer to the segment. If the segment is not already known to the calling process (via initiation) then this will be null on return. (Output) uid is the unique ID of the segment. (output) code is a standard system status code. (Output) ______________________ _____________________________ hcs_$get_user_raw_mode hcs_$get_volume_dump_switches ______________________ _____________________________ NNNaaammmeee::: hhhcccsss_$$$gggeeettt_uuussseeerrr_rrraaawww_mmmooodddeee returns a user's access modes to a segment or directory without regard for ring brackets. USAGE declare hcs_$get_user_raw_mode entry (char(*), char(*), char(*), bit(36) aligned, fixed bin(35)); call hcs_$get_user_raw_mode (dir_name, entryname, user_name, modes, code); ARGUMENTS dir_name is the directory name of the segment or directory. (Input) entryname is the entryname of the segment or directory. (Input) user_name is the name of the user whose modes are to be returned. If this is "", the caller's modes are returned. modes are the access modes of the user on the specified object. (Output) code is a standard system status code. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$gggeeettt_vvvooollluuummmeee_ddduuummmppp_ssswwwiiitttccchhheeesss returns the value of the incremental and complete volume dump switches for a segment. The process must have status permission on the directory containing the segment or non-null access on the segment. USAGE declare hcs_$get_volume_dump_switches entry (char(*), char(*), fixed bin, fixed bin, fixed bin(35)); call hcs_$get_volume_dump_switches (dir_name, entryname, incremental_sw, complete_sw, code); _____________________________ _____________ hcs_$get_volume_dump_switches hcs_$grow_lot _____________________________ _____________ ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the segment. (Input) incremental_sw is the value of the incremental volume dump switch. A value of 1 means that the incremental volume dumper is prevented from dumping this segment. A value of -1 means that dumping of this segment is allowed. complete_sw is the value of the complete volume dump switch. A value of 1 means that the complete volume dumper is prevented from dumping this segment. A value of -1 means that dumping of this segment is allowed. code is a storage system status code. (Output) ________________________________________ NNNaaammmeee::: hhhcccsss_$$$gggrrrooowww_lllooottt This entry point increases the LOT in the specified ring to its maximum size by reallocating and copying it. The lot_ptr in the ring's initial stack is used. USAGE declare hcs_$grow_lot entry (fixed bin(3)); call hcs_$grow_lot (ring); ARGUMENTS ring is the ring number; it must be the same as the validation level. (Input) ACCESS REQUIRED No access required. _____________ __________________________ hcs_$grow_lot hcs_$initiate_search_rules _____________ __________________________ NNNaaammmeee::: hhhcccsss_$$$iiinnniiitttiiiaaattteee_ssseeeaaarrrccchhh_rrruuullleeesss This entry point provides the user with a subroutine interface for specifying the search rules that he wants to use in his process. USAGE declare hcs_$initiate_search_rules entry (ptr, fixed bin(35)); call hcs_$initiate_search_rules (search_rules_ptr, code); ARGUMENTS search_rules_ptr is a pointer to a structure containing the new search rules. See "Information Structure" below. (Input) code is a storage system status code. (Output) error_table_$bad_string not a pathname or keyword error_table_$notadir error_table_$too_many_sr INFORMATION STRUCTURE The structure pointed to by search_rules_ptr is declared as follows: dcl 1 search_rules aligned, 2 number fixed bin, 2 names (21) char(168) aligned; STRUCTURE ELEMENTS number is the number of search rules contained in the array. The current maximum number of search rules the user can define is 21. names are the names of the search rules. Two types of search rules are permitted: absolute pathnames of directories to be searched or keywords. __________________________ __________________________ hcs_$initiate_search_rules hcs_$initiate_search_rules __________________________ __________________________ LIST OF KEYWORDS initiated_segments search for the already initiated segments. referencing_dir search the containing directory of the segment making the reference. working_dir search the working directory. process_dir search the process directory. home_dir search the home directory. set_search_directories insert the directories following this keyword into the default search rules after working_dir, and make the result the current search rules. site-defined keywords may also be specified. These keywords may expand into one or more directory pathnames. The keyword, default, is always defined to be the site's default search rules. NOTES The set_search_directories keyword, when used, must be the first search rule specified and the only keyword used. If this keyword is used, hcs_$initiate_search_rules sets the default search rules, and then inserts the specified directories in the search rules after the working directory. Some of the keywords, such as set_search_directories, are expanded into more than one search rule. The limit of 21 search rules applies to the final number of search rules to be used by the process as well as to the number of rules contained in the array. The search rules remain in effect until this entry point is called with a different set of rules or the process is terminated. Codes that can be returned from this entry point are: __________________________ ______________ hcs_$initiate_search_rules hcs_$level_set __________________________ ______________ error_table_$bad_string (not a pathname or keyword) error_table_$notadir error_table_$too_many_sr Additional codes can be returned from other procedures that are called by hcs_$initiate_search_rules. For the values of the site-defined keywords, the user may call the hcs_$get_system_search_rules entry point. ACCESS REQUIRED None. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$llleeevvveeelll_gggeeettt returns the current validation level. USAGE declare hcs_$level_get entry fixed bin (3); call hcs_$level_get (level); ARGUMENTS level the current validation level. (Output) ACCESS REQUIRED None. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$llleeevvveeelll_ssseeettt Establish a new validation level for the process. USAGE declare hcs_$level_set entry fixed bin(3); call hcs_$level_set (level); ______________ _______________ hcs_$level_set hcs_$link_force ______________ _______________ level the validation level to be made current. (Input) NOTES The level cannot be set to a value lower than the current ring of execution. ACCESS REQUIRED None. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$llliiinnnkkk_fffooorrrccceee This entry point snaps a link that was not faulted on. USAGE declare hcs_$link_force entry (ptr, fixed bin, fixed bin(35)); call hcs_$link_force (link_pair_ptr, ignore, code); ARGUMENTS link_pair_ptr is a pointer to the link to be snapped. (Input) ignore is not used. code is a standard storage system status code. (Output) The possible security-related codes returned are: error_table_$moderr Either the caller had NULL access to the target and S access to the parent, or the caller's ring was not in the target's call bracket. error_table_$seg_not_found The target was not found. The caller may have had NULL access to both the intended target and its parent. NOTES A no_read_permission condition is raised if the caller's access in the call bracket is non-NULL but does not include R access. _______________ _____________ hcs_$link_force hcs_$list_acl _______________ _____________ ACCESS REQUIRED The access required on the target is R access in the call bracket. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$llliiisssttt_aaaccclll This entry point is used either to list the entire access control list (ACL) of a segment or to return the access modes of specified ACL entries. The segment_acl_array structure used by this entry point is discussed in the description of hcs_$add_acl_entries. USAGE declare hcs_$list_acl entry (char(*), char(*), ptr, ptr, ptr, fixed bin, fixed bin(35)); call hcs_$list_acl (dir_name, entryname, area_ptr, area_ret_ptr, acl_ptr, acl_count, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the segment. (Input) area_ptr points to an area in which the list of ACL entries, which make up the entire ACL of the segment, is allocated. (Input) If area_ptr is null, then the user wants access modes for certain ACL entries; these will be specified by the structure pointed to by acl_ptr (see below). area_ret_ptr points to the start of the allocated list of ACL entries. (Output) acl_ptr if area_ptr is null, then acl_ptr points to an ACL structure, segment_acl_array, into which mode information is placed for the access names specified in that same structure. (Input) acl_count is the number of entries in the ACL structure. (Input or _____________ _____________ hcs_$list_acl hcs_$list_dir _____________ _____________ Output) Input is the number of entries in the ACL structure identified by acl_ptr. Output is the number of entries in the segment_acl_array structure allocated in the area pointed to by area_ptr, if area_ptr is not null. code is a storage system status code. (Output) NOTES If acl_ptr is used to obtain modes for specified access names (rather than for all access names on a segment), then each ACL entry in the segment_acl_array structure either has status_code set to 0 and contains the segment's mode or has status_code set to error_table_$user_not_found and contains a mode of 0. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$llliiisssttt_dddiiirrr This entry point returns information about all the entries in the specified directory, plus a count of the number of branches (segments and directories) and the number of links. The information is returned in the user-defined area. If user-area is null, dc_n_branches and dc_n_links are set to the total number of respective entries. This entry point will try to return information kept in the volume table of contents (VTOC) if it is mounted, and it can be time consuming to access the VTOC entries for all branches in a large directory. USAGE declare hcs_$list_dir entry (char(*), area(1024), ptr, fixed bin, ptr, fixed bin, fixed bin(35)); call hcs_$list_dir (dir_name, user_area, dc_branch_arrayp, dc_n_branches, dc_link_arrayp, dc_n_links, code); _____________ _____________ hcs_$list_dir hcs_$list_dir _____________ _____________ ARGUMENTS dir_name is the pathname of the containing directory. (Input) user_area is the user-defined area where the structures will be allocated. (Input) dc_branch_arrayp is a pointer to the allocated array structure in which information on each branch is returned. (Output) This array structure is defined in "Branch Array Structure". dc_n_branches is a count of the number of branches in the directory. (Output) dc_link_arrayp is a pointer to the allocated array structure in which information on each link is returned. (Output) This array structure is defined in "Link Array Structure". dc_n_links is a count of the number of links in the directory. (Output) code is a storage system status code. (Output) BRANCH ARRAY STRUCTURE The branch array structure will be allocated as follows: dcl 1 dcpack_branch_array (dc_n_branches) like dcpack_branch based (dc_branch_arrayp) aligned; The branch structure, defined as dcpack_branch in the include file dcpack_info.incl.pl1, is as follows: dcl 1 dcpack_branch based (dc_branchp) aligned; 2 vtoc_error bit (1) unal, 2 pad1 bit (1) unal, 2 uid bit (70) unal, 2 pad2 bit (20) unal, 2 dtu bit (52) unal, 2 pad3 bit (20) unal, 2 dtm bit (52) unal, 2 pad4 bit (20) unal, _____________ _____________ hcs_$list_dir hcs_$list_dir _____________ _____________ 2 dtd bit (52) unal, 2 pad5 bit (20) unal, 2 dtem bit (52) unal, 2 pad6 bit (20) unal, 2 rd bit (52) unal, 2 dirsw bit (1) unal, 2 optsw bit (2) unal, 2 bc bit (24) unal, 2 consistsw bit (2) unal, 2 mode bit (5) unal, 2 usage bit (2) unal, 2 usagect bit (17) unal, 2 nomore bit (1) unal, 2 cl bit (9) unal, 2 ml bit (9) unal, 2 acct bit (36), 2 hlim bit (17) unal, 2 llim bit (17) unal, 2 pad7 bit (2) unal, 2 rb1 bit (6) unal, 2 rb2 bit (6) unal, 2 rb3 bit (6) unal, 2 pad8 bit (18) unal, 2 pad9 bit (18) unal, 2 namerp bit (18) unal, 2 nnames fixed bin, _____________ _____________ hcs_$list_dir hcs_$list_dir _____________ _____________ STRUCTURE ELEMENTS vtoc_error the VTOCE of this entry could not be read, thus the VTOCE fields are invalid. uid is the 36 bit segment UID at the front of 70 bits. dtu is the date and time the branch was last used. This VTOCE field is invalid if vtoc_error is "1"b. dtm is the date and time the contents of the branch was last modified. This VTOCE field is invalid if vtoc_error is "1"b. dtd is the date and time the branch was last dumped (hierarchy). dtem is the date and time the branch was last modified. rd is an unused field. dirsw specifies whether entry is a directory. optsw specifies whether the copy switch is on. bc is the bit count of the segment or directory. consistsw is an unused field. mode is the current user's access mode for this segment or directory. The values of these bits are the same as for the fixed bin (5) mode, defined in the include file access_mode_values.incl.pl1, as follows: _____________ _____________ hcs_$list_dir hcs_$list_dir _____________ _____________ dcl (N_ACCESS_BIN init (00000b), R_ACCESS_BIN init (01000b), E_ACCESS_BIN init (00100b), W_ACCESS_BIN init (00010b), RW_ACCESS_BIN init (01010b), RE_ACCESS_BIN init (01100b), REW_ACCESS_BIN init (01110b), S_ACCESS_BIN init (01000b), M_ACCESS_BIN init (00010b), A_ACCESS_BIN init (00001b), SA_ACCESS_BIN init (01001b), SM_ACCESS_BIN init (01010b), SMA_ACCESS_BIN init (01011b)) fixed bin (5) internal static options (constant); usage is an unused field. usagect is an unused field. nomore is an unused field. cl is the current length of the segment or directory in units of 1024-word records. This VTOCE field is invalid if vtoc_error is "1"b. ml is the maximum length of the segment or directory in units of 1024-word records. This VTOCE field is invalid if vtoc_error is "1"b. acct is an unused field. hlim is an unused field. llim is an unused field. rb1 is ring bracket 1 for a segment or dir ring bracket for a directory. _____________ _____________ hcs_$list_dir hcs_$list_dir _____________ _____________ rb2 is ring bracket 2 for a segment or dir ring bracket for a directory. rb3 is ring bracket 3 for a segment or dir ring bracket for a directory. namerp is a relative pointer into area of names array structure for this entry. This structure is defined in "Names Array Structure". nnames is the number of addnames on this segment or directory. LINK ARRAY STRUCTURE The link array structure will be allocated as follows: dcl 1 dcpack_link_array (dc_n_links) like dcpack_link based (dc_link_arrayp) aligned; The link structure, defined as dcpack_link in the include file dcpack_info.incl.pl1, is as follows: dcl 1 dcpack_link based (dc_linkp) aligned, 2 pad1 bit (2) unal, 2 uid bit (70) unal, 2 pad2 bit (20) unal, 2 dtu bit (52) unal, 2 pad3 bit (20) unal, 2 dtem bit (52) unal, 2 pad4 bit (20) unal, 2 dtd bit (52) unal, 2 pathnamerp bit (18) unal, 2 namerp bit (18) unal, 2 nnames fixed bin; STRUCTURE ELEMENTS uid is the 36 bit segment UID at the front of 70 bits. dtu is the date and time the link was last used. _____________ _____________ hcs_$list_dir hcs_$list_dir _____________ _____________ dtd is the date and time the link was last dumped (hierarchy). dtem is the date and time the link was last modified. pathnamep is a relative pointer into area of link pathname. This structure is defined in "Link Pathname Structure". namep is a relative pointer into area of names array structure for this link. This structure is defined in "Names Array Structure". nnames is the number of addnames on this link. NAME ARRAY STRUCTURE The name array structure will be allocated as follows: dcl 1 dcpack_name_array (dc_n_names) aligned like dcpack_ename based (dc_name_arrayp); dcl 1 dcpack_ename based (dc_namep) aligned, 2 size fixed bin (16) unal, 2 pad bit (19) unal, 2 name char (32) unaligned; STRUCTURE ELEMENTS size is the length of added name. name is the name for compatability with old status command. LINK PATHNAME STRUCTURE The link pathname structure, defined as dcpack_path in the include file dcpack_info.incl.pl1, is as follows: _____________ _______________ hcs_$list_dir hcs_$set_copysw _____________ _______________ dcl 1 dcpack_path based (dc_pnp) aligned, 2 size fixed bin (16) unal, 2 pad bit (19) unal, 2 author char (32) unaligned, 2 name char (168) unaligned; STRUCTURE ELEMENTS size is the length of link pathname in chars. author is the author. name is the link pathname. ACCESS REQUIRED Status permission is required on the containing directory. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ssseeettt_cccooopppyyyssswww This entry point allows the copy switch associated with the specified entry (segment or directory) to be changed. The copy switch is used to determine whether the segment itself or a copy of the segment is made available to a process, it has no meaning for a directory. USAGE declare hcs_$set_copysw entry (char(*), char(*), fixed bin(1), fixed bin(35)); call hcs_$set_copysw (dir_name, entryname, copy_sw, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the segment or directory. (Input) _______________ __________________ hcs_$set_copysw hcs_$set_cpu_timer _______________ __________________ copy_sw is the new value of the copy switch. (Input) 1 a copy of the segment will be made whenever it is initiated 0 a copy of the segment will not be made when it is initiated code is a storage system status code. (Output) It can have the value: error_table_$bad_ring_brackets attempting to change the copy switch when the ring brackets are less than the validation level of the user. ACCESS REQUIRED The user must have status and modify permission on the containing directory. Also, the user's validation level must be within the first ring bracket of the entry. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ssseeettt_cccpppuuu_tttiiimmmeeerrr Establishes a CPU timer for the process which will cause a IPC wakeup or IPS signal to be sent when the specified CPU time passes. USAGE declare hcs_$set_cpu_timer entry (fixed bin (71), fixed bin, fixed bin (71)); call hcs_$set_cpu_timer (alarm_time, abs_rel_sw, event_channel_nane); ARGUMENTS alarm_time is the time, either absolute or relative, at which an IPC wakeup or IPS signal is to be sent to the process. (Input) abs_rel_sw is either 1 for relative time, or 2 for absolute time. (Input) __________________ ___________________ hcs_$set_cpu_timer hcs_$set_damaged_sw __________________ ___________________ event_channel_nane is the name of the event channel over which the IPC wakeup is to be sent. If its value is 0, then an IPS cput signal is sent in lieu of a wakeup. (Input) ACCESS REQUIRED There are no access requirements for this gate entry. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ssseeettt_dddaaammmaaagggeeeddd_ssswww This entry point allows the damaged switch associated with the specified entry (segment or directory) to be changed in the volume table of contents (VTOC), if it is mounted. The damaged switch indicates a segment has been damaged by a device error or system crash, it has no meaning for a directory. USAGE declare hcs_$set_damaged_sw entry (char(*), char(*), bit(1), fixed bin(35)); call hcs_$set_damaged_sw (dir_name, entryname, damaged_sw, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the segment or directory. (Input) damaged_sw is the new value of the damaged switch. (Input) 1 any attempt to reference this segment will result in a segment fault with error code error_table_$segbusted 0 the segment is usable code is a storage system status code. (Output) It can have the value: error_table_$bad_ring_brackets attempting to change the damaged switch when the ring brackets are less than the validation level of the user. ___________________ _______________________ hcs_$set_damaged_sw hcs_$set_damaged_sw_seg ___________________ _______________________ ACCESS REQUIRED The user must have status and modify permission on the containing directory or write permission on the entry. Also, the user's validation level must be within the first ring bracket of the entry. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ssseeettt_dddaaammmaaagggeeeddd_ssswww_ssseeeggg This entry point, given a pointer to a segment, allows the damaged switch associated with the specified segment to be changed in the volume table of contents (VTOC), if it is mounted. The damaged switch indicates a segment has been damaged by a device error or system crash. USAGE declare hcs_$set_damaged_sw_seg entry (ptr, bit(1), fixed bin(35)); call hcs_$set_damaged_sw_seg (seg_ptr, damaged_sw, code); ARGUMENTS seg_ptr is the pointer to the segment. (Input) damaged_sw is the new value of the damaged switch. (Input) 1 any attempt to reference this segment will result in a segment fault with error code error_table_$segbusted 0 the segment is usable code is a storage system status code. (Output) It can have the value: error_table_$bad_ring_brackets attempting to change the damaged switch when the ring brackets are less than the validation level of the user. _______________________ _____________________________ hcs_$set_damaged_sw_seg hcs_$set_hex_exponent_control _______________________ _____________________________ ACCESS REQUIRED The user must have status and modify permission on the containing directory or write permission on the segment. Also, the user's validation level must be within the first ring bracket of the segment. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ssseeettt_hhheeexxx_eeexxxpppooonnneeennnttt_cccooonnntttrrrooolll specifies the bahavior of the process on floating underflow or overflow in hex mode. USAGE declare hcs_$set_hex_exponent_control entry (bit(1) aligned, bit(1) aligned, bit(72) aligned, fixed bin(35)); call hcs_$set_hex_exponent_control (restart_underflow, restart_overflow, max_value, code); ARGUMENTS restart_underflow is a flag. If "1"b, then floating underflow faults will be automatically restarted with a result value of zero. (Input) restart_overflow is a flag. If "1"b, then floating overflow faults in hex mode will be restarted with a result value of max_value. (Input) max_value is the value to be used as the result when a floating overflow is restarted in hex mode. (Input) code is a standard system status code. It will be nonzero if the caller validation level is greater than the process' initial ring. (Output) ACCESS REQUIRED None. ______________________ ______________________ hcs_$set_hexfp_control hcs_$set_hexfp_control ______________________ ______________________ NNNaaammmeee::: hhhcccsss_$$$ssseeettt_hhheeexxxfffppp_cccooonnntttrrrooolll This program controls the access to hex floating point mechanism of the 8/70 processors via the access control segment >sc1>admin_acs>Fortran_hfp.acs. If the user has sufficient access (see notes), pds_$hfp_exponent_enabled may be set or reset by using this program. USAGE declare hcs_$set_hexfp_control entry (bit(2) aligned, bit(2) aligned, fixed bin(35)); call hcs_$set_hexfp_control (new_hfp_sw, old_hfp_sw, code); ARGUMENTS new_hfp_sw is the desired state of the hfp switch. (Output) Must be "1"b to enable use of hex floating point and "0"b to disable it. old_hfp_sw is the current state of the hfp switch. (Output) code is a standard system status code. (Output) The value will be either 0 or et_$action_not_performed. ACCESS REQUIRED The user must have access to set_proc_required command to select an 8/70M processor, or depend on luck to be dealt one -- since we do not support hybrid systems, this really is not a problem. Site approval of use of hex floating point is also required, i.e., sys_info$hfp_exponent_available must be set to "1"b. If the acs segment >sc1>admin_acs>Fortran_hfp.acs exists, RW access to it is required; otherwise, no other restrictions apply. ______________________ __________________________ hcs_$set_hexfp_control hcs_$set_page_trace_signal ______________________ __________________________ NNNaaammmeee::: hhhcccsss_$$$ssseeettt_pppaaagggeee_tttrrraaaccceee_sssiiigggnnnaaalll Sets the parameters that control the signalling of the pgt_ IPS signal (and corresponding condition). USAGE declare hcs_$set_page_trace_signal entry (bit(1) aligned, fixed bin, bit(1) aligned, bit(1) aligned, fixed bin, fixed bin(35)); call hcs_$set_page_trace_signal (new_signal_sw, new_threshold, values_changed, old_signal_sw, old_threshold, code); ARGUMENTS new_signal_sw is a flag. if it is "1"b, then the pgt_ condition will be signalled whenever the trace buffer reaches the specified percentage of fullness. (Input) new_threshold is a percent between 0 and 100. When the new_signal_sw is "1"b, this determines the point at which a pgt_ condition is signalled. When the per-process buffer of events reaches this percentage of full, the condition is signalled. (Input) values_changed is a flag. it is set to "1"b on output if the new_signal_sw and the new_threshold changed the existing parameters in place. (Output) old_signal_sw is the old value of the signal_sw. (Output) old_threshold is the old value of the threshold. (Output) code is a standard system status code. (Output) ACCESS REQUIRED None. __________________________ __________________ hcs_$set_page_trace_signal hcs_$set_stack_ptr __________________________ __________________ NNNaaammmeee::: hhhcccsss_$$$ssseeettt_ppplll111_mmmaaaccchhhiiinnneee_mmmooodddeee This entrypoint changes the manner in which the user's process handles stringsize conditions. USAGE declare hcs_$set_pl1_machine_mode entry (fixed bin, fixed bin); call hcs_$set_pl1_machine_mode (new_mode, old_mode); ARGUMENTS new_mode is the value to set for the mode. Non-zero means that the machine conditions should be made restartable, zero means that the machine conditions are to be unmodified when the condition is signalled. (Input) old_mode is the value of the mode before changing, for those applications who wish to restore the process state. (Input) ACCESS REQUIRED None. This entry simply changes the behavior of the user's process. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ssseeettt_ssstttaaaccckkk_ppptttrrr specifies the stack to be used for the current validation level. Until reset, the supervisor will perform all signalling and user ring stack manipulation in the specified segment. The new stack must have been properly initialized or the process will fail very soon. No checks are made with the pointer given, but if there is not effective REW access the process will die. This routine is called by cpm_. USAGE declare hcs_$set_stack_ptr entry (ptr); call hcs_$set_stack_ptr (stk_ptr); __________________ ________________________ hcs_$set_stack_ptr hcs_$set_synchronized_sw __________________ ________________________ ARGUMENTS stk_ptr points to the location to begin a new stack. (Input) ACCESS REQUIRED None. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ssseeettt_sssyyynnnccchhhrrrooonnniiizzzeeeddd_ssswww sets the synchronized switch for a segment. This is allowed only for segments whose write bracket is less than or equal to the data management ring number. Modify permission is required on the directory containing the segment. USAGE declare hcs_$set_synchronized_sw entry (char(*), char(*), bit(1) aligned, fixed bin(35)); call hcs_$set_synchronized_sw (dir_name, entryname, switch, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the segment. (Input) switch is the value to be set for the synchronized switch. (Input) code is a storage system status code. (Output) ______________ _____________________________ hcs_$set_timer hcs_$set_volume_dump_switches ______________ _____________________________ NNNaaammmeee::: hhhcccsss_$$$ssseeettt_tttiiimmmeeerrr Sets the per-process cpu timer. An IPC wakeup or an IPS signal will be sent to the process when the specified amount of CPU time has passed. USAGE declare hcs_$set_timer entry (fixed bin (71), fixed bin (71)); call hcs_$set_timer (cpu_time, event_channel_name); ARGUMENTS cpu_time is the absolute number of CPU microseconds which may pass before an IPC wakeup or IPS signal is to be sent to the process. (Input) event_channel_name is the name of the event channel over which the IPC wakeup is to be sent. If its value is 0, then an IPS cput signal is sent in lieu of a wakeup. (Input) ACCESS REQUIRED There are no access requirements for this gate entry. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ssseeettt_vvvooollluuummmeee_ddduuummmppp_ssswwwiiitttccchhheeesss modifies the incremental and complete volume dump switches for a segment. Modify permission is required on the directory containing the segment. USAGE declare hcs_$set_volume_dump_switches entry (char(*), char(*), fixed bin, fixed bin, fixed bin(35)); call hcs_$set_volume_dump_switches (dir_name, entryname, incremental_sw, complete_sw, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) _____________________________ ______________________ hcs_$set_volume_dump_switches hcs_$status_for_backup _____________________________ ______________________ entryname is the entryname of the segment. (Input) incremental_sw specifies how the incremental volume dump switch is to be modified. A positive value for incremental_sw sets the switch (thereby preventing the incremental volume dumper from dumping this segment). A negative value for incremental_sw resets it (thereby allowing the dumping of this segment). A zero value for incremental_sw leaves the switch as is. complete_sw specifies how the complete volume dump switch is to be modified. A positive value for complete_sw sets the switch (thereby preventing the complete volume dumper from dumping this segment). A negative value for complete_sw resets it (thereby allowing the dumping of this segment). A zero value for complete_sw leaves the switch as is. code is a storage system status code. (Output) ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ssstttaaatttuuusss_fffooorrr_bbbaaaccckkkuuuppp Returns a large amount of information for an entry. Status permission on the directory or nonnull access on the entry is required to use this entry point. USAGE declare hcs_$status_for_backup entry (char(*), char(*), ptr, fixed bin(35)); call hcs_$status_for_backup (dir_name, entryname, info_ptr, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the segment or directory. (Input) ______________________ _________________ hcs_$status_for_backup hcs_$trace_marker ______________________ _________________ info_ptr is a pointer to a structure described by status_for_backup.incl.pl1. (Input) code is a storage system status code. (Output) ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ssstttoooppp_ppprrroooccceeessssss This entry causes the calling process to be placed in the "stopped" state. The system will no longer schedule the calling process. USAGE declare hcs_$stop_process entry (bit(36) aligned); call hcs_$stop_process (process_id); ARGUMENTS process_id is the process id of the calling process. It is supplied only as a means of verifying that the calling process really desires to be stopped. (Input) ACCESS REQUIRED There are no access requirements for this gate entry. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$tttrrraaaccceee_mmmaaarrrkkkeeerrr Adds a marker to the per-process trace of hardcore events. This allows a process calling hcs_$get_page_trace to mark the trace at the beginning of some set of operations, perform the operations, and then read out the trace. The trace elements that were caused by the operation can then be determined by searching for the marker. USAGE declare hcs_$trace_marker entry (char (4)); _________________ _______________________ hcs_$trace_marker hcs_$try_to_unlock_lock _________________ _______________________ call hcs_$trace_marker (mark); ARGUMENTS mark is a 4 character marker to identify a place in the trace. ACCESS REQUIRED None ________________________________________ NNNaaammmeee::: hhhcccsss_$$$tttrrryyy_tttooo_uuunnnllloooccckkk_llloooccckkk Allows non-hardcore programs to unlock a lock if it was originally locked by a process which no longer exists. If the process associated with the lock id in the lock no longer exists, then the lock is set to the lock id of the calling process. USAGE declare hcs_$try_to_unlock_lock entry (ptr, fixed bin); call hcs_$try_to_unlock_lock (lock_ptr, code); ARGUMENTS lock_ptr is a pointer to a standard lock word. (Input) The value pointed to by this pointer is assumed to be either a lock id or 0. code is an status code. (Output) It is a non-standard status code which takes on the following values: 1 - the lock is locked by a currently valid process. 2 - the lock was not locked. 3 - the lock id was bad is now set to the caller's lock id. ACCESS REQUIRED The caller must have write effective access to the segment pointed to by the supplied pointer. If the ring mechanism prevents writing to the segment, the not_in_write_bracket condition will be signalled. If discretionary or mandatory access control prevent writing to the segment, the no_write_permission condition will be signalled. ______________ ______________ hcs_$tty_abort hcs_$tty_abort ______________ ______________ NNNaaammmeee::: hhhcccsss_$$$ttttttyyy_aaabbbooorrrttt This entrypoint implements "resetread" and "resetwrite", i.e., discarding pending input and/or output. USAGE declare hcs_$tty_abort entry (fixed bin, fixed bin (2), fixed bin, fixed bin (35)); call hcs_$tty_abort (device_index, resetsw, state, code); ARGUMENTS device_index is the device index identifying the channel to the system. The device index is obtained via a call to hcs_$tty_index or hcs_$tty_attach. (input) resetsw Specifies whether to reset input, output, or both. The value is constructed as follows: a value of 2 indicates resetwrite, and a value of 1 is resetread. A value of 3 is both. state is the state of the communications channel. The possible values returned are declared in the include file tty_states.incl.pl1. The only value that can be returned to processes other than the initializer is TTY_STATE_DIALED_UP. If the channel is in any other state, the status code will be error_table_$io_no_permission and the state will be undefined. In the initializer process, any of the states declared in the initializer may be returned. (output) code is a standard system status code. It will be error_table_$io_no_permission if the channel has hung up. (output) _______________ _______________ hcs_$tty_attach hcs_$tty_attach _______________ _______________ NNNaaammmeee::: hhhcccsss_$$$ttttttyyy_aaattttttaaaccchhh Attaches a communications channel to the calling process, given the channel name. The channel must have been previously assigned to the process via dial_manager_, unless the calling process is the initializer. USAGE declare hcs_$tty_attach entry (char(*), fixed bin(71), fixed bin, fixed bin, fixed bin(35)); call hcs_$tty_attach (channel_name, event_channel, device_index, state, code); ARGUMENTS channel_name Is the name of the communications channel to be attached. event_channel is an IPC event channel over which the system will send a wakeup when input arrives or when output space is available. In the initializer process, wakeups are also sent when the channel dials up or hangs up. Note that input and output wakeups are only sent if the process' most recent read or write (respectively) failed due to lack or input or space. (input) device_index Is the device index identifying the channel to the system. This can be passed to the other hcs_$tty_* entrypoints. (output) state is the state of the communications channel. The possible values returned are declared in the include file tty_states.incl.pl1. The only value that can be returned to processes other than the initializer is TTY_STATE_DIALED_UP. If the channel is in any other state, the status code will be error_table_$io_no_permission and the state will be undefined. In the initializer process, any of the states declared in the initializer may be returned. (output) code is a standard system status code. It will be error_table_$io_no_permission if the channel has hung up. (output) _______________ _______________ hcs_$tty_attach hcs_$tty_detach _______________ _______________ NOTES Note that hcs_$tty_attach, unlike hcs_$tty_index, will return an error if it is called twice for the same channel. ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ttttttyyy_dddeeetttaaaccchhh Detaches a communications channel from the calling process. The channel remains assigned for re-attachment. USAGE declare hcs_$tty_detach entry (fixed bin, fixed bin, fixed bin, fixed bin(35)); call hcs_$tty_detach (device_index, detach_flag, state, code); ARGUMENTS device_index is the device index identifying the channel to the system. The device index is obtained via a call to hcs_$tty_index or hcs_$tty_attach. (input) detach_flag This flag is only respected if the calling process is the initializer. If it is set to 1, then the channel is hung up and must be listened to again (with a "listen" control order) before it may be used. If the flag is zero then the channel remains in the same state. This flag is primarily of historical interest, dating to the time when non-initializer processes could serve as the hardcore owner (hproc) for communications channels. Setting the flag to 1 allowed a new process to become the channel owner. (input) state is the state of the communications channel. The possible values returned are declared in the include file tty_states.incl.pl1. The only value that can be returned to processes other than the initializer is TTY_STATE_DIALED_UP. If the channel is in any other state, the status code will be error_table_$io_no_permission and the state will be undefined. In the initializer process, any of the states declared in the initializer may be returned. (output) _______________ ________________________ hcs_$tty_detach hcs_$tty_detach_new_proc _______________ ________________________ code is a standard system status code. It will be error_table_$io_no_permission if the channel has hung up. (output) ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ttttttyyy_dddeeetttaaaccchhh_nnneeewww_ppprrroooccc This entrypoint detaches a communications channel from the calling process. If the calling process is the initializer, then the channel becomes available for attachment by a specified user process. USAGE declare hcs_$tty_detach_new_proc entry (fixed bin, bit(36), fixed bin, fixed bin(35)); call hcs_$tty_detach_new_proc (device_index, user_process_id, state, code); ARGUMENTS device_index is the device index identifying the channel to the system. The device index is obtained via a call to hcs_$tty_index or hcs_$tty_attach. (input) user_process_id is the process id of the user process which is being given the right to use this channel. This process may now attach the channel via hcs_$tty_attach or hcs_$tty_index. This argument is ignored if the caller is not the initializer. state is the state of the communications channel. The possible values returned are declared in the include file tty_states.incl.pl1. The only value that can be returned to processes other than the initializer is TTY_STATE_DIALED_UP. If the channel is in any other state, the status code will be error_table_$io_no_permission and the state will be undefined. In the initializer process, any of the states declared in the initializer may be returned. (output) ________________________ ______________ hcs_$tty_detach_new_proc hcs_$tty_event ________________________ ______________ code is a standard system status code. It will be error_table_$io_no_permission if the channel has hung up. (output) ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ttttttyyy_eeevvveeennnttt This entrypoint supplies a new event channel for an attached communications channel. USAGE declare hcs_$tty_event entry (fixed bin, fixed bin(71), fixed bin, fixed bin(35)); call hcs_$tty_event (device_index, event_channel, state, code); ARGUMENTS device_index is the device index identifying the channel to the system. The device index is obtained via a call to hcs_$tty_index or hcs_$tty_attach. (input) event_channel is an IPC event channel over which the system will send a wakeup when input arrives or when output space is available. In the initializer process, wakeups are also sent when the channel dials up or hangs up. Note that input and output wakeups are only sent if the process' most recent read or write (respectively) failed due to lack or input or space. (input) state is the state of the communications channel. The possible values returned are declared in the include file tty_states.incl.pl1. The only value that can be returned to processes other than the initializer is TTY_STATE_DIALED_UP. If the channel is in any other state, the status code will be error_table_$io_no_permission and the state will be undefined. In the initializer process, any of the states declared in the initializer may be returned. (output) ______________ _________________ hcs_$tty_event hcs_$tty_get_line ______________ _________________ code is a standard system status code. It will be error_table_$io_no_permission if the channel has hung up. (output) ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ttttttyyy_gggeeettt_llliiinnneee This entrypoint reads data from a communications channel. If there is a line mark available in the data stream, then it will return no data past the line mark. USAGE declare hcs_$tty_get_line entry (fixed bin, ptr, fixed bin(24), fixed bin(24), fixed bin(24), bit(1), fixed bin, fixed bin(35)); call hcs_$tty_get_line (device_index, buffer_word_ptr, buffer_char_offset, buffer_length, n_trans, nl_found, state, code); ARGUMENTS device_index is the device index identifying the channel to the system. The device index is obtained via a call to hcs_$tty_index or hcs_$tty_attach. (input) buffer_word_ptr is a pointer to to beginning of the word containing the first character of the data buffer. If the buffer is not on an even work boundary, the buffer_word_offset is used to specify the character position within the word. (input) buffer_char_offset is the character index (0, 1, 2, or 3) of the first character of the buffer within the first word of the buffer. (input) buffer_length is the length of the data buffer in characters. (input) n_trans is the number of characters transferred by this call. (output) _________________ _________________ hcs_$tty_get_line hcs_$tty_get_name _________________ _________________ nl_found will be "1"b if the last character is a new line character (linemark), and "0"b if no new line character was available within buffer_length characters. (input) state is the state of the communications channel. The possible values returned are declared in the include file tty_states.incl.pl1. The only value that can be returned to processes other than the initializer is TTY_STATE_DIALED_UP. If the channel is in any other state, the status code will be error_table_$io_no_permission and the state will be undefined. In the initializer process, any of the states declared in the initializer may be returned. (output) code is a standard system status code. It will be error_table_$io_no_permission if the channel has hung up. (output) ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ttttttyyy_gggeeettt_nnnaaammmeee This entrypoint returns the name of a communications channel given the device_index. USAGE declare hcs_$tty_get_name entry (fixed bin, char(*), fixed bin, fixed bin(35)); call hcs_$tty_get_name (device_index, channel_name, state, code); ARGUMENTS device_index is the device index identifying the channel to the system. The device index is obtained via a call to hcs_$tty_index or hcs_$tty_attach. (input) channel_name is the name of the communications channel. (output) state is the state of the communications channel. The possible values returned are declared in the include file tty_states.incl.pl1. The only value that can be returned to _________________ ______________ hcs_$tty_get_name hcs_$tty_index _________________ ______________ processes other than the initializer is TTY_STATE_DIALED_UP. If the channel is in any other state, the status code will be error_table_$io_no_permission and the state will be undefined. In the initializer process, any of the states declared in the initializer may be returned. (output) code is a standard system status code. It will be error_table_$io_no_permission if the channel has hung up. (output) ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ttttttyyy_iiinnndddeeexxx This entrypoint attaches a communications channel to the calling process. If the channel is already attached, it returns the device index. USAGE declare hcs_$tty_index entry (char(*), fixed bin, fixed bin, fixed bin(35)); call hcs_$tty_index (channel_name, device_index, state, code); ARGUMENTS channel_name is the name of the channel to be attached. (input) device_index is the device index identifying the channel to the system. (output) state is the state of the communications channel. The possible values returned are declared in the include file tty_states.incl.pl1. The only value that can be returned to processes other than the initializer is TTY_STATE_DIALED_UP. If the channel is in any other state, the status code will be error_table_$io_no_permission and the state will be undefined. In the initializer process, any of the states declared in the initializer may be returned. (output) ______________ ______________ hcs_$tty_index hcs_$tty_order ______________ ______________ code is a standard system status code. It will be error_table_$io_no_permission if the channel has hung up. (output) ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ttttttyyy_ooorrrdddeeerrr This entrypoint performs a control order on a communications channel. The specific order is selected by character string name. USAGE declare hcs_$tty_order entry (fixed bin, char(*), ptr, fixed bin, fixed bin(35)); call hcs_$tty_order (device_index, order_name, order_info_ptr, state, code); ARGUMENTS device_index is the device index identifying the channel to the system. The device index is obtained via a call to hcs_$tty_index or hcs_$tty_attach. (input) order_name is the name of the control order to be performed. There are many different control orders, some of which are only permitted to the initializer process. (see the doc now in the tty_ doc). (input) order_info_ptr is a pointer to the info structure associated with the control order, if any. (input) state is the state of the communications channel. The possible values returned are declared in the include file tty_states.incl.pl1. The only value that can be returned to processes other than the initializer is TTY_STATE_DIALED_UP. If the channel is in any other state, the status code will be error_table_$io_no_permission and the state will be undefined. In the initializer process, any of the states declared in the initializer may be returned. (output) ______________ ______________ hcs_$tty_order hcs_$tty_order ______________ ______________ code is a standard system status code. It will be error_table_$io_no_permission if the channel has hung up. (output) CONTROL OPERATION The following orders are supported when the I/O switch is open. Except as noted, the info_ptr should be null. The orders are divided into categories. Local orders perform a specific function one time only, global orders change the way the system interfaces with the terminal, and other orders fit in neither category. Control orders are performed through the iox_$control entry. LIST OF LOCAL ORDERS interrupt sends an out-of-band interrupt signal (quit signal) to the terminal. listen sends a wakeup to the process once the line associated with this device identifier is dialed up. printer_off causes the printer mechanism of the terminal to be temporarily disabled if it is physically possible for the terminal to do so; if it is not, the status code error_table_$action_not_performed is returned (see "Notes" below). printer_on causes the printer mechanism of the terminal to be re-enabled (see "Notes" below). start_xmit_hd causes the channel to remain in a transmitting state at the completion of the next block of output, rather than starting to accept input. The line then remains in a transmitting state until the stop_xmit_hd control operation is issued. This operation is valid only for terminals with line type LINE_ARDS. stop_xmit_hd causes the channel to resume accepting input from the terminal (after the completion of current output, if any). This operation is only valid for ARDS-like terminals and is used only to counteract a preceding start_xmit_hd operation. ______________ ______________ hcs_$tty_order hcs_$tty_order ______________ ______________ wru initiates the transmission of the answerback of the device, if it is so equipped. This operation is allowed only for the process that originally attached the device (generally the initializer process). The answerback can subsequently be read by means of the get_chars input/output operation. LIST OF GLOBAL CONTROL ORDERS accept_printer_off causes subsequent printer_off and printer_on orders to be accepted if possible. get_delay is used to find out what delay values are currently in effect. The info_ptr points to the structure described for set_delay (below), which is filled in as a result of the call (except for the version number, which must be supplied by the caller). get_editing_chars is used to find out what input editing characters are in effect. The info_ptr points to the structure described below for set_editing_chars, which is filled in as a result of the call (except for the version number, which must be supplied by the caller). get_framing_chars causes the framing characters currently in use to be returned (see the set_framing_chars order below). If no framing characters have been supplied, NUL characters are returned. The info_ptr must point to a structure like the one described for the set_framing_chars order; this structure is filled in as a result of the call. get_ifc_info causes the characters currently in use for input flow control to be returned (see the input_flow_control_chars order below). The info_ptr must point to a structure like the one described for the input_flow_control_chars order, which is filled in as a result of the call. If no characters are currently set, the count fields are set to 0. get_input_translation get_output_translation get_input_conversion get_output_conversion these orders are used to obtain the current contents of the specified table. The info_ptr points to a structure like the one described for the corresponding "set" order below, which is filled in as a result of the call (except for the version ______________ ______________ hcs_$tty_order hcs_$tty_order ______________ ______________ number, which must be supplied by the caller). If the specified table does not exist (no translation or conversion is required), the status code error_table_$no_table is returned. get_ofc_info causes the characters and protocol currently in use for output flow control to be returned (see the output_flow_control_chars order below). The info_ptr must point to a structure like the one described for the output_flow_control_chars order, which is filled in as a result of the call. If no output flow control protocol is currently in use, the count fields are set to 0, and both suspend_resume and block_acknowledge are set to "0"b. get_special is used to obtain the contents of the special_chars table currently in use. The info_ptr points to the following structure (defined in tty_convert.incl.pl1): dcl 1 get_special_info_struc aligned, 2 area_ptr ptr, 2 table_ptr ptr; where: area_ptr points to an area in which a copy of the current special_chars table is returned. (Input) table_ptr is set to the address of the returned copy of the table. (Output) input_flow_control_chars specifies the character(s) to be used for input flow control for terminals with line speed input capability. The terminal must be in iflow mode for the feature to take effect. The info_ptr must point to the following structure (declared in flow_control_info.incl.pl1): dcl 1 input_flow_control_info aligned, 2 suspend_seq unaligned, 3 count fixed bin(9) unsigned, 3 chars char(3), 2 resume_seq unaligned, 3 count fixed bin(9) unsigned, 3 chars char(3), 2 timeout bit(1); ______________ ______________ hcs_$tty_order hcs_$tty_order ______________ ______________ where: suspend_seq is the character sequence that the system sends to tell the terminal to stop sending input, or that the terminal sends to inform the host that it is suspending input. count is an integer from 0 to 3 that specifies the number of characters in the sequence. chars are the characters themselves. At present, only sequences of length 0 or 1 are supported. resume_seq is the character sequence to be sent by the system to the terminal to tell it to resume transmission of input. count is an integer from 0 to 3 that specifies the number of characters in the sequence. chars are the characters themselves. timeout is "1"b if the resume character is to be sent to the terminal after input has ceased for one second, whether or not a suspend character has been received. output_flow_control_chars enables either of two output flow control protocols and specifies the characters to be used for output flow control. The terminal must be in oflow mode for the feature to take effect. The info_ptr must point to the following structure (declared in flow_control_info.incl.pl1): dcl 1 output_flow_control_info aligned, 2 flags unaligned, 3 suspend_resume bit(1), 3 block_acknowledge bit(1), 3 mbz bit(16), 2 buffer_size fixed bin(18) unsigned unaligned, 2 suspend_or_etb_seq unaligned, 3 count fixed bin(9) unsigned, 3 chars char(3), 2 resume_or_ack_seq unaligned, 3 count fixed bin(9) unsigned, 3 chars char(3); where: suspend_resume is "1"b to specify a suspend/resume protocol. block_acknowledge is "1"b to specify a block acknowledgement protocol. ______________ ______________ hcs_$tty_order hcs_$tty_order ______________ ______________ buffer_size is the number of characters in the terminal's buffer if block_acknowledge is "1"b; otherwise, it is ignored. suspend_or_etb_seq is the character sequence sent by the terminal to tell the system to suspend output if suspend_resume is "1"b, or the end_of_block character sequence if block_acknowledge is "1"b. count is an integer from 0 to 3 that specifies the number of characters in the sequence. chars are the characters themselves. resume_or_ack_seq is the character sequence sent by the terminal to indicate that output can be resumed if suspend_resume is "1"b, or the character sequence sent by the terminal to acknowledge completion of a block if block_acknowledge is "1"b. count is an integer from 0 to 3 that specifies the number of characters in the sequence. chars are the characters themselves. refuse_printer_off causes subsequent printer_off and printer_on orders to be rejected, except when in echoplex mode. set_delay sets the number of delay characters associated with the output of carriage-motion characters. The info_ptr points to the following structure (defined in tty_convert.incl.pl1): dcl 1 delay_struc based aligned, 2 version fixed bin, 2 default fixed bin, 2 delay, 3 vert_nl fixed bin, 3 horz_nl float bin, 3 const_tab fixed bin, 3 var_tab float bin, 3 backspace fixed bin, 3 vt_ff fixed bin; where: version is the version number of the structure. It must be 1. default indicates, if nonzero, that the default values for the current terminal type and baud rate are to be used and that the remainder of the structure is to be ignored. ______________ ______________ hcs_$tty_order hcs_$tty_order ______________ ______________ vert_nl is the number of delay characters to be output for all newlines to allow for the linefeed (-127 <= vert_nl <= 127). If it is negative, its absolute value is the minimum number of characters that must be transmitted between two linefeeds (for a device such as a TermiNet 1200). horz_nl is a number to be multiplied by the column position to obtain the number of delays to be added for the carriage return portion of a newline (0 <= horz_nl <= 1). The formula for calculating the number of delay characters to be output following a newline is: ndelays = vert_nl + fixed (horz_nl*column) const_tab is the constant portion of the number of delays associated with any horizontal tab character (0 <= const_tab <= 127). var_tab is the number of additional delays associated with a horizontal tab for each column traversed (0 <= var_tab <= 1). The formula for calculating the number of delays to be output following a horizontal tab is: ndelays = const_tab + fixed (var_tab*n_columns) backspace is the number of delays to be output following a backspace character (-127 <= backspace <= 127). If it is negative, its absolute value is the number of delays to be output with the first backspace of a series only (or a single backspace). This is for terminals such as the TermiNet 300 that need delays to allow for hammer recovery in case of overstrikes, but do not require delays for the carriage motion associated with the backspace itself. vt_ff is the number of delays to be output following a vertical tab or formfeed (0 <=vt_ff <= 511). set_editing_chars changes the characters used for editing input. The info_ptr points to the following structure (declared in tty_editing_chars.incl.pl1): ______________ ______________ hcs_$tty_order hcs_$tty_order ______________ ______________ dcl 1 editing_chars aligned, 2 version fixed bin, 2 erase char(1) unaligned, 2 kill char(1) unaligned; where: version is the version number of this structure. It must be 2. erase is the erase character. kill is the kill character. The following rules apply to editing characters: 1. The two editing characters cannot be the same. 2. No carriage-movement character (carriage return, newline, horizontal tab, backspace, vertical tab, or formfeed) can be used for either of the editing functions. 3. NUL and space cannot be used for either editing function. 4. If the editing character is an ASCII control character, it will not have the desired effect unless ctl_char mode is on (see "Modes Operation" below). set_framing_chars specifies the pair of characters that the terminal generates surrounding input transmitted as a block or "frame." These characters must be specified in the character code used by the terminal. This order must be used for blk_xfer mode (see below) to be effective. The info_ptr must point to a structure with the following format: dcl 1 framing_chars aligned, 2 frame_begin char(1) unaligned, 2 frame_end char(1) unaligned; set_input_conversion provides a table to be used in converting input to identify escape sequences and certain special characters. The info_ptr points to a structure of the following form (defined in tty_convert.incl.pl1): ______________ ______________ hcs_$tty_order hcs_$tty_order ______________ ______________ dcl 1 cv_trans_struc aligned, 2 version fixed bin, 2 default fixed bin, 2 cv_trans aligned, 3 value (0 : 255) fixed bin(8) unaligned; where: version is the version number of the structure. It must be 1. default indicates, if nonzero, that the default table for the current terminal type is to be used, and the remainder of the structure is ignored. values are the elements of the table. This table is indexed by the value of a typed input character, and the corresponding entry contains the ASCII character resulting from the translation. If the info_ptr is null, no translation is to be done. NOTE: In the case of a terminal that inputs 6-bit characters and case-shift characters, the first 64 characters of the table correspond to characters in lower shift, and the next 64 correspond to characters in upper shift. The table is indexed by the ASCII value of each input character (after translation, if any), and the corresponding entry contains one of the following values (mnemonic names for these values are defined in tty_convert.incl.pl1): 0 ordinary character 1 break character 2 escape character 3 character to be thrown away 4 formfeed character (to be thrown away if page length is nonzero) 5 this character and immediately following character to be thrown away set_input_translation provides a table to be used for translation of terminal input to ASCII. The info_ptr points to a structure of the following form (declared in tty_convert.incl.pl1): ______________ ______________ hcs_$tty_order hcs_$tty_order ______________ ______________ dcl 1 cv_trans_struc aligned, 2 version fixed bin, 2 default fixed bin, 2 cv_trans aligned, 3 value (0 : 255) char(1) unaligned; where version, default, and value are as described in the cv_trans_struc structure used with the set_input_conversion order above. set_line_type sets the line type associated with the terminal to the value supplied. The info_ptr should point to a fixed binary variable containing the new line type. Line types can be any of the following named constants defined in the include file line_types.incl.pl1: LINE_ASCII device similar to 7-bit ASCII using Bell 103-type modem protocol. LINE_1050 device similar to IBM Model 1050. LINE_2741 device similar to IBM Model 2741, with or without auto EOT inhibit. LINE_ARDS device similar to Adage, Inc. Advanced Remote Display Station (ARDS) protocol using Bell 202C6-type modem. LINE_SYNC synchronous connections, no protocol. LINE_G115 ASCII synchronous connection, Model G-115 remote computer protocol. LINE_BSC binary synchronous protocol. LINE_ETX device similar to TermiNet 1200 protocol using Bell 202C5-type modem. LINE_VIP device similar to Honeywell Model 7700 Visual Information Projection (VIP) stand-alone terminal. ______________ ______________ hcs_$tty_order hcs_$tty_order ______________ ______________ LINE_ASYNC1 LINE_ASYNC2 LINE_ASYNC3 site-supplied asynchronous protocols. LINE_SYNC1 LINE_SYNC2 LINE_SYNC3 site-supplied synchronous protocols. LINE_POLLED_VIP device similar to Honeywell Model 7700 Visual Projection System (VIP) polled terminal concentrator subsystem. LINE_X25LAP X.25 network connection using the link access protocol (LAP). LINE_COLTS special software channel used for Communications Online Test and Diagnostics System. This operation is not permitted while the terminal is in use. set_output_conversion provides a table to be used in formatting output to identify certain kinds of special characters. The info_ptr points to a structure like that described for set_input_conversion (above). The table is indexed by each ASCII output character (before translation, if any), and the corresponding entry contains one of the following values (mnemonic names for these values are defined in tty_convert.incl.pl1): 0 ordinary character. 1 newline. 2 carriage return. 3 horizontal tab. 4 backspace. 5 vertical tab. 6 formfeed. 7 character requiring octal escape. 8 red ribbon shift. 9 black ribbon shift. 10 character does not change the column position. 11 this character together with the following one do not change the column position (used for hardware escape sequences). 12 character is not to be sent to the terminal. 17 or greater a character requiring a special escape sequence. ______________ ______________ hcs_$tty_order hcs_$tty_order ______________ ______________ The indicator value is the index into the escape table of the sequence to be used, plus 16. The escape table is part of the special characters table; see the set_special order below. set_output_translation provides a table to be used for translating ASCII characters to the code to be sent to the terminal. The info_ptr points to a structure like that described for set_input_translation. The table is indexed by the value of each ASCII character, and the corresponding entry contains the character to be output. If the info_ptr is null, no translation is to be done. NOTE: For a terminal that expects 6-bit characters and case-shift characters, the 400(8) bit must be turned on in each entry in the table for a character that requires upper shift, and the 200(8) bit must be on in each entry for a character that requires lower shift. set_special provides a table that specifies sequences to be substituted for certain output characters, and characters that are to be interpreted as parts of escape sequences on input. Output sequences are of the following form (defined in tty_convert.incl.pl1): dcl 1 c_chars based aligned, 2 count fixed bin(8) unaligned, 2 chars(3) char(1) unaligned; where: count is the actual length of the sequence in characters (0 <= count <= 3). If count is zero, there is no sequence. chars are the characters that make up the sequence. The info_ptr points to a structure of the following form (defined in tty_convert_incl.pl1): ______________ ______________ hcs_$tty_order hcs_$tty_order ______________ ______________ dcl 1 special_chars_struc aligned based, 2 version fixed bin, 2 default fixed bin, 2 special_chars 3 nl_seq aligned like c_chars, 3 cr_seq aligned like c_chars, 3 bs_seq aligned like c_chars, 3 tab_seq aligned like c_chars, 3 vt_seq aligned like c_chars, 3 ff_seq aligned like c_chars, 3 printer_on aligned like c_chars, 3 printer_off aligned like c_chars, 3 red_ribbon_shift aligned like c_chars, 3 black_ribbon_shift aligned like c_chars, 3 end_of_page aligned like c_chars, 3 escape_length fixed bin, 3 not_edited_escapes (sc_escape_len refer (special_chars.escape_length)) like c_chars, 3 edited_escapes (sc_escape_len refer (special_chars.escape_length)) like c_chars, 3 input_escapes aligned, 4 len fixed bin(8) unaligned, 4 str char (sc_input_escape_len refer (special_chars.input_escapes.len)) unaligned, 3 input_results aligned, 4 pad bit(9) unaligned, 4 str char (sc_input_escape_len refer (special_chars.input_escapes.len)) unaligned; where: version is the version number of this structure. It must be 1. default indicates, if nonzero, that the default values for the current terminal type and baud rate are to be used and that the remainder of the structure is to be ignored. nl_seq is the output character sequence to be substituted for a newline character. The nl_seq.count generally should be nonzero. ______________ ______________ hcs_$tty_order hcs_$tty_order ______________ ______________ cr_seq is the output character sequence to be substituted for a carriage-return character. If count is zero, the appropriate number of backspaces is substituted. However, either cr_seq.count or bs_seq.count should be nonzero (i.e., both should not be zero). bs_seq is the output character sequence to be substituted for a backspace character. If count is zero, a carriage return and the appropriate number of spaces are substituted. However, either bs_seq.count or cr_seq.count, should be nonzero (i.e., both should not be zero). tab_seq is the output character sequence to be substituted for a horizontal tab. If count is zero, the appropriate number of spaces is substituted. vt_seq is the output character sequence to be substituted for a vertical tab. If count is zero, no characters are substituted. ff_seq is the output character sequence to be substituted for a formfeed. If count is zero, no characters are substituted. printer_on is the character sequence to be used to implement the printer_on control operation. If count is zero, the function is not performed. printer_off is the character sequence to be used to implement the printer_off control operation. If count is zero, the function is not performed. red_ribbon_shift is the character sequence to be substituted for a red-ribbon-shift character. If count is zero, no characters are substituted. black_ribbon_shift is the character sequence to be substituted for a black-ribbon-shift character. If count is zero, no characters are substituted. ______________ ______________ hcs_$tty_order hcs_$tty_order ______________ ______________ end_of_page is the character sequence to be printed to indicate that a page of output is full. If count is zero, no additional characters are printed, and the cursor is left at the end of the last line. escape_length is the number of output escape sequences in each of the two escape arrays. not_edited_escapes is an array of escape sequences to be substituted for particular characters if the terminal is in "^edited" mode. This array is indexed according to the indicator found in the corresponding output conversion table (see the description of the set_output_conversion order above). edited_escapes is an array of escape sequences to be used in edited mode. It is indexed in the same fashion as not_edited_escapes. input_escapes is a string of characters each of which forms an escape sequence when preceded by an escape character. input_results is a string of characters each of which is to replace the escape sequence consisting of an escape character and the character occupying the corresponding position in input_escapes. set_wakeup_table specifies a wakeup table, i.e., a set of wakeup characters that controls the dispatching of input wakeups. The wakeup table operates in conjunction with wake_tbl mode. The wakeup table has no effect until wake_tbl mode is enabled. Once enabled, the standard method of generating input wakeups (normally one wakeup for each line) is suspended. Thereafter, wakeups are only generated when wakeup characters are received or when the buffer gets too full. The wakeup table cannot be changed while wake_tbl mode is enabled. The info_ptr should point to the following structure (declared in set_wakeup_table_info.incl.pl1): ______________ ______________ hcs_$tty_order hcs_$tty_order ______________ ______________ dcl swt_infop ptr; dcl swt_info_version_1 fixed bin static options (constant) init (1); dcl 1 swt_info aligned based (swt_infop), 2 version fixed bin, 2 new_table like wakeup_table, 2 old_table like wakeup_table; dcl wakeup_tablep ptr; dcl 1 wakeup_table aligned based (wakeup_tablep), 2 wake_map (0:127) bit (1) unal, 2 mbz bit (16) unal; where: version is the version number of this structure. (Input). It must be 1. new_table is the wakeup table to set. (Input) old_table is set to the value of the current wakeup table that is being replaced. (Output). If no current wakeup table exists, all entries are set to "0"b. wake_map is an array having one entry for each character in the ASCII character set. (Input). A value of "1"b defines a wakeup character. All other entries must be "0"b. If all entries are "0"b, the current wakeup table, if any, is deleted. mbz must be "0"b. (Input) The primary application for the wakeup table mechanism is to reduce overhead incurred by text editors, such as qedx, while in input mode. While in input mode, a user process must wake up for each line of input even though no processing is immediately required. In wake_tbl mode, a process is only awakened when input mode is exited or a large amount of input has been accumulated. However, since wake_tbl mode causes more input to be buffered in ring 0 than before, a quit signal is likely to discard more input than before. If a user does not wish to lose input, he simply should avoid quitting while in input mode. ______________ ______________ hcs_$tty_order hcs_$tty_order ______________ ______________ If a user does quit out of input mode, he does not remain in wake_tbl mode (under normal circumstances). The default modes established by the standard quit handler include ^wake_tbl. A start command restores wake_tbl mode. LIST OF MISCELLANEOUS CONTROL ORDERS copy_meters causes the current cumulative meters associated with the channel to be copied to unwired storage, so that the statistics for the channel can be determined both for the life of the system and for the current dialup. This order can only be issued by the "owning" process (normally the initializer). The info_ptr should be null. quit_disable causes quit signal processing to be disabled for this device. quit_enable causes quit signal processing to be enabled for this device. (Quit signal processing is initially disabled.) read_status tells whether or not there is any type-ahead input waiting for a process to read. The info_ptr should point to the following structure (defined in tty_read_status_info.incl.pl1), which is filled in by the call: dcl 1 tty_read_status_info aligned based, 2 event_channel fixed bin (71), 2 input_available bit (1); where: event_channel is the event channel used to signal the arrival of input. input_available indicates whether input is available. "0"b no input "1"b input start causes a wakeup to be signalled on the event channel associated with this device. This request is used to restart processing on a device whose wakeups may have been lost or discarded. ______________ ______________ hcs_$tty_order hcs_$tty_order ______________ ______________ store_id stores the answerback identifier of the terminal for later use by the process. The info_ptr should point to a char(4) variable that contains the new identifier. terminal_info returns information about the terminal. The info_ptr should point to the following structure (declared in terminal_info.incl.pl1): dcl 1 terminal_info aligned, 2 version fixed bin, 2 id char(4) unaligned, 2 term_type char(32) unaligned, 2 line_type fixed bin, 2 baud_rate fixed bin, 2 reserved (4) fixed bin; where: version is the version number of the above structure. (Input). It must be 1. id is the terminal identifier derived from the answerback. (Output) term_type is the terminal type name. (Output) line_type is the line type number. (Output) baud_rate is the baud rate at which the terminal is running. (Output) reserved is reserved for future use. write_status tells whether or not there is any write-behind output that has not been sent to the terminal. The info_ptr should point to the following structure, which is filled in by the call: dcl 1 info_structure aligned, 2 ev_chan fixed bin(71), 2 output_pending bit(1); ______________ _____________ hcs_$tty_order hcs_$tty_read ______________ _____________ where: ev_chan is the event channel used to signal the completion of output. output_pending indicates whether output is pending. "0"b no output "1"b output ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ttttttyyy_rrreeeaaaddd This entrypoint reads characters from a communications channel. USAGE declare hcs_$tty_read entry (fixed bin, ptr, fixed bin(24), fixed bin(24), fixed bin(24), fixed bin, fixed bin(35)); call hcs_$tty_read (device_index, buffer_word_ptr, buffer_char_offset, buffer_length, n_trans, state, code); ARGUMENTS device_index is the device index identifying the channel to the system. The device index is obtained via a call to hcs_$tty_index or hcs_$tty_attach. (input) buffer_word_ptr is a pointer to to beginning of the word containing the first character of the data buffer. If the buffer is not on an even work boundary, the buffer_word_offset is used to specify the character position within the word. (input) buffer_char_offset is the character index (0, 1, 2, or 3) of the first character of the buffer within the first word of the buffer. (input) buffer_length is the length of the data buffer in characters. (input) n_trans is the number of characters transferred by this call. (output) _____________ ____________________ hcs_$tty_read hcs_$tty_read_echoed _____________ ____________________ state is the state of the communications channel. The possible values returned are declared in the include file tty_states.incl.pl1. The only value that can be returned to processes other than the initializer is TTY_STATE_DIALED_UP. If the channel is in any other state, the status code will be error_table_$io_no_permission and the state will be undefined. In the initializer process, any of the states declared in the initializer may be returned. (output) code is a standard system status code. It will be error_table_$io_no_permission if the channel has hung up. (output) ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ttttttyyy_rrreeeaaaddd_eeeccchhhoooeeeddd This entrypoint reads characters from a communications channel, echoing some or all of them under the control of a count and a break_table. USAGE declare hcs_$tty_read_echoed entry (fixed bin, ptr, fixed bin(24), fixed bin(24), fixed bin(24), fixed bin(24), fixed bin, fixed bin, fixed bin(35)); call hcs_$tty_read_echoed (device_index, buffer_word_ptr, buffer_char_offset, buffer_length, n_trans, n_echoed, max_to_read, state, code); ARGUMENTS device_index is the device index identifying the channel to the system. The device index is obtained via a call to hcs_$tty_index or hcs_$tty_attach. (input) buffer_word_ptr is a pointer to to beginning of the word containing the first character of the data buffer. If the buffer is not on an even work boundary, the buffer_word_offset is used to specify the character position within the word. (input) buffer_char_offset is the character index (0, 1, 2, or 3) of the first character of the buffer within the first word of the buffer. (input) ____________________ _______________________ hcs_$tty_read_echoed hcs_$tty_read_with_mark ____________________ _______________________ buffer_length is the length of the data buffer in characters. (input) n_trans is the number of characters transferred by this call. (output) n_echoed is the number of the returned characters that were echoed. (output) max_to_read is the maximum number of characters to echo. This is normally set to the number of character positions available on the line of the video screen. (input) state is the state of the communications channel. The possible values returned are declared in the include file tty_states.incl.pl1. The only value that can be returned to processes other than the initializer is TTY_STATE_DIALED_UP. If the channel is in any other state, the status code will be error_table_$io_no_permission and the state will be undefined. In the initializer process, any of the states declared in the initializer may be returned. (output) code is a standard system status code. It will be error_table_$io_no_permission if the channel has hung up. (output) ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ttttttyyy_rrreeeaaaddd_wwwiiittthhh_mmmaaarrrkkk This entrypoint reads characters a communications channel, returning the position of the input/output synchronization mark. USAGE declare hcs_$tty_read_with_mark entry (fixed bin, char(*), fixed bin(24), fixed bin(21), fixed bin, fixed bin(35)); call hcs_$tty_read_with_mark (device_index, read_buffer, n_trans, mark_index, state, code); _______________________ _______________________ hcs_$tty_read_with_mark hcs_$tty_read_with_mark _______________________ _______________________ ARGUMENTS device_index is the device index identifying the channel to the system. The device index is obtained via a call to hcs_$tty_index or hcs_$tty_attach. (input) read_buffer is a buffer into which the data will be read. (output) n_trans is the number of characters transferred by this call. (output) mark_index is the position of the last character read in this buffer before the input/output synchronization mark was seen. This mark is seen when the last character specified before a mark with the tty_write_with_mark or tty_write_whole_string is transmitted. After that character is transmitted, the mark is entered into the logical stream of input to indicate that input following the mark was received after the marked output was transmitted. This is zero if the mark has not yet been returned. (output) state is the state of the communications channel. The possible values returned are declared in the include file tty_states.incl.pl1. The only value that can be returned to processes other than the initializer is TTY_STATE_DIALED_UP. If the channel is in any other state, the status code will be error_table_$io_no_permission and the state will be undefined. In the initializer process, any of the states declared in the initializer may be returned. (output) code is a standard system status code. It will be error_table_$io_no_permission if the channel has hung up. (output) ______________ ______________ hcs_$tty_state hcs_$tty_write ______________ ______________ NNNaaammmeee::: hhhcccsss_$$$ttttttyyy_ssstttaaattteee This entrypoint returns the state of a communications channel attached to the calling process. USAGE declare hcs_$tty_state entry (fixed bin, fixed bin, fixed bin(35)); call hcs_$tty_state (device_index, state, code); ARGUMENTS device_index is the device index identifying the channel to the system. The device index is obtained via a call to hcs_$tty_index or hcs_$tty_attach. (input) state is the state of the communications channel. The possible values returned are declared in the include file tty_states.incl.pl1. The only value that can be returned to processes other than the initializer is TTY_STATE_DIALED_UP. If the channel is in any other state, the status code will be error_table_$io_no_permission and the state will be undefined. In the initializer process, any of the states declared in the initializer may be returned. (output) code is a standard system status code. It will be error_table_$io_no_permission if the channel has hung up. (output) ________________________________________ NNNaaammmeee::: hhhcccsss_$$$ttttttyyy_wwwrrriiittteee This entrypoint writes characters to a communications channel. USAGE declare hcs_$tty_write entry (fixed bin, ptr, fixed bin(21), fixed bin(21), fixed bin(21), fixed bin, fixed bin(35)); call hcs_$tty_write (device_index, buffer_word_ptr, buffer_char_offset, buffer_length, n_trans, state, code); ______________ ______________ hcs_$tty_write hcs_$tty_write ______________ ______________ device_index is the device index identifying the channel to the system. The device index is obtained via a call to hcs_$tty_index or hcs_$tty_attach. (input) buffer_word_ptr is a pointer to to beginning of the word containing the first character of the data buffer. If the buffer is not on an even work boundary, the buffer_word_offset is used to specify the character position within the word. (input) buffer_char_offset is the character index (0, 1, 2, or 3) of the first character of the buffer within the first word of the buffer. (input) buffer_length is the length of the data buffer in characters. (input) n_trans is the number of characters transferred by this call. (output) state is the state of the communications channel. The possible values returned are declared in the include file tty_states.incl.pl1. The only value that can be returned to processes other than the initializer is TTY_STATE_DIALED_UP. If the channel is in any other state, the status code will be error_table_$io_no_permission and the state will be undefined. In the initializer process, any of the states declared in the initializer may be returned. (output) code is a standard system status code. It will be error_table_$io_no_permission if the channel has hung up. (output) _______________________ _______________________ hcs_$tty_write_set_mark hcs_$tty_write_set_mark _______________________ _______________________ NNNaaammmeee::: hhhcccsss_$$$ttttttyyy_wwwrrriiittteee_ssseeettt_mmmaaarrrkkk This entrypoint writes characters to a communications channel. Input/output synchronization is requested after the last character written. After that character is transmitted, a mark will be inserted in the input stream that may be retrieved with hcs_$tty_read_with_mark. USAGE declare hcs_$tty_write_set_mark entry (fixed bin, char(*), fixed bin(21), fixed bin, fixed bin(35)); call hcs_$tty_write_set_mark (device_index, data_to_write, n_trans, state, code); ARGUMENTS device_index is the device index identifying the channel to the system. The device index is obtained via a call to hcs_$tty_index or hcs_$tty_attach. (input) data_to_write is a string of characters to be written to the channel. (input) n_trans is the number of characters transferred by this call. (output) state is the state of the communications channel. The possible values returned are declared in the include file tty_states.incl.pl1. The only value that can be returned to processes other than the initializer is TTY_STATE_DIALED_UP. If the channel is in any other state, the status code will be error_table_$io_no_permission and the state will be undefined. In the initializer process, any of the states declared in the initializer may be returned. (output) code is a standard system status code. It will be error_table_$io_no_permission if the channel has hung up. (output) ___________________________ ___________________________ hcs_$tty_write_whole_string hcs_$tty_write_whole_string ___________________________ ___________________________ NNNaaammmeee::: hhhcccsss_$$$ttttttyyy_wwwrrriiittteee_wwwhhhooollleee_ssstttrrriiinnnggg This entrypoint writes a string of characters to a communications channel. If there is insufficient buffer space to accept the entire string, then none of it is written. USAGE declare hcs_$tty_write_whole_string entry (fixed bin, char(*), bit(1), fixed bin(21), fixed bin, fixed bin(35)); call hcs_$tty_write_whole_string (device_index, chars_to_write, mark_flag, n_trans, state, code); ARGUMENTS device_index is the device index identifying the channel to the system. The device index is obtained via a call to hcs_$tty_index or hcs_$tty_attach. (input) chars_to_write is the string of characters to be transmitted to the channel. mark_flag is a flag. if "1"b, the synchronization mark is inserted into the output string after this string of characters. (input) n_trans is the number of characters transferred by this call. (output) state is the state of the communications channel. The possible values returned are declared in the include file tty_states.incl.pl1. The only value that can be returned to processes other than the initializer is TTY_STATE_DIALED_UP. If the channel is in any other state, the status code will be error_table_$io_no_permission and the state will be undefined. In the initializer process, any of the states declared in the initializer may be returned. (output) code is a standard system status code. It will be error_table_$io_no_permission if the channel has hung up. (output) ___________________________ _______________ hcs_$tty_write_whole_string hcs_$unmask_ips ___________________________ _______________ NNNaaammmeee::: hhhcccsss_$$$uuunnnmmmaaassskkk_iiipppsss This entry point masks off, or disables, the specified ips interrupts. Note the nonstandard use of the word "unmask" to mean the disabling of an interrupt, rather than the enabling of it; this is done for historical reasons. This entry point can be used at the beginning of a critical section of code, to disable one or more ips interrupts, and turn on the control bit as an indication that some interrupts are disabled. See "Notes" in the description of the hcs_$mask_ips entry point for a discussion of the control bit. USAGE declare hcs_$unmask_ips entry (bit(36) aligned, bit(36) aligned); call hcs_$unmask_ips (mask, old_mask) ARGUMENTS mask is a word containing a "1"b for each ips interrupt that is to be disabled. (Input) See "Notes". old_mask is the former value of the ips mask, with a control bit of "1"b. (Output) NOTES The create_ips_mask_ subroutine can be used to create a mask, given a set of ips names. This entry point can be used at the end of a critical section of code, to undo the mask changes made by this entry point. ACCESS REQUIRED None. _________________ ______________________ hcs_$usage_values hpriv_connection_list_ _________________ ______________________ NNNaaammmeee::: hhhcccsss_$$$uuusssaaagggeee_vvvaaallluuueeesss Returns the total number of page faults for this process as well as the total cpu time this process has been charged with. USAGE declare hcs_$usage_values entry (fixed bin (71), fixed bin (71)); call hcs_$usage_values (page_faults, virtual_cpu_time); ARGUMENTS page_faults the number of page faults taken by this process. (Output) virtual_cpu_time the virtual cpu time charged to this process. (Output) ACCESS REQUIRED There are no access requirements for this gate entry. ________________________________________ NNNaaammmeee::: hhhppprrriiivvv_cccooonnnnnneeeccctttiiiooonnn_llliiisssttt_ This gate contains highly privileged entries to connection_list_manager_. They can be used only by highly privileged processes (such as the Initializer), to manipulate any connection entry. The entries contained in hpriv_connection_list_ are listed below, along with their target entries in connection_list_manager_. Gate entry Target delete_name hpriv_delete_name delete_offset hpriv_delete_offset delete_all_for_user hpriv_delete_all_for_user get_name hpriv_get_name get_next hpriv_get_next get_next_owner hpriv_get_next_owner get_next_user hpriv_get_next_user init init ______________________ __________________ hpriv_connection_list_ installation_gate_ ______________________ __________________ NNNaaammmeee::: iiinnnssstttaaallllllaaatttiiiooonnn_gggaaattteee_ EEEnnntttrrryyy::: iiinnnssstttaaallllllaaatttiiiooonnn_gggaaattteee_$$$iiinnnssstttaaallllll_ttttttttt This entrypoint installs a new version of the system terminal type table (TTT). USAGE declare installation_gate_$install_ttt entry (ptr, fixed bin (18) uns, char(*), fixed bin(35)); call installation_gate_$install_ttt (ttt_ptr, word_count, complaint, code); ARGUMENTS ttt_ptr is a pointer to the binary TTT data. (Input) word_count is the number of words in the TTT to be installed. (Input) complaint is a string providing a more detailed description of a failure. (Output) code is a standard system status code. (Output) ACCESS REQUIRED RW to the system TTT (>sc1>ttt) is required. Normally, only system administrators and maintainers have this access. CODES RETURNED error_table_$smallarg - input TTT length is too small to be a valid TTT. error_table_$invalid_ascii - a field in the TTT expected to be printable ascii characters contained other character values error_table_$unimplemented_version - input TTT data has wrong version error_table_$improper_data_format - data in the TTT not in the proper format ____ ____ ioi_ ioi_ ____ ____ NNNaaammmeee::: iiioooiii_ EEEnnntttrrryyy::: iiioooiii_$$$cccooonnnnnneeecccttt The connect entry is called to start an I/O operation to a device. The IOI will construct a PCW in ring 0 which will be used to connect to the channel. This PCW will contain a reset status command, and the continue bit will be set. The caller's workspace will be wired-down in memory to prevent it from being paged out to disk while the I/O operation is in progress, and the channel will be connected to the DCW list which starts at a caller-supplied offset in the workspace. USAGE declare ioi_$connect (fixed bin, fixed bin (18), fixed bin (35)); call ioi_$connect (devx, offset, code); ARGUMENTS devx is the IOI specified device index. offset is the offset in the user's workspace at which the DCW list starts. An offset of 0 implies that the DCW list is at the very beginning of the workspace. code is a standard system status code. NOTES The termination of the I/O operation will be signalled on the event channel specified in the call to rcp_$attach or ioi_$set_event. xxxxx ____ ____ ioi_ ioi_ ____ ____ EEEnnntttrrryyy::: iiioooiii_$$$cccooonnnnnneeecccttt_pppcccwww This entry is identical to the connect entry except that the caller provides the first word of the PCW to be used when connecting the channel. This PCW is copied into ring 0 and validated before it is used. If an invalid field is found in the PCW, the connect does not take place. USAGE declare ioi_$connect_pcw entry (fixed bin, fixed bin(18), bit(36) aligned, fixed bin(35)); call ioi_$connect_pcw (devx, offset, pcw, code); ARGUMENTS devx is as given for ioi_$connect. offset is as given for ioi_$connect. pcw is the first word of the Peripheral Control Word (PCW) to be used to connect to the device. The format of a PCW is given in the include file iom_pcw.incl.pl1. code is as given for ioi_$connect. NOTES See the note under ioi_$connect. EEEnnntttrrryyy::: iiioooiii_$$$gggeeettt_dddeeetttaaaiiillleeeddd_ssstttaaatttuuusss This entry is used to return the detailed status available after an I/O error. The format of detailed status is different for each device, and its interpretation is up to the caller. If there is no detailed status available for this device, this fact is reflected to the caller. Detailed status is only saved after an I/O operation terminated in error. USAGE declare ioi_$get_detailed_status entry (fixed bin, bit(1) aligned, bit(216), fixed bin(35)); ____ ____ ioi_ ioi_ ____ ____ call ioi_$get_detailed_status (devx, valid_flag, detailed_status, code); ARGUMENTS devx is the IOI supplied device index. valid_flag is set to "1"b if there is detailed status available, is set to "0"b otherwise. detailed_status is the detailed status from the last I/O operation. code is a standard system status code. EEEnnntttrrryyy::: iiioooiii_$$$gggeeettt_ssspppeeeccciiiaaalll_ssstttaaatttuuusss This entry is called to check for the existence of special status for a device. Special status is set by the occurence of a special interrupt from a device (such as a disk drive coming on line, or a tape rewind completing). If the device in question is connected to a PSIA channel, the special status reported at special interrupt time is returned to the caller. USAGE declare ioi_$get_special_status entry (fixed bin, bit(1) aligned, bit(36) aligned, fixed bin(35)); call ioi_$get_special_status (devx, valid_flag, special_status, code); ARGUMENTS devx is the IOI supplied device index. valid_flag is set to "1"b if there is special status available, is set to "0"b otherwise. special_status is the special status from the last special interrupt. code is a standard system status code. ____ ____ ioi_ ioi_ ____ ____ EEEnnntttrrryyy::: iiioooiii_$$$rrreeellleeeaaassseee_dddeeevvviiiccceeesss This entry undoes the effects of a ioi_$suspend_devices call. Any devices which were suspended will again be available for I/O. USAGE declare ioi_$release_devices entry (fixed bin, fixed bin(35)); call ioi_$release_devices (devx, code); ARGUMENTS devx is the IOI supplied device index. code is a standard system status code. EEEnnntttrrryyy::: iiioooiii_$$$ssseeettt_ccchhhaaannnnnneeelll_rrreeeqqquuuiiirrreeeddd This privileged entry is called to set a required channel and IOM number for a device which could possibly otherwise be run by more than one channel. It is primarily intended for use by the Test and Diagnostic software. USAGE declare ioi_$set_channel_required entry (fixed bin, fixed bin(3), fixed bin(7), fixed bin(35)); call ioi_$set_channel_required (devx, iom, channel, code); ARGUMENTS devx is the IOI supplied device index. iom is the IOM number of the required channel. channel is the channel number of the required channel. code is a standard system status code. ____ ____ ioi_ ioi_ ____ ____ NOTES After calling this entry, any subsequent calls to ioi_$connect during this attachment will use the specified channel. This does not preclude this channels use by other attachments. To undo the effects of this call, another call using with both iom and channel set to zero may be used. To make a call to ioi_, this must be a privileged attachment. Access to rcp_priv_ is necessary to obtain a privileged attachment. EEEnnntttrrryyy::: iiioooiii_$$$ssseeettt_eeevvveeennnttt This entry is called to change the event channel over which status events are signalled for a device. This event channel is initially set by calling rcp_$attach, but may be changed. USAGE declare ioi_$set_event entry (fixed bin, fixed bin(71), fixed bin(35)); call ioi_$set_event (devx, event_channel, code); ARGUMENTS devx is the IOI supplied device index. event_channel is the new event channel to be used when signalling status events. code is a standard system status code. EEEnnntttrrryyy::: iiioooiii_$$$ssseeettt_ssstttaaatttuuusss The ioi_ entry is used to specify the address and length of a circular queue to be used for reporting status. This queue is allocated in the workspace segment. Each time status is to be reported, the next entry in the queue is used. If the previous status report used the last entry in the queue, the first entry in the queue is used for this status report. It is up to the user to keep track of where status is to be reported next. ____ ____ ioi_ ioi_ ____ ____ USAGE declare ioi_$set_status entry (fixed bin, fixed bin(18), fixed bin, fixed bin(35)); call ioi_$set_status (devx, offset, count, code); ARGUMENTS devx is the IOI supplied device index. offset is the word offset into the workspace segment at which the status queue is to begin. count is the number of elements in the status queue. Each element in the status queue is 8 words long. The format of each entry in this queue is defined in the include file ioi_stat.incl.pl1. code is a standard system status code. EEEnnntttrrryyy::: iiioooiii_$$$sssuuussspppeeennnddd_dddeeevvviiiccceeesss This entry is used to suspend all activity on a device controller except for that directed at a specified device. It is meant for use by the Test and Diagnostic software. USAGE declare ioi_$suspend_devices entry (fixed bin, fixed bin(35)); call ioi_$suspend_devices (devx, code); ARGUMENTS devx is the IOI supplied device index. All activity on the controller to which this device is connected will be delayed until an ioi_$release_devices call. Any activity currently in progress will be allowed to finish. If the specified device is connected to more than one controller, an ioi_$set_channel_required call must have been made to select one of them. ____ ____ ioi_ ioi_ ____ ____ code is a standard system status code. EEEnnntttrrryyy::: iiioooiii_$$$tttiiimmmeeeooouuuttt This entry establishes a time-out interval for a device. The clock is read each time the device is connected. If a terminate interrupt does not occur within the time-out interval, termination will be forced and the user notified. The ioi_ entry may be called as many times as desired for a device. If it is never called, a default value of 30 seconds will be used. USAGE declare ioi_$timeout entry (fixed bin, fixed bin(71), fixed bin(35)); call ioi_$timeout (devx, time, code); ARGUMENTS devx is the IOI supplied device index. time is the time (in microseconds) to be given to allow a device to terminate after a connect. If time is zero, no timeout value is set and an I/O operation may take as long as necessary. code is a standard system status code. EEEnnntttrrryyy::: iiioooiii_$$$wwwooorrrkkkssspppaaaccceee The ioi_ entry is called to provide a workspace for DCW lists and data buffers. If this is the first call to this entry, a segment of the specified size is created in the caller's process directory; otherwise the maximum length of the previously created segment is changed to reflect the new value. Since the entire workspace must be in memory while I/O is in progress to the device, performance problems could result if an excessively large workspace is requested. Users should ensure that the workspace size correctly reflects their need for DCW lists, buffers, and the status queue. This entry may not be called while I/O is in progress to the device. ____ ____ ioi_ ipc_ ____ ____ The management of this segment is completely up to the caller; the IOI makes no assumptions about its contents. Various ioi_ entries take offsets into this workspace as arguments. USAGE declare ioi_$workspace entry (fixed bin, ptr, fixed bin(19), fixed bin(35)); call ioi_$workspace (devx, workspace_ptr, workspace_length, code); ARGUMENTS devx is the IOI supplied device index. workspace_ptr is a pointer to the workspace segment to be used to contain DCW lists and data. workspace_length is the desired length of the wordspace segment in words. code is a standard system status code. ________________________________________ NNNaaammmeee::: iiipppccc_ Most ipc_ entrypoints are described in Multics Subroutines. The following are internal entrypoints used by cpm_. EEEnnntttrrryyy::: iiipppccc_$$$rrreeeaaassssssiiigggnnn_cccaaallllll_ccchhhaaannnnnneeelllsss This entrypoint reassigns call channels from one control point to another one whenever a control point is destroyed. USAGE dcl ipc_$reassign_call_channels entry (bit (36) aligned, bit (36) aligned); call ipc_$reassign_call_channels (old_control_point_id, new_control_point_id); ____ ____ ipc_ ipc_ ____ ____ old_control_point_id Input is the unique ID of the control point to be destroyed. new_control_point_id is the unique ID of the control point to be assigned the event call channel. EEEnnntttrrryyy::: iiipppccc_$$$wwwaaaiiittt_fffooorrr_aaannn_eeevvveeennnttt Wait for an ipc_ event when there are no control points in the ready states. USAGE dcl ipc_$wait_for_an_event entry (); call ipc_$wait_for_an_event (); NOTES The arrival of an event will cause the control point waiting for that event to be put into the ready state. Changes to Existing Structures Changes to ect_structures.incl.pl1 dcl 1 waiting_control_point aligned based (wcpp), 2 word_0, 3 block_count fixed bin (17) unal, 3 type fixed bin (17) unal, 2 control_point_id bit (36) aligned, 2 chain, 3 next_wcpp pointer, 3 prev_wcpp pointer, ARGUMENTS block_count is the number of ipc_$block calls made by the control point type is the type of waiting control point (currently not used). ____ ____ ipc_ ipc_ ____ ____ control_point_id is the id of the waiting control point next_wcpp is a pointer to the next waiting control point. prev_wcpp is a pointer to the previous waiting control point. o The structure wait_channel has the following added: dcl 1 wait_channel aligned based (ectep), 2 word_0, 3 unused1 fixed bin (17) unal, 3 type fixed bin (17) unal, 2 next_chanp ptr unal, 2 prev_chanp ptr unal, 2 word_3, 3 fast_channel bit (1) unal, 3 inhibit_count fixed bin (16) unal," 3 wakeup_control_points bit (1) unal, 3 wakeup_count fixed bin (17) unal unsigned, 2 name bit (72), 2 first_ev_msgp ptr unal, 2 last_ev_msgp ptr unal, 2 first_wcpp ptr unal, 2 last_wcpp ptr unal, 2 fast_channel_id fixed binary, 2 unused2 fixed bin; wakeup_control_points indicates the control point waiting on this channel should be awakened. first_wcpp is the pointer to the first control point waiting on this channel. See the description of the waiting_control_point structure above. last_wcpp is the pointer to the last control point waiting on this channel. See the description of the waiting_control_point structure above. ____ ____ ipc_ ipc_ ____ ____ o The structure call_channel has the following added: dcl 1 call_channel aligned based (ectep), 2 word_0, 3 priority fixed bin (17) unal, 3 type fixed bin (17) unal, 2 next_chanp ptr unal, 2 prev_chanp ptr unal, 2 word_3, 3 call_inhibit bit (1) unal, 3 inhibit_count fixed bin (16) unal, 3 wakeup_control_points bit (1) unal, 3 wakeup_count fixed bin (18) unal unsigned, 2 name bit (72), 2 first_ev_msgp ptr unal, 2 last_ev_msgp ptr unal, 2 data_ptr ptr unal, 2 procedure_value, 3 procedure_ptr ptr unal, 3 environment_ptr ptr, 2 control_point_id bit (36) al; wakeup_control_points indicates the control point waiting on this channel should be awakened. control_point_id is the control point which owns this channel o The following was added to the stack_header: dcl 1 stack_header based (sb) aligned, 2 pad1 (4) fixed bin, 2 old_lot_ptr ptr, 2 combined_stat_ptr ptr, 2 clr_ptr ptr, 2 max_lot_size fixed bin (17) unal, 2 main_proc_invoked fixed bin (11) unal, 2 have_static_vlas bit (1) unal, 2 pad4 bit (2) unal, 2 run_unit_depth fixed bin (2) unal, 2 cur_lot_size fixed bin (17) unal, 2 pad2 bit (18) unal, 2 system_free_ptr ptr, 2 user_free_ptr ptr, ____ ____ ipc_ ipc_ ____ ____ 2 null_ptr ptr, 2 stack_begin_ptr ptr, 2 stack_end_ptr ptr, 2 lot_ptr ptr, 2 signal_ptr ptr, 2 bar_mode_sp ptr, 2 pl1_operators_ptr ptr, 2 call_op_ptr ptr, 2 push_op_ptr ptr, 2 return_op_ptr ptr, 2 return_no_pop_op_ptr ptr, 2 entry_op_ptr ptr, 2 trans_op_tv_ptr ptr, 2 isot_ptr ptr, 2 sct_ptr ptr, 2 unwinder_ptr ptr, 2 sys_link_info_ptr ptr, 2 rnt_ptr ptr, 2 ect_ptr ptr, 2 assign_linkage_ptr ptr, 2 cpd_ptr ptr unaligned, 2 cpm_enabled bit (36), 2 trace, 3 frames, 4 count, fixed bin, 4 top_ptr ptr unal, 3 in_trace bit (36) aligned, 2 pad3 (3) bit (36) aligned; cpd_ptr is a pointer to the control_point_data structure for the control point which owns this stack if control point management is enabled. cpm_enabled is set to control_point_data.id of the control point for which this is a stack if control point management is enabled, and is "0" otherwise. ____ __________ ipc_ list_init_ ____ __________ NNNaaammmeee::: llliiisssttt_iiinnniiittt_ Allows the caller to intitialize a variable using an encoding scheme that allows data compression. This encoding can specify the skipping of bits or the repeating of bits. It can also specify the area is to be zeroed. USAGE declare list_init_ entry (ptr, ptr, fixed bin (35), ptr, ptr, fixed bin (35)); call list_init_ (variable_ptr, template_ptr, var_size, stack_base_ptr, seg_ptr, code); ARGUMENTS variable_ptr is a pointer to the variable to be initialized (Input) template_ptr is a pointer to the list_template_entry structure defining the initialization to be performed. The list_template_entry structure is declared in system_link_init_info.incl.pl1 and has the structure defined in the following "Notes on list_template_entry Structure" section. If this is null it implies that the target should be zeroed. (Input) var_size is the size of the variable in words. (Input) sb_ptr is a pointer to the base of the stack in the ring where the variable is active. (Input) seg_ptr is a pointer to the segment containing the declaration of the variable to be initialized. (Input) code is a standard system error code. (Output) __________ __________ list_init_ list_init_ __________ __________ EEEnnntttrrryyy::: llliiisssttt_iiinnniiittt_$$$vvvaaarrriiiaaabbbllleee_aaalllrrreeeaaadddyyy_zzzeeerrrooo Allows the caller to intialize a variable using an encoding scheme that allows data compression. This encoding can specify the skipping of bits or the repeating of bits. This entry point takes for granted that the variable has been previously zeroed. USAGE declare list_init_$variable_already_zero entry (ptr, ptr, fixed bin (35), ptr, ptr, fixed bin (35)); call list_init_$variable_already_zero (variable_ptr, template_ptr, var_size, stack_base_ptr, seg_ptr, code); ARGUMENTS variable_ptr is a pointer to the variable to be initialized (Input) template_ptr is a pointe to the list_template_entry structure defining the initialization to be performed. The list_template_entry structure is declared in system_link_init_init_info.incl.pl1 and has the structure defined in the following "Notes on list_template_entry Structure" section. If this is null it implies that the target should be zeroed. (Input) var_size is the size of the variable in words. (Input) sb_ptr is a pointe to the base of the stack in the ring where the variable is active. (Input) seg_ptr is a pointer to the segment containing the declaration of the variable to initialized. (Input) code is a standard system error code. (Output) NOTES The list_template_entry has the following definition as found in system_link_init_info.incl.pl1: __________ __________ list_init_ list_init_ __________ __________ dcl 1 list_template_entry aligned based, 2 n_bits fixed bin (35) aligned, 2 mbz bit (3) unaligned, 2 init_type fixed bin (3) unsigned unaligned, 2 repeat fixed bin (30) unsigned unaligned, 2 datum bit (init_n_bits_in_datum refer (list_template_entry.n.bits)); Structure elements: ARGUMENTS nbits is the number of bits of initialization specified by the datum. If zero this specifies that this is the last template in the initialization. If skipping is implied via the repeat field then this specifies the number of bits to be skipped. If positive it implies a forward skip. If negative it implies a backward skip. mbz is a zeroed pad field and must be zero. init_type specifies what type of initialization is to be performed with the following named constants found in system_link_init_info.incl.pl1. NORMAL_INIT (=0) ITS PTR_INIT (=1) PACKED_PTR_INIT (=2) init_type specifies how many times the datum is to be repeated in the variable. If zero this specifies a skipping of n_bits bits in the variable. init_type this is the data to be copied out to the variable repeat times. If zero it implies that the variable will be zeroed. For NORMAL_INIT the datum is copied out directly to the variable. For ITS_PTR_INIT and PACKED_PTR_INIT the datum specifies encoded information that will allow external pointers to be initialized to nonconstant values. The n_bits field in this case is always 72. The encoding is in the form of the structure pointe_init_template defined in system_link_init_info.incl.pl1 as follows: __________ __________ list_init_ list_init_ __________ __________ dcl 1 pointer_init_template based, 2 ptr_type fixed bin (18) unsigned aligned, 2 section_offset fixed bin (18) unsigned unaligned, 2 word_offset fixed bin (18) unsigned unaligned, 2 mbz bit (12) unaligned, 2 bit_offset fixed bin (6) unsigned unaligned; Structure elements: ARGUMENTS ptr_type specifies where the target area is located. The following named constants are declared in link_init_info.incl.pl1. PTR_INIT_TEXT (= 0) text section reference PTR_INIT_LOT (= 1) link section reference PTR_INIT_ISOT (= 2) static section reference section_offset the word offset of the target within the specified section. word_offset is the offset in words from the address within the section to the target. If the location specified by the section_offset and the ptr_type is a link this value will be applied to the target address obtained by referencing through the link. bit_offset is the offset in bits from the address specified by word_offset above to the target. If the location specified by the section_offset and the ptr_type is a link this value will be applied to the target address obtained by referencing through the link. NOTES The ptr_type and section_offset fields specify a pointer to a word within the object segment. In the case of a pointer to the linkage section this location may be a link. If this is the case, then the reference, references indirectly through the link, snapping it via hcs_$link_force if necessary. Then the word_offset and bit_offset values are applied. Thus an arbitrary word and bit offset may be specified to be added to any pointer for which a standard link may be created. __________ ___________________________ list_init_ login_server_overseer_$test __________ ___________________________ In the case of nonlink references, if either the word_offset or the section_offset are nonzero then the offsets will be applied as word offsets to the section pointe identified by the ptr_type field. If the bit offset is nonzero it will be applied as a bit offset from the resulting address generated by applying the section_offset and word_offset. If this reference is not to a constant structure the results are undefined. This allows pointes to be created to any arbitrary point within the object segment. Recursive references to external variables with pointer initialization will be handled due to the allocation of the variable taking place prior to the initialization of the variable. This implies that a recursive reference will eventually find the allocated variable in the external name list and its value will be the address of the allocated variable. ________________________________________ NNNaaammmeee::: lllooogggiiinnn_ssseeerrrvvveeerrr_ooovvveeerrrssseeeeeerrr_$$$ttteeesssttt SYNTAX AS A COMMAND login_server_overseer_$test {test_sc1_dir {test_info_dir}} {-pb} FUNCTION This command establishes a test version of the login server environment in the caller's process. In this environment, the standard login server requests are available. In addition, normal Multics commands can be issued by preceding them with .. to escape from the login server ssu_ environment. This feature can be used to issue cpm_call commands to manipulate the control points listening on endpoints or managing connections. ARGUMENTS test_sc1_dir pathname of the directory containing test versions of answering service databases to be used by the login server. Login server requests are sent to the login_server_requests.ms queue in this directory. test_info_dir pathname of the directory containing the three Login Server subsystem info directories, which contain info segments describing the subsystem requests. Three subdirectories must ___________________________ _____________________________ login_server_overseer_$test mailbox_$accept_wakeups_index ___________________________ _____________________________ reside in test_info_dir: login_server_info login_info login_connect_info -probe, -pb when control points report an error, calls probe after reporting the error to allow a chance for further debugging. By default, execution continues within the control point after the error is reported. ACCESS REQUIRED To use this command, access is required to the network_accounting_gate_, user_message_priv_ gate, and login_server_requests.ms queue. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$aaacccccceeepppttt_wwwaaakkkeeeuuupppsss_iiinnndddeeexxx The accept_wakeups_index entrypoint enables a process to accept IPC wakeups by posting its event channel and process ID in a mailbox. USAGE declare mailbox_$accept_wakeups_index entry (fixed bin, fixed bin(71), bit(36), fixed bin(35)); call mailbox_$accept_wakeups_index (mseg_index, event_channel, wakeup_switches, code); ARGUMENTS mseg_index is the value returned from a call to mailbox_$open, identifying the mailbox through which wakeups are to be accepted. (Input) event_channel is the value returned from a call to ipc_$create_ev_chn, providing an IPC channel over which wakeups can be sent. (Input) wakeup_switches is a bit string identifying the type of wakeups that the process will accept. (Input) When turned on, the high order _____________________________ __________________ mailbox_$accept_wakeups_index mailbox_$add_index _____________________________ __________________ bit signifies that the process will accept normal wakeups. When turned on, the second highest order bit signifies that the process will accept urgent wakeups. The remaining thirty-four bits are ignored. code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have "d" extended access to the mailbox to accept wakeups. The authorization of the calling process must dominate the access class of the parent of the mailbox. The authorization of the calling process must dominate the authorization of any live process already accepting wakeups through the mailbox. The authorization of the calling process must be dominated by the access class of the mailbox. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$aaadddddd_iiinnndddeeexxx The add_index entrypoint places an arbitrary message in a mailbox. USAGE declare mailbox_$add_index entry (fixed bin, ptr, fixed bin(24), bit(72) aligned, fixed bin(35)); call mailbox_$add_index (mseg_index, message_ptr, message_len, message_id, code); ARGUMENTS mseg_index is the value returned from a call to mailbox_$open, identifying the mailbox into which the message is to be placed. (Input) message_ptr is a pointer to an arbitrary bit string, which is the text of the message. (Input) __________________ ____________________ mailbox_$add_index mailbox_$chname_file __________________ ____________________ message_len is the length of the message in bits. (Input) message_id is a value identifying the message in the mailbox, which can be used to reference the message in subsequent calls to mailbox_. code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have "a" extended access to the mailbox to add a message. The authorization of the calling process must dominate the access class of the parent of the mailbox. The authorization of the calling process must be dominated by the access class of the mailbox segment. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$ccchhhnnnaaammmeee_fffiiillleee The chname_file entrypoint changes the entry name on a specified mailbox. If an already existing name (an old name) is specified, it is deleted from the entry; if a new name is specified, it is added. Thus, if only an old name is specified, the effect is to delete a name; if only a new name is specified, the effect is to add a name; and if both are specified, the effect is to rename the entry. USAGE declare mailbox_$chname_file entry (char(*), char(*), char(*), char(*), fixed bin(35)); call mailbox_$chname_file (dir_name, entry_name, old_entry_name, new_entry_name, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) ____________________ _____________________________ mailbox_$chname_file mailbox_$check_salv_bit_index ____________________ _____________________________ entry_name is the name of the mailbox. (Input) old_entry_name is the name to be deleted from the mailbox. (Input) It can be a null character string ("") in which case no name is deleted. If oldname is null, then newname must not be null. new_entry_name is the name to be added to the entry. (Input) It must not already exist in the directory on this or another entry. It can be a null character string ("") in which case no name is added. If it is null, then oldname must not be the only name on the entry. code is a storage system status code. (Output) It can have the values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$nonamerr attempting to delete the only name of a directory entry. error_table_$namedup attempting to add a name that exists on another entry. error_table_$segnamedup attempting to add a name that already exists on this entry. ACCESS REQUIRED The calling process must have modify access to the parent of the mailbox. The authorization of the calling process must equal the access class of the parent of the mailbox. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$ccchhheeeccckkk_sssaaalllvvv_bbbiiittt_iiinnndddeeexxx The check_salv_bit_index entrypoint returns the value of the salvaged bit of a mailbox; in addition, it can be used to turn the bit off if found on. USAGE declare mailbox_$check_salv_bit_index entry (fixed bin, bit(1) aligned, bit(1) aligned, fixed bin(35)); _____________________________ ______________ mailbox_$check_salv_bit_index mailbox_$close _____________________________ ______________ call mailbox_$check_salv_bit_index (mseg_index, turn_off, salv_bit, code); ARGUMENTS mseg_index is the value returned from a call to mailbox_$open, identifying the mailbox from which the salvaged bit is to be obtained and possibly turned off. (Input) turn_off is a flag which, if set to true, turns of the salvaged bit if it is on. (Input) salv_bit is the value of the salvaged bit prior to the call. (Output) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have "s" extended access to the mailbox to obtain the value of the salvaged bit. It must have "d" extended access to turn the salvaged bit off. The authorization of the process must dominate the access class of the parent of the mailbox. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$ccclllooossseee The close entrypoint terminates the relationship between a message segment index and a mailbox. USAGE declare mailbox_$close entry (fixed bin, fixed bin(35)); call mailbox_$close (mseg_index, code); ______________ _____________________ mailbox_$close mailbox_$compact_file ______________ _____________________ ARGUMENTS mseg_index is the value returned froma call to mailbox_$open, used to identify a specific mailbox. (Input) code is a standard system status code. (Output) ACCESS REQUIRED No explicit access is required to sucessfully execute this entrypoint. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$cccooommmpppaaacccttt_fffiiillleee The compact_file entrypoint eliminates unused space in a mailbox, compressing its size to reflect storage actually filled with messages. USAGE declare mailbox_$compact_file entry (char(*), char(*), float bin(27), fixed bin(35)); call mailbox_$compact_file (dir_name, entry_name, compaction_ratio, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the mailbox. (Input) compaction_ratio is a value used to determine whether or not to perform the compaction. (Input) If the ratio of unused space to used space exceeds the argument value, the segment is compacted. If the compaction ratio is negative, the compaction always performed. code is a standard system status code. (Output) It can have the following values: _____________________ ______________________ mailbox_$compact_file mailbox_$compact_index _____________________ ______________________ error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have "d" extended access to the mailbox. The authorization of the calling process must be equal to the access class of the parent of the mailbox. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$cccooommmpppaaacccttt_iiinnndddeeexxx The compact_index entrypoint eliminates unused space in a mailbox, compressing its size to reflect storage actually filled with messages. USAGE declare mailbox_$compact_index entry (fixed bin, float bin(27), fixed bin(35)); call mailbox_$compact_index (mseg_index, compaction_ratio, code); ARGUMENTS mseg_index is the value returned from a call to mailbox_$open, identifying the mailbox to be compacted. (Input) compaction_ratio is a value used to determine whether or not to perform the compaction. (Input) If the ratio of unused space to used space exceeds the argument value, the segment is compacted. If the compaction ratio is negative, the compaction always performed. code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ______________________ _____________ mailbox_$compact_index mailbox_$copy ______________________ _____________ ACCESS REQUIRED The calling process must have "d" extended access to the mailbox. The authorization of the calling process must be equal to the access class of the parent of the mailbox. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$cccooopppyyy The copy entrypoint copies the contents of an existing mailbox into a new mailbox. USAGE declare mailbox_$copy entry (char (*), char (*), char (*), char (*), bit (1) aligned, fixed bin (35)); call mailbox_$copy (source_dir_name, source_entry_name, target_dir_name, target_entry_name, error_on_target, code); ARGUMENTS source_dir_name is the pathname of the directory that contains the mailbox to be copied. (Input) source_entry_name is the name of the mailbox to be copied. (Input) target_dir_name is the pathname of the directory that is to contain a copy of the source mailbox. (Input) target_entry_name is the name of the new mailbox. (Input) error_on_target is a flag indicating that the difficulties in copying the mailbox were due to the target mailbox. (Output) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. _____________ _______________ mailbox_$copy mailbox_$create _____________ _______________ ACCESS REQUIRED The calling process must have "r" extended access to the source mailbox, and "ma" access to the target directory. The authorization of the calling process must equal the access class of BOTH the source and target directories. The maximum authorization of the process must dominate the access class of the source mailbox. NOTES The target mailbox must not exist before this entrypoint is called. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$cccrrreeeaaattteee The create entrypoint creates a mailbox in a given directory. USAGE declare mailbox_$create entry (char(*), char(*), fixed bin(35)); call mailbox_$create (dir_name, entry_name, code); ARGUMENTS dir_name is the pathname of the directory which is to contain the mailbox. (Input) entry_name is the name of the mailbox to be created. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have append and modify access to the directory which is to contain the mailbox. The authorization of the calling process must equal the access class of the directory which is to contain the mailbox. _______________ _______________ mailbox_$create mailbox_$delete _______________ _______________ NOTES The mailbox is created with default extended modes of "adrosw" for the caller's person ID and "aow" for both "*.SysDaemon.*" and "*.*.*". The access class range of the mailbox is defined at the lower bound by the access class of the parent directory and at the upper bound by the maximum authorization of the calling process. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$dddeeellleeettteee The delete entrypoint deletes a mailbox from hierarchy. USAGE declare mailbox_$delete entry (char(*), char(*), fixed bin(35)); call mailbox_$delete (dir_name, entry_name, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the mailbox to be deleted. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have modify access to the parent of the mailbox. The authorization of the calling process must be equal to the access class of the parent of the mailbox. _______________ _____________________ mailbox_$delete mailbox_$delete_index _______________ _____________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$dddeeellleeettteee_iiinnndddeeexxx The delete_index entrypoint deletes a specified message in a mailbox. USAGE declare mailbox_$delete_index entry (fixed bin, bit(72) aligned, fixed bin(35)); call mailbox_$delete_index (mseg_index, message_id, code); ARGUMENTS mseg_index is the value returned from a call to mailbox_$open, identifying the mailbox which contains the message to be deleted. (Input) message_id is the identifier of the message to be deleted. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ACCESS REQUIRED The calling process must have "d" extended access to the mailbox to delete an arbitrary message; alternatively, "o" extended access will permit the process to delete a message that was added by the user. The authorization of the calling process must equal the access class of the message to be deleted. The authorization of the calling process must dominate the parent of the mailbox that contains the message. The authorization of the calling process must be dominated by the access class of the mailbox. _____________________ ______________________ mailbox_$delete_index mailbox_$get_mode_file _____________________ ______________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$gggeeettt_mmmooodddeee_fffiiillleee The get_mode_file entrypoint returns the effective extended access the caller has to a mailbox. USAGE declare mailbox_$get_mode_file entry (char(*), char(*), bit(36) aligned, fixed bin(35)); call mailbox_$get_mode_file (dir_name, entry_name, modes, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the mailbox. (Input) modes is a bit string describing the effective extended access the process has to the mailbox. (Output) The bit string is described in the include file mseg_access_mode_values.incl.pl1. code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have either a minimum of status access to the parent of the mailbox or non-null extended access to the mailbox itself. The authorization of the calling process must dominate the access class of the parent of the mailbox. ______________________ _______________________ mailbox_$get_mode_file mailbox_$get_mode_index ______________________ _______________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$gggeeettt_mmmooodddeee_iiinnndddeeexxx The get_mode_index entrypoint returns the effective extended access the caller has to a mailbox. USAGE declare mailbox_$get_mode_index entry (fixed bin, bit(36) aligned, fixed bin(35)); call mailbox_$get_mode_index (mseg_index, modes, code); ARGUMENTS mseg_index is the value returned from a call to mailbox_$open, identifying the mailbox for which modes are to be obtained. (Input) modes is a bit string describing the effective extended access the process has to the mailbox. (Output) The bit string is described in the include file mseg_access_mode_values.incl.pl1. code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have either a minimum of status access to the parent of the mailbox or non-null extended access to the mailbox itself. The authorization of the calling process must dominate the access class of the parent of the mailbox. _______________________ ________________________________ mailbox_$get_mode_index mailbox_$get_message_count_index _______________________ ________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$gggeeettt_mmmeeessssssaaagggeee_cccooouuunnnttt_iiinnndddeeexxx The get_message_count_index entrypoint returns the number of messages present in a mailbox that are accessible to the calling process. USAGE declare mailbox_$get_message_count_index entry (fixed bin, fixed bin, fixed bin(35)); call mailbox_$get_message_count_index (mseg_index, message_count, code); ARGUMENTS mseg_index is the value returned from a call to mailbox_$open, identifying the mailbox from which the count is to be obtained. (Input) message_count is the number of messages accessible to the calling process. (Output) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have "s" extended access to the mailbox in order to obtain its message count. The authorization of the calling process must dominate the access class of the parent of the mailbox. ________________________________ _____________________ mailbox_$get_message_count_index mailbox_$get_uid_file ________________________________ _____________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$gggeeettt_uuuiiiddd_fffiiillleee The get_uid_file entrypoint returns the file system unique identifier for the mailbox. USAGE declare mailbox_$get_uid_file entry (char(*), char(*), bit(36) aligned, fixed bin(35)); call mailbox_$get_uid_file (dir_name, entry_name, uid, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the mailbox. (Input) uid is the file system unique identifier for the mailbox. (Output) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have either a minimum of status access to the parent of the mailbox or non-null extended access to the mailbox itself. The authorization of the calling process must dominate the access class of the parent of the mailbox. _____________________ ______________________ mailbox_$get_uid_file mailbox_$get_uid_index _____________________ ______________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$gggeeettt_uuuiiiddd_iiinnndddeeexxx The get_uid_index entrypoint returns the file system unique identifier for the mailbox. USAGE declare mailbox_$get_uid_index entry (fixed bin, bit(36) aligned, fixed bin(35)); call mailbox_$get_uid_index (mseg_index, uid, code); ARGUMENTS mseg_index is the value returned from a call to mailbox_$open, identifying the mailbox for which the unique identifier is to be obtained. (Input) uid is the file system unique identifier for the mailbox. (Output) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have either a minimum of status access to the parent of the mailbox or non-null extended access to the mailbox itself. The authorization of the calling process must dominate the access class of the parent of the mailbox. ______________________ _______________________________ mailbox_$get_uid_index mailbox_$incremental_read_index ______________________ _______________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$iiinnncccrrreeemmmeeennntttaaalll_rrreeeaaaddd_iiinnndddeeexxx The incremental_read_index entrypoint obtains a message from a mailbox relative to the message specified in its argument list. USAGE declare mailbox_$incremental_read_index entry (fixed bin, ptr, bit(2) aligned, bit(72) aligned, ptr, fixed bin(35)); call mailbox_$incremental_read_index (mseg_index, area_ptr, direction, message_id, ms_arg_ptr, code); ARGUMENTS mseg_index is the value returned from a call to mailbox_$open, identifying the mailbox from which the message is to be obtained. (Input) area_ptr is a pointer to an area where mailbox_ can allocate the message. (Input) direction is a bit string specifying the message to be returned, relative to that specified by the message identifier. (Input) A value of "00"b selects the specified message. A value of "10"b selects the message before the specified one. A value of "01"b selects the message after the specified one. message_id is the identifier of the message that serves as a reference point for the selection. (Input) ms_arg_ptr is a pointer to the structure mseg_return_args, which will be filled in with information about the selected message. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. _______________________________ _______________________________ mailbox_$incremental_read_index mailbox_$incremental_read_index _______________________________ _______________________________ ACCESS REQUIRED The caller must have "r" extended access to the mailbox to read a message from it. The authorization of the caller must both dominate the access class of the parent of the mailbox and dominate the access class of the message for the message to be returned. NOTES The structure "mseg_return_args" is declared in the include file mseg_return_args.incl.pl1, and is defined as follows: dcl ms_arg_ptr pointer; dcl 1 mseg_return_args aligned based (ms_arg_ptr), 2 ms_ptr pointer, 2 ms_len fixed bin (24), 2 sender_id char (32) unaligned, 2 level fixed bin, 2 ms_id bit (72), 2 sender_authorization bit (72), 2 access_class bit (72); Where: ms_ptr is a pointer to the message. ms_len is the length of the message in bits. sender_id is the process group ID of the sending process. level is the validation level of the sending process. ms_id is the unique ID of the message. sender_authorization is the access authorization of the sending process. access_class is the access class of the message. _______________________________ ____________________ mailbox_$incremental_read_index mailbox_$mbx_acl_add _______________________________ ____________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$mmmbbbxxx_aaaccclll_aaadddddd This entry point adds specified access modes to the access control list (ACL) of the specified mailbox. If an access name already appears on the ACL of the mailbox, its mode is changed to the one specified by the call. USAGE declare mailbox_$mbx_acl_add entry (char(*), char(*), ptr, fixed bin, fixed bin(35)); call mailbox_$mbx_acl_add (dir_name, entry_name, acl_ptr, acl_count, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the entry name of the mailbox. (Input) acl_ptr points to a user-filled segment_acl_array structure (see "Entry Information" below). (Input) acl_count contains the number of ACL entries in the segment_acl_array structure (see "Entry Information" below). (Input) code is a storage system status code. (Output) It can have the values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ENTRY INFORMATION The segment_acl_array structure should be declared in the following way: dcl 1 segment_acl_array (acl_count) aligned like segment_acl_entry; The segment_acl_entry structure (declared in the include file acl_structures.incl.pl1) is as follows: ____________________ ____________________ mailbox_$mbx_acl_add mailbox_$mbx_acl_add ____________________ ____________________ dcl 1 segment_acl_entry aligned based, 2 access_name char(32) unaligned, 2 mode bit(36) aligned, 2 extended_mode bit(36) aligned, 2 status_code fixed bin(35); STRUCTURE ELEMENTS access_name is the access name (in the form Person_id.Project_id.tag) that identifies the processes to which this ACL entry applies. mode should contain the value "0"b. extended_mode contains the extended modes for this access name. The include file mseg_access_mode_values.incl.pl1 defines mnemonics for these values: dcl (MSEG_A_ACCESS initial ("400000000000"b3), MSEG_D_ACCESS initial ("200000000000"b3), MSEG_R_ACCESS initial ("100000000000"b3), MSEG_O_ACCESS initial ("040000000000"b3), MSEG_S_ACCESS initial ("020000000000"b3), MSEG_W_ACCESS initial ("010000000000"b3), MSEG_U_ACCESS initial ("004000000000"b3)) bit (36) aligned static options (constant); status_code is a standard system status code for this ACL entry only. NOTES If code is returned as error_table_$argerr, then the erroneous ACL entries in the segment_acl structure have status_code set to an appropriate error code. No processing is performed. ACCESS REQUIRED The calling process must have modify access to the parent of the mailbox. The authorization of the calling process must be equal to the access class of the parent of the mailbox. ____________________ _______________________ mailbox_$mbx_acl_add mailbox_$mbx_acl_delete ____________________ _______________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$mmmbbbxxx_aaaccclll_dddeeellleeettteee This entry point deletes specified entries from an access control list (ACL) for a mailbox. USAGE declare mailbox_$mbx_acl_delete entry (char(*), char(*), ptr, fixed bin, fixed bin(35)); call mailbox_$mbx_acl_delete (dir_name, entryname, acl_ptr, acl_count, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the mailbox. (Input) acl_ptr points to a user-filled delete_acl_array structure (see "Entry Information" below). (Input) acl_count is the number of ACL entries in the delete_acl_array structure (see "Entry Information" below). (Input) code is a storage system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ENTRY INFORMATION The delete_acl_array structure should be declared in the following way: dcl 1 delete_acl_array (acl_count) aligned like delete_acl_entry; The delete_acl_entry structure (declared in the include file acl_structures.incl.pl1) is as follows: dcl 1 delete_acl_entry aligned based, 2 access_name char(32) unaligned, 2 status_code fixed bin(35); _______________________ _____________________ mailbox_$mbx_acl_delete mailbox_$mbx_acl_list _______________________ _____________________ STRUCTURE ELEMENTS access_name is the access name (in the form of Person_id.Project_id.tag) that identifies the ACL entry to be deleted. status_code is a storage system status code for this ACL entry only. NOTES If code is returned as error_table_$argerr, then the erroneous ACL entries in the delete_acl_array structure have status_code set to an appropriate error code. No processing is performed. If an access name cannot be matched to a name already on the ACL of the mailbox, then the status_code for that ACL entry in the delete_acl_array structure is set to error_table_$user_not_found. Processing continues to the end of the delete_acl_array structure and code is returned as 0. ACCESS REQUIRED The calling process must have modify access to the parent of the mailbox. The authorization of the calling process must equal the access class of the parent of the mailbox. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$mmmbbbxxx_aaaccclll_llliiisssttt This entry point is used either to list the entire access control list (ACL) of a mailbox or to return the access modes of specified ACL entries. The segment_acl_array structure used by this entry point is discussed in the description of mailbox_$mbx_acl_add. USAGE declare mailbox_$mbx_acl_list entry (char(*), char(*), ptr, fixed bin, ptr, fixed bin(35)); call mailbox_$mbx_acl_list (dir_name, entryname, user_acl_ptr, user_acl_count, area_ptr, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) _____________________ _____________________ mailbox_$mbx_acl_list mailbox_$mbx_acl_list _____________________ _____________________ entryname is the entryname of the mailbox. (Input) user_acl_ptr points to an ACL structure, segment_acl_array, which contains mode information. (Input or Output) Input (area_ptr is null) points to a structure supplied by the caller, containing access names about which information is to be returned in that same structure. Output (area_ptr is not null) points to a structure allocated in the area pointed to by area_ptr into which mode information for all access names is placed. user_acl_count is the number of entries in the ACL structure. (Input or Output) Input is the number of entries in the ACL structure identified by user_acl_ptr. Output is the number of entries in the segment_acl_array structure allocated in the area pointed to by area_ptr, if area_ptr is not null. area_ptr points to an area in which the list of ACL entries, which make up the entire ACL of the mailbox, is allocated. (Input) If area_ptr is null, then the user wants access modes for certain ACL entries; these will be specified by the structure pointed to by user_acl_ptr. code is a storage system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. NOTES If user_acl_ptr is used to obtain modes for specified access names (rather than for all access names on a mailbox), then each ACL entry in the segment_acl_array structure either has status_code set to 0 and contains the mailbox's mode or has status_code set to error_table_$user_not_found and contains a mode of 0. _____________________ ________________________ mailbox_$mbx_acl_list mailbox_$mbx_acl_replace _____________________ ________________________ ACCESS REQUIRED The calling process must have modify access to the parent of the mailbox. The authorization of the calling process must dominate the access class of the parent of the mailbox. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$mmmbbbxxx_aaaccclll_rrreeeppplllaaaccceee This entry point replaces an entire access control list (ACL) for a mailbox with a user-provided ACL, and can optionally add an entry for *.SysDaemon.* with mode rw to the new ACL. The segment_acl_array structure described in mailbox_$mbx_acl_add is used by this entry point. USAGE declare mailbox_$mbx_acl_replace entry (char(*), char(*), ptr, fixed bin, fixed bin(35)); call mailbox_$mbx_acl_replace (dir_name, entryname, acl_ptr, acl_count, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the mailbox. (Input) acl_ptr points to the user supplied segment_acl_array structure that is to replace the current ACL. (Input) acl_count is the number of entries in the segment_acl_array structure. (Input) code is a storage system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ________________________ _____________ mailbox_$mbx_acl_replace mailbox_$open ________________________ _____________ NOTES If acl_count is zero, then the existing ACL is deleted. If acl_count is greater than zero, processing of the segment_acl_array entries is performed top to bottom, allowing later entries to overwrite previous ones if the access_name in the segment_acl_array structure is identical. ACCESS REQUIRED The calling process must have modify access to the parent of the mailbox. The authorization of the calling process must be equal to the access class of the parent of the mailbox. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$ooopppeeennn The open entrypoint associates a specified mailbox with a message segment index, allowing for more efficient processing of mailbox functions during subsequent calls to mailbox_. USAGE declare mailbox_$open entry (char (*), char (*), fixed bin, fixed bin (35)); call mailbox_$open (dir_name, entry_name, mseg_index, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the mailbox. (Input) mseg_index is a value which will identify the mailbox until a call to mailbox_$close is performed. (Output) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. _____________ _____________________ mailbox_$open mailbox_$open_if_full _____________ _____________________ ACCESS REQUIRED The calling process must have non-null extended access to the mailbox. The authorization of the calling process must dominate the access class of the parent directory. The authorization of the calling process must be dominated by the access class of the mailbox. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$ooopppeeennn_iiifff_fffuuullllll This entrypoint opens a mailbox for use by the caller if there is at least one accessible message in the mailbox. USAGE declare mailbox_$open_if_full entry (char(*), char(*), bit(1) aligned, fixed bin, fixed bin, fixed bin(35)); call mailbox_$open_if_full (dir_name, entry_name, salv_bit, message_count, mseg_index, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the mailbox. (Input) salv_bit is the value of the salvaged bit for the mailbox. (Output) message_count is the number of messages accessible to the calling process. (Output) mseg_index is the index. (Output) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. _____________________ ___________________________ mailbox_$open_if_full $own_incremental_read_index _____________________ ___________________________ ACCESS REQUIRED The calling process must have "s" extended access to the mailbox in order to open it and obtain the values of the salvaged bit and message count; otherwise, the calling process must have non-null extended access to the mailbox to simply open it. The authorization of the calling process must dominate the access class of the parent of the mailbox. The authorization of the calling process must be dominated by the access class of the mailbox. NOTES A code of error_table_$moderr will be returned and the mailbox will be opened if the user has non-null extended access but lacks "S" access. ________________________________________ NNNaaammmeee::: $$$ooowwwnnn_iiinnncccrrreeemmmeeennntttaaalll_rrreeeaaaddd_iiinnndddeeexxx The own_incremental_read_index entrypoint obtains a message originally added to a mailbox by the user, relative to the message specified in the argument list. USAGE declare mailbox_$own_incremental_read_index entry (fixed bin, ptr, bit(2) aligned, bit(72) aligned, ptr, fixed bin(35)); call mailbox_$own_incremental_read_index (mseg_index, area_ptr, direction, message_id, ms_arg_ptr, code); ARGUMENTS mseg_index is the value returned from a call to mailbox_$open, identifying the mailbox from which the message is to be obtained. (Input) area_ptr is a pointer to an area where mailbox_ can allocate the message. (Input) direction is a bit string specifying the message to be returned, ___________________________ ___________________________ $own_incremental_read_index $own_incremental_read_index ___________________________ ___________________________ relative to that specified by the message identifier. (Input) A value of "00"b selects the specified message. A value of "10"b selects the message before the specified one. A value of "01"b selects the message after the specified one. message_id is the identifier of the message that serves as a reference point for the selection. (Input) ms_arg_ptr is a pointer to the structure mseg_return_args, which will be filled in with information about the selected message. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ACCESS REQUIRED The caller must have either "r" or "o" extended access to the mailbox to read a message from it. The authorization of the caller must both dominate the access class of the parent of the mailbox and dominate the access class of the message for the message to be returned. NOTES The structure "mseg_return_args" is declared in the include file mseg_return_args.incl.pl1, and is defined as follows: dcl ms_arg_ptr pointer; dcl 1 mseg_return_args aligned based (ms_arg_ptr), 2 ms_ptr pointer, 2 ms_len fixed bin (24), 2 sender_id char (32) unaligned, 2 level fixed bin, 2 ms_id bit (72), 2 sender_authorization bit (72), 2 access_class bit (72); ___________________________ _______________________ $own_incremental_read_index mailbox_$own_read_index ___________________________ _______________________ Where: ms_ptr is a pointer to the message. ms_len is the length of the message in bits. sender_id is the process group ID of the sending process. level is the validation level of the sending process. ms_id is the unique ID of the message. sender_authorization is the access authorization of the sending process. access_class is the access class of the message. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$ooowwwnnn_rrreeeaaaddd_iiinnndddeeexxx The own_read_index entrypoint returns a message originally added by the user from a mailbox. USAGE declare mailbox_$own_read_index entry (fixed bin, ptr, bit(1) aligned, ptr, fixed bin(35)); call mailbox_$own_read_index (mseg_index, area_ptr, message_wanted, ms_arg_ptr, code); ARGUMENTS mseg_index is the value returned from mailbox_$open, identifying the mailbox from which the message is to be obtained. (Input) area_ptr is a pointer to an area where mailbox_ can allocate the message. (Input) _______________________ _______________________ mailbox_$own_read_index mailbox_$own_read_index _______________________ _______________________ message_wanted is a flag indicating which message is wanted. (Input) If "0"b, the first message found is returned; if "1"b, the last is returned. ms_arg_ptr is a pointer to the structure "mseg_return_args", which will be filled in with information about the selected message. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ACCESS REQUIRED The caller must have either "r" or "o" extended access to the mailbox to read its own message. The authorization of the caller must both dominate the access class of the parent of the mailbox and dominate the access class of the message to be returned. NOTES The structure "mseg_return_args" is declared in the include file mseg_return_args.incl.pl1, and is defined as follows: dcl ms_arg_ptr pointer; dcl 1 mseg_return_args aligned based (ms_arg_ptr), 2 ms_ptr pointer, 2 ms_len fixed bin (24), 2 sender_id char (32) unaligned, 2 level fixed bin, 2 ms_id bit (72), 2 sender_authorization bit (72), 2 access_class bit (72); Where: ms_ptr is a pointer to the message. _______________________ __________________________ mailbox_$own_read_index mailbox_$read_delete_index _______________________ __________________________ ms_len is the length of the message in bits. sender_id is the process group ID of the sending process. level is the validation level of the sending process. ms_id is the unique ID of the message. sender_authorization is the access authorization of the sending process. access_class is the access class of the message. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$rrreeeaaaddd_dddeeellleeettteee_iiinnndddeeexxx The read_delete_index entrypoint returns a message from a mailbox and deletes it from the mailbox. USAGE declare mailbox_$read_delete_index entry (fixed bin, ptr, bit(1) aligned, ptr, fixed bin(35)); call mailbox_$read_delete_index (mseg_index, area_ptr, message_wanted, ms_arg_ptr, code); ARGUMENTS mseg_index is the value returned from mailbox_$open, identifying the mailbox from which the message is to be obtained and subsequently deleted. (Input) area_ptr is a pointer to an area where mailbox_ can allocate the message. (Input) message_wanted is a flag indicating which message is wanted. (Input) If "0"b, the first message found is returned; if "1"b, the last is returned. __________________________ __________________________ mailbox_$read_delete_index mailbox_$read_delete_index __________________________ __________________________ ms_arg_ptr os a pointer to the structure "mseg_return_args", which will be filled in with information about the selected message. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ACCESS REQUIRED The calling process must have both "r" and "d" extended access to the mailbox in order to read and delete a message. The authorization of the process must dominate the access class of the parent of the mailbox and must be dominated by the access class of the mailbox. In addition, the authorization of the calling process must be equal to the access class of the message to be read and deleted. If the process authorization dominates the message access class, then the code error_table_$ai_restricted will be returned. NOTES The structure "mseg_return_args" is declared in the include file mseg_return_args.incl.pl1, and is defined as follows: dcl ms_arg_ptr pointer; dcl 1 mseg_return_args aligned based (ms_arg_ptr), 2 ms_ptr pointer, 2 ms_len fixed bin (24), 2 sender_id char (32) unaligned, 2 level fixed bin, 2 ms_id bit (72), 2 sender_authorization bit (72), 2 access_class bit (72); Where: ms_ptr is a pointer to the message. __________________________ ___________________ mailbox_$read_delete_index mailbox_$read_index __________________________ ___________________ ms_len is the length of the message in bits. sender_id is the process group ID of the sending process. level is the validation level of the sending process. ms_id is the unique ID of the message. sender_authorization is the access authorization of the sending process. access_class is the access class of the message. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$rrreeeaaaddd_iiinnndddeeexxx The read_index entrypoint returns a message from a mailbox. USAGE declare mailbox_$read_index entry (fixed bin, ptr, bit(1) aligned, ptr, fixed bin(35)); call mailbox_$read_index (mseg_index, area_ptr, message_wanted, ms_arg_ptr, code); ARGUMENTS mseg_index is the value returned from a call to mailbox_$open, identifying the mailbox from which a message is to be obtained. (Input) area_ptr is a pointer to an area where mailbox_ can allocate the message. (Input) message_wanted is a flag indicating which message is wanted. (Input) If "0"b, the first message found is returned; if "1"b, the last is returned. is a flag indicating which message is wanted. (Input) If "0"b, the first message found is returned; if "1"b, the last is returned. ___________________ ___________________ mailbox_$read_index mailbox_$read_index ___________________ ___________________ ms_arg_ptr is a pointer to the structure "mseg_return_args", which will be filled in with information about the selected message. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ACCESS REQUIRED The caller must have "r" extended access to the mailbox to read a message. The authorization of the caller must both dominate the access class of the parent of the mailbox and dominate the access class of the message to be returned. NOTES The structure "mseg_return_args" is declared in the include file mseg_return_args.incl.pl1, and is defined as follows: dcl ms_arg_ptr pointer; dcl 1 mseg_return_args aligned based (ms_arg_ptr), 2 ms_ptr pointer, 2 ms_len fixed bin (24), 2 sender_id char (32) unaligned, 2 level fixed bin, 2 ms_id bit (72), 2 sender_authorization bit (72), 2 access_class bit (72); Where: ms_ptr is a pointer to the message. ms_len is the length of the message in bits. sender_id is the process group ID of the sending process. ___________________ __________________________ mailbox_$read_index mailbox_$read_message_file ___________________ __________________________ level is the validation level of the sending process. ms_id is the unique ID of the message. sender_authorization is the access authorization of the sending process. access_class is the access class of the message. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$rrreeeaaaddd_mmmeeessssssaaagggeee_fffiiillleee The read_message_file entrypoint allows the caller to read a message from a mailbox, optionally reading its own messages and/or deleting the message just read. The behavior of this entrypoint is controlled by an input structure. USAGE declare mailbox_$read_message_file entry (char (*), char (*), ptr, ptr, fixed bin(35)); call mailbox_$read_message_file (dir_name, entry_name, area_ptr, mseg_message_info_ptr, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the mailbox. (Input) area_ptr is a pointer to an area where mailbox_ can allocate the message text. (Input) mseg_message_info_ptr is a pointer to the structure "mseg_message_info", described below. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr __________________________ __________________________ mailbox_$read_message_file mailbox_$read_message_file __________________________ __________________________ incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ACCESS REQUIRED The calling process must have the following effective extended access to the mailbox: "r" to read an arbitrary message; "o" or "r" to read its own message; "d" to delete an arbitrary message; "o" or "d" to delete its own message. The authorization of the calling process must dominate the access class of the parent of the mailbox. To delete a message, the authorization of the process must be dominated by the access class of the mailbox. In addition, the authorization of the process must dominate the access class of the message to be read, and be equal to the access class of the message to be deleted. NOTES The structure "mseg_message_info" is declared in the include file mseg_message_info.incl.pl1, and defined as follows: dcl mseg_message_info_ptr pointer; dcl 1 mseg_message_info based (mseg_message_info_ptr) aligned, 2 version char (8) aligned, 2 message_code fixed bin, 2 control_flags unaligned, 3 own bit (1), 3 delete bit (1), 3 pad bit (34), 2 ms_ptr ptr, 2 ms_len fixed bin (24), 2 ms_id bit (72), 2 ms_access_class bit (72), 2 sender_id char (32) unaligned, 2 sender_process_id bit (36) aligned, 2 sender_level fixed bin, 2 sender_authorization bit (72), 2 sender_max_authorization bit (72), 2 sender_audit bit (36); __________________________ __________________________ mailbox_$read_message_file mailbox_$read_message_file __________________________ __________________________ declare MSEG_MESSAGE_INFO_V1 char (8) aligned init ("msegmi01") int static options (constant); declare ( MSEG_READ_FIRST init (1), MSEG_READ_LAST init (2), MSEG_READ_SPECIFIED init (3), MSEG_READ_BEFORE_SPECIFIED init (4), MSEG_READ_AFTER_SPECIFIED init (5)) fixed bin int static options (constant); declare ( MSEG_READ_OWN init ("1"b), MSEG_READ_DELETE init ("01"b) ) bit (36) aligned internal static options (constant); Where: version Is the version of this structure. The caller must set this to MSEG_MESSAGE_INFO_v1. message_code specifies which message is to be read from the message segment. This value must be set by the caller to one of the following named constants: MSEG_READ_FIRST to read the first message. MSEG_READ_LAST to read the last message. MSEG_READ_SPECIFIED to read the message specified by mseg_message_info.ms_id. MSEG_READ_BEFORE_SPECIFIED to read the message previous to the message specified by mseg_message_info.ms_id. MSEG_READ_AFTER_SPECIFIED to read the next message after the message specified by mseg_message_info.ms_id. own is a flag. If set to "1"b, only messages added to the segment by the calling user will be returned. This must be set by the caller. delete is a flag. If set to "1"b, the message will be deleted after it is read out. This must be set by the caller. ms_ptr is a pointer to the message read from the message segment. This pointer is meaningful if and only if code is returned 0. The message always begins on a double-word boundary. ms_len is the length of the message, in bits. ms_id is a message segment/mailbox message id. If the message_code is MSEG_READ_SPECIFIED, this is interpreted on input, and must be the message id of a message in the message segment to which the caller has __________________________ ___________________________ mailbox_$read_message_file mailbox_$read_message_index __________________________ ___________________________ access. If the message_code is MSEG_READ_BEFORE_SPECIFIED or MSEG_READ_AFTER_SPECIFIED, the "ms_id" is used for comparison only and need not identify any message. On output, it is the message id of the returned message. ms_access_class is the access class of the message returned. sender_id is the process group id of the process that added the message to the segment. sender_process_id is the process id of the process that added the message to the segment. It may be zero to indicate that no process id is available. sender_level is the validation level of the process that added the message to the segment. sender_authorization is the authorization, including privileges, of the process that added the message to the message segment. sender_max_authorization is the max authorization of the process that added the message to the message segment. sender_audit are the audit flags for the process sending the message. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$rrreeeaaaddd_mmmeeessssssaaagggeee_iiinnndddeeexxx The read_message_index entrypoint allows the caller to read a message from a mailbox, optionally reading its own messages and/or deleting the message just read. The behavior of this entrypoint is controlled by an input structure. USAGE declare mailbox_$read_message_index entry (fixed bin, ptr, ptr, fixed bin(35)); call mailbox_$read_message_index (mseg_index, area_ptr, mseg_message_info_ptr, code); ___________________________ ___________________________ mailbox_$read_message_index mailbox_$read_message_index ___________________________ ___________________________ ARGUMENTS mseg_index is the value returned from a call to mailbox_$open, identifying the mailbox from which the message is to be read. (Input) area_ptr is a pointer to an area where mailbox_ can allocate the message text. (Input) mseg_message_info_ptr is a pointer to the structure "mseg_message_info", described below. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ACCESS REQUIRED The calling process must have the following effective extended access to the mailbox: "r" to read an arbitrary message; "o" or "r" to read its own message; "d" to delete an arbitrary message; "o" or "d" to delete its own message. The authorization of the calling process must dominate the access class of the parent of the mailbox. To delete a message, the authorization of the process must be dominated by the access class of the mailbox. In addition, the authorization of the process must dominate the access class of the message to be read, and be equal to the access class of the message to be deleted. NOTES The structure "mseg_message_info" is declared in the include file mseg_message_info.incl.pl1, and defined as follows: dcl mseg_message_info_ptr pointer; dcl 1 mseg_message_info based (mseg_message_info_ptr) aligned, 2 version char (8) aligned, 2 message_code fixed bin, 2 control_flags unaligned, ___________________________ ___________________________ mailbox_$read_message_index mailbox_$read_message_index ___________________________ ___________________________ 3 own bit (1), 3 delete bit (1), 3 pad bit (34), 2 ms_ptr ptr, 2 ms_len fixed bin (24), 2 ms_id bit (72), 2 ms_access_class bit (72), 2 sender_id char (32) unaligned, 2 sender_process_id bit (36) aligned, 2 sender_level fixed bin, 2 sender_authorization bit (72), 2 sender_max_authorization bit (72), 2 sender_audit bit (36); declare MSEG_MESSAGE_INFO_V1 char (8) aligned init ("msegmi01") int static options (constant); declare ( MSEG_READ_FIRST init (1), MSEG_READ_LAST init (2), MSEG_READ_SPECIFIED init (3), MSEG_READ_BEFORE_SPECIFIED init (4), MSEG_READ_AFTER_SPECIFIED init (5)) fixed bin int static options (constant); declare ( MSEG_READ_OWN init ("1"b), MSEG_READ_DELETE init ("01"b) ) bit (36) aligned internal static options (constant); Where: version Is the version of this structure. The caller must set this to MSEG_MESSAGE_INFO_v1. message_code specifies which message is to be read from the message segment. This value must be set by the caller to one of the following named constants: MSEG_READ_FIRST to read the first message. MSEG_READ_LAST to read the last message. MSEG_READ_SPECIFIED to read the message specified by mseg_message_info.ms_id. MSEG_READ_BEFORE_SPECIFIED to read the message previous to the message specified by mseg_message_info.ms_id. MSEG_READ_AFTER_SPECIFIED to read the next message after the message specified by mseg_message_info.ms_id. ___________________________ ___________________________ mailbox_$read_message_index mailbox_$read_message_index ___________________________ ___________________________ own is a flag. If set to "1"b, only messages added to the segment by the calling user will be returned. This must be set by the caller. delete is a flag. If set to "1"b, the message will be deleted after it is read out. This must be set by the caller. ms_ptr is a pointer to the message read from the message segment. This pointer is meaningful if and only if code is returned 0. The message always begins on a double-word boundary. ms_len is the length of the message, in bits. ms_id is a message segment/mailbox message id. If the message_code is MSEG_READ_SPECIFIED, this is interpreted on input, and must be the message id of a message in the message segment to which the caller has access. If the message_code is MSEG_READ_BEFORE_SPECIFIED or MSEG_READ_AFTER_SPECIFIED, it is used for comparison only and need not identify any message. On output, it is the message id of the returned message. ms_access_class is the access class of the message returned. sender_id is the process group id of the process that added the message to the segment. sender_process_id is the process id of the process that added the message to the segment. It may be zero to indicate that no process id is available. sender_level is the validation level of the process that added the message to the segment. sender_authorization is the authorization, including privileges, of the process that added the message to the message segment. sender_max_authorization is the max authorization of the process that added the message to the message segment. ___________________________ ____________________________ mailbox_$read_message_index mailbox_$set_max_length_file ___________________________ ____________________________ sender_audit are the audit flags for the process sending the message. ________________________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$ssseeettt_mmmaaaxxx_llleeennngggttthhh_fffiiillleee The set_max_length_file entrypoint sets the maximum length of a mailbox. USAGE declare mailbox_$set_max_length_file entry (char(*), char(*), fixed bin(19), fixed bin(35)); call mailbox_$set_max_length_file (dir_name, entry_name, max_length, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the mailbox. (Input) max_length is the new maximum length of the mailbox. (Input) code is a standard system standard code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have modify access to the parent of the mailbox. The authorization of the calling process must be equal to the access class of the parent of the mailbox. ____________________________ __________________________ mailbox_$set_max_length_file mailbox_$set_safety_switch ____________________________ __________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$ssseeettt_sssaaafffeeetttyyy_ssswwwiiitttccchhh The set_safety_switch entrypoint changes the value of the safety switch for a mailbox. USAGE declare mailbox_$set_safety_switch entry (char(*), char(*), bit(1) aligned, fixed bin(35)); call mailbox_$set_safety_switch (dir_name, entry_name, safety_switch, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the mailbox. (Input) safety_switch is the new value of the safety switch. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have modify access to the parent of the mailbox. The authorization of the calling process must equal the access class of the parent of the mailbox. __________________________ _____________________________ mailbox_$set_safety_switch mailbox_$update_message_index __________________________ _____________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$uuupppdddaaattteee_mmmeeessssssaaagggeee_iiinnndddeeexxx The update_message_index entrypoint changes the contents of a message in a mailbox. USAGE declare mailbox_$update_message_index entry (fixed bin, fixed bin(24), bit(72) aligned, ptr, fixed bin(35)); call mailbox_$update_message_index (mseg_index, message_len, message_id, message_ptr, code); ARGUMENTS mseg_index is the value returned from a call to mailbox_$open, identifying the mailbox which is to have one if its messages updated. (Input) message_len is the name of the mailbox. (Input) message_id is the identifier of the message to be modified. (Input) message_ptr is a pointer to the new message. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ACCESS REQUIRED The calling process must have "d" extended access to the mailbox to update a message. The authorization of the calling process must dominate the parent of the mailbox that contains the message and must be equal to the access class of the message to be updated. _____________________________ _________________ mailbox_$update_message_index mailbox_$validate _____________________________ _________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$vvvaaallliiidddaaattteee The validate entrypoint determines whether or not a given entry is a mailbox. USAGE declare mailbox_$validate entry (char(*), char(*), fixed bin(35)); call mailbox_$validate (dir_name, entry_name, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the potential mailbox. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$not_seg_type the entry is not a mailbox. error_table_$no_info no information on the entry is available. ACCESS REQUIRED The calling process must have either a minimum of status access to the parent of the mailbox or non-null extended access to the mailbox itself. The authorization of the calling process must dominate the access class of the parent of the mailbox. NOTES For an entry to be considered a mailbox, it must have the "mbx" suffix and have ring brackets of (1, 1, 1). _________________ _________________________ mailbox_$validate mailbox_$wakeup_add_index _________________ _________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$wwwaaakkkeeeuuuppp_aaadddddd_iiinnndddeeexxx The wakeup_add_index entrypoint adds a message to a mailbox and sends the process receiving messages through the mailbox a wakeup. USAGE declare mailbox_$wakeup_add_index entry (fixed bin, ptr, fixed bin(24), bit(36), bit(72) aligned, fixed bin(35)); call mailbox_$wakeup_add_index (mseg_index, message_ptr, message_len, wakeup_switches, message_id, code); ARGUMENTS mseg_index is the value returned froma call to mailbox_$open, identifying the mailbox into which the message is to be placed. (Input) message_ptr is a pointer to an arbitrary bit string, which is the text of the message. (Input) message_len is the length of the message in bits. (Input) wakeup_switches is an array of switches specifying the disposition of the wakeup and message. (Input) See "Notes" below. message_id is a value identifying the message in the mailbox, which can be used to reference the message in subsequent calls to mailbox_. (Output) code is a standard system status code. (Output) It can have the following values: error_table_$no_append lack of "a" extended access prevents performing the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$wakeup_denied insufficient access to send a wakeup. error_table_$no_info no information can be returned because of authorization of recipient. _________________________ _________________________ mailbox_$wakeup_add_index mailbox_$wakeup_add_index _________________________ _________________________ ACCESS REQUIRED The calling process must have "a" extended access to the mailbox to add a message and must have "w" or "u" extended access to the mailbox to send a normal or urgent wakeup, respectively. The authorization of the calling process must dominate the access class of the parent of the mailbox. The authorization of the calling process must be dominated by the access class of the mailbox segment. The authorization of the caller must be dominated by the access class of the receiver if and only if a wakeup is to be sent (i.e., if either normal_wakeup or urgent_wakeup is set in wakeup_switches). NOTES The wakeup_switches structure is defined as follows: declare 1 wakeup_switches aligned 2 normal_wakeup bit (1) unaligned, 2 urgent_wakeup bit (1) unaligned, 2 always_add bit (1) unaligned, 2 never_add bit (1) unaligned, 2 pad bit (1) unaligned; where: normal_wakeup indicates that the caller wants to send a normal wakeup. urgent_wakeup indicates that the caller wants to send an urgent wakeup if sending a normal one is not possible. always_add indicates that the message is to be added to the mailbox regardless of the ability to send a wakeup. never_add indicates that the message is not to be added, even if all access checks pass. _________________________ _____________________________ mailbox_$wakeup_add_index mailbox_$wakeup_aim_add_index _________________________ _____________________________ NNNaaammmeee::: mmmaaaiiilllbbboooxxx_$$$wwwaaakkkeeeuuuppp_aaaiiimmm_aaadddddd_iiinnndddeeexxx The wakeup_aim_add_index entrypoint adds a message to a mailbox and sends the process receiving messages through the mailbox a wakeup. USAGE declare mailbox_$wakeup_aim_add_index entry (fixed bin, ptr, fixed bin(24), bit(36), bit (72) aligned, bit(72) aligned, fixed bin(35)); call mailbox_$wakeup_aim_add_index (mseg_index, message_ptr, message_len, wakeup_switches, message_access_class, message_id, code); ARGUMENTS mseg_index is the value returned froma call to mailbox_$open, identifying the mailbox into which the message is to be placed. (Input) message_ptr is a pointer to an arbitrary bit string, which is the text of the message. (Input) message_len is the length of the message in bits. (Input) wakeup_switches is an array of switches specifying the disposition of the wakeup and message. (Input) See the wakeup_add_index entrypoint for a discussion of these switches. message_access_class is the access class that the message shall assume. (Input) message_id is a value identifying the message in the mailbox, which can be used to reference the message in subsequent calls to mailbox_. (Output) code is a standard system status code. (Output) It can have the following values: error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_append lack of "a" extended access prevents performing the operation. _____________________________ _____________________________ mailbox_$wakeup_aim_add_index mailbox_$wakeup_aim_add_index _____________________________ _____________________________ error_table_$wakeup_denied insufficient access to send a wakeup. error_table_$no_info no information can be returned because of authorization of recipient. ACCESS REQUIRED The calling process must have "a" extended access to the mailbox to add a message and must have "w" or "u" extended access to the mailbox to send a normal or urgent wakeup, respectively. The access class of the message must dominate the access class of the parent of the mailbox. The access class of the message must be dominated by the access class of the mailbox segment. The authorization of the calling process must dominate the access class of the parent of the mailbox. The authorization of the calling process must be dominated by the access class of the mailbox. The authorization of the process must be dominated by the access class of the message. The maximum authorization of the calling process must dominate the access class of the message. The authorization of the caller must be dominated by the access class of the receiver if and only if a wakeup is to be sent (i.e., if either normal_wakeup or urgent_wakeup is set in wakeup_switches). NOTES The wakeup_switches structure is defined as follows: declare 1 wakeup_switches aligned 2 normal_wakeup bit (1) unaligned, 2 urgent_wakeup bit (1) unaligned, 2 always_add bit (1) unaligned, 2 never_add bit (1) unaligned, 2 pad bit (1) unaligned; where: normal_wakeup indicates that the caller wants to send a normal wakeup. urgent_wakeup indicates that the caller wants to send an urgent wakeup if sending a normal one is not possible. always_add indicates that the message is to be added to the mailbox regardless of the ability to send a wakeup. never_add indicates that the message is not to be added, even if all access checks pass. _____________________________ ____ mailbox_$wakeup_aim_add_index mca_ _____________________________ ____ NNNaaammmeee::: mmmcccaaa_ EEEnnntttrrryyy::: mmmcccaaa_$$$aaarrreeeaaa MCA Area Structure: The mca_area_ptr points to a structure which defines the format of the data filled in by the mca_ module when I/O between the attached MCA and Multics has completed. This area is only used when the user has specified an event channel to be notified through. The structure is declared in mca_area.incl.pl1. dcl 1 mca_area aligned based (mca_area_ptr), 2 version char (8), 2 io_outstanding bit (1) aligned, 2 mca_attach_state fixed bin (17), 2 mca_status bit (72), 2 ret_len fixed bin (21); dcl mca_area_ptr ptr; dcl MCA_area_version_1 char (8) int static options (constant) init ("MCA00001"); STRUCTURE ELEMENTS version Is the version number of the structure. The current version is MCA00001. io_outstanding This will indicate the status of the maintenance session. Will be false if the requested task has been completed. If true, the task is not complete and the user will be required to call this entry again upon completion of the next I/O. mca_attach_state This will contain the current attachment state. 1 = "Attaching", which means that the mca modules are still in the process of attaching the mca (doing the reset & read-config IO). 2 = "Attached", which means that the mca is now fully attached. mca_status Is the status returned by the MCA upon completion of the request. ____ ____ mca_ mca_ ____ ____ ret_len Is the number of characters placed in the user area. EEEnnntttrrryyy::: mmmcccaaa_$$$aaattttttaaaccchhh_iiipppccc This entry will be used to attach a selected IPC to a user process. The user must have previously attached the MCA, that will communicate with the IPC. USAGE dcl mca_$attach_ipc entry (char (*), fixed bin, fixed bin, fixed bin (35)); call mca_$attach_ipc (ipc_id, mca_ioi_idx, ipc_num, code); ARGUMENTS ipc_id IPC name to be attached. The name must be either the form "ipcN", where N would be the IPC number 0 through 15, or "ICC", where "I" would be the tag of the MCA (i.e. A, B, C or D) and CC would be a channel number that is assigned to the IPC. (Input) mca_ioi_idx IOI index value that was returned when MCA was attached. (Input) ipc_num The real IPC number (0 - 15) that was attached. This is the number to be used with the load and reset entries. (Output) code Will be zero if attachment was successful, else a standard system status code will be returned. (Output) NOTES When an IPC is attached, it is sometimes necessary to suspend all system I/O through all the logical channels. If required, this entry will attempt to perform this task. If it is not possible to suspend the I/O, the IPC will NOT be attached and an error code returned. ____ ____ mca_ mca_ ____ ____ EEEnnntttrrryyy::: mmmcccaaa_$$$aaattttttaaaccchhh_mmmcccaaa This entry will be used to attach a selected MCA to a user process. USAGE dcl mca_$attach_mca entry (char (*), fixed bin (71), fixed bin, fixed bin (35)); call mca_$attach_mca (mca_id, mca_ev_chn, mca_ioi_idx, code); ARGUMENTS mca_id MCA name to be attached. The name must be in the form "mcaX", where X will be equal to the letter of the IMU the MCA is in (a, b, c, or d). (Input) mca_ev_chn Event channel that will be used to signal completion of MCA I/O. If it is a value other than 0 or 1, then completion of the I/O for this MCA will be handled using the event method and it will be required for the user to call mca_$process_io_event for each I/O completion, until the task is complete including the attachment task. Otherwise all entries that perform I/O will use ipc_$block to wait for the I/O to complete before returning from the call. The process will go blocked in ring_1 for this case. (Input) mca_ioi_idx IOI index value that will be returned when the MCA is successfully attached. (Output) code Will be a standard system status code. (Output) EEEnnntttrrryyy::: mmmcccaaa_$$$cccooonnnfffiiiggg This entry will return the contents of the IMU configuration data currently residing in the MCA's RAM. The user will need to provide sufficient space, defined by ret_ptr, to hold the the information. The configuration data will be defined in a system include file. USAGE dcl mca_$config entry (fixed bin, ptr, fixed bin (21), fixed bin (21) bit (36), fixed bin (35)); ____ ____ mca_ mca_ ____ ____ call mca_$config (mca_ioi_idx, ret_ptr, ret_size, ret_len mca_status, code); ARGUMENTS mca_ioi_idx IOI index value returned when MCA was attached. (Input) ret_ptr User area to return configuration data. (Input) ret_size Maximum size of user area in characters. (Input) ret_len Actual number characters placed in the users area. (Output) mca_status This will be the status word returned by the MCA on completion of the function. (Output) This will only be valid when the mca is attached without specifying an event channel to signal the completion of the I/O (i.e. the mca_ module has gone blocked waiting for the I/O to complete and is now returning status). code Will be a standard system status code. (Output) NOTES The entry mca_$read_data must also be called after receiving the requested data to terminate the "session". Refer to section 4 (Miscellaneous MCA Operations) for details. EEEnnntttrrryyy::: mmmcccaaa_$$$cccooonnnfffiiiggg_fffiiillleee The following structure was built based on data obtained from the EPS-1 "Dipper Firmware Loading" Rev B section 3.5.1 starting on sheet 25. The structure is declared in mca_config_file.incl.pl1. dcl mca_config_file_ptr ptr; dcl 1 mca_config_file based (mca_config_file_ptr), 2 diskette_data, /* total of 20 chars (bytes) */ 3 unique_id char (8), /* User ID assiged to diskette from which FW was loaded */ 3 date_created char (6), ____ ____ mca_ mca_ ____ ____ /* MMDDYY */ 3 date_late_changed char (6), /* MMDDYY */ 2 iioc_data, /* total of 31 chars (bytes) */ 3 iioc_config char (8), /* mca path_name of file used to load from */ 3 iioc_state_control, 4 will_be_zero_1 bit (1), /* zero because of 8 bit-byte to 9 bit-byte */ 4 state_counter fixed bin (5) unsigned unal, /* values are not defined */ 4 RFU_1 bit (1), 4 RFU_2 bit (1), 4 write_protect_ptw_sw bit (1), 3 operating_system fixed bin (9) unal unsigned, /* better be a value equal to Multics */ 3 iioc_num fixed bin (9) unal unsigned, /* the number of the imu */ 3 iioc_disk_tab fixed bin (9) unal unsigned, /* The value of the TAB number of the Diskette_Product_Set containing the proper revision of diagnostics for IMU */ 3 p_s_disk_tab fixed bin (9) unal unsigned, /* same as iioc_disk_tab only for the Port Select */ 3 port_select_state fixed bin (9) unal unsigned, /* State counter values will exists which uniquely define: o P. S. not loaded o Single port o Load failed o Read failed o Verify failed o P. S. loaded */ 3 config_valid char (1), /* ascii number of drive this config was read from. if value = "000"b3 drive door has been opened. */ 3 iioc_rfu char (2), 2 bootstrap_data, /* total of 15 chars (bytes) */ 3 control fixed bin (9) unal unsigned, /* 0 = bootstrap not configured 1 = bootstrap allowed 2 = auto boot at power up */ 3 imu_port_at_scu fixed bin (9) unal unsigned, /* port number for bootstrap (0 to 7) */ 3 chan_num fixed bin (9) unal unsigned, /* bootstrap channel number (8 to 63) */ 3 dev_num fixed bin (9) unal unsigned, /* bootstrap device number (1 to 63) */ 3 int_base char (4), 3 mb_base char (4), ____ ____ mca_ mca_ ____ ____ 3 boot_src fixed bin (9) unal unsigned, /* bootstrap source 1=card, 2=tape, 3=disk */ 3 unatt_op fixed bin (9) unal unsigned, /* 1 = unattended operation */ 3 boot_rfu bit (9), 2 port_data (0:3), /* total 28 chars (bytes) */ 3 enable fixed bin (9) unal unsigned, /* 1 = port enable */ 3 init fixed bin (9) unal unsigned, /* 1 = init allowed */ 3 ilace char (1), /* no interlace = "000"b3, A,B,C,D = the other port for interlace */ 3 port_size, 4 msb_ign1 bit (1), 4 msb bit (8), 4 lsb_ign1 bit (1), 4 lsb bit (8), 3 disk_tab fixed bin (9) unal unsigned, /* value of TAB number of the D_P_S containing the proper revision of diagnostics for port adapter. */ 3 assignment fixed bin (9) unal unsigned, /* (0 - 3) */ 2 channel_data (0:15), /* total of 160 bytes */ 3 lvl_1_state fixed bin (9) unal unsigned, /* State counter values define: = No config present = Not configured = Physically not present = Basic ROM test failed (mico IPCs only) = Jam test failed (mico IPCs only) = Self test failed (mico IPCs only) = HW ID does not match config ID = Console set up failed (console only) = RSO failed (PSIA only) = FW not found on diskette (FW loadable IPCS only) = Alter file not found = Alter load failed = FW execute failed (FW loadable IPCS only) = Operational = Stop On condition occured */ 3 lvl_1_ctl_att, 4 ctl_ign1 bit (1), 4 ctl1 bit (1), /* if master console true = rmt_maint else true = RSO required at init */ 4 ctl2 bit (1), /* if master console true = master ____ ____ mca_ mca_ ____ ____ else reserved of future use */ 4 ctl3 bit (1), /* if master console true = active/slave else true = 18X */ 4 ctl_p2 bit (5), 3 disk_tab fixed bin (9) unal unsigned, /* Tab number of the D_P_S containing the proper revision of diagnostics for this adapter */ 3 fw_id_ign1 bit (1), 3 fw_id bit (8), 3 lvl_1_id_ign1 bit (1), 3 no_lev_2 bit (1), /* true = Do not ask for lvl-2 info. */ 3 micro_ctl bit (1), /* true = micro-procesor controled */ 3 fbus_latch bit (1), /* true = F-Bus Disable Latch is true */ 3 lvl_1_id_type fixed bin (5) unsigned unal, /* unique Lvl-1 type */ 3 fw_rev char (1), 3 prim_ch_num fixed bin (9) unal unsigned, /* primary channel number (8 to 63) */ 3 num_of_log_ch fixed bin (9) unal unsigned, /* number of logical channels */ 3 num_of_busses fixed bin (9) unal unsigned, /* number of data busses */ 3 cont_byte_ign1 bit (1), 3 cont_byte_rfu bit (5), 3 cont_byte_soc bit (1), /* true = Stop-On-Condition present */ 3 cont_byte_mpfp bit (1), /* true = maint. panel function present */ 3 cont_byte_mc bit (1), /* true = has been set to Master Console */ 2 adapter_data (0:15, 0:7), 3 lvl_2_state fixed bin (9) unal unsigned, 3 lvl_2_clt_att fixed bin (9) unal unsigned, 3 disk_tab fixed bin (9) unal unsigned, 3 fw_idfixed bin (9) unal unsigned, 3 lvl_2_id fixed bin (9) unal unsigned, 3 fw_rev_ign1 bit (1), 3 fw_rev bit (8), 3 rfu bit (1), 2 uses_less_data char (200); ____ ____ mca_ mca_ ____ ____ EEEnnntttrrryyy::: mmmcccaaa_$$$dddeeetttaaaccchhh_iiipppccc This entry will be used to detach a IPC that is currently attached to a user process. USAGE dcl mca_$detach_ipc entry (char (*), fixed bin, bit (1), fixed bin (35)); call mca_$detach_ipc (ipc_id, mca_ioi_idx, ipc_operational, code); ARGUMENTS ipc_id IPC name to be detached. The name must be either the form "ipcN", where N would be the IPC number 0 through 15, or "ICC", where "I" would be the tag of the MCA (i.e. A, B, C or D) and CC would be a channel number that is part of the IPC. (Input) mca_ioi_idx IOI index value that was returned when MCA was attached. (Input) ipc_operational This bit controls the release of I/O that has been suspended through the IPC. If the bit is true, then then IPC is considered operational and the I/O will be released (if it had been suspended). Otherwise the I/O will remain suspended and the operator will be notified that the I/O was not released. (Input) code Will be a standard system status code. (Output) EEEnnntttrrryyy::: mmmcccaaa_$$$dddeeetttaaaccchhh_mmmcccaaa This entry will be used to detach the currently attached MCA from a user process. USAGE dcl mca_$detach_mca entry (fixed bin, fixed bin (35)); call mca_$detach_mca (mca_ioi_idx, code); ____ ____ mca_ mca_ ____ ____ mca_ioi_idx IOI index value that was returned when MCA was attached. (Input) code Will be a standard system status code. (Output) NOTES If any IPCs on the MCA are attached they will be detached before the MCA is detached. EEEnnntttrrryyy::: mmmcccaaa_$$$dddiiissskkkeeetttttteee This is the definition of the data returned by the MCA when either reading the diskette header, directory or files. The structure is declared in mca_diskette.incl.pl1. dcl header_ptr ptr; dcl 1 header based (header_ptr), 2 copyright char (55), 2 title char (8), 2 unique_id char (8), 2 date_created char (6), 2 date_changed char (6), 2 space_adr bit (18) unal, 2 space_x bit (18) unal, 2 space_size bit (18) unal, 2 dir_adr bit (18) unal, 2 dir_x bit (18) unal, 2 dir_size like two_byte, 2 config_name char (8), 2 config_count fixed bin (9) unal unsigned, 2 disk_type fixed bin (9) unal unsigned, 2 val fixed bin (9) unal unsigned, 2 equip_type char (4), 2 ipi_num char (12), 2 disk_dwg_num char (12), 2 prod_num_tab char (3), 2 x_of_n bit (18) unal; dcl dir_ptr ptr; dcl dire_ptr ptr; dcl dir_number fixed bin; dcl 1 directory based (dir_ptr), 2 array (dir_number) like dire; ____ ____ mca_ mca_ ____ ____ dcl two_byte_ptr ptr; dcl 1 two_byte based (two_byte_ptr) unal, 2 pad1 bit (1) unal, 2 lsb bit (8) unal, 2 pad2 bit (1) unal, 2 msb bit (8) unal; dcl 1 dire based (dire_ptr), 2 path_name char (8), 2 sector_address like two_byte, 2 file_size like two_byte, 2 rfu like two_byte, 2 attributes bit (8) unal, 2 deleted bit (1) unal, 2 rfu1 char (1); dcl file_ptr ptr; dcl file_size fixed bin (21); dcl 1 hex_file based (file_ptr), 2 hex_data (file_size) like two_byte; EEEnnntttrrryyy::: mmmcccaaa_$$$dddiiissskkkeeetttttteee_rrreeeaaaddd This entry will allow selected information from one of the two diskette devices to be returned to the caller. USAGE dcl mca_$diskette_read entry (fixed bin, char (*), fixed bin, ptr, fixed bin (21), fixed bin (21), bit (36), fixed bin (35)); call mca_$diskette_read (mca_ioi_idx, read_type, disk_num, ret_ptr, ret_size, ret_len, mca_status, code); ARGUMENTS mca_ioi_idx IOI index value returned when MCA was attached. (Input) read_type Defines what information is to be returned. The input will be passed to the MCA without alteration.(Input) Valid inputs are: "DIRECTORY" This will return the directory contents from the selected diskette. ____ ____ mca_ mca_ ____ ____ "HDR" This will return the contents of the diskette header. P=file_name This will return the contents of the requested file_name. VID/file_name The MCA will return file_name data, only if a diskette labeled VID is mounted in either of the 2 diskette devices. The disk_num argument will not be used. disk_num This will define which diskette device to read the selected data from. Valid values are 0 and 1. (Input) ret_ptr User area to return data. (Input) ret_size Maximum size of user area in characters. (Input) ret_len Actual number characters placed in the users area. (Output) This will only be valid when the mca is attached without specifying an event channel to signal the completion of the I/O (i.e. the mca_ module has gone blocked waiting for the I/O to complete and is now returning the number of characters placed in the user area). mca_status This will be the status word returned by the MCA on completion of the function. (Output) This will only be valid when the mca is attached without specifying an event channel to signal the completion of the I/O. code Will be a standard system status code. (Output) NOTES The entry mca_$read_data must also be called after receiving the requested data to terminate the "session". Refer to section 4 (Miscellaneous MCA Operations) for details. ____ ____ mca_ mca_ ____ ____ EEEnnntttrrryyy::: mmmcccaaa_$$$dddiiisssppplllaaayyy This entry will allow a user to extract the contents of the ring-1 control segment, mca_data_seg, for examination. USAGE dcl mca_$display entry (ptr, fixed bin (21), fixed bin (21), fixed bin (35)); call mca_$display (ret_ptr, ret_size, ret_len, code); ARGUMENTS ret_ptr User area to return data. (Input) ret_size Maximum size of user area in characters. If this is less than the size of the mca data, then only ret_size characters will be returned. (Input) ret_len Actual number characters placed in the users area. (Output) code Will be a standard system status code. (Output) EEEnnntttrrryyy::: mmmcccaaa_$$$llloooaaaddd_iiipppccc This entry will allow the requested IPC to have its internal firmware reloaded from the MCA diskette and reset to a initialized state. USAGE dcl mca_$load_ipc (fixed bin, fixed bin, bit (36), fixed bin (35)); call mca_$load_ipc (mca_ioi_idx, ipc_number, mca_status, code); ARGUMENTS mca_ioi_idx IOI index value returned when MCA was attached. (Input) ipc_number The IPC number to be acted on (returned by mca_$attach_ipc). (Input) ____ ____ mca_ mca_ ____ ____ mca_status This will be the status word returned by the MCA on completion of the function. (Output) This will only be valid when the MCA is attached without specifying an event channel to signal the completion of the I/O (i.e. the mca_ module has gone blocked waiting for the I/O to complete and is now returning status). code Will be a standard system status code. (Output) NOTES It will be necessary to attach an IPC, using the mca_$attach_ipc, before invoking this entry. Otherwise an error code will be returned. EEEnnntttrrryyy::: mmmcccaaa_$$$ppprrroooccceeessssss_iiiooo_eeevvveeennnttt Used to notify ring 1 of the completion of an asynchronous I/O event. It may be necessary to call this entry several times before a task is complete. This entry must only be used when a event channel was passed to mca_$attach_mca entry point when the MCA was attached. USAGE dcl mca_$process_io_event entry (fixed bin, ptr, ptr, fixed bin (35)); call mca_$attach_mca (mca_ioi_idx, event_call_info_ptr, mca_area_ptr, code); ARGUMENTS mca_ioi_idx IOI index value returned when MCA was attached. (Input) event_call_info_ptr Pointer to the event_call_info structure returned when the event was signalled. (Input) mca_area_ptr Pointer to the user supplied area for placing I/O completion information. (Input) code Will be a standard system status code. (Output) ____ ____ mca_ mca_ ____ ____ EEEnnntttrrryyy::: mmmcccaaa_$$$rrreeeaaaddd_dddaaatttaaa This entry must be used in cases, such as diskette read, where the data to be sent by the MCA is larger that the size of the user buffer. This is indicated by the status returned for that call. This entry reads the remaining data from the MCA and places it in the user buffer for this call. The status returned must be checked to see if there is more data to read. Repeated calls to this entry must be used to read the data. USAGE dcl mca_$read_data entry (fixed bin, ptr, fixed bin (21), fixed bin (21), bit (36), fixed bin (35)); call mca_$read_data (mca_ioi_idx, ret_ptr, ret_size, ret_len, mca_status, code); ARGUMENTS mca_ioi_idx IOI index value returned when MCA was attached. (Input) ret_ptr User area to return data. (Input) ret_size Maximum size of user area in characters. (Input) ret_len Actual number characters placed in the users area. (Output) This will only be valid when the mca is attached without specifying an event channel to signal the completion of the I/O (i.e. the mca_ module has gone blocked waiting for the I/O to complete and is now returning the number of characters placed in the user area). mca_status This will be the status word returned by the MCA on completion of the function. (Output) This will only be valid when the mca is attached without specifying an event channel to signal the completion of the I/O. code Will be a standard system status code. (Output) ____ ____ mca_ mca_ ____ ____ NOTES This entry must also be used to terminate a "session", when entries like config and diskette_read have been used. Refer to section 4 (Miscellaneous MCA Operations) for details. EEEnnntttrrryyy::: mmmcccaaa_$$$rrreeessseeettt This entry will allow the user to reset the MCA to Multics communication dialogue. This entry issues a reset_status opcode ("40"b3) to the MCA. USAGE dcl mca_$reset (fixed bin, bit (36), fixed bin (35)); call mca_$reset (mca_ioi_idx, mca_status, code); ARGUMENTS mca_ioi_idx IOI index value returned when MCA was attached. (Input) mca_status This will be the status word returned by the MCA on completion of the function. (Output) This will only be valid when the MCA is attached without specifying an event channel to signal the completion of the I/O (i.e. the mca_ module has gone blocked waiting for the I/O to complete and is now returning status). code Will be a standard system status code. (Output) EEEnnntttrrryyy::: mmmcccaaa_$$$rrreeessseeettt_iiipppccc This entry will allow the requested IPC to be reset to an initialized state. USAGE dcl mca_$reset_ipc (fixed bin, fixed bin, bit (36), fixed bin (35)); call mca_$reset_ipc (mca_ioi_idx, ipc_number, mca_status, code); ____ ____ mca_ mca_ ____ ____ mca_ioi_idx IOI index value returned when MCA was attached. (Input) ipc_number The IPC number to be acted on (returned by mca_$attach_ipc). (Input) mca_status This will be the status word returned by the MCA on completion of the function. (Output) This will only be valid when the MCA is attached without specifying an event channel to signal the completion of the I/O (i.e. the mca_ module has gone blocked waiting for the I/O to complete and is now returning status). code Will be a standard system status code. (Output) NOTES It will be necessary to attach an IPC, using the mca_$attach_ipc, before invoking this entry. Otherwise an error code will be returned. ____ ____ mca_ mca_ ____ ____ EEEnnntttrrryyy::: mmmcccaaa_$$$rrreeetttuuurrrnnn_ssstttaaatttuuusss Status Major Substatus Octal Channel Ready 0000 Normal Termination x00000 4000 or 4040 Adapter Failure x00001 4001 or 4041 Maint. Session Normal Term. x00010 4002 or 4042 Maint. Session Abnormal Term. x00011 4003 or 4043 Response Data Present 1xxxxx * Attention (Diskette) 0010 Write Inhibit x00001 4201 or 4241 Seek Incomplete x00010 4202 or 4242 Device Not Present x00100 4204 or 4244 Device Inoperable x01000 4210 or 4250 Device in Standby (door open) x10000 4220 or 4260 Data Alert 0011 Transmission Parity Alert x00010 4302 or 4342 Check Character Alert x10000 4320 or 4360 Command Reject 0101 Invalid Operation Code x00001 4501 or 4541 Attention (MCA) 1010 MCA Executive F/W Error x00001 5201 or 5241 MCA Overlay F/W Error x00010 5202 or 5242 Connect Time Out x10000 5220 or 5260 Data Alert (MCA) 1011 Data Overflow on Load x00110 5306 or 5346 Data Underflow on Load x00111 5307 or 5347 Command Reject (MCA) 1101 Invalid Sequence x00001 5501 or 5541 Invalid PATH_NAME x00010 5502 or 5542 Invalid Request Format x00011 5503 or 5543 Continue Bit Error x00100 5504 or 5544 Invalid Block Header x00101 5505 or 5545 * The Response Data Present bit is applicable to ALL status returns. ____ ____ mca_ mca_ ____ ____ EEEnnntttrrryyy::: mmmcccaaa_$$$tttaaannndddddd_rrreeeaaaddd_dddaaatttaaa This entry will allow the tolts subsystem to send previously prepared IO blocks to the MCA. This entry must be used by tolts to perform a read only operation from the MCA. This is the case when the previous command status return indicates that the MCA has more data to send than the tolts subsystem had reserved space for. The IDCW and DCW will be supplied by the gated code. When the MCA returns response data, it will be copied from the wired block into the user area and the MCA status returned to the caller. USAGE dcl mca_$tandd_read_data (fixed bin, ptr, fixed bin, bit (36), fixed bin (35)); call mca_$tandd_read_data (mca_ioi_idx, io_block_ptr, io_block_len, mca_status, code); ARGUMENTS mca_ioi_idx IOI index value returned when MCA was attached. (Input) io_block_ptr Tolts area that contains the IO block to be sent. (Input) Note: The data_header_2 area will be nulled as well as data_2 the size will be set to 0. The data returned will be defined by data_header_1 and the data returned in the data_1 area. io_block_len Size of tolts area in words. (Input) mca_status This will be the status word returned by the MCA on completion of the function. (Output) This will only be valid when the mca is attached without specifying an event channel to signal the completion of the I/O (i.e. the mca_ module has gone blocked waiting for the I/O to complete and is now returning status). code Will be a standard system status code. (Output) NOTES This entry must also be used to terminate a "maintenance session". Refer to mca_$read_data for details. ____ ____ mca_ mca_ ____ ____ EEEnnntttrrryyy::: mmmcccaaa_$$$tttaaannndddddd_wwwrrriiittteee_dddaaatttaaa This entry will allow the tolts subsystem to send previously prepared IO blocks to the MCA. This entry will be used by tolts to perform early communication with the MCA, prior to initiating a test request, and to send TEST OVERLAY data to the MCA and to maintain a response area for the MCA while a given test is being executed. This entry will also move the IO block to a wired area, replacing the IDCWs (15, 03) and DCWs with known good ones. When the MCA returns response data, it will be copied from the wired block into the user area and the MCA status returned to the caller. USAGE dcl mca_$tandd_write_data (fixed bin, ptr, fixed bin, bit (36), fixed bin (35)); call mca_$tandd_write_data (mca_ioi_idx, io_block_ptr, io_block_len, mca_status, code); ARGUMENTS mca_ioi_idx IOI index value returned when MCA was attached. (Input) io_block_ptr Tolts area that contains the IO block to be sent. (Input) io_block_len Size of tolts area in words. (Input) mca_status This will be the status word returned by the MCA on completion of the function. (Output) This will only be valid when the mca is attached without specifying an event channel to signal the completion of the I/O (i.e. the mca_ module has gone blocked waiting for the I/O to complete and is now returning status). code Will be a standard system status code. (Output) ____ ____ mca_ mca_ ____ ____ EEEnnntttrrryyy::: mmmcccaaa_$$$tttaaannndddddd_wwwrrriiittteee_ttteeexxxttt This entry will allow the tolts subsystem to send previously prepared IO blocks to the MCA. This entry must be used by tolts to initiate a IO activity with the MCA, for a given IPC. This entry will verify that the text portion of the block only contains the valid commands READ, RESET, LOAD or TEST and that the IPC attached is the only adapter specified after the command text. This entry will also move the IO block to a wired area, replacing the IDCWs (13, 03) and DCWs with known good ones. When the MCA returns response data, it will be copied from the wired block into the user area and the MCA status returned to the caller. USAGE dcl mca_$tandd_write_text (fixed bin, ptr, fixed bin, bit (36), fixed bin (35)); call mca_$tandd_write_text (mca_ioi_idx, io_block_ptr, io_block_len, mca_status, code); ARGUMENTS mca_ioi_idx IOI index value returned when the selected MCA was attached. (Input) io_block_ptr Tolts area that contains the text IO block to be sent. (Input) io_block_len Size of tolts area in words. (Input) mca_status This will be the status word returned by the MCA on completion of the function. (Output) This will only be valid when the MCA is attached without specifying an event channel to signal the completion of the I/O (i.e. the mca_ module has gone blocked waiting for the I/O to complete and is now returning status). code Will be a standard system status code. (Output) ____ ____ mca_ mca_ ____ ____ NOTES If the text of the I/O block specifies an IPC adapter, the adapter must be attached to the user process. If the adapter is not attached no I/O will be performed and an error code will be returned. EEEnnntttrrryyy::: mmmcccaaa_$$$wwwooorrrkkk_ssspppaaaccceee This is the definition of the workspace used by the mca ring-1 modules when communicating with the MCA through IOI. The structure is declared in mca_data_area.incl.pl1. dcl data_header_ptr ptr; dcl (data_size_1, data_size_2) fixed bin (21) init (0); dcl io_param_blk_ptr ptr; dcl mca_dcw_list_ptr ptr; dcl mca_work_space_ptr ptr; dcl 1 mca_work_space based (mca_work_space_ptr), 2 list_of_dcw like mca_dcw_list, /* the list of idcws and dcws */ 2 status_area like istat, /* the ioi status return area */ 2 data_header_1 aligned like data_header, /* the structure that defines the HOST to MCA data */ 2 data_1 char (data_size_1), /* the text of the data to be sent to the MCA */ 2 data_header_2 aligned like data_header, /* the structure that defines the MCA to HOST data */ 2 data_2 char (data_size_2); /* the text of the data returned by the MCA */ NOTES data_header_1 and data_1 areas are reserved for data TO the MCA. The data_header_2 and data_2 areas are reserved for data FROM the MCA. However if the "mca_$tandd_read_data" entry is call the data will be returned in data_1 and defined in the data_header_1 area. The data_header_2 values should be nulled. ____ ____ mca_ mca_ ____ ____ dcl 1 data_header based (data_header_ptr) aligned, 2 type bit (9) unal, /* must be equal to "000"b3 (MBZ) */ 2 definer fixed bin (9) unal unsigned, /* defines type of info in header */ 2 ctl_sw bit (18) unal, /* "currently undefined" mbz = "000000"b3 */ 2 host_sts_ign1 bit (1) unal, 2 host_sts_msb bit (8) unal, 2 host_sts_ign2 bit (1) unal, 2 host_sts_lsb bit (8) unal, 2 rd_flpy fixed bin (9) unal unsigned, /* 0 = data files from host */ /* 1 = data files from flopy */ 2 io_param_blk like io_parameter_block unal; ____ ____ mca_ mca_ ____ ____ dcl 1 io_parameter_block based (io_param_blk_ptr) unal, 2 open fixed bin (9) unal unsigned, 2 cmd bit (18), 2 sts_ptr bit (18), /* Unused */ 2 file_name char (8), /* file name for this request */ 2 options bit (18), /* Unused */ 2 source_ptr bit (18), /* Unused */ 2 source_len, /* data_size = source_len_msb||source_len_lsb MCA to HOST */ 3 source_len_ign1 bit (1), 3 source_len_msb bit (8), 3 source_len_ign2 bit (1), 3 source_len_lsb bit (8), 2 dest_ptr bit (18), /* Unused */ 2 blk_ct, /* if MCA to HOST blk_ct_msb||blk_ct_lsb = MAX number of 256 byte BLOCKS */ /* else not used */ 3 blk_ct_ign1 bit (1), 3 blk_ct_msb bit (8), 3 blk_ct_ign2 bit (1), 3 blk_ct_lsb bit (8), 2 dest_len, /* supplied by host as the number of bytes in data_field max value is 16128 */ /* dest_len_msb = substr(unspec(data_size),21,8) */ /* dest_len_lsb = substr(unspec(data_size),29,8) */ 3 dest_len_ign1 bit (1), 3 dest_len_msb bit (8), 3 dest_len_ign2 bit (1), 3 dest_len_lsb bit (8); /* Constants used for data_header.definer */ ____ ____ mca_ mca_ ____ ____ dcl DATA_FROM_HOST fixed bin (9) unsigned init (0) static options (constant); dcl WRITE_CONSOLE fixed bin (9) unsigned init (1) static options (constant); dcl WRITE_READ_CONSOLE fixed bin (9) unsigned init (2) static options (constant); dcl DATA_FROM_MCA fixed bin (9) unsigned init (3) static options (constant); dcl REQ_DATA_FROM_HOST fixed bin (9) unsigned init (4) static options (constant); dcl STATUS_FROM_MCA fixed bin (9) unsigned init (5) static options (constant); dcl SEEK fixed bin (9) unsigned init (6) static options (constant); dcl CON_DATA_FROM_HOST fixed bin (9) unsigned init (7) static options (constant); dcl BIN_DATA_FROM_HOST fixed bin (9) unsigned init (8) static options (constant); dcl ABORT_SES_FROM_HOST fixed bin (9) unsigned init (9) static options (constant); dcl 1 mca_dcw_list based (mca_dcw_list_ptr), 2 idcw1 like idcw, 2 dcw1 like dcw, 2 idcw2 like idcw, 2 dcw2 like dcw; dcl 1 dcw based (dcwp) aligned, /* Data Control Word */ (2 address bit (18), /* address for data transfer */ 2 char_pos bit (3), /* character position */ 2 m64 bit (1), /* non-zero for mod 64 address */ 2 type bit (2), /* DCW type */ 2 tally bit (12)) unal; /* tally for data transfer */ ____ ____ mca_ mca_ ____ ____ dcl 1 idcw based aligned, /* Instruction DCW */ (2 command bit (6), /* device command */ 2 device bit (6), /* device code */ 2 ext bit (6), /* address extension */ 2 code bit (3), /* should be "111"b for PCW */ 2 ext_ctl bit (1), /* "1"b if address extension to be used */ 2 control bit (2), /* terminate/proceed and marker control bits */ 2 chan_cmd bit (6), /* type of I/O operation */ 2 count bit (6)) unal /* record count or control character */; dcl 1 istat based aligned, /* I/O Interfacer status structure */ 2 completion, /* completion flags */ (3 st bit (1), /* "1"b if status returned */ 3 er bit (1), /* "1"b if status indicates error condition */ 3 run bit (1), /* "1"b if channel still running */ 3 time_out bit (1)) unal, /* "1"b if time-out occurred */ 2 level fixed bin (3), /* IOM interrupt level */ 2 offset fixed bin (18), /* DCW list offset */ 2 absaddr fixed bin (24), /* absolute address of workspace */ 2 iom_stat bit (72), /* IOM status */ 2 lpw bit (72) /* LPW residue */; _________ _________ mca_priv_ mca_priv_ _________ _________ NNNaaammmeee::: mmmcccaaa_ppprrriiivvv_ EEEnnntttrrryyy::: mmmcccaaa_ppprrriiivvv_$$$fffooorrrccceee_rrreeessseeettt This entry will allow the user to reinitialize the MCA. This entry issues a reset_mask PCW to the MCA. Executing this entry has the same effect as pushing the "MCA Reset" button located in the IMU cabinet. USAGE dcl mca_priv_$force_reset (char (*), bit (36), fixed bin (35)); call mca_priv_$force_reset (mca_id, mca_status, code); ARGUMENTS mca_id MCA name to be reset. The name must be in the form "mcaX", where X will be equal to the letter of the IMU the MCA is in (a, b, c, or d). (Input) mca_status This will be the status word returned by the MCA on completion of the function. (Output) code Will be a standard system status code. (Output) NOTES The MCA must be in the FREE state for this entry to operate properly. The entry will attach the MCA, do the reset and detach the MCA when complete. EEEnnntttrrryyy::: mmmcccaaa_ppprrriiivvv_$$$fffooorrrccceee_uuunnnllloooccckkk This entry will allow the per MCA lock in the ring-1 mca_data_seg to be force unlocked. USAGE dcl mca_priv_$force_unlock (char (*), fixed bin (35)); call mca_priv_$force_unlock (mca_id, code); _________ _________ mca_priv_ mca_priv_ _________ _________ mca_id MCA name to be unlocked. The name must be in the form "mcaX", where X will be equal to the letter of the IMU the MCA is in (a, b, c, or d). (Input) code Will be a standard system status code. (Output) EEEnnntttrrryyy::: mmmcccaaa_ppprrriiivvv_$$$mmmcccaaa_ppprrriiivvv_llloooaaaddd_iiipppcccsss This entry will allow all of the currently defined IPCs of the selected IMU to have their internal firmware reloaded from the MCA diskette and reset to a initialized state. This requires all the IPCs of the IMU be attached to this process before this command can be executed. USAGE dcl mca_priv_$load_ipcs entry (fixed bin, bit (36), fixed bin (35)); call mca_priv_$load_ipcs (mca_ioi_idx, mca_status, code); ARGUMENTS mca_ioi_idx IOI index value returned when MCA was attached. (Input) mca_status This will be the status word returned by the MCA on completion of the function. (Output) This will only be valid when the mca is attached without specifying an event channel to signal the completion of the I/O (i.e. the mca_ module has gone blocked waiting for the I/O to complete and is now returning status). code Will be a standard system status code. (Output) _________ _________ mca_priv_ mca_priv_ _________ _________ EEEnnntttrrryyy::: mmmcccaaa_ppprrriiivvv_$$$rrreeessseeettt_iiipppcccsss This entry will allow all of the currently defined IPCs of the selected IMU to be reset to a initialized state. This requires all the IPCs of the IMU be attached to this process before this command can be executed. USAGE dcl mca_priv_$reset_ipcs entry (fixed bin, bit (36), fixed bin (35)); call mca_priv_$reset_ipcs (mca_ioi_idx, mca_status, code); ARGUMENTS mca_ioi_idx IOI index value returned when MCA was attached. (Input) mca_status This will be the status word returned by the MCA on completion of the function. (Output) This will only be valid when the mca is attached without specifying an event channel to signal the completion of the I/O (i.e. the mca_ module has gone blocked waiting for the I/O to complete and is now returning status). code Will be a standard system status code. (Output) EEEnnntttrrryyy::: mmmcccaaa_ppprrriiivvv_$$$tttrrraaaccceee This entry will allow the turning ON or OFF of the MCA console messages (i.e. TRACING) displayed on the IPC-CONS adapter that currently has the multidrop (MD) interface enabled. USAGE dcl mca_priv_$trace entry (fixed bin, bit (3), bit (1), char (40), bit (36), fixed bin (35)); call mca_priv_$trace (mca_ioi_idx, mca_option, on_off_bit, trace_state, mca_status, code); ARGUMENTS mca_ioi_idx IOI index value returned when MCA was attached. (Input) _________ ____ mca_priv_ mdc_ _________ ____ mca_option A three bit field that will define what MCA tracing types will be affected by the call. The three types in order will be FAULT, BOOT and DEBUG. (Input) The values are: "100"b -> FAULT, "010"b -> BOOT, or "001"b -> DEBUG. These values may be or'ed together. on_off_bit A one bit field that will define whether to turn the above MCA_OPTIONS ON or OFF. "1"b = turn on tracing. "0"b turn off tracing. (Input) trace_state This is the ascii data returned by the MCA to indicate the state of tracing. (Output) mca_status This will be the status word returned by the MCA on completion of the function. (Output) This will only be valid when the mca is attached without specifying an event channel to signal the completion of the I/O (i.e. the mca_ module has gone blocked waiting for the I/O to complete and is now returning status). code Will be a standard system status code. (Output) ________________________________________ NNNaaammmeee::: mmmdddccc_ The mdc_ subroutine (actually a ring 1 gate) provides a series of entry points for manipulation of master directories. EEEnnntttrrryyy::: mmmdddccc_$$$cccrrreeeaaattteee_dddiiirrr This entry point is used to create a new master directory. Its arguments are roughly analogous to the hcs_$append_branchx entry point. USAGE declare mdc_$create_dir entry (char(*), char(*), char(*), bit(36) aligned, (3) fixed bin(3), char(*), fixed bin, fixed bin(35)); ____ ____ mdc_ mdc_ ____ ____ call mdc_$create_dir (dir_name, entryname, volume, mode, rings, user_id, quota, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the subdirectory. (Input) volume is the name of the logical volume that is to contain segments created in the new directory. (Input) mode is the user's access mode. (Input) rings are the ring brackets of the directory. (Input) Only the first values are used. user_id is an access control name. (Input) quota is the quota to be placed on the new directory. (Input) code is a standard status code. (Output) EEEnnntttrrryyy::: mmmdddccc_$$$cccrrreeeaaattteee_dddiiirrrxxx This entry point is an extension of the mdc_$create_dir entry point, which is similar to hcs_$create_branch_ entry point. USAGE declare mdc_$create_dirx entry (char(*), char(*), char(*), ptr, fixed bin(35)); call mdc_$create_dirx (dir_name, entryname, volume, info_ptr, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) ____ ____ mdc_ mdc_ ____ ____ entryname is the entryname of the subdirectory. (Input) volume is the name of the logical volume that is to contain segments created in the new directory. (Input) info_ptr is a pointer to the create_branch_info structure as described under the hcs_$create_branch_ entry point. (Input) EEEnnntttrrryyy::: mmmdddccc_$$$cccrrreeeaaattteee_dddiiirrrxxx_aaaccccccttt This entry point is an extension of the mdc_$create_dir entry point, which is similar to the hcs_$create_branch_ entry point. USAGE declare mdc_$create_dirx_acct entry (char(*), char(*), char(*), ptr, char(*), char(*), fixed bin(35)); call mdc_$create_dirx_acct (dir_name, entryname, volume, info_ptr, account, owner, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the subdirectory. (Input) volume is the name of the logical volume that is to contain segments created in the new directory. (Input) info_ptr is a pointer to the create_branch_info structure as described under the hcs_$create_branch_ entry point. (Input) account is the quota account from which this directory should draw quota. (Input) owner is the user_id which should be listed as the owner of the directory. (Input) ____ ____ mdc_ mdc_ ____ ____ ACCESS REQUIRED The user must have executive "E" access to the volume if the account and/or owner are specified non-null. The quota account must exist. When the account and owner are null strings, a quota account matching the user's person.project must exist. SYSTEM STATUS CODES argerr - create_branch_info has wrong version mdc_exec_access - account and/or owner specified but user lacks executive permission to volume mdc_illegal_owner - the owner specified is in an illegal format mdc_no_quota_account - the specified quota account does not exist mdc_bad_quota - invalid quota in the account mdc_no_quota - insufficient quota in the account EEEnnntttrrryyy::: mmmdddccc_$$$dddeeellleeettteee_dddiiirrr This entry point is used to delete a master directory. USAGE declare mdc_$delete_dir entry (char(*), char(*), fixed bin(35)); call mdc_$delete_dir (dir_name, entryname, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the subdirectory. (Input) code is a standard status code. (Output) ____ ____ mdc_ mdc_ ____ ____ EEEnnntttrrryyy::: mmmdddccc_$$$dddeeellleeettteee_vvvooollluuummmeee_qqquuuoootttaaa This entry point is used to delete a logical volume quota account. USAGE declare mdc_$delete_volume_quota entry (char(x), char(*), fixed bin(35)); call mdc_$delete_volume_quota (volume, account, code); ARGUMENTS volume is the logical volume to be manipulated. account is the name of the account (of the form person.project) to be deleted. code is a standard system status code. (Output) ACCESS REQUIRED Executive access is required to the logical volume. EEEnnntttrrryyy::: mmmdddccc_$$$fffiiinnnddd_lllvvviiiddd This entry point translates a logical volume id (lvid) to a logical volume name. USAGE declare mdc_$find_lvid entry (bit(36) aligned, char(x), fixed bin (35)); call mdc_$find_lvid (lvid, lv_name, code); ARGUMENTS lvid is a logical volume id. (Input) lvname is the corresponding lv name. (Output) ____ ____ mdc_ mdc_ ____ ____ code is a standard system status code. (Output) EEEnnntttrrryyy::: mmmdddccc_$$$fffiiinnnddd_lllvvvnnnaaammmeee This entry point translates a logical volume id (lvid) to a logical volume name. USAGE declare mdc_$find_lvid entry (bit(36) aligned, char(x), fixed bin (35)); call mdc_$find_lvid (lvid, lv_name, code); ARGUMENTS lvid is a logical volume id. (Input) lvname is the corresponding lv name. (Output) code is a standard system status code. (Output) EEEnnntttrrryyy::: mmmdddccc_$$$fffiiinnnddd_vvvooolllnnnaaammmeee This entry point translates a physical volume id (pvid) into a physical volume name and logical volume name. USAGE declare mdc_$find_volname entry (bit(36), aligned, char(*), char(*1), fixed bin (30)); call mdc_$find_volname (pvid, pv_name, lv_name, code); ARGUMENTS pvid is the physical volume id. (Input) pv_name is the physical volume name. (Output) lv_name is the logical volume name. (Output) ____ ____ mdc_ mdc_ ____ ____ code is a standard system status code. (Output) EEEnnntttrrryyy::: mmmdddccc_$$$gggeeettt_lllvvv_aaacccccceeessssss mdc_$get_lv_access gets the calling process' effective access to manipulate a logical volume. USAGE declare mdc_$get_lv_access entry (char(*), fixed bin(3), fixed bin(5), bit (1) aligned, fixed bin (35)); call mdc_$get_lv_access (lv_name, ring, mode, public, code); ARGUMENTS lv_name is the logical volume name. (Input) ring is the validation level for which access is to be calculated. (Input) mode is either REW_ACCESS_BIN for a volume executive, RW_ACCESS_BIN for a user with access to use the volume, or N_ACCESS_BIN for a user with no access to the volume. (Output) These values are declared in access_mode_values.incl.pl1. public is "1"b if the volume is public. code is a standard system status code. (Output) ACCESS REQUIRED No special access is required. ____ ____ mdc_ mdc_ ____ ____ EEEnnntttrrryyy::: mmmdddccc_$$$lllvvvnnnaaammmeee_iiinnnfffooo This entry point returns information about a logical volume. -WARNING- Internal interface subject to change. USAGE declare mdc_$lvname_info entry (char(*), pointer, fixed bin, fixed bin(35)); call mdc_$lvname_info (lv_name, info_ptr, n_physical_volumes, code); ARGUMENTS lv_name is the name of a logical volume. (Input) info_ptr is a pointer to the pv_info structure. See Notes below. n_physical_volumes is the number of physical volumes in this logical volume. (Output) code is a standard status code. (Output) NOTES The following structure describe all of the physical volumes in the logical volume. dcl 1 pv_info (100) aligned based (info_ptr), 2 pvname char(32), 2 device_type fixed bin, 2 pvid bit(36) aligned, STRUCTURE ELEMENTS pvname is the name of this physical volume. (Output) device_type is the model number of the volume from fs_dev_types.incl.pl1. pvid is the unique id of the physical volume. (Output) ____ ____ mdc_ mdc_ ____ ____ EEEnnntttrrryyy::: mmmdddccc_$$$pppvvvnnnaaammmeee_iiinnnfffooo This entry point gets various kinds of information about a specified storage-system physical volume. USAGE declare mdc_$pvname_info entry (char (*), bit (36) aligned, char (*), bit (36) aligned, fixed bin, fixed bin (35)); call mdc_$pvname_info (pvname, pvid, lvname, lvid, device_type, code); ARGUMENTS pvname is the name of the physical volume about which information is to be returned. (Input) pvid is the physical volume id of the specified volume. It can be used as a parameter to ring-zero volume and partition interfaces. (Output) lvname is the name of the logical volume to which the physical volume belongs. (Output) lvid is the logical volume id of the logical volume to which the physical volume belongs. (Output) device_type is a number indicating what type of device the specified physical volume is mounted on. The names and characteristics of these devices are listed in various arrays declared in the include file fs_dev_types.incl.pl1. (Output) code is a standard system-status code. It is nonzero if the information about the volume cannot be obtained or if the volume does not exist. (Output) ____ ____ mdc_ mdc_ ____ ____ EEEnnntttrrryyy::: mmmdddccc_$$$rrreeeaaaddd_dddiiissskkk_tttaaabbbllleee This entry point copies out the system's database of disk drives and their use into the user's storage. -WARNING- this is an internal, unsupported interface, subject to change. USAGE declare mdc_$read_disk_table entry (pointer, fixed bin (35)); call mdc_$read_disk_table (temp_seg_ptr, code); ARGUMENTS temp_set_ptr is a pointer to a segment that will be over-written with a copy of the disk table. code is a standard system status code. (Output) ACCESS REQUIRED r access in ring 1 to >disk_table is required. NOTES disk_table.incl.pl1 describes the disk table. EEEnnntttrrryyy::: mmmdddccc_$$$ssseeettt_aaaccccccooouuunnnttt_rrreeessstttrrriiicccttt_pppaaattthhh This entry point manipulates a list of directories into which master directories may be put. System and volume administrators may set specific directories into which master directories may be created by users with quota accounts. USAGE declare mdc_$set_account_restrict_path entry (char(*), char(*), (*)char(*), (*)fixed bin(35), fixed bin, fixed bin(31)); call mdc_$set_account_restrict_path (volume, account, dirs, codes, type, code); ARGUMENTS volume is the logical volume name. (Input) ____ ____ mdc_ mdc_ ____ ____ account is the person.project account name. (Input) dirs is an array of directory pathnames. (Input) codes is an array of status codes, one per entry in dirs. (Output) type (Input) 0 to replace the path list. 1 to add to the path list. 2 to delete from the path list. code is nonzero if any error is encounted. (Output) NOTES The restrict list specifies those directories with which master directories may be appended on this volume by this account. ACCESS REQUIRED Volume access is required. EEEnnntttrrryyy::: mmmdddccc_$$$ssseeettt_mmmdddiiirrr_aaaccccccooouuunnnttt This entry point is used to set the quota account of a master directory. USAGE declare mdc_$set_mdir_account entry (char(*), char(*), char(*), fixed bin(35)); call mdc_$set_mdir_account (dir_name, entryname, account, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the subdirectory. (Input) ____ ____ mdc_ mdc_ ____ ____ account is the name of the new quota account. The directory quota is returned to the old account and redrawn from this new account. code is a standard system status code. (Output) EEEnnntttrrryyy::: mmmdddccc_$$$ssseeettt_mmmdddiiirrr_ooowwwnnneeerrr This entry point is used to set the owner name of a master directory. USAGE declare mdc_$set_mdir_owner entry (char(*), char(*), char(*), fixed bin(35)); call mdc_$set_mdir_owner (dir_name, entryname, owner, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the subdirectory. (Input) owner is the new owner name of the master directory, in the form Person_id.Project_id.tag. (Input) code is a standard system status code. (Output) EEEnnntttrrryyy::: mmmdddccc_$$$ssseeettt_mmmdddiiirrr_qqquuuoootttaaa This entry point is used to set the quota on a master directory. USAGE declare mdc_$set_mdir_quota entry (char(*), char(*), bit(1) aligned, fixed bin, fixed bin(35)); call mdc_$set_mdir_quota (dir_name, entryname, sw, quota, code); ____ ____ mdc_ mdc_ ____ ____ ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the subdirectory. (Input) sw is a switch indicating the kind of quota change. (Input) "0"b sets the directory quota to the quota parameter. "1"b algebraically adds the quota parameter to the current directory quota. quota is the quota to be placed on the new directory. (Input) code is a standard system status code. (Output) EEEnnntttrrryyy::: mmmdddccc_$$$ssseeettt_vvvooollluuummmeee_qqquuuoootttaaa This entry point is used to set the volume quota for a quota account on a logical volume. USAGE declare mdc_$set_volume_quota entry (char(*), char(*), bit(1) aligned, fixed bin, fixed bin(35)); call mdc_$set_volume_quota (volume, account, sw, quota, code); ARGUMENTS volume is the name of the logical volume that is to contain segments created in the new directory. (Input) account is the name of the quota account in the form Person_id.Project_id.tag. The quota account name may contain stars. (Input) sw is a switch indicating the kind of quota change. (Input) "0"b sets the directory quota to the quota parameter. "1"b algebraically adds the quota parameter to the current directory quota. ____ ____ mdc_ mdc_ ____ ____ quota is the quota to be placed on the new directory. (Input) code is a standard system status code. (Output) EEEnnntttrrryyy::: mmmdddccc_$$$ssstttaaatttuuusss This entry point returns information about logical volumes and master directories. USAGE declare mdc_$status entry (char(*), pointer, pointer, fixed bin(35)); call mdc_$status (volume_name, arg, return_info_ptr, code); ARGUMENTS volume_name is the name of a logical volume about which information will be returned. (Input) arg is a pointer to the args structure described in mdc_status_args.incl.pl1. return_info_ptr is a pointer to the volume_data structure declared mdc_status_info.incl.pl1. code is a standard system status code. ACCESS REQUIRED Executive access (rew) is required to the volume to set the executive flag, user access (rw) is used otherwise. ____ ____ mdc_ mdc_ ____ ____ NOTES The structure that argp ptr point to is declared in the include file mdc_status_args.incl.pl1. dcl 1 msargs aligned based (argp), 2 version fixed bin, 2 output_size fixed bin(19), 2 flags 3 exec bit(1) unaligned, 3 dirs bit(1) unaligned, 3 account bit(1) unaligned, 3 owner bit(1) unaligned, 3 backup bit(1) unaligned, 3 restrict bit(1) unaligned, 3 accounting bit(1) unaligned, 3 bill bit(1) unaligned, 2 nnames fixed bin, 2 namesp ptr, 2 output_ptr ptr; STRUCTURE ELEMENTS version must be 1. output_size is the number of words in output space. flags.exec is set if user wants to exercise exec access. flags.dirs is set if user wants info about master directories returned. flags.account is set if user has passed a list of accounts (exec only). Only one of flags.account or flags.owner can be set. flags.owner is set if user has passed a list of owners (exec only). Only one of flags.account or flags.owner can be set. flags.backup is set if backup data wanted (exec only). Must be zero. flags.restrict is set if caller wants restriction paths returned. ____ ____ mdc_ mdc_ ____ ____ flags.accounting is set if caller wants accounting data. nnames is the number of names passed (if account or owner set). namesp is a pointer to the ms_names structure described below. output_ptr is a pointer for unformatted space into which the results will be placed. The volume_data structure described below describes this storage. NAMESP_PTR The structure pointed to by namesp_ptr is declared as follows: dcl 1 ms_names (msargs.nnames) (msargs.namesp) aligned based 2 person char(22) unaligned; 2 project char(9) unaligned; VOLUME_DATAP PTR The structure pointed to by volume_datap is declared as follows: dcl 1 volume_data alligned based (volume datap), 2 version fixed bin, 2 accountp ptr, 2 ownerp ptr, 2 restrictp ptr, 2 defaultp ptr, 2 backup (3) fixed bin(35); STRUCTURE ELEMENTS version must be 1. (Input) accountp pointer to first account_data entry returned. ownerp pointer to list of owner_data entries. restrictp pointer to list of path restrictions. ____ ____ mdc_ mdc_ ____ ____ defaultp pointer to list of path defaults. backup data for backup accounting. Not used, always zero. ACCOUNT_DATAP PTR The structure pointed to by account_datap is declared as follows: dcl 1 account_data aligned based (account_datap), 2 next ptr, 2 name, 3 person char(22) unaligned, 3 project char(9) unaligned, 2 quota fixed bin(18), 2 quota_used fixed bin(18), 2 trp fixed bin(71), 2 backup (31) fixed bin(35), 2 dirp ptr, 2 restrictp ptr; STRUCTURE ELEMENTS account_data structure returned for each quota account. next is the pointer to next one. quota is the total quota available to account. quota_used is the total used currently. trp is the time_record prodecut of deleted directories. backup is the backup account data. Not used. dirp is the pointer to first directory charged against account. restrictp is the pointer to pathname restriction list. ____ ____ mdc_ mdc_ ____ ____ DIR_DATAP_PTR The structure pointed to by dir_datap is declared as follows: dcl 1 dir_data aligned based (dir_datap), 2 next ptr, 2 pathp ptr, 2 name, 3 person char(22) unaligned, 3 project char(9) unaligned, 2 quota fixed bin, 2 backup (3) fixed bin(35); STRUCTURE ELEMENTS dir_data is the structure allocated for each master directory. next is the pointer to next one. pathp is the pointer to pathname entry. quota is the quota allocated to directory. backup is the backup account data. OWNER_DATAP_PTR The structure pointed to by owner_datap_ptr is declared as follows: dcl 1 owner_data aligned based (owner_datap), 2 next ptr, 2 name, 3 person char(22) unaligned, 3 project char(9) unaligned, 2 dirp ptr; STRUCTURE ELEMENTS owner_data is the structure allocated for each master directory owner. name is the owner name. ____ _____ mdc_ mhcs_ ____ _____ dirp is the pointer to list of owners directories. PATH_DATAP_PTR The structure pointed to be path_datap_ptr is declared as follows: dcl 1 path_data aligned based (path_datap), 2 next ptr, 2 code fixed bin(35), 2 dir char(168) unaligned, 2 ename char(32) unaligned; STRUCTURE ELEMENTS path_data one of these is allocated for each pathname. code is the status code from decoding the pathname. ________________________________________ NNNaaammmeee::: mmmhhhcccsss_ EEEnnntttrrryyy::: mmmhhhcccsss_$$$gggeeettt_ssseeeggg_uuusssaaagggeee This entry point returns the number of page faults taken on a segment since its creation. USAGE declare mhcs_$get_seg_usage entry (char(*), char(*), fixed bin(35), fixed bin(35)); call mhcs_$get_seg_usage (dir_name, entryname, use, code); _____ _____ mhcs_ mhcs_ _____ _____ ARGUMENTS dir_name is the directory containing the segment. (Input) entryname is the entry name of the segment. (Input) use is the page fault count. (Output) code is a standard status code. (Output) NOTES This entry point works for segments only and cannot be used to determine the page faults on a directory. EEEnnntttrrryyy::: mmmhhhcccsss_$$$gggeeettt_ssseeeggg_uuusssaaagggeee_ppptttrrr This entry point works the same as mhcs_$get_seg_usage except that it takes a pointer to the segment. USAGE declare mhcs_$get_seg_usage_ptr entry (ptr, fixed bin(35), fixed bin(35)); call mhcs_$get_seg_usage_ptr (s_ptr, use, code); ARGUMENTS s_ptr is a pointer to the segment. (Input) use is the page fault count. (Output) code is a standard status code. (Output) _____ _____ mhcs_ mseg_ _____ _____ NNNaaammmeee::: mmmssseeeggg_ EEEnnntttrrryyy::: mmmssseeeggg_$$$fffiiinnnddd_hhhdddrrr_mmmsssggg This entry, callable only from the ring of the segment, returns a pointer to the header message. USAGE declare mseg_$find_hdr_msg entry (ptr, ptr, fixed bin (18), bit (72) aligned, fixed bin (35)); call mseg_$find_hdr_msg (mseg_ptr, hdr_msg_ptr, hdr_msg_length, hdr_msg_access_class, code); ARGUMENTS mseg_ptr is a pointer to an mseg_ managed segment. (Input) hdr_msg_ptr is a pointer to the header message of segment, if any. (Output) hdr_msg_length is the length, in words, of the data in the header message. (Output) hdr_msg_access_class is the access class of the information stored in the header message. It is the callers responsibility to check this against the process authorization before returning this information out of ring 1. (Output) code will be zero if there was a header message defined, and error_table_$no_message otherwise. (Output) _____ _________________________ mseg_ message_segment_$add_file _____ _________________________ EEEnnntttrrryyy::: mmmssseeeggg_$$$fffiiinnnddd_mmmsssggg This entry is similar to mseg_$priv_read. No area pointer is supplied, because no data is copied. It is the callers responsibility to make all access control checks. USAGE declare mseg_$find_msg entry (ptr, ptr, fixed bin (35)); call mseg_$find_msg (mseg_ptr, mseg_message_info_ptr, code); ARGUMENTS mseg_ptr is a pointer to a mseg_ managed segment. (Input) mseg_message_info_ptr is a pointer to a standard mseg_message_info structure, as declared in mseg_message_info.incl.pl1. On output, the fields ms_ptr and ms_len are set to the actual location and length of the message text in the segment. The other output fields are set as usual. (Input, but fields output) code is a standard system status code. It will be error_table_$no_message if the requested message could not be located. (Output) ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$aaadddddd_fffiiillleee The add_file entrypoint places an arbitrary message in a message segment. USAGE declare message_segment_$add_file entry (char (*), char (*), ptr, fixed bin(24), bit(72) aligned, fixed bin(35)); call message_segment_$add_file (dir_name, entry_name, message_ptr, message_len, message_id, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) _________________________ __________________________ message_segment_$add_file message_segment_$add_index _________________________ __________________________ entry_name is the name of the message segment (Input). message_ptr is a pointer to an arbitrary bit string, which is the text of the message. (Input) message_len is the length of the message in bits. (Input) message_id is a value identifying the message in the message segment, which can be used to reference the message in subsequent calls to message segment. code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have "a" extended access to the message segment to add a message. The authorization of the calling process must dominate the access class of the parent of the message segment. The authorization of the calling process must be dominated by the access class of the message segment segment. ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$aaadddddd_iiinnndddeeexxx The add_index entrypoint places an arbitrary message in a message segment. USAGE declare message_segment_$add_index entry (fixed bin, ptr, fixed bin(24), bit(72) aligned, fixed bin(35)); call message_segment_$add_index (mseg_index, message_ptr, message_len, message_id, code); __________________________ ____________________________ message_segment_$add_index message_segment_$chname_file __________________________ ____________________________ ARGUMENTS mseg_index is the value returned from a call to message_segment_$open, identifying the message segment into which a message is to be added. message_ptr is a pointer to an arbitrary bit string, which is the text of the message. (Input) message_len is the length of the message in bits. (Input) message_id is a value identifying the message in the message segment, which can be used to reference the message in subsequent calls to message segment. code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have "a" extended access to the message segment to add a message. The authorization of the calling process must dominate the access class of the parent of the message segment. The authorization of the calling process must be dominated by the access class of the message segment segment. ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$ccchhhnnnaaammmeee_fffiiillleee The chname_file entrypoint changes the entry name on a specified message segment. If an already existing name (an old name) is specified, it is deleted from the entry; if a new name is specified, it is added. Thus, if only an old name is specified, the effect is to delete a name; if only a new name is specified, the effect is to add a name; and if both are specified, the effect is to rename the entry. ____________________________ ____________________________ message_segment_$chname_file message_segment_$chname_file ____________________________ ____________________________ USAGE declare message_segment_$chname_file entry (char(*), char(*), char(*), char(*), fixed bin(35)); call message_segment_$chname_file (dir_name, entry_name, old_entry_name, new_entry_name, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the message segment. (Input) old_entry_name is the name to be deleted from the message segment. (Input) It can be a null character string ("") in which case no name is deleted. If oldname is null, then newname must not be null. new_entry_name is the name to be added to the entry. (Input) It must not already exist in the directory on this or another entry. It can be a null character string ("") in which case no name is added. If it is null, then oldname must not be the only name on the entry. code is a storage system status code. (Output) It can have the values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$nonamerr attempting to delete the only name of a directory entry. error_table_$namedup attempting to add a name that exists on another entry. error_table_$segnamedup attempting to add a name that already exists on this entry. ACCESS REQUIRED The calling process must have modify access to the parent of the message segment. The authorization of the calling process must equal the access class of the parent of the message segment. ____________________________ ____________________________________ message_segment_$chname_file message_segment_$check_salv_bit_file ____________________________ ____________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$ccchhheeeccckkk_sssaaalllvvv_bbbiiittt_fffiiillleee The check_salv_bit_file entrypoint returns the value of the salvaged bit of a message segment; in addition, it can be used to turn the bit off if found on. USAGE declare message_segment_$check_salv_bit_file entry (char (*), char (*), bit(1) aligned, bit(1) aligned, fixed bin(35)); call message_segment_$check_salv_bit_file (dir_name, entry_name, turn_off, salv_bit, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the message segment. (Input) turn_off is a flag which, if set to true, turns off the salvaged bit if it is on. (Input) salv_bit is the value of the salvaged bit prior to the call. (Output) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have "s" extended access to the message segment to obtain the value of the salvaged bit. It must have "d" extended access to turn the salvaged bit off. The authorization of the process must dominate the access class of the parent of the message segment. ____________________________________ _____________________ message_segment_$check_salv_bit_file $check_salv_bit_index ____________________________________ _____________________ NNNaaammmeee::: $$$ccchhheeeccckkk_sssaaalllvvv_bbbiiittt_iiinnndddeeexxx The check_salv_bit_index entrypoint returns the value of the salvaged bit of a message segment; in addition, it can be used to turn the bit off if found on. USAGE declare message_segment_$check_salv_bit_index entry (fixed bin, bit(1) aligned, bit(1) aligned, fixed bin(35)); call message_segment_$check_salv_bit_index (mseg_index, turn_off, salv_bit, code); ARGUMENTS mseg_index is the value returned from a call to message_segment_$open, identifying the message segment from which the salvaged bit is to be obtained and possibly turned off. (Input) turn_off is a flag which, if set to true, turns of the salvaged bit if it is on. (Input) salv_bit is the value of the salvaged bit prior to the call. (Output) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have "s" extended access to the message segment to obtain the value of the salvaged bit. It must have "d" extended access to turn the salvaged bit off. The authorization of the process must dominate the access class of the parent of the message segment. _____________________ _____________________________ $check_salv_bit_index message_segment_$compact_file _____________________ _____________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$ccclllooossseee The close entrypoint terminates the relationship between a message segment index and a message segment. USAGE declare message_segment_$close entry (fixed bin, fixed bin(35)); call message_segment_$close (mseg_index, code); ARGUMENTS mseg_index is the value returned froma call to message_segment_$open, used to identify a specific message segment. (Input) code is a standard system status code. (Output) ACCESS REQUIRED No explicit access is required to sucessfully execute this entrypoint. ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$cccooommmpppaaacccttt_fffiiillleee The compact_file entrypoint eliminates unused space in a message segment, compressing its size to reflect storage actually filled with messages. USAGE declare message_segment_$compact_file entry (char(*), char(*), float bin(27), fixed bin(35)); call message_segment_$compact_file (dir_name, entry_name, compaction_ratio, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the message segment. (Input) _____________________________ ______________________________ message_segment_$compact_file message_segment_$compact_index _____________________________ ______________________________ compaction_ratio is a value used to determine whether or not to perform the compaction. (Input) If the ratio of unused space to used space exceeds the argument value, the segment is compacted. If the compaction ratio is negative, the compaction always performed. code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have "d" extended access to the message segment. The authorization of the calling process must be equal to the access class of the parent of the message segment. ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$cccooommmpppaaacccttt_iiinnndddeeexxx The compact_index entrypoint eliminates unused space in a message segment, compressing its size to reflect storage actually filled with messages. USAGE declare message_segment_$compact_index entry (fixed bin, float bin(27), fixed bin(35)); call message_segment_$compact_index (mseg_index, compaction_ratio, code); ARGUMENTS mseg_index is the value returned from a call to message_segment_$open, identifying the message segment to be compacted. (Input) compaction_ratio is a value used to determine whether or not to perform the compaction. (Input) If the ratio of unused space to used space exceeds the argument value, the segment is compacted. If the compaction ratio is negative, the compaction always performed. ______________________________ _____________________ message_segment_$compact_index message_segment_$copy ______________________________ _____________________ code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have "d" extended access to the message segment. The authorization of the calling process must be equal to the access class of the parent of the message segment. ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$cccooopppyyy The copy entrypoint copies the contents of an existing message segment into a new message segment. USAGE declare message_segment_$copy entry (char (*), char (*), char (*), char (*), bit (1) aligned, fixed bin (35)); call message_segment_$copy (source_dir_name, source_entry_name, target_dir_name, target_entry_name, error_on_target, code); ARGUMENTS source_dir_name is the pathname of the directory that contains the message segment to be copied. (Input) source_entry_name is the name of the message segment to be copied. (Input) target_dir_name is the pathname of the directory that is to contain a copy of the source message segment. (Input) target_entry_name is the name of the new message segment. (Input) error_on_target is a flag indicating that the difficulties in copying the message segment were due to the target message segment. (Output) _____________________ _______________________ message_segment_$copy message_segment_$create _____________________ _______________________ code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have "r" extended access to the source message segment, and "ma" access to the target directory. The authorization of the calling process must equal the access class of BOTH the source and target directories. The maximum authorization of the calling process must dominate the access class of the source message segment. NOTES The target message segment must not exist before this entrypoint is called. ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$cccrrreeeaaattteee The create entrypoint creates a message segment in a given directory. USAGE declare message_segment_$create entry (char(*), char(*), fixed bin(35)); call message_segment_$create (dir_name, entry_name, code); ARGUMENTS dir_name is the pathname of the directory which is to contain the message segment. (Input) entry_name is the name of the message segment to be created. (Input) code is a standard system status code. (Output) It can have the following values: _______________________ _______________________ message_segment_$create message_segment_$delete _______________________ _______________________ error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have append and modify access to the directory which is to contain the message segment. The authorization of the calling process must equal the access class of the directory which is to contain the message segment. NOTES The message segment is created with default extended modes of "adros" for the caller's person ID and "ao" for "*.SysDaemon.*". The access class range of the message segment is defined at the lower bound by the access class of the parent directory and at the upper bound by the maximum authorization of the calling process. ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$dddeeellleeettteee The delete entrypoint deletes a message segment from hierarchy. USAGE declare message_segment_$delete entry (char(*), char(*), fixed bin(35)); call message_segment_$delete (dir_name, entry_name, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the message segment to be deleted. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. _______________________ ____________________________ message_segment_$delete message_segment_$delete_file _______________________ ____________________________ ACCESS REQUIRED The calling process must have modify access to the parent of the message segment. The authorization of the calling process must be equal to the access class of the parent of the message segment. ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$dddeeellleeettteee_fffiiillleee The delete_file entrypoint deletes a specified message in a message segment. USAGE declare message_segment_$delete_file entry (char (*), char (*), bit(72) aligned, fixed bin(35)); call message_segment_$delete_file (dir_name, entry_name, message_id, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the message segment. (Input) message_id is the identifier of the message to be deleted. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ACCESS REQUIRED The calling process must have "d" extended access to the message segment to delete an arbitrary message; alternatively, "o" extended access will permit the process to delete a message that was added by the user. The authorization of the calling process ____________________________ _____________________________ message_segment_$delete_file message_segment_$delete_index ____________________________ _____________________________ must equal the access class of the message to be deleted. The authorization of the calling process must dominate the parent of the message segment that contains the message. The calling process must have "d" extended access to the message segment to delete an arbitrary message; alternatively, "o" extended access will permit the process to delete a message that was added by the user. The authorization of the calling process must equal the access class of the message to be deleted. The authorization of the calling process must dominate the parent of the message segment that contains the message. The authorization of the calling process must be dominated bythe access class of the message segment. ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$dddeeellleeettteee_iiinnndddeeexxx The delete_index entrypoint deletes a specified message in a message segment. USAGE declare message_segment_$delete_index entry (fixed bin, bit(72) aligned, fixed bin(35)); call message_segment_$delete_index (mseg_index, message_id, code); ARGUMENTS mseg_index is the value returned from a call to message_segment_$open, identifying the message segment which contains the message to be deleted. (Input) message_id is the identifier of the message to be deleted. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. _____________________________ ______________________________ message_segment_$delete_index message_segment_$get_mode_file _____________________________ ______________________________ ACCESS REQUIRED The calling process must have "d" extended access to the message segment to delete an arbitrary message; alternatively, "o" extended access will permit the process to delete a message that was added by the user. The authorization of the calling process must equal the access class of the message to be deleted. The authorization of the calling process must dominate the parent of the message segment that contains the message. The authorization of the calling process must be dominated bythe access class of the message segment. ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$gggeeettt_mmmooodddeee_fffiiillleee The get_mode_file entrypoint returns the effective extended access the caller has to a message segment. USAGE declare message_segment_$get_mode_file entry (char(*), char(*), bit(36) aligned, fixed bin(35)); call message_segment_$get_mode_file (dir_name, entry_name, modes, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the message segment. (Input) modes is a bit string describing the effective extended access the process has to the message segment. (Output) The bit string is described in the include file mseg_access_mode_values.incl.pl1. code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ______________________________ _______________________________ message_segment_$get_mode_file message_segment_$get_mode_index ______________________________ _______________________________ ACCESS REQUIRED The calling process must have either a minimum of status access to the parent of the message segment or non-null extended access to the message segment itself. The authorization of the calling process must dominate the access class of the parent of the message segment. ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$gggeeettt_mmmooodddeee_iiinnndddeeexxx The get_mode_index entrypoint returns the effective extended access the caller has to a message segment. USAGE declare message_segment_$get_mode_index entry (fixed bin, bit(36) aligned, fixed bin(35)); call message_segment_$get_mode_index (mseg_index, modes, code); ARGUMENTS mseg_index is the value returned from a call to message_segment_$open, identifying the message segment for which modes are to be obtained. (Input) modes is a bit string describing the effective extended access the process has to the message segment. (Output) The bit string is described in the include file mseg_access_mode_values.incl.pl1. code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. _______________________________ _______________________ message_segment_$get_mode_index $get_message_count_file _______________________________ _______________________ ACCESS REQUIRED The calling process must have either a minimum of status access to the parent of the message segment or non-null extended access to the message segment itself. The authorization of the calling process must dominate the access class of the parent of the message segment. ________________________________________ NNNaaammmeee::: $$$gggeeettt_mmmeeessssssaaagggeee_cccooouuunnnttt_fffiiillleee The get_message_count_file entrypoint returns the number of messages present in a message segment that are accessible to the calling process. USAGE declare message_segment_$get_message_count_file entry (char (*), char (*), fixed bin, fixed bin(35)); call message_segment_$get_message_count_file (dir_name, entry_name, message_count, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the message segment. (Input) message_count is the number of messages accessible to the calling process. (Output) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. _______________________ ________________________ $get_message_count_file $get_message_count_index _______________________ ________________________ ACCESS REQUIRED The calling process must have "s" extended access to the message segment in order to obtain its message count. The authorization of the calling process must dominate the access class of the parent of the message segment. ________________________________________ NNNaaammmeee::: $$$gggeeettt_mmmeeessssssaaagggeee_cccooouuunnnttt_iiinnndddeeexxx The get_message_count_index entrypoint returns the number of messages present in a message segment that are accessible to the calling process. USAGE declare message_segment_$get_message_count_index entry (fixed bin, fixed bin, fixed bin(35)); call message_segment_$get_message_count_index (mseg_index, message_count, code); ARGUMENTS mseg_index is the value returned from a call to message_segment_$open, identifying the message segment from which the count is to be obtained. (Input) message_count is the number of messages accessible to the calling process. (Output) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have "s" extended access to the message segment in order to obtain its message count. The authorization of the calling process must dominate the access class of the parent of the message segment. ________________________ ______________________ $get_message_count_index $incremental_read_file ________________________ ______________________ NNNaaammmeee::: $$$iiinnncccrrreeemmmeeennntttaaalll_rrreeeaaaddd_fffiiillleee The incremental_read_file entrypoint obtains a message from a message segment relative to the message specified in its argument list. USAGE declare message_segment_$incremental_read_file entry (char (*), char (*), ptr, bit(2) aligned, bit(72) aligned, ptr, fixed bin(35)); call message_segment_$incremental_read_file (dir_name, entry_name, area_ptr, direction, message_id, ms_arg_ptr, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the message segment. (Input) area_ptr is a pointer to an area where message segment can allocate the message. (Input) direction is a bit string specifying the message to be returned, relative to that specified by the message identifier. (Input) A value of "00"b selects the specified message. A value of "10"b selectes the message before the specified one. A value of "01"b selects the message after the specified one. message_id is the identifier of the message that serves as a reference point for the selection. (Input) ms_arg_ptr is a pointer to the structure mseg_return_args, which will be filled in with information about the selected message. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. ______________________ ______________________ $incremental_read_file $incremental_read_file ______________________ ______________________ error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ACCESS REQUIRED The caller must have "r" extended access to the message segment to read a message from it. The authorization of the caller must both dominate the access class of the parent of the message segment and dominate the access class of the message for the message to be returned. NOTES The structure "mseg_return_args" is declared in the include file mseg_return_args.incl.pl1, and is defined as follows: dcl ms_arg_ptr pointer; dcl 1 mseg_return_args aligned based (ms_arg_ptr), 2 ms_ptr pointer, 2 ms_len fixed bin (24), 2 sender_id char (32) unaligned, 2 level fixed bin, 2 ms_id bit (72), 2 sender_authorization bit (72), 2 access_class bit (72); Where: ms_ptr is a pointer to the message. ms_len is the length of the message in bits. sender_id is the process group ID of the sending process. level is the validation level of the sending process. ms_id is the unique ID of the message. sender_authorization is the access authorization of the sending process. ______________________ _______________________ $incremental_read_file $incremental_read_index ______________________ _______________________ access_class is the access class of the message. ________________________________________ NNNaaammmeee::: $$$iiinnncccrrreeemmmeeennntttaaalll_rrreeeaaaddd_iiinnndddeeexxx The incremental_read_index entrypoint obtains a message from a message segment relative to the message specified in its argument list. USAGE declare message_segment_$incremental_read_index entry (fixed bin, ptr, bit(2) aligned, bit(72) aligned, ptr, fixed bin(35)); call message_segment_$incremental_read_index (mseg_index, area_ptr, direction, message_id, ms_arg_ptr, code); ARGUMENTS mseg_index is the value returned from a call to message_segment_$open, identifying the message segment from which the message is to be obtained. (Input) area_ptr is a pointer to an area where message segment can allocate the message. (Input) direction is a bit string specifying the message to be returned, relative to that specified by the message identifier. (Input) A value of "00"b selects the specified message. A value of "10"b selectes the message before the specified one. A value of "01"b selects the message after the specified one. message_id is the identifier of the message that serves as a reference point for the selection. (Input) ms_arg_ptr is a pointer to the structure mseg_return_args, which will be filled in with information about the selected message. (Input) code is a standard system status code. (Output) It can have the _______________________ _______________________ $incremental_read_index $incremental_read_index _______________________ _______________________ following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ACCESS REQUIRED The caller must have "r" extended access to the message segment to read a message from it. The authorization of the caller must both dominate the access class of the parent of the message segment and dominate the access class of the message for the message to be returned. NOTES The structure "mseg_return_args" is declared in the include file mseg_return_args.incl.pl1, and is defined as follows: dcl ms_arg_ptr pointer; dcl 1 mseg_return_args aligned based (ms_arg_ptr), 2 ms_ptr pointer, 2 ms_len fixed bin (24), 2 sender_id char (32) unaligned, 2 level fixed bin, 2 ms_id bit (72), 2 sender_authorization bit (72), 2 access_class bit (72); Where: ms_ptr is a pointer to the message. ms_len is the length of the message in bits. sender_id is the process group ID of the sending process. level is the validation level of the sending process. ms_id is the unique ID of the message. _______________________ ___________________________ $incremental_read_index message_segment_$ms_acl_add _______________________ ___________________________ sender_authorization is the access authorization of the sending process. access_class is the access class of the message. ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$mmmsss_aaaccclll_aaadddddd This entry point adds specified access modes to the access control list (ACL) of the specified message segment. If an access name already appears on the ACL of the message segment, its mode is changed to the one specified by the call. USAGE declare message_segment_$ms_acl_add entry (char(*), char(*), ptr, fixed bin, fixed bin(35)); call message_segment_$ms_acl_add (dir_name, entry_name, acl_ptr, acl_count, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the entry name of the message segment. (Input) acl_ptr points to a user-filled segment_acl_array structure (see "Entry Information" below). (Input) acl_count contains the number of ACL entries in the segment_acl_array structure (see "Entry Information" below). (Input) code is a storage system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ___________________________ ___________________________ message_segment_$ms_acl_add message_segment_$ms_acl_add ___________________________ ___________________________ ENTRY INFORMATION The segment_acl_array structure should be declared in the following way: dcl 1 segment_acl_array (acl_count) aligned like segment_acl_entry; The segment_acl_entry structure (declared in the include file acl_structures.incl.pl1) is as follows: dcl 1 segment_acl_entry aligned based, 2 access_name char(32) unaligned, 2 mode bit(36) aligned, 2 extended_mode bit(36) aligned, 2 status_code fixed bin(35); STRUCTURE ELEMENTS access_name is the access name (in the form Person_id.Project_id.tag) that identifies the processes to which this ACL entry applies. mode should contain the value "0"b. extended_mode contains the extended modes for this access name. The include file mseg_access_mode_values.incl.pl1 defines mnemonics for these values: dcl (MSEG_A_ACCESS initial ("400000000000"b3), MSEG_D_ACCESS initial ("200000000000"b3), MSEG_R_ACCESS initial ("100000000000"b3), MSEG_O_ACCESS initial ("040000000000"b3), MSEG_S_ACCESS initial ("020000000000"b3)) bit (36) aligned static options (constant); status_code is a standard system status code for this ACL entry only. NOTES If code is returned as error_table_$argerr, then the erroneous ACL entries in the segment_acl structure have status_code set to an appropriate error code. No processing is performed. ___________________________ ______________________________ message_segment_$ms_acl_add message_segment_$ms_acl_delete ___________________________ ______________________________ ACCESS REQUIRED The calling process must have modify access to the parent of the message segment. The authorization of the calling process must be equal to the access class of the parent of the message segment. ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$mmmsss_aaaccclll_dddeeellleeettteee This entry point deletes specified entries from an access control list (ACL) for a message segment. USAGE declare message_segment_$ms_acl_delete entry (char(*), char(*), ptr, fixed bin, fixed bin(35)); call message_segment_$ms_acl_delete (dir_name, entryname, acl_ptr, acl_count, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the message segment. (Input) acl_ptr points to a user-filled delete_acl_array structure (see "Entry Information" below). (Input) acl_count is the number of ACL entries in the delete_acl_array structure (see "Entry Information" below). (Input) code is a storage system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ______________________________ ______________________________ message_segment_$ms_acl_delete message_segment_$ms_acl_delete ______________________________ ______________________________ ENTRY INFORMATION The delete_acl_array structure should be declared in the following way: dcl 1 delete_acl_array (acl_count) aligned like delete_acl_entry; The delete_acl_entry structure (declared in the include file acl_structures.incl.pl1) is as follows: dcl 1 delete_acl_entry aligned based, 2 access_name char(32) unaligned, 2 status_code fixed bin(35); STRUCTURE ELEMENTS access_name is the access name (in the form of Person_id.Project_id.tag) that identifies the ACL entry to be deleted. status_code is a storage system status code for this ACL entry only. NOTES If code is returned as error_table_$argerr, then the erroneous ACL entries in the delete_acl_array structure have status_code set to an appropriate error code. No processing is performed. If an access name cannot be matched to a name already on the ACL of the message segment, then the status_code for that ACL entry in the delete_acl_array structure is set to error_table_$user_not_found. Processing continues to the end of the delete_acl_array structure and code is returned as 0. ACCESS REQUIRED The calling process must have modify access to the parent of the message segment. The authorization of the calling process must equal the access class of the parent of the message segment. ______________________________ ____________________________ message_segment_$ms_acl_delete message_segment_$ms_acl_list ______________________________ ____________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$mmmsss_aaaccclll_llliiisssttt This entry point is used either to list the entire access control list (ACL) of a message segment or to return the access modes of specified ACL entries. The segment_acl_array structure used by this entry point is discussed in the description of message_segment_$ms_acl_add. USAGE declare message_segment_$ms_acl_list entry (char(*), char(*), ptr, fixed bin, ptr, fixed bin(35)); call message_segment_$ms_acl_list (dir_name, entryname, user_acl_ptr, user_acl_count, area_ptr, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the message segment. (Input) user_acl_ptr points to an ACL structure, segment_acl_array, which contains mode information. (Input or Output) Input (area_ptr is null) points to a structure supplied by the caller, containing access names about which information is to be returned in that same structure. Output (area_ptr is not null) points to a structure allocated in the area pointed to by area_ptr into which mode information for all access names is placed. user_acl_count is the number of entries in the ACL structure. (Input or Output) Input is the number of entries in the ACL structure identified by acl_ptr. Output is the number of entries in the segment_acl_array structure allocated in the area pointed to by area_ptr, if area_ptr is not null. area_ptr points to an area in which the list of ACL entries, which make ____________________________ _______________________________ message_segment_$ms_acl_list message_segment_$ms_acl_replace ____________________________ _______________________________ up the entire ACL of the message segment, is allocated. (Input) If area_ptr is null, then the user wants access modes for certain ACL entries; these will be specified by the structure pointed to by user_acl_ptr (see below). code is a storage system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. NOTES If user_acl_ptr is used to obtain modes for specified access names (rather than for all access names on a message segment), then each ACL entry in the segment_acl_array structure either has status_code set to 0 and contains the message segment's mode or has status_code set to error_table_$user_not_found and contains a mode of 0. ACCESS REQUIRED The calling process must have modify access to the parent of the message segment. The authorization of the calling process must dominate the access class of the parent of the message segment. ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$mmmsss_aaaccclll_rrreeeppplllaaaccceee This entry point replaces an entire access control list (ACL) for a message segment with a user-provided ACL, and can optionally add an entry for *.SysDaemon.* with mode rw to the new ACL. The segment_acl_array structure described in message_segment_$ms_acl_add is used by this entry point. USAGE declare message_segment_$ms_acl_replace entry (char(*), char(*), ptr, fixed bin, fixed bin(35)); call message_segment_$ms_acl_replace (dir_name, entryname, acl_ptr, acl_count, code); _______________________________ _______________________________ message_segment_$ms_acl_replace message_segment_$ms_acl_replace _______________________________ _______________________________ ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the message segment. (Input) acl_ptr points to the user supplied segment_acl_array structure that is to replace the current ACL. (Input) acl_count is the number of entries in the segment_acl_array structure. (Input) code is a storage system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. NOTES If acl_count is zero, then the existing ACL is deleted. If acl_count is greater than zero, processing of the segment_acl_array entries is performed top to bottom, allowing later entries to overwrite previous ones if the access_name in the segment_acl_array structure is identical. ACCESS REQUIRED The calling process must have modify access to the parent of the message segment. The authorization of the calling process must be equal to the access class of the parent of the message segment. _______________________________ _____________________ message_segment_$ms_acl_replace message_segment_$open _______________________________ _____________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$ooopppeeennn The open entrypoint associates a specified message segment with a message segment index, allowing for more efficient processing of message segment functions during subsequent calls to message segment. USAGE declare message_segment_$open entry (char (*), char (*), fixed bin, fixed bin (35)); call message_segment_$open (dir_name, entry_name, mseg_index, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the message segment. (Input) mseg_index is a value which will identify the message segment until a call to message_segment_$close is performed. (Output) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have non-null extended access to the message segment. The authorization of the calling process must dominate the access class of the parent directory. The authorization of the calling process must be dominated by the access class of the mailbox. _____________________ __________________________ message_segment_$open $own_incremental_read_file _____________________ __________________________ NNNaaammmeee::: $$$ooowwwnnn_iiinnncccrrreeemmmeeennntttaaalll_rrreeeaaaddd_fffiiillleee The own_incremental_read_file entrypoint obtains a message originally added to a message segment by the user, relative to the message specified in the argument list. USAGE declare message_segment_$own_incremental_read_file entry (char (*), char (*), ptr, bit(2) aligned, bit(72) aligned, ptr, fixed bin(35)); call message_segment_$own_incremental_read_file (dir_name, entry_name, area_ptr, direction, message_id, ms_arg_ptr, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the message segment. (Input) area_ptr is a pointer to an area where message segment can allocate the message. (Input) direction is a bit string specifying the message to be returned, relative to that specified by the message identifier. (Input) A value of "00"b selects the specified message. A value of "10"b selects the message before the specified one. A value of "01"b selects the message after the specified one. message_id is the identifier of the message that serves as a reference point for the selection. (Input) ms_arg_ptr is a pointer to the structure mseg_return_args, which will be filled in with information about the selected message. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. __________________________ __________________________ $own_incremental_read_file $own_incremental_read_file __________________________ __________________________ error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ACCESS REQUIRED The caller must have either "r" or "o" extended access to the message segment to read a message from it. The authorization of the caller must both dominate the access class of the parent of the message segment and dominate the access class of the message for the message to be returned. NOTES The structure "mseg_return_args" is declared in the include file mseg_return_args.incl.pl1, and is defined as follows: dcl ms_arg_ptr pointer; dcl 1 mseg_return_args aligned based (ms_arg_ptr), 2 ms_ptr pointer, 2 ms_len fixed bin (24), 2 sender_id char (32) unaligned, 2 level fixed bin, 2 ms_id bit (72), 2 sender_authorization bit (72), 2 access_class bit (72); Where: ms_ptr is a pointer to the message. ms_len is the length of the message in bits. sender_id is the process group ID of the sending process. level is the validation level of the sending process. ms_id is the unique ID of the message. sender_authorization is the access authorization of the sending process. __________________________ ___________________________ $own_incremental_read_file $own_incremental_read_index __________________________ ___________________________ access_class is the access class of the message. ________________________________________ NNNaaammmeee::: $$$ooowwwnnn_iiinnncccrrreeemmmeeennntttaaalll_rrreeeaaaddd_iiinnndddeeexxx The own_incremental_read_index entrypoint obtains a message originally added to a message segment by the user, relative to the message specified in the argument list. USAGE declare message_segment_$own_incremental_read_index entry (fixed bin, ptr, bit(2) aligned, bit(72) aligned, ptr, fixed bin(35)); call message_segment_$own_incremental_read_index (mseg_index, area_ptr, direction, message_id, ms_arg_ptr, code); ARGUMENTS mseg_index is the value returned from a call to message_segment_$open, identifying the message segment from which the message is to be obtained. (Input) area_ptr is a pointer to an area where message segment can allocate the message. (Input) direction is a bit string specifying the message to be returned, relative to that specified by the message identifier. (Input) A value of "00"b selects the specified message. A value of "10"b selects the message before the specified one. A value of "01"b selects the message after the specified one. message_id is the identifier of the message that serves as a reference point for the selection. (Input) ms_arg_ptr is a pointer to the structure mseg_return_args, which will be filled in with information about the selected message. (Input) code is a standard system status code. (Output) It can have the ___________________________ ___________________________ $own_incremental_read_index $own_incremental_read_index ___________________________ ___________________________ following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ACCESS REQUIRED The caller must have either "r" or "o" extended access to the message segment to read a message from it. The authorization of the caller must both dominate the access class of the parent of the message segment and dominate the access class of the message for the message to be returned. NOTES The structure "mseg_return_args" is declared in the include file mseg_return_args.incl.pl1, and is defined as follows: dcl ms_arg_ptr pointer; dcl 1 mseg_return_args aligned based (ms_arg_ptr), 2 ms_ptr pointer, 2 ms_len fixed bin (24), 2 sender_id char (32) unaligned, 2 level fixed bin, 2 ms_id bit (72), 2 sender_authorization bit (72), 2 access_class bit (72); Where: ms_ptr is a pointer to the message. ms_len is the length of the message in bits. sender_id is the process group ID of the sending process. level is the validation level of the sending process. ms_id is the unique ID of the message. ___________________________ ______________________________ $own_incremental_read_index message_segment_$own_read_file ___________________________ ______________________________ sender_authorization is the access authorization of the sending process. access_class is the access class of the message. ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$ooowwwnnn_rrreeeaaaddd_fffiiillleee The own_read_file entrypoint returns a message originally added by the user from a message segment. USAGE declare message_segment_$own_read_file entry (char (*), char (*), ptr, bit(1) aligned, ptr, fixed bin(35)); call message_segment_$own_read_file (dir_name, entry_name, area_ptr, message_wanted, ms_arg_ptr, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the message segment. (Input) area_ptr is a pointer to an area where message segment can allocate the message. (Input) message_wanted is a flag indicating which message is wanted. (Input) If "0"b, the first message found is returned; if "1"b, the last is returned. ms_arg_ptr is a pointer to the structure "mseg_return_args", which will be filled in with information about the selected message. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. ______________________________ ______________________________ message_segment_$own_read_file message_segment_$own_read_file ______________________________ ______________________________ error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ACCESS REQUIRED The caller must have either "r" or "o" extended access to the message segment to read its own message. The authorization of the caller must both dominate the access class of the parent of the message segment and dominate the access class of the message to be returned. NOTES The structure "mseg_return_args" is declared in the include file mseg_return_args.incl.pl1, and is defined as follows: dcl ms_arg_ptr pointer; dcl 1 mseg_return_args aligned based (ms_arg_ptr), 2 ms_ptr pointer, 2 ms_len fixed bin (24), 2 sender_id char (32) unaligned, 2 level fixed bin, 2 ms_id bit (72), 2 sender_authorization bit (72), 2 access_class bit (72); Where: ms_ptr is a pointer to the message. ms_len is the length of the message in bits. sender_id is the process group ID of the sending process. level is the validation level of the sending process. ms_id is the unique ID of the message. sender_authorization is the access authorization of the sending process. ______________________________ _______________________________ message_segment_$own_read_file message_segment_$own_read_index ______________________________ _______________________________ access_class is the access class of the message. ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$ooowwwnnn_rrreeeaaaddd_iiinnndddeeexxx The own_read_index entrypoint returns a message originally added by the user from a message segment. USAGE declare message_segment_$own_read_index entry (fixed bin, ptr, bit(1) aligned, ptr, fixed bin(35)); call message_segment_$own_read_index (mseg_index, area_ptr, message_wanted, ms_arg_ptr, code); ARGUMENTS mseg_index is the value returned from message_segment_$open, identifying the message segment from which the message is to be obtained. (Input) area_ptr is a pointer to an area where message segment can allocate the message. (Input) message_wanted is a flag indicating which message is wanted. (Input) If "0"b, the first message found is returned; if "1"b, the last is returned. ms_arg_ptr is a pointer to the structure "mseg_return_args", which will be filled in with information about the selected message. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. _______________________________ _______________________________ message_segment_$own_read_index message_segment_$own_read_index _______________________________ _______________________________ ACCESS REQUIRED The caller must have either "r" or "o" extended access to the message segment to read its own message. The authorization of the caller must both dominate the access class of the parent of the message segment and dominate the access class of the message to be returned. NOTES The structure "mseg_return_args" is declared in the include file mseg_return_args.incl.pl1, and is defined as follows: dcl ms_arg_ptr pointer; dcl 1 mseg_return_args aligned based (ms_arg_ptr), 2 ms_ptr pointer, 2 ms_len fixed bin (24), 2 sender_id char (32) unaligned, 2 level fixed bin, 2 ms_id bit (72), 2 sender_authorization bit (72), 2 access_class bit (72); Where: ms_ptr is a pointer to the message. ms_len is the length of the message in bits. sender_id is the process group ID of the sending process. level is the validation level of the sending process. ms_id is the unique ID of the message. sender_authorization is the access authorization of the sending process. access_class is the access class of the message. _______________________________ _________________ message_segment_$own_read_index $read_delete_file _______________________________ _________________ NNNaaammmeee::: $$$rrreeeaaaddd_dddeeellleeettteee_fffiiillleee The read_delete_file entrypoint returns a message from a message segment and deletes it from the message segment. USAGE declare message_segment_$read_delete_file entry (char (*), char (*), ptr, bit(1) aligned, ptr, fixed bin(35)); call message_segment_$read_delete_file (dir_name, entry_name, area_ptr, message_wanted, ms_arg_ptr, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the message segment. (Input) area_ptr is a pointer to an area where message segment can allocate the message. (Input) message_wanted is a flag indicating which message is wanted. (Input) If "0"b, the first message found is returned; if "1"b, the last is returned. ms_arg_ptr os a pointer to the structure "mseg_return_args", which will be filled in with information about the selected message. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. _________________ _________________ $read_delete_file $read_delete_file _________________ _________________ ACCESS REQUIRED The calling process must have both "r" and "d" extended access to the message segment in order to read and delete a message. The authorization of the process must dominate the access class of the parent of the message segment and must be dominated by the access class of the message segment. In addition, the authorization of the calling process must be equal to the access class of the message to be read and deleted. If the process authorization dominates the message access class, then the code error_table_$ai_restricted will be returned. NOTES The structure "mseg_return_args" is declared in the include file mseg_return_args.incl.pl1, and is defined as follows: dcl ms_arg_ptr pointer; dcl 1 mseg_return_args aligned based (ms_arg_ptr), 2 ms_ptr pointer, 2 ms_len fixed bin (24), 2 sender_id char (32) unaligned, 2 level fixed bin, 2 ms_id bit (72), 2 sender_authorization bit (72), 2 access_class bit (72); Where: ms_ptr is a pointer to the message. ms_len is the length of the message in bits. sender_id is the process group ID of the sending process. level is the validation level of the sending process. ms_id is the unique ID of the message. sender_authorization is the access authorization of the sending process. access_class is the access class of the message. _________________ __________________ $read_delete_file $read_delete_index _________________ __________________ NNNaaammmeee::: $$$rrreeeaaaddd_dddeeellleeettteee_iiinnndddeeexxx The read_delete_index entrypoint returns a message from a message segment and deletes it from the message segment. USAGE declare message_segment_$read_delete_index entry (fixed bin, ptr, bit(1) aligned, ptr, fixed bin(35)); call message_segment_$read_delete_index (mseg_index, area_ptr, message_wanted, ms_arg_ptr, code); ARGUMENTS mseg_index is the value returned from message_segment_$open, identifying the message segment from which the message is to be obtained and subsequently deleted. (Input) area_ptr is a pointer to an area where message segment can allocate the message. (Input) message_wanted is a flag indicating which message is wanted. (Input) If "0"b, the first message found is returned; if "1"b, the last is returned. ms_arg_ptr os a pointer to the structure "mseg_return_args", which will be filled in with information about the selected message. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ACCESS REQUIRED The calling process must have both "r" and "d" extended access to the message segment in order to read and delete a message. The authorization of the process must dominate the access class of the parent of the message segment and must be dominated by the __________________ __________________ $read_delete_index $read_delete_index __________________ __________________ access class of the message segment. In addition, the authorization of the calling process must be equal to the access class of the message to be read and deleted. If the process authorization dominates the message access class, then the code error_table_$ai_restricted will be returned. NOTES The structure "mseg_return_args" is declared in the include file mseg_return_args.incl.pl1, and is defined as follows: dcl ms_arg_ptr pointer; dcl 1 mseg_return_args aligned based (ms_arg_ptr), 2 ms_ptr pointer, 2 ms_len fixed bin (24), 2 sender_id char (32) unaligned, 2 level fixed bin, 2 ms_id bit (72), 2 sender_authorization bit (72), 2 access_class bit (72); Where: ms_ptr is a pointer to the message. ms_len is the length of the message in bits. sender_id is the process group ID of the sending process. level is the validation level of the sending process. ms_id is the unique ID of the message. sender_authorization is the access authorization of the sending process. access_class is the access class of the message. __________________ __________ $read_delete_index $read_file __________________ __________ NNNaaammmeee::: $$$rrreeeaaaddd_fffiiillleee The read_file entrypoint returns a message from a message segment. USAGE declare message_segment_$read_file entry (char (*), char (*), ptr, bit(1) aligned, ptr, fixed bin(35)); call message_segment_$read_file (dir_name, entry_name, area_ptr, message_wanted, ms_arg_ptr, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the message segment. (Input) area_ptr is a pointer to an area where message segment can allocate the message. (Input) message_wanted is a flag indicating which message is wanted. (Input) If "0"b, the first message found is returned; if "1"b, the last is returned. is a flag indicating which message is wanted. (Input) If "0"b, the first message found is returned; if "1"b, the last is returned. ms_arg_ptr is a pointer to the structure "mseg_return_args", which will be filled in with information about the selected message. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. __________ __________ $read_file $read_file __________ __________ ACCESS REQUIRED The caller must have "r" extended access to the message segment to read a message. The authorization of the caller must both dominate the access class of the parent of the message segment and dominate the access class of the message to be returned. NOTES The structure "mseg_return_args" is declared in the include file mseg_return_args.incl.pl1, and is defined as follows: dcl ms_arg_ptr pointer; dcl 1 mseg_return_args aligned based (ms_arg_ptr), 2 ms_ptr pointer, 2 ms_len fixed bin (24), 2 sender_id char (32) unaligned, 2 level fixed bin, 2 ms_id bit (72), 2 sender_authorization bit (72), 2 access_class bit (72); Where: ms_ptr is a pointer to the message. ms_len is the length of the message in bits. sender_id is the process group ID of the sending process. level is the validation level of the sending process. ms_id is the unique ID of the message. sender_authorization is the access authorization of the sending process. access_class is the access class of the message. __________ ___________________________ $read_file message_segment_$read_index __________ ___________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$rrreeeaaaddd_iiinnndddeeexxx The read_index entrypoint returns a message from a message segment. USAGE declare message_segment_$read_index entry (fixed bin, ptr, bit(1) aligned, ptr, fixed bin(35)); call message_segment_$read_index (mseg_index, area_ptr, message_wanted, ms_arg_ptr, code); ARGUMENTS mseg_index is the value returned from a call to message_segment_$open, identifying the message segment from which a message is to be obtained. (Input) area_ptr is a pointer to an area where message segment can allocate the message. (Input) message_wanted is a flag indicating which message is wanted. (Input) If "0"b, the first message found is returned; if "1"b, the last is returned. is a flag indicating which message is wanted. (Input) If "0"b, the first message found is returned; if "1"b, the last is returned. ms_arg_ptr is a pointer to the structure "mseg_return_args", which will be filled in with information about the selected message. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ___________________________ ___________________________ message_segment_$read_index message_segment_$read_index ___________________________ ___________________________ ACCESS REQUIRED The caller must have "r" extended access to the message segment to read a message. The authorization of the caller must both dominate the access class of the parent of the message segment and dominate the access class of the message to be returned. NOTES The structure "mseg_return_args" is declared in the include file mseg_return_args.incl.pl1, and is defined as follows: dcl ms_arg_ptr pointer; dcl 1 mseg_return_args aligned based (ms_arg_ptr), 2 ms_ptr pointer, 2 ms_len fixed bin (24), 2 sender_id char (32) unaligned, 2 level fixed bin, 2 ms_id bit (72), 2 sender_authorization bit (72), 2 access_class bit (72); Where: ms_ptr is a pointer to the message. ms_len is the length of the message in bits. sender_id is the process group ID of the sending process. level is the validation level of the sending process. ms_id is the unique ID of the message. sender_authorization is the access authorization of the sending process. access_class is the access class of the message. ___________________________ __________________ message_segment_$read_index $read_message_file ___________________________ __________________ NNNaaammmeee::: $$$rrreeeaaaddd_mmmeeessssssaaagggeee_fffiiillleee The read_message_file entrypoint allows the caller to read a message from a message segment, optionally reading its own messages and/or deleting the message just read. The behavior of this entrypoint is controlled by an input structure. USAGE declare message_segment_$read_message_file entry (char (*), char (*), ptr, ptr, fixed bin(35)); call message_segment_$read_message_file (dir_name, entry_name, area_ptr, mseg_message_info_ptr, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the message segment. (Input) area_ptr is a pointer to an area where message segment can allocate the message text. (Input) mseg_message_info_ptr is a pointer to the structure "mseg_message_info", described below. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ACCESS REQUIRED The calling process must have the following effective extended access to the message segment: "r" to read an arbitrary message; "o" or "r" to read its own message; "d" to delete an arbitrary message; "o" or "d" to delete its own message. The authorization of the calling process must dominate the access class of the parent of the message segment. To delete a message, the authorization of the process must be dominated by the access __________________ __________________ $read_message_file $read_message_file __________________ __________________ class of the message segment. In addition, the authorization of the process must dominate the access class of the message to be read, and be equal to the access class of the message to be deleted. NOTES The structure "mseg_message_info" is declared in the include file mseg_message_info.incl.pl1, and defined as follows: dcl mseg_message_info_ptr pointer; dcl 1 mseg_message_info based (mseg_message_info_ptr) aligned, 2 version char (8) aligned, 2 message_code fixed bin, 2 control_flags unaligned, 3 own bit (1), 3 delete bit (1), 3 pad bit (34), 2 ms_ptr ptr, 2 ms_len fixed bin (24), 2 ms_id bit (72), 2 ms_access_class bit (72), 2 sender_id char (32) unaligned, 2 sender_process_id bit (36) aligned, 2 sender_level fixed bin, 2 sender_authorization bit (72), 2 sender_max_authorization bit (72), 2 sender_audit bit (36); declare MSEG_MESSAGE_INFO_V1 char (8) aligned init ("msegmi01") int static options (constant); declare ( MSEG_READ_FIRST init (1), MSEG_READ_LAST init (2), MSEG_READ_SPECIFIED init (3), MSEG_READ_BEFORE_SPECIFIED init (4), MSEG_READ_AFTER_SPECIFIED init (5)) fixed bin int static options (constant); declare ( MSEG_READ_OWN init ("1"b), MSEG_READ_DELETE init ("01"b) ) bit (36) aligned internal static options (constant); Where: version Is the version of this structure. The caller must set this to MSEG_MESSAGE_INFO_v1. __________________ __________________ $read_message_file $read_message_file __________________ __________________ message_code specifies which message is to be read from the message segment. This value must be set by the caller to one of the following named constants: MSEG_READ_FIRST to read the first message. MSEG_READ_LAST to read the last message. MSEG_READ_SPECIFIED to read the message specified by mseg_message_info.ms_id. MSEG_READ_BEFORE_SPECIFIED to read the message previous to the message specified by mseg_message_info.ms_id. MSEG_READ_AFTER_SPECIFIED to read the next message after the message specified by mseg_message_info.ms_id. own is a flag. If set to "1"b, only messages added to the segment by the calling user will be returned. This must be set by the caller. delete is a flag. If set to "1"b, the message will be deleted after it is read out. This must be set by the caller. ms_ptr is a pointer to the message read from the message segment. This pointer is meaningful if and only if code is returned 0. The message always begins on a double-word boundary. ms_len is the length of the message, in bits. ms_id is a message segment/message segment message id. If the message_code is MSEG_READ_SPECIFIED, this is interpreted on input, and must be the message id of a message in the message segment to which the caller has access. If the message_code is MSEG_READ_BEFORE_SPECIFIED or MSEG_READ_AFTER_SPECIFIED, this is used for comparison only and need not identify any message. On output, it is the message id of the returned message. ms_access_class is the access class of the message returned. sender_id is the process group id of the process that added the message to the segment. sender_process_id is the process id of the process that added the message to the segment. It may be zero to indicate that no process id is available. sender_level is the validation level of the process that added the message to the segment. sender_authorization is the authorization, including privileges, of the process that added the message to the message __________________ ___________________ $read_message_file $read_message_index __________________ ___________________ segment. sender_max_authorization is the max authorization of the process that added the message to the message segment. sender_audit are the audit flags for the process sending the message. ________________________________________ NNNaaammmeee::: $$$rrreeeaaaddd_mmmeeessssssaaagggeee_iiinnndddeeexxx The read_message_index entrypoint allows the caller to read a message from a message segment, optionally reading its own messages and/or deleting the message just read. The behavior of this entrypoint is controlled by an input structure. USAGE declare message_segment_$read_message_index entry (fixed bin, ptr, ptr, fixed bin(35)); call message_segment_$read_message_index (mseg_index, area_ptr, mseg_message_info_ptr, code); ARGUMENTS mseg_index is the value returned from a call to message_segment_$open, identifying the message segment from which the message is to be read. (Input) area_ptr is a pointer to an area where message segment can allocate the message text. (Input) mseg_message_info_ptr is a pointer to the structure "mseg_message_info", described below. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ___________________ ___________________ $read_message_index $read_message_index ___________________ ___________________ ACCESS REQUIRED The calling process must have the following effective extended access to the message segment: "r" to read an arbitrary message; "o" or "r" to read its own message; "d" to delete an arbitrary message; "o" or "d" to delete its own message. The authorization of the calling process must dominate the access class of the parent of the message segment. To delete a message, the authorization of the process must be dominated by the access class of the message segment. In addition, the authorization of the process must dominate the access class of the message to be read, and be equal to the access class of the message to be deleted. NOTES The structure "mseg_message_info" is declared in the include file mseg_message_info.incl.pl1, and defined as follows: dcl mseg_message_info_ptr pointer; dcl 1 mseg_message_info based (mseg_message_info_ptr) aligned, 2 version char (8) aligned, 2 message_code fixed bin, 2 control_flags unaligned, 3 own bit (1), 3 delete bit (1), 3 pad bit (34), 2 ms_ptr ptr, 2 ms_len fixed bin (24), 2 ms_id bit (72), 2 ms_access_class bit (72), 2 sender_id char (32) unaligned, 2 sender_process_id bit (36) aligned, 2 sender_level fixed bin, 2 sender_authorization bit (72), 2 sender_max_authorization bit (72), 2 sender_audit bit (36); ___________________ ___________________ $read_message_index $read_message_index ___________________ ___________________ declare MSEG_MESSAGE_INFO_V1 char (8) aligned init ("msegmi01") int static options (constant); declare ( MSEG_READ_FIRST init (1), MSEG_READ_LAST init (2), MSEG_READ_SPECIFIED init (3), MSEG_READ_BEFORE_SPECIFIED init (4), MSEG_READ_AFTER_SPECIFIED init (5)) fixed bin int static options (constant); declare ( MSEG_READ_OWN init ("1"b), MSEG_READ_DELETE init ("01"b) ) bit (36) aligned internal static options (constant); Where: version Is the version of this structure. The caller must set this to MSEG_MESSAGE_INFO_v1. message_code specifies which message is to be read from the message segment. This value must be set by the caller to one of the following named constants: MSEG_READ_FIRST to read the first message. MSEG_READ_LAST to read the last message. MSEG_READ_SPECIFIED to read the message specified by mseg_message_info.ms_id. MSEG_READ_BEFORE_SPECIFIED to read the message previous to the message specified by mseg_message_info.ms_id. MSEG_READ_AFTER_SPECIFIED to read the next message after the message specified by mseg_message_info.ms_id. own is a flag. If set to "1"b, only messages added to the segment by the calling user will be returned. This must be set by the caller. delete is a flag. If set to "1"b, the message will be deleted after it is read out. This must be set by the caller. ms_ptr is a pointer to the message read from the message segment. This pointer is meaningful if and only if code is returned 0. The message always begins on a double-word boundary. ms_len is the length of the message, in bits. ms_id is a message segment/message segment message id. If the message_code is MSEG_READ_SPECIFIED, this is interpreted on input, and must be the message id of a message in the message segment to which the caller has ___________________ ____________________________________ $read_message_index message_segment_$set_max_length_file ___________________ ____________________________________ access. If the message code is MSEG_READ_BEFORE_SPECIFIED or MSEG_READ_AFTER_SPECIFIED, this is used for comparison only and need not identify any message. On output, it is the message id of the returned message. ms_access_class is the access class of the message returned. sender_id is the process group id of the process that added the message to the segment. sender_process_id is the process id of the process that added the message to the segment. It may be zero to indicate that no process id is available. sender_level is the validation level of the process that added the message to the segment. sender_authorization is the authorization, including privileges, of the process that added the message to the message segment. sender_max_authorization is the max authorization of the process that added the message to the message segment. sender_audit are the audit flags for the process sending the message. ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$ssseeettt_mmmaaaxxx_llleeennngggttthhh_fffiiillleee The set_max_length_file entrypoint sets the maximum length of a message segment. USAGE declare message_segment_$set_max_length_file entry (char(*), char(*), fixed bin(19), fixed bin(35)); call message_segment_$set_max_length_file (dir_name, entry_name, max_length, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) ____________________________________ __________________ message_segment_$set_max_length_file $set_safety_switch ____________________________________ __________________ entry_name is the name of the message segment. (Input) max_length is the new maximum length of the message segment. (Input) code is a standard system standard code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have modify access to the parent of the message segment. The authorization of the calling process must be equal to the access class of the parent of the message segment. ________________________________________ NNNaaammmeee::: $$$ssseeettt_sssaaafffeeetttyyy_ssswwwiiitttccchhh The set_safety_switch entrypoint changes the value of the safety switch for a message segment. USAGE declare message_segment_$set_safety_switch entry (char(*), char(*), bit(1) aligned, fixed bin(35)); call message_segment_$set_safety_switch (dir_name, entry_name, safety_switch, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the message segment. (Input) safety_switch is the new value of the safety switch. (Input) code is a standard system status code. (Output) It can have the __________________ ____________________________________ $set_safety_switch message_segment_$update_message_file __________________ ____________________________________ following values: error_table_$moderr incorrect access modes to perform the operation. error_table_$ai_restricted incorrect authorization to complete the operation. ACCESS REQUIRED The calling process must have modify access to the parent of the message segment. The authorization of the calling process must equal the access class of the parent of the message segment. ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$uuupppdddaaattteee_mmmeeessssssaaagggeee_fffiiillleee The update_message_file entrypoint changes the contents of a message in a message segment. USAGE declare message_segment_$update_message_file entry (char (*),char (*), fixed bin(24), bit(72) aligned, ptr, fixed bin(35)); call message_segment_$update_message_file (dir_name, entry_name, message_len, message_id, message_ptr, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the message segment. (Input) message_len is the name of the message segment. (Input) message_id is the identifier of the message to be modified. (Input) message_ptr is a pointer to the new message. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. ____________________________________ _____________________ message_segment_$update_message_file $update_message_index ____________________________________ _____________________ error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ACCESS REQUIRED The calling process must have "d" extended access to the message segment to update a message. The authorization of the calling process must dominate the parent of the message segment that contains the message and must be equal to the access class of the message to be updated. ________________________________________ NNNaaammmeee::: $$$uuupppdddaaattteee_mmmeeessssssaaagggeee_iiinnndddeeexxx The update_message_index entrypoint changes the contents of a message in a message segment. USAGE declare message_segment_$update_message_index entry (fixed bin, fixed bin(24), bit(72) aligned, ptr, fixed bin(35)); call message_segment_$update_message_index (mseg_index, message_len, message_id, message_ptr, code); ARGUMENTS mseg_index is the valued returned from a call to message_segment_$open, identifying the message segment which is to have one of its messages updated. (Input) message_len is the name of the message segment. (Input) message_id is the identifier of the message to be modified. (Input) message_ptr is a pointer to the new message. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$moderr incorrect access modes to perform the operation. _____________________ _________________________ $update_message_index message_segment_$validate _____________________ _________________________ error_table_$ai_restricted incorrect authorization to complete the operation. error_table_$no_message no message available with desired characteristics. ACCESS REQUIRED The calling process must have "d" extended access to the message segment to update a message. The authorization of the calling process must dominate the parent of the message segment that contains the message and must be equal to the access class of the message to be updated. ________________________________________ NNNaaammmeee::: mmmeeessssssaaagggeee_ssseeegggmmmeeennnttt_$$$vvvaaallliiidddaaattteee The validate entrypoint determines whether or not a given entry is a message segment. USAGE declare message_segment_$validate entry (char(*), char(*), fixed bin(35)); call message_segment_$validate (dir_name, entry_name, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the potential message segment. (Input) code is a standard system status code. (Output) It can have the following values: error_table_$not_seg_type the entry is not a message segment. error_table_$no_info no information on the entry is available. _________________________ ____________ message_segment_$validate pnt_fs_gate_ _________________________ ____________ ACCESS REQUIRED The calling process must have either a minimum of status access to the parent of the message segment or non-null extended access to the message segment itself. The authorization of the calling process must dominate the access class of the parent of the message segment. NOTES For an entry to be considered a message segment, it must have the "ms" suffix and have ring brackets of (1, 1, 1). ________________________________________ NNNaaammmeee::: pppnnnttt_fffsss_gggaaattteee_ EEEnnntttrrryyy::: pppnnnttt_fffsss_gggaaattteee_$$$aaadddddd_aaaccclll_eeennntttrrriiieeesss This entry point adds specified access modes to the access control list (ACL) of the specified PNT. If an access name already appears on the ACL of the PNT, its mode is changed to the one specified by the call. USAGE declare pnt_fs_gate_$add_acl_entries entry (char(*), char(*), ptr, fixed bin(35)); call pnt_fs_gate_$add_acl_entries (dir_name, entry_name, acl_ptr, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the entry name of the PNT. (Input) acl_ptr points to a user-filled general_acl structure (see "Entry Information" below). (Input) ____________ ____________ pnt_fs_gate_ pnt_fs_gate_ ____________ ____________ code is a storage system status code. (Output) Its value may be: error_table_$moderr incorrect access on entry. (See Access Required Section). ENTRY INFORMATION The general_acl structure should be declared in the following way: dcl 1 general_acl aligned based (acl_ptr), 2 version char (8) aligned, 2 count fixed bin, 2 entries (acl_count refer (general_acl.count)) aligned like general_acl_entry; STRUCTURE ELEMENTS version is the version of the structure and must be set to GENERAL_ACL_VERSION_1. count must be set to the number of acl entries after the structure has been allocated. The general_acl_entry structure (declared in the include file acl_structures.incl.pl1) is as follows: dcl 1 general_acl_entry aligned based, 2 access_name char(32) unaligned, 2 mode bit(36) aligned, 2 status_code fixed bin(35); STRUCTURE ELEMENTS access_name is the access name (in the form Person_id.Project_id.tag) that identifies the processes to which this ACL entry applies. mode contains the modes for this access name. The first three bits correspond to the modes read, execute, and write. The remaining bits must be zeros. For example, rw access is expressed as "101"b. The execute mode does not apply to MSF's and thus to PNT's. status_code is a standard system status code for this ACL entry only. ____________ ____________ pnt_fs_gate_ pnt_fs_gate_ ____________ ____________ NOTES If code is returned as error_table_$argerr, then the erroneous ACL entries in the general_acl structure have status_code set to an appropriate error code. No processing is performed. ACCESS REQUIRED Because PNT's are implemented using MSF's, RW access on the PNT itself (which translates to SMA to the directory portion) is required to modify the PNT's access. Authorization of the calling process must be equal to the access class of the parent of the PNT. The system PNT is at system_low. EEEnnntttrrryyy::: pppnnnttt_fffsss_gggaaattteee_$$$ccchhhnnnaaammmeee_fffiiillleee The chname_file entrypoint changes the entry name on a specified PNT. If an already existing name (an old name) is specified, it is deleted from the entry; if a new name is specified, it is added. Thus, if only an old name is specified, the effect is to delete a name; if only a new name is specified, the effect is to add a name; and if both are specified, the effect is to rename the entry. USAGE declare pnt_fs_gate_$chname_file entry (char(*), char(*), char(*), char(*), fixed bin(35)); call pnt_fs_gate_$chname_file (dir_name, entry_name, old_entry_name, new_entry_name, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the PNT. (Input) old_entry_name is the name to be deleted from the PNT. (Input) It can be a null character string ("") in which case no name is deleted. If oldname is null, then newname must not be null. new_entry_name is the name to be added to the entry. (Input) It must not ____________ ____________ pnt_fs_gate_ pnt_fs_gate_ ____________ ____________ already exist in the directory on this or another entry. It can be a null character string ("") in which case no name is added. If it is null, then oldname must not be the only name on the entry. code is a storage system status code. (Output) It can have the values: error_table_$nonamerr attempting to delete the only name of a directory entry. error_table_$namedup attempting to add a name that exists on another entry. error_table_$segnamedup attempting to add a name that already exists on this entry. error_table_$incorrect_access incorrect access on directory containing entry. ACCESS REQUIRED The calling process must have modify access to the parent of the PNT. The authorization of the calling process must equal the access class of the parent of the PNT. EEEnnntttrrryyy::: pppnnnttt_fffsss_gggaaattteee_$$$dddeeellleeettteee_aaaccclll_eeennntttrrriiieeesss This entry point deletes specified entries from an access control list (ACL) for a PNT. USAGE declare pnt_fs_gate_$delete_acl_entries entry (char(*), char(*), ptr, fixed bin35)); call pnt_fs_gate_$delete_acl_entries (dir_name, entryname, acl_ptr, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the PNT. (Input) acl_ptr points to a user-filled general_delete_acl structure (see "Entry Information" below). (Input) ____________ ____________ pnt_fs_gate_ pnt_fs_gate_ ____________ ____________ code is a storage system status code. (Output) Its value may be: error_table_$moderr incorrect access on entry (See Access Required Section). ENTRY INFORMATION The general_delete_acl structure should be declared in the following way: dcl 1 general_delete_acl aligned based (acl_ptr), 2 version char (8) aligned, 2 count fixed bin, 2 entries (acl_count refer (general_delete_acl.count)) aligned like general_delete_acl_entry; STRUCTURE ELEMENTS version is the version of the structure and must be set to GENERAL_DELETE_ACL_VERSION_1. count must be set to the number of acl entries after the structure has been allocated. The general_delete_acl_entry structure (declared in the include file acl_structures.incl.pl1) is as follows: dcl 1 general_delete_acl_entry aligned based, 2 access_name char (32) unaligned, 2 status_code fixed bin (35); STRUCTURE ELEMENTS access_name is the access name (in the form of Person_id.Project_id.tag) that identifies the ACL entry to be deleted. status_code is a storage system status code for this ACL entry only. NOTES If code is returned as error_table_$argerr, then the erroneous ACL entries in the delete_acl_array structure have status_code set to an appropriate error code. No processing is performed. ____________ ____________ pnt_fs_gate_ pnt_fs_gate_ ____________ ____________ If an access name cannot be matched to a name already on the ACL of the PNT, then the status_code for that ACL entry in the delete_acl_array structure is set to error_table_$user_not_found. Processing continues for the rest of the general_delete_acl entries and code is returned as 0. ACCESS REQUIRED Because PNT's are implemented using MSF's, RW access on the PNT itself (which translates to SMA to the directory portion) is required to modify the PNT's access. Authorization of the calling process must be equal to the access class of the parent of the PNT. The system PNT is at system_low. EEEnnntttrrryyy::: pppnnnttt_fffsss_gggaaattteee_$$$llliiisssttt_aaaccclll This entry point is used either to list the entire access control list (ACL) of a PNT or to return the access modes of specified ACL entries. The general_acl structure used by this entry point is discussed in the description of pnt_fs_gate_$add_acl_entries. USAGE declare pnt_fs_gate_$list_acl entry (char(*), char(*), ptr, ptr, fixed bin(35)); call pnt_fs_gate_$list_acl (dir_name, entryname, area_ptr, acl_ptr, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the PNT. (Input) area_ptr points to an area in which the list of ACL entries, which make up the entire ACL of the PNT, is allocated. (Input) If area_ptr is not null, then the user wants access modes for certain ACL entries; these will be specified by the structure pointed to by acl_ptr (see below). Otherwise, the entire ACL is to be returned. ____________ ____________ pnt_fs_gate_ pnt_fs_gate_ ____________ ____________ acl_ptr points to an ACL structure, general_acl, into which the ACL information is placed. If area ptr is not null the structure contains the access names for which the modes are requested. (Input) code is a storage system status code. (Output) It will generally be 0 (see Access Required Section). NOTES If acl_ptr is used to obtain modes for specified access names (rather than for all access names on a PNT), then each ACL entry in the segment_acl_array structure either has status_code set to 0 and contains the PNT's mode or has status_code set to error_table_$user_not_found and contains a mode of 0. ACCESS REQUIRED MSF's must have S permission on the directory portion to *.*.*, which is all the access required by this gate. The authorization of the calling process must dominate the access class of the parent of the PNT. The system PNT is is at system_low and thus accessible to everyone. EEEnnntttrrryyy::: pppnnnttt_fffsss_gggaaattteee_$$$rrreeeppplllaaaccceee_aaaccclll This entry point replaces an entire access control list (ACL) for a PNT with a user-provided ACL, and can optionally add an entry for *.SysDaemon.* with mode rw to the new ACL. The general_acl structure described in pnt_fs_gate_$add_acl_entries is used by this entry point. USAGE declare pnt_fs_gate_$replace_acl entry (char(*), char(*), ptr, bit(1), fixed bin(35)); call pnt_fs_gate_$replace_acl (dir_name, entryname, acl_ptr, no_sysdaemon_sw, code); ARGUMENTS dir_name is the pathname of the containing directory. (Input) entryname is the entryname of the PNT. (Input) ____________ ____________ pnt_fs_gate_ pnt_fs_gate_ ____________ ____________ acl_ptr points to the user supplied general_acl structure that is to replace the current ACL. (Input) no_sysdaemon_sw is a switch that indicates whether an rw *.SysDaemon.* entry is to be put on the ACL of the PNT after the existing ACL has been deleted and before the user-supplied segment_acl_array entries are added. (Input) "0"b adds rw *.SysDaemon.* to ACL. "1"b replaces the existing ACL with only the user-supplied segment_acl_array. code is a storage system status code. (Output) error_table_$moderr is returned if the user does not have RW permission to the PNT (see Access Required section). NOTES If general_acl.count is zero, then the existing ACL is deleted and only the action indicated (if any) by the no_sysdaemon_sw switch is performed. If general_acl.count is greater than zero, processing of the general_acl entries is performed top to bottom, allowing later entries to overwrite previous ones if the access_name in the general_acl structure is identical. ACCESS REQUIRED Because PNT's are implemented using MSF's, RW access on the PNT itself (which translates to SMA to the directory portion) is required to modify the PNT's access. Authorization of the calling process must be equal to the access class of the parent of the PNT. The system PNT is at system_LOW. EEEnnntttrrryyy::: pppnnnttt_fffsss_gggaaattteee_$$$vvvaaallliiidddaaattteee The validate entrypoint determines whether or not a given entry is a PNT. USAGE declare pnt_fs_gate_$validate entry (char(*), char(*), fixed bin(35)); call pnt_fs_gate_$validate (dir_name, entry_name, code); ____________ _____________________ pnt_fs_gate_ priv_connection_list_ ____________ _____________________ ARGUMENTS dir_name is the pathname of the containing directory. (Input) entry_name is the name of the potential PNT. (Input) code is a standard system status code. (Output) It may have the values: error_table_$not_seg_type entry is not of the given type (if the gate is called on a directory or non-PNT MSF) error_table_$not_a_dir entry is not a directory (if the gate is called on a segment). NOTES For an entry to be considered a PNT, it must be an MSF with the "pnt" suffix and have ring brackets of (1, 1, 1). ACCESS REQUIRED MSF's must have S permission on the directory portion to *.*.*, which is all the access required by this gate. The authorization of the calling process must dominate the access class of the parent of the PNT. The system PNT is at system_low and thus accessible to everyone. ________________________________________ NNNaaammmeee::: ppprrriiivvv_cccooonnnnnneeeccctttiiiooonnn_llliiisssttt_ This gate contains privileged entries to connection_list_manager_. In general, they can be used only by login server processes, and only to manipulate entries for connections of which the calling process is the owner. The entries contained in priv_connection_list_ are listed below, along with their target entries in connection_list_manager_. Gate entry Target add add change_user priv_change_user delete_name priv_delete_name delete_offset priv_delete_offset delete_all_for_user priv_delete_all_for_user _____________________ ____ priv_connection_list_ rcp_ _____________________ ____ get_name priv_get_name get_next_user priv_get_next_user get_next_owner priv_get_next_owner remove_user priv_remove_user ________________________________________ NNNaaammmeee::: rrrcccppp_ EEEnnntttrrryyy::: rrrcccppp_$$$aaacccqqquuuiiirrreee This entrypoint finds a free resource that meets or exceeds the user-given criteria, and makes the user the owner of the resource, having control of the resource and having resource executive (E access) to the resource. USAGE declare rcp_$acquire entry (ptr, char(*), fixed bin(35)); call rcp_$acquire (resource_desc_ptr, registry_dir, code); ARGUMENTS resource_desc_ptr pointer to a resource description structure. See "Notes" below for structure definition. (Input) registry_dir the absolute pathname of the registry directory. (Input) code is a storage system status code. (Output) Possible codes returned are: error_table_$action_not_performed the action was not performed and the user does not have enough access to find out why. error_table_$bad_resource_spec there was erroneous data in the resource_descriptions structure supplied. error_table_$resource_awaiting_clear the resource is awaiting clear and is unavailable for acquisition. ____ ____ rcp_ rcp_ ____ ____ error_table_$not_abs_path the registry directory pathname is not an absolute pathname. error_table_$rcp_bad_attributes the attributes specified by the user are invalid. error_table_$resource_locked the resource is locked and unavailable. error_table_$resource_not_free the requested resource is not in the free state and cannot be acquired. error_table_$resource_unavailable the requested resource is unavailable. error_table_$resource_unknown the requested resource is unknown to the system. error_table_$unimplemented_version the version supplied in the resource descriptions structure is invalid. ACCESS REQUIRED Anyone can acquire a free resource. Resources in the free pool have REW access to *.*. NOTES The resource_descriptions structure is defined in resource_control_desc.incl.pl1 and is declared as follows: ____ ____ rcp_ rcp_ ____ ____ dcl 1 resource_descriptions based (resource_desc_ptr) aligned, 2 version_no fixed bin, 2 n_items fixed bin, 2 item (Resource_count refer (resource_descriptions.n_items)) aligned, 3 type char (32), 3 name char (32), 3 uid bit (36), 3 potential_attributes bit (72), 3 attributes (2) bit (72), 3 desired_attributes (4) bit (72), 3 potential_aim_range (2) bit (72), 3 aim_range (2) bit (72), 3 owner char (32), 3 acs_path char (168), 3 location char (168), 3 comment char (168), 3 charge_type char (32), 3 rew bit (3) unaligned, 3 (usage_lock, release_lock, awaiting_clear, user_alloc) bit (1) unaligned, 3 pad2 bit (29) unaligned, 3 given aligned, (4 (name, uid, potential_attributes, desired_attributes, potential_aim_range, aim_range, owner, acs_path, location, comment, charge_type, usage_lock, release_lock, user_alloc) bit (1), 4 pad1 bit (22)) unaligned, 3 state bit (36) aligned, 3 status_code fixed bin (35); version_no version number of the resource_descriptions structure. n_items number of items to be acquired. ____ ____ rcp_ rcp_ ____ ____ type resource type being acquired. resource_name name of resource to be acquired. uid resource identifying number not used for acquires. potential_attributes not used for acquires. attributes attributes of the resource; density, model, etc. desired_attributes a resource can be acquired by attribute selection. aim_range actual aim_range of an acquired resource. potential_aim_range range of aim classes for a free resource. owner defines the resource owner after an acquisition. acs_path specifies the absolute pathname of the ACS segment for the resource. location not used for acquisitions. comment a comment string for the resource, i.e. "dump tape". charge_type not used for acquisitions. rew defines the user's access to the resource. usage_lock, release_lock, awaiting_clear not used for acquisitions. ____ ____ rcp_ rcp_ ____ ____ EEEnnntttrrryyy::: rrrcccppp_$$$aaassssssiiigggnnn_dddeeevvviiiccceee This entry point attempts to assign one device class resource to the calling process. Specifications regarding the device to be assigned are supplied by the caller using the appropriate structure defined in rcp_device_info_structs.incl.pl1 to which this routine is passed a pointer. Internally an entry is completed and entered in rcp_com_seg which contains information about the assignment. The actual assignment is not complete until it is checked by rcp_$check_assign. USAGE declare rcp_$assign_device entry (char(*), ptr, fixed bin(71), char(*), bit(36) aligned, fixed bin(35)); call rcp_$assign_device (device_type, device_info_ptr, event_id, comment, rcp_id, code); ARGUMENTS device_type describes the type of device requested. This value must be one of the following: tape_drive, disk_drive, console, printer, punch, reader, special. (Input) device_info_ptr is a pointer to the structure rcp_device_info found in rcp_device_info_structs.incl.pl1, which contains information about the device to be assigned. See "Notes" below for structure definition. (Input) event_id is an event channel id supplied by the caller but is no longer used. (Input) comment is a message to be displayed to the operator upon completion of the assignment. (Input) rcp_id Internally generated unique id for this rcp assignment. (Output) code is a storage system status code. (Output) Possible codes returned are: ____ ____ rcp_ rcp_ ____ ____ error_table_$resource_assigned indicates the specified resource is already assigned. error_table_$resource_bad_access not enough access to assign the desired resource. error_table_$resource_unavailable no resource available to meet the request. error_table_$resource_unknown requested resource unknown to the system. ACCESS REQUIRED RW is required to assign a device. The ACS must exist for devices and is usually located in >sc1>rcp>DEVICE_NAME.acs. If the ACS does not exist, the error code, error_table_$insufficient_access or error_table_$resource_bad_access is returned. NOTES The device_info structure is defined in rcp_device_info_structs.incl.pl1 and overlays the appropriate structure for the device type. For example, for tapes, the structure tape_info, also declared in rcp_device_info_structs.incl.pl1, should be used; a pointer to it passed to this entry point. The overlay structure pointed to by device_info_ptr is declared as follows (For details of type-specific structures see the include file): dcl 1 device_info based (device_info_ptr) aligned, 2 version_num fixed bin, 2 usage_time fixed bin, 2 wait_time fixed bin, 2 system_flag bit(1), 2 device_name char(8), 2 model fixed bin, 2 qualifiers(4) fixed bin(35); version_num version number of this structure. usage_time number of minutes device will/may be used. wait_time number of minutes user will/must wait for assignment completion. system_flag "1"b user wants to be a system process for this assignment. ____ ____ rcp_ rcp_ ____ ____ device_name device name. model model number of the device. qualifiers qualifying characteristics such as tape_drive speed, density, etc. EEEnnntttrrryyy::: rrrcccppp_$$$aaattttttaaaccchhh rcp_$attach initiates the attachment of a device. The device that RCP will attempt to attach depends on the values found in the user supplied device_info structure. RCP will first see if an appropriate device is assigned to this process. If there is an appropriate assigned, unattached device, then RCP will use that device for this attachment. If there is not, RCP will attempt to assign an appropriate, available and accessible device to the process and use that device for the attachment. If no device can be found that meets the requirements, then the attachment is aborted. For tape and disk drives, if the specified volume is not mounted, RCP will mount the volume on the device. The rcp_$attach entry point functions in cooperation with the rcp_$check_attach entry point. A call to rcp_$attach initiates the attachment but does not complete it. The caller still cannot successfully call IOI to perform I/O on the device being attached. The attachment will not be completed and the caller will not know the characteristics of the device that was attached until this data is returned from rcp_$check_attach. For more detailed information, see the example above. USAGE declare rcp_$attach entry (char(*), ptr, fixed bin(71), char(*), bit(36) aligned, fixed bin(35)); call rcp_$attach (device_type, device_info_ptr, event_id, comment, rcp_id, code); ARGUMENTS device_type is a string that identifies the type of device to attach. It must be one of the constants defined in rcp_resource_types.incl.pl1. (Input) ____ ____ rcp_ rcp_ ____ ____ device_info_ptr points to a structure supplied by the caller containing information about the device to be attached. (See below for information about the device_info structure.) (Input) event_id is an event channel ID supplied by the caller. This channel will be used by RCP to notify the user of the progress of the attachment in some cases. For more information, see the example above. (Input) comment is a message to be displayed to the operator upon completion of device assignment and prior to any volume mounting that may be required. (Input) rcp_id is an internally generated unique id for this rcp attachment. (Output) It is passed to other rcp_ entrypoints that manipulate the attachment. error_code is a standard system status code. (Output) Possible codes returned are: error_table_$bad_volid for a tape or disk device, a volume must be specified and it was not. error_table_$resource_attached the requested device is already attached to the requesting process. error_table_$no_operation this is a T&D operation and the privileged attach entry point rcp_priv_$attach must be used instead. error_table_$resource_unknown the requested device is not known to the system. error_table_$resource_unavailable the requested device was accessible but not available. error_table_$resource_bad_access the requested device was inaccessible. ____ ____ rcp_ rcp_ ____ ____ ACCESS REQUIRED RW access to the Access Control Segment (ACS) associated with the resource is required in order to attach the resource. If RCPRM is not enabled at your site, then the only resource controlled by RCP is the device,and access control is not provided for tape and disk volumes. The ACS is located in >sc1>rcp>RESOURCE_NAME.acs. If RCPRM is enabled, then access to both devices and volumes is controlled by ACS segments. For reading, the user must have R effective access, and for writing, RW effective access. This access may be derived from an ACS segment associated with the resource, or based on the owner of the resource, as determined by RCPRM. Refer to the Reference Manual for further details. NOTES The device_info structure is a general purpose header structure used for the various of types of resources. It is declared is rcp_device_info_structs.incl.pl1, along with the structures for tapes, disks, and printers. Each structure uses device_info as its header. The include file describes the structures for each resource in more detail. dcl 1 device_info based (device_info_ptr) aligned, 2 version_num fixed bin, 2 usage_time fixed bin, 2 wait_time fixed bin, 2 system_flag bit(1), 2 device_name char(8), 2 model fixed bin, 2 qualifiers(4) fixed bin(35); STRUCTURE ELEMENTS version_num is the version number of this structure. This will be different for each resource type. (Input) usage_time number of minutes device will/may be used. (Reserved for future use.) wait_time number of minutes user will/must wait for assignment completion. (Reserved for future use.) ____ ____ rcp_ rcp_ ____ ____ system_flag if this is "1"b, the user wants to be considered a system process for this assignment. (Input) device_name the name of the device. (Input to rcp_$attach/Output from rcp_$check_attach) model the model number of the device. (Output from rcp_$check_attach) qualifiers this element will contain different information for each resource type. (Input to rcp_$attach/Output from rcp_$check_attach) EEEnnntttrrryyy::: rrrcccppp_$$$aaattttttaaaccchhh_lllvvv Performs an IOI attachment for one logical volume. The logical volume name supplied must have been previously registered. This routine can only be used for removable-media devices. USAGE declare rcp_$attach_lv entry (ptr, fixed bin(71), bit(36) aligned, fixed bin(35)); call rcp_$attach_lv (volume_info_ptr, event_chan, rcp_id, code); ARGUMENTS volume_info_ptr pointer to logical volume info structure as defined in rcp_lv_info.incl.pl1 (see below). (Input) event_chan an event channel supplied by the caller. (Input) rcp_id rcp unique identification number for this logical volume attachment. (Output) code is a storage system status code. (Output) Possible returned codes are: error_table_$resource_bad_access not enough access to attach the desired logical volume. ____ ____ rcp_ rcp_ ____ ____ error_table_$unimplemented_version incorrect version supplied by lv_info structure. error_table_$unregistered_volume logical volume requested is not registered. ACCESS REQUIRED Everyone has RW access to public volumes. If the volume is private, access is determined by the volume_name.ACS. If the ACS does not exist for a private logical volume, only the logical volume owner (Person_id.SysAdmin) has access. NOTES The data structure pointed to volume_info_ptr is defined in rcp_lv_info.incl.pl1 as follows: dcl 1 lv_info_based (lv_info_ptr) aligned, 2 version_num fixed bin, 2 usage_time fixed bin, 2 wait_time fixed bin, 2 system_flag bit(1), 2 volume_name char(32); version_num version number of structure. usage_time number of minutes device will/may be used. volume_name name of registered logical volume. EEEnnntttrrryyy::: rrrcccppp_$$$cccaaannnccceeelll_iiiddd_ssstttrrriiinnnggg Implements reservation cancelling given a reservation id. USAGE declare rcp_$cancel_id_string entry (char(*), fixed bin(35)); call rcp_$cancel_id_string (res_id, code); ____ ____ rcp_ rcp_ ____ ____ ARGUMENTS res_id is the rcp generated reservation id for the resource reservation being cancelled. (Input) code is a storage system status code. (Output) Possible codes returned are: error_table_$noentry no volume or device was found in rcp_data which corresponded to the volume or device in the reservation. error_table_$request_id_ambiguous the reservation id supplied is invalid. error_table_$invalid_resource_state the volume or device is not reserved. ACCESS REQUIRED The only requirement to cancel resource reservations is that the process be the same process that made the reservation. All resource reservations are automatically cancelled when the process terminates. EEEnnntttrrryyy::: rrrcccppp_$$$ccchhheeeccckkk_aaassssssiiigggnnn This routine checks the assignment made by rcp_$assign_device. An assignment is not complete until this entry point has been called. In particular, the state of rcp_device_info and the rcp_com_seg entry for this assignment is examined for correctness. USAGE declare rcp_$check_assign entry (bit(36) aligned, ptr, char(*), fixed bin, fixed bin(35)); call rcp_$check_assign (rcp_id, device_info_ptr, comment, statex, code); ARGUMENTS rcp_id Unique id for this rcp assignment generated by rcp_$assign_device. (Input) ____ ____ rcp_ rcp_ ____ ____ device_info_ptr is a pointer to the structure rcp_device_info.incl.pl1, which contains information about the device to be assigned. See the description of rcp_device.info.incl.pl1 in the rcp_$assign_device entry point. (Input) comment is a message to be displayed to the operator upon completion of the assignment. (Input) statex state of this assignment. (Output) Can be one of the following values:. statex = 0 indicates to caller that everything was OK. statex = 3 indicates to caller that there was an error returned in code. code is the storage system status code. (Output) Possible codes returned are: error_table_$bad_arg indicates a bad argument passed to rcp_$check_assign. error_table_$invalid_state the rcp_com_seg entry for this assignment is not in the assignment state. EEEnnntttrrryyy::: rrrcccppp_$$$ccchhheeeccckkk_aaattttttaaaccchhh rcp_$check_attach establishes completion of the attach process begun by the rcp_$attach entry point, causes IOI to set the workspace and timeout limits for the device, promotes the device to the caller's validation level, and returns info needed by the user to perform I/O on this device. It should be noted that an attachment is not complete until this entry point is called. USAGE declare rcp_$check_attach entry (bit(36) aligned, ptr, char(*), fixed bin, fixed bin(19), fixed bin(71), fixed bin, fixed bin(35)); call rcp_$check_attach (rcp_id, device_info_ptr, comment, ioi_index, workspace_max, timeout_max, statex, code); ____ ____ rcp_ rcp_ ____ ____ rcp_id is the unique identified for this attachment returned by rcp_$attach. (Input) device_info_ptr is a pointer to the device_info structure that was supplied to rcp_$attach when this attachment was begun. (Input) This entrypoint will update the information in this structure to reflect the characteristics of the actual device that was acquired. comment the comment associated with this attachment. This argument is always a null string. (Output) ioi_index is an index used for communication with IOI. (Output) workspace_max is the size of IOI workspace in words. (Output) timeout_max is the amount of time IOI will wait for another operation to begin, after an operation completes, before it unwires the IOI workspace. If the next operation begins before this time out, then the workspace remains wired. Otherwise, it gets unwired automatically and the next operation is delayed while IOI rewires the workspace pages into memory. statex is the current state of the attachment. (Output) Its possible values are: 0 - the attachment is complete 1 - the attachment is nearly complete 2 - the resource is unavailable 3 - an error occurred while attaching the resource See the example above for more information. code is a standard system status code. (Output) Possible returned codes are: error_table_$bad_arg the rcp_id supplied is invalid. error_table_$invalid_state the attachment of this device is in the wrong state to be completed now. ____ ____ rcp_ rcp_ ____ ____ ACCESS REQUIRED Only the process that began the attachment with rcp_$attach can complete it with rcp_$check_attach, but no access is required for this entrypoint, as all access checking is performed by rcp_$attach. EEEnnntttrrryyy::: rrrcccppp_$$$ccchhheeeccckkk_aaattttttaaaccchhh_lllvvv This entry point must be called after a call to rcp_$attach_lv. It checks that the rcp_id supplied is for a valid logical volume attachment and if so returns the logical volume id and the state_index. This routine is basically a no op. USAGE declare rcp_$check_attach_lv entry (bit (36) aligned, ptr, fixed bin, fixed bin (35)); call rcp_$check_attach_lv (rcp_id, volume_info_ptr, state_index, code); ARGUMENTS rcp_id is the unique rcp identifying number for the logical volume attachment. (Input) volume_info_ptr not used. state_index a zero state_index indicates everything is OK; when the state_index returned is a three then an error has occured. (Output) code is the storage system status code. (Output) Possible codes returned are: error_table_$bad_index indicates RCP cannot find the index of the logical volume from the given rcp_id. A possibly erroneous rcp_id was supplied. ____ ____ rcp_ rcp_ ____ ____ ACCESS REQUIRED There are no access requirements for rcp_$check_attach_lv. It must be called, however, after a call to rcp_$check_attach_lv. EEEnnntttrrryyy::: rrrcccppp_$$$cccooopppyyy_llliiisssttt This entry is called to return rcp_com_seg (RCS) information about all attachments and assignments of the calling process. USAGE declare rcp_$copy_list entry (ptr, fixed bin(19), fixed bin(35)); call rcp_$copy_list (to_ptr, copy_size, code); ARGUMENTS to_ptr pointer to caller's work segment where information should be placed. See "Notes" below for structure definition. (Input) copy_size size of caller's work segment. (Input) code is a storage system status code. (Output) Possible codes returned are: error_table_$bad_arg the size of the user's work segment is larger than the maximum allowed. error_table_$unimplemented_version the version number in the rcp_list structure defined below, is incorrect. error_table_$item_too_big the resulting information is too large to fit in the user supplied work segment. ACCESS REQUIRED There are no access requirements since the user can only obtain information about the current process assignments and attachments. ____ ____ rcp_ rcp_ ____ ____ NOTES The rli structure pointed to by the to_ptr is defined in rcp_list.incl.pl1 and is declared as follows: dcl 1 rli based (rli_ptr) aligned, 2 head like rli_header, 2 dassigns (0 refer (rli.head.num_dassign)) like dassign, 2 attaches (0 refer (rli.head.num_attach)) like attach, 2 lvs (0 refer (rli.head.num_lv)) like lv, 2 device_resvs (0 refer (rli.head.num_device_resv)) like device_resv, 2 vol_resvs (0 refer (rli.head.num_vol_resv)) like vol_resv, 2 end bit (36); head contains header information: version number, number of logical volumes attached, number of device assignment entries, number of attachments, number of devices reserved, and number of volumes reserved. dassigns array of device assignment entries with the following information about each assignment for this process: device name, device type index, device model, device qualifiers, time device was put into assignment state, current validation level, disposition, flag indicating whether device is also attached, rcp_id for the assignment, number of minutes device may be assigned, number of minutes user waited for the assignment. attaches array of resources attached containing the following information for each attachment: device and volume names, device type index, current state of the attachment, current validation level, flags indicating a privileged attach and an attach for reading or writing, rcp_id for the attachment, maximum size of the IOI workspace for the attachment, maximum IOI time-out interval, index used to communicate with IOI, number of minutes device may be attached, number of minutes user waited for the attachment. lvs an array of logical volume attachment entries with the following information for each attachment: logical volume name, time logical volume attached, rcp_id for the logical volume attachment. ____ ____ rcp_ rcp_ ____ ____ device_resvs an array of device reservation entries with the following information for each device reserved: reservation id, who it was reserved by, device type index, device name. vol_resvs an array of volume reservation entries with the following information for each volume reserved: reservation id, who it was reserved by, volume type index, volume name. EEEnnntttrrryyy::: rrrcccppp_$$$dddeeetttaaaccchhh rcp_$detach detaches an IOI device attachment. Depending on the disposition, the device will also be unassigned. USAGE declare rcp_$detach entry (bit(36) aligned, bit(*), fixed bin, char(*), fixed bin(35)); call rcp_$detach (rcp_id, disposition, error_count, comment, code); ARGUMENTS rcp_id unique rcp identification number that identifies the attachment of the device. (Input) disposition specifies whether the device should be unassigned or not. (Input) Any volume associated with the device is always unassigned. This argument's possible values are: "1"b - leave the device assigned to this process "0"b - if the device was assigned to this process by the rcp_$attach call that initiated this attachment, then unassign the device; otherwise leave it assigned to this process. error_count user ring error count for the attachment indicating the number of errors during the attachment. This count is logged in the system log message for this detachment. (Input) comment a comment to be displayed to the operator upon detachment of the device. (Input) ____ ____ rcp_ rcp_ ____ ____ code is a storage system status code. (Output) Possible codes returned are: error_table_$bad_arg indicates a possible invalid or incorrect rcp_id. error_table_$bad_processid the device was not attached to this process or the rcp_id (which reflects the process id which made the attachment) is invalid or incorrect. ACCESS REQUIRED Only the process which attached the device can detach it using this entry point. EEEnnntttrrryyy::: rrrcccppp_$$$dddeeetttaaaccchhh_lllvvv detaches one logical volume from the list of logical volumes attached for this process. USAGE declare rcp_$detach_lv entry (bit(36) aligned, fixed bin(35)); call rcp_$detach_lv (rcp_id, code); ARGUMENTS rcp_id is the rcp unique identifying number for the logical volume attachment. (Input). code is a storage system status code. (Output) Possible codes returned are: error_table_$bad_index the rcp_id supplied indicates an invalid offset into rcp_com_seg. ACCESS REQUIRED The only requirement to detach a logical volume using rcp_$detach_lv is that the caller process be the process that attached the logical volume. ____ ____ rcp_ rcp_ ____ ____ EEEnnntttrrryyy::: rrrcccppp_$$$gggeeettt_ssstttaaatttuuusss rcp_$get_status will find a resource given its name or UID, and return all the information about it depending on the user's access to the resource. USAGE declare rcp_$get_status entry (ptr, char (*), fixed bin (35)); call rcp_$get_status (resource_desc_ptr, registry_dir, code); ARGUMENTS resource_desc_ptr is a pointer to the resource_descriptions structure. See the definition under the rcp_$acquire entry point. (Input) registry_dir the absolute pathname of the directory containing the RCP registries. (Input) This is usually >system_control_1>rcp. code is a standard system status code. (Output) Possible codes returned are: error_table_$action_not_performed the action was not performed and the user does not have enough access to find out why. error_table_$bad_resource_spec there was erroneous data in the resource_descriptions structure supplied. error_table_$resource_awaiting_clear the resource is awaiting clear and is unavailable for status. error_table_$not_abs_path the registry directory pathname supplied is not an absolute pathname. error_table_$resource_locked the resource is locked and unavailable. error_table_$resource_unknown the requested resource is unknown to the system. ____ ____ rcp_ rcp_ ____ ____ error_table_$unimplemented_version the version of the resource_descriptions structure supplied is not supported. error_table_$resource_bad_access the user does not have enough access to get resource's status. ACCESS REQUIRED Read effective access is required to get the status of an RCP object. NOTES This entrypoint is only useful when the site has RCPRM enabled. EEEnnntttrrryyy::: rrrcccppp_$$$llliiisssttt_rrreeesssooouuurrrccceeesss rcp_$list_resources returns a list of resources owned by a specific user, by the system, or unowned resources. The selection of information to be returned is determined by the userid argument. USAGE declare rcp_$list_resources entry (char (*), char (*), char (*), ptr, fixed bin (35), ptr, fixed bin (35)); call rcp_$list_resources (resource_type, registry_dir, userid, user_area_ptr, n_resources, return_ptr, code); ARGUMENTS resource_type the resource type, i.e., "tape_vol". (Input) registry_dir the absolute pathname of the directory where the RCP registries are located. (Input) This is usually >system_control_1>rcp. userid contains the selection criteria for information to be returned. (Input) Its possible values are: ____ ____ rcp_ rcp_ ____ ____ Person.Project return information about the resources owned by the specified user. system return information about the resources owned by the system. free return information about the resources in the free pool. user_area_ptr pointer to the area where the resource_list structure should be allocated. See "Notes" below for description of the resource_list structure. (Input). n_resources number of resources in the resource_list structure returned to the user. (Output) return_ptr is a pointer to the allocated structure in the user-supplied area. (Output) code is a standard system status code. (Output) Possible codes returned are: error_table_$insufficient_access the user does not have enough access to find out the desired information. See "Access Required" below. error_table_$bad_name the userid supplied was Person.* and this is not allowed. error_table_$smallarg the user-supplied area is too small for the information to be returned. ACCESS REQUIRED R effective access is required to list the existence of a resource. This computation takes into account ONLY the AIM range of the resource since R raw mode is not necessary to list the existence of a resource, but read_allowed_ is required. ____ ____ rcp_ rcp_ ____ ____ NOTES This entrypoint is only useful when the site has RCPRM enabled. The resource_list structure is defined in resource_list.incl.pl1 and is declared as follows: dcl 1 resource_list aligned based (resource_list_ptr), 2 forward_ptr pointer initial (null), 2 max_entries fixed bin, 2 n_resources fixed bin initial (0), 2 resource_name (Max_entries refer (resource_list.max_entries)) char (32); STRUCTURE ELEMENTS forward_ptr points to the next block, null if there is no next block. max_entries number of elements in the resource_name array. n_resources number of valid resource names in this block. resource_names array of resource names that meet the specified criteria. EEEnnntttrrryyy::: rrrcccppp_$$$ppprrrooommmooottteee This procedure is called to change (promote or demote) the caller's validation level for the specified rcp_com_seg entry (RCSE). This validation level defines the highest ring from which calls can be made to RCP (and also IOI) that involve this RCSE. If there is an entry associated with this one then it too will be promoted or demoted. If an attachment kind of RCSE is found then IOI will be called to promote or demote the associated device once the attachment completes. USAGE declare rcp_$promote entry (bit(36) aligned, fixed bin, fixed bin(35)); call rcp_$promote (rcp_id, new_level, code); ____ ____ rcp_ rcp_ ____ ____ ARGUMENTS rcp_id internally generated unique identifying number for the assignment or attachment which indicates the entry in rcp_com_seg which is to be promoted or demoted. new_level new level for the associated RCSE for this caller. code is a storage system status code. (Output) Possible codes returned are: error_table_$bad_index the rcp_id indicates an invalid offset into rcp_com_seg (not a valid RCSE). error_table_$invalid_state the RCSE indicated by the rcp_id is in an invalid state. ACCESS REQUIRED To promote an attachment RCSE, the caller must have E access to admin_gate_$ioi_promote. EEEnnntttrrryyy::: rrrcccppp_$$$rrreeellleeeaaassseee This entry point relinquishes the resource back to the free pool. It has the effect of changing the accounting owner back to "free" and it then becomes available for all to acquire. USAGE declare rcp_$release entry (ptr, char (*), fixed bin (35)); call rcp_$release (resource_desc_ptr, registry_dir, code); ARGUMENTS resource_desc_ptr is a pointer to the resource_descriptions structure. See the definition under the rcp_$acquire entry point. (Input) registry_dir the absolute pathname of the registry directory. (Input) ____ ____ rcp_ rcp_ ____ ____ code is a storage system status code. (Output) Possible codes returned are: error_table_$action_not_performed the action was not performed and the user does not have enough access to find out why. error_table_$bad_resource_spec there was erroneous data in the resource_descriptions structure supplied. error_table_$not_abs_path the registry directory pathname is not an absolute pathname. error_table_$resource_locked the resource is locked and unavailable for release. error_table_$resource_free the requested resource is already in the free state. error_table_$resource_unknown the requested resource is unknown to the system. error_table_$unimplemented_version the version supplied in the resource descriptions structure is invalid. error_table_$bad_access the user does not have enough access to release the resource. ACCESS REQUIRED The user must be the resource owner and have REW access. By default, if there is no acs_path for this resource, the owner will have REW access. However, in the case that an acs_path is specified and the user does not have REW effective access, the release will be denied. In this way, users can protect themselves from erroneously releasing volumes. ____ ____ rcp_ rcp_ ____ ____ EEEnnntttrrryyy::: rrrcccppp_$$$rrreeessseeerrrvvveee This entry point is called to reserve devices and volumes. Multiple devices and volumes can be reserved at a time, however, if the reservation for any one in a set fails the entire reservation fails. This entry point is primarily used by the absentee facility to insure that resources required for an absentee job are available prior to run time. Reservation of the resources guarantees their exclusive use by the process until explicit channel of the reservation or process termination. In this way, an absentee job will not fail during execution due to the unavailability of resources. USAGE declare rcp_$reserve entry (ptr, ptr, fixed bin (35)); call rcp_$reserve (resource_desc_ptr, resource_res_ptr, code); ARGUMENTS resource_desc_ptr is a pointer to the resource_descriptions structure. See the definition under the rcp_$acquire entry point for a description of this structure. (Input) resource_res_ptr is a pointer to the reservation_description structure. See "Notes" below for a description of this structure. (Input) code is a storage system status code. (Output) Possible codes returned are: error_table_$bad_conversion the attributes supplied in the reservation_descriptions structure are invalid. error_table_$badcall the number of items requested in the reservation_descriptions structure does not match the number of items in the resource_descriptions structure. error_table_$resource_unknown resource not know to the system. error_table_$unimplemented_version the version number supplied in the resource_descriptions structure or the reservation_descrption structure is incorrect. ____ ____ rcp_ rcp_ ____ ____ error_table_$device_limit_exceeded the user already has the maximum number of devices assigned and cannot reserve any devices. error_table_$reservation_failed indicates there are no volumes or devices appropriate, available, or accessible to meet the requirements of the reservation specification. ACCESS REQUIRED R access is required to reserve a volume; RW access is required to reserve a device. NOTES The reservation_description structure is declared in resource_control_desc.incl.pl1 and is declared as follows: dcl 1 reservation_description based (resource_res_ptr) aligned, 2 version_no fixed bin, 2 reserved_for char (32), 2 reserved_by char (32), 2 reservation_id fixed bin (71), 2 group_starting_time fixed bin (71), 2 asap_duration fixed bin (71), 2 flags aligned, (3 auto_expire bit (1), 3 asap bit (1), 3 rel bit (1), 3 sec bit (1)) unaligned, 2 n_items fixed bin, 2 reservation_group (Resource_count refer (reservation_description.n_items)), 3 starting_time fixed bin (71), 3 duration fixed bin (71); version_no the version number of this structure. reserved_for group id of the process who this reservation is for. reserved_by group_id of the process performing the reservation. reservation_id internally generated reservation id number for this reservation group. ____ ____ rcp_ rcp_ ____ ____ group_starting_time starting time for the reservation. asap_duration after this time the reservation is no longer desired. auto_expire "1"b indicates reservation should expire when the process terminates. (Default). asap "1"b indicates make this reservation within the asap_duration time. rel "1"b indicates that times are relative to the current clock time, otherwise they are absolute times. sec "1"b indicates times are in seconds; otherwise they are in microseconds. n_items the number of items being reserved. Must be equal to n_items in the associated resource_descriptions structure. starting_time time the reservation begins. All values in this array will be equal. duration length of time the reservation is good. All values in the array will be equal. EEEnnntttrrryyy::: rrrcccppp_$$$ssseeettt_ssstttaaatttuuusss The set entrypoint will find a resource given its name or UID, and replace various properties of it (depending on your privilege and access). USAGE declare rcp_$set_status entry (ptr, char (*), fixed bin (35)); call rcp_$set_status (resource_desc_ptr, registr_dir, code); ARGUMENTS resource_desc_ptr is a pointer to the resource_descriptions structure. See the definition under the rcp_$acquire entry point for a description of this structure. (Input) registr_dir the absolute pathname of the registry directory. (Input) ____ ____ rcp_ rcp_ ____ ____ code is a storage system status code. (Output) Possible codes returned are: error_table_$action_not_performed the action was not performed and the user does not have enough access to find out why. error_table_$bad_resource_spec there was erroneous data in the resource_descriptions structure supplied. error_table_$resource_awaiting_clear the resource is awaiting clear and is unavailable for use. error_table_$not_abs_path the registry directory pathname is not an absolute pathname. error_table_$rcp_bad_attributes the attributes specified by the user are invalid. error_table_$resource_locked the resource is locked and unavailable. error_table_$resource_free cannot set properties on a free resource. error_table_$resource_unknown the requested resource is unknown to the system. error_table_$unimplemented_version the version supplied in the resource descriptions structure is invalid. error_table_$resource_bad_access the user does not have enough access to set the desired properties. ACCESS REQUIRED There are two types of set_status. The first type is a set_access which sets an access property - acs_path. The subject must be the resource owner and have REW access if the ACS exists. If the ACS does not exist, the owner by default has REW and is the only one that can set the acs_path. The second type of set_status is setting of regular resource properties. These fall into two categories: those that require REW access (comment, location, lock, release_lock and charge_type) to prevent a covert ____ ____ rcp_ rcp_ ____ ____ channel, and those that require RW access (user_alloc and attributes). In the first category, only the comment can be set by a non_privileged user with REW access. All others require the call to be made through a privileged gate. EEEnnntttrrryyy::: rrrcccppp_$$$uuunnnaaassssssiiigggnnn Unassign a resource given its rcp_id. USAGE declare rcp_$unassign entry (bit(36) aligned, bit(*), char(*), fixed bin(35)); call rcp_$unassign (rcp_id, disposition, comment, code); ARGUMENTS rcp_id is the unique id that was generated for the assignment. (Input) disposition unused. (Input) comment is a message to be displayed to the operator upon completion of the unassignment. (Input) code is a storage system status code. (Output) Possible codes returned are: error_table_$bad_arg indicates an erroneous rcp_id was generated and RCP cannot find the resource entry in rcp_com_seg to which it refers. error_table_$resource_unassigned indicates the resource specified is not assigned to this process. ACCESS REQUIRED The only requirement to unassign a resource using rcp_$unassign is that process be the same process that made the assignment. All resources are automatically unassigned when the process terminates. ____ ____ rcp_ rcp_ ____ ____ EEEnnntttrrryyy::: rrrcccppp_$$$uuunnnaaassssssiiigggnnn_dddeeevvviiiccceee Unassign a device given its name. USAGE declare rcp_$unassign_device entry (char(*), bit(*), char(*), fixed bin(35)); call rcp_$unassign_device (device_name, disposition, comment, code); ARGUMENTS device_name is the name of the device to be unassigned. (Input) disposition unused. (Input) comment is a message to be displayed to the operator upon completion of the unassignment. (Input) code is a storage system status code. (Output) Possible codes returned are: error_table_$resource_unassigned indicates the resource specified is not assigned to this process. ACCESS REQUIRED The only requirement to unassign a resource using rcp_$unassign is that process be the same process that made the assignment. All resources are automatically unassigned when the process terminates. ____ ___________ rcp_ run_test_as ____ ___________ NNNaaammmeee::: rrruuunnn_ttteeesssttt_aaasss SYNTAX AS A COMMAND run_test_as test_sc1_dir FUNCTION This command establishes a test version of the Initializer's user control environment in the caller's process. In this environment, the standard operator requests are available to manipulate user processes created by the test environment. Process can be created for Multics Networking Architecture (MNA) interactive user, absentee users and daemon users. ARGUMENTS test_sc1_dir is the pathname of the user directory to be used as the system control directory. You must specify a directory other than >sc1 to avoid interfering with the real user control running in the Initializer process. ACCESS REQUIRED This command requires access to a variety of privileged gates needed to initialize the System Control and User Control environments. These include hpriv_connection_list_ and network_accounting_gate_. NOTES The pathname of a test >sc1 directory must be given as an argument to this command. Do not use the real >sc1 directory, or you will interfere with operation of the real system control environment in the Initializer process. The test >sc1 directory should already contain all segments needed to run the system control and user control environments. If segments are missing or incorrectly formatted, error messages will result and the environment initialization will fail. The user control environment is not highly robust, so fatal process errors (although not common) may occur if things are improperly setup. ___________ _____________ run_test_as restart_fault ___________ _____________ The best way to setup the directory is to refer to the acct_start_up.ec to see what needs to be in the test >sc1 directory. After the test directory is built, invoke this command and fix all errors which result. Another (more frustrating) approach is to invoke this command with an empty directory and fix the errors, reinvoke and fix the new errors, etc. WARNING: The system control environment plays with the I/O switches. Do not expect it to work in anything but a virgin environment (no auditing, no video). And don't be surprised if your favorite commands (emacs) won't work once you've started the test environment. After exiting the test environment, a new_proc is recommended to cleanse the user process. ________________________________________ NNNaaammmeee::: rrreeessstttaaarrrttt_fffaaauuulllttt EEEnnntttrrryyy::: rrreeessstttaaarrrttt_fffaaauuulllttt$$$cccllleeeaaannnuuuppp_eeennntttrrryyy this gate is called to indicate that the process is unwinding past a signaller fault frame. It instructs ring zero to discard the saved copy of the machine conditions. USAGE declare restart_fault$cleanup_entry entry; call restart_fault$cleanup_entry (); NOTES 1) This gate is not available in the user ring address space. An entry pointer to this gate is left in the signaller stack frame by signaller.alm as the handler of the condition "cleanup". When a condition is signalled by ring 0, the program signaller.alm builds a stack frame on the user ring stack that includes a copy of the machine conditions for the condition. It then arranges for the entry signal_ to be called in the outer ring. 2) This entry is called as follows: when control is unwound (non-local go-to'ed) past the frame built by signaller, the cleanup handler is executed. This gate is the cleanup handler. It ignores its parameters, but uses the display pointer in its _____________ _____________ restart_fault restart_fault _____________ _____________ argument list to find the stack frame just before its caller's on the stack. Since its caller is signal_, the previous frame is the signaller frame. Interpreting the previous frame as a signaller frame, it extracts the saved machine condition index from mc.fim_temp, and frees those machine conditions from the ring 0 stack of saved machine conditions. If the argument list lacks a display pointer, or if the previous frame is not marked as a signaller frame, or if the machine condition index is invalid, then nothing is done. See restart_fault$restart_entry for more information. EEEnnntttrrryyy::: rrreeessstttaaarrrttt_fffaaauuulllttt$$$rrreeessstttaaarrrttt_eeennntttrrryyy This gate is called to restart execution of a set of machine conditions that resulted from a fault or IPS signal. USAGE declare restart_fault$restart_entry entry; call restart_fault$restart_entry (); NOTES This gate is not available in the user address space. It is called as follows: When a user process takes a fault, or an IPS signal is to be signalled, control is transferred to the ring zero program signaller.alm. This program saves a copy of the machine conditions in the ring zero machine conditions save area (pds$mc_save_area points to it). This save area is organized as a stack of machine conditions, the most recent set stored on the top of the stack. (Since the stack is unwound on exit from an inner ring, there can be no interference between machine conditions for different rings.) In addition, the machine conditions are copied into the signaller stack frame on the outer ring stack, where they are accessible to the user. The user process is permitted to make some limited modifications to the machine conditions, such as setting the result value for a floating point underflow. See restart_fault.alm for details. The return pointer in the signaller stack frame is restart_fault|0 (restart_fault$restart_entry). When control arrives here, the machine conditions from the signaller stack frame (as potentially modified by the user) are copied into the _____________ ________________ restart_fault send_as_request_ _____________ ________________ pds. They are then checked against the saved machine conditions in the save area to insure that no invalid modifications have been made. If there were invalid modifications, the illegal_return condition is signalled. Otherwise, the saved machine conditions are popped off of the stack, and the processor resumes execution be restoring the machine conditions. ________________________________________ NNNaaammmeee::: ssseeennnddd_aaasss_rrreeeqqquuueeesssttt_ The send_as_request_ subroutine contains entry points that send messages to the system Answer Service Request server. It is not recommended that any application code send as_requests. Subroutine interfaces are available for all the supported as_request facilities. EEEnnntttrrryyy::: ssseeennnddd_aaasss_rrreeeqqquuueeesssttt_$$$bbbllloooccckkk sends an as_request, and blocks to await the system's reply. USAGE declare send_as_request_$block entry (ptr, fixed bin, bit(72)!aligned, bit(72) aligned, fixed bin(35)); call send_as_request_$block (as_request_ptr, as_request_len, as_request_id, as_request_reply, code); ARGUMENTS as_request_ptr is a pointer to standard as_request structure. (Input) as_request_structures begin with a header declared in as_request_header.incl.pl1. (See "Notes" below). as_request_len is the length of the standard as_request structure, in words. (Input) as_request_id is the unique identifier assigned to the request. (Output) as_request_reply is the event message returned by the system in reply to the request. (Output) ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ code is a standard system status code. (Output) NOTES The send_as_request_$block entrypoint each takes a request pointer defining an operation. The allowed requests for this entrypoint are described below. Operation: admin_command This answering service request executes a specified command line in the system control process (Initializer.SysDaemon.z). It optionally sends the user a wakeup at the start or completion of command execution and returns information to the caller about errors which occurred while executing the command line. It optionally sends the user mail containing the output produced by executing the command line. This is an answering service request, and as such, is not called directly as a subroutine. A structure containing the relevant information, described below, is filled in by the caller and a pointer to this structure, as well as the length of the structure, is passed to the send_as_request_ subroutine for processing. ADMIN COMMAND INFO STRUCTURE Following is a definition of the structure which is passed as input to the send_as_request_ subroutine. It is declared in as_requests.incl.pl1. dcl 1 asr_admin_command_info aligned, 2 header aligned like as_request_header, 2 version char (8), 2 flags aligned, 3 send_start_wakeup bit (1) unaligned, 3 send_completion_wakeup bit (1) unaligned, 3 send_completion_message bit (1) unaligned, 3 send_completion_mail bit (1) unaligned, 3 dialog bit (1) unaligned, 3 pad bit (31) unaligned, 2 dialog_info aligned, 3 event_channel fixed bin (71), 3 output_message_segment_pathname char (200) unaligned, 3 input_message_segment_pathname char (200) unaligned, ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ 2 mail_destination char (200) unaligned, 2 command_length fixed bin (21), 2 command char (asr_ac_length refer (asr_admin_command_info.command_length)) unaligned; STRUCTURE ELEMENTS header is the as_request_header structure, described below and defined in the include file as_request_header.incl.pl1. (Input) version is the version number of the asr_admin_command_info structure. This version number is currently equal to the constant ASR_AC_VERSION_1, defined in the include file as_requests.incl.pl1. (Input) send_start_wakeup is a flag indicating whether the user is to be sent a wakeup over the event channel specified in the header at the start of command execution. (Input) send_completion_wakeup is a flag indicating whether the user is to be sent a wakeup over the event channel specified in the header at the completion of command execution. (Input) send_completion_message is a flag indicating whether the user is to be notified by interactive message of the completion of command execution. The message includes an indication of whether the command was executed with or without errors. (Input) send_completion_mail is a flag indicating whether the user is to be notified by mail of the completion of command execution. The mail includes a transcription of the output generated during execution of the command line. (Input) dialog is currently unused and is ignored. dialog_info is currently unused and is ignored. mail_destination is the mail system destination, e.g. mail table entry, where the completion mail is to be sent if the send_completion_mail flag is on. (Input) ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ command_length is the length, in characters, of the command line to be executed. (Input) command is the actual command line to be executed. (Input) ADMIN COMMAND REPLY STRUCTURE Following is a definition of the structure which overlays the reply argument to the send_as_request_ subroutine. It contains information about the status of the answering service request execution. It is declared in as_requests.incl.pl1. dcl 1 asr_reply_admin_command aligned, 2 code fixed bin (35), 2 flags aligned, 3 command_refused bit (1) unaligned, 3 command_started bit (1) unaligned, 3 command_completed bit (1) unaligned, 3 command_aborted bit (1) unaligned, 3 command_had_errors bit (1) unaligned, 3 pad bit (31) unaligned; STRUCTURE ELEMENTS code is a standard system status code. (Output) command_refused is a flag indicating whether execution of the command was refused. If this flag is on, then code, above, indicates the reason why. (Output) command_started is a flag indicating whether the command has started execution. (Output) command_completed is a flag indicating whether the command has completed execution. (Output) command_aborted is a flag indicating whether the command was aborted. (Output) command_had_errors is a flag indicating whether the command encountered an error (wrote a message over the error_output switch) during execution. (Output) ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ AS REQUEST HEADER INFO STRUCTURE Following is a definition of the as_request_header structure used above and defined in the include file as_request_header.incl.pl1. It provides general information to the answering service request server. dcl 1 as_request_header based aligned, 2 version fixed bin, 2 type fixed bin, 2 reply_channel fixed bin (71); STRUCTURE ELEMENTS version is the version number of the as_request_header structure. Currently this must be equal to the constant as_request_version_1 declared in the include file as_request_header.incl.pl1. (Input) type is the type of answering service request. For the admin_command request, this must be equal to the constant ASR_ADMIN_COMMAND, declared in the include file as_request_header.incl.pl1. (Input) reply_channel is the IPC event channel over which the answering service request server will send status wakeups. (Input) ACCESS REQUIRED The user must have RW effective access to the ACS segment >sc1>admin_acs>send_admin_command.acs in order to issue this answering service request. Operation: bump_user This answering service request causes a specified user process to be bumped (forcibly logged out). This is an answering service request, and as such, is not called directly as a subroutine. A structure containing the relevant information, described below, is filled in by the caller and a pointer to this structure, as well as the length of the structure, is passed to the send_as_request_ subroutine for processing. See the documentation on the send_as_request_ subroutine for more information about the calling sequence. ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ BUMP USER INFO STRUCTURE Following is a definition of the structure which is passed as input to the send_as_request_ subroutine. dcl 1 asr_bump_user_info aligned, 2 header aligned like as_request_header, 2 version char (8), 2 process_id bit (36), 2 message char (100) unaligned, 2 grace_time_in_seconds fixed bin, 2 reply_reference_id bit (36); STRUCTURE ELEMENTS header is the as_request_header structure, described above and defined in the include file as_request_header.incl.pl1. (Input) version is the version number of the asr_bump_user structure. This version number is currently equal to the constant asr_bump_user_info_version_1, declared in the include file as_requests.incl.pl1. (Input) process_id is the process id of the process to be bumped. (Input) message is the message to be displayed on the user's terminal when the bump begins, that is, when the user's grace period begins. If this argument is the null string, no message is sent to the user's terminal. (Input) grace_time_in_seconds is the amount of time, in seconds, the user is given before the process is actually terminated. (Input) reply_reference_id is a reference_id returned in the asr_reply_bump_user structure. An IPC reply channel must be specified in the reply_channel variable of the header of this structure in order for the reply reference id to be returned. (Input) ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ BUMP USER REPLY STRUCTURE Following is a definition of the structure which overlays the reply argument to the send_as_request_ subroutine. It contains information about the status of the answering service request execution. dcl 1 asr_reply_bump_user aligned based (asr_replyp), 2 code fixed bin (35), 2 reference_id bit (36); STRUCTURE ELEMENTS code is a standard system status code. (Output) reference_id is the same reference id supplied in the reference_id variable in the input structure. It is used to synchronize requests and replies. (Output) ACCESS REQUIRED The user must have RW effective access to the ACS segment >sc1>admin_acs>bump_user.acs in order to issue this answering service request. Operation: com_channel_info This answering service request returns to the user information about a communications channel attached to his process. This is an answering service request, and as such, is not called directly as a subroutine. A structure containing the relevant information, described below, is filled in by the caller and a pointer to this structure, as well as the length of the structure, is passed to the send_as_request_ subroutine for processing. COM CHANNEL INFO STRUCTURE Following is a definition of the structure which is passed as input to the send_as_request_ subroutine. It is declared in asr_com_channel_info.incl.pl1. ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ dcl 1 asr_com_channel_info aligned, 2 header aligned like as_request_header, 2 version char (8), 2 channel_name char (32) unaligned, 2 reply_version_requested char (8), 2 reply_message_handle bit (72) aligned; STRUCTURE ELEMENTS header is the as_request_header structure, described above and defined in the include file as_request_header.incl.pl1. (Input) version is the version number of the asr_com_channel_info structure. This version number is currently equal to the constant ASR_CCI_VERSION_1, declared in the include file asr_com_channel_info.incl.pl1. (Input) channel_name is the name of the communications channel for which information is to be returned. reply_version_requested is the version of the as_com_channel_info structure (not to be confused with the asr_com_channel_info structure) requested. This structure will be filled in by the answering service and sent to the user via the user message facility. It is the user process' responsibility to read this message with the user_message_$read_message subroutine. (Input) reply_message_handle is the handle to be used in sending the user message. This value is used by the user when calling user_message_$read_message to read the message from the user message facility. (Input) COM CHANNEL INFO REPLY STRUCTURE Following is a definition of the structure which overlays the reply argument to the send_as_request_ subroutine. It contains information about the status of the answering service request execution. It is declared in asr_com_channel_info.incl.pl1. dcl 1 asr_reply_com_channel_info aligned, 2 code fixed bin (35), 2 pad bit (36) aligned; ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ STRUCTURE ELEMENTS code is a standard system status code. (Output) ACCESS REQUIRED In order to receive information about a communications channel, the user must either have the communications channel attached as the primary login channel, or as a secondary autocall or slave channel. Operation: daemon_command This answering service request allows a user to login or logout system daemon processes, send command lines to be executed in daemon processes, and send QUIT IPS signals to deamon processes. This is an answering service request, and as such, is not called directly as a subroutine. A structure containing the relevant information, described below, is filled in by the caller and a pointer to this structure, as well as the length of the structure, is passed to the send_as_request_ subroutine for processing. DAEMON COMMAND INFO STRUCTURE Following is a definition of the structure which is passed as input to the send_as_request_ subroutine. It is declared in asr_daemon_command.incl.pl1. dcl 1 asr_daemon_command_info aligned, 2 header aligned like as_request_header, 2 version char (8), 2 action_code fixed bin, 2 user_name char (32) unaligned, 2 project_name char (32) unaligned, 2 source_name char (32) unaligned, 2 pad (10) bit (36) aligned, 2 command_length fixed bin (21), 2 command char (asr_dc_length refer (asr_daemon_command_info.command_length)) unaligned; ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ STRUCTURE ELEMENTS header is the as_request_header structure, described above and defined in the include file as_request_header.incl.pl1. (Input) version is the version number of the asr_daemon_command_info structure. This version number is currently equal to the constant ASR_DC_INFO_VERSION_1, declared in the include file asr_daemon_command.incl.pl1. (Input) action_code is the desired action (login, logout, reply, quit) to be performed. The include file asr_daemon_command.incl.pl1 defines constants to be used in setting this action code. (Input) user_name is the user name for the "login" subrequest. (Input) project_name is the project name for the "login" subrequest. (Input) source_name is the message coordinator source name used to identify the daemon process for the "reply", "quit", and "logout" subrequests, and over which the daemon is to be logged in for the "login" subrequest. (Input) command_length is the length of the command line supplied below. (Input) command is the command line to be sent to the daemon process for the "reply" subrequest and are the optional login arguments to be supplied for the "login" subrequest. (Input) DAEMON COMMAND REPLY STRUCTURE Following is a definition of the structure which overlays the reply argument to the send_as_request_ subroutine. It contains information about the status of the answering service request execution. It is declared in asr_daemon_command.incl.pl1. ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ dcl 1 asr_reply_daemon_command aligned, 2 code fixed bin (35), 2 flags aligned, 3 command_refused bit (1) unaligned, 3 no_such_daemon bit (1) unaligned, 3 no_access_to_daemon bit (1) unaligned, 3 pad bit (33) unaligned; STRUCTURE ELEMENTS code is a standard system status code. (Output) command_refused is a flag indicating that the daemon_command request has been refused. The variable code indicates the reason for the refusal. (Output) no_such_daemon is a flag indicating that the daemon specified by the source_name variable in the input structure does not exist. (Output) no_access_to_daemon is a flag indicating that the user did not have the required access to manipulate the daemon. (Output) ACCESS REQUIRED If the installation parameter validate_daemon_commands is disabled, RW effective access is required to the ACS segment >sc1>admin_acs>send_daemon_command.acs. If, however, the validate_daemon_commands installation parameter is enabled, then the user must have the appropriate access to the MCACS segment located in >sc1>mc_acs>SOURCE_NAME.mcacs, where SOURCE_NAME is the same as that specified in the input structure, above. The MCACS segment is an extended entry, with extended ACLs. In order to login or logout a daemon process, the user must have "c" access to the MCACS segment. In order to reply to a daemon process, the user must have "r" access. In order to send a QUIT IPS signal, the user must have "q" access. Additionally, for the login subrequest, the process being logged in over the specified message coordinator SOURCE_NAME must have "d" access to the MCACS segment. ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ Operation: dial_out This answering service request allows the user to "dial out" an autocall service communications channel to a specified destination. This is an answering service request, and as such, is not called directly as a subroutine. A structure containing the relevant information, described below, is filled in by the caller and a pointer to this structure, as well as the length of the structure, is passed to the send_as_request_ subroutine for processing. See the documentation on the send_as_request_ subroutine for more information about the calling sequence. DIAL SERVER REQUEST INFO STRUCTURE Following is a definition of the structure which is passed as input to the send_as_request_ subroutine. dcl 1 dial_server_request aligned based (request_ptr), 2 header like as_request_header, 2 version fixed bin, 2 dial_control_channel fixed bin (71), 2 dial_qualifier char (22), 2 channel_name char (32), 2 dial_out_destination char (32), 2 baud_rate fixed bin, 2 line_type fixed bin, 2 server_type char (32), 2 flags aligned, 3 start bit (1) unaligned, 3 stop bit (1) unaligned, 3 privileged_attach bit (1) unaligned, 3 release_channel bit (1) unaligned, 3 registered_server bit (1) unaligned, 3 no_hangup bit (1) unaligned, 3 release_dial_id bit (1) unaligned, 3 tandd_attach bit (1) unaligned, 3 no_listen bit (1) unaligned, 3 access_class_specified bit (1) unaligned, 3 privileged_server bit (1) unaligned, 3 pad bit (25) unaligned, 2 access_class bit (72); ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ STRUCTURE ELEMENTS header is the as_request_header structure, described above and defined in the include file as_request_header.incl.pl1. (Input) version is the version number of the dial_server_request structure. This version number is currently equal to the constant dial_server_request_version_4 declared in the include file dial_server_request.incl.pl1. (Input) dial_control_channel is an IPC event channel over which the answering service will send status wakeups. The event messages received over this event channel should be interpreted with the convert_dial_message_ subroutine. (Input) dial_qualifier is not used for the dial_out answering service request. channel_name is the channel name over which the user wishes to dial out. This channel name may be specified using the star convention in which case any available autocall channel which matches the star name will be used. A generic destination, as defined in the Channel Definition Table (CDT) may be specified in lieu of a specific channel name or star name. (Input) dial_out_destination is a character string representation of the dial out destination. This may be a phone number for an Auto Call Unit (ACU) or any other destination recognized by the device or multiplexer connected to the communications channel being dialed out on. (Input) baud_rate is the desired baud rate of the autocall channel. This may be -1 if the user doesn't care to specify the baud rate. (Input) line_type is the desired line type of the autocall channel. See the include file line_types.incl.pl1 for a list of the recognized line types. The value of "lbound (line_types, 1)" should be used if the user does not care what line type is chosen. (Input) server_type is not used for the dial_out answering service request. ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ start is not used for the dial_out answering service request. stop is not used for the dial_out answering service request. privileged_attach is not used for the dial_out answering service request. release_channel is not used for the dial_out answering service request. registered_server is not used for the dial_out answering service request. no_hangup is not used for the dial_out answering service request. release_dial_id is not used for the dial_out answering service request. tandd_attach is not used for the dial_out answering service request. no_listen is not used for the dial_out answering service request. access_class_specified is a flag indicating whether the user wishes to specify the access class of the autocall connection. (Input) privileged_server is not used by the dial_out answering service request. access_class is the access class of the autocall connection desired by the user. This access class must equal the user's process authorization unless the comm privilege is enabled. If the privilege is enabled, the specified access class must be between the user's current and maximum authorization. If the access_class_specified flag is not enabled, this argument is ignored. (Input) DIAL OUT REPLY The dial out request replies via the event message, as do other AS requests. But the structure of this reply must be interpreted by the convert_dial_message_ subroutine described in the Multics Subroutines manual. ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ ACCESS REQUIRED In order to use the dial_out answering service request, the user must have the dialok attribute enabled. In addition, if the system administrator has enabled the "dial_out" check_acs flag for the specified channel in the CDT, the user must have RW effective access to the ACS segment >sc1>rcp>CHANNEL_NAME.acs where CHANNEL_NAME is the channel name specified (or implied) by channel_name, above. If the system administrator has not enabled the "dial_out" check_acs flag for the channel, then no other access is required to initiate a dial out. Operation: dial_server This answering service request allows the user to start, stop, and shutoff dial-id service, or to attach a communications channel for normal or Test and Diagnostics (T&D) use. This is an answering service request, and as such, is not called directly as a subroutine. A structure containing the relevant information, described below, is filled in by the caller and a pointer to this structure, as well as the length of the structure, is passed to the send_as_request_ subroutine for processing. See the documentation on the send_as_request_ subroutine for more information about the calling sequence. DIAL SERVER REQUEST INFO STRUCTURE Following is a definition of the structure which is passed as input to the send_as_request_ subroutine. dcl 1 dial_server_request aligned based (request_ptr), 2 header like as_request_header, 2 version fixed bin, 2 dial_control_channel fixed bin (71), 2 dial_qualifier char (22), 2 channel_name char (32), 2 dial_out_destination char (32), 2 baud_rate fixed bin, 2 line_type fixed bin, 2 server_type char (32), 2 flags aligned, 3 start bit (1) unaligned, 3 stop bit (1) unaligned, 3 privileged_attach bit (1) unaligned, 3 release_channel bit (1) unaligned, 3 registered_server bit (1) unaligned, 3 no_hangup bit (1) unaligned, ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ 3 release_dial_id bit (1) unaligned, 3 tandd_attach bit (1) unaligned, 3 no_listen bit (1) unaligned, 3 access_class_specified bit (1) unaligned, 3 privileged_server bit (1) unaligned, 3 pad bit (25) unaligned, 2 access_class bit (72); STRUCTURE ELEMENTS header is the as_request_header structure, described above and defined in the include file as_request_header.incl.pl1. (Input) version is the version number of the dial_server_request structure. This version number is currently equal to the constant dial_server_request_version_4 declared in the include file dial_server_request.incl.pl1. (Input) dial_control_channel is an IPC event channel over which the answering service will send status wakeups. The event messages received over this event channel should be interpreted with the convert_dial_message_ subroutine. (Input) dial_qualifier for the start_dial_id, stop_dial_id, and shutoff_dial_id subrequests, this specifies the name of the dial_id to manipulate. (Input) channel_name for the priv_attach, tandd_attach, and release_channel subrequests, specifies the name of the channel the user wishes to manipulate. This channel name may be specified via the star convention, or a generic channel name may be used. Generic names are defined by the system administrator in the Channel Definition Table (CDT). (Input) dial_out_destination is not used for the dial_server answering service request. baud_rate for the priv_attach, tandd_attach, and release_channel subrequests, is the desired baud rate of the channel. This may be -1 if the user doesn't care to specify the baud rate. (Input) ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ line_type for the priv_attach, tandd_attach, and release_channel subrequests, is the desired line type of the channel. See the include file line_types.incl.pl1 for a list of the recognized line types. The value of "lbound (line_types, 1)" should be used if the user does not care what line type is chosen. (Input) server_type is currently not used. start specifies that the user wishes to start a dial_id service. (Input) stop specifies that the user wishes to stop a dial_id service. (Input) privileged_attach specifies that the user wishes to attach a communications channel. The channel must be a slave service type channel at the time of the request unless the tandd_attach flag is on. (Input) release_channel specifies that the user wishes to release a channel previously attached with the privileged_attach subrequest. (Input) registered_server for the start_dial_id subrequest, specifies that the user wishes to use a registered dial id. A dial_id is registered by a system administrator. (Input) no_hangup is only valid for the release_channel requests, and requests that the channel be left dialed, rather than hung up, which is the default. (Input) release_dial_id specifies that the user wishes to shutoff dial service and hang up any communications channels already attached to the process. (Input) tandd_attach is only valid for the privileged_attach subrequest, and specifies that a T&D attachment is to be used. (Input) ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ no_listen is only valid for the release_channel subrequest, and specifies that the answering service is not to listen for dialups on this channel after it is released. (Input) access_class_specified is not used by the dial_server answering service request. privileged_server this field is only valid for the start_dial_id subrequest and specifies that the process may accept dials from users dialing in at any authorization up to the maximum authorization of the server process (the process issuing the request). (Input) access_class is not used by the dial_server answering service request. DIAL SERVER REPLY The dial server request replies via the event message, as do other AS requests. But the structure of this reply must be interpreted by the convert_dial_message_ subroutine described in the Multics Subroutines manual. ACCESS REQUIRED In order to use the dial_server answering service request, the user must have the dialok attribute enabled. In addition, for the priv_attach subrequest, if the system administrator has enabled the "priv_attach" check_acs flag for the specified channel in the CDT, the user must have RW effective access to the ACS segment >sc1>rcp>CHANNEL_NAME.acs where CHANNEL_NAME is the channel name specified (or implied) by channel_name, above. If the system administrator has not enabled the "priv_attach" check_acs flag for the channel, then no other access is required to attach a channel. In order to become a registered dial server, the user must have RW effective access to the ACS segment >sc1>rcp>dial.DIAL_QUALIFIER.acs where DIAL_QUALIFIER is the name specified as dial_qualifier, above. In order to become a privileged server, the user must have the comm privilege enabled, or have its validation level set to Ring-1. In order to make a T&D attachment (that is, specifying the tandd_attach flag for the priv_attach subrequest), the user must have RW effective access to the ACS segment >sc1>admin_acs>tandd.acs. ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ Operation: fpe_causes_logout This answering service request indicates that the answering service should log out the process if it takes a fatal process error. This is an answering service request, and as such, is not called directly as a subroutine. A structure containing the relevant information, described below, is filled in by the caller and a pointer to this structure, as well as the length of the structure, is passed to the send_as_request_ subroutine for processing. See the documentation on the send_as_request_ subroutine for more information about the calling sequence. FPE CAUSES LOGOUT STRUCTURE For fpe_causes_logout, simply pass the as_request_header structure as input to send_as_request_. It is declared in the include file as_request_header.incl.pl1. It provides general information to the answering service request server. dcl 1 as_request_header based aligned, 2 version fixed bin, 2 type fixed bin, 2 reply_channel fixed bin (71); STRUCTURE ELEMENTS version is the version number of the as_request_header structure. Currently this must be equal to the constant as_request_version_1 declared in the include file as_request_header.incl.pl1. (Input) type is the type of answering service request. For the fpe_causes_logout request, this must be equal to the constant ASR_FPE_CAUSES_LOGOUT, declared in the include file as_request_header.incl.pl1. (Input) reply_channel is the IPC event channel over which the answering service request server will the reply message. (Input) ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ FPE CAUSES LOGOUT REPLY STRUCTURE Following is a definition of the structure which overlays the reply argument to the send_as_request_ subroutine. It contains information about the status of the answering service request execution. dcl 1 asr_reply aligned, 2 code fixed bin (35), 2 data bit (36); STRUCTURE ELEMENTS code is a standard system status code. (Output) data is always equal to "1"b. (Output) ACCESS REQUIRED There are no access requirements for this answering service request. Operation: fpe_causes_new_proc This answering service request indicates that the answering service should create a new process if it takes a fatal process error. This is an answering service request, and as such, is not called directly as a subroutine. A structure containing the relevant information, described below, is filled in by the caller and a pointer to this structure, as well as the length of the structure, is passed to the send_as_request_ subroutine for processing. See the documentation on the send_as_request_ subroutine for more information about the calling sequence. FPE CAUSES NEW_PROC STRUCTURE For fpe_causes_new_proc, simply pass the as_request_header structure as input to send_as_request_. It is declared in the include file as_request_header.incl.pl1. It provides general information to the answering service request server. ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ dcl 1 as_request_header based aligned, 2 version fixed bin, 2 type fixed bin, 2 reply_channel fixed bin (71); STRUCTURE ELEMENTS version is the version number of the as_request_header structure. Currently this must be equal to the constant as_request_version_1 declared in the include file as_request_header.incl.pl1. (Input) type is the type of answering service request. For the fpe_causes_logout request, this must be equal to the constant ASR_FPE_CAUSES_NEW_PROC, declared in the include file as_request_header.incl.pl1. (Input) reply_channel is the IPC event channel over which the answering service request server will the reply message. (Input) FPE CAUSES NEW_PROC REPLY STRUCTURE Following is a definition of the structure which overlays the reply argument to the send_as_request_ subroutine. It contains information about the status of the answering service request execution. dcl 1 asr_reply aligned, 2 code fixed bin (35), 2 data bit (36); STRUCTURE ELEMENTS code is a standard system status code. (Output) data is always equal to "0"b. (Output) ACCESS REQUIRED There are no access requirements for this answering service request. ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ Operation: process_termination_monitor This answering service request specifies that the answering service should notify this process of any process terminations. This is an answering service request, and as such, is not called directly as a subroutine. A structure containing the relevant information, described below, is filled in by the caller and a pointer to this structure, as well as the length of the structure, is passed to the send_as_request_ subroutine for processing. See the documentation on the send_as_request_ subroutine for more information about the calling sequence. PROCESS TERMINATION MONITOR INFO STRUCTURE Following is a definition of the structure which is passed as input to the send_as_request_ subroutine. dcl 1 asr_buzzard_info aligned, 2 header aligned like as_request_header, 2 version char (8), 2 info_channel fixed bin (71), 2 my_reference_id bit (36); STRUCTURE ELEMENTS header is the as_request_header structure, described above and defined in the include file as_request_header.incl.pl1. (Input) version is the version number of the asr_buzzard_info structure. This version number is currently equal to the constant asr_buzzard_info_version_1, declared in the include file as_requests.incl.pl1. (Input) info_channel is the IPC event channel over which the answering service is to send notifications of process terminations. (Input) my_reference_id is a reference id which is returned in the process termination notification messages. (Input) ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ PROCESS TERMINATION MONITOR REPLY STRUCTURE Following is a definition of the structure which overlays the reply argument to the send_as_request_ subroutine. It contains information about the status of the answering service request execution. dcl 1 asr_reply aligned, 2 code fixed bin (35), 2 data bit (36); STRUCTURE ELEMENTS code is a standard system status code. (Output) data is "1"b if the user was already a process termination monitor and "0"b if it wasn't. (Output) ACCESS REQUIRED The user must have RW effective access to the ACS segment >sc1>admin_acs>process_termination_monitor.acs in order to issue this answering service request. EEEnnntttrrryyy::: ssseeennnddd_aaasss_rrreeeqqquuueeesssttt_$$$nnnooo_bbbllloooccckkk This entry point sends an as request message to the system as request server, and does not block to await a reply. USAGE declare send_as_request_$no_block entry (ptr, fixed bin, bit(72) aligned, fixed bin(35)); call send_as_request_$no_block (as_request_ptr, as_request_len, as_request_id, code); ARGUMENTS as_request_ptr is a pointer to standard as_request structure. (Input) as_request_structures begin with a header declared in as_request_header.incl.pl1. See notes below. as_request_len is the length of the standard as_request structure, in words. (Input) ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ as_request_id is the unique identifier assigned to the request. (Output) code is a standard system status code. (Output) NOTES The send_as_request_$no_block entrypoint takes a request pointer defining an operation. The allowed requests for this entrypoint are described below. Operation: abs_command Provides the capability to log in and cancel absentee jobs. Following is the definition of the structure which is passed as input to the send_as_request_ in order to execute an abs_command AS request. dcl 1 asr_abs_command_info aligned based (asr_abs_command_info_ptr), 2 header aligned like as_request_header, 2 version char (8), 2 action_code fixed bin, 2 request_id fixed bin (71); STRUCTURE ELEMENTS header is the as_request_header version the version of the structure, must be ASR_AC_INFO_VERSION_1 action_code may be either ASR_AC_LOGIN, to login an absentee job, or ASR_AC_CANCEL, to cancel an absentee job. request_id is the request ID of the absentee job to be logged in or cancelled Operation: admin_command See description of admin_command under $block. ________________ ________________ send_as_request_ send_as_request_ ________________ ________________ Operation: note_pnt_change This answering service request notifies the answering service of a change in the security attributes of a registered user. This is an answering service request, and as such, is not called directly as a subroutine. A structure containing the relevant information, described below, is filled in by the caller and a pointer to this structure, as well as the length of the structure, is passed to the send_as_request_ subroutine for processing. NOTE PNT CHANGE INFO STRUCTURE Following is a definition of the structure which is passed as input to the send_as_request_ subroutine. It is declared in as_request.incl.pl1. dcl 1 asr_note_pnt_change_info aligned, 2 header aligned like as_request_header, 2 version char (8), 2 person_id char (32); STRUCTURE ELEMENTS header is the as_request_header structure, described above and defined in the include file as_request_header.incl.pl1. (Input) version is the version number of the asr_note_pnt_change_info structure. This version number is currently equal to the constant ASR_NPC_INFO_VERSION_1, declared in the include file as_requests.incl.pl1. (Input) person_id is the person_id of the user whose security attributes have changed. The answering service will examine the PNT entry of this person_id and update the information about this user in the answering service tables, if the user is logged in. It may cause the user to be bumped if the new security attributes are incompatible with those of the logged in user. ________________ ____________________ send_as_request_ send_system_message_ ________________ ____________________ ACCESS REQUIRED In order for this request to be granted, the user must have his validation level set to Ring-1. That is, the process must be running in the administrative ring. ________________________________________ NNNaaammmeee::: ssseeennnddd_sssyyysssttteeemmm_mmmeeessssssaaagggeee_ EEEnnntttrrryyy::: ssseeennnddd_sssyyysssttteeemmm_mmmeeessssssaaagggeee_$$$ssseeennnddd_sssyyysssttteeemmm_mmmeeessssssaaagggeee_ This entry point, which requires access to hphcs_, sends a message to a specified process accompanied by the system_message_ IPS signal. Processes have a static handler for system_message_ that invokes system_message_handler_. USAGE dcl send_system_message_ entry (bit (36) aligned, fixed bin, ptr, fixed bin (35)); call send_system_message_ (recipient_process_id, recipient_initial_ring, message_ptr, code); ARGUMENTS recipient_process_id is the process id of the recipient. (Input) recipient_initial_ring is the initial (login) ring number of the recipient process. (Input) message_ptr is a pointer to an allocated copy of one of the structures warn_system_message, inactivity_system_message or dm_shut_system_message, declared in the include file system_message.incl.pl1. Operator warn messages use warn_system_message and set the type field equal to SYSTEM_MESSAGE_TYPE_AS_WARN. Inactivity messages use inactivity_system_message and set the type field equal to SYSTEM_MESSAGE_TYPE_AS_INACTIVITY. The other structure is available for future use by Data Management. (Input) ____________________ ____________________ send_system_message_ send_system_message_ ____________________ ____________________ NOTES The structures for warn messages are as follows: dcl 1 system_message_header aligned based, 2 version char (8), 2 type fixed bin, 2 type_version char (8); dcl 1 warn_system_message aligned based, 2 header aligned like system_message_header, 2 caller char (64), 2 text_len fixed bin (21), 2 text char (system_message_text_len refer (warn_system_message.text_len)); dcl 1 inactivy_system_message aligned based, 2 header aligned like system_message_header, 2 caller char (64), 2 text_len fixed bin (21), 2 text char (system_message_text_len refer (inactivy_system_message.text_len)); STRUCTURE ELEMENTS version is equal to SYSTEM_MESSAGE_VERSION_1. type is equal to SYSTEM_MESSAGE_TYPE_AS_WARN for the warn_system_message and SYSTEM_MESSAGE_TYPE_AS_INACTIVITY for the inactivity_system_message. type_version is equal to SYSTEM_MESSAGE_AS_WARN_V1 for the warn_system_message and SYSTEM_MESSAGE_AS_INACTIVITY_V1 for the inactivity_system_message. caller is the name of the caller, to be prefixed to the message text: CALLER: TEXT If caller is "", only the text is printed. This is common to all system messages. text_len is the number of characters in the message text. This is common to all system messages. ____________________ _________________ send_system_message_ set_ext_variable_ ____________________ _________________ text is the text of the message. This is common to all system messages. The inactivity message is merely another type of warn message. It is defined as a unique type so that the message handler can accurately determine that special action is required in response to it. ________________________________________ NNNaaammmeee::: ssseeettt_eeexxxttt_vvvaaarrriiiaaabbbllleee_ Most set_ext_variable_ entrypoints are documented in Multics Subroutines. The following is an internal entrypoint. EEEnnntttrrryyy::: ssseeettt_eeexxxttt_vvvaaarrriiiaaabbbllleee_$$$fffooorrr_llliiinnnkkkeeerrr This entry point is called by link_snap to allocate or find an external variable. It should only be called in ring 0. If the size of the variable is greater than sys_info_$max_seg_size this entry traps to the referencing ring to perform the allocation and snap the link. USAGE dcl set_ext_variable_$for_linker entry (char (*), ptr, ptr, fixed bin (35), ptr, ptr, ptr, ptr); call set_ext_variable_$for_linker (ext_name, init_info_ptr, sb, seg_ptr, found_sw, node_ptr, code, mc_ptr, def_ptr, type_ptr, link_ptr); ARGUMENTS ext_name is the name of the external variable. (Input) init_info_ptr is a pointer to the initialization info. For a complete description of the initialization structure. (Input) sb_ptr is a pointe to the base of the stack of the caller. (Input) _________________ _________________ set_ext_variable_ set_ext_variable_ _________________ _________________ seg_ptr is a pointe to the segment containing the object to be initialized. (Input). found_sw is set to indicate whether the variable was found or not. (Output) node_ptr is a pointe to the extenal variable node. For a complete description of the node structure (see "Notes on variable_node Structure"). (Output) code is an error code. (Output) mc_ptr is a pointer to the machine conditions for the linkage fault. (Input) def_ptr is a pointer to the base of the definition section of the segment that contains the link to the variable. (Input) type_ptr is a pointer to the type pair of the link to the variable. (Input) link_ptr is a pointer to the (unsnapped) link to the variable. (Input) Notes on init_info Structure: When a new external variable is allocated (not found), it must be initialized. The following structure, described in system_link_init_info.incl.pl1, is pointed to by init_info_ptr: dcl 1 init_info aligned based, 2 size fixed bin (19), 2 type fixed bin, 2 init_template (init_size refer (init_info.size)) fixed bin (35); Structure elements: size is the initialization template size, in words. type is the type of initialization to be performed. _________________ _________________ set_ext_variable_ set_ext_variable_ _________________ _________________ 0 no init 1 invalid 2 invalid 3 init from template 4 init area to empty () 5 list_template initialization (see "Notes on list_template Initialization Structure") init_template is the initialization template to be used when type = 3. Notes on list_template Initialization Structure: When the initialization type is 5 or a list_template initialization is being performed the init_info structure is not used. The structure used is the list_init_info structure which has the following definition in system_link_init_info.incl.pl1: dcl 1 list_init_info aligned based, 2 size fixed bin (35), 2 type fixed bin, 2 pad bit (18) unaligned, 2 list_size fixed bin (18) unsigned unaligned, 2 template (0 refer (list_init_info.list_size)) bit (36); Structure Elements: size is the size of the variable in words. type is the type of initialization to be performed. 5 list_template list_size is the number of list_template_entries that make up the template. template takes the form of a list_template_entry structure as defined in system_link_init_info.incl.pl1. This structure is passed on to list_init_ and decoded into data which is copied to the variable. See the definition of list_init_ for a more complete description. _________________ _________________ set_ext_variable_ set_ext_variable_ _________________ _________________ Notes on variable_node Structure: Great care should be taken when using the node_ptr. The variable_node structure should never be modified. Modifications to the variable_node will have unpredictable results. A pointer to the following structure is returned by the entry points in this subroutine. It is declared in system_link_names.incl.pl1 dcl 1 variable_node aligned based, 2 forward_thread ptr unaligned, 2 vbl_size fixed bin (23) unaligned, 2 init_type fixed bin (11) unaligned, 2 time_allocated fixed bin (71), 2 vbl_ptr ptr, 2 init_ptr ptr, 2 name_size fixed bin (21) aligned, 2 name char (nchars refer (variable_node.name_size)), 2 seg_ptr ptr; Structure elements: forward_thread is used by the linker to thread this variable to the next. vbl_size is the size, in words, of this variable. init_type is the type of initialization that is performed: 0 none 1 invalid 2 invalid 3 initialize from template 4 initialize to an empty area 5 initialize using a list template (see "Notes on list_template Initialization Structure"). time_allocated is the clock reading at the time this variable was allocated. vbl_ptr is a pointer to the variable's storage. init_ptr is a pointer to the intialization template. _________________ ________ set_ext_variable_ sys_log_ _________________ ________ name_size is the number of characters in the variable name. name is the name of the variable. seg_ptr is a pointer to the segment containing the variables initialization information. ________________________________________ NNNaaammmeee::: sssyyysss_llloooggg_ The sys_log_ subroutine provides an error message handling facility to programs that run in the Initializer process. The subroutine has two modes of operation. Command mode is used by operator commands to report errors to the operator in a manner similar to com_err_. The error messages are printed on the operator terminal that issued the command. They are also written into the admin log, which can be printed via "print_sys_log -admin". Answer Service (AS) mode is used by noncommand programs running in the Initializer to report errors in a manner similar to the hardcore syserr_ mechanism. The error messages are printed on one of three Answering Service I/O switches (severity1, severity2 or severity3). They are also written into the Answering Service log, which can be printed via "print_sys_log -as". ARGUMENTS The following argument is used by all sys_log_ entrypoints. severity defines the severity of the error. Allowed values are defined by named constants in sys_log_constants.incl.pl1. SL_LOG_SILENT (= 0) Only log the message, do not print it. SL_LOG (= 1) Log the message and print it. When called in AS mode, print the message on the severity1 I/O switch. When called in command mode, print the message on the operator's console. ________ ________ sys_log_ sys_log_ ________ ________ SL_LOG_BEEP (= 2) Log the message and print it preceeded by a line of asterisks and followed by a BELL character which turns on the audible alarm. When called in AS mode, print the message on the severity2 I/O switch. When called in command mode, print the message on the operator's console. SL_LOG_CRASH (= 3) Log the message, print it preceeded by a line of asterisks and followed by a BELL character, and crash the system. When called in AS mode, print the message on the severity3 I/O switch. When called in command mode, print the message on the operator's console. EEEnnntttrrryyy::: sssyyysss_llloooggg_$$$eeerrrrrrooorrr_llloooggg This entrypoint logs/prints an error table code and message in AS mode. The message format is: caller: error_code_text ioa_message USAGE declare sys_log_$error_log entry options(variable); call sys_log_$error_log (severity, code, caller, ioa_ctl, args); ARGUMENTS severity is a fixed bin(17) argument which defines the severity, as described above. (Input) code is a fixed bin(35) error table code whose expanded text is placed in the message. If code is zero, then no error message text is placed in the message. (Input) caller is a char(*) name of the calling program. This is placed in the message to identify where the message is coming from. (Input) ioa_ctl is a char(*) or char(*) varying ioa_ control string describing the message format. (Input) ________ ________ sys_log_ sys_log_ ________ ________ args are arguments to be substituted into the ioa_ control string. (Input) EEEnnntttrrryyy::: sssyyysss_llloooggg_$$$sssyyysss_llloooggg_ This entrypoint logs/prints a message in AS mode. The ioa_ctl string should include the caller's name to identify where the message is coming from. USAGE declare sys_log_ entry options(variable); call sys_log_ (severity, ioa_ctl, args); ARGUMENTS severity is a fixed bin(17) argument which defines the severity, as described above. (Input) ioa_ctl is a char(*) or char(*) varying ioa_ control string describing the message format. (Input) args are arguments to be substituted into the ioa_ control string. (Input) EEEnnntttrrryyy::: sssyyysss_llloooggg_$$$bbbiiinnnaaarrryyy This entrypoint logs/prints a message in AS mode. The logged message includes binary data which further describes the circumstances of the error. USAGE declare sys_log_$binary entry options(variable); call sys_log_$binary (severity, data_ptr, data_lth, data_class, ioa_ctl, args); ________ ________ sys_log_ sys_log_ ________ ________ ARGUMENTS severity is a fixed bin(17) argument which defines the severity, as described above. (Input) data_ptr is an aligned pointer to the binary data. (Input) data_lth is a fixed bin(17) length of the binary data, in words. (Input) data_class is a char(10) varying parameter defining the class of binary data. This is used by print_sys_log to find a routine to expand and print the binary data. For example, if the data_class were CLASS, then print_sys_log would use a routine called expand_CLASS_msg_ to expand and print the binary data. (Input) ioa_ctl is a char(*) or char(*) varying ioa_ control string describing the message format. (Input) args are arguments to be substituted into the ioa_ control string. (Input) EEEnnntttrrryyy::: sssyyysss_llloooggg_$$$cccooommmmmmaaannnddd This entrypoint logs/prints a message in command mode. The ioa_ctl string should include the caller's name to identify where the message is coming from. USAGE declare sys_log_$command entry options(variable); call sys_log_$command (severity, ioa_ctl, args); ARGUMENTS severity is a fixed bin(17) argument which defines the severity, as described above. (Input) ________ ________ sys_log_ sys_log_ ________ ________ ioa_ctl is a char(*) or char(*) varying ioa_ control string describing the message format. (Input) args are arguments to be substituted into the ioa_ control string. (Input) EEEnnntttrrryyy::: sssyyysss_llloooggg_$$$cccooommmmmmaaannnddd_eeerrrrrrooorrr This entrypoint logs/prints an error table code and message in command mode. The message format is: caller: error_code_text ioa_message USAGE declare sys_log_$command_error entry options(variable); call sys_log_$command_error (severity, code, caller, ioa_ctl, args); ARGUMENTS severity is a fixed bin(17) argument which defines the severity, as described above. (Input) code is a fixed bin(35) error table code whose expanded text is placed in the message. If code is zero, then no error message text is placed in the message. (Input) caller is a char(*) name of the calling program. This is placed in the message to identify where the message is coming from. (Input) ioa_ctl is a char(*) or char(*) varying ioa_ control string describing the message format. (Input) args are arguments to be substituted into the ioa_ control string. (Input) ________ ________ sys_log_ sys_log_ ________ ________ EEEnnntttrrryyy::: sssyyysss_llloooggg_$$$gggeeennneeerrraaalll This entrypoint logs/print an error message in either AS or command modes. It allows the caller to specify which items are placed in the message, and whether these items are to come from the input structure or from an associated argument list. This entrypoint should be used in preference to those above, because calling programs can be written in a more readable fashion. Refer to the Notes below for an example. USAGE declare sys_log_$general (pointer); call sys_log_$general (sl_info_ptr); ARGUMENTS sl_info_ptr points to the sl_info structure described below. (Input) INFO STRUCTURE The sys_log_$general entrypoint uses information provided by the following structure to determine which items to place in the message, and where to obtain those items. This structure is declared in sys_log_constants.incl.pl1. ________ ________ sys_log_ sys_log_ ________ ________ dcl 1 sl_info aligned automatic, 2 version char(8), 2 arg_list_ptr ptr, 2 loc, 3 (mode, severity, code, caller, data, class, ioa_msg) fixed bin, 2 flags, 3 ioa_msg_is_error_code bit(1) unal, 3 flags_pad bit(35) unal, 2 mode fixed bin, 2 severity fixed bin, 2 code fixed bin(35), 2 caller char(65) varying, 2 data, 3 data_ptr ptr, 3 data_lth fixed bin(21), 2 class char(10) varying, 2 ioa_msg char(500) varying; STRUCTURE ELEMENTS version is the version number of this structure. It should be set to the named constant SL_INFO_version_1. (Input) arg_list_ptr is a pointer to an argument list. Various error message items can be extracted from this argument list, under control of sl_info.loc. (Input) loc is the location of information needed to process the error message. The information can be given in the sl_info structure, can come from the argument list, or certain items can be omitted completely. (Input) All sl_info.loc elements can have one of the following values: SL_INFO_arg_given_in_structure (= -1) the information is located in the correspondingly named, level 2 structure element. SL_INFO_arg_not_given (= 0) the information is not given. ________ ________ sys_log_ sys_log_ ________ ________ +N a positive integer giving the argument number in the argument list which contains the information. loc.mode is the location of the mode. loc.severity is the location of the severity. loc.code is the location of the error code. loc.caller is the location of the caller name. loc.data is the location of the binary data pointer and length. If a positive integer N is given, then the pointer is the Nth argument in the argument list, and the argument length is argument N+1. loc.class is the location of the binary data class. loc.ioa_msg is the location of the ioa_ control string. If a positive integer N is given, then then ioa_ control string is the Nth argument in the argument list, and remaining arguments are substituted into the control string. If SL_INFO_arg_given_in_structure is given, then ioa_msg is treated as a character string message text rather than an ioa_ control string; no argument substitution is performed. flags.ioa_msg_is_error_code is "1"b if loc.ioa_msg is a positive integer N, and the Nth argument in the argument list is an error code whose expanded text is the ioa_ control structure. If this flag is "0"b and loc.ioa_msg is positive, then the Nth argument in the argument list is a char(*) or char(*) varying ioa_ control string. If loc.ioa_msg is nonpositive, this flag is ignored. (Input) mode is a fixed bin(17) operating mode for sys_log_. If the mode is located in the argument list or not given as input, then the value actually used is returned in sl_info.mode. (Input/Output) It can be one of the following values: ________ ________ sys_log_ sys_log_ ________ ________ SL_INFO_as_mode (= 1) operate in AS mode. This is the default if loc.mode is SL_INFO_arg_not_given. SL_INFO_command_mode (= 2) operate in command mode. severity is a fixed bin(17) argument which defines the severity, as described above. If the severity is located in the argument list or not given as input, then the value actually used is returned in sl_info.severity. (Input/Output) If loc.severity is SL_INFO_arg_not_given, then SL_LOG is the default value for mode. code is a fixed bin(35) error table code whose expanded text is placed in the message. If code is -1 or loc.code is SL_INFO_arg_not_given, then no error table text is placed in the message. If a zero code is given, it means that no error really occurred; therefore printing/logging of the sys_log_ message is aborted. Otherwise, code is treated as a standard error table code whose text is obtained by calling convert_status_code_ and placed in the message. If code is located in the argument list, then the value is returned in sl_info.code. (Input/Output) caller is a char(*) name of the program reporting the error. A caller name should always be given. If the caller is located in the argument list, then the name is returned in sl_info.caller. (Input/Output) data is a pointer to and fixed bin(17) length of the binary data to be associated with the logged message. If the data_ptr and data_lth are located in the argument list, then these values are returned in sl_info.data_ptr and sl_info.data_lth. (Input/Output) class is a char(*) binary data class name. It is required if binary data is given. If the class is located in the argument list, then the data class is returned in sl_info.class. (Input/Output) ________ ________ sys_log_ sys_log_ ________ ________ ioa_msg is a char(*) or char(*) varying ioa_ control string, or an error table code whose text is the ioa_ control string (see sl_info.ioa_msg_is_error_code above). The text expansion after argument substitution is returned. (Input/Output) NOTES The calling program should use an error diagnostic internal procedure to report its errors. This internal procedure fills in the sl_info structure and calls sys_log_$general, passing its argument list as the location for various message items. The sys_log_constants.incl.pl1 file declares several constant versions of the sl_info structure to simplify structure assignment. These are summarized below. Refer to the include file for details. sl_info_sev_code_msg sl_info settings for an SL_INFO_as_mode operation to be used with an Error internal procedure whose calling sequence is: call Error (severity, code, ioa_ctl, args); The Error internal procedure must set sl_info.arg_list_ptr and sl_info.caller. It may optionally set sl_info.data and sl_info.class. sl_info_sev_msg an SL_INFO_as_mode operation with Error calling sequence: call Error (severity, ioa_ctl, args); sl_info_sev_coded_msg an SL_INFO_as_mode operation with Error calling sequence: call Error (severity, ioa_ctl_as_error_code, args); sl_info_sev_code_label_msg an SL_INFO_as_mode operation with Error calling sequence: call Error (severity, code, return_label, ioa_ctl, args); sl_info_code_msg an SL_INFO_as_mode operation with Error calling sequence: call Error (code, ioa_ctl, args); ________ ________ sys_log_ sys_log_ ________ ________ sl_info_msg an SL_INFO_as_mode operation with Error calling sequence: call Error (ioa_ctl, args); These structure templates can be used in conjunction with an internal procedure to report errors, as shown in the example below. as_proc_: procedure (P_code); dcl P_code fixed bin(35) parameter; . . dcl MY_NAME char(8) initial ("as_proc_") internal static options(constant); . . call xxx_ (path, modes, code); if code ^= 0 then call Error (SL_LOG_BEEP, code, ABORT_LABEL, "Calling xxx_ subroutine for ^a.", path); . . ABORT_LABEL: P_code = code; return; . . Error: procedure options(variable); dcl return_label label based(return_label_ptr), return_label_ptr pointer; sl_info = sl_info_sev_code_label_msg; sl_info.arg_list_ptr = cu_$arg_list_ptr(); sl_info.caller = MY_NAME; call sys_log_$general (addr(sl_info)); if sl_info.code ^= 0 then do; call cu_$arg_ptr (3, return_label_ptr, 0, 0); go to return_label; end; else return; end Error; end as_proc_; ________ _______________________ sys_log_ system_message_handler_ ________ _______________________ If sys_log_$general is called with an invalid sl_info structure, then it reports this error by signalling the sys_log_error_ condition, passing the following condition information structure which is declared in sys_log_error_info.incl.pl1: dcl 1 sys_log_error_info aligned automatic, 2 header like condition_info_header, 2 sl_info_ptr ptr; STRUCTURE ELEMENTS header.version is the version number of this structure. It is set to the named constant SYS_LOG_ERROR_INFO_version_1. header.action_flags.cant_restart is "1"b, indicating that restarting with an invalid sl_info structure is impossible. header.status_code is an error table code indicating how the sl_info structure is invalid. sl_info_ptr is a pointer to the invalid sl_info structure. ________________________________________ NNNaaammmeee::: sssyyysssttteeemmm_mmmeeessssssaaagggeee_hhhaaannndddllleeerrr_ EEEnnntttrrryyy::: sssyyysssttteeemmm_mmmeeessssssaaagggeee_hhhaaannndddllleeerrr_$$$sssyyysssttteeemmm_mmmeeessssssaaagggeee_hhhaaannndddllleeerrr_ This subroutine handles the system_message_ condition by outputting any previously unprocessed messages which have been sent to the user by send_system_message_. Processes will have a static handler that calls this subroutine. USAGE dcl system_message_handler_ entry (); dcl sct_manager_$set entry (fixed bin, entry, fixed bin (35)); %include static_handlers; _______________________ ___________________ system_message_handler_ test_system_control _______________________ ___________________ call sct_manager_$set (system_message_sct_index, system_message_handler_, code); NOTES The system_message_handler_ will output the message to the user outputting the text portion of each message to the users terminal directly through the user_i/o switch. The handler will special case any inactivity_system_messages by sending an "inacrcvd" event message back to the Initializer, using the process' termination event channel stored in the PIT, to let the Initializer know that the user has received all system messages. ________________________________________ NNNaaammmeee::: ttteeesssttt_sssyyysssttteeemmm_cccooonnntttrrrooolll SYNTAX AS A COMMAND test_system_control test_sc1_dir FUNCTION This command establishes a test version of the system control environment in the user's process. In this environment, the standard operator requests are available to start user control functions for the Multics Networking Architecture (MNA), absentee processing, the message coordinator environment, daemon processes, etc. ARGUMENTS test_sc1_dir is the pathname of the user directory to be used as the system control directory. You must specify a directory other than >sc1 to avoid interfering with the real system control running in the Initializer process. ACCESS REQUIRED This command requires access to a variety of privileged gates needed to initialize the System Control and User Control environments. These include hpriv_connection_list_ and network_accounting_gate_. ___________________ ___________________ test_system_control test_system_control ___________________ ___________________ NOTES The pathname of a test >sc1 directory must be given as an argument to this command. Do not use the real >sc1 directory, or you will interfere with operation of the real system control environment in the Initializer process. The test >sc1 directory should already contain all segments needed to run the system control and user control environments. If segments are missing or incorrectly formatted, error messages will result and the environment initialization will fail. The system control environment is not highly robust, so fatal process errors (although not common) may occur if things are improperly setup. The best way to setup the directory is to refer to the acct_start_up.ec to see what needs to be in the test >sc1 directory. After the test directory is built, invoke test_system_control and fix all errors which result. Another (more frustrating) approach is to invoke test_system_control with an empty directory and fix the errors, reinvoke and fix the new errors, etc. ___________________ ___________________ test_system_control test_system_control ___________________ ___________________ Minimum contents of a test >sc1 subtree is shown below. >UDD>DSA>AS>test_sc1 seg admin.ec seg cdt seg sat seg sat.ht seg sat.install.acs seg ssu.ec link mgt >sc1>mgt link installation_parms >sc1>installation_parms rate_structure_0 link rtdt >sc1>rtdt link syserr_log >sc1>syserr_log msf PNT.pnt seg 0 seg 1 dir as_logs seg admin_log seg log dir pdt seg SysAdmin.pdt seg SysMaint.pdt seg SysDaemon.pdt seg Operator.pdt seg Multics.pdt dir update Empty Other segments will be created when starting up the test system control and user control environments and their subsystems. WARNING: The system control environment plays with the I/O switches. Do not expect it to work in anything but a virgin environment (no auditing, no video). And don't be surprised if your favorite commands (emacs) won't work once you've started the test environment. After exiting the test environment, a new_proc is recommended to cleanse the user process. ___________________ _____________ test_system_control user_message_ ___________________ _____________ NNNaaammmeee::: uuussseeerrr_mmmeeessssssaaagggeee_ This gate allows a user process to read the messages sent to it by trusted processes. EEEnnntttrrryyy::: uuussseeerrr_mmmeeessssssaaagggeee_$$$rrreeeaaaddd_mmmeeessssssaaagggeee This entry is used to read a message from the user message database. USAGE declare user_message_$read_message entry (ptr, ptr, fixed bin (35)); call user_message_$read_message (area_ptr, as_user_message_info_ptr, code); ARGUMENTS area_ptr is a pointer to an area in which the returned message will be allocated. (Input) as_user_message_info_ptr is a pointer to the as_user_message_info structure. code is a standard system status code. _____________ _____________ user_message_ user_message_ _____________ _____________ AS_USER_MESSAGE_INFO declare as_user_message_info_ptr pointer; declare 1 as_user_message_info aligned based (as_user_message_info_ptr), 2 version char (8) aligned, 2 flags aligned, 3 read_message_id bit (1) unaligned, 3 read_after_message_id bit (1) unaligned, 3 no_handle_given bit (1) unaligned, 3 ring_given bit (1) unaligned, 3 dont_delete bit (1) unaligned, 3 pad bit (31) unaligned, 2 message_info aligned, 3 message_ptr pointer, 3 message_length fixed bin (18), 3 message_id bit (72) aligned, 3 message_access_class bit (72) aligned, 3 message_handle bit (72) aligned, 3 message_ring fixed bin (3), 2 sender_info aligned, 3 group_id char (32) unaligned, 3 process_id bit (36) aligned, 2 destination_info aligned, 3 group_id char (32) unal, 3 process_id bit (36) aligned, 3 ring fixed bin (3) aligned; declare AS_USER_MESSAGE_INFO_VERSION_1 char (8) aligned init ("asum0001") int static options (constant); STRUCTURE ELEMENTS version must be equal to AS_USER_MESSAGE_INFO_VERSION_1. (Input) read_message_id is a flag. If "1"b, then the field "message_id" is interpreted as an input argument. The message whose id is "message_id" is returned if it exists. The message_handle field is not respected on input. This flag may not be on if read_after_message_id is on. (Input) _____________ _____________ user_message_ user_message_ _____________ _____________ read_after_message_id is a flag. If "1"b, then the field "message_id" is interpreted as an input argument. The first message after message_id for the handle message_handle is returned. This flag may not be on if read_message_id is on. (Input) no_handle_given is a flag. If "1"b, then a message is returned subject to the read_message_id or read_after_message_id flags without regard to the handle of the message. If "0"b, then the field message_handle specifies the handle of the message to be returned. (Input) ring_given is a flag. If "1"b, then the field message_ring is respected on input, and specified the destination ring of the message to be read. If "0"b, then messages destined for the current validation level are returned. (Input) dont_delete is a flag. If "1"b, then the message is not deleted from the user message database even if it is marked for deletion by its recipient. If "0"b, the message is deleted if it is marked for deletion. (Input) message_ptr is a pointer to the allocated copy of the message. (Output) message_length is the length of the allocated message in words. (Output) message_access_class is the access class of the message. (Output) message_handle if the handle within the process to which the message was sent. If the flag no_handle_given is "1"b, then this is (Output). Otherwise it is (Input). message_ring is the ring to which the message was sent. This field is only respected of the flag ring_given is "1"b. (Input) sender_info is a substructure describing the process who sent the message. group_id is the User.Project.* user name of the sender. (Output) _____________ ___________________ user_message_ user_message_admin_ _____________ ___________________ process_id is the process id of the sender. (Output) ring is the validation level of the sender at the time that the sender sent the message. (Output) destination_info is a substructure describing how the message was addressed. group_id is the starname that specified the user name of the recipient(s). (Output) process_id is the process id, if any, specified for the recipient. If no process id was specified then this will contain all ones. (Output) ring is the ring specified for the recipient. (Output) NOTES Normally, a caller should fill this structure up as follows: set read_message_id to 1 if the message if is known, zero otherwise. Set read_after_message_id, no_handle_given, ring_given, and dont_delete to 0. They are only used for tools that display the messages pending for the process. Set the message_handle to the handle for which the message is to be read. ________________________________________ NNNaaammmeee::: uuussseeerrr_mmmeeessssssaaagggeee_aaadddmmmiiinnn_ This gate contains entries callable by system maintainers and administrators. They permit an administrator to examine the messages in the user message database. ___________________ ___________________ user_message_admin_ user_message_admin_ ___________________ ___________________ EEEnnntttrrryyy::: uuussseeerrr_mmmeeessssssaaagggeee_aaadddmmmiiinnn_$$$rrreeeaaaddd_mmmeeessssssaaagggeee This entrypoint permits a process to read any message in the user message database, subject to AIM restrictions. ring1 privilege is required to read messages whose access classes are not less than or equal to the caller's authorization. USAGE declare user_message_admin_$read_message entry (ptr, ptr, fixed bin (35)); call user_message_admin_$read_message (as_user_message_admin_read_info_ptr, as_user_message_info_ptr, area_ptr, code); ARGUMENTS as_user_message_admin_read_info_ptr is a pointer to the as_user_message_admin_read_info structure. as_user_message_info_ptr is a pointer to the as_user_message_info structure described below under the "user_message_$read" entrypoint. All input fields in the structure except the version are ignored, since the message is completely specified by the user_message_admin_read_info structure. (Input) area_ptr is a pointer to an area. The message returned will be copied into storage allocated in this area. (Input) code is a standard system status code. AS_USER_MESSAGE_ADMIN_READ_INFO declare as_user_message_admin_read_info_ptr pointer; declare 1 as_user_message_admin_read_info aligned based (as_user_message_admin_read_info_ptr), 2 version char (8) aligned, 2 source_group_id char (32) unal, 2 source_process_id bit (36) aligned, 2 target_group_id char (32) unal, 2 target_process_id bit (36) aligned, 2 target_handle bit (72) aligned, 2 after_message_id bit (72) aligned; ___________________ ___________________ user_message_admin_ user_message_admin_ ___________________ ___________________ declare AS_USER_MESSAGE_ADMIN_READ_INFO_VERSION_1 char (8) init ("aumar001") int static options (constant); STRUCTURE ELEMENTS version must be AS_USER_MESSAGE_ADMIN_READ_INFO_VERSION_1. (Input) source_group_id is a starname specifying the sender of the message to be read. "" is equivalent to *.*.*. (Input) source_process_id is the process id of the source process. If zero, the source process id is not specified. (Input) target_group_id is a starname specifying the recipient(s) of the message to be read. This starname must be character identical to the starname specified by the message sender for a message to match. That is, if a message is sent to "*.*.a", then this value must be "*.*.a" to read it out. If this value is equal to "", messages are read regardless of their group id. (Note that if a message is sent to all users it is stored with a destination of "*.*.*", not "".) (Input) target_process_id is the process id of the recipient of the message. If zero, then the recipient process id is not specified. (Input) target_handle is the target handle of the message to be read. If zero, then the handle is not specified. (Input) after_message_id is a message id of a message previously read. The message returned will be one entered after the message identified by this message_id. If any of the target_ fields are specified, then it will be the next message that matches those fields. If no target fields are specified, then it will be the very next message. If this message_id refers to a message whose access class is not less than or equal to that of the process, and the caller lacks ring1 privilege, this argument is ignored. (Input) ___________________ __________________ user_message_admin_ user_message_priv_ ___________________ __________________ NNNaaammmeee::: uuussseeerrr_mmmeeessssssaaagggeee_ppprrriiivvv_ This gate contains entries used by trusted processes to send messages to user processes using the user_message facility. In this context, a "trusted process" is a process trusted not to mis-use this facility (e.g., by sending infinite quantities of messages or disrupting another process's use). Access to this gate does not permit a process to write messages down to lower authorizations without the ring1 system privilege. EEEnnntttrrryyy::: uuussseeerrr_mmmeeessssssaaagggeee_ppprrriiivvv_$$$aaadddddd_mmmeeessssssaaagggeee This entry is called to queue a message for delivery to a process. USAGE declare user_message_priv_$add_message entry (ptr, fixed bin (35)); call user_message_priv_$add_message (as_user_add_message_info_ptr, code); ARGUMENTS as_user_message_add_ptr is a pointer to the as_user_message_add structure, as declared in as_user_message_add.incl.pl1 and described below. (Input) code is a standard system status code. It will be nonzero only if the message could not be added. AS_USER_MESSAGE_ADD_INFO declare as_user_message_add_info_ptr pointer; declare 1 as_user_message_add_info aligned based (as_user_message_add_info), 2 version char (8) aligned, 2 message_info aligned, 3 message_ptr pointer, 3 message_length fixed bin (18), 3 message_access_class bit (72) aligned, 3 message_id bit (72) aligned, 2 destination_info aligned, __________________ __________________ user_message_priv_ user_message_priv_ __________________ __________________ 3 group_id char (32) unal, 3 process_id bit (36) aligned, 3 handle bit (72) aligned, 3 reader_deletes bit (1) aligned; declare AS_USER_MESSAGE_ADD_INFO_VERSION_1 char (8) init ("auma0001") int static options (constant); STRUCTURE ELEMENTS version is the version of this structure, and must be set to AS_USER_MESSAGE_ADD_INFO_VERSION_1. (Input) message_ptr is a pointer to the text of the message to be added. (Input) message_length is the length, in words, of the message to be added. (Input) message_access_class is the access class marking for the message. Unless the caller has the ring1 system privilege set, this must be equal to the calling process authorization. message_id is the unique id assigned to the message when it is stored. (Output) group_id is the target group_id of the message. If process_id is not all ones, then this should be set to "" as it is not used. This may be a starname. If this is not "" and process_id is not all ones, the call is invalid and an error code is returned. process_id is the process id of the process to which the message will be delivered. If the message is to be delivered to more than one process, (or the target process id is unknown) then this must be set to all ones. handle is the protocol handle within the target processes to which __________________ __________________ user_message_priv_ user_message_priv_ __________________ __________________ the message will be delivered. This may not be zero. Handles with the first bit equal to 1 are reserved for global system protocols. reader_deletes specifies whether the recipient the message should delete it. If this is set to 1, then any recipient may delete the message. If this is set to 0, then only the sender may delete the message. NOTES The system automatically deletes all messages destined for a specific process id when the process terminates. Thus a sender may set reader_deletes to 0 and specify a process id, and the message will be readable until the process terminates. EEEnnntttrrryyy::: uuussseeerrr_mmmeeessssssaaagggeee_ppprrriiivvv_$$$dddeeellleeettteee_mmmeeessssssaaagggeee_iiiddd This entry is used by a sender to delete a message. The message must be specified by message_id. The message access class must be equal to the caller authorization unless the caller has ring1 privilege. USAGE declare user_message_priv_$delete_message_id entry (bit (72) aligned, fixed bin (35)); call user_message_priv_$delete_message_id (message_id, code); ARGUMENTS message_id is the message id returned by add_message when the message was added. code is a standard system status code. __________________ __________________ user_message_priv_ user_message_priv_ __________________ __________________ EEEnnntttrrryyy::: uuussseeerrr_mmmeeessssssaaagggeee_ppprrriiivvv_$$$dddeeellleeettteee_ppprrroooccceeessssss_mmmeeessssssaaagggeeesss This entrypoint deletes all the messages whose destination is a specific process as specified by process_id. Only those messages whose access classes are equal to the caller's authorization are deleted unless the caller has ring1 privilege. USAGE declare user_message_priv_$delete_process_messages entry (bit (36) aligned, fixed bin (35)); call user_message_priv_$delete_process_messages (pid, code); ARGUMENTS pid is the process id of the process whose messages are to be deleted. All messages whose destination is this process id specifically are deleted. code is a standard system status code. EEEnnntttrrryyy::: uuussseeerrr_mmmeeessssssaaagggeee_ppprrriiivvv_$$$sssyyysssttteeemmm_iiinnniiittt This entrypoint is called by the Initializer as part of Answering Service initialization. It deletes any information left from a previous bootload and creates a new user_message database. This entrypoint uses the syserr log to report details of problems on the bootload console. USAGE declare user_message_priv_$system_init entry (fixed bin (35)); call user_message_priv_$system_init (code); ARGUMENTS code is a standard system status code. It will be nonzero if and only if it was impossible to set up a functional user_message facility. __________________ _______ user_message_priv_ ws_tty_ __________________ _______ NNNaaammmeee::: wwwsss_ttttttyyy_ EEEnnntttrrryyy::: wwwsss_ttttttyyy_$$$aaabbbooorrrttt This entry aborts current i/o and resets the read or write buffers and stops echo negotiated input. USAGE dcl ws_tty_$abort entry (ptr, fixed bin, fixed bin, fixed bin(35)); call ws_tty_$abort (iocb_ptr, reset_switch, state, code); ARGUMENTS iocb_ptr points to the I/O control block of mowse_terminal_. (Input) reset_switch indicates whether read or write are to be reset. (Input) 1 reset read 2 reset write 3 reset both state indicates the tty state. (Output) 1 ignored 2 listening 5 dialed code is a standard status code. (Output) EEEnnntttrrryyy::: wwwsss_ttttttyyy_$$$aaattttttaaaccchhh This entry "attaches" video mode to WSTERM by informing the workstation software that synchronous mode is required to support video and sends WSTERM a list of the break characters. USAGE dcl ws_tty_$attach entry (ptr, char(*), fixed bin(71), fixed bin, fixed bin(35)); _______ _______ ws_tty_ ws_tty_ _______ _______ call ws_tty_$attach (iocb_ptr, name, event, state, code); ARGUMENTS iocb_ptr points to the I/O control block of mowse_terminal_. (Input) name is the channel name and must be "mowse.". (Input) event is not used. (Input) state indicates the tty state. (Output) 1 ignored 2 listening 5 dialed code is a standard status code. (Output) EEEnnntttrrryyy::: wwwsss_ttttttyyy_$$$dddeeetttaaaccchhh This entry "detaches" video mode from WSTERM by informing the workstation software that synchronous communication is no longer required. Asynchronous communication is established for non-video mode. USAGE dcl ws_tty_$detach entry (ptr, fixed bin, fixed bin, fixed bin(35)); call ws_tty_$detach (iocb_ptr, dflag, state, code); ARGUMENTS iocb_ptr points to the I/O control block of mowse_terminal_. (Input) dflag is not used. (Input) _______ _______ ws_tty_ ws_tty_ _______ _______ state indicates the tty state. (Output) 1 ignored 2 listening 5 dialed code is a standard status code. (Output) EEEnnntttrrryyy::: wwwsss_ttttttyyy_$$$eeevvveeennnttt This entry simply sets the tty state and returns. USAGE dcl ws_tty_$event entry (ptr, fixed bin(71), fixed bin, fixed bin(35)); call ws_tty_$event (iocb_ptr, event, state, code); ARGUMENTS iocb_ptr points to the I/O control block of mowse_terminal_. (Input) event is the event channel name. (Input) state indicates the tty state. (Output) 1 ignored 2 listening 5 dialed code is a standard status code. (Output) NOTES This entry is not believed to be needed but is retained in case the event should need to be passed to hcs_$tty_event. There is only one known video call to this entry and it appears redundant. _______ _______ ws_tty_ ws_tty_ _______ _______ EEEnnntttrrryyy::: wwwsss_ttttttyyy_$$$ooorrrdddeeerrr This entry performs the specified control order on the i/o switch. USAGE dcl ws_tty_$order entry (ptr, char(*), ptr, fixed bin, fixed bin(35)); call ws_tty_$order (iocb_ptr, order, info_ptr, state, code); ARGUMENTS iocb_ptr points to the I/O control block of mowse_terminal_. (Input) order is the name of the control order. (Input) info_ptr is null or points to the data whose form depends on the control order. (Input) state indicates the tty state. (Output) 1 ignored 2 listening 5 dialed code is a standard status code. (Output) NOTES The following list of control orders are supported. With two exceptions, these orders are passed to mowse_io_ for processing. The first exception is that control orders which involve a structure containing a version indicator are checked for the current version. In the second exception, the modes order passes the new modes to mowse_io_ via iox_$modes after changing the data from a structure to a character string. abort debug_on debug_off get_editing_chars _______ _______ ws_tty_ ws_tty_ _______ _______ get_event_channel get_foreign_terminal_data get_input_conversion get_input_translation get_mowse_info get_output_conversion get_output_translation get_special get_terminal_emulator_state line_length modes printer_off printer_on put_to_sleep quit_disable quit_enable read_status resetread resetwrite send_local_message send_message set_echo_break_table set_editing_chars set_input_conversion set_input_translation set_output_conversion set_output_translation set_special set_terminal_data set_term_type start store_id store_mowse_info terminal_info trace_on trace_off write_status EEEnnntttrrryyy::: wwwsss_ttttttyyy_$$$rrreeeaaaddd This entry reads unechoed characters from the workstation. USAGE dcl ws_tty_$read entry (ptr, ptr, fixed bin(21), fixed bin(21), fixed bin(21), fixed bin, fixed bin(35)); _______ _______ ws_tty_ ws_tty_ _______ _______ call ws_tty_$read (iocb_ptr, buffer_ptr, offset, n_chars_to_read, n_chars_read, state, code); ARGUMENTS iocb_ptr points to the I/O control block of mowse_terminal_. (Input) buffer_ptr points to caller's buffer. (Input) offset is the offset in caller's buffer to start at. (Input) n_chars_to_read is the maximum number of characters to return. (Input) n_chars_read is the actual number of characters returned. (Output) state indicates the tty state. (Output) 1 ignored 2 listening 5 dialed code is a standard status code. (Output) EEEnnntttrrryyy::: wwwsss_ttttttyyy_$$$rrreeeaaaddd_eeeccchhhoooeeeddd This entry reads echoed characters from the workstation. Echoing stops on a break character and type ahead is not echoed by the workstation. USAGE dcl ws_tty_$read_echoed entry (ptr, ptr, fixed bin(21), fixed bin(21), fixed bin(21), fixed bin(21), fixed bin, fixed bin, fixed bin(35)); call ws_tty_$read_echoed (iocb_ptr, buffer_ptr, offset, n_chars_to_read, n_chars_read, echoed, screen_left, state, code); _______ _______ ws_tty_ ws_tty_ _______ _______ ARGUMENTS iocb_ptr points to the I/O control block of mowse_terminal_. (Input) buffer_ptr points to caller's buffer. (Input) offset is the offset in caller's buffer to start at. (Input) n_chars_to_read is the maximum number of characters to return. (Input) n_chars_read is the actual number of characters returned. (Output) echoed is the number of characters echoed by interrupt side? (Output) screen_left is the space left on line, negotiate entry? (Input) state indicates the tty state. (Output) 1 ignored 2 listening 5 dialed code is a standard status code. (Output) EEEnnntttrrryyy::: wwwsss_ttttttyyy_$$$rrreeeaaaddd_wwwiiittthhh_mmmaaarrrkkk This entry is like read but a mark is set to indicate the end of input. USAGE dcl ws_tty_$read_with_mark entry (ptr, char(*), fixed bin(21), fixed bin(21), fixed bin, fixed bin(35)); call ws_tty_$read_with_mark (iocb_ptr, buffer, n_chars_read, mark_index, state, code); _______ _______ ws_tty_ ws_tty_ _______ _______ iocb_ptr points to the I/O control block of mowse_terminal_. (Input) buffer is the caller's buffer. (Input) n_chars_read is the actual number of characters returned. (Output) mark_index is an index in the returned string. (Output) state indicates the tty state. (Output) 1 ignored 2 listening 5 dialed code is a standard status code. (Output) EEEnnntttrrryyy::: wwwsss_ttttttyyy_$$$wwwrrriiittteee This entry displays the caller's text by sending it to the workstation. USAGE dcl ws_tty_$write entry (ptr, ptr, fixed bin(21), fixed bin(21), fixed bin(21), fixed bin, fixed bin(35)); call ws_tty_$write (iocb_ptr, buffer_ptr, offset, n_chars_to_write, n_chars_written, state, code); ARGUMENTS iocb_ptr points to the I/O control block of mowse_terminal_. (Input) buffer_ptr pointer to caller's buffer. (Input) offset is the offset in caller's buffer to start at. (Input) n_chars_to_write is the maximum number of characters supplied. (Input) _______ _______ ws_tty_ ws_tty_ _______ _______ n_chars_written is the actual number of characters written. (Output) state indicates the tty state. (Output) 1 ignored 2 listening 5 dialed code is a standard status code. (Output) EEEnnntttrrryyy::: wwwsss_ttttttyyy_$$$wwwrrriiittteee_wwwhhhooollleee_ssstttrrriiinnnggg This entry is the same as write. It displays the caller's text by sending it to the workstation. USAGE dcl ws_tty_$write_whole_string entry (ptr, char(*), bit(1), fixed bin(21), fixed bin, fixed bin(35)); call ws_tty_$write_whole_string (iocb_ptr, string, mark_flag, n_chars_written, state, code); ARGUMENTS iocb_ptr points to the I/O control block of mowse_terminal_. (Input) string is the caller's character string to write. (Input) mark_flag indicates whether to set a mark. (Input) "0"b don't set mark "1"b set mark n_chars_written is the actual number of characters written. (Output) state indicates the tty state. (Output) 1 ignored 2 listening 5 dialed _______ _______ ws_tty_ ws_tty_ _______ _______ code is a standard status code. (Output) Workstation Interfaces The ws_tty_ modules communicate with the workstation software (WSTERM) via calls to iox_. Actually these calls to iox_ are calls to mowse_io_ which itself uses iox_ to exchange messages with the MOWSE software on the workstation which in turn talks to WSTERM. There are two basic means by which ws_tty_ and WSTERM exchange data. The most common method is via specific control messages. These control messages are sent to WSTERM with an iox_ "send_message" control order and fetched from WSTERM with an iox_$get_chars call. Control messages are for exchanging control data concerning the workstation environment and also for reading user entered text. The second method of communication is for writing text to the workstation screen. This is done by ws_tty_ with calls to iox_$put_chars. Using this method of writing text to the workstation guarantees that plain text written to the screen will not be misinterpreted as a control message. Control messages and written text are identified by WSTERM by their different min-cap ids. Control message example Suppose we want ws_tty_ to send the control message to WSTERM to exit sync mode. The control message text is "XSM000000". To send this we first append the foreground control message min-cap id to the front of the message. control_message = FG_CONTROL_MESSAGE || "XSM000000" Then using call iox_$control(iocb_ptr, "send_message", mowse_io_message_ptr, code); where mowse_io_message_ptr -> mowse_io_message.version = mowse_io_info_version_1; mowse_io_message.channel = FG; mowse_io_message.io_message_ptr = addr(control_message); mowse_io_message.io_message_len = 10; _______ _______ ws_tty_ ws_tty_ _______ _______ will send the message to WSTERM. (The constants and structures are defined in the mowse include files.) Then when WSTERM does a getdata it will find the text "XSM000000" with the minor capability field set to FG_CONTROL_MESSAGE. Sending Text Example But if we want ws_tty_ to send the plain text "hello world", this is the procedure when we set term_message = "hello world"; call iox_$put_chars (iocb_ptr, addr(term_message), 11, code); Then WSTERM will see the text "hello world" with the min cap of FG_TERMINAL_DATA. Likewise, ws_tty_ reads data from WSTERM with a call to iox_$get_chars. Control Message Format The following description of the control messages does not include the FG_CONTROL_MESSAGE byte appended to the front of messages sent from ws_tty_ to WSTERM. byte: 1 2 3 4 5 6..size+5 -------------------------------------------- | message id | size | data ... | -------------------------------------------- message id is a 3 character field identifying the message type and is defined below. size is the number of bytes of data and is zero if there is no data. This is a two byte (16 bit) unsigned binary number. The largest data size is therefore 2**16-1 or 65535 bytes. data may or may not be present depending on the type and is defined below. _______ _______ ws_tty_ ws_tty_ _______ _______ Control Message Types The functionality of the following controls is detailed in MTB741 section 6 and MTB708. These message ids are defined in ws_control_ids.incl.pl1. message type message direction data id ws_tty_:WSTERM ---------------------------- ---- -------------- --------------- Abort ABT -> - Enter Sync Mode ESM -> break table Sync Mode Entered SME <- - Exit Sync Mode XSM -> - Sync Mode Exited SMX <- - End Echoed Input EEI <- text End Non-echoed Input ENI <- text Read with No Echo RNE -> count Read With Echo RWE -> count Set Break Table SBT -> break table Set TTY Modes STM -> tty modes Echoed Input Chars EIC <- text Unechoed Input Chars UIC <- text Printer On PON -> - Printer Off POF -> - Order ORD -> control order ----------------------------------------------------------------- Break table The break table format is simply the list of printing ASCII characters that are to be interpreted as causing break on input. The nonprinting control characters (octal 000 to 037 and 177) are always break characters. If the break table is null, that is the size is zero, there are no break characters. If the break table size is -1 break-all mode is indicated and no break table data is present. TTY modes The TTY modes data is a six byte field which contains the following values: _______ _______ ws_tty_ ws_tty_ _______ _______ data byte contents ----- ---------- 1 mode switches, to be further defined as needed 2 kill character (default is @) 3 erase character (default is #) 4 literal next character (default is ) 5 maximum column or line length (default is 80) 6 max lines or page length (default is 23) Control order The data field of the Order control message is the ascii text of the order as passed to ws_tty_ plus any relevant data specific to the control order. No control orders are currently required to be passed to WSTERM, but this mechanism will allow for the possibility in the future. Read count The count in RNE and RWE is a two byte or 16 bit field containing an integer of the number of characters to read. In the unlikely event that the read count exceeds this 64K field, ws_tty_ will make repeated reads until the count is satisfied. Text Text data is simply a string of ASCII characters, one per byte. The number of characters is given by the message size.