JOBLOG V1.5 -- a terminal session logger, part 02/06

1 view
Skip to first unread message

Leonard J. Peirce

unread,
Apr 4, 1995, 3:00:00 AM4/4/95
to
Submitted-by: pei...@gumby.cc.wmich.edu (Leonard J. Peirce)
Posting-number: Volume 7, Issue 50
Archive-name: joblog/part02
Supersedes: joblog: Volume 1, Issue 102-106

-+-+-+-+-+-+-+-+ START OF PART 2 -+-+-+-+-+-+-+-+
X`09`09`20`20stage_dir`5BNAM$C_MAXRSS`5D,`20/*`20where`20mailed`20log`20files
V`20live`20`20`20`20`20*/
X`09`09`20`20*get_start_stamp(char`20*),
X`09`09`20`20*get_stamp(char`20*);
X
Xstatic`09`20IOSB_DEF`20tt_read_iosb,`09`09/*`20read`20I/O`20status`20block`20f
Vor`20TTY`20`20`20`20`20`20*/
X`09`09`20`20tt_write_iosb;`09/*`20write`20I/O`20status`20block`20for`20TTY`20
V`20`20`20`20*/
X
Xstatic`09`20FT_BUF`09`20`20*ft_buf,`09`09/*`20FT`20device`20I/O`20buffer`09`09
V`20`20`20`20`20`20*/
X`09`09`20`20*tt_buf,`09`09/*`20TTY`20I/O`20buffer`09`09`20`20`20`20`20`20*/
X`09`09`20`20*cr_buf;`09`09/*`20Carriage-return`20I/O`20buffer`09`20`20`20`20
V`20`20*/
X
Xstatic`09`20SENS_DEF`20tty_save_char;`09/*`20for`20saving`20TTY`20characterist
Vics`20`20`20`20`20*/
X
Xstatic`09`20TERM_DEF`20term_block`20=`20`7B32,0,`26term_mask`5B0`5D`7D;
X
Xstatic`09`20struct`09`20`20FAB`09`20`20log_fab;
X
Xstatic`09`20struct`09`20`20RAB`09`20`20log_rab;
X
Xstatic`09`20struct`09`20`20XABPRO`20`20log_xabpro;
X
Xstatic`09`20FLAG_DEF`20flags;`09`09/*`20global`20flags`09`09`09`20`20`20`20`20
V`20*/
X
Xstatic`09`20ARG_DEF`20`20args;`09`09`09/*`20run-time`20arguments`09`09`20`20
V`20`20`20`20*/
X
Xstatic`09`20ULONG`09`20`20privs`5B2`5D,
X`09`09`20`20old_privs`5B2`5D;
X/*
X#ifdef`20__DECC
Xstatic`09`20union`09`20`20prvdef`20`20privs;
Xstatic`09`20union`09`20`20prvdef`20`20old_privs;
X#else
Xstatic`09`20union`09`20`20prvdef`20`20_align(longword)`20privs;
Xstatic`09`20union`09`20`20prvdef`20`20_align(longword)`20old_privs;
X#endif
X*/
X
Xstatic`20$DESCRIPTOR(tt_d,"TT:");
Xstatic`20$DESCRIPTOR(ft_d,ftname);
Xstatic`20$DESCRIPTOR(mess_d,"");
X`0C
X/*****************************************************************************
V*/
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
V`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/
V
X/*`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20M`20
VA`20I`20N`20`20`20P`20R`20O`20C`20E`20S`20S`20I`20N`20G`20`20`20`20`20`20`20
V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/
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
V`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`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/
V
X/*****************************************************************************
V*/
X
Xmain()
X
X`7B`09/***`20main`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`20`20`20`20`20`20`20`20`20`20`20`20
X`09`09`09`09`09/********`20`20`20LOCAL`20`20VARIABLES`20`20`20********/
Xstatic`09`20ULONG`09`20`20status,`09`09/*`20return`20code`20status`20holder`09
V`20`20`20`20`20`20*/
X`09`09`20`20subproc_pid;`09`09/*`20PID`20of`20spawned`20subprocess`09`20`20`20
V`20`20`20*/
X`20`09`20EXH_DEF`20`20exh_blk`20=`20`7B0L,`26quit,0,0,0,0,`26status`7D;
Xstatic`09`20ADDR_RAN`20io_buffers;
X
X
X#ifndef`20PHOTO_MODE
X
X`20`20`20get_args(`26args);`20`09`09`09/*`20get`20run-time`20arguments`09`20
V`20`20`20`20`20*/
X
X`20`20`20/*`20get`20logicals`20for`20the`20log`20and`20staging`20directories
V`20*/
X
X`20`20`20get_logicals(log_dir,stage_dir);
X
X#endif
X
X`20`20`20if(args.retrieve)`09`09`09/*`20someone`20retrieving`20a`20logfile?`20
V`20`20`20`20`20*/
X`20`20`20`20`20`20retrieve_log(stage_dir,`26args,`26tt_chan);
X`20`20`20else`20if(args.delete)
X`20`20`20`20`20`20delete_mlog(stage_dir,`26tt_chan);`09/*`20deleting`20a`20mai
Vled`20logfile?`09`20`20`20`20`20`20*/
X`20`20`20else`20if(args.skim)
X`20`20`20`20`20`20skim(stage_dir);`09`09`09/*`20skim`20old`20JOBLOG`20files`09
V`20`20`20`20`20`20*/
X`20`20`20else
X`20`20`20`7B
X`20`20`20`20`20`20joblog_check();`09`09`09/*`20don't`20let`20user`20run`20JOBL
VOG`20twice`20`20`20`20*/
X
X`20`20`20`20`20`20status`20=`20LIB$GET_EF(`26tt_r_efn);
X
X`20`20`20`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`09`20LIB$STOP(status);
X
X`20`20`20`20`20`20status`20=`20LIB$GET_EF(`26wait_efn);
X
X`20`20`20`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`09`20LIB$STOP(status);
X
X`20`20`20`20`20`20status`20=`20LIB$GET_EF(`26ft_efn);
X
X`20`20`20`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`09`20LIB$STOP(status);
X
X`20`20`20`20`20`20/*`20someone`20is`20actually`20logging`20a`20session`20here
V`20*/
X
X`20`20`20`20`20`20flags.verify`20=`20TRUE;`09`09/*`20assume`20we`20are`20verif
Vied`20to`20start`20`20`20`20*/
X`20`20`20`20`20`20flags.time_stamp`20=`20args.time_stamp;
X
X`20`20`20`20`20`20/*`20open`20the`20log`20file`20*/
X
X`20`20`20`20`20`20status`20=`20get_file(logfile,log_dir,`26log_fab,`26log_rab,
V`26log_xabpro,`26args,
X`09`09`09`26flags);
X
X`20`20`20`20`20`20if(status`20!=`20RMS$_NORMAL)
X`09`20LIB$STOP(JLG_NO_LOGFILE);`09/*`20major`20problems`20here`09`09`20`20`20
V`20`20`20*/
X
X`20`20`20`20`20`20/*`20write`20a`20time`20stamp`20at`20the`20start`20of`20the
V`20log`20file`20if`20time`20stamping
X`20`20`20`20`20`20`20*`20is`20enabled
X`20`20`20`20`20`20`20*/
X
X`20`20`20`20`20`20if(flags.time_stamp)
X`20`20`20`20`20`20`7B
X`09`20flags.command`20=`20TRUE;`09`09/*`20to`20fool`20write_log()`20*/
X`09`20get_start_stamp(stamp_buf);
X`09`20write_log(stamp_buf,strlen(stamp_buf),`26log_rab,`26flags);
X`09`20stamp_buf`5B0`5D`20=`20'`5C0';`09`09/*`20clear`20it`20out`20before`20bla
Vnk`20line`20*/
X`09`20write_log("`5Cn",1,`26log_rab,`26flags);`09/*`20write`20a`20blank`20line
V`20*/
X`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20/*`20set`20up`20channels`20to`20everything`20we`20will`20nee
Vd`20*/
X
X`20`20`20`20`20`20get_channels(`26tt_chan,`26ft_chan,`26io_buffers);
X
X`20`20`20`20`20`20/*`20set`20the`20pointers`20to`20the`20buffers`20that`20we
V`20will`20use`20*/
X
X`20`20`20`20`20`20ft_buf`20=`20(FT_BUF`20*)`20io_buffers.start;
X`20`20`20`20`20`20tt_buf`20=`20(FT_BUF`20*)`20(io_buffers.start`20+`20PAGE_SIZ
VE);
X`20`20`20`20`20`20cr_buf`20=`20(FT_BUF`20*)`20(io_buffers.start`20+`20(PAGE_SI
VZE`20*`202));
X
X`20`20`20`20`20`20/*`20write`20welcome`20message`20*/
X
X`20`20`20`20`20`20welcome(`26args);
X
X`20`20`20`20`20`20/*`20declare`20an`20exit`20handler`20*/
X
X`20`20`20`20`20`20status`20=`20SYS$DCLEXH(`26exh_blk);
X
X`20`20`20`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`20`20`20`7B
X`09`20kill_log();
X`09`20LIB$STOP(JLG_NO_EXH);
X`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20/*`20spawn`20a`20subprocess`20that`20we`20can`20use`20*/
X
X`20`20`20`20`20`20spawn(`26subproc_pid);
X
X`20`20`20`20`20`20flags.logging`20=`20TRUE;`20`20`09`09/*`20start`20out`20by
V`20logging`20stuff`09`20`20`20`20`20`20*/
X`20`20`20`20`20`20flags.command`20=`20FALSE;
X
X`20`20`20`20`20`20/*`20log`20the`20session`20*/
X
X`20`20`20`20`20`20log_session(ft_chan,tt_chan);
X`20`20`20`7D
X
X`7D`09/***`20main`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09get_args
X
X`20`20Purpose:`09Get`20run-time`20arguments`20and`20store`20in`20structure.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09args`09`09`09command-line`20argument`20flags
X
X`20`20Global`20variables:
X
X`09Name`09`09`09Examine/Modify/Use/Read/Write
X`09----`09`09`09-----------------------------
X`09none
X
X`20`20Return`20Codes:
X
X`09Code`09`09`09Reason
X`09----`09`09`09------
X`09none
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20void`20get_args(ARG_DEF`20*args)
X
X`7B`09/***`20get_args`20***/
X`09`20`20`20`20`20`09`09`09`09/********`20`20`20LOCAL`20`20VARIABLES`20`20`20*
V*******/
X`09`20ULONG`09`20`20status;`09`09/*`20return`20code`20status`20holder`09`20`20
V`20`20`20`20*/
X`09`20USHORT`09`20`20length;`09`09/*`20length`20of`20command`20line`09`20`20
V`20`20`20`20*/
Xstatic`09`20char`09`20`20command`5BCOMMAND_MAX+1`5D;`20/*`20for`20building`20a
V`20command`20to`20parse`20`20*/
Xstatic`20$DESCRIPTOR(cmdline_d,command);`09/*`20for`20parsing`20command`20line
V`09`20`20`20`20`20`20*/
Xstatic`20$DESCRIPTOR(delete_d,"DELETE");
Xstatic`20$DESCRIPTOR(expert_d,"EXPERT");
Xstatic`20$DESCRIPTOR(mail_d,"MAIL");
Xstatic`20$DESCRIPTOR(save_d,"SAVE");
Xstatic`20$DESCRIPTOR(print_d,"PRINT");
Xstatic`20$DESCRIPTOR(retrieve_d,"RETRIEVE");
Xstatic`20$DESCRIPTOR(skim_d,"SKIM");
Xstatic`20$DESCRIPTOR(time_stamp_d,"TIME_STAMP");
Xstatic`20$DESCRIPTOR(verified_d,"VERIFIED");
X
X
X`20`20`20/*`20first`20get`20the`20command`20line`20*/
X
X`20`20`20status`20=`20LIB$GET_FOREIGN(`26cmdline_d,0,`26length,0);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`20`20`20LIB$STOP(status);
X
X`20`20`20/*`20insert`20the`20verb`20we`20need`20*/
X
X`20`20`20command`5Blength`5D`20=`20'`5C0';
X`20`20`20strins(command,"JOBLOG",0);
X`20`20`20cmdline_d.dsc$w_length`20=`20(USHORT)`20strlen(command);
X
X`20`20`20/*`20now`20parse`20it`20so`20we`20can`20check`20for`20qualifiers`20*/
V
X
X`20`20`20status`20=`20CLI$DCL_PARSE(`26cmdline_d,`26joblog_cld,`26LIB$GET_INPU
VT);
X
X`20`20`20if(status`20!=`20CLI$_NORMAL)
X`20`20`20`20`20`20LIB$STOP(status);
X
X`20`20`20if(CLI$PRESENT(`26time_stamp_d)`20==`20CLI$_PRESENT)
X`20`20`20`20`20`20args->time_stamp`20=`20TRUE;
X`20`20`20else
X`20`20`20`20`20`20args->time_stamp`20=`20FALSE;
X
X`20`20`20if(CLI$PRESENT(`26expert_d)`20==`20CLI$_PRESENT)
X`20`20`20`20`20`20args->expert`20=`20TRUE;
X`20`20`20else
X`20`20`20`20`20`20args->expert`20=`20FALSE;
X
X`20`20`20if(CLI$PRESENT(`26print_d)`20==`20CLI$_PRESENT)
X`20`20`20`20`20`20args->print`20=`20TRUE;
X`20`20`20else
X`20`20`20`20`20`20args->print`20=`20FALSE;
X
X`20`20`20if(CLI$PRESENT(`26retrieve_d)`20==`20CLI$_PRESENT)
X`20`20`20`20`20`20args->retrieve`20=`20TRUE;
X`20`20`20else
X`20`20`20`20`20`20args->retrieve`20=`20FALSE;
X`20
X`20`20`20if(CLI$PRESENT(`26save_d)`20==`20CLI$_PRESENT)
X`20`20`20`20`20`20args->save`20=`20TRUE;
X`20`20`20else
X`20`20`20`20`20`20args->save`20=`20FALSE;
X`20
X`20`20`20if(CLI$PRESENT(`26mail_d)`20==`20CLI$_PRESENT)
X`20`20`20`20`20`20args->mail`20=`20TRUE;
X`20`20`20else
X`20`20`20`20`20`20args->mail`20=`20FALSE;
X`20
X`20`20`20if(CLI$PRESENT(`26skim_d)`20==`20CLI$_PRESENT)
X`20`20`20`20`20`20args->skim`20=`20TRUE;
X`20`20`20else
X`20`20`20`20`20`20args->skim`20=`20FALSE;
X
X`20`20`20if(CLI$PRESENT(`26delete_d)`20==`20CLI$_PRESENT)
X`20`20`20`7B
X`20`20`20`20`20`20args->delete`20=`20TRUE;
X`20`20`20`20`20`20args->time_stamp`20=`20TRUE;
X`20`20`20`7D
X`20`20`20else
X`20`20`20`20`20`20args->delete`20=`20FALSE;
X
X`20`20`20if(CLI$PRESENT(`26verified_d)`20==`20CLI$_PRESENT)
X`20`20`20`20`20`20args->verified`20=`20TRUE;
X`20`20`20else
X`20`20`20`20`20`20args->verified`20=`20FALSE;
X
X`20`20`20return;
X
X`7D`09/***`20get_args`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09quit
X
X`20`20Purpose:`09Exit`20handler`20used`20to`20clean`20up`20a`20few`20things.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09none
X
X`20`20Global`20variables:
X
X`09Name`09`09`09Examine/Modify/Use/Read/Write
X`09----`09`09`09-----------------------------
X`09tt_chan`09`09`09`09`09X
X`09ft_chan`09`09`09`09`09X
X`09tty_save_char`09`09`09`09X
X`09log_fab`09`09`09`09`09X
X`09log_xabpro`09`09`09`20`20X
X`09logfile`09`09`09`09`09X
X`09flags`09`09`09`09`09X
X`09stage_dir`09`09`09`09X
X`09args`09`09`09`09`09X
X`09mess_d`09`09`09`09`20`20X`09X
X`09clean_exit`09`09`20`20`20X
X`09privs`09`09`09`09`20`20X`09X
X`09JLG_CANT_CANCEL_IO`09`09`09X
X`09JLG_NO_EXH`09`09`09`09X
X`09JLG_CANT_DASSGN`09`09`09`09X
X`09JLG_CANT_RESET`09`09`09`09X
X
X`20`20Return`20Codes:
X
X`09Code`09`09`09Reason
X`09----`20`09`09`09------
X`09none
X
X`20`20Termination`20Codes:
X
X`09Code`09`09`09Reason
X`09----`09`09`09------
X`09status
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20void`20quit(void)
X
X`7B`09/***`20quit`20***/
X`09`09`09`09`09/********`20`20`20LOCAL`20`20VARIABLES`20`20`20********/
Xstatic`09`20ULONG`09`20`20status,`09`09/*`20return`20code`20status`20holder`09
V`20`20`20`20`20`20*/
X`09`09`20`20length;`09`09/*`20length`20of`20device`20char.`20block`09`20`20`20
V`20`20`20*/
Xstatic`09`20EXH_DEF`20`20exh2_blk`20=`20`7B0L,`26quit2,0,0,0,0,`26status`7D;
Xstatic`09`20IOSB_DEF`20iosb;
X
X
X#ifndef`20PHOTO_MODE
X
X`20`20`20/*`20make`20sure`20SYSPRV`20is`20on`20so`20we`20can`20close`20the`20l
Vog`20file`20*/
X
X`20`20`20privs`5B0`5D`20=`20PRV$M_SYSPRV;
X`20`20`20privs`5B1`5D`20=`200L;
X
X`20`20`20status`20=`20SYS$SETPRV(ON,`26privs,FALSE,NULL);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20LIB$SIGNAL(status);
X`20`20`20`20`20`20return;
X`20`20`20`7D
X
X`20`20`20/*`20set`20the`20protection`20to`20override`20any`20default`20the`20u
Vser`20might've`20set`20*/
X
X`20`20`20log_xabpro.xab$w_pro`20=`20((XAB$M_NOREAD`20`7C`20XAB$M_NOWRITE`20`7C
V`20XAB$M_NOEXE`20`7C
X`09`09`09`20`20`20`20XAB$M_NODEL)`20<<`20XAB$V_GRP)`20`7C`20((XAB$M_NOREAD`20
V`7C
X`09`09`09`20`20`20`20XAB$M_NOWRITE`20`7C`20XAB$M_NOEXE`20`7C`20XAB$M_NODEL)
X`09`09`09`20`20`20`20<<`20XAB$V_WLD);
X
X#endif
X
X`20`20`20status`20=`20SYS$CLOSE(`26log_fab);`09/*`20close`20the`20log`20file
V`09`09`20`20`20`20`20`20*/
X
X`20`20`20if(status`20!=`20RMS$_NORMAL)
X`20`20`20`7B
X`20`20`20`20`20`20delete_log(logfile);
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X#ifndef`20PHOTO_MODE
X
X`20`20`20/*`20turn`20SYSPRV`20off`20again`20*/
X
X`20`20`20privs`5B0`5D`20=`20PRV$M_SYSPRV;
X`20`20`20status`20=`20SYS$SETPRV(OFF,`26privs,FALSE,NULL);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20LIB$SIGNAL(status);
X`20`20`20`20`20`20return;
X`20`20`20`7D
X
X#endif
X
X`20`20`20if(clean_exit`20==`20FALSE)
X`20`20`20`7B
X`20`20`20`20`20`20/*`20oops,`20we`20had`20problems`20here;`20someone`20must've
V`20killed`20the`20process
X`20`20`20`20`20`20`20*`20because`20we`20got`20here`20without`20detecting`20han
Vgup`20on`20the`20FT`20device;
X`20`20`20`20`20`20`20*`20this`20normally`20means`20that`20there`20is`20no`20TT
VY`20left`20to`20talk`20to`20so
X`20`20`20`20`20`20`20*`20we`20just`20kill`20the`20logfile`20and`20get`20out
X`20`20`20`20`20`20`20*/
X
X`20`20`20`20`20`20delete_log(logfile);
X`20`20`20`20`20`20return;
X`20`20`20`7D
X
X#ifndef`20PHOTO_MODE
X
X`20`20`20/*`20declare`20ANOTHER`20exit`20handler`20to`20delete`20the`20log`20f
Vile`20in`20case`20the
X`20`20`20`20*`20user`20decides`20to`20do`20something`20drastic`20like`20a`20di
Vsconnect`20between`20now
X`20`20`20`20*`20and`20when`20ask_disposition()`20is`20called
X`20`20`20`20*/
X
X`20`20`20status`20=`20SYS$DCLEXH(`26exh2_blk);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20delete_log(logfile);
X`20`20`20`20`20`20LIB$STOP(JLG_NO_EXH);
X`20`20`20`7D
X
X#endif
X
X`20`20`20/*`20clean`20up`20some`20things;`20start`20by`20cancelling`20I/O`20on
V`20all`20channels`20*/
X
X`20`20`20status`20=`20SYS$CANCEL(tt_chan);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20mess_d.dsc$a_pointer`20=`20"TTY";
X`20`20`20`20`20`20mess_d.dsc$w_length`20=`20(USHORT)`20strlen(mess_d.dsc$a_poi
Vnter);
X`20`20`20`20`20`20LIB$SIGNAL(JLG_CANT_CANCEL_IO,1L,`26mess_d);
X`20`20`20`7D
X
X`20`20`20status`20=`20PTD$CANCEL(ft_chan);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20mess_d.dsc$a_pointer`20=`20"FT";
X`20`20`20`20`20`20mess_d.dsc$w_length`20=`20(USHORT)`20strlen(mess_d.dsc$a_poi
Vnter);
X`20`20`20`20`20`20LIB$SIGNAL(JLG_CANT_CANCEL_IO,1L,`26mess_d);
X`20`20`20`7D
X
X`20`20`20/*`20now`20delete`20and`20deassign`20some`20stuff`20*/
X
X`20`20`20status`20=`20PTD$DELETE(ft_chan);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20mess_d.dsc$a_pointer`20=`20"FT";
X`20`20`20`20`20`20mess_d.dsc$w_length`20=`20(USHORT)`20strlen(mess_d.dsc$a_poi
Vnter);
X`20`20`20`20`20`20LIB$SIGNAL(JLG_CANT_DASSGN,1L,`26mess_d);
X`20`20`20`7D
X
X`20`20`20/*`20reset`20the`20user's`20privs;`20this`20is`20done`20just`20in`20c
Vase`20they`20had`20LOG_IO
X`20`20`20`20*`20and`20PHY_IO`20on`20when`20they`20started`20and`20we`20need`20
Vto`20twiddle`20HANGUP
X`20`20`20`20*/
X
X`20`20`20status`20=`20SYS$SETPRV(ON,`26old_privs,FALSE,NULL);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`20`20`20LIB$SIGNAL(status);
X
X`20`20`20/*`20set`20the`20terminal`20mode`20back`20to`20the`20way`20it`20was
V`20*/
X`20`20`20`20
X`20`20`20length`20=`20(ULONG)`20sizeof(tty_save_char);
X
X`20`20`20status`20=`20SYS$QIOW(0,tt_chan,IO$_SETMODE,`26iosb,0,0,`26tty_save_c
Vhar,length,0,
X`09`09`20`20`20`20`200,0,0);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL)`20`26`26`20(status`20!=`2010300))
X`20`20`20`20`20`20LIB$SIGNAL(JLG_CANT_RESET);
X
X#ifndef`20PHOTO_MODE
X
X`20`20`20/*`20ask`20user`20what`20should`20happen`20*/
X
X`20`20`20ask_disposition(logfile,stage_dir,`26flags,`26args);
X
X`20`20`20/*`20kill`20the`20secondary`20exit`20handler`20so`20that`20it`20doesn
V't`20kick`20in`20when`20we
X`20`20`20`20*`20exit
X`20`20`20`20*/
X
X`20`20`20status`20=`20SYS$CANEXH(`26exh2_blk);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`20`20`20LIB$SIGNAL(JLG_NO_EXH);
X
X#else
X
X`20`20`20my_puts("`5Cn`5CnLog`20file`20written`20to`20JOBLOG.LOG.`5Cn");
X
X#endif
X
X`20`20`20my_puts("`5CnExiting`20JOBLOG.`20`20Remember`20YOU`20ARE`20STILL`20LO
VGGED`20IN!!!`5C7`5C7`5C7`5Cn");
X`20`20`20exit(0);
X
X`7D`09/***`20quit`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09get_channels
X
X`20`20Purpose:`09Assign`20channels`20to`20both`20the`20TTY`20and`20the`20FT`20
Vdevice,`20SETMODE`20the
X`09`09TTY.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09tt_chan`09`09`09channel`20to`20TTY
X`09ft_chan`09`09`09channel`20to`20FT`20device
X`09io_buffers`09`09I/O`20buffers`20used`20by`20FT`20device
X
X`20`20Global`20variables:
X
X`09Name`09`09`09Examine/Modify/Use/Read/Write
X`09----`09`09`09-----------------------------
X`09tt_d`09`09`09`09`20`20X`09X
X`09ft_d`09`09`09`09`20`20X
X`09tty_save_char`09`09`09`20`20X
X`09ftname`09`09`09`09`20`20X`09X`09
X
X`20`20Return`20Codes:
X
X`09Code`09`09`09Reason
X`09----`09`09`09------
X`09none
X
X`20`20Termination`20Codes:
X
X`09Code`09`09`09Reason
X`09----`09`09`09------
X`09status`09`09`09return`20code`20from`20various`20system`20calls
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20void`20get_channels(USHORT`20*tt_chan,USHORT`20*ft_chan,ADDR_RAN`20*i
Vo_buffers)
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`20`20`20`20`20`20`20`20
X`7B`09/***`20get_channels`20***/
X`09`09`09`09`09/********`20`20`20LOCAL`20`20VARIABLES`20`20`20********/
X`09`20ULONG`09`20`20status,`09`09/*`20return`20code`20status`20holder`09`20`20
V`20`20`20`20*/
X`09`09`20`20length,`09`09/*`20length`20of`20tty_char`20block`09`20`20`20`20`20
V`20*/
X`09`09`20`20tt_efn;`09`09/*`20event`20flag`20for`20IO$_SETMODE`09`20`20`20`20
V`20`20*/
Xstatic`09`20IOSB_DEF`20iosb;`09`09`09/*`20I/O`20status`20block`09`09`20`20`20
V`20`20`20*/
Xstatic`09`20SENS_DEF`20tty_char,`09`09/*`20TTY`20characteristics`20to`20set`09
V`20`20`20`20`20`20*/
X`09`09`20`20ft_char;`09`09/*`20FT`20characteristics`20to`20set`09`20`20`20`20
V`20`20*/
Xstatic`09`20ULONG`09`20`20ft_num;`09`09/*`20device`20#`20of`20FT`20device`09
V`20`20`20`20`20`20*/
Xstatic`09`20USHORT`09`20`20ft_name_len;`09`09/*`20length`20of`20FT`20device`20
Vname`09`20`20`20`20`20`20*/
Xstatic`09`20ITM_LST`20`20items`5B`5D`20=`20`7B`09`09/*`20for`20getting`20FT`20
Vcharacteristics`20`20`20`20`20*/
X`7Bsizeof(ftname),DVI$_DEVNAM,ftname,`26ft_name_len`7D,
X`7B0,0,0L,0L`7D`7D;
X
X
X`20`20`20/*`20get`20a`20channel`20for`20the`20user's`20TTY`20*/
X
X`20`20`20status`20=`20SYS$ASSIGN(`26tt_d,tt_chan,0,0);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X`20`20`20/*`20get`20an`20event`20flag`20to`20use`20for`20setting`20the`20termi
Vnal`20characteristics`20*/
X
X`20`20`20status`20=`20LIB$GET_EF(`26tt_efn);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X`20`20`20/*`20now`20set`20the`20mode`20for`20the`20terminal`20*/
X
X`20`20`20length`20=`20sizeof(tty_char);`09`09/*`20get`20length`20of`20tty`20ch
Var.`20block`20`20`20`20`20`20*/
X
X`20`20`20status`20=`20SYS$QIO(tt_efn,*tt_chan,IO$_SENSEMODE,`26iosb,0,0,`26tty
V_char,length,
X`09`09`20`20`20`200,0,0,0);
X`20`20`20`20`20`20`20`20`20`20`20
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X`20`20`20status`20=`20SYS$WAITFR(tt_efn);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X`20`20`20/*`20copy`20the`20current`20TTY`20mode`20so`20it`20can`20be`20restore
Vd`20later`20*/
X
X`20`20`20memcpy((void`20*)`20`26tty_save_char,(void`20*)`20`26tty_char,sizeof(
Vtty_save_char));
X
X`20`20`20/*`20for`20the`20FT`20device`09*/
X
X`20`20`20memcpy((void`20*)`20`26ft_char,(void`20*)`20`26tty_char,sizeof(ft_cha
Vr));
X
X`20`20`20/*`20now`20set`20up`20the`20TTY`20characteristics`20we`20need`20to`20
Vrun`20*/
X
X`20`20`20tty_char.characts`20`7C=`20TT$M_NOECHO;
X
X`20`20`20/*`20set`20the`20TTY`20to`20HOSTSYNC`20and`20TTSYNC;`20if`20we`20don'
Vt,`20vt220's`20will`20hang
X`20`20`20`20*`20because`20of`20flow`20control`20problems
X`20`20`20`20*/
X
X`20`20`20tty_char.characts`20`7C=`20TT$M_TTSYNC;
X`20`20`20tty_char.characts`20`7C=`20TT$M_HOSTSYNC;
X`20`20`20tty_char.ext_char`20`7C=`20TT2$M_PASTHRU;
X
X`20`20`20/*`20ignoring`20the`20IOSB`20status`20code`20from`20the`20following
V`20call`20to`20SYS$QIO()
X`20`20`20`20*`20is`20no`20accident`20--`20we`20don't`20even`20want`20to`20know
V`20whether`20it`20complains
X`20`20`20`20*`20about`20HANGUP`20or`20not;`20Grrr....
X`20`20`20`20*/
X
X`20`20`20status`20=`20SYS$QIO(tt_efn,*tt_chan,IO$_SETMODE,`26iosb,0,0,`26tty_c
Vhar,length,0,0,
X`09`09`20`20`20`200,0);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X`20`20`20/*`20wait`20for`20the`20IO$_SETMODE`20to`20complete`20*/
X
X`20`20`20status`20=`20SYS$WAITFR(tt_efn);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X`20`20`20
X`20`20`20/*`20throw`20the`20event`20flag`20away`20since`20we`20don't`20need`20
Vit`20anymore`20*/
X
X`20`20`20status`20=`20LIB$FREE_EF(`26tt_efn);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X`20`20`20/*`20expand`20the`20P0`20region`20to`20make`20some`20I/O`20buffers`20
V*/
X
X`20`20`20status`20=`20SYS$EXPREG(NUM_IO_BUFFERS,io_buffers,0,0);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`20`20`20LIB$STOP(status);
X
X`20`20`20/*`20create`20an`20FT`20device`20*/
X
X`20`20`20status`20=`20PTD$CREATE(ft_chan,0,`26ft_char,sizeof(ft_char),0,0,0,io
V_buffers);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X`20`20`20/*`20set`20up`20some`20AST's`20for`20good`20measure`20*/
X
X`20`20`20status`20=`20PTD$SET_EVENT_NOTIFICATION(*ft_chan,`26xon_ast,0,0,PTD$C
V_SEND_XON);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X`20`20`20status`20=`20PTD$SET_EVENT_NOTIFICATION(*ft_chan,`26xoff_ast,0,0,PTD$
VC_SEND_XOFF);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X`20`20`20status`20=`20PTD$SET_EVENT_NOTIFICATION(*ft_chan,`26bell_ast,0,0,PTD$
VC_SEND_BELL);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X`20`20`20status`20=`20PTD$SET_EVENT_NOTIFICATION(*ft_chan,`26dev_chg_ast,0,0,
V
X`09`09`09`09`20`20`20`20`20`20`20PTD$C_CHAR_CHANGED);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X`20`20`20/*`20get`20the`20device`20number`20of`20the`20FT`20device`20so`20we
V`20know`20what`20SYS$INPUT
X`20`20`20`20*`20and`20SYS$OUTPUT`20are`20called`20when`20we`20call`20LIB$SPAWN
V()
X`20`20`20`20*/
X
X`20`20`20status`20=`20SYS$GETDVI(0,*ft_chan,0,`26items,`26iosb,0,0,0);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X`20`20`20/*`20get`20rid`20of`20the`20leading`20underscore`20in`20the`20FT`20de
Vvice`20name`20*/
X
X`20`20`20ftname`5Bft_name_len`5D`20=`20'`5C0';
X`20`20`20strcpy(ftname,`26ftname`5B1`5D);
X`20`20`20ft_d.dsc$w_length`20=`20ft_name_len`20-`201;
X
X`20`20`20return;
X
X`7D`09/***`20get_channels`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09spawn
X
X`20`20Purpose:`09Spawn`20a`20subprocess`20to`20talk`20to`20the`20FT`20device.
V
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09pid`09`09`09returns`20PID`20of`20subprocess
X
X`20`20Global`20variables:
X
X`09Name`09`09`09Examine/Modify/Use/Read/Write
X`09----`09`09`09-----------------------------
X`09privs`09`09`09`09`20`20X`09X
X`09old_privs`09`09`09`20`20X`09X
X`09ft_d`09`09`09`09`09X
X
X`20`20Return`20Codes:
X
X`09Code`09`09`09Reason
X`09----`09`09`09------
X`09none
X
X`20`20Termination`20Codes:
X
X`09Code`09`09`09Reason
X`09----`09`09`09------
X`09status`09`09`09return`20code`20from`20various`20system`20calls
X
X******************************************************************************
V**
X******************************************************************************
V*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
Xstatic`20void`20spawn(ULONG`20*pid)
X
X`7B`09/***`20spawn`20***/
X`09`09`09`09`09/********`20`20`20LOCAL`20`20VARIABLES`20`20`20********/
X`09`20ULONG`09`20`20status,`09`09/*`20return`20code`20status`20holder`09`20`20
V`20`20`20`20*/
X`09`09`20`20current_pid,`09`09/*`20PID`20of`20current`20process`09`20`20`20`20
V`20`20*/
X`09`09`20`20flags;`09`09/*`20flags`20for`20SPAWNing`20subprocess`20`20`20`20
V`20`20*/
X`09`20short`09`20`20length;`09`09/*`20length`20of`20process`20name`09`20`20`20
V`20`20`20*/
Xstatic`09`20char`09`20`20procname`5BPNAME_MAX+1`5D,/*`20current`20process`20na
Vme`20array`09`20`20`20`20`20`20*/
X`09`09`20`20newname`5BPNAME_MAX+1`5D;`09/*`20process`20name`20for`20JOBLOG`20s
Vubprocess`20*/
Xstatic`20$DESCRIPTOR(procname_d,procname);`20/*`20for`20getting`20process`20na
Vme`09`20`20`20`20`20`20*/
Xstatic`20$DESCRIPTOR(newname_d,newname);`09/*`20for`20setting`20process`20name
V`09`20`20`20`20`20`20*/
Xstatic`20$DESCRIPTOR(prompt_d,"Joblog>`20");`20/*`20DCL`20prompt`20when`20in
V`20JOBLOG`09`20`20`20`20`20`20*/
Xstatic`20$DESCRIPTOR(format_d,"JOBLOG_!XL");
Xstatic`09`20ULONG`09`20`20tmp_privs`5B2`5D;
X/*
X#ifdef`20__DECC
Xstatic`09`20union`09`20`20prvdef`20`20`20tmp_privs;
X#else
Xstatic`09`20union`09`20`20prvdef`20`20`20_align(longword)`20`20tmp_privs;
X#endif
X*/
X
X
X
X`20`20`20current_pid`20=`20getpid();`09`09/*`20get`20PID`20for`20current`20pro
Vcess`09`20`20`20`20`20`20*/
X
X`20`20`20/*`20make`20the`20process`20name`20that`20we`20are`20going`20to`20use
V`20*/
X
X`20`20`20status`20=`20SYS$FAO(`26format_d,`26length,`26newname_d,current_pid
V`20`26`200xFFFF);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X#ifndef`20PHOTO_MODE
X
X`20`20`20/*`20put`20the`20current`20process`20back`20to`20it's`20default`20pri
Vvileges`20so`20that`20we`20can
X`20`20`20`20*`20give`20them`20to`20the`20subprocess
X`20`20`20`20*
X`20`20`20`20*`20NOTE:`20`20changes`20in`20privs`20are`20temporary;`20when`20we
V`20exit`20we`20don't`20have`20to
X`20`20`20`20*`20`20`20`20`20`20`20`20reset`20anything`20since`20they'll`20be
V`20reset`20automatically
X`20`20`20`20*/
X
X`20`20`20privs`5B0`5D`20=`20ULONG_MAX;
X`20`20`20privs`5B1`5D`20=`20ULONG_MAX;
X
X`20`20`20status`20=`20SYS$SETPRV(OFF,`26privs,FALSE,NULL);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X`20`20`20/*`20turn`20on`20the`20privs`20the`20user`20had`20when`20we`20first
V`20started`20*/
X
X`20`20`20tmp_privs`5B0`5D`20=`20old_privs`5B0`5D;
X`20`20`20tmp_privs`5B1`5D`20=`20old_privs`5B1`5D;
X
X`20`20`20status`20=`20SYS$SETPRV(ON,`26tmp_privs,FALSE,NULL);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X#endif
X
X`20`20`20newname_d.dsc$w_length`20=`20length;
X`20`20`20newname`5Blength`5D`20=`20'`5C0';
X`20`20`20
X`20`20`20/*`20FINALLY!`20`20we`20spawn`20a`20subprocess`20to`20talk`20to`20the
V`20FT`20device`20*/
X
X`20`20`20flags`20=`20CLI$M_NOWAIT;
X
X`20`20`20status`20=`20LIB$SPAWN(0,`26ft_d,`26ft_d,`26flags,`26newname_d,pid,0,
V0,
X`09`09`20`20`20`20`20`20`26subprocess_exit,0,`26prompt_d,0);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X#ifndef`20PHOTO_MODE
X
X`20`20`20privs`5B0`5D`20=`20ULONG_MAX;
X`20`20`20privs`5B1`5D`20=`20ULONG_MAX;
X
X`20`20`20status`20=`20SYS$SETPRV(OFF,`26privs,FALSE,NULL);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X`20`20`20/*`20turn`20on`20the`20privs`20the`20user`20had`20when`20we`20first
V`20started`20*/
X
X`20`20`20tmp_privs`5B0`5D`20=`20old_privs`5B0`5D;
X`20`20`20tmp_privs`5B1`5D`20=`20old_privs`5B1`5D;
X
X`20`20`20status`20=`20SYS$SETPRV(ON,`26tmp_privs,FALSE,NULL);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X#endif
X
X`20`20`20return;
X
X`7D`09/***`20spawn`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09ft_ast
X
X`20`20Purpose:`09AST`20routine`20for`20FT`20device.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09none
X
X`20`20Global`20variables:
X
X`09Name`09`09`09Examine/Modify/Use/Read/Write
X`09----`09`09`09-----------------------------
X`09tt_chan`09`09`09`09`09X
X`09ft_chan`09`09`09`09`09X
X`09ft_efn`09`09`09`09`09X
X`09ft_buf`09`09`09`20`20`20X`09`09X
X`09log_rab`09`09`09`09`09X
X`09flags`09`09`09`09`09X
X`09mess_d`09`09`09`09`20`20X`09X
X
X`20`20Return`20Codes:
X
X`09Code`09`09`09Reason
X`09----`09`09`09------
X`09none
X
X`20`20Termination`20Codes:
X
X`09Code`09`09`09Reason
X`09----`09`09`09------
X`09status`09`09`09problems`20queuing`20read`20on`20FT`20device
X`09JLG_CANT_QUEUE
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20void`20ft_ast(void)
X
X`7B`09/***`20ft_ast`20***/
X`09`09`09`09`09/********`20`20`20LOCAL`20`20VARIABLES`20`20`20********/
Xstatic`09`20ULONG`09`20`20status;`09`09/*`20return`20code`20status`20holder`09
V`20`20`20`20`20`20*/
X
X
X`20`20`20/*`20check`20that`20the`20read`20on`20the`20FT`20completed`20ok`20*/
V
X
X`20`20`20if(!(ft_buf->status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(ft_buf->status);
X`20`20`20`7D
X
X`20`20`20/*`20write`20what`20was`20read`20from`20the`20FT`20device`20to`20the
V`20TTY`20*/
X
X`20`20`20write_tt(tt_chan,(char`20*)`20ft_buf->data,(ULONG)`20ft_buf->count);
V
X
X`20`20`20if(flags.logging)
X`20`20`20`20`20`20write_log((char`20*)`20ft_buf->data,ft_buf->count,`26log_rab
V,`26flags);
X
X`20`20`20status`20=`20PTD$READ(0,ft_chan,`26ft_ast,0,`26(ft_buf->status),FT_DA
VTA_MAX);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`20`20`20mess_d.dsc$a_pointer`20=`20"read`20on`20FT`20device`20(in`20
Vast)";
X`20`20`20`20`20`20mess_d.dsc$w_length`20=`20(USHORT)`20strlen(mess_d.dsc$a_poi
Vnter);
X`20`20`20`20`20`20LIB$STOP(JLG_CANT_QUEUE,1L,`26mess_d);
X`20`20`20`7D
X
X`20`20`20return;
X
X`7D`09/***`20ft_ast`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09dev_chg_ast
X
X`20`20Purpose:`09Called`20when`20the`20FT`20device`20characteristics`20are`20c
Vhanged.`20`20Here
X`09`09the`20TT`20characteristics`20are`20changed`20to`20match.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09none
X
X`20`20Global`20variables:
X
X`09Name`09`09`09Examine/Modify/Use/Read/Write
X`09----`09`09`09-----------------------------
X`09ft_chan`09`09`09`09`09X
X`09tt_chan`09`09`09`09`09X
X
X`20`20Return`20Codes:
X
X`09Code`09`20`09`09Reason
X`09----`09`09`09------
X`09none
X
X`20`20Termination`20Codes:
X
X`09Code`09`09`09Reason
X`09----`09`09`09------
X`09status`09`09`09return`20code`20from`20SYS$QIO
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20void`20dev_chg_ast(void)
X
X`7B`09/***`20dev_chg_ast`20***/
X`09`09`09`09`09/********`20`20`20LOCAL`20`20VARIABLES`20`20`20********/
Xstatic`09`20ULONG`09`20`20status;`09`09/*`20return`20code`20status`20holder`09
V`20`20`20`20`20`20*/
Xstatic`09`20USHORT`09`20`20speed,`09`09/*`20speed`20of`20device`09`09`20`20`20
V`20`20`20*/
X`09`09`20`20fill;`09`09`09/*`20fill`20count`09`09`09`20`20`20`20`20`20*/
Xstatic`09`20SENS_DEF`20dev_char;`09`09/*`20for`20getting`20FT`20dev`20characte
Vristics`20*/
Xstatic`09`20IO2_DEF`20`20sense_iosb,
X`09`09`20`20set_iosb;
X
X
X`20`20`20/*`20get`20the`20FT`20device's`20characteristics`20*/
X
X`20`20`20status`20=`20SYS$QIO(0,ft_chan,IO$_SENSEMODE,`26sense_iosb,0,0,`26dev
V_char,
X`09`09`20`20`20`20sizeof(dev_char),0,0,0,0);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`20`20`20LIB$STOP(status);
X
X`20`20`20dev_char.characts`20`7C=`20TT$M_NOECHO;`09/*`20make`20sure`20we're`20
Vstill`20NOECHO....`20`20`20*/
X`20`20`20dev_char.ext_char`20`7C=`20TT2$M_PASTHRU;`09/*`20....and`20PASTHRU...
V.`09`09`20`20`20`20`20`20*/
X`20`20`20speed`20=`20sense_iosb.t_speed`20`7C`20(sense_iosb.r_speed`20<<`208);
V
X`20`20`20fill`20=`20sense_iosb.cr_fill`20`7C`20(sense_iosb.lf_fill`20<<`208);
V
X
X`20`20`20status`20=`20SYS$QIO(0,tt_chan,IO$_SETMODE,`26set_iosb,0,0,`26dev_cha
Vr,
X`09`09`20`20`20`20sizeof(dev_char),speed,fill,sense_iosb.parity,0);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL)`20`26`26`20(status`20!=`2010300))
X`20`20`20`20`20`20LIB$STOP(status);
X
X`20`20`20return;
X
X`7D`09/***`20dev_chg_ast`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09bell_ast
X
X`20`20Purpose:`09Called`20when`20the`20FT`20device`20wants`20to`20tell`20the
V`20user`20to`20stop
X`09`09sending`20input.`20`20Just`20send`20a`20bell`20to`20the`20TTY.`20`20If
V`20it`20fails`20it
X`09`09isn't`20resent`20since`20this`20really`20isn't`20all`20that`20crucial.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09none
X
X`20`20Global`20variables:
X
X`09Name`09`09`09Examine/Modify/Use/Read/Write
X`09----`09`09`09-----------------------------
X`09tt_chan`09`09`09`09`09X
X
X`20`20Return`20Codes:
X
X`09Code`09`20`09`09Reason
X`09----`09`09`09------
X`09none
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20void`20bell_ast(void)
X
X`7B`09/***`20bell_ast`20***/
X`09`09`09`09`09/********`20`20`20LOCAL`20`20VARIABLES`20`20`20********/
Xstatic`09`20USHORT`09`20`20bell_char`20=`20BELL;`09/*`20char`20to`20write`20to
V`20the`20TTY`09`20`20`20`20`20`20*/
X
X
X`20`20`20bell_char`20=`20BELL;
X`20`20`20SYS$QIO(0,tt_chan,IO$_WRITEVBLK,0,0,0,`26bell_char,1,0,0,0,0);
X`20`20`20return;
X
X`7D`09/***`20bell_ast`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09xon_ast
X
X`20`20Purpose:`09Called`20when`20XON`20is`20detected`20on`20the`20FT`20device.
V`20`20Send`20an
X`09`09XON`20to`20the`20TTY.`20`20If`20it`20fails`20it`20isn't`20resent`20since
V`20this
X`09`09really`20isn't`20all`20that`20crucial.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09none
X
X`20`20Global`20variables:
X
X`09Name`09`09`09Examine/Modify/Use/Read/Write
X`09----`09`09`09-----------------------------
X`09tt_chan`09`09`09`09`09X
X
X`20`20Return`20Codes:
X
X`09Code`09`20`09`09Reason
X`09----`09`09`09------
X`09none
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20void`20xon_ast(void)
X
X`7B`09/***`20xon_ast`20***/
X`09`09`09`09`09/********`20`20`20LOCAL`20`20VARIABLES`20`20`20********/
Xstatic`09`20USHORT`09`20`20xon_char`20=`20XON;`09/*`20char`20to`20write`20to
V`20the`20TTY`09`20`20`20`20`20`20*/
X
X
X`20`20`20xon_char`20=`20XON;
X`20`20`20SYS$QIO(0,tt_chan,IO$_WRITEVBLK,0,0,0,`26xon_char,1,0,0,0,0);
X`20`20`20return;
X
X`7D`09/***`20xon_ast`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09xoff_ast
X
X`20`20Purpose:`09Called`20when`20XOFF`20is`20detected`20on`20the`20FT`20device
V.`20`20Send`20an
X`09`09XOFF`20to`20the`20TTY.`20`20If`20it`20fails`20it`20isn't`20resent`20sinc
Ve`20this
X`09`09really`20isn't`20all`20that`20crucial.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09none
X
X`20`20Global`20variables:
X
X`09Name`09`09`09Examine/Modify/Use/Read/Write
X`09----`09`09`09-----------------------------
X`09tt_chan`09`09`09`09`09X
X
X`20`20Return`20Codes:
X
X`09Code`09`20`09`09Reason
X`09----`09`09`09------
X`09none
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20void`20xoff_ast(void)
X
X`7B`09/***`20xoff_ast`20***/
X`09`09`09`09`09/********`20`20`20LOCAL`20`20VARIABLES`20`20`20********/
Xstatic`09`20USHORT`09`20`20xoff_char`20=`20XOFF;`09/*`20char`20to`20write`20to
V`20the`20TTY`09`20`20`20`20`20`20*/
X
X
X`20`20`20xoff_char`20=`20XOFF;
X`20`20`20SYS$QIO(0,tt_chan,IO$_WRITEVBLK,0,0,0,`26xoff_char,1,0,0,0,0);
X`20`20`20return;
X
X`7D`09/***`20xoff_ast`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09write_ft
X
X`20`20Purpose:`09Write`20data`20from`20TTY`20to`20the`20FT`20device.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09ft_chan`09`09`09channel`20to`20write`20to
X`09ft_buf`09`09`09buffer`20to`20write
X
X`20`20Global`20variables:
X
X`09Name`09`09`09Examine/Modify/Use/Read/Write
X`09----`09`09`09-----------------------------
X`09none
X
X`20`20Return`20Codes:
X
X`09Code`09`20`09`09Reason
X`09----`09`09`09------
X`09iosb->status`09`09error`20return`20in`20I/O`20status`20block
X`09SS$_NORMAL
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20ULONG`20write_ft(USHORT`20ft_chan,FT_BUF`20*ft_buf)
X
X`7B`09/***`20write_ft`20***/
X`09`09`09`09`09/********`20`20`20LOCAL`20`20VARIABLES`20`20`20********/
Xregister`20ULONG`09`20`20status;`09`09/*`20return`20code`20status`20holder`09
V`20`20`20`20`20`20*/
X
X
X`20`20`20status`20=`20PTD$WRITE(ft_chan,0,0,ft_buf,ft_buf->count,0,0);
X
X`20`20`20if(status`20!=`20SS$_NORMAL`20`26`26`20status`20!=`20SS$_DATAOVERUN)
V
X`20`20`20`7B
X`20`20`20`20`20`20LIB$SIGNAL(status);
X`20`20`20`20`20`20return(status);
X`20`20`20`7D
X
X`20`20`20if(ft_buf->status`20!=`20SS$_NORMAL`20`26`26`20ft_buf->status`20!=`20
VSS$_DATAOVERUN)
X`20`20`20`7B
X`20`20`20`20`20`20LIB$SIGNAL(ft_buf->status);
X`20`20`20`20`20`20return(ft_buf->status);
X`20`20`20`7D
X
X`20`20`20return(SS$_NORMAL);
X
X`7D`09/***`20write_ft`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09write_tt
X
X`20`20Purpose:`09Write`20to`20the`20TTY
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09channel`09`09`09channel`20to`20write`20to
X`09buffer`09`09`09buffer`20to`20write
X`09length`09`09`09length`20of`20buffer`20to`20write`09
X
X`20`20Global`20variables:
X
X`09Name`09`09`09Examine/Modify/Use/Read/Write
X`09----`09`09`09-----------------------------
X`09none
X
X`20`20Return`20Codes:
X
X`09Code`09`20`09`09Reason
X`09----`09`09`09------
X`09status`09`09`09from`20SYS$QIO`20or`20IOSB`20of`20write`20to`20TTY
X
X`20`20Termination`20Codes:
X
X`09Code`09`09`09Reason
X`09----`09`09`09------
X`09none
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20ULONG`20write_tt(short`20channel,char`20*buffer,ULONG`20length)
X
X`7B`09/***`20write_tt`20***/
X`09`09`09`09`09/********`20`20`20LOCAL`20`20VARIABLES`20`20`20********/
Xstatic`09`20ULONG`09`20`20status;`09`09/*`20return`20code`20status`20holder`09
V`20`20`20`20`20`20*/
Xstatic`09`20IOSB_DEF`20iosb;`09`09`09/*`20I/O`20status`20block`09`09`20`20`20
V`20`20`20*/
X
X
X`20`20`20status`20=`20SYS$QIOW(0,channel,IO$_WRITEVBLK,`26iosb,0,0,buffer,leng
Vth,0,0,0,0);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`20`20`20return(status);
X
X`20`20`20if(iosb.status`20!=`20SS$_NORMAL)
X`20`20`20`20`20`20return(iosb.status);
X
X`20`20`20/*`20make`20sure`20the`20right`20number`20of`20characters`20were`20wr
Vitten`20*/
X
X`20`20`20if((ULONG)`20iosb.count`20!=`20length)
X`20`20`20`20`20`20return(SS$_NOWRT);`09`09/*`20didn't`20write`20the`20right`20
Vamount`20`20`20`20`20`20*/
X
X`20`20`20return(SS$_NORMAL);
X
X`7D`09/***`20write_tt`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09get_stamp
X
X`20`20Purpose:`09Create`20the`20time`20stamp`20string.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09stamp_buf`09`09where`20to`20put`20time`20stamp`20string
X
X`20`20Global`20variables:
X
X`09Name`09`09`09Examine/Modify/Use/Read/Write
X`09----`09`09`09-----------------------------
X`09none
X
X`20`20Return`20Codes:
X
X`09Code`09`20`09`09Reason
X`09----`09`09`09------
X`09stamp_buf`09`09pointer`20to`20where`20time`20stamp`20is
X
X`20`20Termination`20Codes:
X
X`09Code`09`09`09Reason
X`09----`09`09`09------
X`09status`09`09`09return`20code`20from`20SYS$ASCTIM`20if`20it`20fails
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20char`20*get_stamp(char`20*stamp_buf)
X
X`7B`09/***`20get_stamp`20***/
X`09`09`09`09`09/********`20`20`20LOCAL`20`20VARIABLES`20`20`20********/
Xstatic`09`20ULONG`09`20`20status;`09`09/*`20return`20code`20status`20holder`09
V`20`20`20`20`20`20*/
Xstatic`09`20char`09`20`20time_buf`5BTIME_MAX+1`5D;`09/*`20array`20for`20holdin
Vg`20time`20string`20`20`20`20`20`20*/
Xstatic`20$DESCRIPTOR(time_d,time_buf);`09/*`20for`20getting`20time`20value`09
V`20`20`20`20`20`20*/
X
X
X`20`20`20status`20=`20SYS$ASCTIM(0,`26time_d,0,0);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`20`20`20LIB$STOP(status);
X
X`20`20`20time_buf`5Btime_d.dsc$w_length`5D`20=`20'`5C0';
+-+-+-+-+-+-+-+- END OF PART 2 +-+-+-+-+-+-+-+-

Reply all
Reply to author
Forward
0 new messages