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

4 views
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 52
Archive-name: joblog/part04
Supersedes: joblog: Volume 1, Issue 102-106

-+-+-+-+-+-+-+-+ START OF PART 4 -+-+-+-+-+-+-+-+
X`09`09`20`20status2;`09`09/*`20secondary`20return`20code`20holder`09`20`20`20
V`20`20`20*/
X`09`20long`09`20`20item_code;`09`09/*`20for`20LIB$GETJPI()'s`20sake`09`20`20
V`20`20`20`20*/
X`09`20USHORT`09`20`20length;`09`09/*`20length`20of`20string`20from`20LIB$GETJP
VI()`20*/
X`09`20time_t`09`20`20time_val;`09`09/*`20value`20from`20time()`09`09`20`20`20
V`20`20`20*/
X`09`20IOSB_DEF`20iosb;`09`09`09/*`20for`20QIO's`09`09`09`20`20`20`20`20`20*/
Xstruct`09`20tm`09`20`20*time_ptr;`09`09/*`20pointer`20to`20localtime()`20struc
Vture`20`20`20*/
Xstruct`09`20FAB`09`20`20out_fab;`09`09/*`20for`20creating`20mail`20message`20f
Vile`20`20`20`20`20*/
Xstruct`09`20RAB`09`20`20out_rab;
Xstatic`09`20char`09`20`20tempfile`5BNAM$C_MAXRSS+1`5D,
X`09`09`20`20filename`5BNAM$C_MAXRSS+1`5D,
X`09`09`20`20out_buf`5BBUFSIZ`5D,`09/*`20formatting`20and`20I/O`20buffer`09`20
V`20`20`20`20`20*/
X`09`09`20`20account`5BACCOUNT_MAX+1`5D,
X`09`09`20`20recipient`5BUSERNAME_MAX+1`5D,
X`09`09`20`20command`5BCOMMAND_MAX+1`5D,
X`09`09`20`20prompt`5B`5D`20=
X`09`09`20`20`7B"Who`20do`20you`20want`20to`20mail`20the`20log`20file`20notific
Vation`20to?`20"`7D;
Xstatic`20$DESCRIPTOR(null_d,"NL:");
Xstatic`20$DESCRIPTOR(account_d,account);
Xstatic`20$DESCRIPTOR(command_d,command);
Xstatic`20$DESCRIPTOR(filename_d,filename);
Xstatic`20$DESCRIPTOR(recipient_d,recipient);
Xstatic`20$DESCRIPTOR(mail_d,"MAIL");
Xstatic`20$DESCRIPTOR(ctrstr_d,
X`09`20"!AD!AD_!AD_!AD.!AD_JOBLOG_!ZL!ZL_!ZL!ZL_!ZL!ZL_!ZL!ZL_!ZL!ZL_!ZL!ZL");
V
X
X
X`20`20`20status`20=`20CLI$GET_VALUE(`26mail_d,`26recipient_d,`26length);
X
X`20`20`20if(status`20==`20SS$_NORMAL`20`26`26`20!disp_failed)
X`20`20`20`7B
X`20`20`20`20`20`20/*`20save`20the`20/MAIL`20recipient`20*/
X
X`20`20`20`20`20`20recipient`5Blength`5D`20=`20'`5C0';`09`09/*`20make`20it`20a
V`20string`09`09`20`20`20`20`20`20*/
X`20`20`20`7D
X`20`20`20else
X`20`20`20`7B
X`20`20`20`20`20`20/*`20/USER`20wasn't`20specified;`20prompt`20the`20user`20for
V`20it`20*/
X
X`20`20`20`20`20`20my_puts("`20");
X`20`20`20`20`20`20status`20=`20my_gets(channel,recipient,prompt,`26length,size
Vof(recipient)`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`20str_pref_trim(recipient);
X`20`20`20`20`20`20str_post_trim(recipient);
X
X`20`20`20`20`20`20if(recipient`5B0`5D`20==`20'`5C0')
X`20`20`20`20`20`20`7B
X`09`20my_puts("`5Cn`5C07You`20must`20specify`20a`20username.");
X`09`20return(NO_INPUT);
X`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20strlu(recipient);`09`09`09/*`20conver`20to`20all`20uppercase
V`09`20`20`20`20`20`20*/
X`20`20`20`7D
X
X`20`20`20/*`20see`20if`20we`20have`20a`20valid`20recipient`20*/
X
X`20`20`20if(valid_recip(recipient)`20==`20FALSE)
X`20`20`20`7B
X`20`20`20`20`20`20cat(out_buf,"`5Cn`5C07You`20cannot`20send`20JOBLOG`20log`20f
Viles`20to`20",recipient,".");
X`20`20`20`20`20`20my_puts(out_buf);
X`20`20`20`20`20`20return(FAILURE);
X`20`20`20`7D
X`20`20`20else
X`20`20`20`7B
X`20`20`20`20`20`20username`20=`20getenv("USER");
X
X`20`20`20`20`20`20if(strcmp(recipient,username)`20==`200)
X`20`20`20`20`20`20`7B
X`09`20my_puts("`5Cn`5C07You`20cannot`20send`20JOBLOG`20log`20files`20to`20your
Vself!");
X`09`20return(FAILURE);
X`20`20`20`20`20`20`7D
X`20`20`20`7D
X
X`20`20`20/*`20good`20recipient;`20get`20the`20account`20of`20the`20sender`20*/
V
X
X`20`20`20item_code`20=`20JPI$_ACCOUNT;
X`20`20`20status`20=`20LIB$GETJPI(`26item_code,0L,NULL,0L,`26account_d,0);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`20`20`20return(FAILURE);
X
X`20`20`20/*`20strip`20off`20the`20trailing`20blanks`20in`20the`20account`20*/
V
X
X`20`20`20length`20=`200;
X
X`20`20`20while(length`20<`20ACCOUNT_MAX`20`26`26`20account`5Blength`5D`20!=`20
V'`20')
X`20`20`20`20`20`20++length;
X
X`20`20`20account`5Blength`5D`20=`20'`5C0';`09`09/*`20make`20it`20a`20string`09
V`09`20`20`20`20`20`20*/
X`20`20`20squeeze_str(account);`09`09/*`20squeeze`20out`20any`20internal`20blan
Vks`20`20`20`20*/
X
X`20`20`20/*`20make`20a`20mail`20message`20for`20the`20recipient`20*/
X
X`20`20`20strcpy(tempfile,"JOBXXXXXX");
X`20`20`20mktemp(tempfile);
X`20`20`20strcat(tempfile,".TMP");
X
X`20`20`20out_rab`20=`20cc$rms_rab;
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=`20sizeof(out_buf);`09/*`20length`20of`20output
V`20buffer`09`20`20`20`20`20`20*/
X`20`20`20out_rab.rab$l_rbf`20=`20out_buf;`09`09/*`20pointer`20to`20buffer`09
V`09`20`20`20`20`20`20*/
X
X`20`20`20out_fab`20=`20cc$rms_fab;
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_PUT;
X
X`20`20`20out_fab.fab$l_fna`20=`20tempfile;
X`20`20`20out_fab.fab$b_fns`20=`20(UCHAR)`20strlen(tempfile);
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!=`20RMS$_NORMAL)
X`20`20`20`7B
X`20`20`20`20`20`20SYS$CLOSE(`26out_fab);
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!=`20RMS$_NORMAL)
X`20`20`20`7B
X`20`20`20`20`20`20SYS$CLOSE(`26out_fab);
X`20`20`20`20`20`20return(FAILURE);
X`20`20`20`7D
X
X`20`20`20if(verify)
X`20`20`20`20`20`20verify_ptr`20=`20"";
X`20`20`20else
X`20`20`20`20`20`20verify_ptr`20=`20"n`20UNVERIFIED";
X
X`20`20`20cat(out_buf,"There`20is`20a",verify_ptr,
X`20`20`20`20`20`20`20"`20JOBLOG`20log`20file`20from`20",username,"`20waiting
V`20to`20be`20retrieved.");
X`20`20`20out_rab.rab$w_rsz`20=`20(USHORT)`20strlen(out_buf);
X`20`20`20status`20=`20SYS$PUT(`26out_rab);
X
X`20`20`20strcpy(out_buf,"To`20retrieve`20it,`20enter`20the`20command`5Cn");
X`20`20`20out_rab.rab$w_rsz`20=`20(USHORT)`20strlen(out_buf);
X`20`20`20status`20=`20SYS$PUT(`26out_rab);
X
X`20`20`20cat(out_buf,"`09JOBLOG/RETRIEVE/USER=",username);
X`20`20`20out_rab.rab$w_rsz`20=`20(USHORT)`20strlen(out_buf);
X`20`20`20status`20=`20SYS$PUT(`26out_rab);
X
X`20`20`20status`20=`20SYS$CLOSE(`26out_fab);
X
X`20`20`20my_puts("`20");
X`20`20`20cat(out_buf,"....sending`20mail`20to`20",recipient,"....");
X`20`20`20my_puts(out_buf);
X
X`20`20`20/*`20create`20the`20command`20to`20be`20SPAWNed`20*/
X
X`20`20`20if(verify)
X`20`20`20`20`20`20cat(command,"$MAIL/SUBJECT=`5C"JOBLOG`20pending`20from`20",u
Vsername,"`5C"`20",
X`09`20`20tempfile,"`20",recipient);
X`20`20`20else
X`20`20`20`20`20`20cat(command,
X`09`20`20"$MAIL/SUBJECT=`5C"UNVERIFIED`20JOBLOG`20pending`20from`20",username,
V"`5C"`20",
X`09`20`20tempfile,"`20",recipient);
X
X`20`20`20command_d.dsc$w_length`20=`20(USHORT)`20strlen(command);
X
X`20`20`20/*`20SYSPRV`20is`20needed`20to`20spawn`20*/
X
X`20`20`20privs`5B0`5D`20=`20PRV$M_SYSPRV;
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/*`20now`20try`20to`20spawn`20the`20command`20to`20mail`20the`20notic
Ve`20*/
X
X`20`20`20status`20=`20LIB$SPAWN(`26command_d,`26null_d,`26null_d,NULL,NULL,0L,
V`26status2,0L,0L,
X`09`09`20`20`20`20`20`200L,0L,NULL,NULL);
X
X`20`20`20/*`20kill`20SYSPRV`20now`20just`20to`20be`20safe`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`20`20`20LIB$SIGNAL(status2);
X
X`20`20`20delete_log(tempfile);`09`09/*`20kill`20it`20before`20we`20forget`09
V`20`20`20`20`20`20*/
X
X`20`20`20/*`20now`20check`20to`20see`20if`20spawn`20worked`20*/
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`7B
X`20`20`20`20`20`20LIB$SIGNAL(JLG_NO_SPAWN);
X`20`20`20`20`20`20return(FAILURE);
X`20`20`20`7D
X
X`20`20`20/*`20create`20the`20filename`20that`20will`20be`20used`20when`20the
V`20log`20file`20is`20moved
X`20`20`20`20*`20to`20the`20staging`20area
X`20`20`20`20*/
X
X`20`20`20time_val`20=`20time(NULL);`20
X`20`20`20time_ptr`20=`20localtime(`26time_val);
X`20`20`20time_ptr->tm_mon`20+=`201;`09`09/*`20because`20it`20is`200-11,`20not
V`201-12`09:-(`20`20`20*/
X
X`20`20`20/*`20create`20the`20filename`20that`20will`20be`20used`20when`20the
V`20log`20file`20is`20copied
X`20`20`20`20*`20to`20the`20staging`20area
X`20`20`20`20*/
X
X`20`20`20if(verify)
X`20`20`20`20`20`20verify_ch`20=`20"V";
X`20`20`20else
X`20`20`20`20`20`20verify_ch`20=`20"U";
X
X`20`20`20sprintf(filename,
X`20`20`20`20`20`20`20`20`20`20`20"%s%s_%s_%s.%s_JOBLOG_%01d%01d_%01d%01d_%01d%
V01d_%01d%01d_%01d%1d_%01d%01d",
X`09`20`20`20stage_dir,username,recipient,account,verify_ch,time_ptr->tm_mon/10
V,
X`09`20`20`20time_ptr->tm_mon%10,time_ptr->tm_mday/10,time_ptr->tm_mday%10,
X`09`20`20`20time_ptr->tm_year/10,time_ptr->tm_year%10,time_ptr->tm_hour/10,
X`09`20`20`20time_ptr->tm_hour%10,time_ptr->tm_min/10,time_ptr->tm_min%10,
X`09`20`20`20time_ptr->tm_sec/10,time_ptr->tm_sec%10);
X`09`20`20`20
X`20`20`20/*`20copy`20the`20log`20file`20to`20the`20staging`20directory`20*/
X
X`20`20`20status`20=`20copy_file(logfile,filename,TRUE);
X
X`20`20`20if(status`20==`20SUCCESS)
X`20`20`20`7B
X`20`20`20`20`20`20if(verify)
X`09`20cat(out_buf,"`5Cn`5CnNotification`20of`20VERIFIED`20JOBLOG`20sent`20to
V`20user`20",
X`09`20`20`20`20`20recipient,"`5Cn`5Cn");
X`20`20`20`20`20`20else
X`09`20cat(out_buf,"`5Cn`5CnNotification`20of`20UNVERIFIED`20JOBLOG`20sent`20to
V`20user`20",
X`09`20`20`20`20`20recipient,"`5Cn`5Cn");
X
X`20`20`20`20`20`20my_puts(out_buf);
X`20`20`20`7D
X
X`20`20`20return(status);
X
X`7D`09/***`20mail_log`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09valid_recip
X
X`20`20Purpose:`09Determine`20if`20the`20user`20specified`20is`20allowed`20to
V`20received`20mailed
X`09`09JOBLOG`20log`20files.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09recipient`09`09who`20is`20supposed`20to`20get`20the`20log`20file
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`09`09`09valid`20recipient
X`09FAILURE`09`09`09invalid`20recipient
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20USHORT`20valid_recip(char`20*recipient)
X
X`7B`09/***`20valid_recip`20***/
X`09`09`09`09`09/********`20`20`20LOCAL`20`20VARIABLES`20`20`20********/
X`09`20ULONG`09`20`20id,`09`09`09/*`20current`20id`20held`20by`20recipient`09
V`20`20`20`20`20`20*/
X`09`09`20`20context,`09`09/*`20for`20getting`20individual`20identifiers`20*/
X`09`09`20`20status;`09`09/*`20return`20code`20status`20holder`09`20`20`20`20
V`20`20*/
X`09`20USHORT`09`20`20i,`09`09`09/*`20loop`20and`20array`20index`09`09`20`20`20
V`20`20`20*/
X`09`09`20`20j,`09`09`09/*`20ditto......`09`09`09`20`20`20`20`20`20*/
X`09`09`20`20done,`09`09`09/*`20loop`20control`20boolean`09`09`20`20`20`20`20
V`20*/
X`09`09`20`20retval;`09`09/*`20our`20return`20code`09`09`20`20`20`20`20`20*/
Xstatic`09`20ULONG`09`20`20uic`5B2`5D;`09`09/*`20so`20we`20can`20get`20identifi
Vers`09`20`20`20`20`20`20*/
Xstatic`09`20USHORT`09`20`20length;`09`09/*`20from`20SYS$GETUAI`09`09`20`20`20
V`20`20`20*/
Xstatic`09`20ID_DEF`20`20`20valid_ids`5B`5D`20=`20`7B
X`7B"FACULTY",0L`7D,
X`7B"STAFF",0L`7D,
X`7B"JOBLOG_RECIPIENT",0L`7D,
X`7B0L,0L`7D`7D;
Xstatic`09`20ITM_LST`20`20items`5B`5D`20=`20`7B
X`7Bsizeof(uic),UAI$_UIC,(void`20*)`20`26uic`5B0`5D,`26length`7D,
X`7B0,0,NULL,NULL`7D`7D;
Xstatic`20$DESCRIPTOR(recip_d,"");
Xstatic`20$DESCRIPTOR(id_d,"");
X
X
X`20`20`20/*`20translate`20all`20of`20the`20ASCII`20identifiers`20to`20integer
V`20to`20make`20them`20easier
X`20`20`20`20*`20to`20compare`20later
X`20`20`20`20*/
X
X`20`20`20i`20=`200;
X
X`20`20`20while(valid_ids`5Bi`5D.id_string`20!=`20NULL)
X`20`20`20`7B
X`20`20`20`20`20`20id_d.dsc$a_pointer`20=`20valid_ids`5Bi`5D.id_string;
X`20`20`20`20`20`20id_d.dsc$w_length`20=`20(USHORT)`20strlen(id_d.dsc$a_pointer
V);
X
X`20`20`20`20`20`20status`20=`20SYS$ASCTOID(`26id_d,`26(valid_ids`5Bi`5D.id),NU
VLL);
X`20`20`20`20`20`20i++;
X`20`20`20`7D
X
X`20`20`20privs`5B0`5D`20=`20PRV$M_SYSPRV;
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(FAILURE);
X`20`20`20`7D
X
X`20`20`20/*`20get`20the`20recipient's`20UIC`20from`20UAF`20*/
X
X`20`20`20recip_d.dsc$a_pointer`20=`20recipient;
X`20`20`20recip_d.dsc$w_length`20=`20(USHORT)`20strlen(recipient);
X
X`20`20`20status`20=`20SYS$GETUAI(0L,0L,`26recip_d,`26items,0L,0L,0L);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`20`20`20return(FAILURE);
X
X`20`20`20/*`20now`20get`20each`20identifer`20the`20recipient`20holds`20and`20s
Vee`20if`20it`20is`20valid`20*/
X
X`20`20`20context`20=`200L;
X`20`20`20status`20=`20SYS$FIND_HELD(`26uic,`26id,NULL,`26context);
X
X`20`20`20done`20=`20FALSE;
X`20`20`20retval`20=`20FAILURE;
X
X`20`20`20while(status`20==`20SS$_NORMAL`20`26`26`20!done)
X`20`20`20`7B
X`20`20`20`20`20`20/*`20got`20an`20identifier;`20now`20check`20if`20it`20is`20a
V`20good`20one`20*/
X
X`20`20`20`20`20`20for(j`20=`200;`20j`20<`20i;`20j++)
X`20`20`20`20`20`20`7B
X`09`20if(id`20==`20valid_ids`5Bj`5D.id)
X`09`20`7B
X`09`20`20`20`20status`20=`20SYS$FINISH_RDB(`26context);
X`09`20`20`20`20done`20=`20TRUE;
X`09`20`20`20`20retval`20=`20SUCCESS;
X`09`20`7D
X`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20status`20=`20SYS$FIND_HELD(`26uic,`26id,NULL,`26context);
X`20`20`20`7D
X
X`20`20`20if(status`20!=`20SS$_NOSUCHID)
X`20`20`20`20`20`20status`20=`20SYS$FINISH_RDB(`26context);
X
X`20`20`20/*`20turn`20off`20SYSPRV`20*/
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`20LIB$SIGNAL(status);
X`20`20`20`20`20`20return(FAILURE);
X`20`20`20`7D
X
X`20`20`20return(retval);
X
X`7D`09/***`20valid_recip`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09save_log
X
X`20`20Purpose:`09Save`20a`20log`20file`20for`20a`20user.`20`20Use`20the`20file
Vname`20specified`20by
X`09`09the`20user`20if`20one`20exists,`20otherwise`20use`20a`20default`20name.
V
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09log_file`09`09name`20of`20log`20file
X`20`20`09channel`09`09`09TTY`20channel
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
X`20`20Return`20Codes:
X
X`09Code`09`20`09`09Reason
X`09----`09`09`09------
X`09SUCCESS
X`09FAILURE
X`09CANCEL
X`09status`09`09`09return`20code`20from`20save_log()
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20ULONG`20save_log(char`20*logfile,USHORT`20channel)
X
X`7B`09/***`20save_log`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`09`20`20length;`09`09/*`20length`20of`20command`20line`20value`09
V`20`20`20`20`20`20*/
X`09`20IOSB_DEF`20iosb;`09`09`09/*`20for`20reading`20from`20the`20TTY`09`20`20
V`20`20`20`20*/
Xstatic`09`20char`09`20`20savefile`5BNAM$C_MAXRSS+1`5D,`20/*`20filename`20to`20
Vuse`20for`20/SAVEing`20`20`20*/
X`09`09`20`20deffile`5BNAM$C_MAXRSS+1`5D,`20/*`20default`20filename`09`09`20`20
V`20`20`20`20*/
X`09`09`20`20buffer`5BNAM$C_MAXRSS*2`5D,`20/*`20for`20formatting`20message`09
V`20`20`20`20`20`20*/
X`09`09`20`20prompt`5BTEMPBUF_MAX+1`5D;`20/*`20for`20asking`20for`20filename`09
V`20`20`20`20`20`20*/
Xstatic`20$DESCRIPTOR(save_d,"SAVE");`09/*`20for`20parsing`20/SAVE`09`09`20`20
V`20`20`20`20*/
Xstatic`20$DESCRIPTOR(savefile_d,savefile);`20/*`20for`20getting`20/SAVE`20valu
Ve`09`20`20`20`20`20`20*/
X
X
X`20`20`20status`20=`20CLI$GET_VALUE(`26save_d,`26savefile_d,`26length);
X
X`20`20`20if(status`20==`20SS$_NORMAL`20`26`26`20!disp_failed)
X`20`20`20`7B
X`20`20`20`20`20`20savefile`5Blength`5D`20=`20'`5C0';`09`09/*`20make`20it`20a
V`20string`09`09`20`20`20`20`20`20*/
X`20`20`20`7D
X`20`20`20else
X`20`20`20`7B
X`20`20`20`20`20`20/*`20filename`20wasn't`20specified;`20prompt`20the`20user`20
Vfor`20it`20*/
X
X`20`20`20`20`20`20strcpy(deffile,"JOBXXXXXX");`09/*`20make`20a`20filename`20fo
Vr`20them`09`20`20`20`20`20`20*/
X`20`20`20`20`20`20mktemp(deffile);
X`20`20`20`20`20`20strcat(deffile,".LOG");
X`20`20`20`20`20`20my_puts("`20");
X`20`20`20`20`20`20my_puts("What`20filename`20should`20be`20used`20for`20the`20
Vlog`20file?");
X`20`20`20`20`20`20cat(prompt,"`5Bdefault`20is`20",deffile,"`5D`20");
X`20`20`20`20`20`20status`20=`20my_gets(channel,savefile,prompt,`26length,sizeo
Vf(savefile)`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`20str_pref_trim(savefile);
X`20`20`20`20`20`20str_post_trim(savefile);
X
X`20`20`20`20`20`20if(savefile`5B0`5D`20==`20'`5C0')
X`09`20strcpy(savefile,deffile);
X`20`20`20`20`20`20else
X`09`20strlu(savefile);`09`09/*`20convert`20to`20all`20uppercase`09`20`20`20`20
V`20`20*/
X`20`20`20`7D
X
X`20`20`20/*`20now`20copy`20the`20file`20*/
X
X`20`20`20status`20=`20copy_file(logfile,savefile,FALSE);
X
X`20`20`20if(status`20==`20SUCCESS)
X`20`20`20`7B
X`20`20`20`20`20`20cat(buffer,"`5Cn`5CnLog`20file`20closed`20to`20",savefile);
V
X`20`20`20`20`20`20my_puts(buffer);
X`20`20`20`7D
X
X`20`20`20return(status);
X
X`7D`09/***`20save_log`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09retrieve_log
X
X`20`20Purpose:`09Allow`20a`20user`20to`20retrieve`20JOBLOG`20file(s).
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09stage_dir`09`09staging`20directory`20for`20log`20files
X`20`20`09args`09`09`09run-time`20arguments
X`09tt_chan`09`09`09TTY`20channel
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`09X
X
X`20`20Return`20Codes:
X
X`09Code`09`20`09`09Reason
X`09----`09`09`09------
X`09status`09`09`09return`20code`20from`20user_retrieve`20or
X`09`09`09`09class_retrieve
X`20`20Termination`20Codes:
X
X`09Code`09`20`09`09Reason
X`09----`09`09`09------
X`09status`09`09`09couldn't`20assign`20channel`20to`20TTY
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20ULONG`20retrieve_log(char`20*stage_dir,ARG_DEF`20*args,USHORT`20*tt_c
Vhan)
X
X`7B`09/***`20retrieve_log`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`09`20`20length,`09`09/*`20length`20of`20buf`09`09`20`20`20`20`20
V`20*/
X`09`09`20`20channel;`09`09/*`20TTY`20channel`09`09`09`20`20`20`20`20`20*/
Xstatic`09`20char`09`20`20buf`5BBUFSIZ`5D;`09`09/*`20for`20storing`20the`20retr
Vieve`20key`09`20`20`20`20`20`20*/
Xstatic`20$DESCRIPTOR(buf_d,buf);`09`09/*`20for`20getting`20retrieve`20key`20st
Vring`20`20`20`20*/
Xstatic`20$DESCRIPTOR(class_d,"CLASS");`09/*`20to`20check`20for`20/CLASS`09`09
V`20`20`20`20`20`20*/
Xstatic`20$DESCRIPTOR(user_d,"USER");`09/*`20to`20check`20for`20/USER`09`09`20
V`20`20`20`20`20*/
X
X
X`20`20`20/*`20get`20a`20channel`20for`20the`20TTY`20so`20my_puts()`20will`20wo
Vrk`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`20`20`20LIB$STOP(status);
X
X`20`20`20if(CLI$PRESENT(`26class_d)`20==`20CLI$_PRESENT)
X`20`20`20`7B
X`20`20`20`20`20`20/*`20get`20the`20class`20string`20*/
X
X`20`20`20`20`20`20status`20=`20CLI$GET_VALUE(`26class_d,`26buf_d,`26length);
X
X`20`20`20`20`20`20if(status`20==`20SS$_NORMAL)
X`20`20`20`20`20`20`7B
X`09`20buf`5Blength`5D`20=`20'`5C0';`09`09/*`20make`20it`20a`20string`09`09`20
V`20`20`20`20`20*/
X`09`20status`20=`20class_retrieve(stage_dir,buf);
X`20`20`20`20`20`20`7D
X`20`20`20`20`20`20else
X`09`20status`20=`20FAILURE;
X`20`20`20`7D
X`20`20`20else`20if(CLI$PRESENT(`26user_d)`20==`20CLI$_PRESENT)
X`20`20`20`7B
X`20`20`20`20`20`20/*`20get`20the`20user`20string`20*/
X
X`20`20`20`20`20`20status`20=`20CLI$GET_VALUE(`26user_d,`26buf_d,`26length);
X
X`20`20`20`20`20`20if(status`20==`20SS$_NORMAL)
X`20`20`20`20`20`20`7B
X`09`20buf`5Blength`5D`20=`20'`5C0';`09`09/*`20make`20it`20a`20string`09`09`20
V`20`20`20`20`20*/
X`09`20status`20=`20user_retrieve(stage_dir,buf);
X`20`20`20`20`20`20`7D
X`20`20`20`20`20`20else
X`09`20status`20=`20FAILURE;
X`20`20`20`7D
X
X`20`20`20return(status);
X
X`7D`09/***`20retrieve_log`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09user_retrieve
X
X`20`20Purpose:`09Allow`20a`20user`20to`20retrieve`20a`20JOBLOG`20file`20that
V`20s/he`20"owns".
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09stage_dir`09`09staging`20directory`20for`20log`20files
X`09from`09`09`09user`20who`20sent`20the`20log`20file
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`09SUCCESS
X`09FAILURE
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20ULONG`20user_retrieve(char`20*stage_dir,char`20*from)
X
X`7B`09/***`20user_retrieve`20***/
X`09`09`09`09`09/********`20`20`20LOCAL`20`20VARIABLES`20`20`20********/
X`09`20ULONG`09`20`20fcontext,`09`09/*`20file`20context`20for`20getting`20file
V`20`20`20`20`20`20*/
X`09`09`20`20status;`09`09/*`20return`20code`20status`20holder`09`20`20`20`20
V`20`20*/
X`09`20char`09`20`20*tptr;`09`09/*`20temporary`20character`20pointer`09`20`20
V`20`20`20`20*/
X`09`20USHORT`09`20`20verified;`09`09/*`20set`20if`20log`20is`20VERIFIED`09`20
V`20`20`20`20`20*/
X`09`20char`09`20`20newfile`5BNAM$C_MAXRSS+1`5D,`20/*`20what`20to`20copy`20logf
Vile`20to`09`20`20`20`20`20`20*/
X`09`09`20`20username`5BUSERNAME_MAX+1`5D,`20/*`20who`20sent`20the`20log`20file
V`09`20`20`20`20`20`20*/
X`09`09`20`20recipient`5BUSERNAME_MAX+1`5D,`20/*`20who`20the`20log`20file`20was
V`20sent`20to`20`20*/
X`09`09`20`20tempbuf`5BTEMPBUF_MAX+1`5D;
Xstatic`09`20char`09`20`20filename`5BNAM$C_MAXRSS+1`5D,`20/*`20for`20wildcard
V`20searching`09`20`20`20`20`20`20*/
X`09`09`20`20logfile`5BNAM$C_MAXRSS+1`5D;`20/*`20logfile`20name`09`09`20`20`20
V`20`20`20*/
Xstatic`20$DESCRIPTOR(file_d,filename);
Xstatic`20$DESCRIPTOR(file2_d,logfile);
X
X
X`20`20`20/*`20make`20the`20wildcard`20filename`20to`20be`20used`20*/
X
X`20`20`20cat(filename,stage_dir,from,"_",getenv("USER"),"_*.*");
X`20`20`20
X`20`20`20file_d.dsc$w_length`20=`20(USHORT)`20strlen(filename);
X`20`20`20fcontext`20=`200L;
X
X`20`20`20/*`20see`20if`20the`20file`20exists`20*/
X
X`20`20`20status`20=`20LIB$FIND_FILE(`26file_d,`26file2_d,`26fcontext);
X
X`20`20`20if(status`20!=`20RMS$_NORMAL)
X`20`20`20`7B
X`20`20`20`20`20`20cat(tempbuf,"`5Cn`5C7No`20log`20file`20for`20you`20from`20us
Ver`20",from,"`5Cn`5Cn",from);
X`20`20`20`20`20`20my_puts(tempbuf);
X`20`20`20`20`20`20return(FAILURE);
X`20`20`20`7D
X
X`20`20`20tptr`20=`20strchr(logfile,'`20');`09`09/*`20find`20the`20end`20of`20t
Vhe`20filename`09`20`20`20`20`20`20*/
X`20`20`20*tptr`20=`20'`5C0';`09`09`09/*`20make`20the`20filename`20a`20string
V`09`20`20`20`20`20`20*/
X
X`20`20`20/*`20find`20out`20if`20the`20log`20file`20was`20verified`20*/
X
X`20`20`20parse_filename(logfile,NULL,NULL,`26verified);
X
X`20`20`20if(verified)
X`20`20`20`20`20`20cat(newfile,from,".JOBLOG");
X`20`20`20else
X`20`20`20`20`20`20cat(newfile,from,".UNVERIFIED_JOBLOG");
X
X`20`20`20/*`20copy`20the`20log`20file`20to`20user's`20area`20`20`20*/
X
X`20`20`20status`20=`20copy_file(logfile,newfile,FALSE);
X
X`20`20`20if(status`20==`20SUCCESS)
X`20`20`20`7B
X`20`20`20`20`20`20delete_log(logfile);
X`20`20`20`20`20`20cat(tempbuf,"`5Cn`5CnJOBLOG`20from`20user`20",from,"`20succe
Vssfully`20retrieved.`5Cn");
X`20`20`20`20`20`20my_puts(tempbuf);
X`20`20`20`20`20`20cat(tempbuf,"The`20file`20is`20",newfile,".`5Cn`5Cn");
X`20`20`20`20`20`20my_puts(tempbuf);
X`20`20`20`7D
X`20`20`20else
X`20`20`20`7B
X`20`20`20`20`20`20cat(tempbuf,"`5Cn`5C7*ERROR*`20retrieving`20JOBLOG`20from`20
Vuser`20",from,".`5Cn");
X`20`20`20`20`20`20my_puts(tempbuf);
X`20`20`20`7D
X
X`20`20`20return(status);
X
X`7D`09/***`20user_retrieve`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09class_retrieve
X
X`20`20Purpose:`09Allow`20a`20user`20to`20retrieve`20JOBLOG`20file(s)`20for`20a
Vn`20entire`20class.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09stage_dir`09`09staging`20directory`20for`20log`20files
X`09class`09`09`09class`20to`20be`20retrieved
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`09SUCCESS
X`09FAILURE
X
X`20`20Termination`20Codes:
X
X`09Code`09`20`09`09Reason
X`09----`09`09`09------
X`09status
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20ULONG`20class_retrieve(char`20*stage_dir,char`20*class)
X
X`7B`09/***`20class_retrieve`20***/
X`09`09`09`09`09/********`20`20`20LOCAL`20`20VARIABLES`20`20`20********/
X`09`20ULONG`09`20`20fcontext,`09`09/*`20file`20context`20for`20getting`20file
V`20`20`20`20`20`20*/
X`09`09`20`20status;`09`09/*`20return`20code`20status`20holder`09`20`20`20`20
V`20`20*/
X`09`20char`09`20`20*name_ptr,`09`09/*`20pointer`20to`20filename`20of`20logfile
V`20`20`20`20`20*/
X`09`09`20`20*tptr;`09`09/*`20temporary`20character`20pointer`09`20`20`20`20`20
V`20*/
X`09`20USHORT`09`20`20count`20=`200,`09`09/*`20number`20of`20files`20retrieved
V`09`20`20`20`20`20`20*/
X`09`09`20`20length,`09`09/*`20length`20of`20formatted`20string`09`20`20`20`20
V`20`20*/
X`09`09`20`20verified;`09`09/*`20set`20if`20log`20file`20is`20VERIFIED`09`20`20
V`20`20`20`20*/
X`09`20char`09`20`20newfile`5BNAM$C_MAXRSS+1`5D,`20/*`20what`20to`20copy`20logf
Vile`20to`09`20`20`20`20`20`20*/
X`09`09`20`20username`5BUSERNAME_MAX+1`5D;`20/*`20who`20sent`20the`20log`20file
V`09`20`20`20`20`20`20*/
Xstatic`09`20char`09`20`20filename`5BNAM$C_MAXRSS+1`5D,`20/*`20for`20wildcard
V`20searching`09`20`20`20`20`20`20*/
X`09`09`20`20logfile`5BNAM$C_MAXRSS+1`5D,`20/*`20logfile`20name`09`09`20`20`20
V`20`20`20*/
X`09`09`20`20tempbuf`5BTEMPBUF_MAX+1`5D;
Xstatic`20$DESCRIPTOR(file_d,filename);
Xstatic`20$DESCRIPTOR(file2_d,logfile);
Xstatic`20$DESCRIPTOR(format_d,"`5Cn`5Cn!ZW`20files`20retrieved`20for`20class
V`20!AD.`5Cn`5Cn");
Xstatic`20$DESCRIPTOR(buffer_d,tempbuf);
X
X
X`20`20`20/*`20create`20the`20wildcard`20name`20for`20retrieving`20files`20*/
X
X`20`20`20squeeze_str(class);`09`09`09/*`20make`20sure`20class`20is`20free`20of
V`20spaces`20`20*/
X`20`20`20cat(filename,stage_dir,"*_",getenv("USER"),"_",class,".*JOBLOG*;*");
V
X`20`20`20file_d.dsc$w_length`20=`20(USHORT)`20strlen(filename);
X`20`20`20fcontext`20=`200L;
X
X`20`20`20status`20=`20LIB$FIND_FILE(`26file_d,`26file2_d,`26fcontext);
X
X`20`20`20while(status`20==`20RMS$_NORMAL)
X`20`20`20`7B
X`20`20`20`20`20`20count++;`09`09`09`09/*`20count`20it`09`09`09`20`20`20`20`20
V`20*/
X`20`20`20`20`20`20tptr`20=`20strchr(logfile,'`20');
X`20`20`20`20`20`20*tptr`20=`20'`5C0';`09`09`09/*`20make`20filename`20a`20real
V`20string`09`20`20`20`20`20`20*/
X
X`20`20`20`20`20`20name_ptr`20=`20strchr(logfile,'`5D')`20+`201L;`20/*`20skip
V`20past`20directory`20spec`09`20`20`20`20`20`20*/
X
X`20`20`20`20`20`20/*`20create`20the`20filename`20that`20the`20log`20file`20is
V`20to`20be`20copied`20to`20*/
X
X`20`20`20`20`20`20parse_filename(name_ptr,username,NULL,`26verified);
X
X`20`20`20`20`20`20if(verified)
X`09`20cat(newfile,username,".JOBLOG");
X`20`20`20`20`20`20else
X`09`20cat(newfile,username,".UNVERIFIED_JOBLOG");
X
X`20`20`20`20`20`20if(copy_file(logfile,newfile,FALSE)`20==`20SUCCESS)
X`09`20delete_log(logfile);
X`20`20`20`20`20`20else
X`20`20`20`20`20`20`7B
X`09`20cat(tempbuf,"`5Cn`5Cn`5C7*ERROR*`20copying`20log`20file`20",logfile,
X`09`20`20`20`20`20"`20to`20your`20area`5Cn");
X`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20status`20=`20LIB$FIND_FILE(`26file_d,`26file2_d,`26fcontext)
V;
X`20`20`20`7D
X
X`20`20`20if(status`20==`20RMS$_FNF)
X`20`20`20`7B
X`20`20`20`20`20`20cat(tempbuf,"`5C7`5Cn`5CnNo`20JOBLOG`20files`20for`20you`20f
Vrom`20class`20",class,"`5Cn`5Cn");
X`20`20`20`20`20`20my_puts(tempbuf);
X`20`20`20`20`20`20return;
X`20`20`20`7D
X
X`20`20`20if(status`20!=`20RMS$_NMF)`09`09/*`20did`20we`20stop`20for`20the`20ri
Vght`20reason?`20`20*/
X`20`20`20`20`20`20LIB$STOP(status);`09`09`09/*`20nope.....`09`09`09`20`20`20
V`20`20`20*/
X
X`20`20`20/*`20terminate`20the`20"finding"`20of`20files`20*/
X
X`20`20`20status`20=`20LIB$FIND_FILE_END(`26fcontext);
X
X`20`20`20if((status`20!=`20SS$_NORMAL)`20`26`26`20(status`20!=`20RMS$_NORMAL))
V
X`20`20`20`20`20`20LIB$STOP(status);
X
X`20`20`20status`20=`20SYS$FAO(`26format_d,`26length,`26buffer_d,count,(ULONG)
V`20strlen(class),
X`09`09`20`20`20`20class);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`20`20`20LIB$SIGNAL(status);
X
X`20`20`20tempbuf`5Blength`5D`20=`20'`5C0';
X`20`20`20my_puts(tempbuf);
X
X`20`20`20return;
X
X`7D`09/***`20class_retrieve`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09delete_mlog
X
X`20`20Purpose:`09Allow`20a`20user`20to`20delete`20JOBLOG`20file(s)`20from`20th
Ve`20staging`20area.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09stage_dir`09`09staging`20directory`20for`20log`20files
X`09tt_chan`09`09`09for`20getting`20a`20channel`20to`20the`20TTY
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`09X
X`09JLG_CANT_DELETE_LOG`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
X`20`20Termination`20Codes:
X
X`09Code`09`20`09`09Reason
X`09----`09`09`09------
X`09status
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20ULONG`20delete_mlog(char`20*stage_dir,USHORT`20*tt_chan)
X
X`7B`09/***`20delete_mlog`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`20#1`09
V`20`20`20`20`20`20*/
X`09`09`20`20status2,`09`09/*`20`20`20"`20`20`20`20`20"`20`20`20`20`20"`20`20
V`20`20`20`20"`20`20`20`20#2`09`20`20`20`20`20`20*/
X`09`09`20`20fcontext;`09`09/*`20context`20for`20FINDing`20files`09`20`20`20`20
V`20`20*/
X`09`20USHORT`09`20`20length;`09`09/*`20length`20of`20buffer`09`09`20`20`20`20
V`20`20*/
X`09`20char`09`20`20*username,`09`09/*`20name`20of`20user`20doing`20the`20delet
Ving`20`20`20`20*/
X`09`09`20`20*tptr,`09`09/*`20temporary`20character`20pointer`09`20`20`20`20`20
V`20*/
X`09`09`20`20filename`5BNAM$C_MAXRSS+1`5D,`20/*`20logfile`20name`09`09`20`20`20
V`20`20`20*/
X`09`09`20`20logfile`5BNAM$C_MAXRSS+1`5D;`20/*`20output`20of`20LIB$FIND_FILE`09
V`20`20`20`20`20`20*/
Xstatic`09`20char`09`20`20command`5BCOMMAND_MAX+1`5D,`20/*`20MAIL`20command`20b
Vuffer`09`20`20`20`20`20`20*/
X`09`09`20`20buffer`5BBUFSIZ+1`5D;`09/*`20buffer`20for`20reading`20from`20TTY
V`09`20`20`20`20`20`20*/
Xstatic`20$DESCRIPTOR(command_d,command);
Xstatic`20$DESCRIPTOR(delete_d,"DELETE");
Xstatic`20$DESCRIPTOR(buf_d,buffer);
Xstatic`20$DESCRIPTOR(null_d,"");
Xstatic`20$DESCRIPTOR(file_d,"");
Xstatic`20$DESCRIPTOR(file2_d,"");
Xstatic`20$DESCRIPTOR(prompt_d,"");
X
X
X`20`20`20/*`20get`20the`20name`20of`20the`20user`20to`20whom`20the`20log`20fil
Ve`20was`20mailed`20*/
X
X`20`20`20status`20=`20CLI$GET_VALUE(`26delete_d,`26buf_d,`26length);
X
X`20`20`20if(status`20==`20SS$_NORMAL)
X`20`20`20`20`20`20buffer`5Blength`5D`20=`20'`5C0';`09`09/*`20make`20it`20a`20s
Vtring`09`09`20`20`20`20`20`20*/
X`20`20`20else
X`20`20`20`7B
X`20`20`20`20`20`20/*`20need`20a`20channel`20to`20the`20TTY`20here`20*/
X
X`20`20`20`20`20`20status`20=`20SYS$ASSIGN(`26tt_d,tt_chan,0,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`20status`20=`20my_gets(*tt_chan,buffer,
X`09`09`20`20`20`20`20`20`20"`5Cn`5CnWho`20was`20the`20log`20file`20originally
V`20mailed`20to:`20",
X`09`09`20`20`20`20`20`20`20`26length,(USHORT)`20sizeof(buffer));
X
X`20`20`20`20`20`20if(status`20==`20CANCEL)
X`09`20return(SUCCESS);
X
X`20`20`20`20`20`20*(buffer`20+`20strlen(buffer)`20-`201)`20=`20'`5C0';`20/*`20
Vget`20rid`20of`20newline`20`09`20`20`20`20`20`20*/
X`20`20`20`20`20`20strlu(buffer);`09`09`09/*`20conver`20to`20all`20uppercase`09
V`20`20`20`20`20`20*/
X`20`20`20`7D
X
X`20`20`20username`20=`20getenv("USER");
X
X`20`20`20/*`20create`20the`20wildcard`20filespec`20that`20we'll`20use`20to`20c
Vheck`20for`20log`20files`20*/
X
X`20`20`20cat(filename,stage_dir,username,"_",buffer,"_*.*JOBLOG_*");
X
X`20`20`20file_d.dsc$a_pointer`20=`20filename;
X`20`20`20file_d.dsc$w_length`20=`20(USHORT)`20strlen(filename);
X`20`20`20file2_d.dsc$a_pointer`20=`20logfile;
X`20`20`20file2_d.dsc$w_length`20=`20(USHORT)`20NAM$C_MAXRSS+1;
X`20`20`20fcontext`20=`200L;
X`20`20`20status2`20=`20SUCCESS;
X
X`20`20`20status`20=`20LIB$FIND_FILE(`26file_d,`26file2_d,`26fcontext);
X
X`20`20`20while(status`20==`20RMS$_NORMAL`20`26`26`20status2`20==`20SUCCESS)
X`20`20`20`7B
X`20`20`20`20`20`20tptr`20=`20strchr(logfile,'`20');
X`20`20`20`20`20`20*tptr`20=`20'`5C0';`09`09`09/*`20make`20filename`20a`20real
V`20string`09`20`20`20`20`20`20*/
X
X`20`20`20`20`20`20if(delete_log(logfile)`20==`20FAILURE)`20/*`20try`20to`20del
Vete`20the`20file`09`20`20`20`20`20`20*/
X`09`20LIB$SIGNAL(JLG_CANT_DELETE_LOG,1L,logfile);
X`20`20`20`20`20`20else
X`20`20`20`20`20`20`7B
X`09`20cat(command,"$MAIL/SUBJECT=`5C"JOBLOG`20from`20",username,
X`09`20`20`20`20`20"`20has`20been`20deleted`5C"`20NL:`20",buffer);
X
X`09`20command_d.dsc$w_length`20=`20(USHORT)`20strlen(command);
X
X`09`20/*`20now`20try`20to`20spawn`20the`20command`20to`20mail`20the`20notice
V`20*/
X
X`09`20status`20=`20LIB$SPAWN(`26command_d,`26null_d,`26null_d,NULL,NULL,0L,`26
Vstatus2,
X`09`09`09`20`20`20`200L,0L,0L,0L,NULL,NULL);
X
X`09`20if(!(status`20`26`20SS$_NORMAL))
X`09`20`20`20`20LIB$SIGNAL(JLG_NO_SPAWN);
X
X`09`20cat(command,"`5CnLogfile`20for`20user`20",buffer,"`20deleted.`5Cn");
X`09`20my_puts(command);
X`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20status`20=`20LIB$FIND_FILE(`26file_d,`26file2_d,`26fcontext)
V;
X`20`20`20`7D
X
X`20`20`20if(status`20==`20RMS$_FNF)
X`20`20`20`7B
X`20`20`20`20`20`20cat(command,"`5C7`5Cn`5CnYou`20don't`20have`20any`20JOBLOG
V`20files`20for`20",buffer,
X`09`20`20"`20pending.`5Cn`5Cn");
X`20`20`20`20`20`20my_puts(command);
X`20`20`20`20`20`20return(FAILURE);
X`20`20`20`7D
X`20`20`20else`09if(status`20!=`20RMS$_NMF)`09`09/*`20did`20we`20stop`20for`20t
Vhe`20right`20reason?`20`20*/
X`20`20`20`20`20`20LIB$SIGNAL(status);`09`09/*`20nope.....`09`09`09`20`20`20`20
V`20`20*/
X
X`20`20`20/*`20don't`20care`20if`20these`20fail`20because`20we'll`20be`20exitin
Vg`20shortly`20*/
X
X`20`20`20status`20=`20LIB$FIND_FILE_END(`26fcontext);
X`20`20`20status`20=`20SYS$SETPRV(OFF,`26privs,FALSE,NULL);
X
X`20`20`20return(SUCCESS);
X
X`7D`20`20`09/***`20delete_mlog`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09get_logicals
X
X`20`20Purpose:`09Translate`20the`20logicals`20for`20JOBLOG$STAGE`20and`20JOBLO
VG$LOG
X`09`09and`20save`20them`20for`20later.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09log_dir`09`09`09where`20to`20store`20translation`20of`20JOBLOG$LOG
X`09stage_dir`09`09where`20to`20store`20translation`20of`20JOBLOG$STAGE
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`20`09`09Reason
X`09----`09`09`09------
X`09JLG_NO_LOGICAL`09`09system`20logicals`20are`20not`20defined
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20void`20get_logicals(char`20*log_dir,char`20*stage_dir)
X
X`7B`09/***`20get_logicals`20***/
X`09`09`09`09`09/********`20`20`20LOCAL`20`20VARIABLES`20`20`20********/
X`20`20`20`20`20`20`20`09`20ULONG`09`20`20status;`09`09/*`20return`20code`20sta
Vtus`20holder`09`20`20`20`20`20`20*/
X`09`20USHORT`09`20`20length;`09`09/*`20length`20of`20resulting`20string`09`20
V`20`20`20`20`20*/
X`09`20ITM_LST`20`20items`5B`5D`20=`20`7B`09`09/*`20items`20obtained`20during
V`20translation`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$DESCRIPTOR(table_d,"LNM$SYSTEM");
X$DESCRIPTOR(logdir_d,"JOBLOG$LOG");
X$DESCRIPTOR(stagedir_d,"JOBLOG$STAGE");
X
X
X`20`20`20items`5B0`5D.buf_len`20=`20NAM$C_MAXRSS;
X`20`20`20items`5B0`5D.buf_addr`20=`20log_dir;
X`20`20`20items`5B0`5D.ret_len`20=`20`26length;`09`09/*`20store`20it`20right`20
Vback`20in`20length`20`20`20`20`20`20*/
X
X`20`20`20status`20=`20SYS$TRNLNM(0,`26table_d,`26logdir_d,0,items);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`20`20`20LIB$STOP(JLG_NO_LOGICAL,1L,logdir_d.dsc$a_pointer);
X
X`20`20`20*(log_dir`20+`20length)`20=`20'`5C0';`09`09/*`20terminate`20it`09`09
V`09`20`20`20`20`20`20*/
X
X`20`20`20items`5B0`5D.buf_addr`20=`20stage_dir;
X
X`20`20`20status`20=`20SYS$TRNLNM(0,`26table_d,`26stagedir_d,0,items);
X
X`20`20`20if(!(status`20`26`20SS$_NORMAL))
X`20`20`20`20`20`20LIB$STOP(JLG_NO_LOGICAL,1L,stagedir_d.dsc$a_pointer);
X
X`20`20`20*(stage_dir`20+`20length)`20=`20'`5C0';`09/*`20terminate`20it`09`09
V`09`20`20`20`20`20`20*/
X`20`20`20return;
X
X`7D`09/***`20get_logicals`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09ctrly_trap
X
X`20`20Purpose:`09Set`20up`20the`20AST`20for`20trapping`20control-Y.
X
X`20`20Formal`20Parameters:
X
X`09Name`09`09`09Description
X`09----`09`09`09-----------
X`09channel`09`09`09TTY`20channel
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`09SUCCESS`09`09`09successful`20completion
X`09FAILURE`09`09`09unable`20to`20set`20control-Y`20AST
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20ULONG`20ctrly_trap(USHORT`20channel)
X
X`7B`09/***`20ctrly_trap`20***/
X
X`20`20`20if(SYS$QIOW(0,channel,IO$_SETMODE`20`7C`20IO$M_CTRLYAST,0,0,0,ctrly_a
Vst,0,
X`09`20`20`20`20`20`20`200,0,0,0)`20!=`20SS$_NORMAL)
X`20`20`20`20`20`20return(FAILURE);
X
X`20`20`20return(SUCCESS);
X
X`7D`09/***`20ctrly_trap`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09ctrly_ast
X
X`20`20Purpose:`09AST`20routine`20alled`20when`20control-Y`20is`20detected.
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`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`20ctrly_ast(void)
X
X`7B`09/***`20ctrly_ast`20***/
X
X`20`20`20ctrly_trap(tt_chan);`20`20`20`20`20`20
X`20`20`20return;
X
X`7D`09/***`20ctrly_ast`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09ctrlc_trap
X
X`20`20Purpose:`09Set`20up`20the`20AST`20for`20trapping`20control-C.
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`09`09Reason
X`09----`09`09`09------
X`09SUCCESS`09`09`09successful`20completion
X`09FAILURE`09`09`09unable`20to`20set`20control-C`20AST
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20ULONG`20ctrlc_trap(void)
X
X`7B`09/***`20ctrlc_trap`20***/
X
X`20`20`20if(SYS$QIOW(0,tt_chan,IO$_SETMODE`20`7C`20IO$M_CTRLCAST,0,0,0,ctrlc_a
Vst,0,
X`09`20`20`20`20`20`20`200,0,0,0)`20!=`20SS$_NORMAL)
X`20`20`20`20`20`20return(FAILURE);
X
X`20`20`20return(SUCCESS);
X
X`7D`09/***`20ctrlc_trap`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09ctrlc_ast
X
X`20`20Purpose:`09AST`20routine`20alled`20when`20control-C`20is`20detected.
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`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`20ctrlc_ast(void)
X
X`7B`09/***`20ctrlc_ast`20***/
X
X`20`20`20ctrlc_trap();`09`09`09/*`20reset`20the`20control-C`20AST`09`20`20`20
V`20`20`20*/
X`20`20`20return;
X
X`7D`09/***`20ctrlc_ast`20***/
X`0C
X/*****************************************************************************
V**
X******************************************************************************
V**
X
X`20`20Function:`09joblog_check
X
X`20`20Purpose:`09Make`20sure`20that`20the`20user`20isn't`20already`20running
V`20JOBLOG.
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`09JLG_INUSE`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`20`09`09Reason
X`09----`09`09`09------
X`09status
X
X******************************************************************************
V**
X******************************************************************************
V*/
X
Xstatic`20void`20joblog_check(void)
X
X`7B`09/***`20joblog_check`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`20owner;`09`09/*`20parent`20process`20PID`09`09`20`20`20`20`20`20*/
V
X`09`20long`09`20`20item_code;`09`09/*`20for`20LIB$GETJPI()'s`20sake`09`20`20
V`20`20`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`20newpname`5BPNAME_MAX+1`5D;/*`20process`20name`20for`20JOBLOG`20sub
+-+-+-+-+-+-+-+- END OF PART 4 +-+-+-+-+-+-+-+-

Reply all
Reply to author
Forward
0 new messages