COSC1Q0@UHVAX1.UH.EDU ("Lee K. Gleason, Control-G Consultants") (04/20/88)
Jeff Capehart <ukma!uflorida!beach.cis.ufl.edu!jdc@NRL-CMF.ARPA> asks... >I have been wondering if it is possible (without privs, but with ownership) >to change the attributes of a file. Now, please do not misunderstand. I >am very well aware that FDL can be used to edit it to whatever and then >use the convert/fdl. However, *MY* question is, can you change the >attributes of an existing file? The CONVERT will create a *NEW* file >with the *NEW* characteristics/attributes. Any attempt to COPY/OVERLAY >will fail because of incompatible attributes. I cannot really think >of any specific example, or why I had wanted to do this. Perhaps it >was a disk quota limitation or some such thing. Anyways, I am just >curious if it is at all possible. I figure it will require some calls >to the QIO-ACP routines, but I don't have easy access to that manual. Well, if by change the attributes, you mean use ACP QIOs to change things in the file header, the answer is yes. Following is a little utility, ICONV, that does just that, along with a help file. If, however, you mean to effect a REAL change in the file format (ie, convert fixed records into variable length ones, with byte counts and trailing nulls, and all, then the answer is no. To use ICONV...cut this overly long message up into ICONV.MAR and ICONV.HLP. Then... $ MAC ICONV $ LINK ICONV $ LIBR/CREATE/HELP ICONV.HLB ICONV.HLP $ DEF ICONVDIR somedisk:[somedir] !define a logical for the help library $ COPY ICONV.HLP ICONVDIR: !and, put it there Then, you can $ RUN ICONV and be prompted, or define it as a foreign command $ ICONV:==somedisk:[somedir]ICONV and use it with complete command lines. ICONV will accept wild card file specs. It will print the name of each file as it is processed. There is a better file attribute changing program (I don't recall who wrote it) on one of the DECUS tapes, but it's in VAX BASIC (an excellent language, actually, but not available at most VAX sites). Lee K. Gleason Disclaimer: Control-G Consultants "No, Officer, no one here by that name." 2416 Branard #D Houston TX 77098 Phone 713/528-1859 COSC1Q0@UHVAX1.UH.EDU (but, not after May 2nd). "Oh well a Touch of Grey, kind of suits me, anyway." **************************************************************** CUT HERE!!!! Following file is ICONV.MAR **************************************************************** .title ICONV .ident /X01-001/ .library "sys$library:lib.mlb" $fibdef ;define fib block offsets $atrdef ;attributes $fchdef ;more attributes $fatdef ;yet still more attributes $tpadef ;tparse definitions $qiodef ;qio offsets $hlpdef swi$m_type = 1 swi$m_org = 2 swi$m_cc = 4 swi$m_rsize = 8 swi$m_vfcsize = 16 swi$m_maxrec = 32 swi$m_nospan = 64 swi$m_credate = 128 swi$m_revdate = 256 swi$m_expdate = 512 swi$m_bakdate = 1024 swi$v_type = 0 swi$v_org = 1 swi$v_cc = 2 swi$v_rsize = 3 swi$v_vfcsize = 4 swi$v_maxrec = 5 swi$v_nospan = 6 swi$v_credate = 7 swi$v_revdate = 8 swi$v_expdate = 9 swi$v_bakdate = 10 .psect icopur pic,long,usr,con,rel,gbl,shr,noexe,rd,nowrt,novec hlib: .ascid /iconvdir:iconv.hlb/ helpline: .ascid /ICONV/ hflags: .long hlp$m_prompt!hlp$m_help inprompt: .ascid /Yes?...>/ ;silly prompt .psect icodat pic,long,usr,con,rel,gbl,noshr,noexe,rd,wrt,novec type_byte: .long 0 org_byte: .long 0 cc_byte: .long 0 nospan_byte: .long 0 rsize: .long 0 vfcsize: .long 0 maxrec: .long 0 switch: .long 0 credate: .quad 0 revdate: .quad 0 expdate: .quad 0 bakdate: .quad 0 tparse_block: ;argument block for call to LIB$TPARSE .long tpa$k_count0 .long .blkb tpa$k_length0-8 $init_state tparse_key_state,tparse_key_key $state mod_state $tran !help_state,tpa$_exit, ,1,norun $tran !type_state,mod_state $tran !org_state,mod_state $tran !cc_state,mod_state $tran !rsize_state,mod_state $tran !maxrec_state,mod_state $tran !vfc_state,mod_state $tran !span_state,mod_state $tran !credate_state,mod_state $tran !revdate_state,mod_state $tran !expdate_state,mod_state $tran !bakdate_state,mod_state $tran tpa$_eos,tpa$_exit ;end of command $tran tpa$_filespec,mod_state,nonulfil , ,fildesc ;filespec $state help_state $tran 'HELP' $state $tran tpa$_string,tpa$_exit,helpem $tran tpa$_eos,tpa$_exit,helpem $state type_state $tran '/' $state $tran 'TYPE' $state $tran !sep $state $tran 'FIXED', , ,fat$c_fixed,type_byte $tran 'VARIABLE', , ,fat$c_variable,type_byte $tran 'VFC', , ,fat$c_vfc,type_byte $tran 'UNDEFINED', , ,fat$c_undefined,type_byte $tran 'STREAM', , ,fat$c_stream,type_byte $tran 'STREAMCR', , ,fat$c_streamcr,type_byte $tran 'STREAMLF', , ,fat$c_streamlf,type_byte $state $tran tpa$_lambda,tpa$_exit, ,swi$m_type,switch $state org_state $tran '/' $state $tran 'ORG' $state $tran !sep $state $tran 'DIRECT', , ,fat$c_direct,org_byte $tran 'INDEXED', , ,fat$c_indexed,org_byte $tran 'RELATIVE', , ,fat$c_relative,org_byte $tran 'SEQUENTIAL', , ,fat$c_sequential,org_byte $state $tran tpa$_lambda,mod_state, ,swi$m_org,switch $state cc_state $tran '/' $state $tran 'CC' $state $tran !sep $state $tran 'FORTRAN', , ,fat$m_fortrancc,cc_byte $tran 'IMPLIED', , ,fat$m_impliedcc,cc_byte $tran 'PRINT', , ,fat$m_printcc,cc_byte $tran 'NONE', , ,0,cc_byte $state $tran tpa$_lambda,mod_state, ,swi$m_cc,switch $state span_state $tran '/' $state $tran 'NOSPAN', ,nospan_routine $tran 'SPAN', ,span_routine $state $tran tpa$_lambda,mod_state, ,swi$m_nospan,switch $state rsize_state $tran '/' $state $tran 'RSIZE' $state $tran !sep $state $tran tpa$_decimal, , , ,rsize $state $tran tpa$_lambda,mod_state, ,swi$m_rsize,switch $state vfc_state $tran '/' $state $tran 'VFCSIZE' $state $tran !sep $state $tran tpa$_decimal, , , ,vfcsize $state $tran tpa$_lambda,mod_state, ,swi$m_vfcsize,switch $state maxrec_state $tran '/' $state $tran 'MAXREC' $state $tran !sep $state $tran tpa$_decimal, , , ,maxrec $state $tran tpa$_lambda,mod_state, ,swi$m_maxrec,switch $state credate_state $tran '/' $state $tran 'CREDATE' $state $tran !sep $state $tran tpa$_string, ,check_date, , ,credate $state $tran tpa$_lambda,mod_state, ,swi$m_credate,switch $state revdate_state $tran '/' $state $tran 'REVDATE' $state $tran !sep $state $tran tpa$_string, ,check_date, , ,revdate $state $tran tpa$_lambda,mod_state, ,swi$m_revdate,switch $state bakdate_state $tran '/' $state $tran 'BAKDATE' $state $tran !sep $state $tran tpa$_string, ,check_date, , ,bakdate $state $tran tpa$_lambda,mod_state, ,swi$m_bakdate,switch $state expdate_state $tran '/' $state $tran 'EXPDATE' $state $tran !sep $state $tran tpa$_string, ,check_date, , ,expdate $state $tran tpa$_lambda,mod_state, ,swi$m_expdate,switch $state sep ;subexpression for valid separators $tran '=',tpa$_exit $tran ':',tpa$_exit $end_state indesc: .long 255 ;place to store command line .address .+4 .blkb 255 inlen: .long 0 ;place to return input length fibdesc: ;fib block descriptor fiblen: .long 100 .address fibblk fibblk: .blkb 100 attlst: ;fib request list .word atr$s_recattr ;record attributes .word atr$c_recattr .address recattbuf .long 0 recattbuf: .blkb 40 q1blk: $qiow func = io$_access,- ;read file attributes function iosb = iosb,- ;let's use an iosb chan = chan,- ;dummy chan parameter p1 = fibdesc,- ;file information block p5 = attlst ;attribute request block q2blk: $qiow func = io$_modify,- ;read file attributes function iosb = iosb,- ;let's use an iosb chan = chan,- ;dummy chan parameter p1 = fibdesc,- ;file information block p5 = attlst ;attribute request block topdesc: ;descriptor for top level directory toplen: .long 128 topadr: .address .+4 topbuf: .blkb 128 .align long topfab: $fab nam=topnam ;we'll need a fab topnam: $nam esa = topexpbuf,- ;place for expanded file name ess = nam$c_maxrss,- ;and it's length rsa = topresbuf,- ;place for resultant file name rss = nam$c_maxrss ;and it's length devdesc: ;descriptor for device name devlen: .long 0 devadr: .long 0 norun: .long 0 topresdesc: .long nam$c_maxrss ;rsa .address topresbuf topresbuf: .blkb nam$c_maxrss topexpdesc: .long nam$c_maxrss ;esa .address topexpbuf topexpbuf: .blkb nam$c_maxrss fildesc: .long 80 .address .+4 .blkb 80 outstr: .long 80 ;palce for output .address .+4 .blkb 80 chan: .long 0 iosb: .quad 0 .psect icocod pic,long,usr,con,rel,gbl,shr,exe,rd,nowrt,novec .entry iconv,^m<> pushal inlen ;place to store command line length clrl -(sp) ;no prompt first time pushal indesc ;place to store command line calls #3,g^lib$get_foreign ;try for a command line blbc r0,out ;if error, we gotta die tstl inlen ;is it a null line? bgtr proceed ;nope, we got a real one pushal inlen ;let's try again... pushal inprompt ;...with a prompt this time pushal indesc ;same place calls #3,g^lib$get_foreign ;here goes... blbc r0,out ;if trouble, then get out tstl inlen ;anything really there? bgtr proceed ;yup, so let's proceed out: cmpl #^X182CA,r0 bneq 1$ movl #1,r0 1$: $exit_s r0 ;let's get outa here again: clrl norun clrl inlen pushal inlen ;let's try again... pushal inprompt ;...with a prompt this time pushal indesc ;same place calls #3,g^lib$get_input ;here goes... blbc r0,out tstl inlen bleq out proceed: movzwl inlen,tparse_block+tpa$l_stringcnt ;length of command string movl indesc+4,tparse_block+tpa$l_stringptr ;addr of command string pushal tparse_key_key ;push keyword table address pushal tparse_key_state ;push state table address pushal tparse_block ;push tparse arg block address calls #3,g^lib$tparse ;parse commnad line blbc r0,out ;and it better be good... blbc norun,1$ brw again 1$: movl #fib$m_writethru,fib$l_acctl+fibblk ;update headers as we go bisw #fib$m_findfid,fib$w_nmctl+fibblk ;find by fid rnext: $fab_store fab = topfab,- fns = fildesc,- fna = @fildesc+4 ;put current name in fab $parse fab = topfab ;parse it blbs r0,next brw nuts next: $search fab = topfab ;find it blbs r0,1$ brw out 1$: pushal topresdesc calls #1,g^lib$put_output moval topnam,r11 movzbl nam$t_dvi(r11),devlen ;len of dev name to descriptor moval nam$t_dvi+1(r11),devadr ;addr of dev name to descriptor movl nam$w_did(r11),fibblk+fib$w_did movw nam$w_did+4(r11),fibblk+fib$w_did+4 movl nam$w_fid(r11),fibblk+fib$w_fid movw nam$w_fid+4(r11),fibblk+fib$w_fid+4 $assign_s - ;assign output device channel chan = chan, - ;this channel devnam = devdesc ;this device movl chan,qio$_chan+q1blk ;store chan in qioblk movl chan,qio$_chan+q2blk ;store chan in qioblk $qiow_g q1blk ;do the set blbs r0,2$ ;ok? brw nuts 2$: movl iosb,r0 blbs r0,3$ ;really ok? brw nuts 3$: moval recattbuf,r11 bbc #swi$v_type,switch,10$ bicb #^X0F,fat$b_rtype(r11) bisb type_byte,fat$b_rtype(r11) 10$: bbc #swi$v_org,switch,20$ bicb #^XF0,fat$b_rtype(r11) mull3 org_byte,#16,r0 bisb r0,fat$b_rtype(r11) 20$: bbc #swi$v_cc,switch,30$ movb cc_byte,fat$b_rattrib(r11) 30$: bbc #swi$v_rsize,switch,40$ movw rsize,fat$w_rsize(r11) 40$: bbc #swi$v_maxrec,switch,50$ movw maxrec,fat$w_maxrec(r11) 50$: bbc #swi$v_vfcsize,switch,60$ movw vfcsize,fat$b_vfcsize(r11) 60$: bbc #swi$v_nospan,switch,70$ ;was there a span? insv nospan_byte,#fat$v_nospan,#1,fat$b_rattrib(r11) 70$: $qiow_g q2blk ;do the set blbc r0,nuts ;ok? blbc iosb,nuts ;really ok? $dassgn_s chan = chan brw next nuts: cmpl #^X182CA,r0 bneq 1$ movl #1,r0 1$: $exit_s .entry span_routine,^m<> bicb #1,nospan_byte ret .entry nospan_routine,^m<> bisb #1,nospan_byte ret .entry check_date,^m<> pushl tpa$l_param(ap) pushal tpa$l_tokencnt(ap) calls #2,sys$bintim blbs r0,1$ $exit_s r0 1$: ret .entry nonulfil,^m<> tstl tpa$l_tokencnt(ap) bneq 1$ clrl r0 1$: ret .entry helpem,^m<> pushal g^lib$get_input pushal hflags pushal hlib pushal helpline pushal #0 pushal g^lib$put_output calls #6,g^lbr$output_help ret .end iconv ********************************************************************* CUT HERE!!! File following is ICONV.HLP ********************************************************************* 1 ICONV This is ICONV, a program for changing the attributes of a file, brought to you by those friendly folks at Control-G Consultants. Use at your own risk - this is serious business. Format: ICONV input-file-spec 2 Parameters input-file-spec Specifies the name of input file(s) to be mangled. You can use wildcard characters in the input file specifications. 2 Command_Qualifiers /TYPE /TYPE=[option] This qualifier is used to change the TYPE attribute of the file. Valid TYPES are... FIXED VARIABLE VFC UNDEFINED STREAM STREAMCR STREAMLF /ORG /ORG = [option] This qualifier is used to change the file organization. Valid options are... DIRECT INDEXED RELATIVE SEQUENTIAL /CC /CC = [option] This qualifier is used to change the Carriage Control attribute of the file. Valid options are... FORTRAN IMPLIED PRINT NONE /SPAN /SPAN = [option] This qualifier is used to change the block spanning attribute. Valid options are... NOSPAN SPAN /RSIZE /RSIZE = [value] This qualifier is used to set the record size of the file. Don't make it too big, or too small, ok? /VFCSIZE /VFCSIZE = [value] This qualifier is used to set the size of the VFC control field. It would be a good idea to set CC to VFC if you plan to use this qualifier, nicht wahr? /MAXREC /MAXREC = [value] This qualifer is used to set the size of the maximum allowable record in the file. /CREDATE /CREDATE = [date-time] This qualifer would reset the creation date of the file, if it worked, which it doesn't, since VAX date and time are a bitch to parse. It'll be in Version 2, ok? /BAKDATE /BAKDATE = [date-time] This qualifer would reset the creation date of the file, if it worked, which it doesn't, since VAX date and time are a bitch to parse. It'll be in Version 2, ok? /REVDATE /REVDATE = [date-time] This qualifer would reset the revision date of the file, if it worked, which it doesn't, since VAX date and time are a bitch to parse. It'll be in Version 2, ok? /EXPDATE /EXPDATE = [date-time] This qualifer would reset the expiration date of the file, if it worked, which it doesn't, since VAX date and time are a bitch to parse. It'll be in Version 2, ok? ********************************************************************* END OF FILES ********************************************************************* -------