|
@@ -273,7 +273,7 @@ bool _cmFileSysIsLink( cmFs_t* p, const cmChar_t* fnStr )
|
273
|
273
|
struct stat s;
|
274
|
274
|
errno = 0;
|
275
|
275
|
|
276
|
|
- if( stat(fnStr,&s) != 0 )
|
|
276
|
+ if( lstat(fnStr,&s) != 0 )
|
277
|
277
|
{
|
278
|
278
|
|
279
|
279
|
// if the file does not exist
|
|
@@ -294,6 +294,26 @@ bool cmFileSysIsLink( cmFileSysH_t h, const cmChar_t* fnStr )
|
294
|
294
|
return _cmFileSysIsLink(p,fnStr);
|
295
|
295
|
}
|
296
|
296
|
|
|
297
|
+bool _cmFileSysIsSocket( cmFs_t* p, const cmChar_t* fnStr )
|
|
298
|
+{
|
|
299
|
+ struct stat s;
|
|
300
|
+ errno = 0;
|
|
301
|
+
|
|
302
|
+ if( stat(fnStr,&s) != 0 )
|
|
303
|
+ {
|
|
304
|
+
|
|
305
|
+ // if the file does not exist
|
|
306
|
+ if( errno == ENOENT )
|
|
307
|
+ return false;
|
|
308
|
+
|
|
309
|
+ _cmFileSysError( p, kStatFailFsRC, errno, "'stat' failed on '%s'.",fnStr);
|
|
310
|
+ return false;
|
|
311
|
+ }
|
|
312
|
+
|
|
313
|
+ return S_ISSOCK(s.st_mode);
|
|
314
|
+}
|
|
315
|
+
|
|
316
|
+
|
297
|
317
|
bool _cmFileSysConcat( cmChar_t* rp, unsigned rn, char sepChar, const cmChar_t* suffixStr )
|
298
|
318
|
{
|
299
|
319
|
unsigned m = strlen(rp);
|
|
@@ -777,8 +797,8 @@ typedef struct
|
777
|
797
|
cmFs_t* p;
|
778
|
798
|
unsigned filterFlags;
|
779
|
799
|
cmFileSysDirEntry_t* rp;
|
780
|
|
- cmChar_t* dataPtr;
|
781
|
|
- cmChar_t* endPtr;
|
|
800
|
+ cmChar_t* dataPtr;
|
|
801
|
+ cmChar_t* endPtr;
|
782
|
802
|
unsigned entryCnt;
|
783
|
803
|
unsigned entryIdx;
|
784
|
804
|
unsigned dataByteCnt;
|
|
@@ -798,6 +818,9 @@ cmFsRC_t _cmFileSysDirGetEntries( cmFileSysDeRecd_t* drp, const cmChar_t* dirSt
|
798
|
818
|
if( dirStr == NULL || strlen(dirStr) == 0 )
|
799
|
819
|
dirStr = curDirPtr;
|
800
|
820
|
|
|
821
|
+ if( _cmFileSysIsDir(drp->p,dirStr) == false )
|
|
822
|
+ return rc;
|
|
823
|
+
|
801
|
824
|
unsigned fnCharCnt= strlen(dirStr) + PATH_MAX;
|
802
|
825
|
char fn[ fnCharCnt + 1 ];
|
803
|
826
|
|
|
@@ -821,10 +844,10 @@ cmFsRC_t _cmFileSysDirGetEntries( cmFileSysDeRecd_t* drp, const cmChar_t* dirSt
|
821
|
844
|
if((dirp = opendir(dirStr)) == NULL)
|
822
|
845
|
{
|
823
|
846
|
rc = _cmFileSysError(drp->p,kOpenDirFailFsRC,errno,"Unable to open the directory:'%s'.",dirStr);
|
|
847
|
+
|
824
|
848
|
goto errLabel;
|
825
|
849
|
}
|
826
|
850
|
|
827
|
|
-
|
828
|
851
|
// get the next directory entry
|
829
|
852
|
while((dp = readdir(dirp)) != NULL )
|
830
|
853
|
{
|
|
@@ -873,6 +896,7 @@ cmFsRC_t _cmFileSysDirGetEntries( cmFileSysDeRecd_t* drp, const cmChar_t* dirSt
|
873
|
896
|
goto errLabel;
|
874
|
897
|
}
|
875
|
898
|
|
|
899
|
+
|
876
|
900
|
// is the entry a file
|
877
|
901
|
if( _cmFileSysIsFile(drp->p,fn) )
|
878
|
902
|
{
|
|
@@ -895,9 +919,27 @@ cmFsRC_t _cmFileSysDirGetEntries( cmFileSysDeRecd_t* drp, const cmChar_t* dirSt
|
895
|
919
|
if((rc = _cmFileSysDirGetEntries(drp,fn)) != kOkFsRC )
|
896
|
920
|
goto errLabel;
|
897
|
921
|
}
|
|
922
|
+ else
|
|
923
|
+ {
|
|
924
|
+ if( _cmFileSysIsLink(drp->p,fn) )
|
|
925
|
+ {
|
|
926
|
+ if( cmIsFlag(drp->filterFlags,kLinkFsFl) == false )
|
|
927
|
+ continue;
|
|
928
|
+
|
|
929
|
+ flags |= kLinkFsFl;
|
|
930
|
+
|
|
931
|
+ if( cmIsFlag(drp->filterFlags,kRecurseLinksFsFl) )
|
|
932
|
+ if((rc = _cmFileSysDirGetEntries(drp,fn)) != kOkFsRC )
|
|
933
|
+ goto errLabel;
|
|
934
|
+ }
|
|
935
|
+ else
|
|
936
|
+ {
|
|
937
|
+ continue;
|
|
938
|
+ }
|
|
939
|
+ }
|
898
|
940
|
}
|
899
|
941
|
|
900
|
|
- assert(flags != 0);
|
|
942
|
+ //assert(flags != 0);
|
901
|
943
|
|
902
|
944
|
if( drp->passIdx == 0 )
|
903
|
945
|
{
|
|
@@ -941,6 +983,9 @@ cmFsRC_t _cmFileSysDirGetEntries( cmFileSysDeRecd_t* drp, const cmChar_t* dirSt
|
941
|
983
|
}
|
942
|
984
|
|
943
|
985
|
errLabel:
|
|
986
|
+ if( dirp != NULL )
|
|
987
|
+ closedir(dirp);
|
|
988
|
+
|
944
|
989
|
return rc;
|
945
|
990
|
}
|
946
|
991
|
|
|
@@ -962,7 +1007,7 @@ cmFileSysDirEntry_t* cmFileSysDirEntries( cmFileSysH_t h, const cmChar_t* dirSt
|
962
|
1007
|
if((rc = _cmFileSysDirGetEntries( &r, dirStr )) != kOkFsRC )
|
963
|
1008
|
goto errLabel;
|
964
|
1009
|
|
965
|
|
- if( r.passIdx == 0 )
|
|
1010
|
+ if( r.passIdx == 0 && r.dataByteCnt>0 )
|
966
|
1011
|
{
|
967
|
1012
|
// allocate memory to hold the return values
|
968
|
1013
|
if(( r.rp = (cmFileSysDirEntry_t *)cmLHeapAllocZ( r.p->heapH, r.dataByteCnt )) == NULL )
|