Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

JOBLOG V1.5 -- a terminal session logger, part 03/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 51
Archive-name: joblog/part03
Supersedes: joblog: Volume 1, Issue 102-106

-+-+-+-+-+-+-+-+ START OF PART 3 -+-+-+-+-+-+-+-+
X`20`20`20cat(stamp_buf,"`5B",time_buf,"`5D");
X
X`20`20`20return(stamp_buf);`09`09`09/*`20return`20pointer`20to`20time`20stamp
V`20str.`20`20*/
X
X`7D`09/***`20get_stamp`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09get_start_stamp
X
X`20`20Purpose:`09Create`20the`20greeting`20time`20stamp`20string`20for`20the
V`20log`20file.
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_start_stamp(char`20*stamp_buf)
X
X`7B`09/***`20get_start_stamp`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*/
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`09`20$DESCRIPTOR(time_d,time_buf);`09/*`20for`20getting`20time`20value
V`09`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';
X`20`20`20sprintf(stamp_buf,"`5BJOBLOG`20started`20at`20%s`5D",time_buf);
X
X`20`20`20return(stamp_buf);`09`09`09/*`20return`20pointer`20to`20time`20stamp
V`20str.`20`20*/
X
X`7D`09/***`20get_start_stamp`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09write_log
X
X`20`20Purpose:`09Write`20the`20specified`20line`20to`20the`20log`20file.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09line`09`09`09buffer`20to`20be`20written
X`09length`09`09`09length`20of`20buffer`20to`20be`20written
X`09log_rab`09`09`09RAB`20of`20log`20file
X`09flags`09`09`09current`20flag`20structure
X
X`20`20Global`20variables:
X
X`09Name`09`09`09Examine/Modify/Use/Read/Write
X`09----`09`09`09-----------------------------
X`09stamp_buf`09`09`09`09X`09`20`20X
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`09write`20to`20log`20file`20failed
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20void`20write_log(char`20*line,USHORT`20length,struct`20RAB`20*log_rab
V,
X`09`09`20`20`20`20`20`20FLAG_DEF`20*flags)
X
X`7B`09/***`20write_log`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*/
Xregister`20USHORT`09`20`20i;`09`09`09/*`20loop`20and`20array`20index`09`09`20
V`20`20`20`20`20*/
Xstatic`09`20USHORT`09`20`20buf_cnt`20=`200;`09`09/*`20number`20of`20characters
V`20in`20buffer`20`20`20`20`20*/
Xstatic`09`20char`09`20`20rec_buf`5BMAX_REC+1`5D,`09/*`20for`20constructing`20r
Vecord`20to`20write`20`20`20*/
X`09`09`20`20ch,`09`09`09/*`20for`20saving`20current`20character`09`20`20`20`20
V`20`20*/
X`09`09`20`20lastch`20=`20-1;`09`09/*`20last`20character`09`09`20`20`20`20`20
V`20*/
X
X
X`20`20`20for`20(i`20=`200;`20i`20<`20length;`20i++)
X`20`20`20`7B
X`20`20`20`20`20`20ch`20=`20line`5Bi`5D;`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/*`20get`20the`20current`20char`20*/
X
X`20`20`20`20`20`20if((ch`20==`20LINE_FEED`20`26`26`20lastch`20>=`200)`20`7C`7C
V`20buf_cnt`20>=`20MAX_REC`20-`201)
X`20`20`20`20`20`20`7B
X`09`20/*`20either`20starting`20a`20new`20line`20or`20the`20buffer`20is`20full
V`20*/
X
X`09`20log_rab->rab$l_rbf=`20`26rec_buf`5B0`5D;`09/*`20set`20up`20to`20write`20
Vline`09`09`20`20`20`20`20`20*/
X`20`20`20`20`20`20`20`20`20log_rab->rab$w_rsz=`20buf_cnt;
X
X`20`20`20`20`20`20`20`20`20status`20=`20SYS$PUT(log_rab,0,0);
X
X`09`20if(status`20!=`20RMS$_NORMAL)
X`09`20`7B
X`09`20`20`20`20kill_log();
X`09`20`20`20`20LIB$STOP(status);
X`09`20`7D
X
X`20`20`20`20`20`20`20`20`20if(flags->command`20`26`26`20flags->time_stamp)
X`09`20`7B
X`09`20`20`20`20/*`20write`20the`20time`20stamp`20to`20the`20file`20*/
X
X`09`20`20`20`20log_rab->rab$l_rbf=`20`26stamp_buf`5B0`5D;
X`20`20`20`20`20`20`20`20`20`20`20`20log_rab->rab$w_rsz=`20strlen(stamp_buf);
X
X`20`20`20`20`20`20`20`20`20`20`20`20status`20=`20SYS$PUT(log_rab,0,0);
X
X`09`20`20`20`20if(status`20!=`20RMS$_NORMAL)
X`09`20`20`20`20`20`20`20LIB$STOP(status);
X
X`09`20`20`20`20flags->command`20=`20FALSE;
X`09`20`7D
X
X`09`20buf_cnt`20=`200;`09`09`09/*`20start`20the`20new`20line`09`09`20`20`20`20
V`20`20*/
X`09`20rec_buf`5B0`5D`20=`20'`5C0';`09`09/*`20make`20it`20a`20string`09`09`20
V`20`20`20`20`20*/
X`20`20`20`20`20`20`7D
X`20
X`20`20`20`20`20`20/*`20CR`20starting`20line?`20*/
X
X`20`20`20`20`20`20if((lastch`20==`20LINE_FEED`20`7C`7C`20lastch`20<`200)`20`26
V`26`20ch`20==`20CARRIAGE_RETURN)
X`20`20`20`20`20`20`20`20`20continue;`09`09`09/*`20yes,`20ignore`20it`09`09`20
V`20`20`20`20`20*/
X
X`20`20`20`20`20`20/*`20don't`20want`20these`20in`20file`20(is`20this`20the`20w
Vay`20it`20should`20be???)`20*/
X
X`20`20`20`20`20`20if(ch`20!=`20LINE_FEED`20`26`26`20ch`20!=`20CARRIAGE_RETURN
V`20`26`26`20ch`20!=`200)
X`20`20`20`20`20`20`7B
X`09`20rec_buf`5Bbuf_cnt++`5D`20=`20ch;
X`09`20rec_buf`5Bbuf_cnt`5D`20=`20'`5C0';
X`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20lastch`20=`20ch;`09`09`09/*`20remember`20the`20last`20charac
Vter`09`20`20`20`20`20`20*/
X`20`20`20`7D
X
X`20`20`20return;
X
X`7D`09/***`20write_log`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09log_session
X
X`20`20Purpose:`09This`20is`20actually`20the`20heart`20of`20the`20program.`20
V`20`20Reads`20are
X`09`09done`20on`20the`20FT`20device`20asynchronously`20and`20the`20data`20is
V`20written
X`09`09to`20the`20TTY`20and`20the`20log`20file`20if`20logging`20is`20enabled.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09ft_chan`09`09`09channel`20to`20FT`20device
X`09tt_chan`09`09`09channel`20to`20TTY`20device
X
X`20`20Global`20variables:
X
X`09Name`09`09`09Examine/Modify/Use/Read/Write
X`09----`09`09`09-----------------------------
X`09mess_d`09`09`09`09`20`20X`09X
X`09tt_read_iosb`09`09`09`09X
X`09stamp_buf`09`09`09`09X
X`09ft_efn`09`09`09`09`09X
X`09flags`09`09`09`20`20`20X`09`20`20X
X`09tt_r_efn`09`09`09`09X
X`09wait_efn`09`09`09`09X
X`09bintim`09`09`09`09`09X
X`09ft_buf`09`09`09`20`20`20X`09`09X
X`09tt_buf`09`09`09`20`20`20X`09`09X
X`09cr_buf`09`09`09`09`20`20X`09X
X`09term_block`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`09JLG_CANT_QUEUE`09`09can't`20queue`20read`20to`20TT
X`09JLG_CANT_WRITE`09`09can't`20write`20to`20FT
X`09status
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20void`20log_session(USHORT`20ft_chan,USHORT`20tt_chan)
X
X`7B`09/***`20log_session`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`20USHORT`20`20`20length;
Xstatic`09`20char`09`20`20log_enable`5B`5D`20=`20`7B"Logging`20has`20been`20ENA
VBLED`5Cr`5Cn"`7D,
X`09`09`20`20log_disable`5B`5D`20=`20`7B"Logging`20has`20been`20DISABLED`5Cr`5C
Vn"`7D,
X`09`09`20`20stamp_enable`5B`5D`20=`20`7B"Time`20stamping`20has`20been`20ENABLE
VD`5Cr`5Cn"`7D,
X`09`09`20`20stamp_disable`5B`5D`20=`20`7B"Time`20stamping`20has`20been`20DISAB
VLED`5Cr`5Cn"`7D;
X
X
X`20`20`20cr_buf->status`20=`200;
X`20`20`20cr_buf->count`20=`201;
X`20`20`20cr_buf->data`5B0`5D`20=`20015;
X
X`20`20`20/*`20start`20reading`20from`20the`20FT`20device`20*/
X
X`20`20`20status`20=`20PTD$READ(ft_efn,ft_chan,`26ft_ast,0,`26(ft_buf->status),
VFT_DATA_MAX);
X`09`09`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`20mess_d.dsc$a_pointer`20=`20"read`20on`20FT`20device`20(in`20
Vlog_session())";
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_QUEUE,1L,`26mess_d);
X`20`20`20`20`20`20LIB$STOP(status);
X`20`20`20`7D
X
X`20`20`20flags.hangups`20=`20TRUE;`09`09/*`20enable`20hangups`20on`20the`20FT
V`20device`20`20`20`20*/
X
X`20`20`20/*`20go`20for`20it`20--`20start`20logging`20*/
X
X`20`20`20for(;;)
X`20`20`20`7B
X`20`20`20`20`20`20/*`20read`20from`20the`20TTY`20*/
X
X`20`20`20`20`20`20status`20=`20SYS$QIOW(tt_r_efn,tt_chan,IO$_READVBLK,`26tt_re
Vad_iosb,0,0,
X`09`09`09tt_buf->data,1,0,`26term_block,0,0);
X
X`20`20`20`20`20`20if(!(status`20`26`20SS$_NORMAL)`20`7C`7C`20!(tt_read_iosb.st
Vatus`20`26`20SS$_NORMAL))
X`20`20`20`20`20`20`7B
X`09`20kill_log();
X`09`20mess_d.dsc$a_pointer`20=`20"read`20on`20TT`20device";
X`09`20mess_d.dsc$w_length`20=`20(USHORT)`20strlen(mess_d.dsc$a_pointer);
X`09`20LIB$STOP(JLG_CANT_QUEUE,1L,`26mess_d);
X`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20/*`20Stall`20for`2050`20milli-seconds`20waiting`20for`20more
V`20data`20*/
X
X`20`20`20`20`20`20status`20=`20SYS$SETIMR(wait_efn,`26bintim,0,0);
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(status);
X`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20status`20=`20SYS$WAITFR(wait_efn);
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(status);
X`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20/*`20get`20the`20rest`20of`20it`20*/
X
X`20`20`20`20`20`20status`20=`20SYS$QIOW(tt_r_efn,tt_chan,IO$_READVBLK`7CIO$M_T
VIMED,`26tt_read_iosb,
X`09`09`090,0,`26(tt_buf->data`5B1`5D),TT_DATA_MAX`20-`201,0,`26term_block,
X`09`09`090,0);
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`20if(tt_buf->data`5B0`5D`20==`20CARRIAGE_RETURN`20`26`26`20fla
Vgs.time_stamp)
X`20`20`20`20`20`20`7B
X`09`20flags.command`20=`20TRUE;`09`09/*`20this`20was`20a`20command`09`09`20`20
V`20`20`20`20*/
X`09`20get_stamp(stamp_buf);`09`09/*`20create`20the`20time`20stamp`20for`20late
Vr`20`20`20`20*/
X`20`20`20`20`20`20`7D
X`20`20`20`20`20`20else
X`20`20`20`20`20`20`7B
X`09`20/*`20check`20for`20toggle`20characters`20*/
X
X`09`20if(tt_buf->data`5B0`5D`20==`20TOGGLE_LOG)
X`09`20`7B
X`09`20`20`20`20/*`20toggle`20the`20logging`20to`20the`20file`20*/
X
X`09`20`20`20`20if(flags.logging)
X`09`20`20`20`20`20`20`20write_tt(tt_chan,log_disable,(ULONG)`20sizeof(log_disa
Vble)`20-`201);
X`09`20`20`20`20else
X`09`20`20`20`20`20`20`20write_tt(tt_chan,log_enable,(ULONG)`20sizeof(log_enabl
Ve)`20-`201);
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`20`20`20`20`20`20
X`09`20`20`20`20write_ft(ft_chan,cr_buf);
X`09`20`20`20`20flags.logging`20=`20!flags.logging;
X`09`20`20`20`20flags.verify`20=`20FALSE;
X`09`20`7D
X`09`20else`20if(tt_buf->data`5B0`5D`20==`20TOGGLE_STAMP)
X`09`20`7B
X`09`20`20`20`20/*`20toggle`20time-stamping`20*/
X
X`09`20`20`20`20if(flags.time_stamp)
X`09`20`20`20`20`20`20`20write_tt(tt_chan,stamp_disable,
X`09`09`09(ULONG)`20sizeof(stamp_disable)`20-`201);
X`09`20`20`20`20else
X`09`20`20`20`20`20`20write_tt(tt_chan,stamp_enable,(ULONG)`20sizeof(stamp_enab
Vle)`20-`201);
X
X`09`20`20`20`20write_ft(ft_chan,cr_buf);
X`09`20`20`20`20flags.time_stamp`20=`20!flags.time_stamp;
X`09`20`7D
X`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20/*`20write`20it`20to`20the`20FT`20device`20*/
X
X`20`20`20`20`20`20tt_buf->count`20=`20tt_read_iosb.count`20+`201;
X
X`20`20`20`20`20`20status`20=`20write_ft(ft_chan,tt_buf);
X
X`20`20`20`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`20`20`20`7B
X`20`20`20`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20`20`20`20LIB$STOP(JLG_CANT_WRITE,1L,"to`20FT`20device");
X`20`20`20`20`20`20`7D
X`20`20`20`7D
X
X`20`20`20return;`09`09`09`09/*`20should`20never`20get`20here`09`20`20`20`20`20
V`20*/
X
X`7D`09/***`20log_session`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09ask_disposition
X
X`20`20Purpose:`09Ask`20the`20user`20what`20should`20be`20done`20with`20the`20l
Vog`20file`20and`20do
X`09`09it.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09filename`09`09name`20of`20log`20file
X`09stage_dir`09`09staging`20directory`20for`20log`20files
X`09flags`09`09`09computed`20flags
X`09args`09`09`09run-time`20arguments
X
X`20`20Global`20variables:
X
X`09Name`09`09`09Examine/Modify/Use/Read/Write
X`09----`09`09`09-----------------------------
X`09disp_failed`09`09`09`20`20X
X`09tt_chan`09`09`09`09`09X
X`09LIB$M_CLI_CTRLY`09`09`09`09X
X
X`20`20Return`20Codes:
X
X`09Code`20`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
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20void`20ask_disposition(char`20*logfile,char`20*stage_dir,FLAG_DEF`20*
Vflags,
X`09`09`09`20`20`20`20ARG_DEF`20*args)
X
X`7B`09/***`20ask_disposition`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`20disable_mask;`09`09/*`20for`20disabling`20control-Y`20at`20DCL`20
V`20`20`20`20*/
X`09`20char`09`20`20*save_ptr;`09`09/*`20saved`20logfile`20name`09`09`20`20`20
V`20`20`20*/
X`09`20USHORT`09`20`20done,`09`09`09/*`20loop`20control`20variable`09`20`20`20
V`20`20`20*/
X`09`09`20`20length;`09`09/*`20length`20of`20read`20from`20my_gets`09`20`20`20
V`20`20`20*/
X`09`20char`09`20`20ch`5B10`5D;`09`09/*`20character`20read`20in`09`09`20`20`20
V`20`20`20*/
Xstatic`20$DESCRIPTOR(in_d,"SYS$INPUT");`09/*`20input`20channel`20descriptor`09
V`20`20`20`20`20`20*/
X
X
X`20`20`20disable_mask`20=`20LIB$M_CLI_CTRLY;`09/*`20tell`20DCL`20to`20ignore
V`20control-Y`09`20`20`20`20`20`20*/
X
X`20`20`20status`20=`20LIB$DISABLE_CTRL(`26disable_mask);
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$SIGNAL(status);
X`20`20`20`7D
X
X`20`20`20if(flags->verify)
X`20`20`20`20`20`20my_puts("`5Cn`5CnYour`20log`20file`20is`20VERIFIED.");
X`20`20`20else
X`20`20`20`20`20`20my_puts("`5Cn`5CnYour`20log`20file`20is`20UNVERIFIED.");
X
X`20`20`20done`20=`20FALSE;
X`20`20`20status`20=`20SUCCESS;`09`09`09/*`20just`20to`20be`20sure`09`09`20`20
V`20`20`20`20*/
X
X`20`20`20do
X`20`20`20`7B
X`20`20`20`20`20`20if(args->print)
X`09`20ch`5B0`5D`20=`20'P';`09`09`09/*`20user`20specified`20/PRINT`09`20`20`20
V`20`20`20*/
X`20`20`20`20`20`20else`20if(args->mail)
X`09`20ch`5B0`5D`20=`20'M';
X`20`20`20`20`20`20else`20if(args->save)
X`09`20ch`5B0`5D`20=`20'S';
X`20`20`20`20`20`20else
X`20`20`20`20`20`20`7B
X`09`20my_puts("`5Cn`5CnDo`20you`20want`20to:");
X`09`20my_puts("`20`20Print`20your`20log`20file?`20`20`20`20`20`20`20`20`20`20
V`20`20`20`20`20`20`20`20Enter`20p");
X`09`20my_puts("`20`20Save`20log`20to`20your`20area?`20`20`20`20`20`20`20`20`20
V`20`20`20`20`20`20`20Enter`20s");
X`09`20my_puts("`20`20Mail`20notification`20of`20log`20to`20someone?`20`20Enter
V`20m");
X`09`20my_puts("`20`20Delete`20your`20log`20file?`20`20`20`20`20`20`20`20`20`20
V`20`20`20`20`20`20`20Enter`20d`5Cn");
X`09`20status`20=`20my_gets(tt_chan,`26ch`5B0`5D,"`20`20`20`20`20Your`20choice
V`20`5Bdefault`20is`20d`5D`20?`20",
X`09`09`09`20`20`26length,sizeof(ch)`20-`201);
X`09`20squeeze_str(ch);
X
X`09`20if(status`20==`20CANCEL)
X`09`20`20`20`20ch`5B0`5D`20=`20'D';`09`09/*`20`5EC`20or`20`5EY`09`09`09`20`20
V`20`20`20`20*/
X`09`20else`20if(ch`5B0`5D`20==`20CARRIAGE_RETURN`20`7C`7C`20ch`5B0`5D`20==`20'
V`5C0')
X`09`20`20`20`20ch`5B0`5D`20=`20'D';`20`09`09/*`20default`20is`20delete`09`09
V`20`20`20`20`20`20*/
X`09`20else`20if((status`20==`20SUCCESS`20`26`26`20ch`5B1`5D`20!=`20'`5C0')`20
V`7C`7C`20status`20==`20FAILURE)
X`09`20`20`20`20ch`5B0`5D`20=`20'`5C0';`09`09/*`20more`20than`20one`20char;`20e
Vrror`09`20`20`20`20`20`20*/
X`09`20else
X`09`20`20`20`20ch`5B0`5D`20=`20_toupper(ch`5B0`5D);
X`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20switch(ch`5B0`5D)
X`20`20`20`20`20`20`7B
X`09`20case('P'):
X
X`09`20`20`20`20/*`20user`20wants`20it`20printed`20*/
X
X`09`20`20`20`20status`20=`20print_log(logfile,tt_chan,flags->verify);
X
X`09`20`20`20`20if(status`20==`20FAILURE)
X`09`20`20`20`20`7B
X`09`20`20`20`20`20`20`20my_puts("`5Cn`5C7*ERROR*`20Cannot`20print`20log`20file
V");
X`09`20`20`20`20`20`20`20args->print`20=`20FALSE;`09/*`20start`20over`09`09`09
V`20`20`20`20`20`20*/
X`09`20`20`20`20`20`20`20disp_failed`20=`20TRUE;`09/*`20ensure`20user`20is`20pr
Vompted`20next`20time`20`20*/
X`09`20`20`20`20`7D
X`09`20`20`20`20else`20if(status`20==`20CANCEL)
X`09`20`20`20`20`7B
X`09`20`20`20`20`20`20`20/*`20user`20entered`20`5EC`20or`20`5EY;`20delete`20the
V`20log`20file`20and`20get`20out`20*/
X
X`09`20`20`20`20`20`20`20delete_log(logfile);
X`09`20`20`20`20`20`20`20my_puts("`5CnLog`20file`20deleted.`5Cn");
X`09`20`20`20`20`20`20`20done`20=`20TRUE;
X`09`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20else
X`09`20`20`20`20`7B
X`09`20`20`20`20`20`20`20done`20=`20TRUE;`09`09/*`20no`20need`20to`20delete`20l
Vog`20file`20here`20`20`20`20*/
X`09`20`20`20`20`7D
X
X`09`20`20`20`20break;
X
X`09`20case('S'):
X
X`09`20`20`20`20status`20=`20save_log(logfile,tt_chan);
X
X`09`20`20`20`20if(status`20==`20FAILURE)
X`09`20`20`20`20`7B
X`09`20`20`20`20`20`20`20my_puts("`5Cn`5C7*ERROR*`20Cannot`20save`20log`20file"
V);
X`09`20`20`20`20`20`20`20args->save`20=`20FALSE;`09/*`20start`20over`09`09`09
V`20`20`20`20`20`20*/
X`09`20`20`20`20`20`20`20disp_failed`20=`20TRUE;`09/*`20ensure`20user`20is`20pr
Vompted`20next`20time`20`20*/
X`09`20`20`20`20`7D
X`09`20`20`20`20else`20if(status`20==`20CANCEL)
X`09`20`20`20`20`7B
X`09`20`20`20`20`20`20`20/*`20user`20entered`20`5EC`20or`20`5EY;`20delete`20the
V`20log`20file`20and`20get`20out`20*/
X
X`09`20`20`20`20`20`20`20delete_log(logfile);
X`09`20`20`20`20`20`20`20my_puts("`5CnLog`20file`20deleted.`5Cn");
X`09`20`20`20`20`20`20`20done`20=`20TRUE;
X`09`20`20`20`20`7D
X`09`20`20`20`20else
X`09`20`20`20`20`7B
X`09`20`20`20`20`20`20`20done`20=`20TRUE;
X`09`20`20`20`20`20`20`20delete_log(logfile);
X`09`20`20`20`20`7D
X
X`09`20`20`20`20break;
X
X`09`20case('D'):
X
X`09`20`20`20`20/*`20we`20really`20don't`20care`20too`20much`20if`20delete()`20
Vfails`20since
X`09`20`20`20`20`20*`20the`20batch`20job`20will`20kill`20it`20anyway;`20besides
V,`20it`20should`20never
X`09`20`20`20`20`20*`20fail
X`09`20`20`20`20`20*/
X
X`09`20`20`20`20delete_log(logfile);
X`09`20`20`20`20my_puts("`5CnLog`20file`20deleted.`5Cn");
X`09`20`20`20`20done`20=`20TRUE;
X
X`09`20`20`20`20break;
X
X`09`20case('M'):
X
X`09`20`20`20`20status`20=`20mail_log(logfile,stage_dir,tt_chan,flags->verify);
V
X
X`09`20`20`20`20if(status`20==`20FAILURE`20`7C`7C`20status`20==`20NO_INPUT)
X`09`20`20`20`20`7B
X`09`20`20`20`20`20`20`20args->mail`20=`20FALSE;
X`09`20`20`20`20`20`20`20disp_failed`20=`20TRUE;`09/*`20ensure`20user`20is`20pr
Vompted`20next`20time`20`20*/
X`09`20`20`20`20`7D
X`09`20`20`20`20else`20if(status`20==`20CANCEL)
X`09`20`20`20`20`7B
X`09`20`20`20`20`20`20`20/*`20user`20entered`20`5EC`20or`20`5EY;`20delete`20the
V`20log`20file`20and`20get`20out`20*/
X
X`09`20`20`20`20`20`20`20delete_log(logfile);
X`09`20`20`20`20`20`20`20my_puts("`5CnLog`20file`20deleted.`5Cn");
X`09`20`20`20`20`20`20`20done`20=`20TRUE;
X`09`20`20`20`20`7D
X`09`20`20`20`20else`20if(status`20==`20SUCCESS)
X`09`20`20`20`20`7B
X`09`20`20`20`20`20`20`20done`20=`20TRUE;
X`09`20`20`20`20`20`20`20delete_log(logfile);
X`09`20`20`20`20`7D
X
X`09`20`20`20`20break;
X
X`09`20default:
X
X`09`20`20`20`20/*`20bad`20option`20specified;`20try`20again`20*/
X
X`09`20`20`20`20my_puts("`5Cn`5C7Invalid`20option.`20`20Try`20again.");
X`09`20`20`20`20break;
X`20`20`20`20`20`20`7D
X`20`20`20`7D
X`20`20`20while(!done);
X
X`20`20`20status`20=`20LIB$ENABLE_CTRL(`26disable_mask);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`20`20`20LIB$STOP(status);
X
X`20`20`20return;
X
X`7D`09/***`20ask_disposition`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09get_file
X
X`20`20Purpose:`09Create`20a`20filename`20and`20open`20the`20log`20file.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09filename`09`09name`20of`20log`20file
X`09log_dir`09`09`09directory`20where`20log`20files`20live
X`09log_fab`09`09`09FAB`20for`20log`20file
X`09log_rab`09`09`09RAB`20for`20log`20file
X`09log_xabpro`09`09XABPRO`20for`20log`20file
X`09args`09`09`09command-line`20arguments
X`09flags`09`09`09program`20flags
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
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`20system`20calls
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20ULONG`20get_file(char`20*filename,char`20*log_dir,struct`20FAB`20*log
V_fab,
X`09`09`20`20`20`20`20`20struct`20RAB`20*log_rab,struct`20XABPRO`20*log_xabpro,
V
X`09`09`20`20`20`20`20`20ARG_DEF`20*args,FLAG_DEF`20*flags)
X
X`7B`09/***`20get_file`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
X
X#ifdef`20PHOTO_MODE
X
X`20`20`20strcpy(filename,"JOBLOG.LOG");
X
X#else
X
X`20`20`20/*`20turn`20on`20SYSPRV`20so`20we`20can`20create`20the`20log`20file
V`20*/
X
X`20`20`20privs`5B0`5D`20=`20PRV$M_SYSPRV;
X
X`20`20`20status`20=`20SYS$SETPRV(ON,`26privs,FALSE,`26old_privs);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`20`20`20return(status);
X
X`20`20`20strcpy(filename,"JOBXXXXXX");`09/*`20make`20our`20own`20log`20file`20
Vname`09`20`20`20`20`20`20*/
X
X`20`20`20if(mktemp(filename)`20==`20NULL)
X`20`20`20`7B
X`20`20`20`20`20`20my_puts("JOBLOG`20--`20cannot`20create`20log`20file`20name
V`5Cn");
X`20`20`20`20`20`20SYS$EXIT();
X`20`20`20`7D
X
X`20`20`20strcat(filename,".LOG");
X`20`20`20strcpy(flags->filename,filename);`09/*`20save`20filename`20for`20late
Vr`09`20`20`20`20`20`20*/
X`20`20`20strins(filename,log_dir,0);`09`09/*`20add`20secure`20directory`20name
V`09`20`20`20`20`20`20*/
X
X#endif
X
X`20`20`20*log_fab`20=`20cc$rms_fab;
X`20`20`20*log_rab`20=`20cc$rms_rab;
X`20`20`20*log_xabpro`20=`20cc$rms_xabpro;
X
X`20`20`20/*`20if`20we`20were`20doing`20exact`20logging,`20we`20would`20have`20
Va`20test`20here`20for`20it`20and
X`20`20`20`20*`20we`20would`20open`20the`20log`20file`20appropriately;`20since
V`20exact`20logging`20is`20such
X`20`20`20`20*`20a`20pain`20in`20the`20a*s,`20we'll`20just`20assume`20everythin
Vg`20is`20"unexact"`20(is`20that
X`20`20`20`20*`20even`20a`20word?)
X`20`20`20`20*/
X
X`20`20`20log_fab->fab$l_fna`20=`20filename;`09/*`20name`20of`20log`20file`09
V`09`20`20`20`20`20`20*/
X`20`20`20log_fab->fab$b_fns`20=`20(UCHAR)`20strlen(filename);
X`20`20`20log_fab->fab$l_fop`20=`20FAB$M_SUP;`09/*`20supersede`20old`20version
V`20of`20log`20file`20`20*/
X`20`20`20log_fab->fab$l_fop`20=`20FAB$M_MXV;`09/*`20supersede`20old`20version
V`20of`20log`20file`20`20*/
X`20`20`20log_fab->fab$b_org`20=`20FAB$C_SEQ;`09/*`20sequential`20access`09`09
V`20`20`20`20`20`20*/
X`20`20`20log_fab->fab$b_rat`20=`20FAB$M_CR;`09/*`20CR`20attributes`20for`20rec
Vords`09`20`20`20`20`20`20*/
X`20`20`20log_fab->fab$b_rfm`20=`20FAB$C_VAR;`09/*`20variable-length`20records
V`09`20`20`20`20`20`20*/
X`20`20`20log_fab->fab$b_shr`20=`20FAB$M_NIL;`09/*`20don't`20allow`20sharing`09
V`09`20`20`20`20`20`20*/
X`20`20`20log_fab->fab$l_xab`20=`20(void`20*)`20log_xabpro;`20`20/*`20for`20set
Vting`20prot`20on`20close`20`20`20`20`20*/
X
X`20`20`20log_rab->rab$l_fab`20=`20log_fab;`09/*`20FAB`20for`20log`20file`09`09
V`20`20`20`20`20`20*/
X`20`20`20log_rab->rab$b_rac`20=`20RAB$C_SEQ;`09/*`20sequential`20access`09`09
V`20`20`20`20`20`20*/
X`20`20`20log_rab->rab$l_rop`20=`20RAB$M_WBH;
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
V`7C`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`20`20`20status`20=`20SYS$CREATE(log_fab);
X
X`20`20`20if(!(status`20`26`20RMS$_NORMAL))
X`20`20`20`20`20`20return(status);
X
X`20`20`20status`20=`20SYS$CONNECT(log_rab);
X
X`20`20`20if(!(status`20`26`20RMS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20kill_log();
X`20`20`20`20`20`20return(status);
X`20`20`20`7D
X
X#ifndef`20PHOTO_MODE
X
X`20`20`20/*`20now`20that`20the`20file`20is`20open,`20turn`20SYSPRV`20off`20aga
Vin`20to`20be`20safe`20*/
X
X`20`20`20privs`5B0`5D`20=`20PRV$M_SYSPRV;
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`20`20`20return(status);
X
X#endif
X
X`20`20`20return(RMS$_NORMAL);
X
X`7D`09/***`20get_file`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09welcome
X
X`20`20Purpose:`09Write`20the`20welcome`20message`20to`20the`20tty.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09args`09`09`09run-time`20arguments
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`09none
X
X`20`20Termination`20Codes:
X
X`09Code`09`09`09Reason
X`09----`09`09`09------
X`09status`09`09`09return`20code`20from`20system`20calls
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20void`20welcome(ARG_DEF`20*args)
X
X`7B`09/***`20welcome`20***/
X`09`09`09`09`09/********`20`20`20LOCAL`20`20VARIABLES`20`20`20********/
X`09`20USHORT`09`20`20i`20=`200;`09`09/*`20array`20index`09`09`09`20`20`20`20
V`20`20*/
Xstatic`09`20char`09`20`20*text`5B`5D`20=`20`7B`09`09/*`20stuff`20to`20say`20up
Von`20entry`20to`20JOBLOG`20`20*/
X`7B"`20"`7D,
X`7B"Welcome`20to`20JOBLOG!`20`20Please`20try`20not`20to`20use`20full-screen`20
Veditors`20or`20other"`7D,
X`7B"screen-oriented`20programs`20as`20they`20tend`20not`20to`20be`20logged`20c
Vorrectly."`7D,
X`7B"`20"`7D,
X`7B"Also,`20please`20don't`20use`20SET`20HOST`20as`20it`20causes`20problems`20
Vwith`20JOBLOG`20log"`7D,
X`7B"files."`7D,
X`7B"`20"`7D,
X`7B"To`20exit`20JOBLOG,`20enter`20LOGOUT."`7D,
X`7B"`20"`7D,
X`7B""`7D`7D;`20`20`20`20`20`20`20
X
X
X#ifndef`20PHOTO_MODE
X
X`20`20`20if(!args->expert)
X`20`20`20`20`20`20while(*text`5Bi`5D`20!=`20'`5C0')
X`09`20my_puts(text`5Bi++`5D);
X
X#endif
X
X`20`20`20my_puts("`5CnJOBLOG`20started.`5Cn");`09`09/*`20mandatory`20startup
V`20message`09`20`20`20`20`20`20*/
X`20`20`20return;
X
X`7D`09/***`20welcome`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09copy_file
X
X`20`20Purpose:`09Make`20a`20copy`20of`20a`20file.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09source`09`09`09file`20to`20be`20copied
X`09dest`09`09`09where`20copy`20is`20to`20go
X`09priv_flag`09`09TRUE`20if`20copying`20to`20staging`20area
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
X`20`20Return`20Codes:
X
X`09Code`09`20`09`09Reason
X`09----`09`09`09------
X`09SUCCESS
X`09FAILURE
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20ULONG`20copy_file(char`20*source,char`20*dest,USHORT`20priv_flag)
X
X`7B`09/***`20copy_file`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`20status2,`09`09/*`20some`20secondary`20return`20codes`09`20`20`20
V`20`20`20*/
X`09`09`20`20status3,
X`09`09`20`20status4;
X`09`20char`20`20`09`20`20in_buf`5BIN_BUF_MAX+1`5D;`09/*`20buffer`20for`20readi
Vng/writing`09`20`20`20`20`20`20*/
Xstruct`09`20FAB`09`20`20in_fab,`09`09/*`20FAB's`20for`20input`20and`20output
V`20files`20`20`20*/
X`09`09`20`20out_fab;
Xstruct`09`20RAB`09`20`20in_rab,`09`09/*`20RAB's`20for`20input`20and`20output
V`20files`20`20`20*/
X`09`09`20`20out_rab;
X
X
X`20`20`20in_fab`20=`20cc$rms_fab;`20`20`09`09/*`20initialize`20all`20of`20the
V`20RMS`20blocks`20`20`20*/
X`20`20`20in_rab`20=`20cc$rms_rab;
X`20`20`20out_rab`20=`20cc$rms_rab;
X
X`20`20`20in_fab.fab$b_fac`20=`20FAB$M_BIO`20`7C`09/*`20block`20I/O`20for`20inp
Vut`20file`09`20`20`20`20`20`20*/
X`09`09`20`20`20`20`20`20FAB$M_GET;
X`20`20`20`20`20`20`20`20`20`20`20`20`20
X`20`20`20in_fab.fab$l_fna`20=`20source;
X`20`20`20in_fab.fab$b_fns`20=`20(UCHAR)`20strlen(source);
X`20`20`20in_fab.fab$b_fac`20=`20FAB$M_BIO`20`7C`20FAB$M_GET;
X
X`20`20`20in_rab.rab$l_fab`20=`20`26in_fab;`09`09/*`20pointer`20to`20input`20FA
VB`09`09`20`20`20`20`20`20*/
X`20`20`20in_rab.rab$b_rac`20=`20RAB$C_SEQ;`09/*`20sequential`20access`20for`20
Vcopy`09`20`20`20`20`20`20*/
X`20`20`20in_rab.rab$w_usz`20=`20IN_BUF_MAX;`09/*`20length`20of`20input`20buffe
Vr`09`20`20`20`20`20`20*/
X`20`20`20in_rab.rab$l_ubf`20=`20in_buf;`09`09/*`20pointer`20to`20buffer`09`09
V`20`20`20`20`20`20*/
X
X`20`20`20out_rab.rab$l_fab`20=`20`26out_fab;`09/*`20pointer`20to`20input`20FAB
V`09`09`20`20`20`20`20`20*/
X`20`20`20out_rab.rab$b_rac`20=`20RAB$C_SEQ;`09/*`20sequential`20access`20for
V`20copy`09`20`20`20`20`20`20*/
X`20`20`20out_rab.rab$w_usz`20=`20IN_BUF_MAX;`20`09/*`20length`20of`20output`20
Vbuffer`09`20`20`20`20`20`20*/
X`20`20`20out_rab.rab$l_rbf`20=`20in_buf;`20`09`09/*`20pointer`20to`20buffer`09
V`09`20`20`20`20`20`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`20`20`20return(FAILURE);
X
X`20`20`20/*`20open`20the`20input`20file`20*/
X
X`20`20`20status`20=`20SYS$OPEN(`26in_fab);
X
X`20`20`20if(!(status`20`26`20RMS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20SYS$CLOSE(`26in_fab);
X`20`20`20`20`20`20return(FAILURE);
X`20`20`20`7D
X
X`20`20`20/*`20connect`20the`20input`20file's`20RMS`20blocks`20*/
X
X`20`20`20status`20=`20SYS$CONNECT(`26in_rab);
X
X`20`20`20if(!(status`20`26`20RMS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20SYS$CLOSE(`26in_fab);
X`20`20`20`20`20`20return(FAILURE);
X`20`20`20`7D
X
X`20`20`20out_fab`20=`20in_fab;`20`20`09`09`09/*`20copy`20the`20input`20file's
V`20FAB`09`20`20`20`20`20`20*/
X`20`20`20out_fab.fab$w_ifi`20=`200;`20`09`09/*`20reset`20this!`09`09`09`20`20
V`20`20`20`20*/
X`20`20`20out_fab.fab$b_fac`20=`20FAB$M_BIO`20`7C`20FAB$M_PUT;
X
X`20`20`20out_fab.fab$l_fna`20=`20dest;
X`20`20`20out_fab.fab$b_fns`20=`20(UCHAR)`20strlen(dest);
X
X
X`20`20`20if(priv_flag`20==`20FALSE)`09`09/*`20copying`20to`20staging`20area?
V`09`20`20`20`20`20`20*/
X`20`20`20`7B
X`20`20`20`20`20`20/*`20copying`20to`20user's`20area;`20turn`20off`20SYSPRV`20*
VBEFORE*`20opening`20the
X`20`20`20`20`20`20`20*`20destination`20file
X`20`20`20`20`20`20`20*/
X
X`20`20`20`20`20`20status`20=`20SYS$SETPRV(OFF,`26privs,FALSE,NULL);
X
X`20`20`20`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`09`20return(FAILURE);
X`20`20`20`7D
X
X`20`20`20/*`20open`20the`20output`20file`20*/
X
X`20`20`20status`20=`20SYS$CREATE(`26out_fab);
X
X`20`20`20if(!(status`20`26`20RMS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20SYS$CLOSE(`26out_fab);
X`20`20`20`20`20`20SYS$CLOSE(`26in_fab);`20
X`20`20`20`20`20`20return(FAILURE);
X`20`20`20`7D
X
X`20`20`20/*`20connect`20the`20output`20file's`20RMS`20blocks`20*/
X
X`20`20`20status`20=`20SYS$CONNECT(`26out_rab);
X
X`20`20`20if(!(status`20`26`20RMS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20SYS$CLOSE(`26out_fab);
X`20`20`20`20`20`20SYS$CLOSE(`26in_fab);
X`20`20`20`20`20`20return(FAILURE);
X`20`20`20`7D
X
X`20`20`20if(priv_flag`20==`20TRUE)`09`09/*`20privs`20still`20on?`09`09`20`20
V`20`20`20`20*/
X`20`20`20`7B
X`20`20`20`20`20`20/*`20SYSPRV`20was`20left`20on`20so`20that`20the`20destinatio
Vn`20file`20(which`20is`20in`20the
X`20`20`20`20`20`20`20*`20staging`20area)`20could`20be`20created;`20turn`20it
V`20off
X`20`20`20`20`20`20`20*/
X
X`20`20`20`20`20`20status`20=`20SYS$SETPRV(OFF,`26privs,FALSE,NULL);
X
X`20`20`20`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`09`20return(FAILURE);
X`20`20`20`7D
X
X`20`20`20/*`20now`20copy`20the`20input`20file`20to`20the`20output`20file`20*/
V
X
X`20`20`20status`20=`20SYS$READ(`26in_rab);
X`20`20`20status2`20=`20RMS$_NORMAL;`09`09/*`20have`20to`20lie`20to`20fool`20th
Ve`20loop`09`20`20`20`20`20`20*/
X
X`20`20`20while((status`20==`20RMS$_NORMAL)`20`26`26`20(status2`20==`20RMS$_NOR
VMAL))
X`20`20`20`7B
X`20`20`20`20`20`20out_rab.rab$w_rsz`20=`20in_rab.rab$w_rsz;
X`20`20`20`20`20`20status2`20=`20SYS$WRITE(`26out_rab);
X`20`20`20`20`20`20status`20=`20SYS$READ(`26in_rab);
X`20`20`20`7D
X
X`20`20`20/*`20close`20both`20of`20the`20files`20*/
X
X`20`20`20status3`20=`20SYS$CLOSE(`26in_fab);
X`20`20`20status4`20=`20SYS$CLOSE(`26out_fab);
X
X`20`20`20/*`20did`20the`20loop`20terminate`20properly?`20if`20not,`20delete`20
Vthe`20output`20file`20and
X`20`20`20`20*`20scream`20at`20the`20user
X`20`20`20`20*/
X
X`20`20`20if(status`20!=`20RMS$_EOF`20`7C`7C`20status2`20!=`20RMS$_NORMAL`20`7C
V`7C`20status3`20!=`20RMS$_NORMAL`20`7C`7C
X`20`20`20`20`20`20status4`20!=`20RMS$_NORMAL)
X`20`20`20`20`20`20return(FAILURE);
X
X`20`20`20return(SUCCESS);
X
X`7D`09/***`20copy_file`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09print_log
X
X`20`20Purpose:`09Print`20the`20log`20file`20(verified`20or`20nonverified)`20to
V`20the`20line
X`09`09printer.`20`20The`20/DELETE`20qualifier`20is`20passed`20to`20the`20print
V`20job
X`09`09so`20that`20the`20log`20file`20is`20deleted`20after`20printing.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09logfile`09`09`09name`20of`20log`20file
X`09channel`09`09`09TTY`20channel
X`09verify_flag`09`09TRUE`20=`20verified`20LPT`20copy
X
X`20`20Global`20variables:
X
X`09Name`09`09`09Examine/Modify/Use/Read/Write
X`09----`09`09`09-----------------------------
X`09disp_failed`09`09`20`20`20X
X`09privs`09`09`09`09`20`20X`09X
X
X`20`20Return`20Codes:
X
X`09Code`09`20`09`09Reason
X`09----`09`09`09------
X`09SUCCESS
X`09FAILURE
X`09CANCEL
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20ULONG`20print_log(char`20*logfile,USHORT`20channel,UCHAR`20verify_fla
Vg)
X
X`7B`09/***`20print_log`20***/
X`20`20`20`09`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`09`20`20status2;`09`09/*`20another`20return`20code`20holder`09`20`20`20`20
V`20`20*/
X`09`20long`09`20`20entry_num;`09`09/*`20entry`20number`20in`20queue`09`20`20
V`20`20`20`20*/
X`09`20USHORT`09`20`20length;`09`09/*`20length`20of`20status`20string`09`20`20
V`20`20`20`20*/
X`09`20IOSB_DEF`20iosb;`09`09`09/*`20I/O`20status`20block`09`09`20`20`20`20`20
V`20*/
Xstatic`09`20char`09`20`20def_queue`5BQUEUE_MAX+1`5D,
X`09`09`20`20queue`5BQUEUE_MAX+1`5D,`09/*`20queue`20to`20use`20for`20call`09`20
V`20`20`20`20`20*/
X`09`09`20`20prompt`5BBUFSIZ`5D,
X`09`09`20`20status_str`5BSTATUS_STR_MAX+1`5D,
X`09`09`20`20*account`20=`20"VERIFY",
X`09`09`20`20*account2`20=`20"UNVERIFY",
X`09`09`20`20*job_name`20=`20"VERIFIED_JOBLOG",
X`09`09`20`20*job_name2`20=`20"UNVERIFIED_JOBLOG",
X`09`09`20`20*verified`20=`20"Verified`20JOBLOG`20listing",
X`09`09`20`20*unverified`20=`20"Unverified`20JOBLOG`20listing";
Xstatic`20$DESCRIPTOR(print_d,"PRINT");
Xstatic`20$DESCRIPTOR(table_d,"LNM$PROCESS");
Xstatic`20$DESCRIPTOR(table2_d,"LNM$SYSTEM");
Xstatic`20$DESCRIPTOR(queue_d,queue);
Xstatic`20$DESCRIPTOR(sys_print_d,"SYS$PRINT");
Xstatic`09`20ITM_LST`20`20items`5B`5D`20=`20`7B`09`09/*`20item`20list`20for`20s
Vtuff`20we`20want`20to`20do`20`20*/
X`7B0,SJC$_ACCOUNT_NAME,0L,0L`7D,
X`7B0,SJC$_FILE_SPECIFICATION,0L,0L`7D,
X`7B0,SJC$_DELETE_FILE,0L,0L`7D,
X`7B0,SJC$_ENTRY_NUMBER_OUTPUT,0L,0L`7D,
X`7B0,SJC$_JOB_NAME,0L,0L`7D,
X`7B0,SJC$_JOB_STATUS_OUTPUT,0L,0L`7D,
X`7B0,SJC$_NOTE,0L,0L`7D,
X`7B0,SJC$_NOTIFY,0L,0L`7D,
X`7B0,SJC$_QUEUE,0L,0L`7D,
X`7B0,0,0L,0L`7D`7D,
X`09`09`20`20items2`5B`5D`20=`20`7B`09`09/*`20items`20obtained`20during`20trans
Vlation`20`20*/
X`7B0,LNM$_STRING,NULL,NULL`7D,`09`09/*`20things`20are`20filled`20in`20below`09
V`20`20`20`20`20`20*/
X`7B0,0,NULL,NULL`7D`7D;
X
X`20`20`20
X`20`20`20status`20=`20CLI$GET_VALUE(`26print_d,`26queue_d,`26length);
X
X`20`20`20if(status`20==`20SS$_NORMAL`20`26`26`20!disp_failed)
X`20`20`20`20`20`20queue`5Blength`5D`20=`20'`5C0';`09`09/*`20use`20it`09`09`09
V`20`20`20`20`20`20*/
X`20`20`20else
X`20`20`20`7B
X`20`20`20`20`20`20/*`20get`20the`20current`20default`20print`20queue`20from`20
VSYS$PRINT`20*/
X
X`20`20`20`20`20`20items2`5B0`5D.buf_addr`20=`20def_queue;
X`20`20`20`20`20`20items2`5B0`5D.ret_len`20=`20`26length;
X`20`20`20`20`20`20items2`5B0`5D.buf_len`20=`20sizeof(def_queue);
X`20`20`20`20`20`20length`20=`200;
X
X`20`20`20`20`20`20/*`20check`20the`20user's`20process`20table`20first`20*/
X
X`20`20`20`20`20`20status`20=`20SYS$TRNLNM(0L,`26table_d,`26sys_print_d,0,`26it
Vems2);
X
X`20`20`20`20`20`20if(status`20!=`20SS$_NORMAL`20`7C`7C`20length`20==`200)
X`20`20`20`20`20`20`7B
X`09`20status`20=`20SYS$TRNLNM(0L,`26table2_d,`26sys_print_d,0,`26items2);
X
X`09`20if(status`20!=`20SS$_NORMAL`20`7C`7C`20length`20==`200)
X`09`20`7B
X`09`20`20`20`20my_puts("`5Cn`5C7*ERROR*`20SYS$PRINT`20not`20defined.`5Cn");
X`09`20`20`20`20return(FAILURE);
X`09`20`7D
X`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20my_puts("`20");
X
X`20`20`20`20`20`20def_queue`5Blength`5D`20=`20'`5C0';`09`09/*`20make`20it`20a
V`20string`09`09`20`20`20`20`20`20*/
X`20`20`20`20`20`20cat(prompt,"Which`20printer`20did`20you`20want`20to`20use`20
V`5Bdefault`20is`20",def_queue,
X`09`20`20"`5D?`20");
X
X`20`20`20`20`20`20status`20=`20my_gets(channel,queue,prompt,`26length,sizeof(q
Vueue)`20-`201);
X
X`20`20`20`20`20`20if(status`20==`20FAILURE)
X`09`20return(FAILURE);
X`20`20`20`20`20`20else`20if(status`20==`20CANCEL)
X`09`20return(CANCEL);
X
X`20`20`20`20`20`20/*`20input`20is`20ok`20if`20we`20get`20here`20*/
X
X`20`20`20`20`20`20queue`5Blength`5D`20=`20'`5C0';
X`20`20`20`20`20`20str_pref_trim(queue);
X`20`20`20`20`20`20str_post_trim(queue);
X
X`20`20`20`20`20`20if(queue`5B0`5D`20==`20'`5C0')
X`09`20strcpy(queue,def_queue);`09/*`20use`20the`20default`09`09`20`20`20`20`20
V`20*/
X`20`20`20`7D
X
X`20`20`20/*`20set`20up`20the`20item`20list`20so`20we`20can`20print`20*/
X
X`20`20`20items`5B1`5D.buf_len`20=`20strlen(logfile);
X`20`20`20items`5B1`5D.buf_addr`20=`20logfile;
X`20`20`20items`5B3`5D.buf_len`20=`20sizeof(long);
X`20`20`20items`5B3`5D.buf_addr`20=`20(char`20*)`20`26entry_num;
X`20`20`20items`5B5`5D.buf_len`20=`20STATUS_STR_MAX;
X`20`20`20items`5B5`5D.buf_addr`20=`20status_str;
X`20`20`20items`5B5`5D.ret_len`20=`20`26length;
X`20`20`20items`5B8`5D.buf_len`20=`20strlen(queue);
X`20`20`20items`5B8`5D.buf_addr`20=`20queue;
X
X`20`20`20if(verify_flag)
X`20`20`20`7B
X`20`20`20`20`20`20items`5B0`5D.buf_len`20=`20strlen(account);
X`20`20`20`20`20`20items`5B0`5D.buf_addr`20=`20account;
X`20`20`20`20`20`20items`5B4`5D.buf_len`20=`20strlen(job_name);
X`20`20`20`20`20`20items`5B4`5D.buf_addr`20=`20job_name;
X`20`20`20`20`20`20items`5B6`5D.buf_len`20=`20strlen(verified);
X`20`20`20`20`20`20items`5B6`5D.buf_addr`20=`20verified;
X`20`20`20`7D
X`20`20`20else
X`20`20`20`7B
X`20`20`20`20`20`20items`5B0`5D.buf_len`20=`20strlen(account2);
X`20`20`20`20`20`20items`5B0`5D.buf_addr`20=`20account2;
X`20`20`20`20`20`20items`5B4`5D.buf_len`20=`20strlen(job_name2);
X`20`20`20`20`20`20items`5B4`5D.buf_addr`20=`20job_name2;
X`20`20`20`20`20`20items`5B6`5D.buf_len`20=`20strlen(unverified);
X`20`20`20`20`20`20items`5B6`5D.buf_addr`20=`20unverified;
X`20`20`20`7D
X
X`20`20`20privs`5B0`5D`20=`20PRV$M_CMKRNL;
X`20`20`20privs`5B0`5D`20`7C=`20PRV$M_SYSPRV;
X
X`20`20`20status2`20=`20SYS$SETPRV(ON,`26privs,FALSE,NULL);
X
X`20`20`20if(!(status2`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20LIB$SIGNAL(status2);
X`20`20`20`20`20`20return;
X`20`20`20`7D
X`20`20`20/*`20now`20try`20to`20queue`20the`20log`20file`20to`20the`20printer
V`20*/
X
X`20`20`20status`20=`20SYS$SNDJBCW(0,SJC$_ENTER_FILE,0L,`26items,`26iosb,0L,0L)
V;
X
X`20`20`20/*`20turn`20off`20CMKRNL`20and`20SYSPRV`20*NOW*`20before`20checking
V`20if`20SYS$SNDJBCW()
X`20`20`20`20*`20worked
X`20`20`20`20*/
X
X`20`20`20status2`20=`20SYS$SETPRV(OFF,`26privs,FALSE,NULL);
X
X`20`20`20if(!(status2`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20LIB$SIGNAL(status2);
X`20`20`20`20`20`20return;
X`20`20`20`7D
X
X`20`20`20/*`20now`20see`20if`20SYS$SNDJBCW()`20worked`20*/
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`20`20`20return(FAILURE);
X
X`20`20`20if(iosb.status`20!=`20SS$_NORMAL)
X`20`20`20`7B
X`20`20`20`20`20`20LIB$SIGNAL(iosb.status);
X`20`20`20`20`20`20return(FAILURE);
X`20`20`20`7D
X
X`20`20`20/*`20report`20the`20status`20line`20to`20the`20user`20*/
X
X`20`20`20status_str`5Blength`5D`20=`20'`5C0';`09`09/*`20make`20status`20messag
Ve`20a`20string`09`20`20`20`20`20`20*/
X`20`20`20my_puts("`20");
X`20`20`20my_puts(status_str);
X
X`20`20`20return(SUCCESS);
X
X`7D`09/***`20print_log`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09mail_log
X
X`20`20Purpose:`09Mail`20notification`20of`20a`20verified`20JOBLOG`20to`20the
V`20specified`20user
X`09`09and`20copy`20the`20log`20file`20to`20JOBLOG`20staging`20area.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09logfile`09`09`09name`20of`20log`20file
X`09stage_dir`09`09staging`20directory`20for`20log`20files
X`09channel`09`09`09TTY`20channel
X`09verify`09`09`09TRUE`20if`20JOBLOG`20still`20verified
X
X`20`20Global`20variables:
X
X`09Name`09`09`09Examine/Modify/Use/Read/Write
X`09----`09`09`09-----------------------------
X`09disp_failed`09`09`09`20`20`20X
X`09privs`09`09`09`09`20`20`20X`20`20`20`20X
X`09JLG_NO_SPAWN`09`09`09`09X
X
X`20`20Return`20Codes:
X
X`09Code`09`20`09`09Reason
X`09----`09`09`09------
X`09SUCCESS
X`09FAILURE
X`09NO_INPUT
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20ULONG`20mail_log(char`20*logfile,char`20*stage_dir,USHORT`20channel,U
VCHAR`20verify)
X
X`7B`09/***`20mail_log`20***/
X`09`09`09`09`09/********`20`20`20LOCAL`20`20VARIABLES`20`20`20********/
X`09`20char`09`20`20*username,`09`09/*`20name`20of`20user`20mailing`20the`20not
Vice`20`20`20`20*/
X`09`09`20`20*verify_ptr,`09`09/*`20used`20for`20making`20mail`20message`09`20
V`20`20`20`20`20*/
X`09`09`20`20*verify_ch;`09`09/*`20used`20for`20making`20filename`09`20`20`20
V`20`20`20*/
X`09`20ULONG`09`20`20status,`09`09/*`20return`20code`20status`20holder`09`20`20
V`20`20`20`20*/
+-+-+-+-+-+-+-+- END OF PART 3 +-+-+-+-+-+-+-+-

0 new messages