COMPILATION LISTING OF SEGMENT v1_forum_mgr_ Compiled by: Multics PL/I Compiler, Release 29, of July 28, 1986 Compiled at: Honeywell Multics Op. - System M Compiled on: 08/16/86 1407.2 mst Sat Options: optimize map 1 /* *************************************************************** 2* * * 3* * Copyright (c) 1982 by Massachusetts Institute of Technology * 4* * * 5* *************************************************************** */ 6 7 8 9 /* This module is part of the forum inner ring side. It maintains the correspondence between forum pathnames 10* (from the user ring), forum indexes (for the user ring) and pointers to the forum segments which are used only 11* in the inner ring. It also implements locking the forums. 12* 13* Original Coding 14 June 1981 by J. Spencer Love 14* Modified 01/12/82 Jay Pattin to add get_forum_path and change_chairman 15* Modified 01/16/82 Jay Pattin to add list_users (was in trans_mgr_) 16* renamed v1_forum_mgr_ with associated editing 01/21/82 Jay Pattin 17* Modified 02/16/82 Jay Pattin added listening and set_event_channel 18* Modified 03/29/82 Jay Pattin added priv_change_chairman 19* Modified 05/05/82 Jay Pattin added read only support 20* Modified 05/21/82 Jay Pattin added eligibility hacking 21* Modified 06/23/82 Jay Pattin garbage collection 22* Modified 06/23/82 Jay Pattin check for anonymous users 23* Modified 9/25/82 Jay Pattin add adjourned switch, AIM support */ 24 25 /* THIS IS DOCUMENTATION FOR THE INTERNAL INNER RING INTERFACES 26* 27*They are to be called by other ring 3 procedures only. The caller needn't change the validation level, 28*since all necessary validation level changes for initiating and terminating forum segments and determining 29*access are performed by these entrypoints. 30* 31*Name: v1_forum_mgr_$get_ptrs 32* 33*Most inner ring forum interfaces should use a forum index to identify the forum. The correspondence 34*between these identifiers and useful pointers is mapped by this entrypoint. Pass the index by 35*reference; no need to copy, and get back the information you need to do your work. The forum is also locked by 36*this entrypoint. To unlock the forum, call v1_forum_mgr_$unlock. You should have a cleanup handler to do 37*this in case of random lossage, and also check all exit points in your program, because it is very important that 38*the forum never be left locked when control is returned to the user ring. You should also never return 39*pointers to the forum to the user ring, or other information like other processes' event channels or 40*process_ids. Please also DO NOT TERMINATE THE POINTERS RETURNED BY THIS INTERFACE. 41* 42* 43*Name: v1_forum_mgr_$unlock 44* 45*The following entrypoint is for cleaning up after v1_forum_mgr_$get_ptrs. The following sequence or an 46*equivalent should be used in all code that accepts forum indexes as input: 47* 48*forum_control_ptr = null (); 49*on cleanup call v1_forum_mgr_$unlock (forum_control_ptr); 50*call v1_forum_mgr_$get_ptrs (P_forum_idx, forum_control_ptr, 51* proceedings_ptr, attendee_idx, status); 52*if status ^= 0 then do; 53* P_status = status; 54* return; 55*end; 56* 57*It accepts a null pointer. It traps faults. There is no error code because nothing can go wrong that doesn't 58*kill your process, and that would be due to random damage in the environment, not this module. 59* 60*Name: v1_forum_mgr_$initiate 61* 62*There is also an interface for dealing with forums that are not already open. It optionally locks the forum. 63*Otherwise it performs essentially all the checks that forum_$open provides. However, it can return with 64*a zero code and proceedings pointer = null. In this case, the user has sufficient access to find out the name of 65*the chairman and the names of the participants. Absolutely no information whatsoever should be returned about the 66*transactions. Entrypoints that return no or partial information in this case should return 67*forum_error_table_$not_eligible after calling v1_forum_mgr_$terminate. This interface is intended to be called 68*with a user ring validation level. It can be called at the forum ring validation level, but the caller 69*probably shouldn't have its privileges enabled. It is also intended that you pass the character string 70*arguments from the user ring by reference without copying so that truncation can be detected. 71* 72* 73*Name: v1_forum_mgr_$terminate 74* 75*The following is for cleaning up after v1_forum_mgr_$initiate. It unlocks the forum if it is locked. It 76*traps faults. It eats null pointers. It hacks its own validation level. In nulls its arguments. There is no 77*error code because nothing can go wrong that doesn't kill your process, and that is an act of God and the 78*initializer, not this module. */ 79 80 v1_forum_mgr_$open_forum: 81 procedure (P_forum_dir, P_forum_entry, P_forum_idx, P_status); 82 83 declare P_forum_dir char (*) parameter, 84 P_forum_entry char (*) parameter, 85 P_forum_idx fixed bin parameter, 86 P_lock_switch bit (1) aligned parameter, 87 P_forum_control_ptr ptr parameter, 88 P_proceedings_ptr ptr parameter, 89 P_attendee_idx fixed bin parameter, 90 P_user_name char (*) parameter, 91 P_switch_name char (*) parameter, 92 P_switch_setting bit (1) aligned parameter, 93 P_event_channel fixed bin (71) parameter, 94 P_access_name char (*) parameter, 95 P_access_time fixed bin (71) parameter, 96 P_forum_info_ptr ptr parameter, 97 P_area_ptr ptr parameter, 98 P_user_list_ptr ptr parameter, 99 P_last_seen_trans_idx fixed bin parameter, 100 P_force_switch bit (1) aligned parameter, 101 P_chairman char (*) parameter, 102 P_write_allowed bit (1) aligned parameter, 103 P_status fixed bin (35) parameter; 104 105 declare (addr, after, before, clock, hbound, index, length, max, maxlength, min, null, rtrim, substr, unspec) 106 builtin; 107 108 declare (any_other, area, cleanup, no_read_permission, no_write_permission, seg_fault_error) 109 condition; 110 111 declare attendee_idx fixed bin, /* The users slot in the array forum_control.attendee */ 112 caller_validation fixed bin (3), /* The validation level to exit with. Set by initialize. */ 113 dirname_buffer char (168), /* The REAL directory containing the forum */ 114 dirname_len fixed bin, /* The length returned by hcs_$fs_get_path_name */ 115 egress label variable, /* BAIL OUT AT 30,000 FEET. Set by initialize. */ 116 force_switch bit (1) aligned, /* To max or not to max, for set_last_seen_trans_idx */ 117 last_seen_trans_idx fixed bin, /* copy of P_last_seen_trans_idx */ 118 forum_control_entry char (32), /* The REAL entryname of the control segment. */ 119 forum_name_len fixed bin, /* The length of the forum name without a suffix */ 120 forum_data_ptr ptr, /* If this ptr is nonnull the forum is open */ 121 forum_dir char (168), /* The copied directory input parameter */ 122 no_w_access bit (1) aligned, 123 privileged bit (1) aligned, 124 switch_name char (32), 125 switch_setting bit (1) aligned, 126 write_allowed bit (1) aligned, 127 status fixed bin (35); /* What went wrong */ 128 129 declare 1 segment_acl aligned, 130 2 access_name char (32), 131 2 modes bit (36), 132 2 xmodes bit (36), 133 2 status fixed bin (35); 134 135 declare 1 delete_acl aligned, 136 2 access_name char (32), 137 2 status fixed bin (35); 138 139 /* The following is used by get_forum_info to accumulate data. Automatic storage is safe and secure. */ 140 141 declare 1 fmi aligned like forum_info; 142 143 /* The following is used by find_forum_data and maintained by open_forum and close_forum to find openings. */ 144 145 declare first_forum_data_ptr ptr static initial (null ()); 146 147 /* The following are global static constants set by initialize the first time we are called. */ 148 149 declare static_initialized bit (1) aligned static initial ("0"b), 150 anon_switch bit (1) aligned static initial ("0"b), 151 my_authorization bit (72) aligned static initial ("0"b), 152 full_authorization bit (72) aligned static initial ("0"b), 153 my_process_id bit (36) aligned static initial (""b), 154 my_lock_id bit (36) aligned static initial (""b), 155 my_validation fixed bin (3) static initial (5), 156 project char (9) static initial (""), 157 user_name char (22) static initial (""); 158 159 declare directory char (dirname_len) based (addr (dirname_buffer)), 160 system_area area based (get_system_free_area_ ()), 161 P_area area based (P_area_ptr); 162 163 declare 1 aim_bits aligned like aim_template based (addr (full_authorization)); 164 165 declare 1 forum_data aligned based (forum_data_ptr), 166 2 next_ptr ptr, /* Thread. Used for searching. */ 167 2 prev_ptr ptr, /* Thread. Used for unthreading. */ 168 2 name char (24) unaligned,/* For debugging only. Unsuffixed forum name. */ 169 2 forum_control_ptr ptr, /* The control segment */ 170 2 proceedings_ptr ptr, /* The proceedings segment */ 171 2 forum_control_uid bit (36), /* The UID of the control segment. For comparison. */ 172 2 forum_idx fixed bin, /* The index of this opening. For lookup. */ 173 2 attendee_idx fixed bin, /* The slot in the attendee array. For efficiency */ 174 2 opening_count fixed bin; /* Don't initiate more than once. See UID. */ 175 176 declare (forum_error_table_$cant_stop_msg_admin, 177 forum_error_table_$cant_stop_msg_site, 178 forum_error_table_$chairman_only, 179 forum_error_table_$invalid_forum_idx, 180 forum_error_table_$invalid_switch_name, 181 forum_error_table_$invalid_trans_idx, 182 forum_error_table_$long_forum_name, 183 forum_error_table_$forum_deleted, 184 forum_error_table_$meeting_adjourned, 185 forum_error_table_$no_control_suffix, 186 forum_error_table_$no_such_forum, 187 forum_error_table_$no_such_user, 188 forum_error_table_$not_a_forum, 189 forum_error_table_$not_eligible, 190 forum_error_table_$roster_full, 191 forum_error_table_$switch_not_changed, 192 forum_error_table_$unexpected_fault, 193 forum_error_table_$you_twit, 194 error_table_$ai_restricted, 195 error_table_$bad_arg, 196 error_table_$dirlong, 197 error_table_$invalid_lock_reset, 198 error_table_$lock_wait_time_exceeded, 199 error_table_$locked_by_this_process, 200 error_table_$moderr, 201 error_table_$noalloc, 202 error_table_$noentry, 203 error_table_$null_info_ptr, 204 error_table_$seg_busted, 205 error_table_$unimplemented_version 206 ) fixed bin (35) external; 207 208 declare (forum_data_$print_eligibility_messages, 209 forum_data_$chairman_override) 210 bit (1) aligned external; 211 212 declare get_authorization_ entry returns (bit (72) aligned), 213 get_group_id_$tag_star entry returns (char (32)), 214 get_lock_id_ entry (bit(36) aligned), 215 get_process_id_ entry returns (bit (36)), 216 get_ring_ entry returns (fixed bin (3)), 217 get_system_free_area_ entry returns (ptr), 218 hcs_$add_acl_entries entry (char (*), char (*), ptr, fixed bin, fixed bin (35)), 219 hcs_$delete_acl_entries entry (char(*), char(*), ptr, fixed bin, fixed bin(35)), 220 hcs_$fs_get_brackets entry (ptr, fixed bin (5), (3) fixed bin (3), fixed bin (35)), 221 hcs_$fs_get_path_name entry (ptr, char (*), fixed bin, char (*), fixed bin (35)), 222 hcs_$get_access_class entry (char(*), char(*), bit (72) aligned, fixed bin (35)), 223 hcs_$get_authorization entry (bit (72) aligned, bit (72) aligned), 224 hcs_$get_uid_seg entry (ptr, bit (36) aligned, fixed bin (35)), 225 hcs_$get_user_effmode entry (char (*), char (*), char (*), fixed bin (3), fixed bin (5), fixed bin (35)), 226 hcs_$initiate entry (char (*), char (*), char (*), fixed bin (1), fixed bin (2), ptr, 227 fixed bin (35)), 228 hcs_$level_get entry () returns (fixed bin (3)), 229 hcs_$level_set entry (fixed bin (3)), 230 hcs_$terminate_noname entry (ptr, fixed bin (35)), 231 read_write_allowed_ entry (bit (72) aligned, bit (72) aligned) returns (bit (1) aligned), 232 set_lock_$lock entry (bit (36) aligned, fixed bin, fixed bin (35)), 233 set_lock_$unlock entry (bit (36) aligned, fixed bin (35)), 234 user_info_$login_data entry (char (*), char (*), char (*), fixed bin, fixed bin, fixed bin, 235 fixed bin (71), char (*)); 236 1 1 /* START OF: forum_structures.incl.pl1 * * * * * * * * * * * * * * * * * * * */ 1 2 1 3 declare forum_control_ptr ptr, 1 4 proceedings_ptr ptr; 1 5 1 6 declare 1 forum_control aligned based (forum_control_ptr), 1 7 2 forum_lock bit (36), /* Proceedings lock. */ 1 8 2 next_trans_loc fixed bin (35), /* Characters in proceedings. */ 1 9 2 flags unaligned, 1 10 3 mbz0 bit (3) unaligned, /* Already wasted on acl stuff at MIT */ 1 11 3 msg_init bit (1) unaligned, /* On if message info is valid */ 1 12 3 am_init bit (1) unaligned, /* next value is valid */ 1 13 3 am_print_acl_msg bit (1) unaligned, /* what administrator says */ 1 14 3 cm_init bit (1) unaligned, /* next value is valid */ 1 15 3 cm_print_acl_msg bit (1) unaligned, /* what chairman says */ 1 16 3 adjourned bit (1) unaligned, /* temporarily out of service, per chairman request */ 1 17 3 mbz1 bit (9) unaligned, /* Future expansion */ 1 18 2 no_transactions fixed bin unaligned,/* Transaction sequence number. */ 1 19 2 message_loc fixed bin unaligned,/* location of chairman message in proceedings seg */ 1 20 2 no_attendees fixed bin unaligned,/* Number of participants. */ 1 21 2 mbz2 bit (18) unaligned, 1 22 2 no_deleted fixed bin unaligned, 1 23 2 chairman unaligned, 1 24 3 person_id char (22), 1 25 3 project_id char (9), 1 26 2 attendee (500), /* Attendee data. */ 1 27 3 person_id char (22) unaligned, 1 28 3 project_id char (11) unaligned, 1 29 3 attending bit (1) unaligned, 1 30 3 deleted bit (1) unaligned, 1 31 3 interesting bit (1) unaligned, /* tentative, not used yet */ 1 32 3 notify bit (1) unaligned, 1 33 3 removed bit (1) unaligned, /* on if set_participate_off used */ 1 34 3 write_allowed bit (1) unaligned, 1 35 3 acl_change_pending bit (1) unaligned, 1 36 3 message_changed bit (1) unaligned, 1 37 3 unused_flags bit (1) unaligned, /* Spare flag. */ 1 38 3 last_time_attended fixed bin (71), /* date/time last attended */ 1 39 3 lock_id bit (36) aligned, /* Used to check validity of attending. */ 1 40 3 highest_trans_seen fixed bin, 1 41 3 process_id bit (36), 1 42 3 public_wakeup_chan fixed bin (71), /* Transaction channel. */ 1 43 2 transactions (0 refer (forum_control.no_transactions)) aligned like one_transaction; 1 44 1 45 declare 1 one_transaction aligned based, 1 46 2 person_id char (22) unaligned, 1 47 2 project_id char (11) unaligned, 1 48 2 deleted bit (1) unaligned, /* logically removed */ 1 49 2 gone bit (1) unaligned, /* physically removed via compaction */ 1 50 2 unfilled bit (1) unaligned, /* on if trans entered unfilled */ 1 51 2 deleted_by_author bit (1) unaligned, /* as opposed to deleted by chairman */ 1 52 2 unused bit (23) unaligned, 1 53 2 prior_ref_index fixed bin, /* index to trans I refer to */ 1 54 2 next_ref_index fixed bin, /* index to trans referring to me */ 1 55 2 subject char (72) unaligned, 1 56 2 time fixed bin (71), /* date-time of entry */ 1 57 2 offset fixed bin (35), /* Where text of transaction begins */ 1 58 2 length fixed bin (21); /* in bytes */ 1 59 1 60 declare ipc_message fixed bin (71) based (msg_ptr), /* message for inter-process calls */ 1 61 msg_ptr ptr static; 1 62 1 63 declare 1 forum_message aligned, /* what we're trying to tell other process(es) */ 1 64 2 forum_uid bit (36) aligned, /* what forum */ 1 65 2 index fixed bin; /* who did it? */ 1 66 1 67 /* END OF: forum_structures.incl.pl1 * * * * * * * * * * * * * * * * * * * */ 237 238 2 1 /* START OF: forum_info.incl.pl1 * * * * * * * * * * * * * * * * * * * */ 2 2 2 3 2 4 2 5 /****^ HISTORY COMMENTS: 2 6* 1) change(86-07-30,Pattin), approve(86-07-30,MCR7354), 2 7* audit(86-08-03,Margolin), install(86-08-16,MR12.0-1128): 2 8* Changed to version 2, speed up call by not calculating remove count. 2 9* END HISTORY COMMENTS */ 2 10 2 11 2 12 declare forum_info_ptr ptr; 2 13 2 14 declare 1 forum_info aligned based (forum_info_ptr), 2 15 2 version fixed bin, /* Must be 1 or 2 */ 2 16 2 forum_uid bit (36), 2 17 2 chairman unaligned, 2 18 3 username char (20), 2 19 3 project char (9), 2 20 3 pad char (3), 2 21 2 attendee_count fixed bin, 2 22 2 removal_count fixed bin, /* always 0 in version 2 */ 2 23 2 transaction_count fixed bin, 2 24 2 deletion_count fixed bin, 2 25 2 last_seen_trans_idx fixed bin, 2 26 2 last_time_changed fixed bin (71), 2 27 2 last_time_attended fixed bin (71), 2 28 2 changes_count fixed bin, 2 29 2 flags unaligned, 2 30 3 eligible bit (1), 2 31 3 mbz1 bit (1), 2 32 3 removed bit (1), 2 33 3 notify bit (1), 2 34 3 attending bit (1), 2 35 3 mbz2 bit (2), 2 36 3 read_only bit (1), 2 37 3 adjourned bit (1), 2 38 3 mbz3 bit (27); 2 39 2 40 declare forum_info_version_1 fixed bin static options (constant) initial (1), 2 41 forum_info_version_2 fixed bin static options (constant) initial (2); 2 42 2 43 /* END OF: forum_info.incl.pl1 * * * * * * * * * * * * * * * * * * * */ 239 240 3 1 /* BEGIN INCLUDE FILE: forum_user_list.incl.pl1 */ 3 2 3 3 declare user_list_no_attendees fixed bin, 3 4 user_list_ptr ptr; 3 5 3 6 declare 1 user_list aligned based (user_list_ptr), 3 7 2 version fixed bin, 3 8 2 chairman aligned, 3 9 3 person_id char (22) unaligned, 3 10 3 project_id char (9) unaligned, 3 11 2 transaction_count fixed bin, 3 12 2 no_attendees fixed bin, 3 13 2 attendees (user_list_no_attendees refer (user_list.no_attendees)), 3 14 3 person_id char (22) unaligned, 3 15 3 project_id char (11) unaligned, 3 16 3 attending bit (1) unaligned, 3 17 3 mbz1 bit (2) unaligned, /* version 1 compatibility */ 3 18 3 notify bit (1) unaligned, 3 19 3 removed bit (1) unaligned, 3 20 3 read_only bit (1) unaligned, 3 21 3 deleted bit (1) unaligned, 3 22 3 unused_flags bit (2) unaligned, 3 23 3 last_time_attended fixed bin (71), 3 24 3 highest_trans_seen fixed bin; 3 25 3 26 declare user_list_version_2 fixed bin static init (2) options (constant); 3 27 3 28 /* END INCLUDE FILE: forum_user_list.incl.pl1 */ 241 242 4 1 /* BEGIN INCLUDE FILE aim_template.incl.pl1 */ 4 2 4 3 /* Created 740723 by PG */ 4 4 /* Modified 06/28/78 by C. D. Tavares to add rcp privilege */ 4 5 /* Modified 83-05-10 by E. N. Kitltitz to add communications privilege */ 4 6 4 7 /* This structure defines the components of both an access 4 8* class and an access authorization as interpreted by the 4 9* Access Isolation Mechanism. */ 4 10 4 11 4 12 dcl 1 aim_template aligned based, /* authorization/access class template */ 4 13 2 categories bit (36), /* access categories */ 4 14 2 level fixed bin (17) unaligned, /* sensitivity level */ 4 15 2 privileges unaligned, /* special access privileges (in authorization only) */ 4 16 (3 ipc, /* interprocess communication privilege */ 4 17 3 dir, /* directory privilege */ 4 18 3 seg, /* segment privilege */ 4 19 3 soos, /* security out-of-service privilege */ 4 20 3 ring1, /* ring 1 access privilege */ 4 21 3 rcp, /* RCP resource access privilege */ 4 22 3 comm) bit (1), /* communications cross-AIM privilege */ 4 23 3 pad bit (11); 4 24 4 25 4 26 /* END INCLUDE FILE aim_template.incl.pl1 */ 243 244 5 1 /* BEGIN INCLUDE FILE ... access_mode_values.incl.pl1 5 2* 5 3* Values for the "access mode" argument so often used in hardcore 5 4* James R. Davis 26 Jan 81 MCR 4844 5 5* Added constants for SM access 4/28/82 Jay Pattin 5 6* Added text strings 03/19/85 Chris Jones 5 7**/ 5 8 5 9 5 10 /* format: style4,delnl,insnl,indattr,ifthen,dclind10 */ 5 11 dcl ( 5 12 N_ACCESS init ("000"b), 5 13 R_ACCESS init ("100"b), 5 14 E_ACCESS init ("010"b), 5 15 W_ACCESS init ("001"b), 5 16 RE_ACCESS init ("110"b), 5 17 REW_ACCESS init ("111"b), 5 18 RW_ACCESS init ("101"b), 5 19 S_ACCESS init ("100"b), 5 20 M_ACCESS init ("010"b), 5 21 A_ACCESS init ("001"b), 5 22 SA_ACCESS init ("101"b), 5 23 SM_ACCESS init ("110"b), 5 24 SMA_ACCESS init ("111"b) 5 25 ) bit (3) internal static options (constant); 5 26 5 27 /* The following arrays are meant to be accessed by doing either 1) bin (bit_value) or 5 28* 2) divide (bin_value, 2) to come up with an index into the array. */ 5 29 5 30 dcl SEG_ACCESS_MODE_NAMES (0:7) init ("null", "W", "E", "EW", "R", "RW", "RE", "REW") char (4) internal 5 31 static options (constant); 5 32 5 33 dcl DIR_ACCESS_MODE_NAMES (0:7) init ("null", "A", "M", "MA", "S", "SA", "SM", "SMA") char (4) internal 5 34 static options (constant); 5 35 5 36 dcl ( 5 37 N_ACCESS_BIN init (00000b), 5 38 R_ACCESS_BIN init (01000b), 5 39 E_ACCESS_BIN init (00100b), 5 40 W_ACCESS_BIN init (00010b), 5 41 RW_ACCESS_BIN init (01010b), 5 42 RE_ACCESS_BIN init (01100b), 5 43 REW_ACCESS_BIN init (01110b), 5 44 S_ACCESS_BIN init (01000b), 5 45 M_ACCESS_BIN init (00010b), 5 46 A_ACCESS_BIN init (00001b), 5 47 SA_ACCESS_BIN init (01001b), 5 48 SM_ACCESS_BIN init (01010b), 5 49 SMA_ACCESS_BIN init (01011b) 5 50 ) fixed bin (5) internal static options (constant); 5 51 5 52 /* END INCLUDE FILE ... access_mode_values.incl.pl1 */ 245 246 247 /* This is the primary user ring interface to forum. To enter a forum and read or enter transactions, the 248* forum must first be opened. This sets the attending flag and returns an integer to identify the opening. */ 249 250 /* v1_forum_mgr_$open: procedure (P_forum_dir, P_forum_entry, P_forum_idx, P_status); */ 251 252 call initialize (OPEN_EXIT); /* Set up for "error" procedure and cleanup handler. */ 253 254 call copy_pathname_args (); /* P_forum_dir and P_forum_entry */ 255 256 on cleanup call close_forum (); /* If (heaven forbid) we should crawl out, die gracefully. */ 257 258 call initiate_forum ("1"b); /* Set forum_control_ptr and proceedings_ptr. */ 259 260 if no_w_access then call error (forum_error_table_$not_eligible); 261 262 call lock_forum (); /* Lock out anyone else during update. */ 263 264 call open_forum (); /* Find or allocate forum_data. */ 265 266 if forum_control.flags.adjourned then 267 if anon_switch | user_name ^= forum_control.chairman.person_id then 268 call error (forum_error_table_$meeting_adjourned); 269 270 call fill_attendee_slot (); /* Update control segment. */ 271 forum_control.attendee (attendee_idx).public_wakeup_chan = 0; 272 forum_control.attendee (attendee_idx).write_allowed = write_allowed; 273 274 call unlock_forum (); /* Finished updating, unlock. */ 275 276 P_forum_idx = forum_data.forum_idx; /* Tell user how to access this forum in the future. */ 277 P_status = 0; /* If we got this far there was no error. */ 278 279 return; 280 281 OPEN_EXIT: 282 call close_forum (); /* Clean up the mess, we didn't make it. */ 283 284 P_forum_idx = 0; /* Lowest valid forum index is 1, so this won't be back. */ 285 P_status = status; /* Tell user what went wrong. */ 286 287 return; 288 289 /* This performs the actual forum opening. It requires that the forum be initiated and locked. It sets 290* forum_data_ptr. If the forum was not previously opened, it changes first_forum_data_ptr; otherwise 291* it sets attendee_idx. It detects duplicate openings by comparing UIDs to avoid reused segment number bugs. */ 292 293 open_forum: 294 procedure (); 295 296 declare forum_control_uid bit (36) aligned; 297 298 on cleanup forum_data_ptr = null (); 299 300 call hcs_$get_uid_seg (forum_control_ptr, forum_control_uid, status); 301 if status ^= 0 then call error (status); 302 303 do forum_data_ptr = first_forum_data_ptr repeat (forum_data.next_ptr) while (forum_data_ptr ^= null ()); 304 305 if forum_data.forum_control_uid = forum_control_uid 306 then do; 307 call terminate_forum (); /* Initiated too many times. Once is sufficient. */ 308 309 forum_data.opening_count = forum_data.opening_count + 1; 310 forum_control_ptr = forum_data.forum_control_ptr; 311 proceedings_ptr = forum_data.proceedings_ptr; 312 attendee_idx = forum_data.attendee_idx; 313 314 return; 315 end; 316 end; 317 318 /* If we are here, forum was not previously opened, so we must allocate and fill in a forum_data block */ 319 320 call allocate_forum_data (); 321 322 forum_data.name = substr (forum_control_entry, 1, forum_name_len); 323 forum_data.forum_control_ptr = forum_control_ptr; 324 forum_data.proceedings_ptr = proceedings_ptr; 325 forum_data.forum_control_uid = forum_control_uid; 326 forum_data.opening_count = 1; 327 328 forum_data.prev_ptr = null (); /* Thread the forum_data block into the list so we can */ 329 forum_data.next_ptr = first_forum_data_ptr; /* find it later. Bidirectional threads to unthread later */ 330 331 if forum_data.next_ptr = null () 332 then forum_data.forum_idx = 1; /* Meeting index must have no duplications. */ 333 else do; 334 forum_data.forum_idx = forum_data.next_ptr -> forum_data.forum_idx + 1; 335 forum_data.next_ptr -> forum_data.prev_ptr = forum_data_ptr; 336 end; 337 338 first_forum_data_ptr = forum_data_ptr; /* Threads are OK, so now make him official */ 339 340 return; 341 342 end open_forum; 343 344 /* We must set our validation level to 3 before allocating forum_data because forum_data is allocated in the 345* inner ring's system free area. If this area is extended by this allocation, a bug in get_next_area_component_ 346* creates the new component with brackets of validation level rather than copying the ring brackets from the 347* first component of the area. This is in its own procedure to satisfy my warped sense of esthetics. */ 348 349 allocate_forum_data: 350 procedure (); 351 352 on any_other call error (forum_error_table_$unexpected_fault); 353 on area call error (error_table_$noalloc); /* Deal with inability to allocate gracefully. */ 354 on cleanup call hcs_$level_set (caller_validation); 355 356 call hcs_$level_set (my_validation); 357 358 allocate forum_data in (system_area); 359 360 call hcs_$level_set (caller_validation); 361 362 return; 363 364 end allocate_forum_data; 365 366 /* This undoes the work of v1_forum_mgr_$close. It zeros its first argument so you won't close the forum more 367* times than you open it. */ 368 369 v1_forum_mgr_$close_forum: 370 entry (P_forum_idx, P_status); 371 372 call initialize (CLOSE_EXIT); /* Set up for "error" procedure and cleanup handler. */ 373 374 call lookup_forum_idx (); /* Find forum_data node from P_forum_idx. */ 375 376 on cleanup call unlock_forum (); /* Now I lay me down to crunch, if I should fault... */ 377 378 call lock_forum (); /* Don't let anyone else see the forum while we frob it. */ 379 380 call check_attendee_idx (); /* Just in case forum was garbage collected. */ 381 382 P_forum_idx = 0; /* Make sure caller doesn't close this one twice. */ 383 384 call close_forum (); /* Clean up forum opening, unlock, terminate */ 385 386 P_status = 0; /* If we got this far then there is no error. */ 387 388 return; 389 390 CLOSE_EXIT: 391 call unlock_forum (); /* Clean up the mess, we didn't make it. */ 392 393 P_status = status; /* Tell then use what went wrong. */ 394 395 return; 396 397 /* This procedure closes a forum. It assumes that the forum is initiated (forum_control_ptr ^= null ()), that 398* the forum is open (forum_data_ptr ^= null ()), that the forum is locked, and that attendee_idx is valid. 399* However, it is also used as a cleanup handler for open relation, so it hedges each assumption with a check. */ 400 401 close_forum: 402 procedure (); 403 404 if forum_data_ptr ^= null () 405 then do; 406 forum_data.opening_count = forum_data.opening_count - 1; 407 if forum_data.opening_count > 0 408 then do; 409 call unlock_forum (); 410 return; 411 end; 412 413 /* If we get here, we are really closing a forum, so unthread the forum_data node and free it. We check that 414* first_forum_data_ptr = forum_data_ptr instead of prev_ptr = null as last ditch protection against inconsistency. */ 415 416 if first_forum_data_ptr = forum_data_ptr then first_forum_data_ptr = forum_data.next_ptr; 417 418 if forum_data.prev_ptr ^= null () 419 then forum_data.prev_ptr -> forum_data.next_ptr = forum_data.next_ptr; 420 421 if forum_data.next_ptr ^= null () 422 then forum_data.next_ptr -> forum_data.prev_ptr = forum_data.prev_ptr; 423 424 free forum_data; 425 end; 426 427 /* See if we actually own an attendee slot. If we do, then clear it out. But if we don't have forum_control_ptr 428* valid, or attendee_idx is zero, or some other process claims to own the slot, then we leave it alone. We are 429* protected from trying to modify the forum if it is not locked because attendee_idx is zero until after the 430* forum has been locked, and unlock_forum zeros it again before unlocking. */ 431 432 if forum_control_ptr ^= null () & attendee_idx > 0 then 433 if forum_control.attendee (attendee_idx).process_id = my_process_id then do; 434 forum_control.attendee (attendee_idx).project_id = project; 435 forum_control.attendee (attendee_idx).last_time_attended = clock (); 436 forum_control.attendee (attendee_idx).public_wakeup_chan = 0; 437 forum_control.attendee (attendee_idx).attending = "0"b; 438 end; 439 440 call unlock_forum (); 441 442 call terminate_forum (); 443 444 return; 445 446 end close_forum; 447 448 /* This is an internal ring 3 interface. A ring three entrypoint which accepts a forum index should call here 449* to translate the forum index into pointers to the two segments and get the index of the current user's 450* slot on the attendee array, which is a speed optimization. If you get back a nonzero code, PUNT. Return 451* the code to the user ring. Otherwise, you have the forum LOCKED, and you must call v1_forum_mgr_$unlock 452* before returning to the user ring. It is perfectly OK to call this entrypoint with a null pointer or an 453* unlocked database, so put it in your cleanup handler. DO NOT TERMINATE THESE POINTERS! */ 454 455 v1_forum_mgr_$get_ptrs: 456 entry (P_forum_idx, P_forum_control_ptr, P_proceedings_ptr, P_attendee_idx, P_write_allowed, P_status); 457 458 call initialize (GET_PTRS_EXIT); /* Set up for "error" procedure and cleanup handler. */ 459 460 call lookup_forum_idx (); /* Find forum_data node from P_forum_idx. */ 461 462 on cleanup call unlock_forum (); /* In case of crawlout, for whatever reason... */ 463 464 call lock_forum (); /* We want the whole thing to ourselves for a while. */ 465 466 call fill_attendee_slot (); /* Make sure that last_time_attended is updated. */ 467 468 P_forum_control_ptr = forum_control_ptr; 469 P_proceedings_ptr = proceedings_ptr; 470 P_attendee_idx = attendee_idx; /* Tell caller this for efficiency. */ 471 P_write_allowed = forum_control.attendee (attendee_idx).write_allowed; 472 P_status = 0; 473 474 return; 475 476 GET_PTRS_EXIT: 477 call unlock_forum (); /* Clean up the mess, we didn't make it. */ 478 479 P_forum_control_ptr = null (); 480 P_proceedings_ptr = null (); 481 P_attendee_idx = 0; /* This means that the slot number is unknown. */ 482 P_status = status; /* Tell the caller what went wrong. */ 483 484 return; 485 486 /* The procedure looks up a forum index of the sort that passes for a forum pointer in the user ring. Rather than 487* have an array and hence a maximum number of forums that can easily be concurrently open, a linked list is 488* employed. It is expected that rarely will more than two forums be open in the same process, so search time 489* should normally not be significant. If the search is successful, we set forum_data_ptr, forum_control_ptr, 490* proceedings_ptr and attendee_idx. Otherwise, we set the error code and bail out. */ 491 492 lookup_forum_idx: 493 procedure (); 494 495 declare forum_control_uid bit (36) aligned, 496 forum_idx fixed bin; 497 498 on cleanup forum_data_ptr = null (); /* This ptr may be used be our callers' cleanup handlers. */ 499 500 forum_idx = P_forum_idx; /* Copy the parameter in case it uses tally modifiers. */ 501 502 if forum_idx < 1 then call error (forum_error_table_$invalid_forum_idx); 503 504 /* So try to find the right forum_data node. If we return out of the loop, forum_data_ptr will be correctly set. */ 505 506 do forum_data_ptr = first_forum_data_ptr repeat (forum_data.next_ptr) while (forum_data_ptr ^= null ()); 507 508 if forum_data.forum_idx = forum_idx 509 then do; 510 call hcs_$get_uid_seg (forum_data.forum_control_ptr, forum_control_uid, status); 511 if status ^= 0 then call error (status); 512 513 if forum_data.forum_control_uid ^= forum_control_uid 514 then call error (forum_error_table_$forum_deleted); 515 516 forum_control_ptr = forum_data.forum_control_ptr; 517 proceedings_ptr = forum_data.proceedings_ptr; 518 attendee_idx = forum_data.attendee_idx; 519 520 return; 521 end; 522 end; 523 524 /* If we get here. forum_data_ptr is null, so we don't have the cleanup handler null it and save microseconds. */ 525 526 revert cleanup; 527 528 call error (forum_error_table_$invalid_forum_idx); 529 530 end lookup_forum_idx; 531 532 /* The contract of this procedure is to try very hard to lock the forum. We assume that forum_control_ptr is 533* valid. Since it makes the first reference to the control segment for some pathways, and the first write to the 534* segment for others, it has lots of handlers. Once the forum is locked, the ACL cannot be changed by the 535* forum primitives, nor the forum be deleted, so these handlers are not needed throughout the rest of the 536* forum inner ring. */ 537 538 lock_forum: 539 procedure (); 540 541 declare count fixed bin, 542 not_locked bit (1) aligned; 543 544 on any_other call error (forum_error_table_$unexpected_fault); 545 on no_read_permission call error (error_table_$moderr); 546 on no_write_permission call error (error_table_$moderr); 547 on seg_fault_error call error (error_table_$seg_busted); 548 549 not_locked = "1"b; 550 do count = 1 to 10 while (not_locked); 551 552 call set_lock_$lock (forum_control.forum_lock, 2, status); 553 if status = 0 then not_locked = "0"b; 554 else if status ^= error_table_$lock_wait_time_exceeded then not_locked = "0"b; 555 end; 556 557 if status ^= 0 558 then if status ^= error_table_$invalid_lock_reset then call error (status); 559 560 return; /* This implicitly reverts the handlers */ 561 562 end lock_forum; 563 564 /* This routine keeps the attendee slot for the current user up to date in the control segment. Of particular 565* interest is the last_time_attended field. Meeting_control_ptr is assumed valid. No variables are set. */ 566 567 fill_attendee_slot: 568 procedure (); 569 570 call check_attendee_idx (); /* Check this in case forum was garbage collected. */ 571 572 /* The clock value is put in forum_control.last_time_attended every time we reference the forum. */ 573 574 forum_control.attendee (attendee_idx).last_time_attended = clock (); 575 576 /* Since we're changing the page anyway, we might as well always write out this info which must be written out when the 577* forum is opened and which might be smashed if two processes for the same user both have the same forum open. */ 578 579 forum_control.attendee (attendee_idx).project_id = project; 580 forum_control.attendee (attendee_idx).attending = "1"b; 581 forum_control.attendee (attendee_idx).removed = "0"b; 582 forum_control.attendee (attendee_idx).process_id = my_process_id; 583 forum_control.attendee (attendee_idx).lock_id = my_lock_id; 584 585 return; 586 587 end fill_attendee_slot; 588 589 /* This procedure makes sure that the saved attendee_idx is still valid. When opening, attendee_idx = 0, which means 590* there is no saved index. If it isn't, make it so, adding a new participant if necessary. */ 591 592 check_attendee_idx: 593 procedure (); 594 595 declare idx fixed bin; 596 597 /* If attendee_idx is nonzero, we must think the forum is locked and open. See if the user's slot has moved, which 598* could happen if the forum is garbage collected. If it hasn't moved, then we can just return, saving lots of work. */ 599 600 if forum_data_ptr ^= null & attendee_idx > 0 601 then if forum_control.attendee (attendee_idx).person_id = user_name then return; 602 603 /* See if there is a slot for the person. If there is, we will set attendee_idx. */ 604 605 attendee_idx = 0; 606 do idx = 1 to forum_control.no_attendees while (attendee_idx = 0); 607 608 if forum_control.attendee (idx).person_id = user_name then attendee_idx = idx; 609 end; 610 611 /* If attendee_idx is still not set, then the person isn't currently participating. Allocate her a slot. */ 612 613 if attendee_idx = 0 then do; 614 attendee_idx = forum_control.no_attendees + 1; 615 if attendee_idx > hbound (forum_control.attendee, 1) then call error (forum_error_table_$roster_full); 616 617 forum_control.no_attendees = attendee_idx; 618 619 forum_control.attendee (attendee_idx).person_id = user_name; 620 forum_control.attendee (attendee_idx).project_id = ""; 621 forum_control.attendee (attendee_idx).message_changed = "1"b; /* Well, sort of */ 622 end; 623 624 /* If the forum is open, then update this information in the forum_data node. */ 625 626 if forum_data_ptr ^= null () then forum_data.attendee_idx = attendee_idx; 627 forum_control.attendee (attendee_idx).deleted = "0"b; 628 return; 629 630 end check_attendee_idx; 631 632 lookup_attendee: 633 procedure (person_name); 634 635 declare person_name char (*), 636 idx fixed bin; 637 638 attendee_idx = 0; 639 do idx = 1 to forum_control.no_attendees while (attendee_idx = 0); 640 if forum_control.attendee (idx).person_id = person_name then attendee_idx = idx; 641 end; 642 643 if attendee_idx = 0 then 644 call error (forum_error_table_$no_such_user); 645 646 return; 647 end lookup_attendee; 648 649 /* This is an internal ring 3 interface. Call it to clean up after calling v1_forum_mgr_$get_ptrs. It accepts a 650* null input argument so don't hesitate to put it in your cleanup handlers. */ 651 652 v1_forum_mgr_$unlock: 653 entry (P_forum_control_ptr); 654 655 forum_control_ptr = P_forum_control_ptr; /* Copy parameter for internal procedure. */ 656 657 if ^static_initialized then return; /* If this isn't set, we have no business here. */ 658 659 call unlock_forum (); /* ZAP. We don't care about this forum anymore anyway. */ 660 661 return; 662 663 664 665 /* This procedure cleans up after lock_forum. It goes in cleanup handlers so it has its own handlers. */ 666 667 unlock_forum: 668 procedure (); 669 670 attendee_idx = 0; /* This being nonzero implies that the forum is locked. */ 671 672 if forum_control_ptr = null () then return; /* If we don't even have this, we can't be locked. */ 673 674 on any_other go to PUNT_UNLOCK; /* If anything goes wrong, we can't unlock, so give up. */ 675 676 call set_lock_$unlock (forum_control.forum_lock, (0)); 677 678 PUNT_UNLOCK: 679 return; 680 681 end unlock_forum; 682 683 /* This is an internal ring 3 interface. It should be called by anyone wishing to initiate a forum forum 684* given a dirname and entryname from the user ring. Pass the dirname and entryname by reference that came from 685* the calling ring so their lengths can be checked. If a nonzero code is returned, pass it back to the caller. 686* If proceedings_ptr is null, you have only "r" access to the ".control" segment and should not return any 687* information to the user ring about transactions. Otherwise, you have "rw" access to both segment. You should call 688* v1_forum_mgr_$terminate to terminate the pointers. It doesn't mind getting null pointers so put it in your 689* cleanup handler. If you don't take kindly to a null proceedings_ptr, terminate and then return the code 690* forum_error_table_$not_eligible. It locks the forum if asked nicely. */ 691 692 v1_forum_mgr_$initiate: 693 entry (P_forum_dir, P_forum_entry, P_lock_switch, P_forum_control_ptr, P_proceedings_ptr, P_status); 694 695 call initialize (INITIATE_EXIT); /* set up for "error" procedure and cleanup handler */ 696 697 call copy_pathname_args (); /* P_forum_dir and P_forum_entry */ 698 699 on cleanup call close_forum (); /* Just unlock and terminate. forum_data_ptr is null. */ 700 701 call initiate_forum ("1"b); /* This is what we are here for. */ 702 703 if P_lock_switch then call lock_forum (); /* If user asked for this, give it to him. */ 704 705 P_forum_control_ptr = forum_control_ptr; 706 P_proceedings_ptr = proceedings_ptr; 707 P_status = 0; /* If we got this far there is no error. */ 708 709 return; 710 711 INITIATE_EXIT: 712 call close_forum (); /* Just unlock and terminate. forum_data_ptr is null. */ 713 714 P_forum_control_ptr = null (); 715 P_proceedings_ptr = null (); 716 P_status = status; /* Tell user what went wrong. */ 717 718 return; 719 720 /* See that the split pathname passed to us is plausible. Ring zero will pass on the directory name later, so all 721* we have to do is make sure it isn't truncated. The entryname must end in the ".control" suffix. 722* The rest of the checking we leave until later. No global variables are referenced. */ 723 724 copy_pathname_args: 725 procedure (); 726 727 declare forum_name_len fixed bin; 728 729 if length (rtrim (P_forum_dir)) > maxlength (forum_dir) 730 then call error (error_table_$dirlong); 731 else forum_dir = P_forum_dir; 732 733 if length (rtrim (P_forum_entry)) > maxlength (forum_control_entry) 734 then call error (forum_error_table_$long_forum_name); 735 else forum_control_entry = P_forum_entry; 736 737 forum_name_len = length (rtrim (forum_control_entry)) - length (".control"); 738 if forum_name_len < 1 then call error (forum_error_table_$no_control_suffix); 739 740 if substr (forum_control_entry, forum_name_len + 1) ^= ".control" 741 then call error (forum_error_table_$no_control_suffix); 742 743 return; 744 745 end copy_pathname_args; 746 747 /* This routine is the arbiter of acceptable forum format. Since the pathname passed in could be a link, paranoia 748* is indicated. The name on the link needn't be on the forum, but the name on the forum must be on both 749* forum segments. If we only have "r" on the control segment, we don't bother to check the proceedings. */ 750 751 initiate_forum: 752 procedure (initiate_proceedings); 753 754 declare initiate_proceedings bit (1) aligned, 755 access_class bit (72) aligned, 756 modes fixed bin (5), 757 proceedings_entry char (32), 758 rings (3) fixed bin (3); 759 760 /* Handle unexpected errors. We don't have the forum locked, so anything can happen. */ 761 762 on any_other call error (forum_error_table_$unexpected_fault); 763 on cleanup call terminate_forum (); 764 on no_read_permission call error (error_table_$moderr); 765 on seg_fault_error call error (error_table_$seg_busted); 766 767 /* We have to initiate at the inner ring validation level, since the segments aren't accessible from the outer ring. */ 768 769 call hcs_$level_set (my_validation); 770 771 call hcs_$get_access_class (forum_dir, forum_control_entry, access_class, status); 772 if status ^= 0 then 773 if status = error_table_$noentry then call error (forum_error_table_$no_such_forum); 774 else call error (status); 775 776 if ^read_write_allowed_ (my_authorization, access_class) then do; 777 call hcs_$get_authorization (full_authorization, (""b)); 778 if ^aim_bits.privileges.ipc | 779 ^aim_bits.privileges.seg | 780 ^aim_bits.privileges.dir then 781 call error (error_table_$ai_restricted); 782 end; 783 784 call hcs_$initiate (forum_dir, forum_control_entry, "", 0, 0, forum_control_ptr, status); 785 if forum_control_ptr = null () then call error (status); 786 787 /* Verify the access mode and ring brackets, which must be correct on a valid forum. "r" access is OK. */ 788 789 call hcs_$fs_get_brackets (forum_control_ptr, modes, rings, status); 790 if status ^= 0 then call error (status); 791 792 if modes = RW_ACCESS_BIN then no_w_access = "0"b; 793 else if modes = R_ACCESS_BIN then no_w_access = "1"b; 794 else call error (forum_error_table_$not_a_forum); 795 796 if (rings (1) ^= my_validation) | (rings (2) ^= rings (3)) then call error (forum_error_table_$not_a_forum); 797 798 /* Now, refer to the segment. Faults may be taken here. The attendee count must be plausible. */ 799 800 if forum_control.no_attendees < 0 | forum_control.no_attendees > hbound (forum_control.attendee, 1) 801 then call error (forum_error_table_$not_a_forum); 802 803 /* The attendee count can be zero. So check something that can't be, to eliminate uninitialized segments. */ 804 805 if unspec (forum_control.chairman) = ""b then call error (forum_error_table_$not_a_forum); 806 807 /* We don't trust the pathname the user gave us. It might be a link. Get one we can trust. */ 808 809 call hcs_$fs_get_path_name (forum_control_ptr, dirname_buffer, dirname_len, forum_control_entry, status); 810 if status ^= 0 then call error (status); 811 812 /* If the primary name of the segment doesn't have the suffix, this can't be a forum. */ 813 814 forum_name_len = length (rtrim (forum_control_entry)) - length (".control"); 815 if forum_name_len < 1 | forum_name_len > 20 then call error (forum_error_table_$not_a_forum); 816 817 if substr (forum_control_entry, forum_name_len + 1) ^= ".control" 818 then call error (forum_error_table_$not_a_forum); 819 820 /* Leave forum_name_len set for open_forum. If we have "rw" access on the ".control" segment, then we also 821* initiate the ".proceedings" segment. */ 822 823 if modes = RW_ACCESS_BIN & initiate_proceedings then do; 824 proceedings_entry = substr (forum_control_entry, 1, forum_name_len) || ".proceedings"; 825 826 call hcs_$initiate (directory, proceedings_entry, "", 0, 0, proceedings_ptr, status); 827 if proceedings_ptr = null () 828 then if status = error_table_$noentry | status = error_table_$moderr 829 then call error (forum_error_table_$not_a_forum); 830 else call error (status); 831 832 call hcs_$fs_get_brackets (proceedings_ptr, modes, rings, status); 833 if status ^= 0 then call error (status); 834 835 if modes ^= RW_ACCESS_BIN & modes ^= R_ACCESS_BIN then call error (forum_error_table_$not_a_forum); 836 write_allowed = (modes = RW_ACCESS_BIN); 837 838 if (rings (1) ^= my_validation) | (rings (2) ^= rings (3)) 839 then call error (forum_error_table_$not_a_forum); 840 end; 841 842 call hcs_$level_set (caller_validation); /* Close barn door behind. */ 843 844 return; 845 846 end initiate_forum; 847 848 /* This is an internal ring 3 interface to clean up after v1_forum_mgr_$initiate. It nulls its arguments if they 849* aren't already, so put it in your cleanup handlers. */ 850 851 v1_forum_mgr_$terminate: 852 entry (P_forum_control_ptr, P_proceedings_ptr); 853 854 forum_control_ptr = P_forum_control_ptr; /* Copy parameters for internal procedures. */ 855 proceedings_ptr = P_proceedings_ptr; 856 857 if ^static_initialized then return; /* The static variable "my_validation" must be set. */ 858 859 caller_validation = hcs_$level_get (); /* We will need this to revert after terminating. */ 860 861 P_forum_control_ptr = null (); /* Make sure caller does not terminate these twice. */ 862 P_proceedings_ptr = null (); 863 864 call unlock_forum (); /* In case we locked it before, unlock it now. */ 865 866 call terminate_forum (); /* This is what we are here for, so do it. */ 867 868 return; 869 870 871 872 /* This procedure cleans up after initiate forum. It must affect the ring 3 address space. It is robust. */ 873 874 terminate_forum: 875 procedure (); 876 877 declare p ptr; 878 879 on cleanup call hcs_$level_set (caller_validation); 880 881 call hcs_$level_set (my_validation); /* Here we go..... */ 882 883 on any_other go to PUNT_TERMINATE; /* Handle any unexpected faults. */ 884 885 p = proceedings_ptr; /* Make SURE pointers aren't terminated twice. */ 886 proceedings_ptr = null (); 887 if p ^= null () then call hcs_$terminate_noname (p, (0)); 888 889 p = forum_control_ptr; /* Make SURE pointers aren't terminated twice. */ 890 forum_control_ptr = null (); 891 if p ^= null () then call hcs_$terminate_noname (p, (0)); 892 893 PUNT_TERMINATE: 894 call hcs_$level_set (caller_validation); 895 896 return; 897 898 end terminate_forum; 899 900 /* This interface allows the attending switch to be turned off, and the notify and removed switches to be frobbed, 901* by either the chairman or the user on his own entry. */ 902 903 v1_forum_mgr_$priv_set_switch: 904 entry (P_forum_dir, P_forum_entry, P_user_name, P_switch_name, P_switch_setting, P_status); 905 906 privileged = "1"b; 907 goto SS_COMMON; 908 909 v1_forum_mgr_$set_switch: 910 entry (P_forum_dir, P_forum_entry, P_user_name, P_switch_name, P_switch_setting, P_status); 911 912 privileged = "0"b; 913 914 SS_COMMON: 915 call initialize (SET_SWITCH_EXIT); /* set up for "error" procedure and cleanup handler */ 916 917 call copy_pathname_args (); /* P_forum_dir and P_forum_entry */ 918 919 on cleanup call terminate_forum (); 920 921 call initiate_forum ("1"b); /* Get pointers to forum */ 922 if ^privileged & no_w_access then call error (forum_error_table_$not_eligible); 923 924 call set_switch (); /* Do the work */ 925 926 call terminate_forum (); /* Clean up shop and go home */ 927 928 P_status = status; /* If we got this far there was no error */ 929 930 return; 931 932 SET_SWITCH_EXIT: 933 call terminate_forum (); /* Clean up the mess, we couldn't do it. */ 934 935 P_status = status; /* Tell the use what went wrong. */ 936 937 return; 938 939 /* This consolidates the interface to turn the various per-user flags on and off */ 940 941 v1_forum_mgr_$set_switch_idx: 942 entry (P_forum_idx, P_user_name, P_switch_name, P_switch_setting, P_status); 943 944 privileged = "0"b; 945 call initialize (SET_SWITCH_IDX_EXIT); /* set up for "error" procedure and cleanup handler */ 946 947 call lookup_forum_idx (); /* Find forum_data node from P_forum_idx */ 948 949 call set_switch (); /* Do the work. */ 950 951 P_status = status; /* If we get this far there was no error. */ 952 953 return; 954 955 SET_SWITCH_IDX_EXIT: 956 P_status = status; /* Tell the user what went wrong. */ 957 958 return; 959 960 /* Do all the work of setting a switch. We have to copy and check all the arguments from the user ring, and 961* decide whether to permit the operation. Only the chairman can mess with other people's switches. */ 962 963 set_switch: 964 procedure (); 965 966 declare person_name char (20); 967 968 if length (rtrim (P_user_name)) > maxlength (person_name) 969 then call error (error_table_$bad_arg); 970 else person_name = P_user_name; 971 972 if person_name = "" then person_name = user_name; 973 else if person_name ^= user_name 974 then if anon_switch | user_name ^= forum_control.chairman.person_id 975 then call error (forum_error_table_$chairman_only); 976 else forum_data_ptr = null (); 977 978 if length (rtrim (P_switch_name)) > maxlength (switch_name) 979 then call error (forum_error_table_$invalid_switch_name); 980 else switch_name = P_switch_name; 981 982 switch_setting = P_switch_setting; 983 984 on cleanup begin; 985 call unlock_forum (); 986 call hcs_$level_set (caller_validation); 987 end; 988 989 if privileged & no_w_access then do; 990 call hcs_$level_set (my_validation); 991 call force_access (); 992 end; 993 994 call lock_forum (); 995 996 call lookup_attendee (person_name); 997 998 if switch_name = "participating" | switch_name = "part" then 999 call set_the_switch (forum_control.attendee (attendee_idx).removed, ^switch_setting); 1000 else if switch_name = "notify" | switch_name = "nt" then 1001 call set_the_switch (forum_control.attendee (attendee_idx).notify, switch_setting); 1002 else if switch_name = "message_seen" then 1003 call set_the_switch (forum_control.attendee (attendee_idx).message_changed, ^switch_setting); 1004 else if switch_name = "access_changed" then 1005 call set_the_switch (forum_control.attendee (attendee_idx).acl_change_pending, switch_setting); 1006 1007 /* rest of switches may only be changed by the chairman */ 1008 else if switch_name = "deleted" then do; 1009 if ^privileged & (anon_switch | user_name ^= forum_control.chairman.person_id) then 1010 call error (forum_error_table_$chairman_only); 1011 if user_name = person_name then call error (forum_error_table_$you_twit); /* chairman can't delete himself */ 1012 call set_the_switch (forum_control.attendee (attendee_idx).deleted, switch_setting); 1013 end; 1014 else if switch_name = "adjourned" | switch_name = "adj" then do; 1015 if ^privileged & (anon_switch | user_name ^= forum_control.chairman.person_id) then 1016 call error (forum_error_table_$chairman_only); 1017 call set_the_switch (forum_control.flags.adjourned, switch_setting); 1018 end; 1019 else if switch_name = "meeting_eligibility_messages" | switch_name = "mtg_emsg" then do; 1020 if ^privileged then do; 1021 if anon_switch | user_name ^= forum_control.chairman.person_id then call error (forum_error_table_$chairman_only); 1022 if ^switch_setting then do; 1023 if ^forum_data_$chairman_override & forum_data_$print_eligibility_messages then 1024 call error (forum_error_table_$cant_stop_msg_site); 1025 if forum_control.am_init & forum_control.am_print_acl_msg then 1026 call error (forum_error_table_$cant_stop_msg_admin); 1027 end; 1028 call set_the_switch (forum_control.cm_print_acl_msg, switch_setting); 1029 if ^forum_control.cm_init & status = forum_error_table_$switch_not_changed then status = 0; 1030 forum_control.cm_init = "1"b; 1031 end; 1032 else do; 1033 call set_the_switch (forum_control.am_print_acl_msg, switch_setting); 1034 if ^forum_control.am_init & status = forum_error_table_$switch_not_changed then status = 0; 1035 forum_control.am_init = "1"b; 1036 end; 1037 end; 1038 else call error (forum_error_table_$invalid_switch_name); 1039 1040 call unlock_forum (); 1041 1042 if privileged & no_w_access then do; 1043 call delete_access (); 1044 call hcs_$level_set (caller_validation); 1045 end; 1046 1047 return; 1048 1049 set_the_switch: 1050 proc (switch, value); 1051 1052 declare switch bit (1) unaligned; 1053 declare value bit (1) aligned; 1054 1055 if switch = value then status = forum_error_table_$switch_not_changed; 1056 else switch = value; 1057 1058 return; 1059 end set_the_switch; 1060 1061 end set_switch; 1062 1063 v1_forum_mgr_$set_global_switch: 1064 entry (P_switch_name, P_switch_setting, P_status); 1065 1066 call initialize (SET_GLOBAL_EXIT); 1067 1068 if length (rtrim (P_switch_name)) > maxlength (switch_name) 1069 then call error (forum_error_table_$invalid_switch_name); 1070 else switch_name = P_switch_name; 1071 1072 switch_setting = P_switch_setting; 1073 1074 on no_write_permission call error (error_table_$moderr); 1075 1076 if switch_name = "print_eligibility_messages" | switch_name = "pemsg" then 1077 forum_data_$print_eligibility_messages = switch_setting; 1078 else if switch_name = "chairman_set_eligibility_msg" | switch_name = "cm_set_emsg" then 1079 forum_data_$chairman_override = switch_setting; 1080 else call error (forum_error_table_$invalid_switch_name); 1081 1082 P_status = 0; 1083 return; 1084 1085 SET_GLOBAL_EXIT: 1086 P_status = status; 1087 return; 1088 1089 /* If you want to be told when a new transaction arrives in a forum you are attending, you gotta tell the guy where 1090* to send the wakeup. */ 1091 v1_forum_mgr_$set_event_channel: 1092 entry (P_forum_dir, P_forum_entry, P_event_channel, P_status); 1093 1094 call initialize (SET_EVENT_CHANNEL_EXIT); 1095 1096 call copy_pathname_args (); 1097 1098 on cleanup begin; 1099 call unlock_forum (); 1100 call terminate_forum (); 1101 end; 1102 1103 call initiate_forum ("0"b); 1104 if no_w_access then call error (forum_error_table_$not_eligible); 1105 1106 call lookup_attendee (user_name); 1107 1108 call lock_forum (); 1109 1110 forum_control.attendee (attendee_idx).public_wakeup_chan = P_event_channel; 1111 forum_control.attendee (attendee_idx).process_id = my_process_id; 1112 1113 call unlock_forum (); 1114 call terminate_forum (); 1115 P_status = 0; 1116 return; 1117 1118 SET_EVENT_CHANNEL_EXIT: 1119 call unlock_forum (); 1120 call terminate_forum (); 1121 P_status = status; 1122 return; 1123 1124 v1_forum_mgr_$set_event_channel_idx: 1125 entry (P_forum_idx, P_event_channel, P_status); 1126 1127 call initialize (SET_EVENT_CHANNEL_IDX_EXIT); /* set up for "error" procedure and cleanup handler */ 1128 1129 call lookup_forum_idx (); /* Find forum_data node from P_forum_idx */ 1130 1131 on cleanup call unlock_forum (); 1132 1133 call lock_forum (); 1134 1135 forum_control.attendee (attendee_idx).public_wakeup_chan = P_event_channel; 1136 forum_control.attendee (attendee_idx).process_id = my_process_id; 1137 1138 call unlock_forum (); 1139 1140 P_status = 0; 1141 1142 return; 1143 1144 SET_EVENT_CHANNEL_IDX_EXIT: 1145 call unlock_forum (); 1146 1147 P_status = status; 1148 1149 return; 1150 1151 /* Note: This interface does not lock the forum so occasional rare lossages can occur. It can return the code 1152* forum_error_table_$not_eligible to indicate that the caller or specified access name lacks access to open the 1153* forum. Partial info is returned in this case. */ 1154 1155 v1_forum_mgr_$forum_info: 1156 entry (P_forum_dir, P_forum_entry, P_access_name, P_access_time, P_forum_info_ptr, P_status); 1157 1158 call initialize (FORUM_INFO_EXIT); /* set up for "error" procedure and cleanup handler */ 1159 1160 call copy_pathname_args (); /* P_forum_dir and P_forum_entry */ 1161 1162 on cleanup call terminate_forum (); 1163 on no_read_permission call error (error_table_$moderr); 1164 1165 call initiate_forum ("0"b); 1166 1167 call get_forum_info (no_w_access); 1168 1169 if no_w_access then status = forum_error_table_$not_eligible; 1170 else status = 0; 1171 1172 call terminate_forum (); 1173 1174 forum_info = fmi; 1175 1176 P_status = status; 1177 1178 return; 1179 1180 FORUM_INFO_EXIT: 1181 call terminate_forum (); 1182 1183 P_status = status; 1184 1185 return; 1186 1187 /* This interface locks the database, since it must be openable to use it. We assume that response time is not as 1188* critical for the "current" forum (after all, you went to the trouble of opening it) as it is for the 1189* dirname, entryname entrypoint which is used by the forum_list command. */ 1190 1191 v1_forum_mgr_$forum_info_idx: 1192 entry (P_forum_idx, P_access_name, P_access_time, P_forum_info_ptr, P_status); 1193 1194 call initialize (MEETING_INFO_IDX_EXIT); /* set up for "error" procedure and cleanup handler */ 1195 1196 call lookup_forum_idx (); /* Find forum_data node from P_forum_idx */ 1197 1198 on cleanup call unlock_forum (); 1199 1200 call lock_forum (); 1201 1202 call fill_attendee_slot (); 1203 1204 call get_forum_info ("0"b); 1205 1206 call unlock_forum (); 1207 1208 forum_info = fmi; 1209 P_status = 0; 1210 1211 return; 1212 1213 MEETING_INFO_IDX_EXIT: 1214 call unlock_forum (); 1215 1216 P_status = status; 1217 1218 return; 1219 1220 get_forum_info: 1221 procedure (no_w_access); 1222 1223 declare no_w_access bit (1) aligned, 1224 access_name char (32), 1225 access_time fixed bin (71), 1226 idx fixed bin, 1227 person_name char (20); 1228 1229 if length (rtrim (P_access_name)) > maxlength (access_name) 1230 then call error (error_table_$bad_arg); 1231 else access_name = P_access_name; 1232 1233 access_time = P_access_time; 1234 1235 forum_info_ptr = P_forum_info_ptr; 1236 if forum_info_ptr = null () then call error (error_table_$null_info_ptr); 1237 1238 if forum_info.version ^= forum_info_version_1 then call error (error_table_$unimplemented_version); 1239 unspec (fmi) = ""b; 1240 fmi.version = forum_info_version_1; 1241 1242 fmi.chairman.username = forum_control.chairman.person_id; 1243 fmi.chairman.project = forum_control.chairman.project_id; 1244 fmi.chairman.pad = ""; 1245 1246 fmi.attendee_count = forum_control.no_attendees; 1247 1248 do idx = 1 to forum_control.no_attendees; 1249 1250 if forum_control.attendee (idx).removed then fmi.removal_count = fmi.removal_count + 1; 1251 end; 1252 1253 if forum_data_ptr ^= null () then fmi.forum_uid = forum_data.forum_control_uid; 1254 else do; 1255 call hcs_$get_uid_seg (forum_control_ptr, fmi.forum_uid, status); 1256 if status ^= 0 then call error (status); 1257 end; 1258 1259 if access_name = "" then do; 1260 person_name = user_name; 1261 fmi.eligible = ^no_w_access; 1262 end; 1263 else do; 1264 person_name = before (access_name, "."); 1265 call check_eligible (access_name); 1266 attendee_idx = 0; 1267 end; 1268 1269 if person_name = "*" then attendee_idx = 0; 1270 else do idx = 1 to forum_control.no_attendees while (attendee_idx = 0); 1271 if forum_control.attendee (idx).person_id = person_name then attendee_idx = idx; 1272 end; 1273 1274 if attendee_idx = 0 then return; 1275 1276 if ^no_w_access then forum_control.attendee (attendee_idx).lock_id = my_lock_id; 1277 fmi.removed = forum_control.attendee (attendee_idx).removed | forum_control.attendee (attendee_idx).deleted; 1278 fmi.last_time_attended = forum_control.attendee (attendee_idx).last_time_attended; 1279 fmi.last_seen_trans_idx = get_highest_seen (forum_control.attendee (attendee_idx).highest_trans_seen, 1280 user_name); 1281 1282 if ^fmi.removed then do; 1283 fmi.notify = forum_control.attendee (attendee_idx).notify; 1284 fmi.attending = forum_control.attendee (attendee_idx).attending; 1285 end; 1286 fmi.adjourned = forum_control.flags.adjourned; 1287 1288 if no_w_access then return; 1289 1290 fmi.read_only = ^forum_control.attendee (attendee_idx).write_allowed; 1291 do idx = forum_control.no_transactions by -1 to 1 1292 while (forum_control.transactions (idx).time > access_time); 1293 end; 1294 1295 fmi.transaction_count = idx; 1296 fmi.deletion_count = forum_control.no_deleted; 1297 1298 if person_name ^= "*" & person_name ^= "" 1299 then do idx = min (fmi.transaction_count, forum_control.attendee (attendee_idx).highest_trans_seen) + 1 1300 to forum_control.no_transactions; 1301 1302 if forum_control.transactions (idx).person_id ^= person_name 1303 & ^forum_control.transactions (idx).deleted 1304 then fmi.changes_count = fmi.changes_count + 1; 1305 end; 1306 1307 idx = forum_control.no_transactions; 1308 if idx < 1 then return; 1309 1310 do while (forum_control.transactions (idx).deleted | forum_control.transactions (idx).time > access_time); 1311 1312 idx = idx - 1; 1313 if idx < 1 then return; 1314 end; 1315 1316 fmi.last_time_changed = forum_control.transactions (idx).time; 1317 1318 return; 1319 1320 end get_forum_info; 1321 1322 /* This procedure checks if a person other than the caller is eligible to participate in a forum. Since we 1323* require as a condition for a valid forum that the proceedings must have "rw" access if the control 1324* segment does, and we have already verified that the rings are correct on the control segment, we will 1325* punt checking to see that access_name has "rw" on both segments. In fact, we may not even know that the 1326* second segment exists. We make no attempt to use a saved pathname since we have a perfectly good pointer 1327* and we are paranoid about renamings and the like. We initiated it before it was locked, and only after 1328* locking can we be sure that the name or ACL won't change. */ 1329 1330 check_eligible: 1331 procedure (access_name); 1332 1333 declare access_name char (32), 1334 entryname char (32), 1335 modes fixed bin (5); 1336 1337 on cleanup call hcs_$level_set (caller_validation); 1338 1339 call hcs_$level_set (my_validation); 1340 1341 call hcs_$fs_get_path_name (forum_control_ptr, dirname_buffer, dirname_len, entryname, status); 1342 if status ^= 0 then call error (status); 1343 1344 call hcs_$get_user_effmode (directory, entryname, access_name, my_validation, modes, status); 1345 if status ^= 0 then call error (status); 1346 1347 if modes = RW_ACCESS_BIN then fmi.eligible = "1"b; 1348 1349 call hcs_$level_set (caller_validation); 1350 1351 return; 1352 1353 end check_eligible; 1354 1355 v1_forum_mgr_$set_last_seen_idx: 1356 entry (P_forum_idx, P_last_seen_trans_idx, P_force_switch, P_status); 1357 1358 call initialize (SET_LAST_SEEN_IDX_EXIT); 1359 1360 call lookup_forum_idx (); 1361 1362 last_seen_trans_idx = P_last_seen_trans_idx; 1363 force_switch = P_force_switch; 1364 1365 on cleanup call unlock_forum (); 1366 1367 call lock_forum (); 1368 1369 if last_seen_trans_idx < 0 | last_seen_trans_idx > forum_control.no_transactions 1370 then call error (forum_error_table_$invalid_trans_idx); 1371 1372 call fill_attendee_slot (); 1373 1374 if ^force_switch 1375 then last_seen_trans_idx = 1376 max (last_seen_trans_idx, forum_control.attendee (attendee_idx).highest_trans_seen); 1377 1378 forum_control.attendee (attendee_idx).highest_trans_seen = last_seen_trans_idx; 1379 1380 call unlock_forum (); 1381 1382 P_status = 0; 1383 1384 return; 1385 1386 SET_LAST_SEEN_IDX_EXIT: 1387 call unlock_forum (); 1388 1389 P_status = status; 1390 1391 return; 1392 1393 v1_forum_mgr_$list_users: 1394 entry (P_forum_dir, P_forum_entry, P_area_ptr, P_user_list_ptr, P_status); 1395 1396 call initialize (LIST_USERS_EXIT); 1397 1398 call copy_pathname_args (); 1399 1400 on cleanup call terminate_forum (); 1401 1402 call initiate_forum ("0"b); 1403 if no_w_access then call error (forum_error_table_$not_eligible); 1404 1405 call get_user_list (); 1406 1407 call terminate_forum (); 1408 1409 P_status = 0; 1410 return; 1411 1412 LIST_USERS_EXIT: 1413 call terminate_forum (); 1414 1415 P_status = status; 1416 return; 1417 1418 v1_forum_mgr_$list_users_idx: 1419 entry (P_forum_idx, P_area_ptr, P_user_list_ptr, P_status); 1420 1421 call initialize (LIST_USERS_IDX_EXIT); 1422 1423 call lookup_forum_idx (); 1424 1425 on cleanup call unlock_forum (); 1426 1427 call lock_forum (); 1428 1429 call fill_attendee_slot (); 1430 1431 call get_user_list (); 1432 1433 call unlock_forum (); 1434 1435 P_status = 0; 1436 return; 1437 1438 LIST_USERS_IDX_EXIT: 1439 call unlock_forum (); 1440 P_status = status; 1441 return; 1442 1443 get_user_list: 1444 procedure; 1445 1446 declare (idx, jdx) fixed bin; 1447 1448 user_list_no_attendees = forum_control.no_attendees; 1449 allocate user_list in (P_area); 1450 1451 unspec (user_list) = ""b; 1452 user_list.version = user_list_version_2; 1453 user_list.chairman.person_id = forum_control.chairman.person_id; 1454 user_list.chairman.project_id = forum_control.chairman.project_id; 1455 user_list.transaction_count = forum_control.no_transactions; 1456 1457 jdx = 0; 1458 do idx = 1 to forum_control.no_attendees; 1459 if ^forum_control.attendee (idx).deleted then do; 1460 jdx = jdx + 1; 1461 if forum_control.attendee (idx).attending then do; /* check if he's really there */ 1462 call set_lock_$lock ((forum_control.attendee (idx).lock_id), 0, status); 1463 if status ^= error_table_$lock_wait_time_exceeded & status ^= error_table_$locked_by_this_process then do; 1464 forum_control.attendee (idx).attending = "0"b; 1465 forum_control.attendee (idx).lock_id = "0"b; 1466 end; 1467 end; 1468 1469 user_list.attendees (jdx).person_id = forum_control.attendee (idx).person_id; 1470 user_list.attendees (jdx).project_id = forum_control.attendee (idx).project_id; 1471 user_list.attendees (jdx).attending = forum_control.attendee (idx).attending; 1472 user_list.attendees (jdx).notify = forum_control.attendee (idx).notify; 1473 user_list.attendees (jdx).removed = forum_control.attendee (idx).removed; 1474 user_list.attendees (jdx).read_only = ^forum_control.attendee (idx).write_allowed; 1475 user_list.attendees (jdx).last_time_attended = 1476 forum_control.attendee (idx).last_time_attended; 1477 user_list.attendees (jdx).highest_trans_seen = 1478 get_highest_seen (forum_control.attendee (idx).highest_trans_seen, forum_control.attendee (idx).person_id); 1479 end; 1480 end; 1481 1482 user_list.no_attendees = jdx; 1483 P_user_list_ptr = user_list_ptr; 1484 return; 1485 1486 end get_user_list; 1487 1488 1489 get_highest_seen: 1490 procedure (start, person) returns (fixed bin); 1491 1492 declare start fixed bin, 1493 person char (22), 1494 highest fixed bin, 1495 done bit (1) aligned; 1496 1497 done = "0"b; 1498 highest = start; 1499 do while ((highest + 1) <= forum_control.no_transactions & ^done); 1500 if (forum_control.transactions (highest + 1).deleted | forum_control.transactions (highest + 1).person_id = 1501 person) then highest = highest + 1; 1502 else done = "1"b; 1503 end; 1504 1505 done = "0"b; 1506 do while (^done & highest ^= 0); 1507 if forum_control.transactions (highest).deleted 1508 then highest = highest - 1; 1509 else done = "1"b; 1510 end; 1511 1512 return (highest); 1513 end get_highest_seen; 1514 1515 v1_forum_mgr_$change_chairman_idx: 1516 entry (P_forum_idx, P_chairman, P_status); 1517 1518 call initialize (CHANGE_CHAIRMAN_IDX_EXIT); 1519 1520 call lookup_forum_idx (); 1521 1522 on cleanup call unlock_forum (); 1523 1524 call lock_forum (); 1525 1526 privileged = "0"b; 1527 call change_the_chairman (); 1528 1529 call unlock_forum (); 1530 1531 P_status = 0; 1532 return; 1533 1534 CHANGE_CHAIRMAN_IDX_EXIT: 1535 call unlock_forum (); 1536 P_status = status; 1537 return; 1538 1539 v1_forum_mgr_$priv_change_chairman: 1540 entry (P_forum_dir, P_forum_entry, P_chairman, P_status); 1541 1542 privileged = "1"b; 1543 goto CC_COMMON; 1544 1545 v1_forum_mgr_$change_chairman: 1546 entry (P_forum_dir, P_forum_entry, P_chairman, P_status); 1547 1548 privileged = "0"b; 1549 1550 CC_COMMON: 1551 call initialize (CHANGE_CHAIRMAN_EXIT); 1552 1553 call copy_pathname_args (); 1554 1555 on cleanup call terminate_forum (); 1556 1557 call initiate_forum ("0"b); 1558 1559 call change_the_chairman (); 1560 1561 call terminate_forum (); 1562 1563 P_status = 0; 1564 return; 1565 1566 CHANGE_CHAIRMAN_EXIT: 1567 call terminate_forum (); 1568 P_status = status; 1569 return; 1570 1571 change_the_chairman: 1572 procedure (); 1573 1574 declare chairman_name char (32), 1575 chairman_personid char (22), 1576 chairman_projectid char (10), 1577 entryname char (32); 1578 1579 if ^privileged then 1580 if anon_switch | user_name ^= forum_control.chairman.person_id then 1581 call error (forum_error_table_$chairman_only); 1582 1583 if length (rtrim (P_chairman)) > maxlength (chairman_name) then 1584 call error (error_table_$bad_arg); 1585 else chairman_name = P_chairman; 1586 1587 if index (chairman_name, ".") = 0 | 1588 index (chairman_name, ".") > maxlength (chairman_personid) + 1 then 1589 call error (error_table_$bad_arg); 1590 1591 chairman_personid = before (chairman_name, "."); 1592 chairman_projectid = rtrim (after (chairman_name, ".")); 1593 1594 call lookup_attendee (chairman_personid); 1595 1596 on cleanup call hcs_$level_set (caller_validation); 1597 call hcs_$level_set (my_validation); 1598 1599 if privileged & no_w_access then call force_access (); 1600 1601 call hcs_$fs_get_path_name (forum_control_ptr, dirname_buffer, dirname_len, entryname, status); 1602 if status ^= 0 then call error (status); 1603 1604 segment_acl.access_name = chairman_personid || ".*.*"; 1605 segment_acl.modes = RW_ACCESS; 1606 segment_acl.xmodes = "0"b; 1607 segment_acl.status = 0; 1608 1609 call hcs_$add_acl_entries (directory, entryname, addr (segment_acl), 1, status); 1610 if status ^= 0 then call error (status); 1611 1612 entryname = substr (entryname, 1, length (rtrim (entryname)) - length ("control")) || "proceedings"; 1613 1614 call hcs_$add_acl_entries (directory, entryname, addr (segment_acl), 1, status); 1615 if status ^= 0 then call error (status); 1616 1617 forum_control.chairman.person_id = chairman_personid; 1618 forum_control.chairman.project_id = chairman_projectid; 1619 1620 if privileged & no_w_access then call delete_access (); 1621 1622 call hcs_$level_set (caller_validation); 1623 1624 return; 1625 end change_the_chairman; 1626 1627 /* Most entrypoints call this procedure to set up for error handling. The caller's validation level is obtained, 1628* static "constants" are initialized, the emergency bailout at 30,000 feet label that the "error" procedure transfers 1629* to is set, and all automatic variables used in cleanup handlers are initialized. */ 1630 1631 initialize: 1632 procedure (P_egress); 1633 1634 declare P_egress label variable, 1635 anon fixed bin; 1636 1637 egress = P_egress; 1638 1639 caller_validation = hcs_$level_get (); 1640 1641 if ^static_initialized then do; 1642 my_authorization = get_authorization_ (); 1643 my_validation = get_ring_ (); 1644 my_process_id = get_process_id_ (); 1645 call get_lock_id_ (my_lock_id); 1646 call user_info_$login_data (user_name, project, (""), anon, 0, 0, 0, ("")); 1647 if anon = 1 then do; 1648 anon_switch = "1"b; 1649 user_name = "*" || user_name; 1650 end; 1651 1652 static_initialized = "1"b; 1653 end; 1654 1655 forum_control_ptr = null (); 1656 proceedings_ptr = null (); 1657 forum_data_ptr = null (); 1658 attendee_idx = 0; 1659 1660 return; 1661 1662 end initialize; 1663 1664 1665 1666 /* This is where we bail out at 30,000 feet by passing in an error code and knowing that this procedure never 1667* returns. The label variable "egress" is set in "initialize". */ 1668 1669 error: 1670 procedure (P_status); 1671 1672 declare P_status fixed bin (35) parameter; 1673 1674 status = P_status; 1675 1676 go to egress; 1677 1678 end error; 1679 1680 force_access: 1681 procedure (); 1682 1683 segment_acl.access_name = get_group_id_$tag_star (); 1684 segment_acl.modes = RW_ACCESS; 1685 segment_acl.xmodes = ""b; 1686 call hcs_$add_acl_entries (directory, forum_control_entry, addr (segment_acl), 1, status); 1687 if status ^= 0 then call error (status); 1688 1689 return; 1690 end force_access; 1691 1692 delete_access: 1693 procedure (); 1694 1695 delete_acl.access_name = get_group_id_$tag_star (); 1696 call hcs_$delete_acl_entries (directory, forum_control_entry, addr (delete_acl), 1, (0)); 1697 1698 end delete_access; 1699 1700 end v1_forum_mgr_$open_forum; SOURCE FILES USED IN THIS COMPILATION. LINE NUMBER DATE MODIFIED NAME PATHNAME 0 08/16/86 1354.8 v1_forum_mgr_.pl1 >spec>install>1128>v1_forum_mgr_.pl1 237 1 10/31/84 1115.4 v1_forum_structures.incl.pl1 >ldd>include>v1_forum_structures.incl.pl1 239 2 08/16/86 1354.4 forum_info.incl.pl1 >spec>install>1128>forum_info.incl.pl1 241 3 10/31/84 1115.4 forum_user_list.incl.pl1 >ldd>include>forum_user_list.incl.pl1 243 4 09/07/83 1610.6 aim_template.incl.pl1 >ldd>include>aim_template.incl.pl1 245 5 04/11/85 1452.6 access_mode_values.incl.pl1 >ldd>include>access_mode_values.incl.pl1 NAMES DECLARED IN THIS COMPILATION. IDENTIFIER OFFSET LOC STORAGE CLASS DATA TYPE ATTRIBUTES AND REFERENCES (* indicates a set context) NAMES DECLARED BY DECLARE STATEMENT. P_access_name parameter char unaligned dcl 83 ref 1155 1191 1229 1231 P_access_time parameter fixed bin(71,0) dcl 83 ref 1155 1191 1233 P_area based area(1024) dcl 159 ref 1449 P_area_ptr parameter pointer dcl 83 ref 1393 1418 1449 P_attendee_idx parameter fixed bin(17,0) dcl 83 set ref 455 470* 481* P_chairman parameter char unaligned dcl 83 ref 1515 1539 1545 1583 1585 P_egress parameter label variable dcl 1634 ref 1631 1637 P_event_channel parameter fixed bin(71,0) dcl 83 ref 1091 1110 1124 1135 P_force_switch parameter bit(1) dcl 83 ref 1355 1363 P_forum_control_ptr parameter pointer dcl 83 set ref 455 468* 479* 652 655 692 705* 714* 851 854 861* P_forum_dir parameter char unaligned dcl 83 ref 80 692 729 731 903 909 1091 1155 1393 1539 1545 P_forum_entry parameter char unaligned dcl 83 ref 80 692 733 735 903 909 1091 1155 1393 1539 1545 P_forum_idx parameter fixed bin(17,0) dcl 83 set ref 80 276* 284* 369 382* 455 500 941 1124 1191 1355 1418 1515 P_forum_info_ptr parameter pointer dcl 83 ref 1155 1191 1235 P_last_seen_trans_idx parameter fixed bin(17,0) dcl 83 ref 1355 1362 P_lock_switch parameter bit(1) dcl 83 ref 692 703 P_proceedings_ptr parameter pointer dcl 83 set ref 455 469* 480* 692 706* 715* 851 855 862* P_status parameter fixed bin(35,0) dcl 83 in procedure "v1_forum_mgr_$open_forum" set ref 80 277* 285* 369 386* 393* 455 472* 482* 692 707* 716* 903 909 928* 935* 941 951* 955* 1063 1082* 1085* 1091 1115* 1121* 1124 1140* 1147* 1155 1176* 1183* 1191 1209* 1216* 1355 1382* 1389* 1393 1409* 1415* 1418 1435* 1440* 1515 1531* 1536* 1539 1545 1563* 1568* P_status parameter fixed bin(35,0) dcl 1672 in procedure "error" ref 1669 1674 P_switch_name parameter char unaligned dcl 83 ref 903 909 941 978 980 1063 1068 1070 P_switch_setting parameter bit(1) dcl 83 ref 903 909 941 982 1063 1072 P_user_list_ptr parameter pointer dcl 83 set ref 1393 1418 1483* P_user_name parameter char unaligned dcl 83 ref 903 909 941 968 970 P_write_allowed parameter bit(1) dcl 83 set ref 455 471* RW_ACCESS constant bit(3) initial unaligned dcl 5-11 ref 1605 1684 RW_ACCESS_BIN constant fixed bin(5,0) initial dcl 5-36 ref 792 823 835 836 1347 R_ACCESS_BIN constant fixed bin(5,0) initial dcl 5-36 ref 793 835 access_class 000100 automatic bit(72) dcl 754 set ref 771* 776* access_name parameter char(32) unaligned dcl 1333 in procedure "check_eligible" set ref 1330 1344* access_name 000311 automatic char(32) level 2 in structure "segment_acl" dcl 129 in procedure "v1_forum_mgr_$open_forum" set ref 1604* 1683* access_name 000520 automatic char(32) unaligned dcl 1223 in procedure "get_forum_info" set ref 1229 1231* 1259 1264 1265* access_name 000324 automatic char(32) level 2 in structure "delete_acl" dcl 135 in procedure "v1_forum_mgr_$open_forum" set ref 1695* access_time 000530 automatic fixed bin(71,0) dcl 1223 set ref 1233* 1291 1310 acl_change_pending 26(15) based bit(1) array level 3 packed unaligned dcl 1-6 set ref 1004* addr builtin function dcl 105 ref 778 778 778 826 1344 1609 1609 1609 1614 1614 1614 1686 1686 1686 1696 1696 1696 adjourned 2(08) based bit(1) level 3 in structure "forum_control" packed unaligned dcl 1-6 in procedure "v1_forum_mgr_$open_forum" set ref 266 1017* 1286 adjourned 25(08) 000336 automatic bit(1) level 3 in structure "fmi" packed unaligned dcl 141 in procedure "v1_forum_mgr_$open_forum" set ref 1286* after builtin function dcl 105 ref 1592 aim_bits based structure level 1 dcl 163 aim_template based structure level 1 dcl 4-12 am_init 2(04) based bit(1) level 3 packed unaligned dcl 1-6 set ref 1025 1034 1035* am_print_acl_msg 2(05) based bit(1) level 3 packed unaligned dcl 1-6 set ref 1025 1033* anon 000676 automatic fixed bin(17,0) dcl 1634 set ref 1646* 1647 anon_switch 000013 internal static bit(1) initial dcl 149 set ref 266 973 1009 1015 1021 1579 1648* any_other 000000 stack reference condition dcl 108 ref 352 544 674 762 883 area 000000 stack reference condition dcl 108 ref 353 attendee 16 based structure array level 2 dcl 1-6 set ref 615 800 attendee_count 12 000336 automatic fixed bin(17,0) level 2 dcl 141 set ref 1246* attendee_idx 000122 automatic fixed bin(17,0) dcl 111 in procedure "v1_forum_mgr_$open_forum" set ref 271 272 312* 432 432 434 435 436 437 470 471 518* 574 579 580 581 582 583 600 600 605* 606 608* 613 614* 615 617 619 620 621 626 627 638* 639 640* 643 670* 998 1000 1002 1004 1012 1110 1111 1135 1136 1266* 1269* 1270 1271* 1274 1276 1277 1277 1278 1279 1283 1284 1290 1298 1374 1378 1658* attendee_idx 20 based fixed bin(17,0) level 2 in structure "forum_data" dcl 165 in procedure "v1_forum_mgr_$open_forum" set ref 312 518 626* attendees 14 based structure array level 2 dcl 3-6 attending 24(09) based bit(1) array level 3 in structure "user_list" packed unaligned dcl 3-6 in procedure "v1_forum_mgr_$open_forum" set ref 1471* attending 26(09) based bit(1) array level 3 in structure "forum_control" packed unaligned dcl 1-6 in procedure "v1_forum_mgr_$open_forum" set ref 437* 580* 1284 1461 1464* 1471 attending 25(04) 000336 automatic bit(1) level 3 in structure "fmi" packed unaligned dcl 141 in procedure "v1_forum_mgr_$open_forum" set ref 1284* before builtin function dcl 105 ref 1264 1591 caller_validation 000123 automatic fixed bin(3,0) dcl 111 set ref 354* 360* 842* 859* 879* 893* 986* 1044* 1337* 1349* 1596* 1622* 1639* chairman 2 000336 automatic structure level 2 in structure "fmi" packed unaligned dcl 141 in procedure "v1_forum_mgr_$open_forum" chairman 5 based structure level 2 in structure "forum_control" packed unaligned dcl 1-6 in procedure "v1_forum_mgr_$open_forum" set ref 805 chairman 1 based structure level 2 in structure "user_list" dcl 3-6 in procedure "v1_forum_mgr_$open_forum" chairman_name 000100 automatic char(32) unaligned dcl 1574 set ref 1583 1585* 1587 1587 1591 1592 chairman_personid 000110 automatic char(22) unaligned dcl 1574 set ref 1587 1591* 1594* 1604 1617 chairman_projectid 000116 automatic char(10) unaligned dcl 1574 set ref 1592* 1618 changes_count 24 000336 automatic fixed bin(17,0) level 2 dcl 141 set ref 1302* 1302 cleanup 000100 stack reference condition dcl 108 ref 256 298 354 376 462 498 526 699 763 879 919 984 1098 1131 1162 1198 1337 1365 1400 1425 1522 1555 1596 clock builtin function dcl 105 ref 435 574 cm_init 2(06) based bit(1) level 3 packed unaligned dcl 1-6 set ref 1029 1030* cm_print_acl_msg 2(07) based bit(1) level 3 packed unaligned dcl 1-6 set ref 1028* count 000100 automatic fixed bin(17,0) dcl 541 set ref 550* delete_acl 000324 automatic structure level 1 dcl 135 set ref 1696 1696 deleted 26(10) based bit(1) array level 3 in structure "forum_control" packed unaligned dcl 1-6 in procedure "v1_forum_mgr_$open_forum" set ref 627* 1012* 1277 1459 deleted 21476(09) based bit(1) array level 3 in structure "forum_control" packed unaligned dcl 1-6 in procedure "v1_forum_mgr_$open_forum" ref 1302 1310 1500 1507 deletion_count 15 000336 automatic fixed bin(17,0) level 2 dcl 141 set ref 1296* dir 1(19) based bit(1) level 3 packed unaligned dcl 163 ref 778 directory based char unaligned dcl 159 set ref 826* 1344* 1609* 1614* 1686* 1696* dirname_buffer 000124 automatic char(168) unaligned dcl 111 set ref 809* 826 1341* 1344 1601* 1609 1614 1686 1696 dirname_len 000176 automatic fixed bin(17,0) dcl 111 set ref 809* 826 826 1341* 1344 1344 1601* 1609 1609 1614 1614 1686 1686 1696 1696 done 000667 automatic bit(1) dcl 1492 set ref 1497* 1499 1502* 1505* 1506 1509* egress 000200 automatic label variable dcl 111 set ref 1637* 1676 eligible 25 000336 automatic bit(1) level 3 packed unaligned dcl 141 set ref 1261* 1347* entryname 000100 automatic char(32) unaligned dcl 1333 in procedure "check_eligible" set ref 1341* 1344* entryname 000121 automatic char(32) unaligned dcl 1574 in procedure "change_the_chairman" set ref 1601* 1609* 1612* 1612 1612 1614* error_table_$ai_restricted 000100 external static fixed bin(35,0) dcl 176 set ref 778* error_table_$bad_arg 000102 external static fixed bin(35,0) dcl 176 set ref 968* 1229* 1583* 1587* error_table_$dirlong 000104 external static fixed bin(35,0) dcl 176 set ref 729* error_table_$invalid_lock_reset 000106 external static fixed bin(35,0) dcl 176 ref 557 error_table_$lock_wait_time_exceeded 000110 external static fixed bin(35,0) dcl 176 ref 554 1463 error_table_$locked_by_this_process 000112 external static fixed bin(35,0) dcl 176 ref 1463 error_table_$moderr 000114 external static fixed bin(35,0) dcl 176 set ref 545* 546* 764* 827 1074* 1163* error_table_$noalloc 000116 external static fixed bin(35,0) dcl 176 set ref 353* error_table_$noentry 000120 external static fixed bin(35,0) dcl 176 ref 772 827 error_table_$null_info_ptr 000122 external static fixed bin(35,0) dcl 176 set ref 1236* error_table_$seg_busted 000124 external static fixed bin(35,0) dcl 176 set ref 547* 765* error_table_$unimplemented_version 000126 external static fixed bin(35,0) dcl 176 set ref 1238* first_forum_data_ptr 000010 internal static pointer initial dcl 145 set ref 303 329 338* 416 416* 506 flags 2 based structure level 2 in structure "forum_control" packed unaligned dcl 1-6 in procedure "v1_forum_mgr_$open_forum" flags 25 000336 automatic structure level 2 in structure "fmi" packed unaligned dcl 141 in procedure "v1_forum_mgr_$open_forum" fmi 000336 automatic structure level 1 dcl 141 set ref 1174 1208 1239* force_switch 000204 automatic bit(1) dcl 111 set ref 1363* 1374 forum_control based structure level 1 dcl 1-6 forum_control_entry 000206 automatic char(32) unaligned dcl 111 set ref 322 733 735* 737 740 771* 784* 809* 814 817 824 1686* 1696* forum_control_ptr 12 based pointer level 2 in structure "forum_data" dcl 165 in procedure "v1_forum_mgr_$open_forum" set ref 310 323* 510* 516 forum_control_ptr 000364 automatic pointer dcl 1-3 in procedure "v1_forum_mgr_$open_forum" set ref 266 266 271 272 300* 310* 323 432 432 434 435 436 437 468 471 516* 552 574 579 580 581 582 583 600 606 608 614 615 617 619 620 621 627 639 640 655* 672 676 705 784* 785 789* 800 800 800 805 809* 854* 889 890* 973 998 1000 1002 1004 1009 1012 1015 1017 1021 1025 1025 1028 1029 1030 1033 1034 1035 1110 1111 1135 1136 1242 1243 1246 1248 1250 1255* 1270 1271 1276 1277 1277 1278 1279 1283 1284 1286 1290 1291 1291 1296 1298 1298 1302 1302 1307 1310 1310 1316 1341* 1369 1374 1378 1448 1453 1454 1455 1458 1459 1461 1462 1464 1465 1469 1470 1471 1472 1473 1474 1475 1477 1477 1499 1500 1500 1507 1579 1601* 1617 1618 1655* forum_control_uid 000100 automatic bit(36) dcl 296 in procedure "open_forum" set ref 300* 305 325 forum_control_uid 16 based bit(36) level 2 in structure "forum_data" dcl 165 in procedure "v1_forum_mgr_$open_forum" set ref 305 325* 513 1253 forum_control_uid 000100 automatic bit(36) dcl 495 in procedure "lookup_forum_idx" set ref 510* 513 forum_data based structure level 1 dcl 165 set ref 358 424 forum_data_$chairman_override 000132 external static bit(1) dcl 208 set ref 1023 1078* forum_data_$print_eligibility_messages 000130 external static bit(1) dcl 208 set ref 1023 1076* forum_data_ptr 000220 automatic pointer dcl 111 set ref 276 298* 303* 303* 305 309 309 310 311 312* 316 322 323 324 325 326 328 329 331 331 334 334 335 335 338 358* 404 406 406 407 416 416 418 418 418 421 421 421 424 498* 506* 506* 508 510 513 516 517 518* 522 600 626 626 976* 1253 1253 1657* forum_dir 000222 automatic char(168) unaligned dcl 111 set ref 729 731* 771* 784* forum_error_table_$cant_stop_msg_admin 000034 external static fixed bin(35,0) dcl 176 set ref 1025* forum_error_table_$cant_stop_msg_site 000036 external static fixed bin(35,0) dcl 176 set ref 1023* forum_error_table_$chairman_only 000040 external static fixed bin(35,0) dcl 176 set ref 973* 1009* 1015* 1021* 1579* forum_error_table_$forum_deleted 000052 external static fixed bin(35,0) dcl 176 set ref 513* forum_error_table_$invalid_forum_idx 000042 external static fixed bin(35,0) dcl 176 set ref 502* 528* forum_error_table_$invalid_switch_name 000044 external static fixed bin(35,0) dcl 176 set ref 978* 1038* 1068* 1080* forum_error_table_$invalid_trans_idx 000046 external static fixed bin(35,0) dcl 176 set ref 1369* forum_error_table_$long_forum_name 000050 external static fixed bin(35,0) dcl 176 set ref 733* forum_error_table_$meeting_adjourned 000054 external static fixed bin(35,0) dcl 176 set ref 266* forum_error_table_$no_control_suffix 000056 external static fixed bin(35,0) dcl 176 set ref 738* 740* forum_error_table_$no_such_forum 000060 external static fixed bin(35,0) dcl 176 set ref 772* forum_error_table_$no_such_user 000062 external static fixed bin(35,0) dcl 176 set ref 643* forum_error_table_$not_a_forum 000064 external static fixed bin(35,0) dcl 176 set ref 794* 796* 800* 805* 815* 817* 827* 835* 838* forum_error_table_$not_eligible 000066 external static fixed bin(35,0) dcl 176 set ref 260* 922* 1104* 1169 1403* forum_error_table_$roster_full 000070 external static fixed bin(35,0) dcl 176 set ref 615* forum_error_table_$switch_not_changed 000072 external static fixed bin(35,0) dcl 176 ref 1029 1034 1055 forum_error_table_$unexpected_fault 000074 external static fixed bin(35,0) dcl 176 set ref 352* 544* 762* forum_error_table_$you_twit 000076 external static fixed bin(35,0) dcl 176 set ref 1011* forum_idx 17 based fixed bin(17,0) level 2 in structure "forum_data" dcl 165 in procedure "v1_forum_mgr_$open_forum" set ref 276 331* 334* 334 508 forum_idx 000101 automatic fixed bin(17,0) dcl 495 in procedure "lookup_forum_idx" set ref 500* 502 508 forum_info based structure level 1 dcl 2-14 set ref 1174* 1208* forum_info_ptr 000370 automatic pointer dcl 2-12 set ref 1174 1208 1235* 1236 1238 forum_info_version_1 constant fixed bin(17,0) initial dcl 2-40 ref 1238 1240 forum_lock based bit(36) level 2 dcl 1-6 set ref 552* 676* forum_name_len 000216 automatic fixed bin(17,0) dcl 111 in procedure "v1_forum_mgr_$open_forum" set ref 322 814* 815 815 817 824 forum_name_len 000510 automatic fixed bin(17,0) dcl 727 in procedure "copy_pathname_args" set ref 737* 738 740 forum_uid 1 000336 automatic bit(36) level 2 dcl 141 set ref 1253* 1255* full_authorization 000016 internal static bit(72) initial dcl 149 set ref 777* 778 778 778 get_authorization_ 000134 constant entry external dcl 212 ref 1642 get_group_id_$tag_star 000136 constant entry external dcl 212 ref 1683 1695 get_lock_id_ 000140 constant entry external dcl 212 ref 1645 get_process_id_ 000142 constant entry external dcl 212 ref 1644 get_ring_ 000144 constant entry external dcl 212 ref 1643 get_system_free_area_ 000146 constant entry external dcl 212 ref 358 hbound builtin function dcl 105 ref 615 800 hcs_$add_acl_entries 000150 constant entry external dcl 212 ref 1609 1614 1686 hcs_$delete_acl_entries 000152 constant entry external dcl 212 ref 1696 hcs_$fs_get_brackets 000154 constant entry external dcl 212 ref 789 832 hcs_$fs_get_path_name 000156 constant entry external dcl 212 ref 809 1341 1601 hcs_$get_access_class 000160 constant entry external dcl 212 ref 771 hcs_$get_authorization 000162 constant entry external dcl 212 ref 777 hcs_$get_uid_seg 000164 constant entry external dcl 212 ref 300 510 1255 hcs_$get_user_effmode 000166 constant entry external dcl 212 ref 1344 hcs_$initiate 000170 constant entry external dcl 212 ref 784 826 hcs_$level_get 000172 constant entry external dcl 212 ref 859 1639 hcs_$level_set 000174 constant entry external dcl 212 ref 354 356 360 769 842 879 881 893 986 990 1044 1337 1339 1349 1596 1597 1622 hcs_$terminate_noname 000176 constant entry external dcl 212 ref 887 891 highest 000666 automatic fixed bin(17,0) dcl 1492 set ref 1498* 1499 1500 1500 1500* 1500 1506 1507 1507* 1507 1512 highest_trans_seen 33 based fixed bin(17,0) array level 3 in structure "forum_control" dcl 1-6 in procedure "v1_forum_mgr_$open_forum" set ref 1279* 1298 1374 1378* 1477* highest_trans_seen 30 based fixed bin(17,0) array level 3 in structure "user_list" dcl 3-6 in procedure "v1_forum_mgr_$open_forum" set ref 1477* idx 000456 automatic fixed bin(17,0) dcl 595 in procedure "check_attendee_idx" set ref 606* 608 608* idx 000100 automatic fixed bin(17,0) dcl 635 in procedure "lookup_attendee" set ref 639* 640 640* idx 000532 automatic fixed bin(17,0) dcl 1223 in procedure "get_forum_info" set ref 1248* 1250* 1270* 1271 1271* 1291* 1291* 1295 1298* 1302 1302* 1307* 1308 1310 1310 1312* 1312 1313 1316 idx 000634 automatic fixed bin(17,0) dcl 1446 in procedure "get_user_list" set ref 1458* 1459 1461 1462 1464 1465 1469 1470 1471 1472 1473 1474 1475 1477 1477* index builtin function dcl 105 ref 1587 1587 initiate_proceedings parameter bit(1) dcl 754 ref 751 823 ipc 1(18) based bit(1) level 3 packed unaligned dcl 163 ref 778 jdx 000635 automatic fixed bin(17,0) dcl 1446 set ref 1457* 1460* 1460 1469 1470 1471 1472 1473 1474 1475 1477 1482 last_seen_trans_idx 000205 automatic fixed bin(17,0) dcl 111 in procedure "v1_forum_mgr_$open_forum" set ref 1362* 1369 1369 1374* 1374 1378 last_seen_trans_idx 16 000336 automatic fixed bin(17,0) level 2 in structure "fmi" dcl 141 in procedure "v1_forum_mgr_$open_forum" set ref 1279* last_time_attended 26 based fixed bin(71,0) array level 3 in structure "user_list" dcl 3-6 in procedure "v1_forum_mgr_$open_forum" set ref 1475* last_time_attended 30 based fixed bin(71,0) array level 3 in structure "forum_control" dcl 1-6 in procedure "v1_forum_mgr_$open_forum" set ref 435* 574* 1278 1475 last_time_attended 22 000336 automatic fixed bin(71,0) level 2 in structure "fmi" dcl 141 in procedure "v1_forum_mgr_$open_forum" set ref 1278* last_time_changed 20 000336 automatic fixed bin(71,0) level 2 dcl 141 set ref 1316* length builtin function dcl 105 ref 729 733 737 737 814 814 968 978 1068 1229 1583 1612 1612 lock_id 32 based bit(36) array level 3 dcl 1-6 set ref 583* 1276* 1462 1465* max builtin function dcl 105 ref 1374 maxlength builtin function dcl 105 ref 729 733 968 978 1068 1229 1583 1587 message_changed 26(16) based bit(1) array level 3 packed unaligned dcl 1-6 set ref 621* 1002* min builtin function dcl 105 ref 1298 modes 10 000311 automatic bit(36) level 2 in structure "segment_acl" dcl 129 in procedure "v1_forum_mgr_$open_forum" set ref 1605* 1684* modes 000102 automatic fixed bin(5,0) dcl 754 in procedure "initiate_forum" set ref 789* 792 793 823 832* 835 835 836 modes 000110 automatic fixed bin(5,0) dcl 1333 in procedure "check_eligible" set ref 1344* 1347 my_authorization 000014 internal static bit(72) initial dcl 149 set ref 776* 1642* my_lock_id 000021 internal static bit(36) initial dcl 149 set ref 583 1276 1645* my_process_id 000020 internal static bit(36) initial dcl 149 set ref 432 582 1111 1136 1644* my_validation 000022 internal static fixed bin(3,0) initial dcl 149 set ref 356* 769* 796 838 881* 990* 1339* 1344* 1597* 1643* name 4 based char(24) level 2 packed unaligned dcl 165 set ref 322* next_ptr based pointer level 2 dcl 165 set ref 316 329* 331 334 335 416 418* 418 421 421 522 no_attendees 12 based fixed bin(17,0) level 2 in structure "user_list" dcl 3-6 in procedure "v1_forum_mgr_$open_forum" set ref 1449* 1451 1482* no_attendees 3(18) based fixed bin(17,0) level 2 in structure "forum_control" packed unaligned dcl 1-6 in procedure "v1_forum_mgr_$open_forum" set ref 606 614 617* 639 800 800 1246 1248 1270 1448 1458 no_deleted 4(18) based fixed bin(17,0) level 2 packed unaligned dcl 1-6 ref 1296 no_read_permission 000106 stack reference condition dcl 108 ref 545 764 1163 no_transactions 2(18) based fixed bin(17,0) level 2 packed unaligned dcl 1-6 ref 1291 1298 1307 1369 1455 1499 no_w_access parameter bit(1) dcl 1223 in procedure "get_forum_info" ref 1220 1261 1276 1288 no_w_access 000274 automatic bit(1) dcl 111 in procedure "v1_forum_mgr_$open_forum" set ref 260 792* 793* 922 989 1042 1104 1167* 1169 1403 1599 1620 no_write_permission 000114 stack reference condition dcl 108 ref 546 1074 not_locked 000101 automatic bit(1) dcl 541 set ref 549* 550 553* 554* notify 26(12) based bit(1) array level 3 in structure "forum_control" packed unaligned dcl 1-6 in procedure "v1_forum_mgr_$open_forum" set ref 1000* 1283 1472 notify 25(03) 000336 automatic bit(1) level 3 in structure "fmi" packed unaligned dcl 141 in procedure "v1_forum_mgr_$open_forum" set ref 1283* notify 24(12) based bit(1) array level 3 in structure "user_list" packed unaligned dcl 3-6 in procedure "v1_forum_mgr_$open_forum" set ref 1472* null builtin function dcl 105 ref 298 303 328 331 404 418 421 432 479 480 498 506 600 626 672 714 715 785 827 861 862 886 887 890 891 976 1236 1253 1655 1656 1657 one_transaction based structure level 1 dcl 1-45 opening_count 21 based fixed bin(17,0) level 2 dcl 165 set ref 309* 309 326* 406* 406 407 p 000100 automatic pointer dcl 877 set ref 885* 887 887* 889* 891 891* pad 11(09) 000336 automatic char(3) level 3 packed unaligned dcl 141 set ref 1244* person parameter char(22) unaligned dcl 1492 ref 1489 1500 person_id 5 based char(22) level 3 in structure "forum_control" packed unaligned dcl 1-6 in procedure "v1_forum_mgr_$open_forum" set ref 266 973 1009 1015 1021 1242 1453 1579 1617* person_id 14 based char(22) array level 3 in structure "user_list" packed unaligned dcl 3-6 in procedure "v1_forum_mgr_$open_forum" set ref 1469* person_id 21466 based char(22) array level 3 in structure "forum_control" packed unaligned dcl 1-6 in procedure "v1_forum_mgr_$open_forum" ref 1302 1500 person_id 16 based char(22) array level 3 in structure "forum_control" packed unaligned dcl 1-6 in procedure "v1_forum_mgr_$open_forum" set ref 600 608 619* 640 1271 1469 1477* person_id 1 based char(22) level 3 in structure "user_list" packed unaligned dcl 3-6 in procedure "v1_forum_mgr_$open_forum" set ref 1453* person_name 000533 automatic char(20) unaligned dcl 1223 in procedure "get_forum_info" set ref 1260* 1264* 1269 1271 1298 1298 1302 person_name 000100 automatic char(20) unaligned dcl 966 in procedure "set_switch" set ref 968 970* 972 972* 973 996* 1011 person_name parameter char unaligned dcl 635 in procedure "lookup_attendee" ref 632 640 prev_ptr 2 based pointer level 2 dcl 165 set ref 328* 335* 418 418 421* 421 privileged 000275 automatic bit(1) dcl 111 set ref 906* 912* 922 944* 989 1009 1015 1020 1042 1526* 1542* 1548* 1579 1599 1620 privileges 1(18) based structure level 2 packed unaligned dcl 163 proceedings_entry 000103 automatic char(32) unaligned dcl 754 set ref 824* 826* proceedings_ptr 000366 automatic pointer dcl 1-3 in procedure "v1_forum_mgr_$open_forum" set ref 311* 324 469 517* 706 826* 827 832* 855* 885 886* 1656* proceedings_ptr 14 based pointer level 2 in structure "forum_data" dcl 165 in procedure "v1_forum_mgr_$open_forum" set ref 311 324* 517 process_id 34 based bit(36) array level 3 dcl 1-6 set ref 432 582* 1111* 1136* project 7 000336 automatic char(9) level 3 in structure "fmi" packed unaligned dcl 141 in procedure "v1_forum_mgr_$open_forum" set ref 1243* project 000023 internal static char(9) initial unaligned dcl 149 in procedure "v1_forum_mgr_$open_forum" set ref 434 579 1646* project_id 21(18) based char(11) array level 3 in structure "user_list" packed unaligned dcl 3-6 in procedure "v1_forum_mgr_$open_forum" set ref 1470* project_id 12(18) based char(9) level 3 in structure "forum_control" packed unaligned dcl 1-6 in procedure "v1_forum_mgr_$open_forum" set ref 1243 1454 1618* project_id 23(18) based char(11) array level 3 in structure "forum_control" packed unaligned dcl 1-6 in procedure "v1_forum_mgr_$open_forum" set ref 434* 579* 620* 1470 project_id 6(18) based char(9) level 3 in structure "user_list" packed unaligned dcl 3-6 in procedure "v1_forum_mgr_$open_forum" set ref 1454* public_wakeup_chan 36 based fixed bin(71,0) array level 3 dcl 1-6 set ref 271* 436* 1110* 1135* read_only 25(07) 000336 automatic bit(1) level 3 in structure "fmi" packed unaligned dcl 141 in procedure "v1_forum_mgr_$open_forum" set ref 1290* read_only 24(14) based bit(1) array level 3 in structure "user_list" packed unaligned dcl 3-6 in procedure "v1_forum_mgr_$open_forum" set ref 1474* read_write_allowed_ 000200 constant entry external dcl 212 ref 776 removal_count 13 000336 automatic fixed bin(17,0) level 2 dcl 141 set ref 1250* 1250 removed 24(13) based bit(1) array level 3 in structure "user_list" packed unaligned dcl 3-6 in procedure "v1_forum_mgr_$open_forum" set ref 1473* removed 26(13) based bit(1) array level 3 in structure "forum_control" packed unaligned dcl 1-6 in procedure "v1_forum_mgr_$open_forum" set ref 581* 998* 1250 1277 1473 removed 25(02) 000336 automatic bit(1) level 3 in structure "fmi" packed unaligned dcl 141 in procedure "v1_forum_mgr_$open_forum" set ref 1277* 1282 rings 000113 automatic fixed bin(3,0) array dcl 754 set ref 789* 796 796 796 832* 838 838 838 rtrim builtin function dcl 105 ref 729 733 737 814 968 978 1068 1229 1583 1592 1612 seg 1(20) based bit(1) level 3 packed unaligned dcl 163 ref 778 seg_fault_error 000000 stack reference condition dcl 108 ref 547 765 segment_acl 000311 automatic structure level 1 dcl 129 set ref 1609 1609 1614 1614 1686 1686 set_lock_$lock 000202 constant entry external dcl 212 ref 552 1462 set_lock_$unlock 000204 constant entry external dcl 212 ref 676 start parameter fixed bin(17,0) dcl 1492 ref 1489 1498 static_initialized 000012 internal static bit(1) initial dcl 149 set ref 657 857 1641 1652* status 12 000311 automatic fixed bin(35,0) level 2 in structure "segment_acl" dcl 129 in procedure "v1_forum_mgr_$open_forum" set ref 1607* status 000310 automatic fixed bin(35,0) dcl 111 in procedure "v1_forum_mgr_$open_forum" set ref 285 300* 301 301* 393 482 510* 511 511* 552* 553 554 557 557 557* 716 771* 772 772 774* 784* 785* 789* 790 790* 809* 810 810* 826* 827 827 830* 832* 833 833* 928 935 951 955 1029 1029* 1034 1034* 1055* 1085 1121 1147 1169* 1170* 1176 1183 1216 1255* 1256 1256* 1341* 1342 1342* 1344* 1345 1345* 1389 1415 1440 1462* 1463 1463 1536 1568 1601* 1602 1602* 1609* 1610 1610* 1614* 1615 1615* 1674* 1686* 1687 1687* substr builtin function dcl 105 ref 322 740 817 824 1612 switch parameter bit(1) unaligned dcl 1052 set ref 1049 1055 1056* switch_name 000276 automatic char(32) unaligned dcl 111 set ref 978 980* 998 998 1000 1000 1002 1004 1008 1014 1014 1019 1019 1068 1070* 1076 1076 1078 1078 switch_setting 000306 automatic bit(1) dcl 111 set ref 982* 998 1000* 1002 1004* 1012* 1017* 1022 1028* 1033* 1072* 1076 1078 system_area based area(1024) dcl 159 ref 358 time 21524 based fixed bin(71,0) array level 3 dcl 1-6 ref 1291 1310 1316 transaction_count 11 based fixed bin(17,0) level 2 in structure "user_list" dcl 3-6 in procedure "v1_forum_mgr_$open_forum" set ref 1455* transaction_count 14 000336 automatic fixed bin(17,0) level 2 in structure "fmi" dcl 141 in procedure "v1_forum_mgr_$open_forum" set ref 1295* 1298 transactions 21466 based structure array level 2 dcl 1-6 unspec builtin function dcl 105 set ref 805 1239* 1451* user_info_$login_data 000206 constant entry external dcl 212 ref 1646 user_list based structure level 1 dcl 3-6 set ref 1449 1451* user_list_no_attendees 000372 automatic fixed bin(17,0) dcl 3-3 set ref 1448* 1449 1449 user_list_ptr 000374 automatic pointer dcl 3-3 set ref 1449* 1451 1452 1453 1454 1455 1469 1470 1471 1472 1473 1474 1475 1477 1482 1483 user_list_version_2 constant fixed bin(17,0) initial dcl 3-26 ref 1452 user_name 000026 internal static char(22) initial unaligned dcl 149 set ref 266 600 608 619 972 973 973 1009 1011 1015 1021 1106* 1260 1279* 1579 1646* 1649* 1649 username 2 000336 automatic char(20) level 3 packed unaligned dcl 141 set ref 1242* value parameter bit(1) dcl 1053 ref 1049 1055 1056 version based fixed bin(17,0) level 2 in structure "user_list" dcl 3-6 in procedure "v1_forum_mgr_$open_forum" set ref 1452* version 000336 automatic fixed bin(17,0) level 2 in structure "fmi" dcl 141 in procedure "v1_forum_mgr_$open_forum" set ref 1240* version based fixed bin(17,0) level 2 in structure "forum_info" dcl 2-14 in procedure "v1_forum_mgr_$open_forum" set ref 1238 write_allowed 26(14) based bit(1) array level 3 in structure "forum_control" packed unaligned dcl 1-6 in procedure "v1_forum_mgr_$open_forum" set ref 272* 471 1290 1474 write_allowed 000307 automatic bit(1) dcl 111 in procedure "v1_forum_mgr_$open_forum" set ref 272 836* xmodes 11 000311 automatic bit(36) level 2 dcl 129 set ref 1606* 1685* NAMES DECLARED BY DECLARE STATEMENT AND NEVER REFERENCED. A_ACCESS internal static bit(3) initial unaligned dcl 5-11 A_ACCESS_BIN internal static fixed bin(5,0) initial dcl 5-36 DIR_ACCESS_MODE_NAMES internal static char(4) initial array unaligned dcl 5-33 E_ACCESS internal static bit(3) initial unaligned dcl 5-11 E_ACCESS_BIN internal static fixed bin(5,0) initial dcl 5-36 M_ACCESS internal static bit(3) initial unaligned dcl 5-11 M_ACCESS_BIN internal static fixed bin(5,0) initial dcl 5-36 N_ACCESS internal static bit(3) initial unaligned dcl 5-11 N_ACCESS_BIN internal static fixed bin(5,0) initial dcl 5-36 REW_ACCESS internal static bit(3) initial unaligned dcl 5-11 REW_ACCESS_BIN internal static fixed bin(5,0) initial dcl 5-36 RE_ACCESS internal static bit(3) initial unaligned dcl 5-11 RE_ACCESS_BIN internal static fixed bin(5,0) initial dcl 5-36 R_ACCESS internal static bit(3) initial unaligned dcl 5-11 SA_ACCESS internal static bit(3) initial unaligned dcl 5-11 SA_ACCESS_BIN internal static fixed bin(5,0) initial dcl 5-36 SEG_ACCESS_MODE_NAMES internal static char(4) initial array unaligned dcl 5-30 SMA_ACCESS internal static bit(3) initial unaligned dcl 5-11 SMA_ACCESS_BIN internal static fixed bin(5,0) initial dcl 5-36 SM_ACCESS internal static bit(3) initial unaligned dcl 5-11 SM_ACCESS_BIN internal static fixed bin(5,0) initial dcl 5-36 S_ACCESS internal static bit(3) initial unaligned dcl 5-11 S_ACCESS_BIN internal static fixed bin(5,0) initial dcl 5-36 W_ACCESS internal static bit(3) initial unaligned dcl 5-11 W_ACCESS_BIN internal static fixed bin(5,0) initial dcl 5-36 forum_info_version_2 internal static fixed bin(17,0) initial dcl 2-40 forum_message automatic structure level 1 dcl 1-63 ipc_message based fixed bin(71,0) dcl 1-60 msg_ptr internal static pointer dcl 1-60 NAMES DECLARED BY EXPLICIT CONTEXT. CC_COMMON 003020 constant label dcl 1550 ref 1543 CHANGE_CHAIRMAN_EXIT 003072 constant label dcl 1566 ref 1550 1550 CHANGE_CHAIRMAN_IDX_EXIT 002720 constant label dcl 1534 ref 1518 1518 CLOSE_EXIT 000430 constant label dcl 390 ref 372 372 FORUM_INFO_EXIT 002110 constant label dcl 1180 ref 1158 1158 GET_PTRS_EXIT 000541 constant label dcl 476 ref 458 458 INITIATE_EXIT 000716 constant label dcl 711 ref 695 695 LIST_USERS_EXIT 002513 constant label dcl 1412 ref 1396 1396 LIST_USERS_IDX_EXIT 002614 constant label dcl 1438 ref 1421 1421 MEETING_INFO_IDX_EXIT 002225 constant label dcl 1213 ref 1194 1194 OPEN_EXIT 000333 constant label dcl 281 ref 252 252 PUNT_TERMINATE 005743 constant label dcl 893 ref 883 PUNT_UNLOCK 004435 constant label dcl 678 ref 674 SET_EVENT_CHANNEL_EXIT 001616 constant label dcl 1118 ref 1094 1094 SET_EVENT_CHANNEL_IDX_EXIT 001727 constant label dcl 1144 ref 1127 1127 SET_GLOBAL_EXIT 001442 constant label dcl 1085 ref 1066 1066 SET_LAST_SEEN_IDX_EXIT 002367 constant label dcl 1386 ref 1358 1358 SET_SWITCH_EXIT 001176 constant label dcl 932 ref 914 914 SET_SWITCH_IDX_EXIT 001260 constant label dcl 955 ref 945 945 SS_COMMON 001107 constant label dcl 914 ref 907 allocate_forum_data 003263 constant entry internal dcl 349 ref 320 change_the_chairman 010200 constant entry internal dcl 1571 ref 1527 1559 check_attendee_idx 004150 constant entry internal dcl 592 ref 380 570 check_eligible 007466 constant entry internal dcl 1330 ref 1265 close_forum 003422 constant entry internal dcl 401 ref 256 281 384 699 711 copy_pathname_args 004436 constant entry internal dcl 724 ref 254 697 917 1096 1160 1398 1553 delete_access 011221 constant entry internal dcl 1692 ref 1043 1620 error 011107 constant entry internal dcl 1669 ref 260 266 301 352 353 502 511 513 528 544 545 546 547 557 615 643 729 733 738 740 762 764 765 772 774 778 785 790 794 796 800 805 810 815 817 827 830 833 835 838 922 968 973 978 1009 1011 1015 1021 1023 1025 1038 1068 1074 1080 1104 1163 1229 1236 1238 1256 1342 1345 1369 1403 1579 1583 1587 1602 1610 1615 1687 fill_attendee_slot 004120 constant entry internal dcl 567 ref 270 466 1202 1372 1429 force_access 011123 constant entry internal dcl 1680 ref 991 1599 get_forum_info 006736 constant entry internal dcl 1220 ref 1167 1204 get_highest_seen 010106 constant entry internal dcl 1489 ref 1279 1477 get_user_list 007665 constant entry internal dcl 1443 ref 1405 1431 initialize 010726 constant entry internal dcl 1631 ref 252 372 458 695 914 945 1066 1094 1127 1158 1194 1358 1396 1421 1518 1550 initiate_forum 004565 constant entry internal dcl 751 ref 258 701 921 1103 1165 1402 1557 lock_forum 003713 constant entry internal dcl 538 ref 262 378 464 703 994 1108 1133 1200 1367 1427 1524 lookup_attendee 004301 constant entry internal dcl 632 ref 996 1106 1594 lookup_forum_idx 003541 constant entry internal dcl 492 ref 374 460 947 1129 1196 1360 1423 1520 open_forum 003102 constant entry internal dcl 293 ref 264 set_switch 005755 constant entry internal dcl 963 ref 924 949 set_the_switch 006713 constant entry internal dcl 1049 ref 998 1000 1002 1004 1012 1017 1028 1033 terminate_forum 005615 constant entry internal dcl 874 ref 307 442 763 866 919 926 932 1100 1114 1120 1162 1172 1180 1400 1407 1412 1555 1561 1566 unlock_forum 004370 constant entry internal dcl 667 ref 274 376 390 409 440 462 476 659 864 985 1040 1099 1113 1118 1131 1138 1144 1198 1206 1213 1365 1380 1386 1425 1433 1438 1522 1529 1534 v1_forum_mgr_$change_chairman 002770 constant entry external dcl 1545 v1_forum_mgr_$change_chairman_idx 002627 constant entry external dcl 1515 v1_forum_mgr_$close_forum 000347 constant entry external dcl 369 v1_forum_mgr_$forum_info 001744 constant entry external dcl 1155 v1_forum_mgr_$forum_info_idx 002124 constant entry external dcl 1191 v1_forum_mgr_$get_ptrs 000445 constant entry external dcl 455 v1_forum_mgr_$initiate 000611 constant entry external dcl 692 v1_forum_mgr_$list_users 002403 constant entry external dcl 1393 v1_forum_mgr_$list_users_idx 002527 constant entry external dcl 1418 v1_forum_mgr_$open_forum 000156 constant entry external dcl 80 v1_forum_mgr_$priv_change_chairman 002734 constant entry external dcl 1539 v1_forum_mgr_$priv_set_switch 001007 constant entry external dcl 903 v1_forum_mgr_$set_event_channel 001452 constant entry external dcl 1091 v1_forum_mgr_$set_event_channel_idx 001635 constant entry external dcl 1124 v1_forum_mgr_$set_global_switch 001267 constant entry external dcl 1063 v1_forum_mgr_$set_last_seen_idx 002241 constant entry external dcl 1355 v1_forum_mgr_$set_switch 001051 constant entry external dcl 909 v1_forum_mgr_$set_switch_idx 001212 constant entry external dcl 941 v1_forum_mgr_$terminate 000734 constant entry external dcl 851 v1_forum_mgr_$unlock 000560 constant entry external dcl 652 THERE WERE NO NAMES DECLARED BY CONTEXT OR IMPLICATION. STORAGE REQUIREMENTS FOR THIS PROGRAM. Object Text Link Symbol Defs Static Start 0 0 13430 13640 11324 13440 Length 14536 11324 210 662 2104 24 BLOCK NAME STACK SIZE TYPE WHY NONQUICK/WHO SHARES STACK FRAME v1_forum_mgr_$open_forum 580 external procedure is an external procedure. on unit on line 256 64 on unit open_forum 80 internal procedure enables or reverts conditions. on unit on line 298 64 on unit allocate_forum_data 88 internal procedure enables or reverts conditions. on unit on line 352 70 on unit on unit on line 353 70 on unit on unit on line 354 68 on unit on unit on line 376 64 on unit close_forum 65 internal procedure is called by several nonquick procedures. on unit on line 462 64 on unit lookup_forum_idx 86 internal procedure enables or reverts conditions. on unit on line 498 64 on unit lock_forum 100 internal procedure enables or reverts conditions. on unit on line 544 70 on unit on unit on line 545 70 on unit on unit on line 546 70 on unit on unit on line 547 70 on unit fill_attendee_slot internal procedure shares stack frame of external procedure v1_forum_mgr_$open_forum. check_attendee_idx internal procedure shares stack frame of external procedure v1_forum_mgr_$open_forum. lookup_attendee 90 internal procedure is called by several nonquick procedures. unlock_forum 78 internal procedure enables or reverts conditions. on unit on line 674 64 on unit on unit on line 699 64 on unit copy_pathname_args internal procedure shares stack frame of external procedure v1_forum_mgr_$open_forum. initiate_forum 160 internal procedure enables or reverts conditions. on unit on line 762 70 on unit on unit on line 763 64 on unit on unit on line 764 70 on unit on unit on line 765 70 on unit terminate_forum 90 internal procedure enables or reverts conditions. on unit on line 879 68 on unit on unit on line 883 64 on unit on unit on line 919 64 on unit set_switch 99 internal procedure enables or reverts conditions. on unit on line 984 68 on unit set_the_switch internal procedure shares stack frame of internal procedure set_switch. on unit on line 1074 70 on unit on unit on line 1098 64 on unit on unit on line 1131 64 on unit on unit on line 1162 64 on unit on unit on line 1163 70 on unit on unit on line 1198 64 on unit get_forum_info internal procedure shares stack frame of external procedure v1_forum_mgr_$open_forum. check_eligible 134 internal procedure enables or reverts conditions. on unit on line 1337 68 on unit on unit on line 1365 64 on unit on unit on line 1400 64 on unit on unit on line 1425 64 on unit get_user_list internal procedure shares stack frame of external procedure v1_forum_mgr_$open_forum. get_highest_seen internal procedure shares stack frame of external procedure v1_forum_mgr_$open_forum. on unit on line 1522 64 on unit on unit on line 1555 64 on unit change_the_chairman 138 internal procedure enables or reverts conditions. on unit on line 1596 68 on unit initialize internal procedure shares stack frame of external procedure v1_forum_mgr_$open_forum. error 64 internal procedure is called by several nonquick procedures. force_access 102 internal procedure is called by several nonquick procedures. delete_access 104 internal procedure is called by several nonquick procedures. STORAGE FOR INTERNAL STATIC VARIABLES. LOC IDENTIFIER BLOCK NAME 000010 first_forum_data_ptr v1_forum_mgr_$open_forum 000012 static_initialized v1_forum_mgr_$open_forum 000013 anon_switch v1_forum_mgr_$open_forum 000014 my_authorization v1_forum_mgr_$open_forum 000016 full_authorization v1_forum_mgr_$open_forum 000020 my_process_id v1_forum_mgr_$open_forum 000021 my_lock_id v1_forum_mgr_$open_forum 000022 my_validation v1_forum_mgr_$open_forum 000023 project v1_forum_mgr_$open_forum 000026 user_name v1_forum_mgr_$open_forum STORAGE FOR AUTOMATIC VARIABLES. STACK FRAME LOC IDENTIFIER BLOCK NAME change_the_chairman 000100 chairman_name change_the_chairman 000110 chairman_personid change_the_chairman 000116 chairman_projectid change_the_chairman 000121 entryname change_the_chairman check_eligible 000100 entryname check_eligible 000110 modes check_eligible initiate_forum 000100 access_class initiate_forum 000102 modes initiate_forum 000103 proceedings_entry initiate_forum 000113 rings initiate_forum lock_forum 000100 count lock_forum 000101 not_locked lock_forum lookup_attendee 000100 idx lookup_attendee lookup_forum_idx 000100 forum_control_uid lookup_forum_idx 000101 forum_idx lookup_forum_idx open_forum 000100 forum_control_uid open_forum set_switch 000100 person_name set_switch terminate_forum 000100 p terminate_forum v1_forum_mgr_$open_forum 000122 attendee_idx v1_forum_mgr_$open_forum 000123 caller_validation v1_forum_mgr_$open_forum 000124 dirname_buffer v1_forum_mgr_$open_forum 000176 dirname_len v1_forum_mgr_$open_forum 000200 egress v1_forum_mgr_$open_forum 000204 force_switch v1_forum_mgr_$open_forum 000205 last_seen_trans_idx v1_forum_mgr_$open_forum 000206 forum_control_entry v1_forum_mgr_$open_forum 000216 forum_name_len v1_forum_mgr_$open_forum 000220 forum_data_ptr v1_forum_mgr_$open_forum 000222 forum_dir v1_forum_mgr_$open_forum 000274 no_w_access v1_forum_mgr_$open_forum 000275 privileged v1_forum_mgr_$open_forum 000276 switch_name v1_forum_mgr_$open_forum 000306 switch_setting v1_forum_mgr_$open_forum 000307 write_allowed v1_forum_mgr_$open_forum 000310 status v1_forum_mgr_$open_forum 000311 segment_acl v1_forum_mgr_$open_forum 000324 delete_acl v1_forum_mgr_$open_forum 000336 fmi v1_forum_mgr_$open_forum 000364 forum_control_ptr v1_forum_mgr_$open_forum 000366 proceedings_ptr v1_forum_mgr_$open_forum 000370 forum_info_ptr v1_forum_mgr_$open_forum 000372 user_list_no_attendees v1_forum_mgr_$open_forum 000374 user_list_ptr v1_forum_mgr_$open_forum 000456 idx check_attendee_idx 000510 forum_name_len copy_pathname_args 000520 access_name get_forum_info 000530 access_time get_forum_info 000532 idx get_forum_info 000533 person_name get_forum_info 000634 idx get_user_list 000635 jdx get_user_list 000666 highest get_highest_seen 000667 done get_highest_seen 000676 anon initialize THE FOLLOWING EXTERNAL OPERATORS ARE USED BY THIS PROGRAM. r_e_as alloc_char_temp call_ext_out_desc call_ext_out call_int_this_desc call_int_this call_int_other_desc call_int_other return_mac tra_ext_1 tra_ext_2 enable_op shorten_stack ext_entry ext_entry_desc int_entry int_entry_desc op_alloc_ op_freen_ clock_mac THE FOLLOWING EXTERNAL ENTRIES ARE CALLED BY THIS PROGRAM. get_authorization_ get_group_id_$tag_star get_lock_id_ get_process_id_ get_ring_ get_system_free_area_ hcs_$add_acl_entries hcs_$delete_acl_entries hcs_$fs_get_brackets hcs_$fs_get_path_name hcs_$get_access_class hcs_$get_authorization hcs_$get_uid_seg hcs_$get_user_effmode hcs_$initiate hcs_$level_get hcs_$level_set hcs_$terminate_noname read_write_allowed_ set_lock_$lock set_lock_$unlock user_info_$login_data THE FOLLOWING EXTERNAL VARIABLES ARE USED BY THIS PROGRAM. error_table_$ai_restricted error_table_$bad_arg error_table_$dirlong error_table_$invalid_lock_reset error_table_$lock_wait_time_exceeded error_table_$locked_by_this_process error_table_$moderr error_table_$noalloc error_table_$noentry error_table_$null_info_ptr error_table_$seg_busted error_table_$unimplemented_version forum_data_$chairman_override forum_data_$print_eligibility_messages forum_error_table_$cant_stop_msg_admin forum_error_table_$cant_stop_msg_site forum_error_table_$chairman_only forum_error_table_$forum_deleted forum_error_table_$invalid_forum_idx forum_error_table_$invalid_switch_name forum_error_table_$invalid_trans_idx forum_error_table_$long_forum_name forum_error_table_$meeting_adjourned forum_error_table_$no_control_suffix forum_error_table_$no_such_forum forum_error_table_$no_such_user forum_error_table_$not_a_forum forum_error_table_$not_eligible forum_error_table_$roster_full forum_error_table_$switch_not_changed forum_error_table_$unexpected_fault forum_error_table_$you_twit LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC 80 000151 252 000203 254 000210 256 000211 258 000233 260 000243 262 000255 264 000261 266 000265 270 000306 271 000307 272 000315 274 000322 276 000326 277 000331 279 000332 281 000333 284 000337 285 000340 287 000342 369 000343 372 000361 374 000366 376 000372 378 000414 380 000420 382 000421 384 000422 386 000426 388 000427 390 000430 393 000434 395 000436 455 000437 458 000463 460 000470 462 000474 464 000516 466 000522 468 000523 469 000525 470 000527 471 000532 472 000537 474 000540 476 000541 479 000545 480 000547 481 000550 482 000552 484 000554 652 000555 655 000570 657 000573 659 000576 661 000602 692 000603 695 000640 697 000645 699 000646 701 000670 703 000700 705 000710 706 000712 707 000714 709 000715 711 000716 714 000722 715 000724 716 000725 718 000727 851 000730 854 000746 855 000751 857 000754 859 000757 861 000765 862 000767 864 000770 866 000774 868 001000 903 001001 906 001044 907 001046 909 001047 912 001106 914 001107 917 001114 919 001115 921 001137 922 001147 924 001163 926 001167 928 001173 930 001175 932 001176 935 001202 937 001204 941 001205 944 001237 945 001240 947 001245 949 001251 951 001255 953 001257 955 001260 958 001262 1063 001263 1066 001306 1068 001313 1070 001344 1072 001350 1074 001353 1076 001377 1078 001414 1080 001431 1082 001440 1083 001441 1085 001442 1087 001444 1091 001445 1094 001477 1096 001504 1098 001505 1099 001521 1100 001526 1101 001533 1103 001534 1104 001544 1106 001556 1108 001567 1110 001573 1111 001601 1113 001604 1114 001610 1115 001614 1116 001615 1118 001616 1120 001622 1121 001626 1122 001630 1124 001631 1127 001651 1129 001656 1131 001662 1133 001704 1135 001710 1136 001716 1138 001721 1140 001725 1142 001726 1144 001727 1147 001733 1149 001735 1155 001736 1158 001777 1160 002004 1162 002005 1163 002027 1165 002053 1167 002063 1169 002065 1170 002074 1172 002075 1174 002101 1176 002105 1178 002107 1180 002110 1183 002114 1185 002116 1191 002117 1194 002147 1196 002154 1198 002160 1200 002202 1202 002206 1204 002207 1206 002213 1208 002217 1209 002223 1211 002224 1213 002225 1216 002231 1218 002233 1355 002234 1358 002253 1360 002260 1362 002264 1363 002267 1365 002272 1367 002314 1369 002320 1372 002337 1374 002340 1378 002353 1380 002361 1382 002365 1384 002366 1386 002367 1389 002373 1391 002375 1393 002376 1396 002432 1398 002437 1400 002440 1402 002462 1403 002472 1405 002504 1407 002505 1409 002511 1410 002512 1412 002513 1415 002517 1416 002521 1418 002522 1421 002545 1423 002552 1425 002556 1427 002600 1429 002604 1431 002605 1433 002606 1435 002612 1436 002613 1438 002614 1440 002620 1441 002622 1515 002623 1518 002646 1520 002653 1522 002657 1524 002701 1526 002705 1527 002706 1529 002712 1531 002716 1532 002717 1534 002720 1536 002724 1537 002726 1539 002727 1542 002763 1543 002765 1545 002766 1548 003017 1550 003020 1553 003025 1555 003026 1557 003050 1559 003060 1561 003064 1563 003070 1564 003071 1566 003072 1568 003076 1569 003100 293 003101 298 003107 300 003130 301 003144 303 003156 305 003167 307 003173 309 003200 310 003203 311 003205 312 003207 314 003211 316 003212 320 003215 322 003222 323 003230 324 003232 325 003234 326 003236 328 003240 329 003242 331 003245 334 003253 335 003257 338 003260 340 003261 349 003262 352 003270 353 003314 354 003340 356 003365 358 003374 360 003411 362 003420 401 003421 404 003427 406 003434 407 003437 409 003441 410 003446 416 003447 418 003455 421 003463 424 003472 432 003474 434 003512 435 003516 436 003521 437 003523 440 003525 442 003532 444 003537 492 003540 498 003546 500 003567 502 003572 506 003604 508 003615 510 003621 511 003634 513 003646 516 003663 517 003670 518 003672 520 003674 522 003675 526 003700 528 003701 530 003711 538 003712 544 003720 545 003744 546 003770 547 004014 549 004040 550 004042 552 004051 553 004067 554 004074 555 004100 557 004102 560 004117 567 004120 570 004121 574 004122 579 004130 580 004137 581 004141 582 004143 583 004145 585 004147 592 004150 600 004151 605 004170 606 004171 608 004205 609 004220 613 004222 614 004224 615 004232 617 004243 619 004246 620 004254 621 004261 626 004263 627 004272 628 004277 632 004300 638 004314 639 004316 640 004334 641 004351 643 004353 646 004366 667 004367 670 004375 672 004377 674 004403 676 004422 678 004435 724 004436 729 004437 731 004465 733 004470 735 004516 737 004521 738 004534 740 004545 743 004563 751 004564 762 004572 763 004616 764 004640 765 004664 769 004710 771 004717 772 004745 774 004763 776 004772 777 005010 778 005023 784 005040 785 005104 789 005120 790 005136 792 005150 793 005156 794 005164 796 005174 800 005212 805 005233 809 005251 810 005303 814 005315 815 005331 817 005345 823 005365 824 005374 826 005412 827 005461 830 005504 832 005513 833 005531 835 005543 836 005560 838 005565 842 005603 844 005613 874 005614 879 005622 881 005647 883 005656 885 005675 886 005700 887 005703 889 005720 890 005723 891 005726 893 005743 896 005753 963 005754 968 005762 970 006014 972 006020 973 006034 976 006061 978 006063 980 006116 982 006122 984 006126 985 006142 986 006147 987 006160 989 006161 990 006167 991 006176 994 006203 996 006210 998 006221 1000 006255 1002 006303 1004 006332 1008 006354 1009 006360 1011 006401 1012 006415 1013 006433 1014 006434 1015 006444 1017 006465 1018 006501 1019 006502 1020 006512 1021 006514 1022 006533 1023 006537 1025 006553 1028 006571 1029 006605 1030 006617 1031 006621 1033 006622 1034 006635 1035 006647 1037 006651 1038 006652 1040 006662 1042 006667 1043 006675 1044 006702 1047 006712 1049 006713 1055 006715 1056 006732 1058 006735 1220 006736 1229 006740 1231 006771 1233 006775 1235 006777 1236 007002 1238 007015 1239 007027 1240 007032 1242 007034 1243 007040 1244 007043 1246 007045 1248 007051 1250 007057 1251 007065 1253 007067 1255 007077 1256 007112 1259 007122 1260 007126 1261 007132 1262 007141 1264 007142 1265 007152 1266 007160 1269 007161 1270 007167 1271 007203 1272 007215 1274 007217 1276 007222 1277 007233 1278 007253 1279 007255 1282 007270 1283 007273 1284 007303 1286 007310 1288 007315 1290 007322 1291 007334 1293 007350 1295 007353 1296 007355 1298 007362 1302 007413 1305 007430 1307 007432 1308 007437 1310 007442 1312 007454 1313 007456 1314 007462 1316 007463 1318 007464 1330 007465 1337 007473 1339 007520 1341 007527 1342 007561 1344 007573 1345 007634 1347 007646 1349 007654 1351 007664 1443 007665 1448 007666 1449 007673 1451 007705 1452 007715 1453 007717 1454 007723 1455 007726 1457 007732 1458 007733 1459 007745 1460 007752 1461 007753 1462 007757 1463 007775 1464 010003 1465 010007 1469 010010 1470 010022 1471 010037 1472 010043 1473 010047 1474 010053 1475 010063 1477 010065 1480 010077 1482 010101 1483 010104 1484 010105 1489 010106 1497 010110 1498 010111 1499 010113 1500 010127 1502 010150 1503 010152 1505 010153 1506 010154 1507 010160 1509 010170 1510 010172 1512 010173 1571 010177 1579 010205 1583 010226 1585 010261 1587 010265 1591 010312 1592 010322 1594 010352 1596 010363 1597 010410 1599 010417 1601 010432 1602 010464 1604 010476 1605 010512 1606 010515 1607 010516 1609 010517 1610 010557 1612 010571 1614 010617 1615 010661 1617 010673 1618 010700 1620 010703 1622 010715 1624 010725 1631 010726 1637 010730 1639 010736 1641 010745 1642 010750 1643 010756 1644 010765 1645 010777 1646 011005 1647 011053 1648 011056 1649 011061 1650 011074 1652 011075 1655 011100 1656 011102 1657 011103 1658 011104 1660 011105 1669 011106 1674 011114 1676 011120 1680 011122 1683 011130 1684 011142 1685 011144 1686 011145 1687 011205 1689 011217 1692 011220 1695 011226 1696 011240 1698 011301 ----------------------------------------------------------- Historical Background This edition of the Multics software materials and documentation is provided and donated to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. as a contribution to computer science knowledge. This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL and BULL HN Information Systems Inc. to the development of this operating system. Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture for managing computer hardware properly and for executing programs. Many subsequent operating systems incorporated Multics principles. Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . ----------------------------------------------------------- Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without fee is hereby granted,provided that the below copyright notice and historical background appear in all copies and that both the copyright notice and historical background and this permission notice appear in supporting documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining to distribution of the programs without specific prior written permission. Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. Copyright 2006 by BULL HN Information Systems Inc. Copyright 2006 by Bull SAS All Rights Reserved