Trailing-Edge
-
PDP-10 Archives
-
bb-kl11m-bm
-
t20src/mxqman.r36
There are 15 other files named mxqman.r36 in the archive. Click here to see a list.
! COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1985, 1989.
! ALL RIGHTS RESERVED.
!
! THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
! ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
! INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
! COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
! OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
! TRANSFERRED.
!
! THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
! AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
! CORPORATION.
!
! DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
! SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.
$SHOW(literals)
MACRO
crlf = %ASCIZ %CHAR(%O'15',%O'12') %, ![314]Cope with new MONSYM
crlf_pointer = CH$PTR(UPLIT(crlf)) %; ![314]
LITERAL
max_number_of_domains = 10, !Note: Increasing this field beyond 12
!requires changing the definition of
!the dom_gateway_flags...
max_local_user_length = 39,
max_domain_name_length = 39,
max_node_name_length = 39,
max_file_name_length = 4 * 39, ! this can be very long
max_string_length = 256;
$FIELD
work_request_fields =
SET
req_que_entry = [$SUB_BLOCK(q_entry_size)],
req_message_id = [$INTEGER],
req_domain_id = [$INTEGER],
req_destination_node = [$ADDRESS],
req_recipient_list = [$ADDRESS],
req_state = [$INTEGER],
req_time_stamp = [$INTEGER],
req_time_to_live = [$INTEGER],
req_state_specific_field = [$INTEGER]
TES;
LITERAL
work_request_size = $FIELD_SET_SIZE;
MACRO
work_request_block =
BLOCK [work_request_size] FIELD (work_request_fields) %;
MACRO
mx$get_work_request =
BEGIN
LOCAL
_req: REF work_request_block;
_req = nmu$memory_get(work_request_size);
time_current(0, _req[req_time_stamp]);
time_current($two_weeks, _req[req_time_to_live]);
._req
END %;
MACRO
mx$release_work_request(_adr) =
nmu$memory_release(_adr, work_request_size) %;
MACRO
message_index = 12,12,0 %;
$FIELD
message_table_fields =
SET
msg_env_spec = [$ADDRESS], ! message envelope file spec
msg_fil_spec = [$ADDRESS], ! message file spec
msg_sender_string = [$ADDRESS], ! sender's name string
msg_work_req_list = [$ADDRESS], ! list of work requests
msg_err_list = [$ADDRESS], ! list of error strings
msg_work_req_count = [$SHORT_INTEGER], ! number of work requests
msg_status_word = [$INTEGER],
$OVERLAY(msg_status_word)
msg_unique_id = [$BITS(24)], !(right 24 bits)unique id
msg_state = [$BITS(12)], !(left 12 bits) message state
$CONTINUE
$OVERLAY(msg_status_word)
msg_unique_part = [$bits(12)], ! the unique part
msg_msg_id = [$bits(12)], ! index into act.msg.table
$CONTINUE
msg_sender_domain = [$SHORT_INTEGER], ! sender's domain
msg_subject_string = [$ADDRESS], ! the subject string
msg_sender_pid = [$INTEGER], ! Sender's PID
msg_sender_uid = [$INTEGER], ! Sender's User Id
msg_sender_caps = [$INTEGER] ! Sender's capabilities
TES;
LITERAL
message_table_entry_size = $FIELD_SET_SIZE;
MACRO
message_table_entry =
BLOCK [message_table_entry_size] FIELD (message_table_fields) %;
MACRO
mx$get_message_table_entry =
BEGIN
%IF NOT %DECLARED(env_cntr) %THEN
EXTERNAL
env_cntr;
%FI
%IF NOT %DECLARED(mx$build_envelope_spec) %THEN
EXTERNAL ROUTINE
mx$build_envelope_spec;
%FI
LOCAL
_ent: REF message_table_entry;
_ent = nmu$memory_get(message_table_entry_size);
_ent[msg_work_req_count] = 0;
_ent[msg_msg_id] = nmu$table_insert(active_message_table, ._ent);
WHILE $true DO
BEGIN
_ent[msg_unique_part] = env_cntr = .env_cntr + 1;
_ent[msg_env_spec] = mx$build_envelope_spec(._ent[msg_unique_id]);
IF mx$file_exists(CH$PTR(._ent[msg_env_spec]))
THEN
mx$release_asciz(._ent[msg_env_spec])
ELSE
EXITLOOP;
END;
._ent
END %;
! Define a list block, used to link work requests to the message table entry,
! and to link destination string blocks to the work request.
$FIELD
list_block_fields =
SET
lst_next = [$ADDRESS], ! link to next list block
lst_data = [$ADDRESS], ! address of data block being linked
lst_xtra = [$ADDRESS], ! address of xtra data
lst_stat = [$SHORT_INTEGER], ! recipient status bits
lst_quota= [1,34,1,0] ! 1b2 is the don't output quota msg bit
TES;
LITERAL
list_block_size = $FIELD_SET_SIZE; ! size of the block
MACRO
list_blk = BLOCK [ list_block_size ] FIELD (list_block_fields) %;
MACRO
mx$get_list_blk =
nmu$memory_get(list_block_size) %;
$FIELD
rb_block_fields =
SET
rb_name_ptr = [$INTEGER],
rb_node_ptr = [$INTEGER],
rb_name_len = [$SHORT_INTEGER],
rb_node_len = [$SHORT_INTEGER],
rb_profile = [$ADDRESS]
TES;
LITERAL
rb_block_size = $FIELD_SET_SIZE;
MACRO
rb_block = BLOCK[rb_block_size] FIELD(rb_block_fields) %;
MACRO
mx$get_rb_block =
nmu$memory_get(rb_block_size) %;
FIELD
err_word_fields =
SET
err_cod = [0,0,9,0],
err_rec = [0,9,9,0]
TES;
LITERAL
err_word_size = 1;
MACRO
err_word = BLOCK[err_word_size] FIELD (err_word_fields) %;
MACRO
mx$get_err_word = nmu$memory_get(err_word_size) %;
LITERAL
mx$local = 0, ![314] Offset into NETTAB for the Local Domain
mx$decnet = 1; ![314] Offset into NETTAB for the Decnet Domain
$FIELD
domain_data_fields =
SET
dom_name = [$ADDRESS],
dom_validation = [$SHORT_INTEGER],
dom_spooler_task = [$ADDRESS],
dom_server_task = [$ADDRESS],
dom_init_file = [$ADDRESS],
dom_spooler_pid = [$INTEGER],
dom_server_pid = [$INTEGER],
$OVERLAY(dom_spooler_pid)
dcn_smtp_servers = [$INTEGER],
dcn_vm11_servers = [$INTEGER],
$CONTINUE
dom_spooler_queue = [$ADDRESS],
dom_node_table = [$ADDRESS],
dom_last_init_time = [$INTEGER],
dom_initialized_flag = [$BIT],
dom_suspended_flag = [$BIT],
dom_incoming_flag = [$BIT],
dom_outgoing_flag = [$BIT],
dom_log_incoming_flag = [$BIT],
dom_log_outgoing_flag = [$BIT],
dom_gateway_flags = [$BITS(3 * max_number_of_domains)]
TES;
LITERAL
domain_data_block_size = $FIELD_SET_SIZE;
MACRO
domain_data_block =
BLOCK [domain_data_block_size] FIELD (domain_data_fields) %;
! Define the message table entry states
$LITERAL
$msg_complete = $DISTINCT, ! message is ready for delivery
$msg_incomplete = $DISTINCT, ! message is pending further info
$msg_restart = $DISTINCT, ! finish delivery after error handling
$msg_canceled = $DISTINCT; ! stop delivery and handle errors
LITERAL
$msg_warning = $msg_restart;
$LITERAL
mp$decnet_hosts_format = $distinct,
mp$pmr = $distinct,
mp$synonym = $distinct;
$LITERAL
v_arpa = $DISTINCT,
v_decnet = $DISTINCT,
v_file = $DISTINCT,
v_pid = $DISTINCT;
LITERAL
min_valid = v_arpa,
max_valid = v_pid;
$LITERAL
$dcn_smtp = $DISTINCT,
$dcn_mail_11 = $DISTINCT;
LITERAL
$dcn_unknown = 0,
$dcn_max = $dcn_mail_11;
$LITERAL !Work request states
$send = $DISTINCT,
$done = $DISTINCT,
$defer = $DISTINCT,
$hold = $DISTINCT, !May be needed for "/AFTER:"
$reject = $DISTINCT,
$nofile = $DISTINCT;
LITERAL
min_request_type = $send,
max_request_type = $reject;
! Define the types of destinations
$LITERAL
mbx_list = $DISTINCT, ! mailing list
mbx_serv = $DISTINCT, ! mailbox service
mbx_user = $DISTINCT; ! local user
LITERAL
$local = 0,
$two_weeks = 60 * 60 * 24 * 14, !Number of seconds in two weeks...
$two_minutes = 60*2,
$five_minutes = 60*5;
! Macro: $mx$change_state
! This macro changes the state of a work request and requeues it to the
! work-queue.
!
! NTRY: The address of the work-request's queue entry.
!
! STATE: One of the following: <nothing>,$SEND,$DONE,$REJECT,$DEFER,$DONE
!
! A value for the state-specific field may be specified if necessary
MACRO
$mx$change_state( _req_, _state_) =
BEGIN
BIND
_req = _req_: work_request_block;
%IF NOT %NULL(%REMAINING)
%THEN
_req [req_state_specific_field] = %REMAINING;
%FI
%IF NOT %NULL(_state_)
%THEN
_req [req_state] = _state_;
%FI
nmu$squeue_insert(work_queue, _req);
END %;
MACRO
MX$FATAL(str) =
%IF %SWITCHES(TOPS20) %THEN
BEGIN
DECLARE_JSYS(psout, haltf);
$$psout(crlf_pointer); ![314]
$$psout(UPLIT(%ASCIZ %STRING('?',str)));
$$haltf();
END
%ELSE
! %WARN('MX$FATAL not implemented for this OS')
BEGIN
BUILTIN UUO;
TASK_INFO(str);
UUO(0,EXIT(1));
END
%FI %;
MACRO
$trace(arg)[] =
%IF %VARIANT EQL 1 %THEN $trace_always(arg,%remaining) %FI %;
MACRO
$trace_always(a)[] =
BEGIN
%IF NOT %DECLARED(log) %THEN EXTERNAL ROUTINE log: NOVALUE; %FI
%IF NOT %DECLARED(nmldie) %THEN EXTERNAL ROUTINE nmldie: NOVALUE; %FI
%(318)% %IF %NULL(%REMAINING) %THEN log( UPLIT(%ASCIZ a), 0 )
%ELSE
BEGIN
LOCAL
$LEN,
$TPTR;
STACKLOCAL
$TBUF: VECTOR[CH$ALLOCATION(max_string_length)];
$tptr = CH$PTR($tbuf);
%IF %ISSTRING(a) %THEN
IF $nmu$text($tptr,max_string_length,a,%REMAINING) LSS 0
THEN
NMLDIE(0,CH$PTR(UPLIT(
%ASCIZ 'String failure in TRACE_ALWAYS')));
%(318)% log($tbuf, 0)
%(318)% %ELSE
IF $nmu$text($tptr,max_string_length,%REMAINING) LSS 0
THEN
NMLDIE(0,CH$PTR(UPLIT(
%ASCIZ 'String(2) failure in TRACE_ALWAYS')));
%(318)% log($tbuf,a)
%FI
END
%FI
END %;
!Switch values used in MXHOST and MXDCNT and MXDATA
$LITERAL
$invalid = $distinct,
$strip = $distinct,
$minsw = $invalid,
$maxsw = $strip;
!Network macros used in MXHOST and MXDATA
MACRO
ASK_MONITOR(net, nd) =
%IF %IDENTICAL(net, ARPA)
%THEN
%IF %SWITCHES(TOPS20)
%THEN
BEGIN !Tops-20/ARPA conditional
DECLARE_JSYS(GTHST);
REGISTER
D = 4;
IF $$gthst($gthsn,nd) !Is host known?
THEN !-Yes
IF (.d AND hs_srv) NEQ 0 !-Is it a SERVER?
THEN
1 !--Yes, valid
ELSE
0 !--No, invalid
ELSE
0 !-No, not known. Invalid
END
%ELSE 0
%FI !End TOPS-10/20 ARPA conditional
%ELSE
%IF %IDENTICAL(net, DECNET)
%THEN
%IF %SWITCHES(TOPS20)
%THEN
BEGIN
STACKLOCAL
arg: VECTOR[2];
declare_jsys(node);
arg[0] = nd;
IF $$node($ndvfy, arg) !Do we know about it?
THEN
IF (.arg[1] AND nd_exm) NEQ 0
THEN
1 !-Yes
ELSE
0
ELSE
0
END
%ELSE
! %WARN('"ASK_MONITOR" not yet implemented for TOPS10')
BEGIN
BUILTIN UUO;
REGISTER t;
LOCAL
p;
STACKLOCAL
nodblk: VECTOR[3];
t = 0;
p = nd;
WHILE CH$RCHAR_A(p) NEQ 0 DO !count the characters
t = .t + 1;
CH$TRANSLATE(sx_tab,
.t,nd,
0,
6,CH$PTR(nodblk[$dnnam],0,6));
nodblk = ($dnndi ^ 18) + 3 + dn$flk;
t = nodblk;
IF UUO(1,dnet$(t))
THEN
$true
ELSE
(.t EQL 8) !true if node is out of area
END
%FI !End of TOPS10/20 DECNET conditional
%ELSE
%ERROR('Unimplimented "ASK_MONITOR" function - ', net)
%FI !End %if DECNET
%FI !End %if ARPA
%; !End of ASK_MONITOR macro
MACRO
expand_table(tb, percent) =
BEGIN
LOCAL
new_table: REF tbl,
new_table_size;
new_table_size = (.tb[TBL_MAXIMUM_ENTRIES] +
((.tb[TBL_MAXIMUM_ENTRIES] * percent) / 100)) + 2;
new_table = nmu$memory_get(.new_table_size);
IF .new_table EQL 0
THEN
0
ELSE
BEGIN
new_table[TBL_ACTUAL_ENTRIES] = .tb[TBL_ACTUAL_ENTRIES];
new_table[TBL_MAXIMUM_ENTRIES] = .new_table_size - 1;
INCR i FROM 1 TO .tb[TBL_MAXIMUM_ENTRIES] DO
(.new_table + .i) = .(.tb + .i);
nmu$memory_release(.tb, .tb[TBL_MAXIMUM_ENTRIES] + 1);
tb = .new_table;
1
END
END %;
!
! EQUATED SYMBOLS:
!
LITERAL
def_table_size = 200;
!
! POBOX STATUS BITS
!
MACRO
po_mnt = 0,1,0 %, !Bit 35
po_dis = 1,1,0 %; !Bit 34
LITERAL
OK_POBOX = 1,
NO_POBOX = 2,
SOME_POBOX = 3;
!
! ROUTINE NAME BINDINGS
!
MACRO
mx$update_pobox_status = mx_pbs %,
mx$wait_for_pobox = mx_wfp %;