home *** CD-ROM | disk | FTP | other *** search
- /* e_dirent.c */
- /* 03Sep95 e */
- /* based on MacOS.dep.c 14Aug93 e */
-
- #include <Files.h>
- #include <errno.h>
- #include "dirent.h"
- #include "os_mac_str.h"
-
- DIR *opendir( const char *dn )
- { FSSpec fss;
- unsigned char pbuf[256];
- CInfoPBRec pb;
- DIR *dp;
- int o;
- short cur_vol;
- long cur_dir;
-
- if( *dn == 0 ) goto labelMakeRoot;
-
- c_to_p( (char *)dn, pbuf );
- HGetVol( NULL, &cur_vol, &cur_dir );
- errno = FSMakeFSSpec( cur_vol, cur_dir, pbuf, &fss );
- if ( errno )
- { if ( errno == -120 && strspn(dn,":") == strlen(dn) )
- { /* all ":" => the "root" */
- labelMakeRoot:
- errno = 0;
- pb.dirInfo.ioDrDirID = -1;
- fss.vRefNum = -1;
- pb.dirInfo.ioDrNmFls = 4; /* fix? */
- o = 2;
- goto labelDNalloc;
- }
- return NULL;
- }
- /* set-up paramter block to get # of files/folders */
- pb.dirInfo.ioVRefNum = fss.vRefNum;
- pb.dirInfo.ioDrDirID = fss.parID;
- pb.dirInfo.ioNamePtr = fss.name;
- pb.dirInfo.ioFDirIndex = 0; /* use name & vRefNum & dirID */
-
- /* get number of files/folders in dir */
- if ( PBGetCatInfoSync(&pb) )
- return NULL;
- if ((pb.dirInfo.ioFlAttrib & 0x10) == 0)
- return NULL; /* not a directory */
- o = 1;
-
- labelDNalloc:
- #if 0
- /* why did I do this? */
- for ( m = -1, n = 0; n < qDFDs; n++ )
- { dp = &open_dirs[n];
- if ( dp->openp )
- { if ( (dp->dirID == pb.dirInfo.ioDrDirID)
- && (dp->ioVRefNum == fss.vRefNum)
- && (dp->openp == o) )
- return dp;
- }
- else if (m < 0) m = n;
- }
- if (m < 0) return NULL; /* no more room */
- dp = &open_dirs[m];
- #else
- dp = (DIR *)NewPtr( sizeof(DIR) );
- if( dp == NULL ) return NULL; /* no more room */
- #endif
- dp->dirID = pb.dirInfo.ioDrDirID;
- dp->ioVRefNum = fss.vRefNum;
- dp->numFiles = pb.dirInfo.ioDrNmFls;
- dp->index = 1;
- dp->openp = o;
- return dp;
- }
-
- int closedir( DIR *dp )
- {
- if( dp == NULL || dp->openp == 0 )
- return NULL; /* not a (DIR *) or not open */
- dp->openp = 0; /* not open any more */
- DisposePtr( (Ptr )dp );
- return 0;
- }
-
- void rewinddir( DIR *dp )
- {
- if( dp == NULL || dp->openp == 0 )
- return; /* not a (DIR *) or not open */
- dp->index = 1;
- }
-
- struct dirent *readdir( DIR *dp )
- {
- unsigned char *p = (unsigned char *)&dp->entry.d_name[-1];
-
- if( dp == NULL || dp->openp == 0 )
- return NULL; /* not a (DIR *) or not open */
-
- dp->entry.d_namlen = 0;
- if ( dp->openp == 2 )
- { VolumeParam pb;
- pb.ioCompletion = 0;
- pb.ioNamePtr = p;
- pb.ioVolIndex = dp->index;
- if ( PBGetVInfoSync((ParmBlkPtr)&pb) )
- return NULL;
- dp->entry.d_fileno = 0; /* ?? */
- }
- else
- { CInfoPBRec pb;
- pb.dirInfo.ioNamePtr = p;
- pb.dirInfo.ioVRefNum = dp->ioVRefNum;
- pb.dirInfo.ioDrDirID = dp->dirID;
- pb.dirInfo.ioFDirIndex = dp->index;
- if( dp->index > dp->numFiles || PBGetCatInfoSync(&pb) )
- return NULL;
- dp->entry.d_fileno = pb.dirInfo.ioDrDirID;
- }
- p = &p[p[0]+1]; /* just past last char */
- do *p++ = 0; /* write the trailing NUL */
- while( ((int )p & 3) != 0 ); /* pad out */
- dp->entry.d_reclen = p - (unsigned char *)&dp->entry;
- dp->index++; /* increment file/volume index */
- return &dp->entry;
- }
-