From: SMTP%"DSJ@WKUVX1.WKU.EDU" 24-OCT-1994 15:28:07.10 To: EVERHART CC: Subj: AUGUST94.RCOM X-FileServer: Digital Systems Journal File Server Date: Mon, 24 Oct 1994 14:21:56 CDT Sender: DSJ-Mgr@WKUVX1.WKU.EDU Errors-To: DSJ-Mgr@WKUVX1.WKU.EDU Warnings-To: <> From: DSJ-Mgr@WKUVX1.WKU.EDU Reply-To: DSJ@WKUVX1.WKU.EDU Subject: AUGUST94.RCOM To: EVERHART@arisia.gce.com $! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))' $! $! This archive created: $! Name : RCOM $! By : Hunter Goatley $! Date : 8-SEP-1994 14:20:45.13 $! Using: VMS_SHARE 8.5-1, (C) 1993 Andy Harper, Kings College London UK $! $! Credit is due to these people for their original ideas: $! James Gray, Michael Bednarek $! $! To unpack this archive: $! Minimum of VMS 4.4 (VAX) / OpenVMS 1.0 (Alpha) is required. $! Remove the headers of the first part, up to `cut here' line. $! Execute file as a command procedure. $! $! The following file(s) will be created after unpacking: $! 1. DESCRIP.MMS;1 $! 2. RCOM.C;1 $! 3. RCOM.RNH;1 $! 4. RCOM_CLD.CLD;1 $! 5. RCOM_LISTENER.COM;1 $! 6. RCOM_MSG.MSG;1 $! $ set="set" $ set symbol/scope=(nolocal,noglobal) $ f="SYS$SCRATCH:."+f$getjpi("","PID")+";" $ if f$trnlnm("SHARE_UNPACK") .nes. "" then $ - f=f$parse("SHARE_UNPACK_TEMP",f) $ e="write sys$error ""%UNPACK"", " $ w="write sys$output ""%UNPACK"", " $ if .not. f$trnlnm("SHARE_UNPACK_LOG") then $ w = "!" $ if f$getsyi("CPU") .gt. 127 then $ goto start $ ve=f$getsyi("version") $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto start $ e "-E-OLDVER, Must run at least VMS 4.4" $ v=f$verify(v) $ exit 44 $unpack:subroutine!P1=file,P2=chksum,P3=attrib,P4=size,P5=fileno,P6=filetotal $ if f$parse(P1) .nes. "" then $ goto dirok $ dn=f$parse(P1,,,"DIRECTORY") $ w "-I-CREDIR, Creating directory ''dn'" $ create/dir 'dn' $ if $status then $ goto dirok $ e "-E-CREDIRFAIL, Unable to create ''dn' File skipped" $ delete 'f'* $ exit $dirok: $ x=f$search(P1) $ if x .eqs. "" then $ goto file_absent $ e "-W-EXISTS, File ''P1' exists. Skipped" $ delete 'f'* $ exit $file_absent: $ w "-I-UNPACK, Unpacking ", P5, " of ", P6, " - ", P1, " - ", P4, " Blocks" $ n=P1 $ if P3 .nes. "" then $ n=f $ if .not. f$verify() then $ define/user sys$output nl: $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT/NOJOURNAL 'f'/OUT='n' PROCEDURE GetHex(s,p)LOCAL x1,x2;x1:=INDEX(t,SUBSTR(s,p,1))-1;x2:=INDEX(t, SUBSTR(s,p+1,1))-1;RETURN 16*x1+x2;ENDPROCEDURE;PROCEDURE SkipPartsep LOCAL m; LOOP m:=MARK(NONE);EXITIF m=END_OF(CURRENT_BUFFER);DELETE(m);EXITIF INDEX( ERASE_LINE,"-+-+-+-+-+-+-+-+")=1;ENDLOOP;ENDPROCEDURE; PROCEDURE ProcessLine LOCAL c,s,l,b,n,p;s := ERASE_LINE;c := SUBSTR(s,1,1);s := s-c;IF c = "X" THEN SPLIT_LINE; ENDIF;MOVE_HORIZONTAL(-1);l := LENGTH(s);p := 1;LOOP EXITIF p > l;c := SUBSTR(s,p,1);p := p+1;CASE c FROM ' ' TO '`' ['`'] : COPY_TEXT(ASCII(GetHex(s,p))); p:=p+2;[' ']: p:=p+1;[INRANGE,OUTRANGE] : COPY_TEXT(c);ENDCASE;ENDLOOP;ENDPROCEDURE;PROCEDURE Decode(b)LOCAL m; POSITION(BEGINNING_OF(b));LOOP m:=MARK(NONE);EXITIF m=END_OF(b);DELETE(m); IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+-")=1 THEN SkipPartSep;ELSE ProcessLine; MOVE_HORIZONTAL(1);ENDIF;ENDLOOP;ENDPROCEDURE;SET(FACILITY_NAME,"UNPACK");SET( SUCCESS,OFF);SET(INFORMATIONAL,OFF);t:="0123456789ABCDEF";f:=GET_INFO( COMMAND_LINE,"file_name");o:=CREATE_BUFFER(f,f);Decode(o);WRITE_FILE(o, GET_INFO(COMMAND_LINE,"output_file"));QUIT; $ if p3 .eqs. "" then $ goto dl $ open/write fdl &f $ write fdl "RECORD" $ write fdl P3 $ close fdl $ w "-I-CONVRFM, Converting record format to ", P3 $ convert/fdl='f' 'f'-1 'f' $ fa=f$getdvi(f$parse(f),"ALLDEVNAM") $ Pa=f$getdvi(f$parse(P1),"ALLDEVNAM") $ if fa .eqs. Pa then $ rename &f 'f$parse(P1)' $ if fa .nes. Pa then $ copy &f 'f$parse(P1)' $dl: delete 'f'* $ checksum 'P1' $ if checksum$checksum .nes. P2 then $ - e "-E-CHKSMFAIL, Checksum of ''P1' failed." $ exit $ endsubroutine $start: $! $ create 'f' X.IFDEF`20EXE X.ELSE XEXE`20=`20.EXE XOBJ`20=`20.OBJ X.ENDIF X XRCOM$(EXE)`20:`09RCOM$(OBJ),RCOM_MSG$(OBJ),RCOM_CLD$(OBJ) X`09$(LINK)$(LINKFLAGS)/NOTRACE`20$(MMS$SOURCE_LIST) $ call unpack DESCRIP.MMS;1 2014516635 "" 1 1 6 $! $ create 'f' X/* X`20*`20RCOM.C`20-`20remote`20command`20program. X`20*`20Copyright`20(C)`20Nick`20Brown,`201994.`20`20All`20rights`20reserved. X`20*/ X X#include`20clidef X#include`20climsgdef X#include`20ctype X#include`20descrip X#include`20fab X#include`20iodef X#include`20jpidef X#include`20lib$routines X#include`20lnmdef X#include`20rab X#include`20rmsdef X#include`20smg$routines X#include`20smgdef X#include`20ssdef X#include`20starlet X#include`20stdlib X#include`20string X#include`20syidef X X/* X`20*`20Declarations`20for`20library`20routines`20which`20aren't`20in`20VAX`20C V`20include`20files. X`20*/ Xextern`20int`20cli$present`20(); Xextern`20int`20cli$get_value`20(); Xextern`20int`20cli$dcl_parse`20(); Xextern`20int`20cli$dispatch`20(); Xextern`20int`20lbr$output_help`20(); X X/* X`20*`20Textual`20reminder`20that`20uninitialised`20parameter`20needs`20to`20be V`20filled`20in. X`20*/ X#define`20FILLIN`200 X X/* X`20*`20Message`20code`20declarations. X`20*/ X#pragma`20nostandard X Xglobalvalue`20unsigned`20int`20rcom_attacherr; Xglobalvalue`20unsigned`20int`20rcom_cancel; Xglobalvalue`20unsigned`20int`20rcom_catcherr; Xglobalvalue`20unsigned`20int`20rcom_env; Xglobalvalue`20unsigned`20int`20rcom_insvirmem; Xglobalvalue`20unsigned`20int`20rcom_logtoodeep; Xglobalvalue`20unsigned`20int`20rcom_noderr; Xglobalvalue`20unsigned`20int`20rcom_noparent; Xglobalvalue`20unsigned`20int`20rcom_output; X X#pragma`20standard X X/* X`20*`20I/O`20status`20blocks. X`20*/ Xtypedef`20struct`20`7B X`20`20unsigned`20short`20status; X`20`20short`20count; X`20`20unsigned`20int`20device_info; X`7D`20QIO_IOSB; X Xtypedef`20struct`20`7B X`20`20unsigned`20int`20status; X`20`20unsigned`20int`20reserved; X`7D`20SS_IOSB; X X/* X`20*`20Itemlist`20used`20for`20passing`20parameters`20to`20system`20services. V X`20*/ Xtypedef`20struct`20`7B X`20`20short`20buflen; X`20`20unsigned`20short`20code; X`20`20void`20*bufaddr; X`20`20void`20*retaddr; X`7D`20ITEMLIST; X X/* X`20*`20Structure`20to`20describe`20one`20level`20of`20indirect`20command`20(@) V`20file. X`20*/ Xstruct`20s_Atfile`20`7B X`20`20struct`20s_Atfile`20*previous; X`20`20struct`20FAB`20fab; X`20`20struct`20RAB`20rab; X`7D; Xtypedef`20struct`20s_Atfile`20Atfile; X Xstatic`20Atfile`20*current_atfile`20=`20NULL; X X#define`20NODENAME_SIZE`2032 X#define`20MAX_NODES`2096 X Xtypedef`20struct`20`7B X`20`20char`20name`20`5BNODENAME_SIZE`5D; X`20`20unsigned`20short`20channel; X`20`20int`20active; X`7D`20Node; X Xstatic`20Node`20nodelist`20`5BMAX_NODES`5D; Xstatic`20char`20current_nodename`20`5BNODENAME_SIZE`5D; X X#define`20USERNAME_SIZE`2032 Xstatic`20char`20default_username`20`5BUSERNAME_SIZE`5D`20=`20""; Xstatic`20char`20username`20`5BUSERNAME_SIZE`5D`20=`20""; X X#define`20PASSWORD_SIZE`2032 Xstatic`20char`20default_password`20`5BPASSWORD_SIZE`5D`20=`20""; Xstatic`20char`20password`20`5BPASSWORD_SIZE`5D`20=`20""; X Xstatic`20char`20default_nodes`20`5BLNM$C_NAMLENGTH`20+`201`5D; X Xstatic`20int`20exit_command_seen`20=`200; Xstatic`20int`20dont_show_env`20=`201;`09/*`20suppress`20SHOW`20ENV`20at`20star Vtup`20*/ X Xstatic`20unsigned`20int`20keyboard; X Xstatic`20$DESCRIPTOR(sys_command_desc,`20"SYS$COMMAND"); Xstatic`20unsigned`20short`20command_chan; Xstatic`20volatile`20int`20ctrl_c_hit; X X/* X`20*`20Routine`20to`20get`20an`20optional`20value. X`20*`20The`20input`20size`20field`20of`20the`20descriptor`20is`20overwritten V`20with`20the`20length. X`20*/ Xstatic Xvoid`20get_optional_value`20(struct`20dsc$descriptor_s`20*qual_desc, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20str Vuct`20dsc$descriptor_s`20*result_desc X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20) X`7B X`20`20unsigned`20int`20status; X X`20`20if`20(cli$present(qual_desc)`20`26`201)`20`7B X`20`20`20`20if`20(!`20((status`20=`20cli$get_value(qual_desc, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20result_desc, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`26result_desc->dsc$w_length X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20) X`20`20`20`20`20`20`20`20`20`20`20`20)`20`26`201))`20`7B X`20`20`20`20`20`20lib$signal(status); X`20`20`20`20`7D X`20`20`7D X`20`20else`20`7B X`20`20`20`20result_desc->dsc$w_length`20=`200; X`20`20`7D X`7D X X/* X`20*`20Routine`20to`20handle`20ATTACH`20command. X`20*/ Xunsigned`20int Xcmd_attach`20(void) X`7B X`20`20$DESCRIPTOR(parent_desc,`20"PARENT"); X`20`20$DESCRIPTOR(p1_desc,`20"P1"); X X`20`20char`20process`20`5B256`5D; X`20`20struct`20dsc$descriptor_s`20process_desc`20=`20`7B X`20`20`20`20sizeof(process),`20DSC$K_DTYPE_T,`20DSC$K_CLASS_S,`20FILLIN X`20`20`7D; X X`20`20struct`20dsc$descriptor_s`20*prcnam_desc; X X`20`20unsigned`20int`20pid`20=`200; X`20`20ITEMLIST`20jpi_itl_byname`20`5B`5D`20=`20`7B X`20`20`20`20sizeof(pid),`20JPI$_PID,`20FILLIN,`200, X`20`20`20`200,`200,`200,`200 X`20`20`7D; X`20`20ITEMLIST`20jpi_itl_parent`20`5B`5D`20=`20`7B X`20`20`20`20sizeof(pid),`20JPI$_OWNER,`20FILLIN,`200, X`20`20`20`20sizeof(process),`20JPI$_PRCNAM,`20FILLIN,`20FILLIN, X`20`20`20`200,`200,`200,`200 X`20`20`7D; X`20`20ITEMLIST`20*jpi_itl; X`20`20SS_IOSB`20jpi_iosb; X X`20`20unsigned`20int`20status; X X`20`20process_desc.dsc$a_pointer`20=`20process; X`20`20jpi_itl_byname`5B0`5D.bufaddr`20=`20`26pid; X`20`20jpi_itl_parent`5B0`5D.bufaddr`20=`20`26pid; X`20`20jpi_itl_parent`5B1`5D.bufaddr`20=`20process; X`20`20jpi_itl_parent`5B1`5D.retaddr`20=`20`26process_desc.dsc$w_length; X X/* X`20*`20Either`20process`20name`20or`20/PARENT`20must`20be`20present. X`20*/ X`20`20if`20(cli$present(`26parent_desc)`20`26`201)`20`7B X`20`20`20`20jpi_itl`20=`20jpi_itl_parent; X`20`20`20`20prcnam_desc`20=`20(struct`20dsc$descriptor_s`20*)`200; X`20`20`7D X`20`20else`20`7B X`20`20`20`20if`20(!`20((status`20=`20cli$get_value(`26p1_desc, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`26process_desc, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`26process_desc.dsc$w_length X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20) X`20`20`20`20`20`20`20`20`20`20`20)`20`26`201))`20`7B X`20`20`20`20`20`20lib$signal(status);`09`09/*`20should`20be`20fatal`20*/ X`20`20`20`20`7D X X`20`20`20`20jpi_itl`20=`20jpi_itl_byname; X`20`20`20`20prcnam_desc`20=`20`26process_desc; X`20`20`7D X X/* X`20*`20Get`20PID`20for`20specified`20process;`20if`20found,`20attempt`20to`20a Vttach. X`20*`20If`20we`20requested`20/PARENT`20and`20there`20isn't`20one,`20use`20a`20 Vsimulated`20status`20code. X`20*/ X`20`20status`20=`20sys$getjpiw(0,`200,`20prcnam_desc,`20jpi_itl,`20`26jpi_iosb V,`200,`200); X`20`20if`20(status`20`26`201)`20`7B X`20`20`20`20status`20=`20jpi_iosb.status; X`20`20`7D X`20`20if`20((status`20`26`201)`20`26`26`20(jpi_itl`20==`20jpi_itl_parent)`20 V`26`26`20(pid`20==`200))`20`7B X`20`20`20`20status`20=`20rcom_noparent; X`20`20`20`20process_desc.dsc$w_length`20=`20strlen(strcpy(process,`20" V")); X`20`20`7D X`20`20if`20(status`20`26`201)`20`7B X`20`20`20`20status`20=`20lib$attach(`26pid); X`20`20`7D X X`20`20if`20(!`20(status`20`26`201))`20`7B X`20`20`20`20lib$signal(rcom_attacherr,`202,`20process_desc.dsc$w_length,`20pro Vcess, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20status); X`20`20`7D X X`20`20return`20SS$_NORMAL; X`7D X X/* X`20*`20Routine`20to`20handle`20SPAWN`20command. X`20*/ Xunsigned`20int Xcmd_spawn`20(void) X`7B X`20`20$DESCRIPTOR(p1_desc,`20"P1"); X`20`20$DESCRIPTOR(logical_names_desc,`20"LOGICAL_NAMES"); X`20`20$DESCRIPTOR(symbols_desc,`20"SYMBOLS"); X`20`20$DESCRIPTOR(wait_desc,`20"WAIT"); X`20`20$DESCRIPTOR(input_desc,`20"INPUT"); X`20`20$DESCRIPTOR(output_desc,`20"OUTPUT"); X`20`20$DESCRIPTOR(process_desc,`20"PROCESS"); X X`20`20char`20command`20`5B256`5D; X`20`20struct`20dsc$descriptor_s`20command_desc`20=`20`7B X`20`20`20`20sizeof(command),`20DSC$K_DTYPE_T,`20DSC$K_CLASS_S,`20FILLIN X`20`20`7D; X X`20`20char`20infile`20`5B256`5D; X`20`20struct`20dsc$descriptor_s`20infile_desc`20=`20`7B X`20`20`20`20sizeof(infile),`20DSC$K_DTYPE_T,`20DSC$K_CLASS_S,`20FILLIN X`20`20`7D; X X`20`20char`20outfile`20`5B256`5D; X`20`20struct`20dsc$descriptor_s`20outfile_desc`20=`20`7B X`20`20`20`20sizeof(outfile),`20DSC$K_DTYPE_T,`20DSC$K_CLASS_S,`20FILLIN X`20`20`7D; X X`20`20char`20prcnam`20`5B256`5D; X`20`20struct`20dsc$descriptor_s`20prcnam_desc`20=`20`7B X`20`20`20`20sizeof(prcnam),`20DSC$K_DTYPE_T,`20DSC$K_CLASS_S,`20FILLIN X`20`20`7D; X X`20`20unsigned`20int`20flags`20=`200; X`20`20unsigned`20int`20status; X X`20`20command_desc.dsc$a_pointer`20=`20command; X`20`20infile_desc.dsc$a_pointer`20=`20infile; X`20`20outfile_desc.dsc$a_pointer`20=`20outfile; X`20`20prcnam_desc.dsc$a_pointer`20=`20prcnam; X X`20`20get_optional_value(`26p1_desc,`20`26command_desc); X`20`20get_optional_value(`26input_desc,`20`26infile_desc); X`20`20get_optional_value(`26output_desc,`20`26outfile_desc); X`20`20get_optional_value(`26process_desc,`20`26prcnam_desc); X X`20`20if`20(!`20(cli$present(`26logical_names_desc)`20`26`201))`20`7B X`20`20`20`20flags`20`7C=`20CLI$M_NOLOGNAM; X`20`20`7D X X`20`20if`20(!`20(cli$present(`26symbols_desc)`20`26`201))`20`7B X`20`20`20`20flags`20`7C=`20CLI$M_NOCLISYM; X`20`20`7D X X`20`20if`20(!`20(cli$present(`26wait_desc)`20`26`201))`20`7B X`20`20`20`20flags`20`7C=`20CLI$M_NOWAIT; X`20`20`7D X X`20`20if`20(!`20((status`20=`20lib$spawn(`26command_desc, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`26infile_desc, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`26outfile_desc, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`26flags, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`26prcnam_desc X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20) X`20`20`20`20`20`20`20`20`20)`20`26`201))`20`7B X`20`20`20`20lib$signal(rcom_catcherr,`200,`20status); X`20`20`7D X X`20`20return`20SS$_NORMAL; X`7D X X/* X`20*`20Routine`20to`20handle`20HELP`20command. X`20*/ Xunsigned`20int Xcmd_help`20(void) X`7B X`20`20$DESCRIPTOR(p1_desc,`20"P1"); X`20`20$DESCRIPTOR(library_desc,`20"RCOMHELP"); X X`20`20char`20line`20`5B256`5D; X`20`20struct`20dsc$descriptor_s`20line_desc`20=`20`7B X`20`20`20`20sizeof(line),`20DSC$K_DTYPE_T,`20DSC$K_CLASS_S,`20FILLIN X`20`20`7D; X X`20`20line_desc.dsc$a_pointer`20=`20line; X X/* X`20*`20Get`20optional`20HELP`20request. X`20*/ X`20`20cli$get_value(`26p1_desc,`20`26line_desc,`20`26line_desc.dsc$w_length); V X X/* X`20*`20The`20library`20routine`20does`20it`20all. X`20*/ X`20`20lbr$output_help(lib$put_output,`200,`20`26line_desc,`20`26library_desc, V X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`200,`20lib$get_input); X X`20`20return`20SS$_NORMAL; X`7D X X/* X`20*`20Routine`20to`20handle`20SHOW`20ENVIRONMENT`20command.`20`20Also`20invok Ved`20when`20the X`20*`20`20SET`20ENVIRONMENT`20command`20is`20run. X`20*/ Xunsigned`20int Xcmd_showenv`20(void) X`7B X`20`20char`20message`20`5B256`5D; X`20`20struct`20dsc$descriptor_s`20message_desc`20=`20`7B X`20`20`20`20sizeof(message),`20DSC$K_DTYPE_T,`20DSC$K_CLASS_S,`20FILLIN X`20`20`7D; X X`20`20const`20int`20NODES_PER_LINE`20=`208; X`20`20int`20i`20=`200; X`20`20unsigned`20int`20status; X X`20`20message_desc.dsc$a_pointer`20=`20message; X X`20`20lib$signal(rcom_env); X`20`20for`20(i`20=`200;`20*(nodelist`5Bi`5D.name);`20i++)`20`7B X`20`20`20`20if`20((i`20%`20NODES_PER_LINE)`20==`200)`20`7B X`20`20`20`20`20`20strcpy(message,`20"Nodes:`20`20`20`20"); X`20`20`20`20`7D X X`20`20`20`20if`20(!`20strcmp(nodelist`5Bi`5D.name,`20"0"))`20`7B X`20`20`20`20`20`20strcat(message,`20"Current`20node"); X`20`20`20`20`7D X`20`20`20`20else`20`7B X`20`20`20`20`20`20strcat(message,`20nodelist`5Bi`5D.name); X`20`20`20`20`7D X X`20`20`20`20if`20(`20`20`20`20((i`20%`20NODES_PER_LINE)`20==`20(NODES_PER_LINE V`20-`201)) X`20`20`20`20`20`20`20`20`20`7C`7C`20(!`20*(nodelist`5Bi+1`5D.name)) X`20`20`20`20`20`20`20)`20`7B X`20`20`20`20`20`20message_desc.dsc$w_length`20=`20strlen(message); X`20`20`20`20`20`20if`20(!`20((status`20=`20lib$put_output(`26message_desc))`20 V`26`201))`20`7B X`20`20`20`20`20`20`20`20lib$signal(status); X`20`20`20`20`20`20`7D X`20`20`20`20`7D X`20`20`20`20else`20`7B X`20`20`20`20`20`20strcat(message,`20",`20"); X`20`20`20`20`7D X`20`20`7D X X`20`20if`20(*username)`20`7B X`20`20`20`20strcpy(message,`20"Username`20"); X`20`20`20`20strcat(message,`20username); X`20`20`7D X`20`20else`20`7B X`20`20`20`20strcpy(message,`20"Proxy`20or`20default`20access"); X`20`20`7D X X`20`20strcat(message,`20"`20will`20be`20used`20to`20connect`20to`20remote`20no Vde"); X`20`20if`20(i`20>`201)`20`7B`09`09/*`20more`20than`20one`20node`20*/ X`20`20`20`20strcat(message,`20"s"); X`20`20`7D X X`20`20message_desc.dsc$w_length`20=`20strlen(message); X`20`20if`20(!`20((status`20=`20lib$put_output(`26message_desc))`20`26`201))`20 V`7B X`20`20`20`20lib$signal(status); X`20`20`7D X X`20`20return`20SS$_NORMAL; X`7D X X/* X`20*`20Routine`20to`20prompt`20user`20for`20a`20password. X`20*/ Xstatic Xvoid Xget_password`20(char`20*password) X`7B X`20`20unsigned`20int`20status; X`20`20QIO_IOSB`20iosb; X`20`20char`20*prompt`20=`20"`5Cr`5CnPassword:`20"; X`20`20char`20*crlf`20=`20"`5Cr`5Cn"; X X/* X`20*`20Prompt`20user`20for`20password`20(without`20echo). X`20*/ X`20`20status`20=`20sys$qiow(0,`20command_chan,`20(IO$_READPROMPT`7CIO$M_NOECHO V),`20`26iosb,`200,`200, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20password,`20PASSWO VRD_SIZE,`200,`200,`20prompt,`20strlen(prompt)); X`20`20if`20(status`20`26`201)`20`7B X`20`20`20`20status`20=`20iosb.status; X`20`20`7D X`20`20if`20(!`20(status`20`26`201))`20`7B X`20`20`20`20lib$signal(status); X`20`20`7D X X`20`20password`5Biosb.count`5D`20=`20'`5C0';`09`09/*`20mark`20end`20of`20strin Vg`20*/ X X`20`20status`20=`20sys$qiow(0,`20command_chan,`20IO$_WRITEVBLK,`20`26iosb,`200 V,`200, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20crlf,`20strlen(crl Vf),`200,`200,`200,`200); X`20`20if`20(status`20`26`201)`20`7B X`20`20`20`20status`20=`20iosb.status; X`20`20`7D X`20`20if`20(!`20(status`20`26`201))`20`7B X`20`20`20`20lib$signal(status); X`20`20`7D X`7D X X/* X`20*`20Routine`20to`20close`20open`20channel`20for`20one`20node. X`20*/ Xstatic Xvoid`20close_one_net_channel`20(Node`20*nodeptr) X`7B X`20`20unsigned`20int`20status; X X`20`20if`20(!`20((status`20=`20sys$dassgn(nodeptr->channel))`20`26`201))`20`7B V X`20`20`20`20lib$signal(status); X`20`20`7D X X`20`20nodeptr->channel`20=`200; X`7D X X/* X`20*`20Routine`20to`20close`20all`20open`20channels. X`20*/ Xstatic Xvoid`20close_net_channels`20(void) X`7B X`20`20int`20i; X X`20`20for`20(i`20=`200;`20(i`20<`20MAX_NODES)`20`26`26`20(nodelist`5Bi`5D.chan Vnel);`20i++)`20`7B X`20`20`20`20close_one_net_channel(`26nodelist`5Bi`5D); X`20`20`7D X`7D X X/* X`20*`20Routine`20to`20return`20a`20string`20corresponding`20to`20all`20the`20t Vranslations X`20*`20`20of`20a`20logical`20name,`20separated`20by`20commas. X`20*/ Xstatic Xint Xtranslate_logical`20(char`20*result,`20char`20*name,`20char`20*table) X`7B X`20`20char`20translation`20`5BLNM$C_NAMLENGTH`20+`201`5D; X`20`20unsigned`20short`20retlen; X`20`20int`20index; X`20`20int`20max_index; X`20`20unsigned`20int`20status; X X`20`20struct`20dsc$descriptor_s`20name_desc`20=`20`7B X`20`20`20`20FILLIN,`20DSC$K_DTYPE_T,`20DSC$K_CLASS_S,`20FILLIN X`20`20`7D; X X`20`20struct`20dsc$descriptor_s`20table_desc`20=`20`7B X`20`20`20`20FILLIN,`20DSC$K_DTYPE_T,`20DSC$K_CLASS_S,`20FILLIN X`20`20`7D; X X`20`20ITEMLIST`20max_index_itl`20`5B`5D`20=`20`7B X`20`20`20`20sizeof(int),`20LNM$_MAX_INDEX,`20FILLIN,`200, X`20`20`20`200,`200,`200,`200 X`20`20`7D; X X`20`20ITEMLIST`20translation_itl`20`5B`5D`20=`20`7B X`20`20`20`20sizeof(int),`20LNM$_INDEX,`20FILLIN,`200, X`20`20`20`20LNM$C_NAMLENGTH,`20LNM$_STRING,`20FILLIN,`20FILLIN, X`20`20`20`200,`200,`200,`200 X`20`20`7D; X X`20`20name_desc.dsc$w_length`20=`20strlen(name_desc.dsc$a_pointer`20=`20name); V X`20`20table_desc.dsc$w_length`20=`20strlen(table_desc.dsc$a_pointer`20=`20tabl Ve); X X`20`20max_index_itl`5B0`5D.bufaddr`20=`20`26max_index; X`20`20translation_itl`5B0`5D.bufaddr`20=`20`26index; X`20`20translation_itl`5B1`5D.bufaddr`20=`20translation; X`20`20translation_itl`5B1`5D.retaddr`20=`20`26retlen; X X`20`20*result`20=`20'`5C0'; X`20`20status`20=`20sys$trnlnm(0,`20`26table_desc,`20`26name_desc,`200,`20max_i Vndex_itl); X`20`20if`20(status`20==`20SS$_NOLOGNAM)`20`7B X`20`20`20`20return`200; X`20`20`7D X`20`20else`20if`20(!`20(status`20`26`201))`20`7B X`20`20`20`20lib$signal(status); X`20`20`7D X X`20`20for`20(index`20=`200;`20index`20<=`20max_index;`20index++)`20`7B X`20`20`20`20status`20=`20sys$trnlnm(0,`20`26table_desc,`20`26name_desc,`200, V`20translation_itl); X`20`20`20`20if`20(!`20(status`20`26`201))`20`7B X`20`20`20`20`20`20lib$signal(status); X`20`20`20`20`7D X X`20`20`20`20if`20(index)`20`7B`09`09/*`20not`20first`20item`20in`20list`20*/ X`20`20`20`20`20`20strcat(result,`20","); X`20`20`20`20`7D X X`20`20`20`20translation`5Bretlen`5D`20=`20'`5C0'; X`20`20`20`20strcat(result,`20translation); X`20`20`7D X X`20`20return`20(*result`20!=`20'`5C0'); X`7D X X#define`20MAX_DEPTH`2010 X/* X`20*`20Routine`20to`20add`20a`20node`20to`20the`20list`20being`20built`20up. X`20*`20Increases`20nodeptr`20to`20point`20past`20node(s)`20added;`20returns`20 VNULL`20on`20error. X`20*/ Xstatic XNode`20* Xadd_node`20(Node`20*nodeptr,`20char`20*name,`20int`20depth) X`7B X`20`20char`20namelist`20`5BLNM$C_NAMLENGTH`20+`201`5D; X X`20`20Node`20*np; X`20`20char`20*cp; X`20`20int`20duplicate; X X/* X`20*`20Uppercase`20name,`20and`20strip`20any`20leading`20and/or`20trailing`20s Vpaces. X`20*/ X`20`20for`20(cp`20=`20name;`20*cp;`20cp++)`20`7B X`20`20`20`20*cp`20=`20toupper(*cp); X`20`20`7D X X`20`20while`20((*name)`20`26`26`20(*name`20<=`20'`20'))`20`7B X`20`20`20`20++name; X`20`20`7D X X`20`20while`20((*name)`20`26`26`20(name`5Bstrlen(name)`20-`201`5D`20<=`20'`20' V))`20`7B X`20`20`20`20name`5Bstrlen(name)`20-`201`5D`20=`20'`5C0'; X`20`20`7D X X/* X`20*`20If`20name`20is`20a`20logical`20name,`20look`20it`20up`20(recursively). V X`20*/ X`20`20if`20(*name)`20`7B X`20`20`20`20if`20(translate_logical(namelist,`20name,`20"RCOM_NODE_TABLE"))`20 V`7B X`20`20`20`20`20`20if`20(depth`20>`20MAX_DEPTH)`20`7B X`20`20`20`20`20`20`20`20lib$signal(rcom_catcherr,`200,`20rcom_logtoodeep); X`20`20`20`20`20`20`20`20return`20NULL; X`20`20`20`20`20`20`7D X`20`20`20`20`20`20else`20`7B X`20`20`20`20`20`20`20`20char`20*cp`20=`20namelist; X`20`20`20`20`20`20`20`20int`20last`20=`200; X X`20`20`20`20`20`20`20`20while`20(!`20last)`20`7B X`20`20`20`20`20`20`20`20`20`20int`20sublen`20=`20strcspn(cp,`20",");`09/*`20fi Vnd`20comma`20*/ X X`20`20`20`20`20`20`20`20`20`20last`20=`20(sublen`20==`20strlen(cp));`09/*`20if V`20none,`20this`20is`20the`20last`20*/ X`20`20`20`20`20`20`20`20`20`20cp`5Bsublen`5D`20=`20'`5C0'; X`20`20`20`20`20`20`20`20`20`20if`20((nodeptr`20=`20add_node(nodeptr,`20cp,`20d Vepth`20+`201))`20==`20NULL)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20break; X`20`20`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20`20`20cp`20+=`20sublen`20+`201;`09`09/*`20next`20eleme Vnt`20in`20list`20*/ X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`7D X`20`20`20`20`7D X`20`20`20`20else`20`7B X/* X`20*`20Here,`20we`20know`20the`20nodename`20is`20not`20a`20logical`20name. X`20*`20Check`20node`20is`20not`20already`20in`20list. X`20*/ X`20`20`20`20`20`20for`20(duplicate`20=`200,`20np`20=`20nodelist;`20np`20<`20no Vdeptr;`20np++)`20`7B X`20`20`20`20`20`20`20`20if`20(!`20strcmp(np->name,`20name))`20`7B X`20`20`20`20`20`20`20`20`20`20duplicate`20=`201; X`20`20`20`20`20`20`20`20`20`20break; X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`7D X X`20`20`20`20`20`20if`20(!`20duplicate)`20`7B X`20`20`20`20`20`20`20`20strcpy((nodeptr++)->name,`20name); X`20`20`20`20`20`20`7D X`20`20`20`20`7D X`20`20`7D X X`20`20return`20nodeptr; X`7D X X/* X`20*`20Routine`20to`20handle`20SET`20ENVIRONMENT`20command. X`20*/ Xunsigned`20int Xcmd_setenv`20(void) X`7B X`20`20$DESCRIPTOR(cluster_desc,`20"CLUSTER"); X`20`20$DESCRIPTOR(node_desc,`20"NODE"); X`20`20$DESCRIPTOR(username_desc,`20"USERNAME"); X`20`20$DESCRIPTOR(password_desc,`20"PASSWORD"); X`20`20Node`20*nodeptr`20=`20nodelist; X`20`20char`20name`20`5BNODENAME_SIZE`5D; X`20`20unsigned`20short`20retlen; X`20`20unsigned`20int`20status; X X`20`20if`20(cli$present(`26cluster_desc)`20`26`201)`20`7B`09`09/*`20/CLUSTER V`20*/ X`20`20`20`20ITEMLIST`20syi_items`20`5B`5D`20=`20`7B X`20`20`20`20`20`20NODENAME_SIZE,`20SYI$_NODENAME,`20FILLIN,`20FILLIN, X`20`20`20`20`20`200,`200,`200,`200 X`20`20`20`20`7D; X X`20`20`20`20SS_IOSB`20syi_iosb; X`20`20`20`20int`20csidadr`20=`20-1; X X`20`20`20`20syi_items`5B0`5D.bufaddr`20=`20name; X`20`20`20`20syi_items`5B0`5D.retaddr`20=`20`26retlen; X X/* X`20*`20Get`20names`20of`20all`20cluster`20nodes. X`20*/ X`20`20`20`20while`20(1)`20`7B X`20`20`20`20`20`20status`20=`20sys$getsyiw(0,`20`26csidadr,`200,`20syi_items, V`20`26syi_iosb,`200,`200); X`20`20`20`20`20`20if`20(status`20`26`201)`20`7B X`20`20`20`20`20`20`20`20status`20=`20syi_iosb.status; X`20`20`20`20`20`20`7D X X`20`20`20`20`20`20if`20(status`20==`20SS$_NOMORENODE)`20`7B X`20`20`20`20`20`20`20`20break; X`20`20`20`20`20`20`7D X`20`20`20`20`20`20else`20if`20(!`20(status`20`26`201))`20`7B X`20`20`20`20`20`20`20`20lib$signal(status); X`20`20`20`20`20`20`7D X X`20`20`20`20`20`20name`5Bretlen`5D`20=`20'`5C0'; X`20`20`20`20`20`20if`20((nodeptr`20=`20add_node(nodeptr,`20name,`200))`20==`20 VNULL)`20`7B X`20`20`20`20`20`20`20`20break; X`20`20`20`20`20`20`7D X`20`20`20`20`7D X`20`20`7D X`20`20else`20if`20(cli$present(`26node_desc)`20`26`201)`20`7B`09/*`20/NODE=() V`20*/ X`20`20`20`20struct`20dsc$descriptor_s`20name_desc`20=`20`7B X`20`20`20`20`20`20sizeof(name),`20DSC$K_DTYPE_T,`20DSC$K_CLASS_S,`20FILLIN X`20`20`20`20`7D; X`20`20`20`20name_desc.dsc$a_pointer`20=`20name; X X`20`20`20`20while`20((status`20=`20cli$get_value(`26node_desc,`20`26name_desc, V`20`26retlen)) X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20!=`20CLI$_ABSENT X`20`20`20`20`20`20`20`20`20`20)`20`7B X`20`20`20`20`20`20name`5Bretlen`5D`20=`20'`5C0'; X`20`20`20`20`20`20if`20((nodeptr`20=`20add_node(nodeptr,`20name,`200))`20==`20 VNULL)`20`7B X`20`20`20`20`20`20`20`20break; X`20`20`20`20`20`20`7D X`20`20`20`20`7D X`20`20`7D X`20`20else`20`7B`09`09`09`09/*`20default`20node`20list`20*/ X`20`20`20`20char`20*cp`20=`20default_nodes; X`20`20`20`20int`20last`20=`200; X X`20`20`20`20while`20(!`20last)`20`7B X`20`20`20`20`20`20int`20sublen`20=`20strcspn(cp,`20",");`09/*`20find`20comma V`20*/ X X`20`20`20`20`20`20last`20=`20(sublen`20==`20strlen(cp));`09/*`20if`20none,`20t Vhis`20is`20the`20last`20one`20*/ X`20`20`20`20`20`20cp`5Bsublen`5D`20=`20'`5C0'; X`20`20`20`20`20`20if`20((nodeptr`20=`20add_node(nodeptr,`20cp,`200))`20==`20NU VLL)`20`7B X`20`20`20`20`20`20`20`20break; X`20`20`20`20`20`20`7D X X`20`20`20`20`20`20cp`20+=`20sublen`20+`201;`09`09`09/*`20skip`20past`20this`20 Vnode`20*/ X`20`20`20`20`7D X`20`20`7D X X`20`20if`20(nodeptr`20==`20NULL)`20`7B`09`09/*`20there`20was`20an`20error`20*/ V X`20`20`20`20nodeptr`20=`20add_node(nodelist,`20"0",`200);`09/*`20just`20use`20 Vcurrent`20node`20*/ X`20`20`7D X`20`20nodeptr->name`5B0`5D`20=`20'`5C0';`09`09/*`20end`20of`20list`20*/ X X/* X`20*`20Get`20optional`20username`20qualifier. X`20*/ X`20`20if`20(cli$present(`26username_desc)`20`26`201)`20`7B X`20`20`20`20$DESCRIPTOR(u_desc,`20username); X`20`20`20`20if`20(!`20((status`20=`20cli$get_value(`26username_desc,`20`26u_de Vsc,`20`26retlen))`20`26`201))`20`7B X`20`20`20`20`20`20lib$signal(status); X`20`20`20`20`7D X`20`20`20`20username`5Bretlen`5D`20=`20'`5C0'; X`20`20`7D X`20`20else`20`7B X`20`20`20`20strcpy(username,`20default_username); X`20`20`7D X X/* X`20*`20Get`20optional`20password`20qualifier. X`20*/ X`20`20if`20(cli$present(`26password_desc)`20`26`201)`20`7B X`20`20`20`20$DESCRIPTOR(p_desc,`20password); X`20`20`20`20if`20(!`20((status`20=`20cli$get_value(`26password_desc,`20`26p_de Vsc,`20`26retlen))`20`26`201))`20`7B X`20`20`20`20`20`20lib$signal(status); X`20`20`20`20`7D X`20`20`20`20password`5Bretlen`5D`20=`20'`5C0'; X`20`20`7D X`20`20else`20`7B X`20`20`20`20if`20(!`20strcmp(username,`20default_username))`20`7B X`20`20`20`20`20`20strcpy(password,`20default_password); X`20`20`20`20`7D X`20`20`20`20else`20`7B X`20`20`20`20`20`20password`5B0`5D`20=`20'`5C0'; X`20`20`20`20`7D X`20`20`7D X X/* X`20*`20After`20a`20SET`20ENVIRONMENT`20command,`20all`20channels`20get`20re-op Vened. X`20*/ X`20`20close_net_channels(); X X/* X`20*`20Confirm`20(with`20an`20implicit`20SHOW`20ENVIRONMENT`20command),`20unle Vss`20we`20are X`20*`20`20starting`20up`20and`20haven't`20set`20any`20defaults. X`20*/ X`20`20status`20=`20SS$_NORMAL; X`20`20if`20(!`20dont_show_env)`20`7B X`20`20`20`20status`20=`20cmd_showenv();`09/*`20might`20give`20problems`20if`20 VSHOW`20ENV`20has`20params`20*/ X`20`20`7D X X/* X`20*`20If`20password`20is`20a`20star,`20prompt`20for`20real`20password. X`20*/ X`20`20if`20(!`20strcmp(password,`20"*"))`20`7B X`20`20`20`20get_password(password); X`20`20`7D X X`20`20return`20status; X`7D X X/* X`20*`20Handle`20errors`20signalled`20during`20operations`20on`20network`20chan Vnel. X`20*`20For`20network`20errors`20from`20which`20we`20can`20recover`20(typically V`20those`20resulting X`20*`20`20from`20a`20problem`20at`20the`20remote`20node),`20just`20output`20a V`20message`20and`20continue. X`20*/ Xstatic Xunsigned`20int Xnet_handler`20(unsigned`20int`20sigargs`20`5B`5D,`20unsigned`20int`20mechargs V`20`5B`5D) X`7B X`20`20if`20(lib$match_cond(`26sigargs`5B1`5D, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26SS$_ABORT, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26SS$_CONNECFA VIL, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26SS$_INVLOGIN V, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26SS$_LINKEXIT V, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26SS$_LINKABOR VT, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26SS$_NOSUCHNO VDE, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26SS$_NOSUCHOB VJ, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26SS$_NOSUCHUS VER, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26SS$_PATHLOST V, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26SS$_REJECT, V X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26SS$_REMRSRC, V X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26SS$_SHUT, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26SS$_THIRDPAR VTY, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26SS$_UNREACHA VBLE X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20) X`20`20`20`20`20)`20`7B X`20`20`20`20lib$signal(rcom_noderr,`202,`20strlen(current_nodename),`20current V_nodename, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20sigargs`5B1`5D); X X`20`20`20`20return`20SS$_CONTINUE; X`20`20`7D X`20`20else`20`7B X`20`20`20`20return`20SS$_RESIGNAL; X`20`20`7D X`7D X X/* X`20*`20Action`20routine`20called`20from`20SYS$PUTMSG`20to`20when`20the`20RCOM_ VOUTPUT`20message X`20*`20`20should`20be`20kept`20(so`20we`20can`20output`20it`20to`20the`20DO`20 V/OUTPUT`20file). X`20*`20The`20parameter`20'actprm'`20is`20a`20C`20string`20pointer`20where`20we V`20write`20the`20message. X`20*/ Xstatic Xunsigned`20int Xrcom_output_actrtn`20(struct`20dsc$descriptor_s`20*desc,`20unsigned`20int`20ac Vtprm) X`7B X`20`20char`20*cp`20=`20(char`20*)`20actprm; X X`20`20memcpy(cp,`20desc->dsc$a_pointer,`20desc->dsc$w_length); X`20`20cp`5Bdesc->dsc$w_length`5D`20=`20'`5C0';`09/*`20terminate`20C`20string V`20*/ X X`20`20return`200;`09`09/*`20redirected,`20so`20don't`20output`20message`20*/ X`7D X X/* X`20*`20Routine`20to`20handle`20DO`20command. X`20*/ Xunsigned`20int Xcmd_do`20(void) X`7B X`20`20$DESCRIPTOR(p1_desc,`20"P1"); X`20`20$DESCRIPTOR(output_desc,`20"OUTPUT"); X`20`20$DESCRIPTOR(exclude_desc,`20"EXCLUDE"); X X`20`20char`20outfile`20`5B256`5D; X`20`20struct`20dsc$descriptor_s`20outfile_desc`20=`20`7B X`20`20`20`20sizeof(outfile),`20DSC$K_DTYPE_T,`20DSC$K_CLASS_S,`20FILLIN X`20`20`7D; X X`20`20char`20command`20`5B256`5D; X`20`20struct`20dsc$descriptor_s`20command_desc`20=`20`7B X`20`20`20`20sizeof(command),`20DSC$K_DTYPE_T,`20DSC$K_CLASS_S,`20FILLIN X`20`20`7D; X X`20`20char`20exclude_node`20`5BNODENAME_SIZE`5D; X`20`20struct`20dsc$descriptor_s`20exclude_node_desc`20=`20`7B X`20`20`20`20sizeof(exclude_node),`20DSC$K_DTYPE_T,`20DSC$K_CLASS_S,`20FILLIN X`20`20`7D; X X`20`20unsigned`20short`20command_len; X`20`20unsigned`20int`20status; X`20`20int`20i; X`20`20int`20redirected`20=`200; X`20`20unsigned`20short`20retlen; X X`20`20struct`20RAB`20rab; X`20`20struct`20FAB`20fab; X X`20`20outfile_desc.dsc$a_pointer`20=`20outfile; X`20`20command_desc.dsc$a_pointer`20=`20command; X`20`20exclude_node_desc.dsc$a_pointer`20=`20exclude_node; X X/* X`20*`20Get`20/OUTPUT`20qualifier`20and`20optional`20filename. X`20*/ X`20`20if`20(cli$present(`26output_desc)`20`26`201)`20`7B X`20`20`20`20cli$get_value(`26output_desc,`20`26outfile_desc,`20`26outfile_desc V.dsc$w_length); X X/* X`20*`20Create`20and`20open`20the`20output`20file. X`20*/ X`20`20`20`20fab`20=`20cc$rms_fab;`09`09/*`20initialize`20FAB`20*/ X X`20`20`20`20fab.fab$b_fns`20=`20outfile_desc.dsc$w_length;`09/*`20may`20be`20z Vero`20*/ X`20`20`20`20fab.fab$l_fna`20=`20outfile_desc.dsc$a_pointer; X`20`20`20`20fab.fab$b_dns`20=`20strlen(fab.fab$l_dna`20=`20"RCOM.LIS"); X`20`20`20`20fab.fab$b_rat`20=`20FAB$M_CR; X X`20`20`20`20if`20(!`20((status`20=`20sys$create(`26fab))`20`26`201))`20`7B X`20`20`20`20`20`20lib$signal(status); X`20`20`20`20`7D X X`20`20`20`20rab`20=`20cc$rms_rab;`09`09/*`20initialize`20RAB`20*/ X`20`20`20`20rab.rab$l_fab`20=`20`26fab; X X`20`20`20`20if`20(!`20((status`20=`20sys$connect(`26rab))`20`26`201))`20`7B X`20`20`20`20`20`20lib$signal(status); X`20`20`20`20`7D X X`20`20`20`20redirected`20=`201; X`20`20`7D X X/* X`20*`20Get`20command`20-`20must`20be`20present. X`20*/ X`20`20if`20(!`20((status`20=`20cli$get_value(`26p1_desc,`20`26command_desc,`20 V`26command_len))`20`26`201))`20`7B X`20`20`20`20lib$signal(status); X`20`20`7D X X/* X`20*`20Assume`20initially`20that`20no`20nodes`20will`20be`20excluded. X`20*/ X`20`20for`20(i`20=`200;`20(i`20<`20MAX_NODES)`20`26`26`20(*nodelist`5Bi`5D.nam Ve);`20i++)`20`7B X`20`20`20`20nodelist`5Bi`5D.active`20=`201; X`20`20`7D X X/* X`20*`20Get`20list`20of`20excluded`20nodes. X`20*/ X`20`20while`20((status`20=`20cli$get_value(`26exclude_desc,`20`26exclude_node_ Vdesc,`20`26retlen)) X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20!=`20CLI$_ABSENT X`20`20`20`20`20`20`20`20)`20`7B X`20`20`20`20exclude_node`5Bretlen`5D`20=`20'`5C0'; X X`20`20`20`20for`20(i`20=`200;`20(i`20<`20MAX_NODES)`20`26`26`20(*nodelist`5Bi V`5D.name);`20i++)`20`7B X`20`20`20`20`20`20if`20(!`20strcmp(exclude_node,`20nodelist`5Bi`5D.name))`20 V`7B X`20`20`20`20`20`20`20`20nodelist`5Bi`5D.active`20=`200; X`20`20`20`20`20`20`7D X`20`20`20`20`7D X`20`20`7D X X/* X`20*`20Establish`20handler`20to`20catch`20network-related`20errors. X`20*/ X`20`20lib$establish(net_handler); X`20`20ctrl_c_hit`20=`200;`09`09/*`20No`20control/C`20yet`20*/ X X/* X`20*`20Execute`20command`20on`20all`20non-excluded`20nodes. X`20*/ X`20`20for`20(i`20=`200;`20(i`20<`20MAX_NODES)`20`26`26`20(*nodelist`5Bi`5D.nam Ve)`20`26`26`20(!`20ctrl_c_hit);`20i++)`20`7B X`20`20`20`20Node`20*nodeptr`20=`20`26nodelist`5Bi`5D; X X`20`20`20`20if`20(nodeptr->active)`20`7B X`20`20`20`20`20`20char`20task`20`5B64`5D; X`20`20`20`20`20`20struct`20dsc$descriptor_s`20task_desc`20=`20`7B X`20`20`20`20`20`20`20`20sizeof(task),`20DSC$K_DTYPE_T,`20DSC$K_CLASS_S,`20FILL VIN X`20`20`20`20`20`20`7D; X`20`20`20`20`20`20QIO_IOSB`20iosb; X X`20`20`20`20`20`20task_desc.dsc$a_pointer`20=`20task; X X/* X`20*`20Store`20current`20node`20name`20for`20condition`20handlers. X`20*/ X`20`20`20`20`20`20strcpy(current_nodename,`20nodeptr->name); X X/* X`20*`20If`20channel`20is`20not`20yet`20open`20for`20this`20node,`20open`20it V`20here. X`20*`20First`20build`20remote`20task`20name. X`20*/ X`20`20`20`20`20`20if`20(!`20nodeptr->channel)`20`7B X`20`20`20`20`20`20`20`20strcpy(task,`20nodeptr->name); X`20`20`20`20`20`20`20`20if`20(*username)`20`7B X`20`20`20`20`20`20`20`20`20`20strcat(task,`20"`5C""); X`20`20`20`20`20`20`20`20`20`20strcat(task,`20username); X X`20`20`20`20`20`20`20`20`20`20if`20(*password)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20strcat(task,`20"`20"); X`20`20`20`20`20`20`20`20`20`20`20`20strcat(task,`20password); X`20`20`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20`20`20strcat(task,`20"`5C""); X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20strcat(task,`20"::`5C"0=RCOM_LISTENER`5C""); X`20`20`20`20`20`20`20`20task_desc.dsc$w_length`20=`20strlen(task); X X/* X`20*`20Open`20channel`20to`20remote`20task. X`20*/ X`20`20`20`20`20`20`20`20status`20=`20sys$assign(`26task_desc,`20`26nodeptr->ch Vannel,`200,`200); X`20`20`20`20`20`20`20`20if`20(!`20(status`20`26`201))`20`7B X`20`20`20`20`20`20`20`20`20`20lib$signal(status); X`20`20`20`20`20`20`20`20`20`20continue; X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`7D X X/* X`20*`20Send`20command`20to`20remote`20task. X`20*/ X`20`20`20`20`20`20status`20=`20sys$qiow(0,`20nodeptr->channel,`20IO$_WRITEVBLK V,`20`26iosb,`200,`200, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20comman Vd,`20command_len,`200,`200,`200,`200); X`20`20`20`20`20`20if`20(status`20`26`201)`20`7B X`20`20`20`20`20`20`20`20status`20=`20iosb.status; X`20`20`20`20`20`20`7D X`20`20`20`20`20`20if`20(!`20(status`20`26`201))`20`7B X`20`20`20`20`20`20`20`20lib$signal(status); X`20`20`20`20`20`20`20`20close_one_net_channel(nodeptr); X`20`20`20`20`20`20`20`20continue; X`20`20`20`20`20`20`7D X X/* X`20*`20Output`20node`20identification`20message. X`20*/ X`20`20`20`20`20`20if`20(redirected)`20`7B X`20`20`20`20`20`20`20`20char`20message`20`5B80`5D; X`20`20`20`20`20`20`20`20unsigned`20int`20msgvec`20`5B5`5D`20=`20`7B X`20`20`20`20`20`20`20`20`20`20(0x000f0000`20`7C`20((sizeof(msgvec)`20-`201)`20 V/`204)), X`20`20`20`20`20`20`20`20`20`20rcom_output,`202,`200,`200 X`20`20`20`20`20`20`20`20`7D; X X`20`20`20`20`20`20`20`20msgvec`5B3`5D`20=`20strlen(nodeptr->name); X`20`20`20`20`20`20`20`20msgvec`5B4`5D`20=`20(unsigned`20int)nodeptr->name; X X`20`20`20`20`20`20`20`20sys$putmsg(msgvec,`20rcom_output_actrtn,`200,`20messag Ve); X X`20`20`20`20`20`20`20`20rab.rab$w_rsz`20=`20strlen(rab.rab$l_rbf`20=`20message V); X`20`20`20`20`20`20`20`20if`20(!`20((status`20=`20sys$put(`26rab))`20`26`201)) V`20`7B X`20`20`20`20`20`20`20`20`20`20lib$signal(status); X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`7D X`20`20`20`20`20`20else`20`7B X`20`20`20`20`20`20`20`20lib$signal(rcom_output,`202,`20strlen(nodeptr->name), V`20nodeptr->name); X`20`20`20`20`20`20`7D X X/* X`20*`20Get`20each`20line`20of`20reply. X`20*`20Last`20line`20is`20`5B0x01`200x02`200x03`200x04`5D,`20or`20just`20EOF; V`20however,`20as`20we`20are`20trying X`20*`20`20to`20keep`20the`20network`20channel`20open,`20the`20terminator`20is V`20greatly`20preferred. X`20*`20Note`20that`20we`20make`20no`20provision`20in`20the`20protocol`20to`20s Vend`20the`20terminator`20line X`20*`20`20as`20a`20real`20data`20line`20(in`20other`20words,`20there`20are`20n Vo`20escapes). X`20*/ X`20`20`20`20`20`20while`20(1)`20`7B X`20`20`20`20`20`20`20`20char`20reply`20`5B256`5D; X`20`20`20`20`20`20`20`20struct`20dsc$descriptor_s`20reply_desc`20=`20`7B X`20`20`20`20`20`20`20`20`20`20sizeof(reply),`20DSC$K_DTYPE_T,`20DSC$K_CLASS_S, V`20FILLIN X`20`20`20`20`20`20`20`20`7D; X`20`20`20`20`20`20`20`20char`20terminator_record`20`5B`5D`20=`20`7B X`20`20`20`20`20`20`20`20`20`200x01,`200x02,`200x03,`200x04 X`20`20`20`20`20`20`20`20`7D; X X`20`20`20`20`20`20`20`20reply_desc.dsc$a_pointer`20=`20reply; X X`20`20`20`20`20`20`20`20status`20=`20sys$qiow(0,`20nodeptr->channel,`20IO$_REA VDVBLK,`20`26iosb,`200,`200, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 Vreply,`20sizeof(reply),`200,`200,`200,`200); X`20`20`20`20`20`20`20`20if`20(status`20`26`201)`20`7B X`20`20`20`20`20`20`20`20`20`20status`20=`20iosb.status; X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20if`20(!`20(status`20`26`201))`20`7B X`20`20`20`20`20`20`20`20`20`20if`20(status`20!=`20SS$_LINKDISCON)`20`7B`09/* V`20EOF`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20lib$signal(status); X`20`20`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20`20`20close_one_net_channel(nodeptr); X`20`20`20`20`20`20`20`20`20`20break; X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20if`20(ctrl_c_hit)`20`7B X`20`20`20`20`20`20`20`20`20`20lib$signal(rcom_cancel); X`20`20`20`20`20`20`20`20`20`20close_one_net_channel(nodeptr);`09/*`20throw`20a Vway`20rest`20of`20output`20*/ X`20`20`20`20`20`20`20`20`20`20break; X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20if`20(`20`20`20`20(iosb.count`20==`20sizeof(terminator V_record)) X`20`20`20`20`20`20`20`20`20`20`20`20`20`26`26`20(!`20memcmp(reply,`20terminato Vr_record,`20sizeof(terminator_record))) X`20`20`20`20`20`20`20`20`20`20`20)`20`7B X`20`20`20`20`20`20`20`20`20`20break; X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20if`20(redirected)`20`7B X`20`20`20`20`20`20`20`20`20`20rab.rab$w_rsz`20=`20iosb.count; X`20`20`20`20`20`20`20`20`20`20rab.rab$l_rbf`20=`20reply; X X`20`20`20`20`20`20`20`20`20`20status`20=`20sys$put(`26rab); X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20else`20`7B X`20`20`20`20`20`20`20`20`20`20reply_desc.dsc$w_length`20=`20iosb.count; X`20`20`20`20`20`20`20`20`20`20status`20=`20lib$put_output(`26reply_desc); X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20if`20(!`20(status`20`26`201))`20`7B X`20`20`20`20`20`20`20`20`20`20lib$signal(status); X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`7D X`20`20`20`20`7D X`20`20`7D X X`20`20if`20(redirected)`20`7B X`20`20`20`20if`20(!`20((status`20=`20sys$close(`26fab))`20`26`201))`20`7B X`20`20`20`20`20`20lib$signal(status); X`20`20`20`20`7D X`20`20`7D X X`20`20return`20SS$_NORMAL; X`7D X X/* X`20*`20Routine`20to`20handle`20EXIT`20command. X`20*/ Xunsigned`20int Xcmd_exit`20(void) X`7B X`20`20exit_command_seen`20=`201; X X`20`20return`20SS$_NORMAL; X`7D X X/* X`20*`20Routine`20to`20read`20line`20of`20input`20for`20CLI$DCL_PARSE. X`20*`20Also`20used`20explicitly`20to`20get`20first`20part`20of`20each`20line, V`20since`20we`20have`20to X`20*`20`20parse`20@`20ourselves. X`20*/ Xstatic Xunsigned`20int Xmy_get_input`20(struct`20dsc$descriptor_s`20*resultant_desc, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20struct`20dsc$descriptor_s`20*prompt_ Vdesc, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20unsigned`20short`20*resultant_length V X`20`20`20`20`20`20`20`20`20`20`20`20`20) X`7B X`20`20unsigned`20int`20status; X X`20`20while`20(current_atfile`20!=`20NULL)`20`7B X`20`20`20`20current_atfile->rab.rab$w_usz`20=`20resultant_desc->dsc$w_length; V X`20`20`20`20current_atfile->rab.rab$l_ubf`20=`20resultant_desc->dsc$a_pointer; V X`20`20`20`20status`20=`20sys$get(`26current_atfile->rab); X X`20`20`20`20if`20(status`20==`20RMS$_EOF)`20`7B X`20`20`20`20`20`20Atfile`20*temp_atfile`20=`20current_atfile->previous; X`20`20`20`20`20`20free(current_atfile); X`20`20`20`20`20`20current_atfile`20=`20temp_atfile; X`20`20`20`20`7D X`20`20`20`20else`20`7B X`20`20`20`20`20`20if`20(status`20`26`201)`20`7B X`20`20`20`20`20`20`20`20*resultant_length`20=`20current_atfile->rab.rab$w_rsz; V X`20`20`20`20`20`20`7D X X`20`20`20`20`20`20return`20status; X`20`20`20`20`7D X`20`20`7D X X`20`20status`20=`20smg$read_composed_line( X`20`20`20`20`20`20`20`20`20`20`20`20`20`26keyboard,`200,`20resultant_desc,`20p Vrompt_desc,`20resultant_length X`20`20`20`20`20`20`20`20`20`20`20); X X/* X`20*`20Convert`20SMG`20EOF`20to`20RMS`20EOF;`20otherwise`20we`20get`20a`20spur Vious`20signal. X`20*/ X`20`20if`20(status`20==`20SMG$_EOF)`20`7B X`20`20`20`20status`20=`20RMS$_EOF; X`20`20`7D X X`20`20return`20status; X`7D X X/* X`20*`20Routine`20to`20handle`20@filename`20command. X`20*`20For`20now,`20does`20not`20get`20filename`20from`20CLI$`20routines. X`20*/ Xstatic Xunsigned`20int Xprocess_at`20(char`20*filename) X`7B X`20`20unsigned`20int`20status; X`20`20Atfile`20*atfile; X X/* X`20*`20Allocate`20memory`20to`20control`20this`20file. X`20*/ X`20`20if`20((atfile`20=`20malloc(sizeof(Atfile)))`20==`20NULL)`20`7B X`20`20`20`20return`20rcom_insvirmem; X`20`20`7D X X/* X`20*`20Open`20the`20file. X`20*/ X`20`20atfile->fab`20=`20cc$rms_fab;`09`09/*`20initialize`20FAB`20*/ X X`20`20atfile->fab.fab$b_fns`20=`20strlen(atfile->fab.fab$l_fna`20=`20filename) V; X`20`20atfile->fab.fab$b_dns`20=`20strlen(atfile->fab.fab$l_dna`20=`20".RCM"); V X`20`20if`20(!`20((status`20=`20sys$open(`26atfile->fab))`20`26`201))`20`7B X`20`20`20`20return`20status; X`20`20`7D X X`20`20atfile->rab`20=`20cc$rms_rab;`09`09/*`20initialize`20RAB`20*/ X`20`20atfile->rab.rab$l_fab`20=`20`26atfile->fab; X X`20`20if`20(!`20((status`20=`20sys$connect(`26atfile->rab))`20`26`201))`20`7B V X`20`20`20`20return`20status; X`20`20`7D X X`20`20atfile->previous`20=`20current_atfile; X`20`20current_atfile`20=`20atfile; X X`20`20return`20SS$_NORMAL; X`7D X Xstatic`20void`20enable_ast`20(void); X X/* X`20*`20AST`20called`20when`20user`20hits`20control-C. X`20*/ Xstatic Xvoid Xctrl_c_ast`20(int`20parm) X`7B X`20`20enable_ast();`09`09`09/*`20enable`20the`20AST`20again`20*/ X X`20`20ctrl_c_hit`20=`201;`09`09/*`20so`20other`20routines`20can`20see`20it`20* V/ X`7D X X/* X`20*`20Establish`20control/C`20AST`20on`20SYS$COMMAND. X`20*`20If`20it's`20not`20a`20terminal,`20ignore`20the`20error. X`20*`20Routine`20is`20not`20declared`20static,`20to`20keep`20AXP`20compiler`20 Vhappy. X`20*/ Xstatic Xvoid Xenable_ast`20() X`7B X`20`20QIO_IOSB`20iosb; X`20`20unsigned`20int`20status; X X`20`20status`20=`20sys$qiow(0,`20command_chan,`20(IO$_SETMODE`7CIO$M_CTRLCAST) V,`20`26iosb,`200,`200, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20ctrl_c_ast,`200, V`200,`200,`200,`200); X`20`20if`20(status`20`26`201)`20`7B X`20`20`20`20status`20=`20iosb.status; X`20`20`7D X`20`20if`20(!`20(status`20`26`201))`20`7B X`20`20`20`20if`20(status`20!=`20SS$_ILLIOFUNC)`20`7B X`20`20`20`20`20`20lib$signal(status); X`20`20`20`20`7D X`20`20`7D X`7D X X/* X`20*`20Main`20routine. X`20*/ Xmain`20() X`7B X`20`20$DESCRIPTOR(prompt_desc,`20"RCOM>`20"); X`20`20$DESCRIPTOR(set_environment_desc,`20"SET`20ENVIRONMENT"); X X`20`20char`20command`20`5B256`5D; X`20`20struct`20dsc$descriptor_s`20command_desc`20=`20`7B X`20`20`20`20sizeof(command),`20DSC$K_DTYPE_T,`20DSC$K_CLASS_S,`20FILLIN X`20`20`7D; X X`20`20unsigned`20int`20status; X`20`20char`20*cp; X`20`20int`20i; X`20`20int`20foreign_command; X X#pragma`20nostandard X`20`20globalref`20unsigned`20int`20rcom_tables; X#pragma`20standard X X`20`20command_desc.dsc$a_pointer`20=`20command; X X/* X`20*`20Open`20virtual`20keyboard. X`20*/ X`20`20if`20(!`20((status`20=`20smg$create_virtual_keyboard(`26keyboard))`20`26 V`201))`20`7B X`20`20`20`20lib$signal(status); X`20`20`7D X X/* X`20*`20Open`20channel`20to`20SYS$COMMAND. X`20*/ X`20`20if`20(!`20((status`20=`20sys$assign(`26sys_command_desc,`20`26command_ch Van,`200,`200))`20`26`201))`20`7B X`20`20`20`20lib$signal(status); X`20`20`7D X X/* X`20*`20Enable`20control/C`20AST. X`20*/ X`20`20enable_ast(); X X/* X`20*`20Initialise`20node`20list. X`20*/ X`20`20for`20(i`20=`200;`20i`20<=`20MAX_NODES;`20i++)`20`7B X`20`20`20`20nodelist`5Bi`5D.name`5B0`5D`20=`20'`5C0'; X`20`20`20`20nodelist`5Bi`5D.channel`20=`200; X`20`20`7D X X/* X`20*`20Get`20any`20default`20node`20list;`20otherwise,`20default`20is`20local V`20node`20only. X`20*/ X`20`20if`20(translate_logical(default_nodes,`20"RCOM_NODES",`20"LNM$FILE_DEV") V)`20`7B X`20`20`20`20for`20(cp`20=`20default_nodes;`20*cp;`20cp++)`20`7B X`20`20`20`20`20`20*cp`20=`20toupper(*cp); X`20`20`20`20`7D X`20`20`20`20dont_show_env`20=`200; X`20`20`7D X`20`20else`20`7B X`20`20`20`20strcpy(default_nodes,`20"0"); X`20`20`7D X X/* X`20*`20Get`20any`20default`20username`20and`20possibly`20also`20default`20pass Vword. X`20*/ X`20`20if`20(translate_logical(default_username,`20"RCOM_USERNAME",`20"LNM$FILE V_DEV"))`20`7B X`20`20`20`20dont_show_env`20=`200; X`20`20`20`20translate_logical(default_password,`20"RCOM_PASSWORD",`20"LNM$FILE V_DEV"); X`20`20`7D X X/* X`20*`20Initialise`20with`20a`20SET`20ENVIRONMENT`20command. X`20*/ X`20`20status`20=`20cli$dcl_parse(`26set_environment_desc,`20`26rcom_tables); X`20`20if`20(!`20(status`20`26`201))`20`7B X`20`20`20`20lib$signal(status); X`20`20`7D X`20`20cli$dispatch();`09`09/*`20ignore`20returned`20status`20*/ X X`20`20dont_show_env`20=`200;`09`09/*`20show`20environment`20from`20now`20on`20 V*/ X X/* X`20*`20Look`20for`20a`20foreign`20command`20string. X`20*/ X`20`20if`20(!`20((status`20= X`20`20`20`20`20`20`20`20`20`20lib$get_foreign(`26command_desc,`200,`20`26comma Vnd_desc.dsc$w_length,`200) X`20`20`20`20`20`20`20`20)`20`26`201))`20`7B X`20`20`20`20lib$signal(status); X`20`20`7D X X`20`20foreign_command`20=`20(command_desc.dsc$w_length`20>`200); X X`20`20while`20(!`20exit_command_seen)`20`7B X`20`20`20`20if`20(!`20foreign_command)`20`7B X`20`20`20`20`20`20command_desc.dsc$w_length`20=`20sizeof(command); X X`20`20`20`20`20`20status`20=`20my_get_input(`26command_desc, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`26prompt_desc, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`26command_desc.dsc$w_length X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20); X`20`20`20`20`20`20if`20(status`20==`20RMS$_EOF)`20`7B X`20`20`20`20`20`20`20`20break; X`20`20`20`20`20`20`7D X`20`20`20`20`20`20else`20if`20(!`20(status`20`26`201))`20`7B X`20`20`20`20`20`20`20`20lib$signal(status); X`20`20`20`20`20`20`7D X`20`20`20`20`7D X X/* X`20*`20Look`20to`20see`20if`20first`20thing`20on`20line`20is`20an`20@;`20if`20 Vso,`20parse`20it`20ourselves. X`20*/ X`20`20`20`20command`5Bcommand_desc.dsc$w_length`5D`20=`20'`5C0'; X`20`20`20`20for`20(cp`20=`20command;`20((*cp`20==`20'`20')`20`7C`7C`20(*cp`20= V=`20'`5Ct'));`20cp++)`20`7B X`20`20`20`20`20`20/*`20skip`20blanks`20*/; X`20`20`20`20`7D X X`20`20`20`20if`20(*cp`20==`20'@')`20`7B X`20`20`20`20`20`20while`20((*++cp`20==`20'`20')`20`7C`7C`20(*cp`20==`20'`5Ct') V)`20`7B X`20`20`20`20`20`20`20`20/*`20skip`20blanks`20after`20@`20*/; X`20`20`20`20`20`20`7D X X`20`20`20`20`20`20if`20(!`20((status`20=`20process_at(cp))`20`26`201))`20`7B X`20`20`20`20`20`20`20`20lib$signal(status); X`20`20`20`20`20`20`7D X`20`20`20`20`7D X`20`20`20`20else`20`7B X`20`20`20`20`20`20status`20=`20cli$dcl_parse(`26command_desc,`20`26rcom_tables V,`20my_get_input, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20my_get_input,`20`26prompt_desc); X`20`20`20`20`20`20if`20(status`20==`20RMS$_EOF)`20`7B X`20`20`20`20`20`20`20`20break; X`20`20`20`20`20`20`7D X`20`20`20`20`20`20else`20if`20(status`20`26`201)`20`7B X`20`20`20`20`20`20`20`20status`20=`20cli$dispatch(); X X`20`20`20`20`20`20`20`20if`20(!`20(status`20`26`201))`20`7B X`20`20`20`20`20`20`20`20`20`20lib$signal(status);`09/*`20invalid`20routine`20o Vr`20other`20major`20problem`20*/ X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`7D X`20`20`20`20`7D X X`20`20`20`20if`20(foreign_command)`20`7B X`20`20`20`20`20`20break; X`20`20`20`20`7D X`20`20`7D X X/* X`20*`20Close`20channel`20to`20SYS$COMMAND. X`20*/ X`20`20if`20(!`20((status`20=`20sys$dassgn(command_chan))`20`26`201))`20`7B X`20`20`20`20lib$signal(status); X`20`20`7D X`7D $ call unpack RCOM.C;1 973369127 "" 66 2 6 $! $ create 'f' X.autoparagraph X.paragraph`200,1,2 X.left`20margin`205 X.right`20margin`2072 X.justify X X.i`20-5;1`20@ X XRequests`20that`20RCOM`20read`20subsequent`20command`20input`20from`20the Xspecific`20file`20or`20device.`20`20@-command`20files`20may`20be`20nested`20in Vdefinitely. X XFormat: X X.b`20.nj`20.i`202 X@`20filespec X.j X X.i`20-5;2`20Parameter X Xfilespec X XSpecifies`20either`20the`20input`20device`20or`20the`20command`20procedure Xyou`20want`20to`20execute.`20`20The`20default`20file`20type`20is`20.RCM.`20`20 VWildcard Xcharacters`20are`20not`20allowed`20in`20the`20file`20specification. X X.i`20-5;2`20Example X X.b`20.lm`20+5`20.nj`20.i`20-5 X.br;1.###$`20CREATE`20DIRCOM.RCM X.br;SET`20ENVIRONMENT/NODE=(VAX1,`20VAX2,`20VAX3)/USERNAME=PRIVUSER X.br;DO`20DIRECTORY X.br;$`20MCR`20RCOM X.br;RCOM>`20@DIRCOM X.br;RCOM-I-ENV,`20current`20command`20environment: X.br;Nodes:####VAX1,`20VAX2,`20VAX3 X.br;Username`20PRIVUSER`20will`20be`20used`20to`20connect`20to`20remote`20node Vs X.br;%RCOM-I-OUTPUT,`20command`20execution`20on`20VAX1 X.br;###_. X.br;###_. X.br;%RCOM-I-OUTPUT,`20command`20execution`20on`20VAX2 X.br;###_. X.br;###_. X.br;%RCOM-I-OUTPUT,`20command`20execution`20on`20VAX3 X.br;###_. X.br;###_. X.br;RCOM> X.lm`20-5`20.j X XThis`20example`20shows`20how`20to`20create`20a`20command`20procedure`20that`20 Vsets Xthe`20RCOM`20environment`20to`20three`20remote`20nodes,`20and`20executes`20a V`20command Xon`20each`20node.`20`20These`20commands`20execute`20when`20you`20enter`20the X@DIRCOM`20command. X X.i`20-5;1`20ATTACH X XTransfers`20control`20from`20your`20current`20process`20(which`20then Xhibernates)`20to`20the`20specified`20process`20in`20your`20job. X XThe`20ATTACH`20and`20SPAWN`20commands`20cannot`20be`20used`20if`20your`20termi Vnal`20has Xan`20associated`20mailbox. X XFormat: X X.b`20.nj`20.i`202 XATTACH`20`5Bprocess-name`5D X.j X X.i`20-5;2`20Parameter X X.i`20-5;process-name X XSpecifies`20the`20name`20of`20a`20parent`20process`20or`20a`20spawned`20subpro Vcess`20to Xwhich`20control`20passes.`20The`20process`20must`20already`20exist,`20be`20par Vt`20of Xyour`20current`20job`20tree,`20and`20share`20the`20same`20input`20stream`20as V`20your Xcurrent`20process.`20However,`20the`20process`20cannot`20be`20your`20current Xprocess`20or`20a`20subprocess`20created`20with`20the`20/NOWAIT`20qualifier. X XProcess`20names`20can`20contain`20from`201`20to`2015`20alphanumeric`20characte Vrs. XIf`20a`20connection`20to`20the`20specified`20process`20cannot`20be`20made,`20a Vn`20error Xmessage`20is`20displayed. X X.i`20-5;2`20Qualifier X X.i`20-5;/PARENT X`20`20`20 XAllows`20you`20to`20attach`20to`20your`20process'`20parent`20process.`20If`20t Vhere`20is Xno`20parent`20process,`20you`20receive`20an`20error`20message. X X.i`20-5;2`20Example X X.b`20.lm`20+5`20.nj X.br;$`20SPAWN X.br;%DCL-S-SPAWNED,`20process`20SYSTEM__1`20spawned X.br;%DCL-S-ATTACHED,`20terminal`20now`20attached`20to`20process`20SYSTEM__1 X.br;$`20RUN`20SYS$SYSTEM:RCOM X.br;RCOM>`20ATTACH`20SYSTEM X.br;%DCL-S-RETURNED,`20control`20returned`20to`20process`20SYSTEM X.br;$ X.lm`20-5`20.j X XIn`20this`20example,`20the`20SPAWN`20command`20creates`20a`20subprocess X(SYSTEM__1).`20After`20you`20invoke`20RCOM`20and`20enter`20the`20ATTACH Xcommand,`20you`20transfer`20the`20terminal's`20control`20back`20to`20the`20par Vent Xprocess`20(SYSTEM). X X.i`20-5;1`20DO X XExecutes`20a`20DCL`20command`20or`20DCL`20command`20procedure`20on`20all`20nod Ves`20in Xthe`20current`20environment. X XRequires`20the`20privileges`20of`20the`20DCL`20command`20being`20executed. X XYou`20can`20interrupt`20a`20DO`20command`20with`20control/C.`20`20Note`20that V`20if`20the`20command Xis`20currently`20executing`20on`20a`20node,`20it`20will`20complete`20on`20that V`20node`20before`20the Xcontrol/C`20is`20recognised`20(unlike`20SYSMAN,`20which`20interrupts`20the`20c Vommand Xin`20progress`20on`20the`20remote`20node).`20`20So`20control/C`20will`20stop V`20the Xcommand`20from`20executing`20on`20subsequent`20nodes`20in`20the`20current`20en Vvironment`20only. X XFormat: X X.b`20.nj`20.i`202 XDO`20`5Bcommand-line`5D X.j X X.i`20-5;2`20Parameter X X.i`20-5;command-line X XSpecifies`20a`20command`20string`20that`20RCOM`20passes`20to`20the`20DCL`20for V Xexecution.`20For`20complete`20information`20on`20DCL`20command`20syntax,`20ref Ver Xto`20the`20VMS`20DCL`20Dictionary. X X.i-5;2`20Qualifiers X X.b`20.i-5;/EXCLUDE X X/EXCLUDE=(node1,node2,...) X XSpecifies`20nodes`20on`20which`20this`20command`20is`20not`20to`20be`20execute Vd.`20`20The`20nodes Xspecified`20are`20removed`20from`20the`20current`20list`20(see`20SHOW`20ENVIRO VNMENT)`20for`20the Xduration`20of`20this`20DO`20command`20only. X XNodenames`20in`20the`20/EXCLUDE`20list`20are`20not`20looked`20up`20in`20the`20 VRCOM__NODE__TABLE Xlogical`20name`20table,`20unlike`20those`20on`20the`20SET`20ENVIRONMENT`20/NOD VE`20command. X X.b`20.i-5;/OUTPUT X X/OUTPUT`5B=filespec`5D X XRecords`20output`20from`20the`20command`20in`20the`20specified`20file,`20which V`20is Xlocated`20on`20the`20node`20from`20which`20you`20are`20executing`20RCOM.`20Pos Vition Xthe`20qualifier`20immediately`20after`20the`20DO`20command.`20The`20default`20 Vfile Xspecification`20is`20RCOM.LIS`20in`20the`20current`20device`20and`20directory. V XRCOM`20prefaces`20output`20with`20the`20message`20"%RCOM-I-OUTPUT,`20command Xexecution`20on`20node`20xxxxxx." X X.i-5;2`20Examples X X.b`20.lm`20+5`20.nj`20.i`20-5 X.br;1.###RCOM>`20SET`20ENVIRONMENT/CLUSTER X.br;RCOM>`20DO/OUTPUT`20SHOW`20DEVICE X.lm`20-5`20.j X XThe`20first`20command`20in`20this`20example`20defines`20the`20management Xenvironment`20to`20be`20the`20cluster`20where`20RCOM`20is`20running.`20`20The V Xsecond`20command`20executes`20a`20DCL`20command`20on`20each`20node`20in`20the V Xcluster.`20Output`20goes`20to`20the`20file`20RCOM.LIS`20rather`20than`20to`20t Vhe Xterminal. X X.b`20.lm`20+5`20.nj`20.i`20-5 X.br;2.###RCOM>`20SET`20ENVIRONMENT/NODE=(SCSI1,`20SCSI2,`20QBUS1) X.br;RCOM>`20DO/EXCLUDE=QBUS1`20SHOW`20DEVICE`20DK X.lm`20-5`20.j X XThe`20first`20command`20in`20this`20example`20defines`20the`20management Xenvironment`20to`20be`20the`20nodes`20SCSI1,`20SCSI2,`20and`20QBUS1.`20`20The V Xsecond`20command`20executes`20a`20DCL`20command`20on`20nodes`20SCSI1`20and`20S VCSI2`20only. X X.b`20.lm`20+5`20.nj`20.i`20-5 X.br;3.###$`20RCOM`20=`20"$SYS$SYSTEM:RCOM" X.br;$`20DEFINE`20/USER`20RCOM__NODES`20SYS1,SYS2 X.br;$`20COMMAND`20=`20"DIRECTORY`20*.LOG" X.br;$`20RCOM`20DO`20'COMMAND' X.br;RCOM-I-ENV,`20current`20command`20environment: X.br;Nodes:####SYS1,`20SYS2 X.br;Proxy`20or`20default`20access`20will`20be`20used`20to`20connect`20to`20rem Vote`20nodes X.br;%RCOM-I-OUTPUT,`20command`20execution`20on`20SYS1 X.br;###_. X.br;###_. X.br;%RCOM-I-OUTPUT,`20command`20execution`20on`20SYS2 X.br;###_. X.br;###_. X.lm`20-5`20.j X XThis`20example`20illustrates`20the`20use`20of`20a`20foreign`20command`20and`20 Vthe`20RCOM__NODES Xvariable`20to`20run`20a`20single`20RCOM`20command`20which`20is`20held`20in`20a V`20DCL`20variable. X(With`20SYSMAN,`20this`20can`20only`20be`20achieved`20by`20creating`20a`20temp Vorary`20command Xfile). X X.i`20-5;1`20EXIT X XTerminates`20the`20RCOM`20session`20and`20returns`20control`20to`20the`20DCL V`20command`20level.`20 XYou`20can`20also`20press`20Ctrl/Z`20or`20F10`20to`20exit`20at`20any`20time. X XFormat: X X.b`20.nj`20.i`202 XEXIT X.j X X.i`20-5;1`20Overview X XRCOM`20implements`20the`20remote`20command`20functionality`20of`20the`20VMS`20 Vutility XSYSMAN,`20enabling`20you`20to`20manage`20nodes`20or`20clusters`20from`20one`20 Vlocation, Xwith`20some`20modifications. X XFormat: X X.b`20.nj`20.i`202 XRUN`20SYS$SYSTEM:RCOM X.j X X.i`20-5;1`20SET X X.i`20-5;2`20ENVIRONMENT X XDefines`20the`20nodes`20or`20cluster`20to`20which`20subsequent`20commands`20ap Vply. X XRequires`20explicit`20or`20implicit`20access`20to`20all`20nodes`20in`20the`20t Varget`20environment, Xsufficient`20to`20invoke`20the`20DECnet`20object`20RCOM__LISTENER`20and`20exec Vute`20the XDCL`20commands`20to`20be`20specified`20by`20the`20DO`20command. X XFormat: X X.b`20.nj`20.i`202 XSET`20ENVIRONMENT`20`5Bqualifiers`5D X.j X X.i`20-5;3`20Qualifiers X X.i`20-5;/CLUSTER X XDirects`20RCOM`20to`20apply`20subsequent`20commands`20to`20all`20nodes`20in`20 Vthe`20local Xcluster.`20`20Unlike`20SYSMAN,`20RCOM`20cannot`20Specify`20a`20nonlocal`20clus Vter`20by`20naming Xone`20cluster`20member`20with`20the`20/NODE`20qualifier;`20/CLUSTER`20and`20/N VODE`20are`20mutually Xexclusive`20for`20RCOM. X X.i`20-5;/NODE X X/NODE=(node1,node2,...) X XSpecifies`20that`20RCOM`20execute`20subsequent`20commands`20on`20the`20given V`20nodes. X XA`20node`20name`20can`20be`20a`20system`20name,`20cluster`20alias,`20or`20a`20 Vlogical`20name Xwhich`20represents`20one`20or`20more`20other`20node`20names,`20in`20the`20logi Vcal`20name Xtable`20RCOM__NODE__TABLE. X XIf`20this`20qualifier`20is`20not`20used,`20RCOM`20uses`20the`20value`20of`20th Ve`20logical`20name XRCOM__NODES`20(in`20the`20process,`20job,`20group,`20or`20system`20table). X X.i`20-5;/PASSWORD X X/PASSWORD=password X XSpecifies`20that`20this`20password,`20in`20conjunction`20with`20the`20user`20n Vame`20set`20be XUSERNAME,`20should`20be`20used`20for`20access`20control`20purposes`20on`20anot Vher`20node. XRequires`20that`20a`20username`20be`20specified`20(see`20/USERNAME). X XIf`20a`20username`20is`20specified,`20but`20this`20qualifier`20is`20not`20used V,`20RCOM`20uses Xthe`20value`20of`20the`20logical`20name`20RCOM__PASSWORD.`20`20If`20this`20is V`20blank, Xit`20will`20attempt`20proxy`20and/or`20null`20password`20access`20to`20the`20r Vemote`20node(s). X XIf`20the`20password`20is`20specified`20as`20an`20asterisk`20(*),`20RCOM`20prom Vpts`20the Xuser's`20terminal`20for`20a`20password. X X.i`20-5;/USERNAME X X/USERNAME=username X XSpecifies`20that`20this`20user`20name`20should`20be`20used`20for`20access`20co Vntrol Xpurposes`20on`20another`20node.`20`20If`20this`20qualifier`20is`20not`20used, V`20RCOM`20uses Xthe`20value`20of`20the`20logical`20name`20RCOM__USERNAME.`20`20Unlike`20SYSMAN V,`20it`20does`20not Xuse`20the`20current`20username;`20if`20no`20username`20is`20specified`20by`20a Vny`20of`20the Xmethods`20described`20here,`20it`20will`20attempt`20proxy`20and/or`20default V`20access`20to Xthe`20remote`20node(s). X X.i`20-5;3`20Examples X X.b`20.lm`20+5`20.nj`20.i`20-5 X.br;1.###RCOM>`20SET`20ENVIRONMENT/CLUSTER X.br;RCOM-I-ENV,`20current`20command`20environment: X.br;Nodes:####CLUS1,`20CLUS2,`20CLUS3 X.br;Proxy`20or`20default`20access`20will`20be`20used`20to`20connect`20to`20rem Vote`20nodes X.lm`20-5`20.j X XThe`20commands`20in`20this`20example`20define`20the`20command`20environment`20 Vas Xthe`20local`20cluster.`20`20RCOM`20confirms`20the`20new`20environment,`20as`20 Vif`20the`20SHOW XENVIRONMENT`20command`20had`20been`20given`20immediately. X X.b`20.lm`20+5`20.nj`20.i`20-5 X.br;2.###RCOM>`20SET`20ENVIRONMENT/NODE=(CURLY,MOE,LARRY) X.br;RCOM-I-ENV,`20current`20command`20environment: X.br;Nodes:####CURLY,`20MOE,`20LARRY X.br;Proxy`20or`20default`20access`20will`20be`20used`20to`20connect`20to`20rem Vote`20nodes X.lm`20-5`20.j X XThe`20command`20in`20this`20example`20defines`20the`20management`20environment V Xto`20be`20three`20individual`20nodes. X X.b`20.lm`20+5`20.nj`20.i`20-5 X.br;3.###$`20CREATE/NAME__TABLE/PARENT=LNM$SYSTEM__DIRECTORY`20RCOM__NODE__TAB VLE X.br;$`20DEFINE`20LAVCS`20SYS1,SYS2,SYS3,SYS4/TABLE=RCOM__NODE__TABLE X.br;$`20RUN`20SYS$SYSTEM:RCOM X.br;RCOM>`20SET`20ENVIRONMENT/NODE=(LAVCS)/USERNAME=SYSTEM X.br;RCOM-I-ENV,`20current`20command`20environment: X.br;Nodes:####SYS1,`20SYS2,`20SYS3,`20SYS4 X.br;Username`20SYSTEM`20will`20be`20used`20to`20connect`20to`20remote`20nodes V X.lm`20-5`20.j X XThe`20commands`20in`20this`20example`20set`20up`20the`20logical`20name`20table V XRCOM__NODE__TABLE,`20define`20a`20logical`20name`20(LAVCS),`20and`20use`20the V Xlogical`20name`20to`20define`20the`20command`20environment. X X.i`20-5;1`20SHOW X X.i`20-5;2`20ENVIRONMENT X XDisplays`20the`20target`20nodes`20or`20cluster`20where`20RCOM`20is`20executing V`20commands. X XFormat: X X.b`20.nj`20.i`202 XSHOW`20ENVIRONMENT`20`5Bqualifiers`5D X.j X X.i`20-5;3`20Examples X X.b`20.lm`20+5`20.nj`20.i`20-5 X.br;1.###RCOM>`20SHOW`20ENVIRONMENT X.br;RCOM-I-ENV,`20current`20command`20environment: X.br;Nodes:####CURLY,`20MOE,`20LARRY X.br;Proxy`20or`20default`20access`20will`20be`20used`20to`20connect`20to`20rem Vote`20nodes X.lm`20-5`20.j X XThe`20command`20in`20this`20example`20shows`20that`20the`20remote`20command`20 Venvironment Xis`20three`20nodes.`20`20No`20username`20has`20been`20specified,`20so`20a`20pr Voxy`20login`20will Xbe`20used`20to`20activate`20the`20RCOM__LISTENER`20object`20on`20each`20node, V`20unless XRCOM__LISTENER`20has`20been`20given`20a`20default`20username`20and`20password V X(not`20recommended). X X.b`20.lm`20+5`20.nj`20.i`20-5 X.br;2.###RCOM>`20SHOW`20ENVIRONMENT X.br;RCOM-I-ENV,`20current`20command`20environment: X.br;Nodes:####Current`20node X.br;Username`20SYSTEM`20will`20be`20used`20to`20connect`20to`20remote`20node X.lm`20-5`20.j X XThe`20command`20in`20this`20example`20shows`20that`20the`20remote`20command`20 Venvironment Xis`20the`20current`20node.`20`20The`20object`20RCOM__LISTENER`20will`20be`20in Vvoked`20using Xthe`20username`20SYSTEM. X X.i`20-5;1`20SPAWN X XCreates`20a`20subprocess`20of`20the`20current`20process.`20The`20context`20of V`20the Xsubprocess`20is`20copied`20from`20the`20current`20process.`20You`20can`20use V`20the XSPAWN`20command`20to`20leave`20RCOM`20temporarily,`20perform`20other`20tasks X(such`20as`20displaying`20a`20directory`20listing`20or`20printing`20a`20file), V`20and Xreturn`20to`20RCOM. X XNote`20that`20SPAWN`20performs`20actions`20on`20the`20local`20node`20only.`20I Vf`20you Xwant`20to`20execute`20DCL`20commands`20or`20command`20procedures`20throughout V`20your Xenvironment,`20use`20the`20DO`20command. X XSPAWN`20requires`20TMPMBX`20or`20PRMMBX`20user`20privilege.`20The`20SPAWN`20co Vmmand`20does Xnot`20manage`20terminal`20characteristics.`20The`20SPAWN`20and`20ATTACH`20comm Vands Xcannot`20be`20used`20if`20your`20terminal`20has`20an`20associated`20mailbox. X XFormat: X X.b`20.nj`20.i`202 XSPAWN`20`5Bcommand-string`5D X.j X X.i`20-5;2`20Parameter X Xcommand-string X XSpecifies`20a`20command`20string`20of`20fewer`20than`20132`20characters`20that V`20you Xwant`20executed`20in`20the`20context`20of`20the`20created`20subprocess.`20When V Xthe`20command`20completes`20execution,`20the`20subprocess`20terminates`20and Xcontrol`20returns`20to`20the`20parent`20process.`20If`20both`20a`20command`20s Vtring Xand`20the`20/INPUT`20qualifier`20are`20specified,`20the`20specified`20command V Xstring`20executes`20before`20additional`20commands`20are`20obtained`20from`20t Vhe X/INPUT`20qualifier. X X.i`20-5;2`20Qualifiers X X.i`20-5;/INPUT X X/INPUT=filespec X XSpecifies`20an`20input`20file`20containing`20one`20or`20more`20DCL`20command V`20strings Xthat`20you`20want`20executed`20by`20the`20spawned`20subprocess.`20If`20you`20s Vpecify`20a Xcommand`20string`20along`20with`20an`20input`20file,`20the`20command`20string V`20gets Xprocessed`20before`20the`20commands`20in`20the`20input`20file.`20When`20proces Vsing Xis`20complete,`20the`20subprocess`20terminates. X X.i`20-5;/LOGICAL__NAMES X X/LOGICAL__NAMES`20(default) X.br;/NOLOGICAL__NAMES X XSpecifies`20that`20the`20logical`20names`20of`20the`20parent`20process`20are V`20copied Xto`20the`20subprocess.`20When`20you`20do`20not`20want`20the`20subprocess`20to V`20use`20the Xlogical`20names`20of`20the`20parent`20process,`20enter`20the`20/NOLOGICAL__NAM VES Xqualifier. X X.i`20-5;/OUTPUT X X/OUTPUT=filespec X XIdentifies`20the`20output`20file`20to`20which`20the`20results`20of`20the`20ope Vration Xare`20written.`20You`20should`20specify`20an`20output`20other`20than`20SYS$OUT VPUT Xwhenever`20you`20use`20the`20/NOWAIT`20qualifier.`20This`20prevents`20output V`20from Xbeing`20displayed`20while`20you`20are`20specifying`20new`20commands.`20If`20yo Vu Xomit`20the`20/OUTPUT`20qualifier,`20output`20gets`20written`20to`20the`20curre Vnt XSYS$OUTPUT`20device. X X.i`20-5;/PROCESS X X/PROCESS=subprocess-name X XSpecifies`20the`20name`20of`20the`20subprocess`20that`20you`20want`20to`20crea Vte.`20The Xdefault`20subprocess`20name`20is`20in`20the`20format`20USERNAME__n. X X.i`20-5;/SYMBOLS X X/SYMBOLS`20(default) X.br;/NOSYMBOLS X XDetermines`20whether`20the`20system`20passes`20DCL`20global`20and`20local`20sy Vmbols Xto`20the`20subprocess. X X.i`20-5;/WAIT X X/WAIT`20(default) X.br;/NOWAIT X XControls`20whether`20the`20system`20waits`20until`20the`20subprocess`20complet Ves Xbefore`20allowing`20you`20to`20specify`20more`20commands.`20The`20/NOWAIT Xqualifier`20allows`20you`20to`20specify`20new`20commands`20while`20the`20speci Vfied Xsubprocess`20is`20running.`20If`20you`20specify`20the`20/NOWAIT`20qualifier, Xyou`20should`20also`20use`20the`20/OUTPUT`20qualifier`20to`20direct`20the`20ou Vtput Xto`20a`20file`20rather`20than`20displaying`20it`20on`20the`20screen.`20Doing V`20this Xprevents`20your`20terminal`20from`20being`20used`20by`20more`20than`20one`20pr Vocess Xsimultaneously. X X.i`20-5;2`20Examples X X.b`20.lm`20+5`20.nj`20.i`20-5 X.br;1.###RCOM>`20SPAWN`20DIR`20SYSTARTUP__V5.* X.b X.br;Directory`20SYS$COMMON:`5BSYSMGR`5D X.b X.br;SYSTARTUP__V5.COM;1`20`20SYSTARTUP__V5.TEMPLATE;1 X.b X.br;Total`20of`202`20files. X.br;RCOM> X.lm`20-5`20.j X XThe`20SPAWN`20command`20in`20this`20example`20allows`20you`20to`20view`20a Xdirectory`20listing`20of`20some`20files`20in`20the`20SYS$MANAGER`20directory. V XAfter`20the`20DIRECTORY`20command`20executes,`20control`20returns`20to`20the Xparent`20process. X X.b`20.lm`20+5`20.nj`20.i`20-5 X.br;1.###RCOM>`20SPAWN`20/NOLOGICAL__NAMES X.br;$`20EDIT`20SYSTARTUP__V5.COM X.br;###_. X.br;###_. X.br;###_. X.br;$`20LOGOUT X.br;Process`20SYSTEM__1`20logged`20out`20at`2016-JUN-1992`2010:05:17.24 X.br;RCOM> X.lm`20-5`20.j X XThis`20example`20shows`20how`20you`20can`20use`20the`20SPAWN`20command`20to`20 Vleave XRCOM`20and`20edit`20a`20file. XThe`20/NOLOGICAL__NAMES Xqualifier`20prevents`20the`20logical`20names`20of`20the`20parent`20process`20f Vrom Xbeing`20copied`20to`20the`20subprocess. XThe`20LOGOUT`20command`20returns`20you`20to`20RCOM. X X.i`20-5;1`20usage__summary X XTo`20invoke`20RCOM,`20enter`20the`20following`20command`20at`20the`20DCL`20pro Vmpt: X X.b`20.nj X$`20RUN`20SYS$SYSTEM:RCOM X.j X XIf`20a`20node`20list`20or`20default`20username`20are`20specified`20by`20logica Vl`20names`20(see`20 XSET`20ENVIRONMENT`20/NODE`20or`20/USERNAME),`20RCOM`20will`20display`20the`20c Vurrent Xenvironment`20as`20if`20a`20SHOW`20ENVIRONMENT`20command`20had`20been`20execut Ved. X XRCOM`20then`20displays`20the`20following`20prompt: X X.b`20.nj XRCOM> X.j X XYou`20can`20then`20enter`20RCOM`20commands. X XAs`20an`20alternative,`20you`20can`20define`20a`20foreign`20command`20symbol, V`20or`20use`20MCR,`20as Xshown`20below.`20`20Note`20that`20the`20device:`5Bdirectory`5D`20specification V`20is`20only Xrequired`20if`20RCOM`20is`20not`20installed`20in`20SYS$SYSTEM. X X.b`20.nj X.br X$`20RCOM`20=`20"$device:`5Bdirectory`5DRCOM" X.br X$`20RCOM`20DO`20command X.b Xor X.b X$`20MCR`20device:`5Bdirectory`5DRCOM`20DO`20command X.j X XIn`20this`20way,`20you`20can`20invoke`20RCOM`20and`20supply`20a`20command`20(u Vsually`20a`20DO`20command) Xin`20one`20line.`20`20If`20a`20command`20is`20supplied,`20RCOM`20executes`20it V`20exits; Xunlike`20SYSMAN,`20RCOM`20does`20not`20prompt`20for`20more`20input`20if`20the V`20command`20is XSET`20ENVIRONMENT.`20`20To`20set`20the`20environment`20for`20a`20single`20comm Vand,`20use`20logical Xnames`20(see`20description`20of`20qualifiers`20of`20SET`20ENVIRONMENT). X XTo`20exit`20from`20RCOM`20and`20return`20to`20the`20DCL`20command`20level,`20e Vnter`20the XEXIT`20command`20at`20the`20RCOM>`20prompt`20or`20press`20Ctrl/Z`20or`20F10. X $ call unpack RCOM.RNH;1 138832831 "" 32 3 6 $! $ create 'f' X`09module`09RCOM_TABLES X Xdefine`09verb`09SET X`09parameter`20P1,`20value`20(required,`20type=SET_TYPES),`20prompt="Set`20Wha Vt" X Xdefine`09syntax`09SETENV X`09routine`09CMD_SETENV X`09parameter`20P1 X`09qualifier`20NODE,`20nonnegatable,`20value`20(required,`20list) X`09qualifier`20CLUSTER,`20nonnegatable X`09disallow`20NODE`20and`20CLUSTER X`09qualifier`20USERNAME,`20nonnegatable,`20value`20(required) X`09qualifier`20PASSWORD,`20nonnegatable,`20value`20(required) X`09disallow`20PASSWORD`20and`20(not`20USERNAME) X Xdefine`09verb`09SHOW X`09parameter`20P1,`20value`20(required,`20type=SHOW_TYPES),`20prompt="Show`20W Vhat" X Xdefine`09syntax`09SHOWENV X`09routine`09CMD_SHOWENV X`09parameter`20P1 X Xdefine`09verb`09DO X`09routine`09CMD_DO X`09parameter`20P1,`20value`20(required,`20type=$REST_OF_LINE),`20prompt`20"Com Vmand" X`09qualifier`20OUTPUT,`20nonnegatable,`20value`20(type=$FILE) X`09qualifier`20EXCLUDE,`20nonnegatable,`20value`20(required,`20list) X Xdefine`09verb`09HELP X`09routine`09CMD_HELP X`09parameter`20P1,`20value`20(type=$REST_OF_LINE) X Xdefine`09verb`09SPAWN X`09routine`09CMD_SPAWN X`09parameter`20P1,`20value`20(type=$REST_OF_LINE) X`09qualifier`20INPUT,`20nonnegatable,`20value`20(required,`20type=$FILE) X`09qualifier`20LOGICAL_NAMES,`20default X`09qualifier`20OUTPUT,`20nonnegatable,`20value`20(required,`20type=$FILE) X`09qualifier`20PROCESS,`20nonnegatable,`20value`20(required) X`09qualifier`20SYMBOLS,`20default X`09qualifier`20WAIT,`20default X Xdefine`09verb`09ATTACH X`09routine`09CMD_ATTACH X`09qualifier`20PARENT,`20nonnegatable,`20syntax=ATTACH_PARENT X`09parameter`20P1,`20value`20(required,`20type=$FILE),`20prompt="Process" X`09disallow`20P1`20and`20PARENT X Xdefine`09syntax`09ATTACH_PARENT X`09routine`09CMD_ATTACH X`09noparameters X Xdefine`09verb`09EXIT X`09routine`09CMD_EXIT X Xdefine`09type`09SET_TYPES X`09keyword`09ENVIRONMENT,`20nonnegatable,`20syntax=SETENV X Xdefine`09type`09SHOW_TYPES X`09keyword`09ENVIRONMENT,`20nonnegatable,`20syntax=SHOWENV X $ call unpack RCOM_CLD.CLD;1 1669076654 "" 4 4 6 $! $ create 'f' X$!`20RCOM_LISTENER.COM`20-`20network`20object`20to`20execute`20remote`20comman Vds. X$! X$!`20Object`20is`20defined`20in`20NCP`20on`20server`20as`20follows: X$!`20DEFINE`20OBJECT`20RCOM_LISTENER`20NUMBER`200`20FILE`20SYS$MANAGER:RCOM_LI VSTENER.COM X$!`20SET`20OBJECT`20RCOM_LISTENER`20ALL X$! X$`20set`20noverify X$`20set`20noon X$! X$`20pid`20=`20f$getjpi("","PID") X$`20scratch_file`20=`20"SYS$SCRATCH:RCOM_''pid'.DAT" X$`20terminator_record`20=`20"`01`02`03`04" X$! X$!`20Open`20channel,`20and`20read`20and`20execute`20commands. X$! X$`20open`20/read`20/write`20/error=fatal_error`20SYS_NET`20SYS$NET: X$! X$!`20Loop`20to`20read`20commands. X$! X$`20loop_commands: X$`20if`20(f$search(scratch_file)`20.nes.`20"")`20then`20delete`20'scratch_file V';* X$`20read`20/error=windup`20/end=windup`20SYS_NET`20command X$! X$!`20Execute`20command`20just`20read. X$! X$`20define`20sys$error`20'scratch_file';1 X$`20define`20sys$output`20'scratch_file';1 X$`20'command' X$`20deassign`20sys$output`09!'f$verify(0)' X$`20deassign`20sys$error X$! X$`20open`20/read`20/error=windup`20scratch_file`20'scratch_file' X$`20loop_scr: X$`20`20read`20/end=after_loop_scr`20scratch_file`20line X$`20`20write`20SYS_NET`20line X$`20`20goto`20loop_scr X$`20after_loop_scr: X$`20write`20SYS_NET`20terminator_record X$`20close`20scratch_file X$! X$`20goto`20loop_commands X$! X$!`20Come`20here`20if`20a`20major`20disaster`20occurs. X$!`20This`20might`20be`20due`20to`20resource`20exhaustion,`20so`20logout`20thi Vs`20process. X$! X$`20fatal_error: X$`20write`20sys$output`20"Fatal`20error`20''$status'`20-`20network`20process V`20exiting" X$`20stop`20/id='pid' X$! X$`20windup: X$`20close`20SYS_NET X$`20if`20(f$trnlnm("scratch_file")`20.nes.`20"")`20then`20close`20scratch_file V X$`20if`20(f$search(scratch_file)`20.nes.`20"")`20then`20delete`20'scratch_file V';* X$! X$`20exit $ call unpack RCOM_LISTENER.COM;1 356322846 "" 4 5 6 $! $ create 'f' X.facility`09RCOM,`201 X X.severity`09success XSPAWNED`09`09 XATTACHED`09 X X.severity`09informational XOUTPUT`09`09/FAO=1 XNODERR`09`09/FAO=1 XATTACHERR`09/FAO=1 XCATCHERR`09 XENV`09`09 XCANCEL`09`09 X X.severity`09warning XINSVIRMEM`09 X X.severity`09error XNOPARENT`09 XLOGTOODEEP`09 X X.end $ call unpack RCOM_MSG.MSG;1 36001439 "" 2 6 6 $ v=f$verify(v) $ exit