jbwaters@bsu-cs.UUCP (J. Brian Waters) (09/22/88)
After running into some problems with the Manx supplied scdir() function I wanted to write my own replacment for it. I used the arp.library function to be able to take advantage of its wildcard features. The routine below worked until I tried to use the resource tracking features of arp. Can anyone see what I am doing wrong? It bombs on the free(Anchor) command with the guru for AN_Free_Twice. #include <exec/types.h> #include <libraries/arpbase.h> extern void *calloc(); extern long FindNext(), FindFirst(); extern struct DefaultTracker *GetTracker(); extern struct DefaultTracker *LastTracker; struct UserAnchor { struct AnchorPath ua_AP; BYTE moremem[255]; /* cheap way to extend ap_Buf[] */ }; char * scdir(pat) char *pat; { static int first_time = 1; static struct UserAnchor *Anchor; static struct DefaultTracker *anchor_tracker; /* track so we can always clean up */ LONG Result; /* Chk_Abort(); */ if (first_time) { /* calloc works as Manx passes [cm]alloc() on to AllocMem so longword alignment requirment is satisfied */ if ( Anchor = calloc( 1, sizeof( *Anchor )) ) { Anchor->ua_AP.ap_Length = 255; /* Want full path info */ } else return(0L); } while (1) { if (first_time) { first_time = 0; Result = FindFirst(pat, Anchor); if ( anchor_tracker = GetTracker( TRAK_ANCHOR ) ) anchor_tracker->dt_Object.dt_Resource = (CPTR)Anchor; else Result = 0; /* can not get tracker so force failure */ } else Result = FindNext(Anchor); if ((Result == 0) && Anchor->ua_AP.ap_Info.fib_DirEntryType >= 0) continue; /* skip dirs */ if (Result == 0) return(Anchor->ua_AP.ap_Buf); else { /* failed to find more files */ first_time = 1; /* reset first_time to TRUE */ FreeTrackedItem(anchor_tracker); free(Anchor); /* bombs here with AN_FreeTwice is arp freeing it on me? */ return(0L); } } /* end of while (1) */ } /* end of scdir() */ -- Brian Waters <backbone>!{iuvax|pur-ee}!bsu-cs!jbwaters uunet!---/