JOE@FHCRCVAX.BITNET (Joe Meadows) (08/22/87)
Hello Everyone, Here's the latest C source to FILE. It would be much shorter if it weren't for all the include files I had to make (and debug, bleah) using the definitions from LIB.MLB. I placed the help file at the beginning so you could perouse it before deciding to keep it or throw it away. Hopefully you keep it and find a lot of use for it. Cheers, Joe Meadows Jr. Fred Hutchinson Cancer Research Center bitnet - JOE@FHCRCVAX arpa - JOE%FHCRCVAX.BITNET@WISCVM.WISC.EDU voice - (206) 467-4970 $ create/log FILE.HLP $DECK 1 FILE FILE is a utility for modifying file attributes. FILE DOES NOT convert a file. FILE changes characteristics of the file, and thus VMS' view of the file. FILE can be used simply to view the current characteristics of a file, or it can be used to change any of the changeable characteristics. This utility can be VERY dangerous, and should only be used if you have a good understanding of RMS. Care should be taken when using this utility. While it doesn't actually change the file itself, you might consider using a backup copy of the file. The first thing you should do is to use FILE/OUTPUT=output to generate a listing of the current characteristics of the file. In this way, you will be able to return the file to its original state. 2 Examples One common use of file, is to 'coerce' a file into being a Fixed 512 byte file, to upload/download the file via kermit. For example, given a saveset A.SAV, you could do the following: FILE/OUTPUT=A.FIX/NOEXACT A.SAV/RECORD_SIZE=512/ORGANIZATION=INDEXED You could then transfer the two files A.FIX and A.SAV using Kermit (it would take two transfers, A.FIX with 'set file type text', and A.SAV using 'set file type fixed') To turn the file back into its original useable self, you could then do: @A.FIX Which would cause the originally saved characteristics to be put back on the file. Another common use is to set the Fortran carriage control attribute so that a file can be printed with fortran carriage control, this can be done as follows: FILE/OUTPUT=OLD.TMP NETMONTH.*/ATTRIBUTES=(FORTRANCC,NOIMPLIEDCC,NOPRINTCC) 2 parameters File takes one parameter, a filename, or list of filenames. The filenames can be wildcarded. 2 qualifiers /OUTPUT /OUTPUT[=filename] This qualifier causes the characteristics of the file to be displayed. Note that if you are also changing characteristics the displayed characteristics are the orginal characteristics. You can have the output placed in a file, by specifying a file name in the OUTPUT clause. This is usefull for restoring a file to its original state. /EXACT /[NO]EXACT When used with /OUTPUT, this qualifier determines wether a complete file spec is displayed (/EXACT) or wether only the filename and filetype will be displayed (/NOEXACT). /EXACT is the default. /ATTRIBUTES This qualifier determines the record attributes. You may enter a list of (negatable) attributes. The following attributes are legal: FORTRANCC IMPLIEDCC PRINTCC SPAN /CHARACTERISTICS This qualifier determines the file characteristics. You may enter a list of (negatable) items. The following items are legal: ACL_CORRUPT BACKUP BEST_TRY_CONTIGUOUS CHARGE CONTIGUOUS DIRECTORY ERASE_ON_DELETE FILE_CORRUPT LOCKED MARKED_FOR_DELETE READ_VERIFY SPOOL WRITE_BACK WRITE_VERIFY Note that not all of these items are really changeable. They are merely included for completeness sake. /ORGANIZATION This qualifier determines the file organization. you must enter one of: DIRECT INDEXED RELATIVE SEQUENTIAL /TYPE This qualifier determines the record type. you must enter one of: FIXED VARIABLE VFC STREAM LFSTREAM CRSTREAM UNDEFINED /BUCKET_SIZE This qualifier determines the bucket size. /DEFAULT_EXTEND_QUANTITY This qualifier determines the default extend quantity. /END_OF_FILE_BLOCK This qualifier determines the end of file block. /FIRST_FREE_BYTE This qualifier determines the first free byte in the end of file block. /HIGHEST_ALLOCATED_BLOCK This qualifier determines the highest allocated block. /GLOBAL_BUFFER_COUNT This qualifier determines the global buffer count. /JOURNAL This qulifier determines the type of journaling enabled on the file. you must enter on of: JOURNAL AIJNL ATJNL BIJNL RUJNL NEVER_RU ONLY_RU /MAXIMUM_RECORD_SIZE This qualifier determines the maximum record size. /RECORD_SIZE This qualifier determines the record size. /DIRECTORY_VERSION_LIMIT This qualifier allows you to set the default number of allowable versions of file. This is applicable only to directories. Note that 32767 is equivalent to 0, or No Limit, so to say. This is equivalent to SET DIRECTORY/VERSION=n. /VERSION_LIMIT This qualifier allows you to set the number of allowable versions of a file. Note that 32767 is equivalent to 0, or No Limit, so to say. This is equivalent to SET FILE/VERSION=n. /VFC_SIZE This qualifier allows you to set the vcf size. /CREATION_DATE /[NO]CREATION_DATE This qualifier allows you to set the creation date. /REVISION_DATE /[NO]REVISION_DATE This qualifier allows you to set the revision date. /EXPIRATION_DATE /[NO]EXPIRATION_DATE This qualifier allows you to set the expiration date. /BACKUP_DATE /[NO]BACKUP_DATE This qualifier allows you to set the backup date. /NUMBER_OF_REVISIONS This qualifier allows you to set the number of revisions. $EOD $ create/log ATRDEF.H $DECK #define ATR$C_UCHAR 3 #define ATR$S_UCHAR 4 #define ATR$C_RECATTR 4 #define ATR$S_RECATTR 32 #define ATR$C_FILNAM 5 #define ATR$S_FILNAM 6 #define ATR$C_FILTYP 6 #define ATR$S_FILTYP 2 #define ATR$C_FILVER 7 #define ATR$S_FILVER 2 #define ATR$C_EXPDAT 8 #define ATR$S_EXPDAT 7 #define ATR$C_STATBLK 9 #define ATR$S_STATBLK 32 #define ATR$C_HEADER 10 #define ATR$S_HEADER 512 #define ATR$C_BLOCKSIZE 11 #define ATR$S_BLOCKSIZE 2 #define ATR$C_USERLABEL 12 #define ATR$S_USERLABEL 80 #define ATR$C_ASCDATES 13 #define ATR$S_ASCDATES 35 #define ATR$C_ALCONTROL 14 #define ATR$S_ALCONTROL 14 #define ATR$C_ENDLBLAST 15 #define ATR$S_ENDLBLAST 4 #define ATR$C_ASCNAME 16 #define ATR$S_ASCNAME 86 #define ATR$C_CREDATE 17 #define ATR$S_CREDATE 8 #define ATR$C_REVDATE 18 #define ATR$S_REVDATE 8 #define ATR$C_EXPDATE 19 #define ATR$S_EXPDATE 8 #define ATR$C_BAKDATE 20 #define ATR$S_BAKDATE 8 #define ATR$C_UIC 21 #define ATR$S_UIC 4 #define ATR$C_FPRO 22 #define ATR$S_FPRO 2 #define ATR$C_RPRO 23 #define ATR$S_RPRO 2 #define ATR$C_ACLEVEL 24 #define ATR$S_ACLEVEL 1 #define ATR$C_SEMASK 25 #define ATR$S_SEMASK 8 #define ATR$C_UIC_RO 26 #define ATR$S_UIC_RO 4 #define ATR$C_DIRSEQ 27 #define ATR$S_DIRSEQ 2 #define ATR$C_BACKLINK 28 #define ATR$S_BACKLINK 6 #define ATR$C_JOURNAL 29 #define ATR$S_JOURNAL 1 #define ATR$C_HDR1_ACC 30 #define ATR$S_HDR1_ACC 1 #define ATR$C_ADDACLENT 31 #define ATR$S_ADDACLENT 255 #define ATR$C_DELACLENT 32 #define ATR$S_DELACLENT 255 #define ATR$C_MODACLENT 33 #define ATR$S_MODACLENT 255 #define ATR$C_FNDACLENT 34 #define ATR$S_FNDACLENT 255 #define ATR$C_FNDACLTYP 35 #define ATR$S_FNDACLTYP 255 #define ATR$C_FNDACETYP 35 #define ATR$S_FNDACETYP 255 #define ATR$C_DELETEACL 36 #define ATR$S_DELETEACL 255 #define ATR$C_READACL 37 #define ATR$S_READACL 512 #define ATR$C_ACLLENGTH 38 #define ATR$S_ACLLENGTH 4 #define ATR$C_READACE 39 #define ATR$S_READACE 255 #define ATR$C_RESERVED 40 #define ATR$S_RESERVED 380 #define ATR$C_HIGHWATER 41 #define ATR$S_HIGHWATER 4 #define ATR$C_DUMMY_0 42 #define ATR$S_DUMMY_0 4 #define ATR$C_PRIVS_USED 43 #define ATR$S_PRIVS_USED 4 #define ATR$C_MATCHING_ACE 44 #define ATR$S_MATCHING_ACE 255 #define ATR$C_ACCESS_MODE 45 #define ATR$S_ACCESS_MODE 1 #define ATR$C_FILE_SPEC 46 #define ATR$S_FILE_SPEC 512 #define ATR$C_CLASS_MASK 47 #define ATR$S_CLASS_MASK 20 #define ATR$C_BUFFER_OFFSET 48 #define ATR$S_BUFFER_OFFSET 2 #define ATR$C_RU_ACTIVE 49 #define ATR$S_RU_ACTIVE 1 #define ATR$C_MAX_CODE 49 #define ATR$C_MAX_PLUS1 50 #define ATR$S_ATRDEF 8 struct ATRDEF { unsigned short int atr$w_size; unsigned short int atr$w_type; unsigned long int atr$l_addr; }; $EOD $ create/log C.OPT $DECK sys$share:vaxcrtl.exe/share $EOD $ create/log CLD.H $DECK char *t_rtype = "TYPE"; char *ta_rtype[] = { "UNDEFINED", "FIXED", "VARIABLE", "VFC", "STREAM", "LFSTREAM", "CRSTREAM" }; char *t_fileorg = "ORGANIZATION"; char *ta_fileorg[] = { "SEQUENTIAL", "RELATIVE", "INDEXED", "DIRECT" }; char *t_attr = "ATTRIBUTES"; char *t_fortrancc = "FORTRANCC"; char *t_impliedcc = "IMPLIEDCC"; char *t_printcc = "PRINTCC"; char *t_nospan = "SPAN"; char *t_char = "CHARACTERISTICS"; char *t_badacl = "ACL_CORRUPT"; char *t_nobackup = "BACKUP"; char *t_contigb = "BEST_TRY_CONTIGUOUS"; char *t_nocharge = "CHARGE"; char *t_contig = "CONTIGUOUS"; char *t_directory = "DIRECTORY"; char *t_erase = "ERASE_ON_DELETE"; char *t_badblock = "FILE_CORRUPT"; char *t_locked = "LOCKED"; char *t_markdel = "MARKED_FOR_DELETE"; char *t_spool = "SPOOL"; char *t_readcheck = "READ_VERIFY"; char *t_writeback = "WRITE_BACK"; char *t_writcheck = "WRITE_VERIFY"; char *t_vfcsize = "VFC_SIZE"; char *t_rsize = "RECORD_SIZE"; char *t_maxrec = "MAXIMUM_RECORD_SIZE"; char *t_efblk = "END_OF_FILE_BLOCK"; char *t_ffbyte = "FIRST_FREE_BYTE"; char *t_hiblk = "HIGHEST_ALLOCATED_BLOCK"; char *t_defext = "DEFAULT_EXTEND_QUANTITY"; char *t_bktsize = "BUCKET_SIZE"; char *t_gbc = "GLOBAL_BUFFER_COUNT"; char *t_dirvers = "DIRECTORY_VERSION_LIMIT"; char *t_versions = "VERSION_LIMIT"; char *t_journal = "JOURNAL"; char *t_journal_file = "JOURNAL"; char *t_aijnl = "AIJNL"; char *t_atjnl = "ATJNL"; char *t_bijnl = "BIJNL"; char *t_rujnl = "RUJNL"; char *t_never_ru = "NEVER_RU"; char *t_only_ru = "ONLY_RU"; char *t_credate = "CREATION_DATE"; char *t_revdate = "REVISION_DATE"; char *t_expdate = "EXPIRATION_DATE"; char *t_bakdate = "BACKUP_DATE"; char *t_revisions = "NUMBER_OF_REVISIONS"; $EOD $ create/log FATDEF.H $DECK #define FAT$K_LENGTH 32 #define FAT$C_LENGTH 32 #define FAT$S_FATDEF 32 struct FATDEF { variant_union { unsigned char fat$b_rtype; variant_struct { unsigned fat$v_rtype : 4; unsigned fat$v_fileorg : 4; } fat$r_rtype_bits; } fat$r_rtype_overlay; # define FAT$S_RTYPE 4 # define FAT$V_RTYPE 0 # define FAT$C_UNDEFINED 0 # define FAT$C_FIXED 1 # define FAT$C_VARIABLE 2 # define FAT$C_VFC 3 # define FAT$C_STREAM 4 # define FAT$C_STREAMLF 5 # define FAT$C_STREAMCR 6 # define FAT$S_FILEORG 4 # define FAT$V_FILEORG 4 # define FAT$C_SEQUENTIAL 0 # define FAT$C_RELATIVE 1 # define FAT$C_INDEXED 2 # define FAT$C_DIRECT 3 variant_union { unsigned char fat$b_rattrib; variant_struct { unsigned fat$v_fortrancc : 1; unsigned fat$v_impliedcc : 1; unsigned fat$v_printcc : 1; unsigned fat$v_nospan : 1; } fat$r_rattrib_bits; } fat$r_rattrib_overlay; # define FAT$V_FORTRANCC 0 # define FAT$M_FORTRANCC 1 # define FAT$V_IMPLIEDCC 1 # define FAT$M_IMPLIEDCC 2 # define FAT$V_PRINTCC 2 # define FAT$M_PRINTCC 4 # define FAT$V_NOSPAN 3 # define FAT$M_NOSPAN 8 unsigned short int fat$w_rsize; variant_union { unsigned long int fat$l_hiblk; variant_struct { unsigned short int fat$w_hiblkh; unsigned short int fat$w_hiblkl; } FATDEF$DUMMY_0; } FATDEF$DUMMY_1; variant_union { unsigned long int fat$l_efblk; variant_struct { unsigned short int fat$w_efblkh; unsigned short int fat$w_efblkl; } FATDEF$DUMMY_2; } FATDEF$DUMMY_3; unsigned short int fat$w_ffbyte; unsigned char fat$b_bktsize; unsigned char fat$b_vfcsize; unsigned short int fat$w_maxrec; unsigned short int fat$w_defext; unsigned short int fat$w_gbc; char fat$fill[8]; unsigned short int fat$w_versions; }; $EOD $ create/log FCHDEF.H $DECK #define FCH$V_BADACL 0x00B #define FCH$M_BADACL (1 << FCH$V_ACL) #define FCH$V_BADBLOCK 0x00E #define FCH$M_BADBLOCK (1 << FCH$V_BADBLOCK) #define FCH$V_CONTIG 0x007 #define FCH$M_CONTIG (1 << FCH$V_CONTIG) #define FCH$V_CONTIGB 0x005 #define FCH$M_CONTIGB (1 << FCH$V_CONTIGB) #define FCH$V_DIRECTORY 0x00D #define FCH$M_DIRECTORY (1 << FCH$V_DIRECTORY) #define FCH$V_ERASE 0x011 #define FCH$M_ERASE (1 << FCH$V_ERASE) #define FCH$V_LOCKED 0x006 #define FCH$M_LOCKED (1 << FCH$V_LOCKED) #define FCH$V_MARKDEL 0x00F #define FCH$M_MARKDEL (1 << FCH$V_MARKDEL) #define FCH$V_NOBACKUP 0x001 #define FCH$M_NOBACKUP (1 << FCH$V_NOBACKUP) #define FCH$V_NOCHARGE 0x010 #define FCH$M_NOCHARGE (1 << FCH$V_NOCHARGE) #define FCH$V_READCHECK 0x003 #define FCH$M_READCHECK (1 << FCH$V_READCHECK) #define FCH$V_SPOOL 0x00C #define FCH$M_SPOOL (1 << FCH$V_SPOOL) #define FCH$V_WRITCHECK 0x004 #define FCH$M_WRITCHECK (1 << FCH$V_WRITCHECK) #define FCH$V_WRITEBACK 0x002 #define FCH$M_WRITEBACK (1 << FCH$V_WRITEBACK) struct fchdef { unsigned : 1; unsigned fch$v_nobackup : 1 ; unsigned fch$v_writeback : 1; unsigned fch$v_readcheck : 1; unsigned fch$v_writcheck : 1; unsigned fch$v_contigb : 1; unsigned fch$v_locked : 1; unsigned fch$v_contig : 1; unsigned : 3; unsigned fch$v_badacl : 1; unsigned fch$v_spool : 1; unsigned fch$v_directory : 1; unsigned fch$v_badblock : 1; unsigned fch$v_markdel : 1; unsigned fch$v_nocharge : 1; unsigned fch$v_erase : 1; }; $EOD $ create/log FIBDEF.H $DECK #define FIB$M_NOWRITE 1 #define FIB$M_DLOCK 2 #define FIB$M_BLK_LOCK 4 #define FIB$M_SPOOL 16 #define FIB$M_WRITECK 32 #define FIB$M_SEQONLY 64 #define FIB$M_WRITE 256 #define FIB$M_READCK 512 #define FIB$M_NOREAD 1024 #define FIB$M_NOTRUNC 2048 #define FIB$M_CONTROL 4096 #define FIB$M_EXECUTE 65536 #define FIB$M_PRSRV_ATR 131072 #define FIB$M_RMSLOCK 262144 #define FIB$M_WRITETHRU 524288 #define FIB$M_NOLOCK 1048576 #define FIB$M_NORECORD 2097152 #define FIB$M_REWIND 8 #define FIB$M_CURPOS 16 #define FIB$M_UPDATE 64 #define FIB$K_ACCDATA 10 #define FIB$C_ACCDATA 10 #define FIB$K_DIRDATA 22 #define FIB$C_DIRDATA 22 #define FIB$M_ALLVER 8 #define FIB$M_ALLTYP 16 #define FIB$M_ALLNAM 32 #define FIB$M_WILD 256 #define FIB$M_NEWVER 512 #define FIB$M_SUPERSEDE 1024 #define FIB$M_FINDFID 2048 #define FIB$M_LOWVER 16384 #define FIB$M_HIGHVER 32768 #define FIB$M_ALCON 1 #define FIB$M_ALCONB 2 #define FIB$M_FILCON 4 #define FIB$M_ALDEF 8 #define FIB$M_ALLOCATR 16 #define FIB$M_EXTEND 128 #define FIB$M_TRUNC 256 #define FIB$M_NOHDREXT 512 #define FIB$M_MARKBAD 1024 #define FIB$M_NOCHARGE 32768 #define FIB$K_EXTDATA 32 #define FIB$C_EXTDATA 32 #define FIB$M_EXACT 1 #define FIB$M_ONCYL 2 #define FIB$C_CYL 1 #define FIB$C_LBN 2 #define FIB$C_VBN 3 #define FIB$C_RFI 4 #define FIB$K_ALCDATA 44 #define FIB$C_ALCDATA 44 #define FIB$M_ALT_REQ 1 #define FIB$M_ALT_GRANTED 2 #define FIB$M_DIRACL 4 #define FIB$M_PROPAGATE 8 #define FIB$K_LENGTH 64 #define FIB$C_LENGTH 64 struct fibdef { variant_union { unsigned long int fib$l_acctl; variant_struct { unsigned fib$v_nowrite : 1; unsigned fib$v_dlock : 1; unsigned fib$v_blk_lock : 1; unsigned fibdef$$_fill_1 : 1; unsigned fib$v_spool : 1; unsigned fib$v_writeck : 1; unsigned fib$v_seqonly : 1; unsigned fibdef$$_fill_2 : 1; unsigned fib$v_write : 1; unsigned fib$v_readck : 1; unsigned fib$v_noread : 1; unsigned fib$v_notrunc : 1; unsigned fib$v_control : 1; unsigned fibdef$$_fill_3 : 3; unsigned fib$v_execute : 1; unsigned fib$v_prsrv_atr : 1; unsigned fib$v_rmslock : 1; unsigned fib$v_writethru : 1; unsigned fib$v_nolock : 1; unsigned fib$v_norecord : 1; unsigned fibdef$$_fill_4 : 2; } fib$r_acctl_bits0; variant_struct { unsigned fibdef$$_fill_5 : 3; unsigned fib$v_rewind : 1; unsigned fib$v_curpos : 1; unsigned fibdef$$_fill_6 : 1; unsigned fib$v_update : 1; unsigned fib$v_fill_1 : 1; } fib$r_acctl_bits1; variant_struct { char fibdef$$_fill_13 [3]; char fib$b_wsize; } fib$r_acctl_fields2; } fib$r_acctl_overlay; variant_union { unsigned short int fib$w_fid [3]; variant_struct { unsigned short int fib$w_fid_num; unsigned short int fib$w_fid_seq; variant_union { unsigned short int fib$w_fid_rvn; variant_struct { unsigned char fib$b_fid_rvn; unsigned char fib$b_fid_nmx; } fib$r_fid_rvn_fields; } fib$r_fid_rvn_overlay; } fib$r_fid_fields; } fib$r_fid_overlay; variant_union { unsigned short int fib$w_did [3]; variant_struct { unsigned short int fib$w_did_num; unsigned short int fib$w_did_seq; variant_union { unsigned short int fib$w_did_rvn; variant_struct { unsigned char fib$b_did_rvn; unsigned char fib$b_did_nmx; } fib$r_did_rvn_fields; } fib$r_did_rvn_overlay; } fib$r_did_fields; } fib$r_did_overlay; unsigned long int fib$l_wcc; variant_union { unsigned short int fib$w_nmctl; variant_struct { unsigned fibdef$$_fill_7 : 3; unsigned fib$v_allver : 1; unsigned fib$v_alltyp : 1; unsigned fib$v_allnam : 1; unsigned fibdef$$_fill_8 : 2; unsigned fib$v_wild : 1; unsigned fib$v_newver : 1; unsigned fib$v_supersede : 1; unsigned fib$v_findfid : 1; unsigned fibdef$$_fill_9 : 2; unsigned fib$v_lowver : 1; unsigned fib$v_highver : 1; } fib$r_nmctl_bits; } fib$r_nmctl_overlay; variant_union { unsigned short int fib$w_exctl; variant_struct { unsigned fib$v_alcon : 1; unsigned fib$v_alconb : 1; unsigned fib$v_filcon : 1; unsigned fib$v_aldef : 1; unsigned fib$v_allocatr : 1; unsigned fibdef$$_fill_10 : 2; unsigned fib$v_extend : 1; unsigned fib$v_trunc : 1; unsigned fib$v_nohdrext : 1; unsigned fib$v_markbad : 1; unsigned fibdef$$_fill_11 : 4; unsigned fib$v_nocharge : 1; } fib$r_exctl_bits; } fib$r_exctl_overlay; unsigned long int fib$l_exsz; unsigned long int fib$l_exvbn; variant_union { unsigned char fib$b_alopts; variant_struct { unsigned fib$v_exact : 1; unsigned fib$v_oncyl : 1; unsigned fib$v_fill_2 : 6; } fib$r_alopts_bits; } fib$r_alopts_overlay; unsigned char fib$b_alalign; variant_union { unsigned short int fib$w_alloc [5]; variant_struct { variant_union { unsigned short int fib$w_loc_fid [3]; variant_struct { unsigned short int fib$w_loc_num; unsigned short int fib$w_loc_seq; variant_union { unsigned short int fib$w_loc_rvn; variant_struct { unsigned char fib$b_loc_rvn; unsigned char fib$b_loc_nmx; } fib$r_loc_rvn_fields; } fib$r_loc_rvn_overlay; } fib$r_loc_fid_fields; } fib$r_loc_fid_overlay; unsigned long int fib$l_loc_addr; } fib$r_alloc_fields; } fib$r_alloc_overlay; unsigned short int fib$w_verlimit; unsigned char fib$b_agent_mode; char fibdef$$_fill_12; unsigned long int fib$l_aclctx; unsigned long int fib$l_acl_status; variant_union { unsigned long int fib$l_status; variant_struct { unsigned fib$v_alt_req : 1; unsigned fib$v_alt_granted : 1; unsigned fib$v_diracl : 1; unsigned fib$v_propagate : 1; unsigned fib$v_fill_3 : 4; } fib$r_status_bits; } fib$r_status_overlay; unsigned long int fib$l_alt_access; } ; #define FIB$C_REWINDVOL 1 #define FIB$C_POSEND 2 #define FIB$C_NEXTVOL 3 #define FIB$C_SPACE 4 #define FIB$C_ILLEGAL 5 #define FIB$C_REWINDFIL 6 #define FIB$C_LOCK_VOL 7 #define FIB$C_UNLK_VOL 8 #define FIB$C_ENA_QUOTA 9 #define FIB$C_DSA_QUOTA 10 #define FIB$C_ADD_QUOTA 11 #define FIB$C_EXA_QUOTA 12 #define FIB$C_MOD_QUOTA 13 #define FIB$C_REM_QUOTA 14 #define FIB$C_USEREOT 15 #define FIB$C_REMAP 16 #define FIB$C_CLSEREXCP 17 #define FIB$C_FLUSH_CACHE 18 #define FIB$K_MTALEN 28 #define FIB$C_MTALEN 28 #define FIB$C_FID_CACHE 1 #define FIB$C_EXTENT_CACHE 2 #define FIB$C_QUOTA_CACHE 3 #define FIB$M_ALL_MEM 1 #define FIB$M_ALL_GRP 2 #define FIB$M_MOD_USE 4 #define FIB$M_MOD_PERM 8 #define FIB$M_MOD_OVER 16 struct fibdef1 { char fibdef$$_fill_14 [22]; unsigned short int fib$w_cntrlfunc; variant_union { unsigned long int fib$l_cntrlval; variant_struct { unsigned fib$v_all_mem : 1; unsigned fib$v_all_grp : 1; unsigned fib$v_mod_use : 1; unsigned fib$v_mod_perm : 1; unsigned fib$v_mod_over : 1; unsigned fib$v_fill_4 : 3; } fib$r_cntrlval_bits; } fib$r_cntrlval_overlay; } ; $EOD $ create/log FILE.C $DECK /* FILE.C, a utility to modify file characteristics. Originally written in a mix of BASIC and MACRO, it was submitted to the 86 Fall DECUS Tape. Recently I rewrote it in C, and added the functionality of my MODIFY utility, allowing it to modify creation, expiration, revision, and backup dates, as well as the 'number of revisions'. This should demonstrate the ease with which such things are modified, thus serving to warn people that such things can not always be counted on. Sadly, these should be able to be counted on, and one would hope that in a future version of VMS these become protected, at the very least from user mode modification. Written by Joe Meadows Jr, at the Fred Hutchinson Cancer Research Center BITNET: JOE@FHCRCVAX PHONE: (206) 467-4970 There are no restrictions on this code, you may sell it, include it with any commercial package, or feed it to a whale... However, I would appreciate it if you kept this comment in the source code so that anyone receiving this code knows who to contact in case of problems. Note that I do not demand this condition.. */ #include descrip #include climsgdef #include rms #include stdio #include "atrdef.h" #include "fatdef.h" #include "fchdef.h" #include "fibdef.h" #include "fjndef.h" #include "iodef.h" #include "cld.h" char *cvt_time(); unsigned int change(); unsigned int antichange(); main() { static struct FAB Fab; static struct NAM Nam; static struct fibdef Fib; /* short fib */ static struct dsc$descriptor FibDesc = {sizeof(Fib),DSC$K_DTYPE_Z,DSC$K_CLASS_S,&Fib}; static struct dsc$descriptor_s DevDesc = {0,DSC$K_DTYPE_T,DSC$K_CLASS_S,&Nam.nam$t_dvi[1]}; static struct FATDEF Fat; static union { struct fchdef fch; long int dummy; } uchar; static struct fjndef jnl; static long int Cdate[2],Rdate[2],Edate[2],Bdate[2]; static short int revisions; static struct ATRDEF Atr[] = { sizeof(Fat),ATR$C_RECATTR,&Fat, /* record attributes */ sizeof(uchar),ATR$C_UCHAR,&uchar, /* File characteristics */ sizeof(Cdate),ATR$C_CREDATE,&Cdate[0], /* Creation date */ sizeof(Rdate),ATR$C_REVDATE,&Rdate[0], /* Revision date */ sizeof(Edate),ATR$C_EXPDATE,&Edate[0], /* Expiration date */ sizeof(Bdate),ATR$C_BAKDATE,&Bdate[0], /* Backup date */ sizeof(revisions),ATR$C_ASCDATES,&revisions, /* number of revisions */ sizeof(jnl),ATR$C_JOURNAL,&jnl, /* journal flags */ 0,0,0 } ; static char EName[NAM$C_MAXRSS]; static char RName[NAM$C_MAXRSS]; static struct dsc$descriptor_s FileName = {0,DSC$K_DTYPE_T,DSC$K_CLASS_S,0}; static short int DevChan; static short int iosb[4]; static long int i,status; static char *retval; status = cli_get_value("P1",&retval); /* initialize RMS structures, we need a NAM to retrieve the FID */ Fab = cc$rms_fab; Fab.fab$l_fna = retval ; /* name of file */ Fab.fab$b_fns = strlen(retval); Fab.fab$l_nam = &Nam; /* FAB has an associated NAM */ Nam = cc$rms_nam; Nam.nam$l_esa = &EName; /* expanded filename */ Nam.nam$b_ess = sizeof(EName); Nam.nam$l_rsa = &RName; /* resultant filename */ Nam.nam$b_rss = sizeof(RName); /* do $PARSE and $SEARCH here */ status = sys$parse(&Fab); if (!(status & 1)) return(status); /* search for the first file.. If none signal error */ status = sys$search(&Fab); if (!(status & 1)) return(status); while (status & 1) { /* initialize Device name length, note that this points into the NAM to get the device name filled in by the $PARSE, $SEARCH services */ DevDesc.dsc$w_length = Nam.nam$t_dvi[0]; status = sys$assign(&DevDesc,&DevChan,0,0); if (!(status & 1)) return(status); FileName.dsc$a_pointer = Nam.nam$l_name; FileName.dsc$w_length = Nam.nam$b_name+Nam.nam$b_type+Nam.nam$b_ver; /* Initialize the FIB */ for (i=0;i<3;i++) Fib.fib$w_fid[i]=Nam.nam$w_fid[i]; for (i=0;i<3;i++) Fib.fib$w_did[i]=Nam.nam$w_did[i]; /* Use the IO$_ACCESS function to return info about the file */ /* Note, used this way, the file is not opened, and the expiration */ /* and revision dates are not modified */ status = sys$qiow(0,DevChan,IO$_ACCESS,&iosb,0,0, &FibDesc,&FileName,0,0,&Atr,0); if (!(status & 1)) return(status); status = iosb[0]; if (!(status & 1)) return(status); if (cli_present("OUTPUT") & 1) { /* we should see if they want output to go to a file or to SYS$OUTPUT */ status = cli_get_value("OUTPUT",&retval); if (status & 1) freopen(retval,"w",stdout,"rfm=var","rat=cr"); /* if it's /noexact, use only name & type part of the result name */ /* also fudge the resultant file name to have null termination */ if (cli_present("EXACT") & 1) { i = 0; RName[Nam.nam$b_rsl] = '\0'; } else { i = Nam.nam$b_node + Nam.nam$b_dev + Nam.nam$b_dir; RName[i+Nam.nam$b_name+Nam.nam$b_type] = '\0'; } printf("$ FILE %s\n",&RName[i] ); printf(" /%s=%s",t_rtype,ta_rtype[Fat.fat$v_rtype]); printf(" /%s=%s -\n",t_fileorg,ta_fileorg[Fat.fat$v_fileorg]); printf(" /%s=(%s%s,%s%s,%s%s,%s%s) -\n", t_attr, Fat.fat$v_fortrancc?"":"NO",t_fortrancc, Fat.fat$v_impliedcc?"":"NO",t_impliedcc, Fat.fat$v_printcc?"":"NO",t_printcc, Fat.fat$v_nospan?"NO":"",t_nospan); printf(" /%s=(%s%s,%s%s,%s%s,%s%s, -\n", t_char, uchar.fch.fch$v_badacl?"":"NO",t_badacl, uchar.fch.fch$v_nobackup?"NO":"",t_nobackup, uchar.fch.fch$v_contigb?"":"NO",t_contigb, uchar.fch.fch$v_nocharge?"NO":"",t_nocharge); printf(" %s%s,%s%s,%s%s,%s%s,%s%s, -\n", uchar.fch.fch$v_contig?"":"NO",t_contig, uchar.fch.fch$v_directory?"":"NO",t_directory, uchar.fch.fch$v_erase?"":"NO",t_erase, uchar.fch.fch$v_badblock?"":"NO",t_badblock, uchar.fch.fch$v_locked?"":"NO",t_locked); printf(" %s%s,%s%s,%s%s,%s%s,%s%s) -\n", uchar.fch.fch$v_markdel?"":"NO",t_markdel, uchar.fch.fch$v_spool?"":"NO",t_spool, uchar.fch.fch$v_readcheck?"":"NO",t_readcheck, uchar.fch.fch$v_writeback?"":"NO",t_writeback, uchar.fch.fch$v_writcheck?"":"NO",t_writcheck); printf(" /%s=%d",t_vfcsize,Fat.fat$b_vfcsize ); printf(" /%s=%d",t_rsize,Fat.fat$w_rsize ); printf(" /%s=%d -\n",t_maxrec,Fat.fat$w_maxrec ); printf(" /%s=%d",t_efblk,(Fat.fat$w_efblkh<<16)|Fat.fat$w_efblkl ); printf(" /%s=%d -\n",t_ffbyte,Fat.fat$w_ffbyte ); printf(" /%s=%d -\n",t_hiblk,(Fat.fat$w_hiblkh<<16)|Fat.fat$w_hiblkl ); printf(" /%s=%d -\n",t_defext,Fat.fat$w_defext ); printf(" /%s=%d -\n",t_bktsize,Fat.fat$b_bktsize ); printf(" /%s=%d -\n",t_gbc,Fat.fat$w_gbc ); printf(" /%s=%d -\n",t_dirvers,Fat.fat$w_versions ); printf(" /%s=%d -\n",t_versions,Fib.fib$w_verlimit ); printf(" /%s=(%s%s,%s%s,%s%s,%s%s,%s%s,%s%s,%s%s) -\n", t_journal, jnl.fjn$v_journal_file?"":"NO",t_journal_file, jnl.fjn$v_aijnl?"":"NO",t_aijnl, jnl.fjn$v_atjnl?"":"NO",t_atjnl, jnl.fjn$v_bijnl?"":"NO",t_bijnl, jnl.fjn$v_rujnl?"":"NO",t_rujnl, jnl.fjn$v_never_ru?"":"NO",t_never_ru, jnl.fjn$v_only_ru?"":"NO",t_only_ru); if ((Cdate[0]==0) && (Cdate[1]==0)) printf(" /NO%s -\n",t_credate); else printf(" /%s=\"%s\" -\n",t_credate,cvt_time(Cdate)); if ((Rdate[0]==0) && (Rdate[1]==0)) printf(" /NO%s",t_revdate); else printf(" /%s=\"%s\"",t_revdate,cvt_time(Rdate)); printf(" /%s=%d -\n",t_revisions,revisions); if ((Edate[0]==0) && (Edate[1]==0)) printf(" /NO%s -\n",t_expdate); else printf(" /%s=\"%s\" -\n",t_expdate,cvt_time(Edate)); if ((Bdate[0]==0) && (Bdate[1]==0)) printf(" /NO%s\n",t_bakdate); else printf(" /%s=\"%s\"\n",t_bakdate,cvt_time(Bdate)); }; /* if (cli_present("OUTPUT") & 1) */ if (cli_present(t_rtype) & 1) { status = cli_get_value(t_rtype,&retval); for (i=0;i<7;i++) if (strcmp(retval,ta_rtype[i])==0) Fat.fat$v_rtype = i; }; if (cli_present(t_fileorg) & 1) { status = cli_get_value(t_fileorg,&retval); for (i=0;i<4;i++) if (strcmp(retval,ta_fileorg[i])==0) Fat.fat$v_fileorg = i; }; Fat.fat$v_fortrancc = change(Fat.fat$v_fortrancc,t_attr,t_fortrancc); Fat.fat$v_impliedcc = change(Fat.fat$v_impliedcc,t_attr,t_impliedcc); Fat.fat$v_printcc = change(Fat.fat$v_printcc,t_attr,t_printcc); Fat.fat$v_nospan = antichange(Fat.fat$v_nospan,t_attr,t_nospan); uchar.fch.fch$v_badacl = change(uchar.fch.fch$v_badacl,t_char,t_badacl); uchar.fch.fch$v_nobackup = antichange(uchar.fch.fch$v_nobackup,t_char,t_noba ckup); uchar.fch.fch$v_contigb = change(uchar.fch.fch$v_contigb,t_char,t_contigb); uchar.fch.fch$v_nocharge = antichange(uchar.fch.fch$v_nocharge,t_char,t_noch arge); uchar.fch.fch$v_contig = change(uchar.fch.fch$v_contig,t_char,t_contig); uchar.fch.fch$v_directory = change(uchar.fch.fch$v_directory,t_char,t_direct ory); uchar.fch.fch$v_erase = change(uchar.fch.fch$v_erase,t_char,t_erase); uchar.fch.fch$v_badblock = change(uchar.fch.fch$v_badblock,t_char,t_badblock ); uchar.fch.fch$v_locked = change(uchar.fch.fch$v_locked,t_char,t_locked); uchar.fch.fch$v_markdel = change(uchar.fch.fch$v_markdel,t_char,t_markdel); uchar.fch.fch$v_spool = change(uchar.fch.fch$v_spool,t_char,t_spool); uchar.fch.fch$v_readcheck = change(uchar.fch.fch$v_readcheck,t_char,t_readch eck); uchar.fch.fch$v_writeback = change(uchar.fch.fch$v_writeback,t_char,t_writeb ack); uchar.fch.fch$v_writcheck = change(uchar.fch.fch$v_writcheck,t_char,t_writch eck); if (cli_present(t_vfcsize) & 1) { status = cli_get_value(t_vfcsize,&retval); Fat.fat$b_vfcsize = atoi(retval); }; if (cli_present(t_rsize) & 1) { status = cli_get_value(t_rsize,&retval); Fat.fat$w_rsize = atoi(retval); }; if (cli_present(t_maxrec) & 1) { status = cli_get_value(t_maxrec,&retval); Fat.fat$w_maxrec = atoi(retval); }; if (cli_present(t_efblk) & 1) { status = cli_get_value(t_efblk,&retval); Fat.fat$w_efblkh = atoi(retval)>>16; Fat.fat$w_efblkl = atoi(retval)-Fat.fat$w_efblkh; }; if (cli_present(t_ffbyte) & 1) { status = cli_get_value(t_ffbyte,&retval); Fat.fat$w_ffbyte = atoi(retval); }; if (cli_present(t_hiblk) & 1) { status = cli_get_value(t_hiblk,&retval); Fat.fat$w_hiblkh = atoi(retval)>>16; Fat.fat$w_hiblkl = atoi(retval)-Fat.fat$w_hiblkh; }; if (cli_present(t_defext) & 1) { status = cli_get_value(t_defext,&retval); Fat.fat$w_defext = atoi(retval); }; if (cli_present(t_bktsize) & 1) { status = cli_get_value(t_bktsize,&retval); Fat.fat$b_bktsize = atoi(retval); }; if (cli_present(t_gbc) & 1) { status = cli_get_value(t_gbc,&retval); Fat.fat$w_gbc = atoi(retval); }; if (cli_present(t_dirvers) & 1) { status = cli_get_value(t_dirvers,&retval); Fat.fat$w_versions = atoi(retval); }; if (cli_present(t_versions) & 1) { status = cli_get_value(t_versions,&retval); Fib.fib$w_verlimit = atoi(retval); if (Fib.fib$w_verlimit == 0) Fib.fib$w_verlimit = 32767; }; /* if this value is illegal, then don't change it! */ if (Fib.fib$w_verlimit > 32767) Fib.fib$w_verlimit = 0; jnl.fjn$v_journal_file = change(jnl.fjn$v_journal_file,t_journal,t_journal_f ile); jnl.fjn$v_aijnl = change(jnl.fjn$v_aijnl,t_journal,t_aijnl); jnl.fjn$v_atjnl = change(jnl.fjn$v_atjnl,t_journal,t_atjnl); jnl.fjn$v_bijnl = change(jnl.fjn$v_bijnl,t_journal,t_bijnl); jnl.fjn$v_rujnl = change(jnl.fjn$v_rujnl,t_journal,t_rujnl); jnl.fjn$v_never_ru = change(jnl.fjn$v_never_ru,t_journal,t_never_ru); jnl.fjn$v_only_ru = change(jnl.fjn$v_only_ru,t_journal,t_only_ru); status = cli_present(t_credate); if (status & 1) { status = cli_get_value(t_credate,&retval); bintim(retval,Cdate); } else if (status == CLI$_NEGATED) { Cdate[0]=0; Cdate[1]=0; }; status = cli_present(t_revdate); if (status & 1) { status = cli_get_value(t_revdate,&retval); bintim(retval,Rdate); } else if (status == CLI$_NEGATED) { Rdate[0]=0; Rdate[1]=0; }; if (cli_present(t_revisions) & 1) { status = cli_get_value(t_revisions,&retval); revisions = atoi(retval); }; status = cli_present(t_expdate); if (status & 1) { status = cli_get_value(t_expdate,&retval); bintim(retval,Edate); } else if (status == CLI$_NEGATED) { Edate[0]=0; Edate[1]=0; }; status = cli_present(t_bakdate); if (status & 1) { status = cli_get_value(t_bakdate,&retval); bintim(retval,Bdate); } else if (status == CLI$_NEGATED) { Bdate[0]=0; Bdate[1]=0; }; /* note that part of the FIB was cleared by earlier QIOW, so reset it */ Fib.fib$l_acctl = FIB$M_NORECORD; for (i=0;i<3;i++) Fib.fib$w_fid[i]=Nam.nam$w_fid[i]; for (i=0;i<3;i++) Fib.fib$w_did[i]=Nam.nam$w_did[i]; /* Use the IO$_MODIFY function to change info about the file */ /* Note, used this way, the file is not opened, however this would */ /* normally cause the expiration and revision dates to be modified. */ /* Using FIB$M_NORECORD prohibits this from happening. */ status = sys$qiow(0,DevChan,IO$_MODIFY,&iosb,0,0, &FibDesc,&FileName,0,0,&Atr,0); if (!(status & 1)) return(status); status = iosb[0]; if (!(status & 1)) return(status); status = sys$dassgn(DevChan); if (!(status & 1)) return(status); /* look for next file, if none, no big deal.. */ status = sys$search(&Fab); } } long int cli_present(s) char *s; { static struct dsc$descriptor s_desc = {0,DSC$K_DTYPE_T,DSC$K_CLASS_S,0}; s_desc.dsc$w_length = strlen(s); s_desc.dsc$a_pointer = s; return(cli$present(&s_desc)); } long int cli_get_value(s1,s2) char *s1,**s2; { static struct dsc$descriptor s1_desc={0,DSC$K_DTYPE_T,DSC$K_CLASS_S,0}; static struct dsc$descriptor s2_desc={0,DSC$K_DTYPE_T,DSC$K_CLASS_D,0}; static char null = '\0'; static struct dsc$descriptor null_desc={1,DSC$K_DTYPE_T,DSC$K_CLASS_S,&null}; long int status; s1_desc.dsc$w_length = strlen(s1); s1_desc.dsc$a_pointer = s1; status = cli$get_value(&s1_desc,&s2_desc); if (status & 1) { str$append(&s2_desc,&null_desc); *s2 = s2_desc.dsc$a_pointer; } else *s2 = 0; return(status); } char *cvt_time(date) long int date[2]; { static char str[27]; static struct dsc$descriptor date_str={26,DSC$K_DTYPE_T,DSC$K_CLASS_S,&str}; if ((date[0]==0) && (date[1]==0)) return("none"); sys$asctim(0,&date_str,date,0); str[26]='\0'; return(&str); } bintim(time,binval) char *time; long int binval[2]; { static struct dsc$descriptor date_str={0,DSC$K_DTYPE_T,DSC$K_CLASS_S,0}; date_str.dsc$w_length = strlen(time); date_str.dsc$a_pointer = time; sys$bintim(&date_str,binval); } unsigned int change(orig,s1,s2) unsigned int orig; char *s1,*s2; { static struct dsc$descriptor s1_desc={0,DSC$K_DTYPE_T,DSC$K_CLASS_S,0}; static struct dsc$descriptor s2_desc={0,DSC$K_DTYPE_T,DSC$K_CLASS_S,0}; static struct dsc$descriptor s3_desc={0,DSC$K_DTYPE_T,DSC$K_CLASS_D,0}; static char point = '.'; static struct dsc$descriptor pt_desc={1,DSC$K_DTYPE_T,DSC$K_CLASS_S,&point}; long int status; unsigned int i; s1_desc.dsc$w_length = strlen(s1); s1_desc.dsc$a_pointer = s1; s2_desc.dsc$w_length = strlen(s2); s2_desc.dsc$a_pointer = s2; /* s3 = s1 + "." + s2 */ str$copy_dx(&s3_desc,&s1_desc); str$append(&s3_desc,&pt_desc); str$append(&s3_desc,&s2_desc); status = cli$present(&s3_desc); i=orig; if (status & 1) i=1; if (status == CLI$_NEGATED) i=0; return(i); } unsigned int antichange(orig,s1,s2) unsigned int orig; char *s1,*s2; { static struct dsc$descriptor s1_desc={0,DSC$K_DTYPE_T,DSC$K_CLASS_S,0}; static struct dsc$descriptor s2_desc={0,DSC$K_DTYPE_T,DSC$K_CLASS_S,0}; static struct dsc$descriptor s3_desc={0,DSC$K_DTYPE_T,DSC$K_CLASS_D,0}; static char point = '.'; static struct dsc$descriptor pt_desc={1,DSC$K_DTYPE_T,DSC$K_CLASS_S,&point}; long int status; unsigned int i; s1_desc.dsc$w_length = strlen(s1); s1_desc.dsc$a_pointer = s1; s2_desc.dsc$w_length = strlen(s2); s2_desc.dsc$a_pointer = s2; /* s3 = s1 + "." + s2 */ str$copy_dx(&s3_desc,&s1_desc); str$append(&s3_desc,&pt_desc); str$append(&s3_desc,&s2_desc); status = cli$present(&s3_desc); i=orig; if (status & 1) i=0; if (status == CLI$_NEGATED) i=1; return(i); } $EOD $ create/log FILE.CLD $DECK !*************************************FILE************************************** define type RECORD_ATTRIBUTES keyword FORTRANCC negatable keyword IMPLIEDCC negatable keyword PRINTCC negatable keyword SPAN negatable define type FILE_CHARACTERISTICS keyword ACL_CORRUPT negatable keyword BACKUP negatable keyword BEST_TRY_CONTIGUOUS negatable keyword CHARGE negatable keyword CONTIGUOUS negatable keyword DIRECTORY negatable keyword ERASE_ON_DELETE negatable keyword FILE_CORRUPT negatable keyword LOCKED negatable keyword MARKED_FOR_DELETE negatable keyword READ_VERIFY negatable keyword SPOOL negatable keyword WRITE_BACK negatable keyword WRITE_VERIFY negatable define type JOURNAL_TYPES keyword JOURNAL negatable keyword AIJNL negatable keyword ATJNL negatable keyword BIJNL negatable keyword RUJNL negatable keyword NEVER_RU negatable keyword ONLY_RU negatable define type FILE_ORGANIZATION keyword DIRECT keyword INDEXED keyword RELATIVE keyword SEQUENTIAL define type RECORD_TYPE keyword CRSTREAM keyword FIXED keyword LFSTREAM keyword STREAM keyword UNDEFINED keyword VARIABLE keyword VFC define verb FILE image FILE parameter P1 , prompt="File" value (required,list,type=$infile) qualifier OUTPUT value (type=$outfile) qualifier EXACT default qualifier ATTRIBUTES nonnegatable value (required,list,type=RECORD_ATTRIBUTES) qualifier BUCKET_SIZE nonnegatable value (required,type=$number) qualifier CHARACTERISTICS nonnegatable value (required,list,type=FILE_CHARACTERISTICS) qualifier DEFAULT_EXTEND_QUANTITY nonnegatable value (required,type=$number) qualifier END_OF_FILE_BLOCK value (required,type=$number) qualifier FIRST_FREE_BYTE value (required,type=$number) qualifier GLOBAL_BUFFER_COUNT value (required,type=$number) qualifier HIGHEST_ALLOCATED_BLOCK value (required,type=$number) qualifier JOURNAL nonnegatable value (required,list,type=JOURNAL_TYPES) qualifier MAXIMUM_RECORD_SIZE value (required,type=$number) qualifier ORGANIZATION value (required,type=FILE_ORGANIZATION) qualifier RECORD_SIZE value (required,type=$number) qualifier TYPE value (required,type=RECORD_TYPE) qualifier DIRECTORY_VERSION_LIMIT value (required,type=$number) qualifier VERSION_LIMIT value (required,type=$number) qualifier VFC_SIZE value (required,type=$number) qualifier CREATION_DATE value (required,type=$datetime) qualifier REVISION_DATE value (required,type=$datetime) qualifier EXPIRATION_DATE value (required,type=$datetime) qualifier BACKUP_DATE value (required,type=$datetime) qualifier NUMBER_OF_REVISIONS value (required,type=$number) $EOD $ create/log FJNDEF.H $DECK #define FJN$M_ONLY_RU 1 #define FJN$M_RUJNL 2 #define FJN$M_BIJNL 4 #define FJN$M_AIJNL 8 #define FJN$M_ATJNL 16 #define FJN$M_NEVER_RU 32 #define FJN$M_JOURNAL_FILE 64 #define FJN$S_FJNDEF 1 struct fjndef { unsigned fjn$v_only_ru : 1; unsigned fjn$v_rujnl : 1; unsigned fjn$v_bijnl : 1; unsigned fjn$v_aijnl : 1; unsigned fjn$v_atjnl : 1; unsigned fjn$v_never_ru : 1; unsigned fjn$v_journal_file:1; } ; $EOD $ create/log IODEF.H $DECK #define IO$_NOP 0 #define IO$_UNLOAD 1 #define IO$_LOADMCODE 1 #define IO$_SEEK 2 #define IO$_SPACEFILE 2 #define IO$_STARTMPROC 2 #define IO$_RECAL 3 #define IO$_STOP 3 #define IO$_DRVCLR 4 #define IO$_INITIALIZE 4 #define IO$_RELEASE 5 #define IO$_SETCLOCKP 5 #define IO$_OFFSET 6 #define IO$_ERASETAPE 6 #define IO$_STARTDATAP 6 #define IO$_RETCENTER 7 #define IO$_QSTOP 7 #define IO$_PACKACK 8 #define IO$_SEARCH 9 #define IO$_SPACERECORD 9 #define IO$_READRCT 9 #define IO$_WRITECHECK 10 #define IO$_WRITEPBLK 11 #define IO$_READPBLK 12 #define IO$_WRITEHEAD 13 #define IO$_RDSTATS 13 #define IO$_CRESHAD 13 #define IO$_READHEAD 14 #define IO$_ADDSHAD 14 #define IO$_WRITETRACKD 15 #define IO$_COPYSHAD 15 #define IO$_READTRACKD 16 #define IO$_REMSHAD 16 #define IO$_AVAILABLE 17 #define IO$_SETPRFPATH 18 #define IO$_DSE 21 #define IO$_REREADN 22 #define IO$_REREADP 23 #define IO$_WRITERET 24 #define IO$_WRITECHECKH 24 #define IO$_READPRESET 25 #define IO$_STARTSPNDL 25 #define IO$_SETCHAR 26 #define IO$_SENSECHAR 27 #define IO$_WRITEMARK 28 #define IO$_WRTTMKR 29 #define IO$_DIAGNOSE 29 #define IO$_SHADMV 29 #define IO$_FORMAT 30 #define IO$_CLEAN 30 #define IO$_PHYSICAL 31 #define IO$_WRITELBLK 32 #define IO$_READLBLK 33 #define IO$_REWINDOFF 34 #define IO$_SETMODE 35 #define IO$_REWIND 36 #define IO$_SKIPFILE 37 #define IO$_SKIPRECORD 38 #define IO$_SENSEMODE 39 #define IO$_WRITEOF 40 #define IO$_TTY_PORT 41 #define IO$_LOGICAL 47 #define IO$_WRITEVBLK 48 #define IO$_READVBLK 49 #define IO$_ACCESS 50 #define IO$_CREATE 51 #define IO$_DEACCESS 52 #define IO$_DELETE 53 #define IO$_MODIFY 54 #define IO$_NETCONTROL 54 #define IO$_READPROMPT 55 #define IO$_SETCLOCK 55 #define IO$_ACPCONTROL 56 #define IO$_STARTDATA 56 #define IO$_MOUNT 57 #define IO$_TTYREADALL 58 #define IO$_TTYREADPALL 59 #define IO$_CONINTREAD 60 #define IO$_CONINTWRITE 61 #define IO$_VIRTUAL 63 #define IO$M_FCODE 63 #define IO$M_FMODIFIERS 65472 #define IO$M_INHERLOG 2048 #define IO$M_ERASE 1024 #define IO$M_ENCRYPT 8192 #define IO$M_DATACHECK 16384 #define IO$M_INHRETRY 32768 #define IO$M_INHSEEK 4096 #define IO$M_REVERSE 64 #define IO$M_NOWAIT 128 #define IO$M_INHEXTGAP 4096 #define IO$M_MSCPMODIFS 256 #define IO$M_SHADOW 64 #define IO$M_LOCATE 128 #define IO$M_ALLHOSTS 64 #define IO$M_DISSOLVE 128 #define IO$M_NOCLEANUP 256 #define IO$M_SPINDOWN 64 #define IO$M_FORCEPATH 64 #define IO$M_COMMOD 64 #define IO$M_MOVETRACKD 128 #define IO$M_DIAGNOSTIC 256 #define IO$M_SKPSECINH 512 #define IO$M_DELDATA 64 #define IO$M_NOMRSP 64 #define IO$M_SWAP 256 #define IO$M_OPPOSITE 512 #define IO$M_CLSEREXCP 512 #define IO$M_ACCESS 64 #define IO$M_CREATE 128 #define IO$M_DELETE 256 #define IO$M_MOUNT 512 #define IO$M_DMOUNT 1024 #define IO$M_REMOUNT 2048 #define IO$M_BINARY 64 #define IO$M_PACKED 128 #define IO$M_NOW 64 #define IO$M_READATTN 128 #define IO$M_WRTATTN 256 #define IO$M_SETPROT 512 #define IO$M_NORSWAIT 1024 #define IO$M_NOECHO 64 #define IO$M_TIMED 128 #define IO$M_CVTLOW 256 #define IO$M_NOFILTR 512 #define IO$M_DSABLMBX 1024 #define IO$M_PURGE 2048 #define IO$M_TRMNOECHO 4096 #define IO$M_REFRESH 8192 #define IO$M_ESCAPE 16384 #define IO$M_EXTEND 32768 #define IO$M_CANCTRLO 64 #define IO$M_ENABLMBX 128 #define IO$M_NOFORMAT 256 #define IO$M_BREAKTHRU 512 #define IO$M_NEWLINE 1024 #define IO$M_TYPEAHDCNT 64 #define IO$M_MAINT 64 #define IO$M_CTRLYAST 128 #define IO$M_CTRLCAST 256 #define IO$M_HANGUP 512 #define IO$M_OUTBAND 1024 #define IO$M_TT_CONNECT 2048 #define IO$M_TT_DISCON 4096 #define IO$M_TT_PROCESS 8192 #define IO$M_BRDCST 16384 #define IO$M_LOOP 128 #define IO$M_UNLOOP 256 #define IO$M_LINE_OFF 512 #define IO$M_SET_MODEM 1024 #define IO$M_LINE_ON 2048 #define IO$M_LOOP_EXT 4096 #define IO$M_AUTXOF_ENA 8192 #define IO$M_AUTXOF_DIS 16384 #define IO$M_INCLUDE 2048 #define IO$M_TT_ABORT 4096 #define IO$M_INTERRUPT 64 #define IO$M_ABORT 256 #define IO$M_SYNCH 512 #define IO$M_STARTUP 64 #define IO$M_SHUTDOWN 128 #define IO$M_ATTNAST 256 #define IO$M_CTRL 512 #define IO$M_RD_MEM 64 #define IO$M_RD_MODEM 128 #define IO$M_RD_COUNT 256 #define IO$M_CLR_COUNT 1024 #define IO$K_SRRUNOUT 0 #define IO$K_PTPBSC 8192 #define IO$K_LOOPTEST 57344 #define IO$M_MORE 64 #define IO$M_QUALIFIED 128 #define IO$M_REDIRECT 64 #define IO$M_ACCEPT 128 #define IO$M_SETEVF 64 #define IO$M_WORD 64 #define IO$M_SETFNCT 512 #define IO$M_DATAPATH 1024 #define IO$M_CYCLE 4096 #define IO$M_RESET 8192 #define IO$M_SETCUADR 256 #define IO$M_SETBSIZE 512 #define IO$M_SETPOOLSZ 1024 #define IO$M_SETENQCNT 2048 #define IO$M_CLEAR 4096 #define IO$M_LPBEXT 8192 #define IO$M_LPBINT 16384 #define IO$M_READCSR 32768 #define IO$M_NOCTSWAIT 64 #define IO$M_SLAVLOOP 128 #define IO$M_NODSRWAIT 256 #define IO$M_MAINTLOOP 512 #define IO$M_LASTBLOCK 1024 #define IO$M_INTCLOCK 4096 #define IO$S_IODEF 2 #define IO$S_FCODE 6 #define IO$V_FCODE 0 #define IO$S_FMODIFIERS 10 #define IO$V_FMODIFIERS 6 #define IO$V_INHERLOG 11 #define IO$V_ERASE 10 #define IO$V_ENCRYPT 13 #define IO$V_DATACHECK 14 #define IO$V_INHRETRY 15 #define IO$V_INHSEEK 12 #define IO$V_REVERSE 6 #define IO$V_NOWAIT 7 #define IO$V_INHEXTGAP 12 #define IO$V_MSCPMODIFS 8 #define IO$V_SHADOW 6 #define IO$V_LOCATE 7 #define IO$V_ALLHOSTS 6 #define IO$V_DISSOLVE 7 #define IO$V_NOCLEANUP 8 #define IO$V_SPINDOWN 6 #define IO$V_FORCEPATH 6 #define IO$V_COMMOD 6 #define IO$V_MOVETRACKD 7 #define IO$V_DIAGNOSTIC 8 #define IO$V_SKPSECINH 9 #define IO$V_DELDATA 6 #define IO$V_NOMRSP 6 #define IO$V_SWAP 8 #define IO$V_OPPOSITE 9 #define IO$V_CLSEREXCP 9 #define IO$V_ACCESS 6 #define IO$V_CREATE 7 #define IO$V_DELETE 8 #define IO$V_MOUNT 9 #define IO$V_DMOUNT 10 #define IO$V_REMOUNT 11 #define IO$V_BINARY 6 #define IO$V_PACKED 7 #define IO$V_NOW 6 #define IO$V_READATTN 7 #define IO$V_WRTATTN 8 #define IO$V_SETPROT 9 #define IO$V_NORSWAIT 10 #define IO$V_NOECHO 6 #define IO$V_TIMED 7 #define IO$V_CVTLOW 8 #define IO$V_NOFILTR 9 #define IO$V_DSABLMBX 10 #define IO$V_PURGE 11 #define IO$V_TRMNOECHO 12 #define IO$V_REFRESH 13 #define IO$V_ESCAPE 14 #define IO$V_EXTEND 15 #define IO$V_CANCTRLO 6 #define IO$V_ENABLMBX 7 #define IO$V_NOFORMAT 8 #define IO$V_BREAKTHRU 9 #define IO$V_NEWLINE 10 #define IO$V_TYPEAHDCNT 6 #define IO$V_MAINT 6 #define IO$V_CTRLYAST 7 #define IO$V_CTRLCAST 8 #define IO$V_HANGUP 9 #define IO$V_OUTBAND 10 #define IO$V_TT_CONNECT 11 #define IO$V_TT_DISCON 12 #define IO$V_TT_PROCESS 13 #define IO$V_BRDCST 14 #define IO$V_LOOP 7 #define IO$V_UNLOOP 8 #define IO$V_LINE_OFF 9 #define IO$V_SET_MODEM 10 #define IO$V_LINE_ON 11 #define IO$V_LOOP_EXT 12 #define IO$V_AUTXOF_ENA 13 #define IO$V_AUTXOF_DIS 14 #define IO$V_INCLUDE 11 #define IO$V_TT_ABORT 12 #define IO$V_INTERRUPT 6 #define IO$V_ABORT 8 #define IO$V_SYNCH 9 #define IO$V_STARTUP 6 #define IO$V_SHUTDOWN 7 #define IO$V_ATTNAST 8 #define IO$V_CTRL 9 #define IO$V_RD_MEM 6 #define IO$V_RD_MODEM 7 #define IO$V_RD_COUNT 8 #define IO$V_CLR_COUNT 10 #define IO$V_MORE 6 #define IO$V_QUALIFIED 7 #define IO$V_REDIRECT 6 #define IO$V_ACCEPT 7 #define IO$V_SETEVF 6 #define IO$V_WORD 6 #define IO$V_SETFNCT 9 #define IO$V_DATAPATH 10 #define IO$V_CYCLE 12 #define IO$V_RESET 13 #define IO$V_SETCUADR 8 #define IO$V_SETBSIZE 9 #define IO$V_SETPOOLSZ 10 #define IO$V_SETENQCNT 11 #define IO$V_CLEAR 12 #define IO$V_LPBEXT 13 #define IO$V_LPBINT 14 #define IO$V_READCSR 15 #define IO$V_NOCTSWAIT 6 #define IO$V_SLAVLOOP 7 #define IO$V_NODSRWAIT 8 #define IO$V_MAINTLOOP 9 #define IO$V_LASTBLOCK 10 #define IO$V_INTCLOCK 12 $EOD $ say = "WRITE SYS$OUTPUT" $ say "Compiling FILE" $ cc file $ say "Linking FILE" $ link/notrace file,c/option $ type sys$input FILE is now built, you may either edit FILE.CLD to point to where the image is located, or you may DEFINE FILE to point to the FILE program. After you have done this, do SET COMMAND FILE, and you'll be set! Send comments, inquiries etc. to: Joe Meadows Jr. Fred Hutchinson Cancer Research Center bitnet - JOE@FHCRCVAX arpa - JOE%FHCRCVAX.BITNET@WISCVM.WISC.EDU voice - (206) 467-4970 $ exit