tPCSI$IOpenVMS Alpha POLYCENTER Software Installation Utility Version: V8.2-113a KRVMSCRONVproduct KR VMS CRON V1.3 full ;4 file [CRON]AAAREADME.TXT generation 130 size 5 ;0 file [CRON]BUILD.COM generation 130 size 3 ;0 file [CRON]CLONTAB.C generation 130 size 6 ;8 file [CRON]CLONTAB.EXE_ALPHA generation 130 size 9 ;6 file [CRON]CLONTAB.EXE_VAX generation 130 size 5 ;9 file [CRON]CLONTAB.OBJ_ALPHA generation 130 size 22 ;6 file [CRON]CLONTAB.OBJ_VAX generation 130 size 5 ;3 file [CRON]CLONTAB.TXT generation 130 size 10 ;/ file [CRON]CRON.HLP generation 130 size 6 ;J file [CRON]CRON013.RELEASE_NOTES generation 130 release notes size 2 ;3 file [CRON]CRONTAB.COM generation 130 size 11 ;; file [CRON]CRON_POSTINSTALL.COM generation 130 size 3 ;7 file [CRON]CRON_STARTUP.COM generation 130 size 6 ;0 file [CRON]MYCRON.C generation 130 size 20 ;/ file [CRON]MYCRON.H generation 130 size 1 ;8 file [CRON]MYCRON.EXE_ALPHA generation 130 size 18 ;6 file [CRON]MYCRON.EXE_VAX generation 130 size 10 ;8 file [CRON]MYCRON.OBJ_ALPHA generation 130 size 44 ;5 file [CRON]MYCRON.OBJ_VAX generation 130 size 9 ;9 file [CRON]MYCRON_STARTUP.COM generation 130 size 2 ;4 file [CRON]SEND_MAIL.COM generation 130 size 1 ;@ module [CRON]CRON.HLP type help generation 130 module CRON ;} execute install "@PCSI$DESTINATION:[CRON]CRON_STARTUP.COM START" remove ("@PCSI$DESTINATION:[CRON]CRON_STARTUP.COM STOP",6 "DELETE/NOLOG SYS$HELP:CRON%%%.RELEASE_NOTES;*") ;3 information STARTUP phase after with helptext ; end product ;00'PRODUCTECRON V1.3 ist der von Karl Rohwedder paketierte Kit der CRON Utility.$CC'Flags'/Nodebug/NoWarning CLONTAB/Object=CLONTAB.OBJ_'ARCH'<$CC'Flags'/Nodebug/NoWarning MYCRON/Object=MYCRON.OBJ_'ARCH'$Endif!$If (P1.eqs."") .or. (P1.eqs."L")$Then $Write Sys$output " Linking..."J$Link/NoDebug/NoTraceback/Executable=CLONTAB.EXE_'Arch' CLONTAB.OBJ_'Arch'H$Link/NoDebug/NoTraceback/Executable=MYCRON.EXE_'Arch' MYCRON.OBJ_'Arch'$Endif$Exit0[CRON]CLONTAB.C  = @K?K=ӮbQ /* * clontab.c *" * clontab (not clontab, cLontab!) *+ * Changes by Holger Teutsch on 15-Oct-1991 * */#include #include #include #include #ifdef VAXC#include #endif#include #include "mycron.h"#define unlink delete#define link rename/* * forwards */static list(const char *who);(static int delete_ent (const char *who);3static int add (const char *who, const char *what);char (userlist[40])[100]; int numusers; char CWD[80];/* * main */main (int argc, char **argv){ int fd; char user[80]; struct passwd *pw;' umask (077); /* world no access */ getcwd (CWD, sizeof CWD); argv[ 0 ] = "clontab"; if (argc != 2) {= fprintf(stderr,"usage: %s [-l|-d|filename]\n",argv[0]); exit(1); } strcpy (user, getenv("USER")); lower (user); chdir (CRONAREA); if (!strcmp (argv[1],"-l")) list (user);" else if (!strcmp (argv[1],"-d")) { if (!delete_ent (user)): fprintf(stderr, "no crontab file for <%s> found\n",user); } else add(user,argv[1]); exit(127);}static list(const char *who){  FILE *cronlisting; char dummy[256]; strcpy (dummy, SPOOL); strcat (dummy, who);" cronlisting = fopen (dummy,"r"); if (!cronlisting) {= fprintf(stderr,"no crontab file for <%s> found\n",who); return; } for (;;) {/ fgets (dummy, sizeof dummy, cronlisting); if (feof(cronlisting)) break; fputs(dummy,stdout); } fclose(cronlisting);}'static int delete_ent (const char *who){  char filename[256]; int done; strcpy (filename, SPOOL); strcat (filename, who);" done = (unlink (filename) >= 0);+ close (open (NEWCRONLIST,O_CREAT,0770) ); return done;}1static int add(const char *who, const char *what){ FILE *tasks, *cstream; char dummy[256]; chdir(CWD); tasks = fopen(what,"r"); chdir (CRONAREA); if (!tasks) {3 fprintf(stderr,"cannot open file %s\n",what); return; }/ delete_ent(who); /* get rid of old file */ strcpy (dummy, SPOOL); strcat (dummy, who); cstream = fopen (dummy, "w");% fgets (dummy, sizeof dummy, tasks); while (!feof(tasks)) { fputs(dummy,cstream); fgets(dummy,256,tasks); } fclose(cstream); fclose(tasks);+ close (open (NEWCRONLIST,O_CREAT,0770) );} lower(str) char *str;{  while (*str) { *str=tolower(*str); ++str; }}0[CRON]CLONTAB.EXE_ALPHA  QQ?>Q~~ " D h(>)0?>CLONTABV1.0A13-03$ $$ $J $( 8 DECC$SHR_0010"0( P&[.SPOOL]p0"p0( &USER-dp9&Pclontab9F0`"(  r$-lw0 08"P0 [.SPOOL]newentries.markcannot open file %s no crontab file for <%s> found cron$lib:[000000]usage: %s [-l|-d|filename] #8^0[~ "0#@^4GHcGG#  (#ݶ8bIdZk(=0@b#@ӰBG4Gb/zZkcG8]@]HP#/k///p#4G`^[~h^p~xGGGGb/NZkB GTGbZkB4G bXF p"cZk`BG"TGhbWAZk"0b#F@B4Gb`"/yZkB""TGb@Zk"Wh="BbTGFh`=`"ydZkPBTG`"""XbFZk"@"GBtG]"b81"/^Zk//////B?"G`"tGbZk0BG4G8b/?@Zk///`//B$TG`"bfVZkB`"?"GtGbZk0BG4G8b&@Zk//BG4GbbQZk/////BTGx""bx@Zk//"b#/@///"@]"BbtG81"^Zk/////Bc4Gb xZkPBGTG""Xb/GFZkBG4Gb`"/xZk"@G BbtG 1"^Zk/i///"b#i@hB`"="bTGDh`cZkPB`"TG""Xb/FZkBG`"?"GtGbZk0BG4G8bZk/////BGTG`"bUZkB`"?"GtGbZk0BG4G8bZk//BG4GbPZkBG4GbPZk B?"_"(btG~DZkBG4GbPZk////@"BtGB"b"x1"^ZkpB4G4GxbyZkpBG4Gxb}yZk/#@[G^~TG"^ GG~0[8bF~^jcZkPB"4GXbHZkpB C ?"=_"tGxb/?DZk`BG4GhbPZkG]] 0#k///0.0J! #~^^~ GGG, B4G# (b@HH/VZk.qHPJc F>C.CJ_G]]} 0#kTX0 :0P`p 0@@ @DECC$SHR0[CRON]CLONTAB.EXE_VAX  Pm?\>5~~ "  0D`0205G>) CLONTABV1.0UG>V11-50    ?!! DECC$SHR_001Q! MTHRTL_001 ! LIBRTL_001$+CMA$TIS_SHR_001clontabusage: %s [-l|-d|filename] USERcron$lib:[000000]-l-dno crontab file for <%s> found [.SPOOL]rno crontab file for <%s> found [.SPOOL][.SPOOL]newentries.markrcron$lib:[000000]cannot open file %s [.SPOOL]w[.SPOOL]newentries.markΨ^SW PΨ^WV2?~ P~ЬRϮbѬbϩRbϨPRbPb~PbRbPzρЬUݥP1TϐͨTͨ~ͨ=PSTntRb1PS<~ͨ2cP PʏP8P`ͨ S1ݥPrRͨRͨͨRPRRS<~<~PS$sRbS ݥ~_W VRVPP ^,Ϙݬ PSωSݬω3P`ЬR4 RQPQQR<~<~P5ݬ!`PRS<~scP PʏP2PROS<~AcP PʏPRS<~<~ϥP^PЬRb~PbRR@@ @ (@x  @DECC$SHRMTHRTLLIBRTL CMA$TIS_SHR0[CRON]CLONTAB.OBJ_ALPHA|ZcCKCK5kӮbQ" ,CCCLONTABV1.030-SEP-2005 11:58Compaq C V6.5-001  $ABS$i$CODE$ $LITERAL$P$LINK$$DATA$$BSS$ $READONLY_ADDR$ $READONLY$ USERLIST0USERLIST NUMUSERS0 NUMUSERS PCWD( CWD(JPMAIN(JpLOWER(J__MAIN = #8^0[~ "0#@^4GHcGG#  (#ݶ8b@Zk(=0@b#@ӰBG4Gb/@ZkcG8]@]HP#/k///p#4G`^[~h^p~xGGGGb/@ZkB GTGb@ZkB4G bXF p"@Zk`BG"TGhb@Zk"0b#F@B4Gb`"/@ZkB""TGb@Zk"Wh="BbTGFh`=`"@ZkPBTG`"""Xb@Zk"@"GBtG]"b81"/@Zk//////B?"G`"tGb@Zk0BG4G8b/@Zk///`//B$TG`"b@ZkB`"?"GtGb@Zk0BG4G8b@Zk//BG4Gb@Zk/////BTGx""b@Zk//"b#/@///"@]"BbtG81"@Zk/////Bc4Gb @ZkPBGTG""Xb/@ZkBG4Gb`"/@Zk"@G BbtG 1"@Zk/i///"b#i@hB`"="bTGDh`@ZkPB`"TG""Xb/@ZkBG`"?"GtGb@Zk0BG4G8b@Zk/////BGTG`"b@ZkB`"?"GtGb@Zk0BG4G8b@Zk//BG4Gb@ZkBG4Gb@Zk B?"_"(btG@ZkBG4Gb@Zk////@"BtGB"b"x1"@ZkpB4G4Gxb@ZkpBG4Gxb@Zk/#@[G^~TG"^ GG~0[8bF~^@ZkPB"4GXb@ZkpB C ?"=_"tGxb/@Zk`BG4Ghb@ZkG]] 0#k///0.0J! #~^^~ GGG, B4G# (b@HH/@Zk.qHPJc F>C.CJ_G]]} 0#k4%G\ DECC$MAIN4&Lb# DECC$MAIN4%X@\ DECC$MAIN4lG DECC$EXIT4 xb# DECC$EXIT4@ DECC$EXIT4 G DECC$UMASK4b#P DECC$UMASK4 @ DECC$UMASK4!G  DECC$GETCWD4"b#P DECC$GETCWD4!@  DECC$GETCWD4#G4 DECC$GETENV4$ b#P DECC$GETENV4#0@4 DECC$GETENV4 4GL DECC$STRCPY4 Db#P DECC$STRCPY4 H@L DECC$STRCPY4\Gt DECC$CHDIR4db#P DECC$CHDIR4p@t DECC$CHDIR4tG DECC$STRCMP4b#P DECC$STRCMP4@ DECC$STRCMP4G DECC$STRCAT4b#P DECC$STRCAT4@ DECC$STRCAT4G DECC$FOPEN4b#P DECC$FOPEN4@ DECC$FOPEN4GDECC$GXFPRINTF4b#PDECC$GXFPRINTF4@DECC$GXFPRINTF4 G< DECC$FGETS44b#P DECC$FGETS48@< DECC$FGETS4<GT DECC$FEOF4Hb#P DECC$FEOF4P@T DECC$FEOF4pG DECC$FPUTS4b#P DECC$FPUTS4@ DECC$FPUTS4G DECC$FGETS 4b#P DECC$FGETS4@ DECC$FGETS4G DECC$FEOF4b#P DECC$FEOF4@ DECC$FEOF4G DECC$FCLOSE4b#P DECC$FCLOSE4@ DECC$FCLOSE4G DECC$STRCMP4b#P DECC$STRCMP4@ DECC$STRCMP4@GXDECC$GXFPRINTF4Db#PDECC$GXFPRINTF4T@XDECC$GXFPRINTF4pG DECC$CHDIR4|b#P DECC$CHDIR4@ DECC$CHDIR4G DECC$FOPEN4b#P DECC$FOPEN4@ DECC$FOPEN4G DECC$CHDIR4b#P DECC$CHDIR4@ DECC$CHDIR4GDECC$GXFPRINTF4b#PDECC$GXFPRINTF4@DECC$GXFPRINTF4G8 DECC$STRCAT4b#P DECC$STRCAT44@8 DECC$STRCAT48GT DECC$FOPEN4Hb#P DECC$FOPEN4P@T DECC$FOPEN4TGt DECC$FGETS4lb#P DECC$FGETS4p@t DECC$FGETS4tG DECC$FEOF4b#P DECC$FEOF4@ DECC$FEOF4G DECC$FPUTS4b#P DECC$FPUTS4@ DECC$FPUTS4G DECC$FGETS4b#P DECC$FGETS4@ DECC$FGETS4G DECC$FEOF4b#P DECC$FEOF4@ DECC$FEOF4G DECC$FCLOSE4b#P DECC$FCLOSE4@ DECC$FCLOSE4G DECC$FCLOSE4b#P DECC$FCLOSE4@ DECC$FCLOSE4G8 DECC$OPEN4,b#P DECC$OPEN44@8 DECC$OPEN48GL DECC$CLOSE4Db#P DECC$CLOSE4H@L DECC$CLOSE4dGDECC$GXFPRINTF4pb#PDECC$GXFPRINTF4@DECC$GXFPRINTF4G DECC$EXIT4 b#P DECC$EXIT4@ DECC$EXIT4G DECC$EXIT4 b#P DECC$EXIT4@ DECC$EXIT4G DECC$STRCAT4b# DECC$STRCAT4@ DECC$STRCAT4G  DECC$DELETE4b# DECC$DELETE4@  DECC$DELETE4 G4 DECC$OPEN4(b# DECC$OPEN40@4 DECC$OPEN44GH DECC$CLOSE 4@b# DECC$CLOSE4D@H DECC$CLOSE4 G DECC$TOLOWER4 b# DECC$TOLOWER4 @ DECC$TOLOWER% %=([.SPOOL]newentries.mark = cannot open file %s 8=0!no crontab file for <%s> found `= cron$lib:[000000]x=%usage: %s [-l|-d|filename]  =0";=0( ;0 DECC$STRCAT=[.SPOOL]P DECC$DELETE DECC$CLOSE DECC$OPEN=0"p;=0(  DECC$TOLOWER DECC$STRCPY=USER=-d DECC$UMASK DECC$STRCMP DECC$FPUTS= clontab DECC$FCLOSE DECC$CHDIRDECC$GXFPRINTF DECC$FGETS=0`";=( 7CWD DECC$FEOF7DECC$GA_STDERR DECC$FOPEN7DECC$GA_STDOUT DECC$EXIT=r! DECC$GETCWD=-l=w# DECC$GETENV=08";=P0 7DECC$$SHELL_HANDLER=% DECC$MAIN@ @6=  DECC$GA_STDERRDECC$GA_STDOUT DECC$FCLOSEDECC$GXFPRINTF DECC$FPUTS DECC$FEOF DECC$FOPEN DECC$FGETS DECC$EXIT DECC$UMASK DECC$GETENV DECC$GETCWD DECC$STRCPY DECC$CHDIR DECC$STRCMP DECC$STRCAT DECC$DELETE DECC$CLOSE DECC$OPEN DECC$TOLOWER DECC$MAIN DECC$$SHELL_HANDLER C$GA0[CRON]CLONTAB.OBJ_VAX  h PDKH/DK%ӮbQ 4CLONTABV1.030-SEP-2005 11:58DEC C V6.4-005P[.SPOOL]newentries.markPwP[.SPOOL]Pcannot open file %s Pcron$lib:[000000]PrP[.SPOOL]newentries.markP[.SPOOL]Pno crontab file for <%s> found PrxP[.SPOOL]XPno crontab file for <%s> found OP-dLP-l:Pcron$lib:[000000]4PUSERPusage: %s [-l|-d|filename] PclontabP PΨ^DECC$MAIN_ARGSW PΨ^WV2?~ DECC$UMASKP~ DECC$GETCWDЬRϮbѬbϩDECC$GA_STDERRRb DECC$DFPRINTF DECC$EXITϨ DECC$GETENVP DECC$STRCPY򞭨RbPb~ DECC$TOLOWERPbRbPz DECC$CHDIRρЬUݥ DECC$STRCMPP1Tϐͨ DECC$STRCPYTͨ DECC$STRCAT~ͨ DECC$FOPENPSTnDECC$GA_STDERRRb DECC$DFPRINTF1PS<~ͨ DECC$FGETScP PʏPDECC$GA_STDOUTP`ͨ DECC$FPUTSS DECC$FCLOSE1ݥ DECC$STRCMPPrRͨ DECC$STRCPYRͨ DECC$STRCATͨ DECC$DELETERPRRS<~<~ DECC$OPENP DECC$CLOSES$sDECC$GA_STDERRRb DECC$DFPRINTF ݥ~ DECC$EXITW V DECC$EXITVPP ^ DECC$CHDIRϘݬ DECC$FOPENPSω DECC$CHDIRSݬωDECC$GA_STDERRP` DECC$DFPRINTFЬR4 DECC$STRCPYR DECC$STRCAT DECC$DELETEQPQQR<~<~ DECC$OPENP DECC$CLOSE5 DECC$STRCPYݬ DECC$STRCAT!USERLISTNUMUSERSCWDDECC$GA_STDOUTDECC$GA_STDERR DECC$EXIT DECC$TOLOWER DECC$OPEN DECC$CLOSE DECC$DELETE DECC$STRCAT DECC$STRCMP DECC$CHDIR DECC$STRCPY DECC$GETCWD DECC$GETENV DECC$UMASK DECC$EXIT DECC$FGETS DECC$FOPEN DECC$FPUTS DECC$DFPRINTF DECC$FCLOSE __MAIN 4MAIN tLOWERDECC$MAIN_ARGS$CODE$DATA $ADDRESS_DATA USERLIST NUMUSERS PCWD  DECC$FOPENPRS<~ DECC$FGETScP PʏP2PR DECC$FPUTSS<~ DECC$FGETScP PʏPR DECC$FCLOSES DECC$FCLOSE<~<~ϥ DECC$OPENP DECC$CLOSE^PЬRb~ DECC$TOLOWERPbRR 0[CRON]CLONTAB.TXT ZI%gG8[gG6ӮbQ" 2Some guides to using clontab and keeping your hair2==================================================1. Clontab files;The clontab program requires input files that follow a very;firm structure. This structure, however, will allow a allow.a myriad of time combinations to by specified.=A crontab input file (for example, CRON.ENT) differs slightly:on the VAX from the UNIX version. On the Vax, each line in>CRON.ENT must be a complete entry. This differs from the UNIX?implentation which allows a cron entry to span several lines in the CRON.ENT. 3. An example*Let us now examine a typical clontab file.-------start of file--------## UNISRC_ID: @(#)crontab entry 27.1D0,15,30,45 * * * 2,3,4,5,6 user1:[lrb.cron]mailcheck.com /priority=1)50 * * * 1 user1:[lrb.cron]mailcheck.com --------end of file--------->This file has two crontab submissions in it. The first line isEa comment, for it starts with a pound (#) symbol. The blank line isignored.GThis file controls when the com file, user1:[lrb.cron]mailcheck.com, isGrun. ALL SUBMISSIONS TO CRON MUST BE IN THE FORM OF A COM FILE. This isCbecause cron executes your requests by submitting them to the batchqueue under your name. +A crontab request is made up of six fields: minutes (0-59) hours (0-23) day of month (1-31) month of year (1-12)" day of week (0-6 with 0 = Sunday) command7In our example, the fields of the first submission are: minutes: 0,15,30,45 hours: * month day: * month: * day of week: 2,3,4,5,63 command: user1:[lrb.cron]mailcheck.com /priority=1CIn our example, the two requests define that the file mailcheck.comEbe submitted to batch every fifteen minutes Tuesday through Saturday E(with priority 1), at ten minutes to the hour on Mondays and never on Sundays. 3. Your LOGIN.COM fileABecause you are logged in by batch, your LOGIN.COM is executed asIyour clontab submission is run. If you set your process name within batch?AND you are logged in when the clontab submission is made, thenEyour batch submission will end with a "duplicate process name error".CThe way to avoid this is by skipping over most of your LOGIN.COM byCchecking the mode of your login with the f$mode() lexical function.0The following is an example of such an approach:1 if f$mode() .NES. "INTERACTIVE" then goto END" < your personal login stuff >C END: $!last line of file(Another way would be to insert the line: set Noon8in your login.com which will allow the duplicate processname error to be non-fatal.4. Where does the output go?HAlthough clontab entries define batch submissions, output is not handledGin the same manner as a batch file submission. When a cron execution isHfinished the output can be mailed back to the user. Specify the TRAILINGFqualifier /MAIL. As your 'command' is appended to SUBMIT/NOLOG/NOPRINT9you have any choice in handling your output requirements. examples:-1. - output collected and mailed back to user2 50 * * * 1 user1:[lrb.cron]mailcheck.com /mail62. - output collected into a file called mailcheck.log0 50 * * * 1 user1:[lrb.cron]mailcheck.com/LOG23. - output collected into a file called batch.log: 50 * * * 1 user1:[lrb.cron]mailcheck.com/LOG=BATCH.LOG4. - output not collected, 50 * * * 1 user1:[lrb.cron]mailcheck.com!5. - output collected and printed3 50 * * * 1 user1:[lrb.cron]mailcheck.com /print5. clontab usage(put the following line in your login.com($ CLONTAB == "$CRON$LIB:[000000]CLONTAB"7this will allow you to use clontab as a foreign command.clontab --> generates usage line,clontab -l --> list current entry.clontab -d --> delete current entry;clontab filename.ext --> use "filename.ext" as a new entry 6. author!_________________________________=Lance R. Bailey, Systems Manager | Robarts Research InstituteBemail: lrb@rri.uwo.ca | Clinical Trials Resources Group? vox: 519-663-3787 ext. 4108 | P.O. Box 5015, 100 Perth Dr.9 fax: 519-663-3789 | London, Canada N6A 5K8Modifications by HTsee VAXC_CRON_ANN.TXT 6. copyright author 1990.G=======================================================================!_________________________________=Lance R. Bailey, Systems Manager | Robarts Research InstituteBemail: lrb@rri.uwo.ca | Clinical Trials Resources Group? vox: 519-663-3787 ext. 4108 | P.O. Box 5015, 100 Perth Dr.9 fax: 519-663-3789 | London, Canada N6A 5K80[CRON]CRON.HLP  fL1-@@UBӮbQ"  1 CRON<CRON ist ein in der UNIX Welt verbreitetes Werkzeug, um Jobs&zu regelmssigen Zeiten zu aktivieren.CDer CRON-Daemon selber luft als 'detached process' im Hintergrund.@Jeder Anwender steuert CRON durch eine sogenannte CRONTAB Datei.ADiese Datei kann mit dem Editor erzeugt werden und wird dann CRON1bekannt gemacht. Der Name der Datei ist beliebig.3CRON bertrgt diese Datei in einen Arbeitsbereich.EDer Aufbau der CRONTAB Datei muss strengen Formaten genuegen. Bis aufBdie Tatsache, dass keine Fortsetzungszeilen erlaubt sind, ist das %Format mit dem UNIX Format identisch.DHinweis: Wegen eines Fehlers in der CRON Software, ist es notwendig,B in CRONTAB Dateien mit mehreren Eintrgen, jedes Kommando< mit Leerzeichen bis zum Ende der Zeile aufzufllen. 2 CRONTAB.DATAufbau CRONTAB:/ # mit dem Gartenzaun beginnen Kommentarzeilen= # es folgt ein Auftrag, es koennen beliebig viele Auftraege) # in einer CRONTAB Datei enthalten sein5 MINUTEN STUNDEN TAGE MONATE WOCHENTAGE JOB OPTIONEN1 Minuten: starte Job zu diesen Minuten (0-59)1 Stunden: starte Job zu diesen Stunden (0-23)8 Tage: starte Job an diesen Tagen im Monat (1-31)9 Monate: starte Job an diesen Monaten im Jahr (1-12)? Wochentage: starte Job an diesen Wochentagen (0-6, 0:Sonntag)" Job: der zu startende JobI Optionen: /MAIL: Jobausgaben werden an den Anwender via MAIL gesendetEAlle Auftrage werden mittels SUBMIT/NOPRINT/NOLOG in eine Batchqueue gestellt.LDaraus folgt, dass nur Kommandoprozeduren als Job definiert werden koennen. KDas LOGIN.COM des Anwenders wird durchlaufen. Hierbei ist zu beachten, dassJalle fuer die interaktive Nutzung des Rechnes vorgesehenen Befehle mittelsIIF F$MODE("BATCH") THEN $ GOTO BATCH (oder hnlich) uebersprungen werden. DPer se werden keinen Logdateien erstellt. Da der JOB einfach an den HSubmitbefehl angehaengt wird, kann der Anwender die Logdateien beliebig durch /LOG=... steuern. 3 BeispieleJ1. 0,10,20,30,40,50 * * * 1,2,3,4,5 $ROHWEDDER:ARBEIT.COM/LOG=ARBEIT_1.LOGF Alle 10 Minuten an den Werktagen wird ARBEIT.COM gestartet und die 2 Ausgaben werden in ARBEIT_1.LOG protokolliert. 2 Achtung: SYS$LOGIN kann nicht verwendet werden.*2. 30 * * * 6 $ROHWEDDER:SAMSTAG.COM /MAILB Am Sonnabend wird der Job SAMSTAG.COM immer zur halben Stunden D gestartet, die Ausgaben werden via MAIL an der Anwender gesendet. 2 CLONTABDMit dem Werkzeug CLONTAB (Aufruf: $ CLONTAB) wird eine CRONTAB DateiCRON bekanntgemacht. " CLONTAB hat folgende Funktionen:$ -h diese Hilfe wird ausgegeben0 -l die aktive CRONTAB Datei wird angezeigt@ -d die aktive CRONTAB Datei wird gelscht (innerhalb CRON)G FILE die Datei FILE wird als neue aktive CRONTAB Datei eingetragen,/ alte Eintragungen werden berschrieben0RON]CRON013.RELEASE_NOTES  BىHjH2;yӮbQ" 3 ===========================================% Release Notes fuer CRON - Kit2 =========================================== V1.3 0. Generell+ - Abhngigkeiten von VW Umgebung entfernt. V1.2 0. Generell - Kit als PCSI Kit paketiert.? - Restart der CRON Software aus Postinstall herausgenommen, da von PCSI heraus erfolgt. 1. CRON.HLP - Hilfemodul erstellt. V1.1 1. CRON_STARTUP.COMB - Zugriffe werden jetzt via ACL gesteuert und die CRONTAB Utility, wird nicht mehr privilegiert installiert. 2. CRONTAB.COM - IA64 Support integriert. V1.0 0. Generell, - CRON Software in eigenen Kit ausgelagert.0[CRON]CRONTAB.COM an5ı3-5ın ļ" $save_verify='f$veri(0)'$$!. checksum = "26503 145 594 5021" %$! DISK$CNC_DISK:[CRON]CRONTAB.COM;20E$! Created at 11-OCT-2005 08:14 by ROHWEDDER on SAP01 under VMS V8.2.$completion_code=1%$On Error Then $ Goto Execution_Error#$On Control_Y Then $ Goto Control_Y$$If "''Dcl_Debug'" Then $ Set Verify($If "''CRONTAB_Debug'" Then $ Set Verifya$If F$Integer("''Max_Verify_Level'") .Ge. F$Environment("Depth") Then $ Tmp=F$Verify(Save_Verify)$If "''DCL_Dlines'"$Then DclDbg=" "$Else DclDbg=" !"$Endif$Version="V1.1-3"$Params="-h|-l|-d|filename"6$Facility=F$Parse(F$Environment("Procedure"),,,"Name")7$If F$Locate("?",P1) .Ne. F$Length(P1) .or. P1 .eqs. ""$Then$Ws "Version: ''version'"#$ws "Usage: @''facility' ''params'" $Goto Exit$Endif$Ws="Write Sys$Output"$Arch=F$getsyi("Arch_Type") $Cron="SHIT"?$If (Arch.eq.1) Then $ Cron="$CRON$LIB:[000000]CLONTAB.EXE_VAX"A$If (Arch.eq.2) Then $ Cron="$CRON$LIB:[000000]CLONTAB.EXE_ALPHA"?$If (Arch.eq.3) Then $ Cron="$CRON$LIB:[000000]CLONTAB.EXE_I64"$If (Cron.eqs."SHIT")$ThenQ$Ws "?''Facility'-F-UNSUPP, the current architecture (''Arch') is not supported!" $Goto Exit$Endif2$P1=F$Edit(P1,"Trim,Lowercase,UnComment,Collapse") $OldDir=F$environment("Default")@$Username=F$Edit(F$Getjpi("","Username"),"Trim,Upcase,Collapse")($CronFile="CRON$LIB:[SPOOL]''Username'."$If F$Extract(0,1,P1) .nes. "-"$Then $Cron "''P1'"$If F$Search(CronFile) .nes. ""$Then8$MyUic=F$Edit(F$Getjpi("","UIC"),"Trim,Upcase,Collapse")N$FileUic=F$Edit(F$File_Attributes("''CronFile'","UIC"),"Trim,Upcase,Collapse")T$If (MyUic.nes.FileUic) Then $ Set File 'CronFile'/Owner='Username'/Protection=(W,G)$Endif$Else$If P1 .eqs. "-h"$Then $GoSub Help$Else $Cron "''P1'"$Endif$Endif $Goto Exit$Execution_Error:$___Status=$Status1$Ws "?''Facility', Execution error: ''___Status'"$Ws "-''F$message(___Status)'" $Control_Z: $Control_Y:$Exit:4$If "''OldDir'" .nes. "" Then $ Set Default 'OldDir' $Set Noon $Set Noverify6$Tmp="! "+F$Parse(F$Environment("Procedure"),,,"NAME")&$If "''Save_Verify'" Then $ Set Verify$Exit 'Completion_Code' 'Tmp'$Help:$Type/Page Sys$Input: C R O N > CRON ist ein in der UNIX Welt verbreitetes Werkzeug, um Jobs( zu regelmssigen Zeiten zu aktivieren. E Der CRON-Daemon selber luft als 'detached process' im Hintergrund. B Jeder Anwender steuert CRON durch eine sogenannte CRONTAB Datei.C Diese Datei kann mit dem Editor erzeugt werden und wird dann CRON3 bekannt gemacht. Der Name der Datei ist beliebig.5 CRON bertrgt diese Datei in einen Arbeitsbereich. G Der Aufbau der CRONTAB Datei muss strengen Formaten genuegen. Bis aufJ die Tatsache, dass keine Fortsetzungszeilen erlaubt sind, ist das Format mit dem UNIX Format identisch. F Hinweis: Wegen eines Fehlers in der CRON Software, ist es notwendig,D in CRONTAB Dateien mit mehreren Eintrgen, jedes Kommando> mit Leerzeichen bis zum Ende der Zeile aufzufllen.  Aufbau CRONTAB: / # mit dem Gartenzaun beginnen Kommentarzeilen= # es folgt ein Auftrag, es koennen beliebig viele Auftraege) # in einer CRONTAB Datei enthalten sein5 MINUTEN STUNDEN TAGE MONATE WOCHENTAGE JOB OPTIONEN 1 Minuten: starte Job zu diesen Minuten (0-59)1 Stunden: starte Job zu diesen Stunden (0-23)8 Tage: starte Job an diesen Tagen im Monat (1-31)9 Monate: starte Job an diesen Monaten im Jahr (1-12)? Wochentage: starte Job an diesen Wochentagen (0-6, 0:Sonntag)" Job: der zu startende JobI Optionen: /MAIL: Jobausgaben werden an den Anwender via MAIL gesendet P Alle Auftrage werden mittels SUBMIT/NOPRINT/NOLOG in eine Batchqueue gestellt.N Daraus folgt, dass nur Kommandoprozeduren als Job definiert werden koennen. M Das LOGIN.COM des Anwenders wird durchlaufen. Hierbei ist zu beachten, dassL alle fuer die interaktive Nutzung des Rechnes vorgesehenen Befehle mittelsK IF F$MODE("BATCH") THEN $ GOTO BATCH (oder hnlich) uebersprungen werden. F Per se werden keinen Logdateien erstellt. Da der JOB einfach an den J Submitbefehl angehaengt wird, kann der Anwender die Logdateien beliebig  durch /LOG=... steuern. Beispiele: L 1. 0,10,20,30,40,50 * * * 1,2,3,4,5 $ROHWEDDER:ARBEIT.COM/LOG=ARBEIT_1.LOG H Alle 10 Minuten an den Werktagen wird ARBEIT.COM gestartet und die 4 Ausgaben werden in ARBEIT_1.LOG protokolliert. 4 Achtung: SYS$LOGIN kann nicht verwendet werden. , 2. 30 * * * 6 $ROHWEDDER:SAMSTAG.COM /MAIL O Am Sonnabend wird der Job SAMSTAG.COM immer zur halben Stunden gestartet, ; die Ausgaben werden via MAIL an der Anwender gesendet.   Das Werkzeug CLONTAB: F Mit dem Werkzeug CLONTAB (Aufruf: $ CLONTAB) wird eine CRONTAB Datei CRON bekanntgemacht.  " CLONTAB hat folgende Funktionen:$ -h diese Hilfe wird ausgegeben0 -l die aktive CRONTAB Datei wird angezeigt@ -d die aktive CRONTAB Datei wird gelscht (innerhalb CRON)G FILE die Datei FILE wird als neue aktive CRONTAB Datei eingetragen,/ alte Eintragungen werden berschrieben  $Return 10[CRON]CRON_POSTINSTALL.COM  N>7ıB6ı>ۈļ" $save_verify='f$veri(0)'#$!. checksum = "37471 48 126 1196" .$! DISK$CNC_DISK:[CRON]CRON_POSTINSTALL.COM;19E$! Created at 11-OCT-2005 08:14 by ROHWEDDER on SAP01 under VMS V8.2.$$on error then $goto execution_error"$on control_y then $goto control_y#$if "''dcl_debug'" then $set verify0$if "''CRON_POSTINSTALL_debug'" then $set verify $Set NoOn$ws="write sys$output"2$asl="assign/system/executive/nolog/name=no_alias" $Delete="Delete/NoLog/NoConfirm"N$Copy/NoLog CRON_DIR:CRON013.RELEASE_NOTES SYS$COMMON:[SYSHLP]/PROTECTION=W:RED$Call Delete Sys$Help:cron*0%%.Release_Notes;* cron013.Release_NotesD$Call Delete Cron_Dir:cron*0%%.Release_Notes;* cron013.Release_Notes $Goto Exit$exit:$execution_error: $control_y: $set noon$on control_y then $continue $set noverify-$if "''save_verify'" then $exit 1+0*f$veri(1)$exit$DELETE: Subroutine$If P1 .eqs. "" Then $ Exit 1$loop:$nx=F$Search("''P1'")$If "''Nx'" .nes. ""$Then$Tmp1=F$Parse("''Nx'",,,"Type")$If "''Tmp1'" .eqs. ".EXE"$Then&$If F$file_attributes("''Nx'","KNOWN")$Then$Install Remove 'Nx'$Endif$Endif$If P2 .eqs. ""$Then$Delete/Log 'Nx'$Else$Delete/Log 'Nx'/Exclude='P2'$Endif $Goto Loop$Endif$Exit 1$ENDSubroutine0[CRON]CRON_STARTUP.COM  m 7ı<7ıļ"  $Set NoOn#$!. checksum = "62398 87 219 2906" *$! DISK$CNC_DISK:[CRON]CRON_STARTUP.COM;73E$! Created at 11-OCT-2005 08:14 by ROHWEDDER on SAP01 under VMS V8.2.D$Node=F$Edit(F$Getsyi("SCSNODE")-"_"-":"-":","Trim,Upcase,Collapse")&$If (Node.eqs."") Then $ Node="UNKOWN""$MySelf=F$environment("Procedure")7$MyDev=f$Elem(0,":",F$Parse(MySelf,,,"Device"))-":"+":"$$MyDir=F$Parse(MySelf,,,"Directory")!$Old_Dir=F$Environment("Default"):$MyDir1=MyDir -"]["-"><"-"<"-">"-"["-"]"-"["-"]"-"000000."$Set Default 'Mydev'['Mydir1']#$MyPar=F$Parse("[-]",,,"Directory"):$MyPar1=MyPar -"]["-"><"-"<"-">"-"["-"]"-"["-"]"-"000000."$MyDir2=Mydir1-Mypar1>$If (F$Extract(0,1,MyDir2).eqs.".") Then $ MyDir2=MyDir2 - ".">$P1=F$extract(0,3,F$Edit(P1,"Trim,Upcase,Collapse,UnComment"))$Par=""%$If P1 .eqs. "STA" Then $ Par="START"$$If P1 .eqs. "STO" Then $ Par="STOP"($If P1 .eqs. "LOG" Then $ Par="LOGICALS"$If Par .eqs. ""$Then=$Write Sys$Output "%Usage: @CRON_STARTUP START|STOP|LOGICALS" $Goto Exit$Endif$Set Process/Privileges=Alla$Assign/System/Executive/NoLog/Name=No_Alias/Translation=Concealed "''MyDev'[''MyDir1.]" Cron$LibJ$Assign/System/Executive/NoLog/Name=No_Alias "''MyDev'[''MyDir1]" Cron_Dir)$If (Par.eqs."LOGICALS") Then $ Goto Exit$If F$Getsyi("Cluster_Member")$Then$If F$Getsyi("VOTES") .le. 0$Theng$Write Sys$Output "%CRON_STARTUP, must run on voting bootnodes, just defining CRON$LIB and CRON_DIR..." $Goto Exit$Endif$Endif$If Par .eqs. "START"$Then $GoSub STOP7$If (F$search("SYS$HELP:CRON013.RELEASE_NOTES").eqs."")$Then$@CRON_DIR:CRON_POSTINSTALL$Endif6$If (F$Identifier("CRON_USER","NAME_TO_NUMBER").eqs.0)$Then>$Write Sys$Output "%CRON_STARTUP, adding CRON_USER identifier"$RUN SYS$SYSTEM:AUTHORIZE( ADD/IDENT/ATTRIBUTES=RESOURCE CRON_USER EXIT $Endif8$Set File 'Mydev'['MyPar1']'MyDir2'.Dir/Protection=W:"E"1$Set File Cron$Lib:[000000]*.COM/Protection=W:"E"3$Set File Cron$Lib:[000000]*.EXE_*/Protection=W:"E"3$If (F$Search("Cron$Lib:[000000]SPOOL.DIR").eqs."")$Then"$Create/Directory Cron$Lib:[SPOOL]$Endif4$Set File Cron$Lib:[000000]SPOOL.DIR/Protection=W:""P$Set File CRON$LIB:[000000]SPOOL.DIR/ACL=(Identifier=CRON_USER,ACCESS:R+W+E)/NEWO$Set File CRON$LIB:[000000]SPOOL.DIR/ACL=(Default_Protection,S=REWD,O=RWED,G,W)\$Run Sys$System:Loginout.Exe/detach/Noauthorize/input=CRON$LIB:[000000]MYCRON_STARTUP.COM -m/output=CRON$LIB:[000000]MYCRON_'NODE'.LOG/error=nl:/NoSwap/Process="CRON-Daemon"/Maximum=1024/Working=512 -/Privilege=All/UIC=[1,4] $Goto Exit$Endif$If Par .eqs. "STOP"$Then $GoSub STOP$Endif$Exit:9$If (F$Type(Old_Dir).nes."") Then $ Set Default 'Old_Dir'$Exit$STOP:'$If (F$type(ctx).eqs."PROCESS_CONTEXT")$Then($Temp=F$CONTEXT ("PROCESS",ctx,"CANCEL")$Endif3$Temp=F$context ("PROCESS",ctx,"UIC","[1,4]","EQL")<$Temp=F$context ("PROCESS",ctx,"PRCNAM","CRON-Daemon","EQL")$Pid=F$Pid(Ctx)$If (Pid.nes."")$Then$Stop/Identification='PID'$Endif$Return0[CRON]MYCRON.C^N&C4@Ki@KˑԦӮbQ(/* * mycron.c *! * mycron (get it? My-Cron. sigh) *= * daemon details based on a glorious article by Dave Lennert * in HP Communicator, May 1988A * daemon details mostly ignored on the VMS implementation. sigh. *- * 15-Oct-1991 Heavily modified by H. TeutschE * 27-JUL-1995 some changes by ROHWEDDER, skip log, SSCANF fixed * */#include #include #include #include #include #include #include #include #include #include "mycron.h"#define unlink delete8#define MAIL_WAIT 5 /* wait n minutes before looking */ /* for mail delivery */8#define TABLE_CHUNK 50 /* chunk for table allocation */typedef struct _descrip{ int length; void *addr; } descrip;/* * forwards */3static unsigned getuid_user (const char* username);static readtables (void);static int newcron (void); static void process_mail (void);,static int timecheck (struct cronentry *ct);5static int timematch (int value, const char *string);static void enqueue (void);static long now;Dstatic long check_mail = 1; /* check for mail delivery on startup*/static int sequence;static int my_uid;%static struct cronentry *cronentries;3static int max_entry; /* max entries allocated */static int n_entry;/* * main */main(){ char commandline[1024]; int status; int currentry; struct cronentry *ce; char *cptr;/* * daemon stuff */#ifdef SIGTTOU signal(SIGTTOU,SIG_IGN);#endif#ifdef SIGTTIN signal(SIGTTIN,SIG_IGN);#endif#ifdef SIGTTSTP signal(SIGTTSTP,SIG_IGN);#endif> signal(SIGHUP,SIG_IGN); /* immune form pgrp leader death */, umask(077); /* only owner has access */) my_uid = getuid (); /* get own uid */3 puts ("Waiting for lock.."); /* wait for lock */ enqueue (); puts ("Got lock"); chdir (CRONAREA);0 max_entry = TABLE_CHUNK; /* allocate table */M if ((cronentries = malloc (max_entry * sizeof (struct cronentry))) == NULL) { puts ("Can't alloc"); exit (0); }$ printf("reading first entries\n"); readtables ();/*% * and awaaaaaaaaaaaaaaaaaaaay we go! */ while(1) {  now = time((long *)0); if (newcron()) {! printf ("updating entries\n"); readtables (); unlink (NEWCRONLIST); }> for (ce = cronentries; ce < &cronentries[n_entry]; ce++) { if (!timecheck(ce)) continue;0 strcpy (commandline, "submit/noprint/user=");% strcat (commandline, ce->ce_user); strcat (commandline, " ");( strcat (commandline, ce->ce_command); if (ce->ce_log) {& char mf_name[100],logfile[100]; FILE *mf; check_mail = 1; sequence++;?/* sprintf (logfile, "cron$lib:[LOG]LOG.%05d", sequence);&* strcat (commandline, "/log=");&* strcat (commandline, logfile);*/5 sprintf (mf_name, SPOOL"mail.%05d", sequence);/ if ((mf = fopen (mf_name, "w")) == NULL) {/ printf ("Can't open file <%s>\n", mf_name); continue; }6 fputs ("$on warning then $exit $status\n", mf);+ cptr = strchr (ce->ce_command, ']');/ cptr = cptr ? cptr + 1 : ce->ce_command;@ fprintf (mf,"$ mail/subject=\"Cron: Log of %s\" %s %s\n", cptr, logfile, ce->ce_user);/ fprintf (mf, "$delete %s;*\n", logfile); fputs ("$exit 1\n", mf); fclose (mf);5 printf ("mailmarker <%s> created\n", mf_name); }! status = system (commandline);! printf ("\nthe time is now %s"$ "executed <%s>\nStatus: %08x\n",' ctime (&now), commandline, status); } if (check_mail) process_mail ();) sleep( 60 - (time((long *)0)%60) ); }}/* * process mail requests */static void process_mail (){ static int tick = MAIL_WAIT; char filename[256];% static char mask[] = SPOOL"MAIL.*";5 static descrip mask_desc = {sizeof mask - 1, mask};2 descrip file_desc = {sizeof filename, filename}; unsigned int context = 0; int r0; if (--tick > 0) return; tick = MAIL_WAIT; check_mail = 0;8 r0 = lib$find_file (&mask_desc, &file_desc, &context); lib$find_file_end (&context); if ((r0&1) == 0) return;$ system ("SUBMIT/NOLOG send_mail"); check_mail = 1;}/* * newcron *3 * check for existence of 'parameter change marker' */static int newcron (void){ struct stat statbuf;) return(! stat( NEWCRONLIST, &statbuf));}/*) * read crontab files into internal table */static readtables (void){ FILE *list;( char user[40],line[256],filename[256]; stat_t statbuf; unsigned uid;# static char mask[] = SPOOL"*.;0";5 static descrip mask_desc = {sizeof mask - 1, mask};2 descrip file_desc = {sizeof filename, filename}; unsigned int context = 0; int r0; n_entry = 0;# for (;;) /* loop over files */ { char *cptr;< r0 = lib$find_file (&mask_desc, &file_desc, &context); if ((r0&1) == 0) break;% *strchr (filename, ' ') = '\0';. printf ("processing <%s>\n", filename);? cptr = strchr (filename, ']') + 1; /* extract username */ strcpy (user, cptr);! *strchr (user, '.') = '\0';0 if ((list = fopen (filename,"r")) == NULL) {/ printf ("Can't open file <%s>\n", filename); continue; }- if (fstat (fileno(list), &statbuf) < 0) {* printf ("Can't stat <%s>\n", filename); fclose (list); continue; }/ printf ("uid is %08x\n", statbuf.st_uid);2 uid = getuid_user (user); /* check owner */< if (statbuf.st_uid != uid && statbuf.st_uid != my_uid) {A printf ("%s is not owner of <%s>, ignored\n", user, filename); fclose (list); continue; }? if (statbuf.st_mode & 077) /* check world's permission */ {B printf ("<%s> is world accessible, ignored\n", user, filename); fclose (list); continue; }# /* loop over lines in file */ for (;;) { struct cronentry *ce; char *cptr; if (n_entry == max_entry) { max_entry += TABLE_CHUNK; if ((cronentries = realloc (cronentries,7 max_entry * sizeof (struct cronentry))) == NULL) { puts ("Can't realloc"); exit (0); } } ce = &cronentries[n_entry];# fgets (line, sizeof line, list); if (feof (list)) break;% if (*line == '#' || *line == '\n') { continue; }" line[strlen (line) - 1] = '\0';1 if ( 6 != sscanf (line,"%s %s %s %s %s %100c", ce->ce_minute, ce->ce_hour, ce->ce_mday, ce->ce_month, ce->ce_wday, ce->ce_command) ) {7 printf ("Ignoring invalid format <%s>\n", line); continue; }- printf ("minutes are %s\n",ce->ce_minute);) printf ("hours are %s\n",ce->ce_hour);) printf ("mdays are %s\n",ce->ce_mday);+ printf ("months are %s\n",ce->ce_month);) printf ("wdays are %s\n",ce->ce_wday); + { /* convert command to known case */3 char c,*cptr = ce->ce_command; /* for match */ while (c = *cptr) *cptr++ = toupper (c); }5 printf ("the command is <%s>\n\n",ce->ce_command);9 if ((cptr = strstr (ce->ce_command, "/MAIL")) != NULL) {/ *cptr = '\0'; /* strip off qualifier */ } ce->ce_log = (cptr != NULL); strcpy (ce->ce_user,user); n_entry++; } fclose(list); }}/*# * check whether entry is timed out */+static int timecheck (struct cronentry *ct){  struct tm *tmstruct; tmstruct = localtime(&now); tmstruct->tm_mon++; N if ((*(ct->ce_minute) != '*') && !timematch(tmstruct->tm_min,ct->ce_minute)) return 0;K if ((*(ct->ce_hour) != '*') && !timematch(tmstruct->tm_hour,ct->ce_hour)) return 0;L if ((*(ct->ce_month) != '*') && !timematch(tmstruct->tm_mon,ct->ce_month)) return 0;K if ((*(ct->ce_mday) != '*') && !timematch(tmstruct->tm_mday,ct->ce_mday)) return 0;K if ((*(ct->ce_wday) != '*') && !timematch(tmstruct->tm_wday,ct->ce_wday)) return 0; return 1;}/*% * check whether value matches string */4static int timematch (int value, const char *string){ const char *ptr; ptr = string; while (*ptr) { int val1, val2; const char *ptr1;% val1 = strtol (ptr, &ptr1, 10);5 if (*ptr1 == '-') /* is first nondigit - ? */ {' ptr1++; /* yes, format is nn-mm */# val2 = strtol (ptr1, &ptr1, 10); } else val2 = val1;, if (*ptr1) /* skip over separator */ ptr1++;) if (val1 <= value && value <= val2) return 1; ptr = ptr1; } return 0;}/* * get uid for username */2static unsigned getuid_user (const char* username){> descrip user_desc = { strlen (username), (void *)username }; static unsigned uid; static struct { short length; short code; void *addr; short *retaddr; long termin;5 } item = { sizeof uid, UAI$_UIC, &uid, NULL, 0 }; int r0;D r0 = sys$getuai (NULL, NULL, &user_desc, &item, NULL, NULL, NULL); if ( (r0&1) == 0) exit (r0); return uid;}/* * enqueue * lock */static void enqueue (void){& static char resource[] = "CronLock";> static descrip res_desc = { sizeof resource - 1, resource }; struct { short status,dummy; int lock_id; } lksb; int r0;9 r0 = sys$enqw (0, LCK$K_PWMODE, &lksb, 0, &res_desc, 0, NULL, NULL, NULL, 0, NULL,0); if ((r0&1) == 0) exit (r0);}0[CRON]MYCRON.EXE_ALPHA?t>{I~~ " $H h(>)0I>MYCRONV1.0A13-03$ $ $ $ $J$( 8 DECC$SHR_0014  LIBRTL_0014& LIBOTS_0018f SECURESHRP_001@&k#1SYS$PUBLIC_VECTORS_0010"0@4 !minutes are %s mdays are %s P Can't realloc/MAILwdays are %s ruid is %08x &&PF0"PL  ' months are %s 'Ghours are %s FwP$delete %s;* @ Got lockCan't alloc` 0("X &PF%p90 9$exit 1  w 08"P0 the command is <%s> Ignoring invalid format <%s> %s %s %s %s %s %100c<%s> is world accessible, ignored %s is not owner of <%s>, ignored Can't stat <%s> Can't open file <%s> processing <%s> SUBMIT/NOLOG send_mail the time is now %sexecuted <%s> Status: %08x mailmarker <%s> created $ mail/subject="Cron: Log of %s" %s %s $on warning then $exit $status [.SPOOL]mail.%05dsubmit/noprint/user=updating entries [.SPOOL]newentries.markreading first entries cron$lib:[000000]Waiting for lock..[.SPOOL]MAIL.*@CronLock X[.SPOOL]*.;0#8^0[~ "0#@^4GHcGG#  (#ݶ8bIdZkb#@BG4GbzZkcG8]@]HP#k///`#4G4GTG(^~[0^8~@HP޴X`h>p^x~޵GG#bXb c vZkBG4GTGbvZkB4G4GTGbvZkhBG4Gpb/MZkXBG`bcZk`B4Gb@"/XZkxBGG]"GGGG (bAZkBG4Gb"/XZk`B4Gb("xZkBTGY"4GblZk4G|G`(BG!"XB0b¤"/aZk8b#)!J!w@///BG4GbFZk`B="TGb"`Zk`(B4G0b"/aZk8b#//[@`HB4GPb"IZk ca@!` @@@@ @`A////BG4GbOZk Gb#0 @ ,?FX%F ,"@///G//P///` `,"b#FXF /@///G//</// ,"b#FXF /@///G//(/// ,"b#FXF /@///G///// ,"b#FXF  /@ӡC/////4G`BB(" GTGR"kDZk(B,"("0b GcZk(BTG("""0bcZk(BG("TG0bcZk #4GtG`"8B@b0 @1"P C"cZkB"X""TGbEZk`(BG ="TG0b"/`Zk///M///`8BGTG@b"UZkBGGTGbcZk`"HB@"G DGX}"PbGP1"/]ZkHBGx""X]"tGPb/]Zk8BG"TG@bmUZkhBG4Gpb/wPZk`(B="TG0b0"/`ZkB4G("bgZkB GG4Gb/sBZk`(B(]"G0bGG"`Zk á, k!!`A`@@@@ @ @ )11 BBP(")HT" P="tGb 4GH]"YZkBGH"4Gb_Zk`B4Gb"gZkG4GBb/SEZk,HhB4Gpb LIlALALA  @0@aZk//////B4Gb/xZkB4G"bWZkBG4GbxZk/ # ^~tG>"^~޴P[>^~G {G#GXb]"=="?YZk///p///BGTG"bbZk.BTG="bPJ>("/`ZkBG"TGbbZkBTG "X"bQZkBGX"TGbbZk.pBTG""xbPJ>"/DZk(BG TGb=""_Zk//(///BG4Gb~ZkBG ="TGbQZk(B="bTG"_Zk0BG4G8b/OZk//////B0=TG"b_Zk@BX"4GHbZk`BGX"d" G]"GGGhbO}Zk#0=GC(tGBb!B2Bx"]"1DX=" ///_Zk0BG4G8bNOZk/////((X="]"BbtGRHP"D /_Zk0BG4G8b6OZk/////#TG0B8bDP&@q!@#q!BQ1BQ?B]jZktG"#cBbr1BqQBGQ1BF3B?"0}Zk@BG4GHb}Zk=?Du$@U!@F?@B"4GHb#Zk 1@("Bf!CP&!x! .GGF!81"GGGbPJ>~^">~Zk(BD=" bTG"1_Zk////BGTG"b&_ZkB"GTGb/_ZkBG"TGb !/_ZkBG"TGbG/_ZkBGh"TGb _Zk*-I(I'I/B4Gb GsTZk'-aH'"I'I !E'=.PJJ/BGTGb(^ZkBGTG`""byZk/// -I I =BC"X="TGb/~Zk0@S///0BG4G8b{NZkPBG="]"tGXb/WZk///G]]}ݤ=]}#/k///B4Gb/'wZkB4GP"bJUZkBG4GbwZk/Q.GGQJG@#^~^ ~(0GGG/ BTGtG="(b"~Zk= BG="TG(btG.J! F =C~Zk//////G=.J! = @ `@D/.J/G//G]] }(0@#/k///Gk//4GTXpHp :" `p `p0@` 0@P`p @DECC$SHR@LIBRTL@LIBOTS@ SECURESHRP@SYS$PUBLIC_VECTORS0[CRON]MYCRON.EXE_VAX 5?x>c~~ " 0D`0205Ȼ>)MYCRONV1.0Ȼ>V11-50  ?!! DECC$SHR_001Q! MTHRTL_001$+CMA$TIS_SHR_001 ! LIBRTL_001"! SECURESHR_001#!SECURESHRP_001[.SPOOL]MAIL.* [.SPOOL]*.;0 8PCronLockhWaiting for lock..Got lockcron$lib:[000000]Can't allocreading first entries updating entries [.SPOOL]newentries.marksubmit/noprint/user= [.SPOOL]mail.%05dwCan't open file <%s> $on warning then $exit $status $ mail/subject="Cron: Log of %s" %s %s $delete %s;* $exit 1 mailmarker <%s> created the time is now %sexecuted <%s> Status: %08x SUBMIT/NOLOG send_mail[.SPOOL]newentries.markprocessing <%s> rCan't open file <%s> Can't stat <%s> uid is %08x %s is not owner of <%s>, ignored <%s> is world accessible, ignored Can't realloc%s %s %s %s %s %100cIgnoring invalid format <%s> minutes are %s hours are %s mdays are %s months are %s wdays are %s the command is <%s> /MAIL^ UP^Ut Rbbb2?~ M P . |~|~|~x PSˏSR Sϛϙ2ŏ~PψπyPPeϬRPRRaBeBХTTSŏRBdRSR1KlW V:YXPSP1*;øg&gg1֥ݥ̀̀PT̀f1PTi]~PRRPRøRThThTiTÀfsPReRPfSŏ\L\S\1եW}^ץ@ԥ0"PSˏSRϭPRQRPBBMYCRONV1.030-SEP-2005 11:58Compaq C V6.5-001   $ABS$ix$CODE$T $LITERAL$ $LINK$h$DATA$$BSS$ $READONLY_ADDR$ $READONLY$(JMAIN(J__MAIN =#8^0[~ "0#@^4GHcGG#  (#ݶ8b@Zkb#@BG4Gb@ZkcG8]@]HP#k///`#4G4GTG(^~[0^8~@HP޴X`h>p^x~޵GG#bXb c @ZkBG4GTGb@ZkB4G4GTGb@ZkhBG4Gpb/@ZkXBG`b@Zk`B4Gb@"/@ZkxBGG]"GGGG (b@ZkBG4Gb"/@Zk`B4Gb("@ZkBTGY"4Gb@Zk4G|G`(BG!"XB0b¤"/@Zk8b#)!J!w@///BG4Gb@Zk`B="TGb"@Zk`(B4G0b"/@Zk8b#//[@`HB4GPb"@Zk ca@!` @@@@ @`A////BG4Gb@Zk Gb#0 @ ,?FX%F ,"@///G//P///` `,"b#FXF /@///G//</// ,"b#FXF /@///G//(/// ,"b#FXF /@///G///// ,"b#FXF  /@ӡC/////4G`BB(" GTGR"@Zk(B,"("0b G@Zk(BTG("""0b@Zk(BG("TG0b@Zk #4GtG`"8B@b0 @1"P C"@ZkB"X""TGb@Zk`(BG ="TG0b"/@Zk///M///`8BGTG@b"@ZkBGGTGb@Zk`"HB@"G DGX}"PbGP1"/@ZkHBGx""X]"tGPb/@Zk8BG"TG@b@ZkhBG4Gpb/@Zk`(B="TG0b0"/@ZkB4G("b@ZkB GG4Gb/@Zk`(B(]"G0bGG"@Zk á, k!!`A`@@@@ @ @ )11 BBP(")HT" P="tGb 4GH]"@ZkBGH"4Gb@Zk`B4Gb"@ZkG4GBb/@Zk,HhB4Gpb LIlALALA  @0@@Zk//////B4Gb/@ZkB4G"b@ZkBG4Gb@Zk/ # ^~tG>"^~޴P[>^~G {G#GXb]"=="@Zk///p///BGTG"b@Zk.BTG="bPJ>("/@ZkBG"TGb@ZkBTG "X"b@ZkBGX"TGb@Zk.pBTG""xbPJ>"/@Zk(BG TGb=""@Zk//(///BG4Gb@ZkBG ="TGb@Zk(B="bTG"@Zk0BG4G8b/@Zk//////B0=TG"b@Zk@BX"4GHb@Zk`BGX"d" G]"GGGhb@Zk#0=GC(tGBb!B2Bx"]"1DX=" ///@Zk0BG4G8b@Zk/////((X="]"BbtGRHP"D /@Zk0BG4G8b@Zk/////#TG0B8bDP&@q!@#q!BQ1BQ?B@ZktG"#cBbr1BqQBGQ1BF3B?"@Zk@BG4GHb@Zk=?Du$@U!@F?@B"4GHb@Zk 1@("Bf!CP&!x! .GGF!81"GGGbPJ>~^"@Zk(BD=" bTG"@Zk////BGTG"b@ZkB"GTGb/@ZkBG"TGb !/@ZkBG"TGbG/@ZkBGh"TGb@Zk*-I(I'I/B4Gb G@Zk'-aH'"I'I !E'=.PJJ/BGTGb(@ZkBGTG`""b@Zk/// -I I =BC"X="TGb/@Zk0@S///0BG4G8b@ZkPBG="]"tGXb/@Zk///G]]}ݤ=]}#/k///B4Gb/@ZkB4GP"b@ZkBG4Gb@Zk/Q.GGQJG@#^~^ ~(0GGG/ BTGtG="(b@Zk= BG="TG(btG.J! F =C@Zk//// =//G=.J! = @ `@D/.J/G//G]] }(0@#/k///Gk//4G4MG\ DECC$MAIN4NLb# DECC$MAIN4MX@\ DECC$MAIN4 dGx DECC$EXIT4 pb# DECC$EXIT4 t@x DECC$EXIT45G DECC$SIGNAL46b# DECC$SIGNAL45@ DECC$SIGNAL45G4 DECC$SIGNAL46,b# DECC$SIGNAL450@4 DECC$SIGNAL454GL DECC$SIGNAL46Db# DECC$SIGNAL45H@L DECC$SIGNAL4?LGd DECC$UMASK4@Xb# DECC$UMASK4?`@d DECC$UMASK4=dGt DECC$GETUID4>lb# DECC$GETUID4=p@t DECC$GETUID4xG DECC$PUTS4 b# DECC$PUTS4@ DECC$PUTS4AGSYS$ENQW4Bb#SYS$ENQW4A@SYS$ENQW4G DECC$PUTS4 b# DECC$PUTS4@ DECC$PUTS4CG  DECC$CHDIR4Db# DECC$CHDIR4C@  DECC$CHDIR4/ G( DECC$MALLOC40 b# DECC$MALLOC4/$@( DECC$MALLOC4<Gd DECC$GXPRINTF4Pb# DECC$GXPRINTF4`@d DECC$GXPRINTF43GDECC$__UTC_TIME44b#DECC$__UTC_TIME43@DECC$__UTC_TIME4-GDECC$__UTC_STAT4.b#DECC$__UTC_STAT4-@DECC$__UTC_STAT4G DECC$GXPRINTF4b# DECC$GXPRINTF4@ DECC$GXPRINTF4)G DECC$DELETE4*b# DECC$DELETE4)@ DECC$DELETE<I0GDDECC$__UTCTZ_LOCALTIME<J<b#DECC$__UTCTZ_LOCALTIME<I@@DDECC$__UTCTZ_LOCALTIME4KGOTS$MOVE4K@OTS$MOVE47G  DECC$STRCAT48b# DECC$STRCAT47@  DECC$STRCAT47 G$ DECC$STRCAT48b# DECC$STRCAT47 @$ DECC$STRCAT47$G< DECC$STRCAT484b# DECC$STRCAT478@< DECC$STRCAT4'PGtDECC$GXSPRINTF4(Tb#DECC$GXSPRINTF4'p@tDECC$GXSPRINTF4tG DECC$FOPEN4b# DECC$FOPEN4@ DECC$FOPEN4G DECC$GXPRINTF4b# DECC$GXPRINTF4@ DECC$GXPRINTF 49G DECC$FPUTS4:b# DECC$FPUTS49@ DECC$FPUTS4 G DECC$STRCHR4b# DECC$STRCHR4 @ DECC$STRCHR4;G4DECC$GXFPRINTF4< b#DECC$GXFPRINTF4;0@4DECC$GXFPRINTF4;4GTDECC$GXFPRINTF4<Hb#DECC$GXFPRINTF4;P@TDECC$GXFPRINTF49TGl DECC$FPUTS4:db# DECC$FPUTS49h@l DECC$FPUTS4lG DECC$FCLOSE4xb# DECC$FCLOSE4@ DECC$FCLOSE4G DECC$GXPRINTF4b# DECC$GXPRINTF4@ DECC$GXPRINTF41G DECC$SYSTEM42b# DECC$SYSTEM41@ DECC$SYSTEM<EGDECC$__UTC_CTIME<Fb#DECC$__UTC_CTIME<E@DECC$__UTC_CTIME4G DECC$GXPRINTF4b# DECC$GXPRINTF4@ DECC$GXPRINTF44Gt LIB$FIND_FILE4db# LIB$FIND_FILE4p@t LIB$FIND_FILE<GtGLIB$FIND_FILE_END<Hb#LIB$FIND_FILE_END<G@LIB$FIND_FILE_END41G DECC$SYSTEM42b# DECC$SYSTEM41@ DECC$SYSTEM43GDECC$__UTC_TIME44b#DECC$__UTC_TIME43@DECC$__UTC_TIME4+G DECC$SLEEP4,b# DECC$SLEEP4+@ DECC$SLEEP4 G$ DECC$EXIT4 b# DECC$EXIT4  @$ DECC$EXIT4$G8 DECC$PUTS4 0b# DECC$PUTS44@8 DECC$PUTS4 8GL DECC$EXIT4 Db# DECC$EXIT4 H@L DECC$EXIT4G LIB$FIND_FILE4b#0 LIB$FIND_FILE4@ LIB$FIND_FILE4 G DECC$STRCHR4 b#0 DECC$STRCHR4  @ DECC$STRCHR4 G4 DECC$GXPRINTF4 b#0 DECC$GXPRINTF40 @4 DECC$GXPRINTF4 4 GL DECC$STRCHR4D b#0 DECC$STRCHR4 H @L DECC$STRCHR4 L Gd DECC$STRCPY4 \ b#0 DECC$STRCPY4 ` @d DECC$STRCPY4 d G| DECC$STRCHR4t b#0 DECC$STRCHR4 x @| DECC$STRCHR4 G DECC$FOPEN4 b#0 DECC$FOPEN4 @ DECC$FOPEN4 G DECC$GXPRINTF4 b#0 DECC$GXPRINTF 4 @ DECC$GXPRINTF4 G DECC$FILENO4 b#0 DECC$FILENO4 @ DECC$FILENO< G DECC$__UTC_FSTAT< b#0DECC$__UTC_FSTAT< @ DECC$__UTC_FSTAT4 G, DECC$GXPRINTF4 b#0 DECC$GXPRINTF4( @, DECC$GXPRINTF4, GD DECC$FCLOSE48 b#0 DECC$FCLOSE4@ @D DECC$FCLOSE4` Gx DECC$GXPRINTF4p b#0 DECC$GXPRINTF4t @x DECC$GXPRINTF4x G DECC$STRLEN4 b#0 DECC$STRLEN4 @ DECC$STRLEN4 G SYS$GETUAI4 b#0 SYS$GETUAI4 @ SYS$GETUAI4 G DECC$GXPRINTF4 b#0 DECC$GXPRINTF4 @ DECC$GXPRINTF4 G( DECC$FCLOSE4 b#0 DECC$FCLOSE4$ @( DECC$FCLOSE4P Gt DECC$GXPRINTF4T b#0 DECC$GXPRINTF4p @t DECC$GXPRINTF4t G DECC$FCLOSE4 b#0 DECC$FCLOSE4 @ DECC$FCLOSE4 G DECC$REALLOC4 b#0 DECC$REALLOC4 @ DECC$REALLOC4# G DECC$FGETS4$ b#0 DECC$FGETS4# @ DECC$FGETS4 G, DECC$FEOF4$ b#0 DECC$FEOF4( @, DECC$FEOF4H G\ DECC$STRLEN4T b#0 DECC$STRLEN4X @\ DECC$STRLEN4%d G DECC$GXSSCANF4& b#0 DECC$GXSSCANF4% @ DECC$GXSSCANF4 G DECC$GXPRINTF4 b#0 DECC$GXPRINTF4 @ DECC$GXPRINTF4 G DECC$GXPRINTF4 b#0 DECC$GXPRINTF4 @ DECC$GXPRINTF4 G$ DECC$GXPRINTF4 b#0 DECC$GXPRINTF4 @$ DECC$GXPRINTF4$ GD DECC$GXPRINTF44 b#0 DECC$GXPRINTF4@ @D DECC$GXPRINTF4D Gd DECC$GXPRINTF4T b#0 DECC$GXPRINTF4` @d DECC$GXPRINTF4d G| DECC$GXPRINTF4t b#0 DECC$GXPRINTF4x @| DECC$GXPRINTF4 G DECC$TOUPPER4 b#0 DECC$TOUPPER4 @ DECC$TOUPPER4 G DECC$GXPRINTF4 b#0 DECC$GXPRINTF4 @ DECC$GXPRINTF4! G DECC$STRSTR4" b#0 DECC$STRSTR4!@ DECC$STRSTR4  GD DECC$STRCPY4 8b#0 DECC$STRCPY| |4 @@D DECC$STRCPY4`Gt DECC$FCLOSE4lb#0 DECC$FCLOSE4p@t DECC$FCLOSE4tG LIB$FIND_FILE4b#0 LIB$FIND_FILE4@ LIB$FIND_FILE4 G DECC$EXIT4 b#0 DECC$EXIT4 @ DECC$EXIT4G DECC$PUTS4 b#0 DECC$PUTS4@ DECC$PUTS4 G, DECC$EXIT4 $b#0 DECC$EXIT4 (@, DECC$EXIT4pG DECC$STRTOL4b# DECC$STRTOL4@ DECC$STRTOL4G DECC$STRTOL4b# DECC$STRTOL4@ DECC$STRTOL4 4= the command is <%s> =(Ignoring invalid format <%s> 8= %s %s %s %s %s %100cP=0$<%s> is world accessible, ignored x=0#%s is not owner of <%s>, ignored = Can't stat <%s> = Can't open file <%s> = processing <%s> =pbSUBMIT/NOLOG send_mail the time is now %sexecuted <%s> Status: %08x mailmarker <%s> created P=8)$ mail/subject="Cron: Log of %s" %s %s =0!$on warning then $exit $status = [.SPOOL]mail.%05d= submit/noprint/user== updating entries =([.SPOOL]newentries.mark=8+reading first entries cron$lib:[000000]@=Waiting for lock.. =0"0;=@4  DECC$STRTOL= minutes are %s H=mdays are %s ` DECC$REALLOC DECC$FEOF=Can't realloc=/MAIL=wdays are %s  DECC$FILENO=r=uid is %08x  DECC$EXIT DECC$STRCPY DECC$STRCHRP;  DECC$GXPRINTF=0"P;=L ;; DECC$FCLOSE DECC$STRLEN LIB$FIND_FILE SYS$GETUAI DECC$FOPEN DECC$__UTC_FSTAT DECC$TOUPPER=months are %s  DECC$PUTS! DECC$STRSTR# DECC$FGETS% DECC$GXSSCANF=hours are %s 0'DECC$GXSPRINTF) DECC$DELETE=w`+ DECC$SLEEP=$delete %s;*  -DECC$__UTC_STAT/ DECC$MALLOC= Got lock= Can't alloc1 DECC$SYSTEM 3DECC$__UTC_TIME5 DECC$SIGNAL==0(";= X  7 DECC$STRCAT9 DECC$FPUTS;DECC$GXFPRINTF= DECC$GETUID? DECC$UMASKASYS$ENQWC DECC$CHDIR= $exit 1  EDECC$__UTC_CTIME GLIB$FIND_FILE_END IDECC$__UTCTZ_LOCALTIME8OTS$MOVE= =08";=P0 7DECC$$SHELL_HANDLER=M DECC$MAIN ==64==[.SPOOL]MAIL.*(=46=6@4= CronLockP= 6X4= [.SPOOL]*.;0@ @6=  DECC$FCLOSEDECC$GXFPRINTF DECC$FPUTS DECC$GXPRINTF DECC$PUTSDECC$GXSPRINTF DECC$GXSSCANF DECC$FEOF DECC$FOPEN DECC$FGETS DECC$FILENO DECC$SIGNAL DECC$SLEEP DECC$EXIT DECC$SYSTEM DECC$UMASK DECC$MALLOC DECC$REALLOC DECC$STRTOL DECC$__UTC_FSTATDECC$__UTC_STATDECC$__UTC_TIME DECC$__UTC_CTIME DECC$__UTCTZ_LOCALTIME DECC$STRCAT DECC$STRCHR DECC$STRCPY DECC$STRSTR DECC$STRLEN DECC$GETUID DECC$CHDIR DECC$DELETE LIB$FIND_FILE LIB$FIND_FILE_END DECC$TOUPPER SYS$GETUAISYS$ENQW DECC$MAIN DECC$$SHELL_HANDLEROTS$MOVE 'C$FC0[CRON]MYCRON.OBJ_VAX   X_DK DK OӮbQ 3MYCRONV1.030-SEP-2005 11:58DEC C V6.4-005xP|PhhPCronLockXP\PPP/MAILPthe command is <%s> Pwdays are %s Pmonths are %s Pmdays are %s Phours are %s Pminutes are %s bPIgnoring invalid format <%s> LP%s %s %s %s %s %100c>PCan't reallocP<%s> is world accessible, ignored P%s is not owner of <%s>, ignored Puid is %08x PCan't stat <%s> PCan't open file <%s> PrPprocessing <%s> HP LP88P[.SPOOL]*.;0P[.SPOOL]newentries.markPSUBMIT/NOLOG send_mail0P4P  P[.SPOOL]MAIL.*PPP the time is now %sexecuted <%s> Status: %08x 7Pmailmarker <%s> created .P$exit 1  P$delete %s;* P$ mail/subject="Cron: Log of %s" %s %s P$on warning then $exit $status PCan't open file <%s> PwP[.SPOOL]mail.%05dP Psubmit/noprint/user=xP[.SPOOL]newentries.markdPupdating entries LPreading first entries @PCan't alloc,Pcron$lib:[000000]#PGot lock DECC$EXITSYS$ENQW SYS$GETUAI DECC$TOUPPERLIB$FIND_FILE_END LIB$FIND_FILE DECC$DELETE DECC$CHDIR DECC$GETUID DECC$STRLEN DECC$STRSTR DECC$STRCPY DECC$STRCHR DECC$STRCATDECC$__UTCTZ_LOCALTIMEDECC$__UTC_CTIMEDECC$__UTC_TIMEDECC$__UTC_STATDECC$__UTC_FSTAT DECC$STRTOL DECC$REALLOC DECC$MALLOC DECC$UMASK DECC$SYSTEM DECC$EXIT DECC$SLEEP DECC$SIGNAL DECC$FILENOPWaiting for lock..PPP^ DECC$MAINUP^U DECC$SIGNALRbbb2?~ DECC$UMASK DECC$GETUIDP  DECC$PUTS|~|~|~x SYS$ENQWPSˏSR S DECC$EXITϛ DECC$PUTSϙ DECC$CHDIR2ŏ~ DECC$MALLOCPψ DECC$PUTS DECC$EXITπ DECC$DPRINTFPDECC$__UTC_TIMEPeϬDECC$__UTC_STATRPRRa DECC$DPRINTFe DECC$DELETEХTTSŏRBdRSR1K DECC$STRCATW DECC$DPRINTFV DECC$FPUTSY DECC$DFPRINTFXPSP1* DECC$STRCPYŸøg&gg1֥ݥ̀ DECC$DSPRINTF̀ DECC$FOPENPT̀f1PTi]~ DECC$STRCHRPRRPRøRThThTiT DECC$FCLOSÈf DECC$SYSTEMPReDECC$__UTC_CTIMERPfSŏ\L\S\1եW}^ץ@ԥ0 LIB$FIND_FILEPSLIB$FIND_FILE_ENDˏSRϭ DECC$SYSTEMDECC$__UTC_TIMEPRQRP