; ReDate 1.1/ SetDate DIRs according to contents ; - Jim Butterfield. April 7/90. ; Exec library calls _LVOAllocMem EQU -$C6 _LVOFreeMem EQU -$D2 _LVOFindTask EQU -$126 _LVOSetSignal EQU -$132 _LVOAllocSignal EQU -$14A _LVOFreeSignal EQU -$150 _LVOPutMsg EQU -$16E _LVOGetMsg EQU -$174 _LVOWaitPort EQU -$180 _LVOCloseLibrary EQU -$19E _LVOOpenLibrary EQU -$228 ; DOS library calls _LVOOpen EQU -$1E _LVOClose EQU -$24 _LVORead EQU -$2A _LVOWrite EQU -$30 _LVOOutput EQU -$3C _LVOLock EQU -$54 _LVOUnLock EQU -$5A _LVOExamine EQU -$66 _LVOExNext EQU -$6C _LVOCurrentDir EQU -$7E _LVOIoErr EQU -$84 _LVODeviceProc EQU -$AE ; ACCESS_READ equ -2 MODE_OLDFILE equ 1005 INFOSIZE equ 260 ; sizeof (struct MsgPort+struct Message+struct DosPacket+108+4) DATASIZE equ $24+$14+$30+112 ; FileInfoBlock items fib_FileName equ 8 fib_EntryType equ 120 fib_Date equ 132 ; IO Error Type NO_MORE_ENTRIES equ 232 ; ;-- Initial setup: ; offsets from A5 (Globals) FileErr equ -4 ; Level not needed this version, but might be useful for expansion Level equ -8 DevProc equ -12 dosBase equ -16 argv equ -20 OutHandle equ -24 DataBlk equ -28 ;Mport/Msg/dos packet/Name block message equ -32 DosPkt equ -36 Nope equ -37 ;byte .. update didn't work Yup equ -38 ;byte .. update worked Mebbe equ -39 ;byte .. update tried Abort equ -40 ;byte go link a5,#-40 ; common work area moveq #0,d1 move.l d1,Abort(a5) ; four bytes move.b d1,-1(a0,d0) ; c style string spdump move.b (a0)+,d0 ; skip init spaces cmp.b #$20,d0 beq.s spdump move.b -(a0),d7 ; grab first char move.l a0,argv(a5) ;** Level=0; move.l d1,Level(a5) ; set up dos, DevProc, output, here moveq #1,d0 move.l d0,FileErr(a5) moveq #20,d6 ; return FAIL lea dosname(pc),a1 ; Name 'dos.library'. moveq #33,d0 ; 1.2 or later move.l $4,a6 ; Using Exec library jsr _LVOOpenLibrary(a6) ; Open Dos library. move.l d0,dosBase(a5) ; Remember DosBase ptr. beq StartupQuit ; dos not opened move.l d0,a6 ; set Dos library jsr _LVOOutput(a6) ; get CLI outhandle, move.l d0,OutHandle(a5) ; & then remember it. tst.b d7 ; no file name? beq Prompt move.l argv(a5),d1 ; file name jsr _LVODeviceProc(A6) move.l d0,DevProc(a5) ; device handler beq DosQuit ; MakePort(Az=0,D7=0) move.l 4,a6 ; exec library move.l #DATASIZE,d0 move.l #$10001,d1 ;public|clear jsr _LVOAllocMem(a6) move.l d0,a3 move.l a3,DataBlk(a5) beq DosQuit lea $24(a3),a0 ;keep longword alignment! move.l a0,message(a5) lea $14(a0),a0 move.l a0,DosPkt(a5) ; make the port .. alloc signal moveq #-1,d0 jsr _LVOAllocSignal(a6) cmp.b #$FF,d0 beq.s _NoSignal ;couldn't get signal move.b d0,15(a3) ;mp_SigBit move.b #4,8(a3) ;mp_Node.ln_Type=NT_MSGPORT clr.b 14(a3) ;mp_Flags=PA_SIGNAL sub.l a1,a1 jsr _LVOFindTask(a6) move.l d0,$10(a3) ;*mp_SigTask ; construct empty MsgList lea $18(a3),a0 ;mp_MsgList.lh_Tail (contns 0) move.l a0,$14(a3) ; to mp_MsgList.lh_Head lea $14(a3),A0 ;mp_MsgList.lh_Head move.l a0,$1C(a3) ; to mp_MsgList.lhTailPred clr.l $18(a3) ;mp_MsgList.lh_Tail move.b #2,$20(a3) ;mp_MsgList.lh_type ;** GetToWork(argv[1]); move.l argv(a5),a0 bsr GetToWork ; Wind up port here; Scrap(A3=address) move.l DataBlk(a5),a3 MOVE.B #$FF,8(A3) MOVEQ #-1,D0 MOVE.L D0,$14(A3) MOVEQ #0,D0 MOVE.B 15(A3),D0 MOVE.L 4,A6 JSR _LVOFreeSignal(A6) ; Can't get the signal _NoSignal MOVE.L A3,A1 MOVE.L #DATASIZE,D0 JSR _LVOFreeMem(A6) ; Can't get the allocate DosQuit move.l dosBase(a5),a6 ; set Dos Library ;** switch (FileErr) move.l argv(a5),a0 move.l FileErr(a5),d0 ;** { ;** case 0: bne.s Ncase0 tst.b Yup(a5) beq.s NotYup moveq #0,d6 ; return OK move.l OutHandle(a5),d1 ; file handle lea SDupMsg(pc),a1 move.l a1,d2 ; outbuffer moveq #SDupLen,d3 ; length jsr _LVOWrite(A6) NotYup tst.b Nope(a5) beq.s NotNo moveq #5,d6 ; return WARN move.l OutHandle(a5),d1 ; file handle lea SDnupMsg(pc),a1 move.l a1,d2 ; outbuffer moveq #SDnupLen,d3 ; length jsr _LVOWrite(A6) NotNo tst.b Mebbe(a5) bne.s endSwitch moveq #10,d6 ; return ERROR move.l OutHandle(a5),d1 ; file handle lea SDnfMsg(pc),a1 move.l a1,d2 ; outbuffer moveq #SDnfLen,d3 ; length jsr _LVOWrite(A6) ;** break; bra.s endSwitch ;** case 1: ;** printf("Out of Memory\n"); Ncase0 cmp.l #1,d0 bne.s Ncase1 move.l OutHandle(a5),d1 ;file handle lea NoMemMsg(pc),a1 move.l a1,d2 ;outbuffer moveq #NoMemLen,d3 ;length jsr _LVOWrite(A6) ;** break; bra.s endSwitch ;** case 2: ;** printf("Can't find directory.\n"); Ncase1 cmp.l #2,d0 bne.s endSwitch move.l OutHandle(a5),d1 ;file handle lea NoFileMsg(pc),a1 move.l a1,d2 ;outbuffer moveq #NoFileLen,d3 ;length jsr _LVOWrite(A6) endSwitch bra.s LastGasp ;** } ;** } ;** else printf("FORMAT: ReDate \n"); Prompt move.l OutHandle(a5),d1 lea PromptMsg(pc),a1 move.l a1,d2 moveq #PromptLen,d3 jsr _LVOWrite(A6) moveq #0,d6 ; return OK ;** } LastGasp: move.l dosBase(a5),a1 ; DosBase to a1; move.l $4,a6 ; using Exec library, jsr _LVOCloseLibrary(a6) ; close Dos library. StartupQuit unlk a5 move.l d6,d0 ; return code rts ; End of Program ;** *struct DateStamp GetToWork(char * Name) ;** { ;** unsigned long newLock, oldLock; ;** struct FileInfoBlock *fibb; ;** char *NameSave; ; offsets from A4 Days equ -4 Minutes equ -8 Ticks equ -12 newLock equ -16 oldLock equ -20 fibb equ -24 NameSave equ -28 GetToWork link A4,#-28 move.l a0,NameSave(a4) ;** Date[]=0; moveq #90,d0 ;for April 1 1978 move.l d0,Days(a4) move.l d0,Minutes(a4) move.l d0,Ticks(a4) ;** FileErr =1; /* Alloc error */ moveq #1,d0 move.l d0,FileErr(a5) ;** if ((fibb = AllocMem(INFOSIZE,0)) != 0) move.l $4,a6 ; this calls for Exec moveq #0,d1 ; any type of memory move.l #INFOSIZE,d0 ; size of block needed jsr _LVOAllocMem(a6) ; go get it move.l dosBase(a5),a6 ; restore Dos Library move.l d0,fibb(a4) ; save the block address beq GDExit ; quit if no memory ;** { ;** FileErr =2; /* file unreadable */ moveq #2,d0 move.l d0,FileErr(a5) ;** if ((newLock = Lock(Name,ACCESS_READ)) != 0) move.l NameSave(a4),d1 moveq #ACCESS_READ,D2 ; get a read lock jsr _LVOLock(a6) move.l d0,newLock(a4) ; store the lock pointer beq DropMem ; couldn't get lock ;** { if ((Examine(newLock,fibb)) != 0) move.l d0,d1 ; lock move.l fibb(a4),d2 ; file info block address jsr _LVOExamine(a6) ; go for the data ; Assume Examine never fails. Go for the data. ;** { ;** FileErr =0; /* got file, normal error sequence */ moveq #0,d0 move.l d0,FileErr(a5) ;** if (fibb->fib_EntryType < 0) move.l fibb(a4),a3 ; file info block address move.l fib_EntryType(a3),d0 bpl.s DirLoop ;** { ;** printf(" Not a Directory!/n"); move.l OutHandle(a5),d1 lea NotDirMsg(pc),a1 move.l a1,d2 moveq #NotDirLen,d3 jsr _LVOWrite(A6) bra DropLock ;** else DirLoop: ;** { ;** if ((ExNext(newLock,fibb)) == 0) move.l newLock(a4),d1 ; lock move.l fibb(a4),d2 ; file info block address jsr _LVOExNext(a6) ; go for the data tst.l d0 beq DropLock ;** { ;** if (fibb->fib_EntryType < 0) tst.l fib_EntryType(a3) bmi TypeFile ;** We found a directory .. we got work. ;** { ;** oldLock = CurrentDir(newLock); move.l newLock(a4),d1 jsr _LVOCurrentDir(a6) move.l d0,oldLock(a4) ;** Level += 1; addq #1,Level(a5) ;** GetDir(fibb->fib_FileName); lea fib_FileName(a3),a0 bsr GetToWork move.l fibb(a4),a3 ; file info block address move.l d0,fib_Date(a3) move.l d1,fib_Date+4(a3) move.l d2,fib_Date+8(a3) ;** Level -= 1; subq #1,Level(a5) ;** newLock = CurrentDir(oldLock); move.l oldLock(a4),d1 jsr _LVOCurrentDir(a6) move.l d0,newLock(a4) ;** This is where we build the packet. Ouch. ; sendpkt(a3=struct MsgPort *pid,a2=LONG args) move.l DosPkt(a5),a0 lea $30(a0),a0 ;BSTR site lea fib_FileName(a3),a1 ;name moveq #0,d0 NmLp move.b 0(a1,d0.w),1(a0,d0.w) beq.s NmEnd addq.w #1,d0 cmp.w #108,d0 bne.s NmLp NmEnd move.b d0,(a0) ;len move.l a0,d7 lsr.l #2,d7 ;BSTR address ; message.mn_Node.ln_Name = &(dosPacket); MOVE.L DosPkt(A5),A0 MOVE.L message(A5),A1 MOVE.L A0,10(A1) ; dosPacket.dp_Link = &(message); MOVE.L A1,0(A0) ; dosPacket.dp_Port = replyport; MOVE.L DataBlk(A5),$18(A1) ; dosPacket.dp_Type = action; MOVE.L #34,$1C(A1) ; dosPacket.dp_Arg1 = 0; LEA $28(A1),A0 ;arg1 ; arg1=NULL MOVE.L #0,0(A0) ; dosPacket.dp_Arg2 = parentlock; move.l newLock(a4),4(a0) ; lock ; dosPacket.dp_Arg3 = BSTR(filename); move.l d7,8(A0) ; BSTR ; dosPacket.dp_Arg4 = &datestamp; lea fib_Date(a3),a1 move.l a1,12(A0) ; Ptr to datestamp ; PutMsg(pid,message); move.l DevProc(A5),A0 MOVE.L message(A5),A1 MOVE.L 4,A6 JSR _LVOPutMsg(A6) ; WaitPort(replyport); GetMsg(replyport); MOVE.L DataBlk(A5),A0 JSR _LVOWaitPort(A6) MOVE.L DataBlk(A5),A0 JSR _LVOGetMsg(A6) ; res1 = dosPacket.dp_Res1; moveq #1,d1 lea Nope(a5),a1 move.l message(A5),A0 move.l $20(A0),D0 ; $FFFFF is success beq.s NGood lea Yup(a5),a1 NGood move.b d1,(a1) move.b d1,Mebbe(a5) ;** } /* dir */ TypeFile: ; if FileName <> #?.info lea fib_FileName(a3),a0 TryChx move.b (a0)+,d0 bne.s TryChx lea -6(a0),a0 lea InfoLine(pc),a1 InfLp cmp.b (a0)+,(a1)+ beq.s InfLp tst.b -1(a0) beq.s Rejoin2 ;** { move.l fib_Date(a3),d0 move.l fib_Date+4(a3),d1 move.l fib_Date+8(a3),d2 cmp.l Days(a4),d0 bne.s ckDate cmp.l Minutes(a4),d1 bne.s ckDate cmp.l Ticks(a4),d2 ckDate bcs.s Rejoin2 move.l d0,Days(a4) move.l d1,Minutes(a4) move.l d2,Ticks(a4) ;** } /* file */ Rejoin2: tst.b Abort(a5) bne.s DropLock moveq #0,d0 move.l #$1000,d1 move.l $4,a6 jsr _LVOSetSignal(a6) move.l dosBase(a5),a6 ; restore Dos Library and.l #$1000,d0 beq.s NotCtrlC move.b #1,Abort(a5) NotCtrlC: tst.b Abort(a5) beq DirLoop ; print Ctrl-C signal move.l OutHandle(a5),d1 lea CtrlCMsg(pc),a1 move.l a1,d2 moveq #CtrlCLen,d3 jsr _LVOWrite(A6) ;** } /* primary dir not file */ ;** } /* Examine OK */ ;** UnLock(newLock); DropLock move.l dosBase(a5),a6 ; set Dos Library move.l newLock(a4),d1 ; take off the lock jsr _LVOUnLock(a6) ;** } /* Lock OK */ ;** FreeMem(fibb,INFOSIZE); DropMem: move.l $4,a6 ; set Exec library move.l fibb(a4),a1 ; memory block address move.l #INFOSIZE,d0 ; size of block jsr _LVOFreeMem(a6) ; release this memory move.l dosBase(a5),a6 ; set Dos Library ;** } /* Alloc OK */ move.l Days(a4),d0 move.l Minutes(a4),d1 move.l Ticks(a4),d2 GDExit: unlk A4 rts ;** } NotDirMsg dc.b 'Not a directory!',$a NotDirLen equ *-NotDirMsg PromptMsg dc.b 'ReDate (by Jim Butterfield) V1.0',$0a dc.b 'FORMAT: ReDate ',$0a PromptLen equ *-PromptMsg SDupMsg dc.b 'Subdirectories updated.',$a SDupLen equ *-SDupMsg SDnupMsg dc.b 'Subdirectories not updated.',$a SDnupLen equ *-SDnupMsg SDnfMsg dc.b 'No subdirectories seen.',$a SDnfLen equ *-SDnfMsg NoMemMsg dc.b 'Out of Memory',$0a NoMemLen equ *-NoMemMsg NoFileMsg dc.b 'Can t find file.',$0a NoFileLen equ *-NoFileMsg CtrlCMsg dc.b '^C',$0a CtrlCLen equ *-CtrlCMsg InfoLine dc.b '.info' dosname dc.b 'dos.library',0 end