630 DIR *d; |
630 DIR *d; |
631 OBJ path, dp; |
631 OBJ path, dp; |
632 |
632 |
633 ok = false; |
633 ok = false; |
634 if (__INST(dirPointer) == nil) { |
634 if (__INST(dirPointer) == nil) { |
635 path = __INST(pathName); |
635 path = __INST(pathName); |
636 if (__isString(path)) { |
636 if (__isString(path)) { |
637 __BEGIN_INTERRUPTABLE__ |
637 __BEGIN_INTERRUPTABLE__ |
638 __threadErrno = 0; |
638 __threadErrno = 0; |
639 do { |
639 do { |
640 path = __INST(pathName); |
640 path = __INST(pathName); |
641 d = opendir((char *) __stringVal(path)); |
641 d = opendir((char *) __stringVal(path)); |
642 } while ((d == NULL) && (__threadErrno == EINTR)); |
642 } while ((d == NULL) && (__threadErrno == EINTR)); |
643 __END_INTERRUPTABLE__ |
643 __END_INTERRUPTABLE__ |
644 |
644 |
645 if (d == NULL) { |
645 if (d == NULL) { |
646 __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno); |
646 __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno); |
647 } else { |
647 } else { |
648 dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp); |
648 dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp); |
649 ok = true; |
649 ok = true; |
650 } |
650 } |
651 } |
651 } |
652 } |
652 } |
653 #else |
653 #else |
654 # ifdef WIN32 |
654 # ifdef WIN32 |
|
655 # ifndef MAXPATHLEN |
|
656 # define MAXPATHLEN 1024 |
|
657 # endif |
655 HANDLE d; |
658 HANDLE d; |
656 OBJ path, dp; |
659 OBJ path, dp; |
657 char pattern[512]; |
660 union { |
658 WIN32_FIND_DATA data; |
661 char pattern[MAXPATHLEN]; |
|
662 wchar_t wpattern[MAXPATHLEN]; |
|
663 } uP; |
|
664 union { |
|
665 WIN32_FIND_DATAA data; |
|
666 WIN32_FIND_DATAW wdata; |
|
667 } uD; |
659 |
668 |
660 ok = false; |
669 ok = false; |
661 if (__INST(dirPointer) == nil) { |
670 if (__INST(dirPointer) == nil) { |
662 path = __INST(pathName); |
671 path = __INST(pathName); |
663 if (__isString(path)) { |
672 if (__isString(path)) { |
664 int l = __stringSize(path); |
673 int l = __stringSize(path); |
665 |
674 |
666 if (l < (sizeof(pattern)-4)) { |
675 if (l < (MAXPATHLEN-4)) { |
667 strncpy(pattern, __stringVal(path), l); |
676 strncpy(uP.pattern, __stringVal(path), l); |
668 strcpy(pattern+l, "\\*"); |
677 strcpy(uP.pattern+l, "\\*"); |
669 |
678 |
670 do { |
679 do { |
671 __threadErrno = 0; |
680 __threadErrno = 0; |
672 d = STX_API_CALL2( "FindFirstFile", FindFirstFile, pattern, &data ); |
681 d = STX_API_CALL2( "FindFirstFile", FindFirstFile, uP.pattern, &uD.data ); |
673 } while ((d < 0) && (__threadErrno == EINTR)); |
682 } while ((d < 0) && (__threadErrno == EINTR)); |
674 |
683 |
675 if (d == INVALID_HANDLE_VALUE) { |
684 if (d == INVALID_HANDLE_VALUE) { |
676 __INST(lastErrorNumber) = __mkSmallInteger(GetLastError()); |
685 __INST(lastErrorNumber) = __mkSmallInteger(GetLastError()); |
677 } else { |
686 } else { |
678 dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp); |
687 dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp); |
679 entry = __MKSTRING( data.cFileName ); |
688 entry = __MKSTRING( uD.data.cFileName ); |
680 ok = true; |
689 ok = true; |
681 } |
690 } |
682 } |
691 } |
683 } |
692 } |
|
693 else if (__isUnicode16String(path)) { |
|
694 int l = __unicode16StringSize(path); |
|
695 int i; |
|
696 |
|
697 if (l < (MAXPATHLEN-4)) { |
|
698 for (i=0; i<l; i++) { |
|
699 uP.wpattern[i] = __unicode16StringVal(path)[i]; |
|
700 } |
|
701 uP.wpattern[i++] = '\\'; |
|
702 uP.wpattern[i++] = '*'; |
|
703 uP.wpattern[i] = 0; |
|
704 |
|
705 do { |
|
706 __threadErrno = 0; |
|
707 d = STX_API_CALL2( "FindFirstFileW", FindFirstFileW, uP.wpattern, &uD.wdata ); |
|
708 } while ((d < 0) && (__threadErrno == EINTR)); |
|
709 |
|
710 if (d == INVALID_HANDLE_VALUE) { |
|
711 __INST(lastErrorNumber) = __mkSmallInteger(GetLastError()); |
|
712 } else { |
|
713 dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp); |
|
714 entry = __MKU16STRING( uD.wdata.cFileName ); |
|
715 ok = true; |
|
716 } |
|
717 } |
|
718 } |
684 } |
719 } |
685 # endif |
720 # endif |
686 #endif |
721 #endif |
687 %}. |
722 %}. |
688 ok isNil ifTrue:[ |
723 ok isNil ifTrue:[ |
689 " |
724 " |
690 opendir not avalable - use slower pipe |
725 opendir not avalable - use slower pipe |
691 " |
726 " |
692 ^ PipeStream readingFrom:('cd ' , pathName , '; ls -a') |
727 ^ PipeStream readingFrom:('cd ' , pathName , '; ls -a') |
693 ]. |
728 ]. |
694 |
729 |
695 (ok == true) ifTrue:[ |
730 (ok == true) ifTrue:[ |
696 Lobby register:self. |
731 Lobby register:self. |
697 entry isNil ifTrue:[ |
732 entry isNil ifTrue:[ |
698 self nextLine. "read 1st entry into readAheadEntry buffer" |
733 self nextLine. "read 1st entry into readAheadEntry buffer" |
699 ] ifFalse:[ |
734 ] ifFalse:[ |
700 readAheadEntry := entry. |
735 readAheadEntry := entry. |
701 ]. |
736 ]. |
702 ^ self |
737 ^ self |
703 ]. |
738 ]. |
704 dirPointer notNil ifTrue:[^ self errorAlreadyOpen]. |
739 dirPointer notNil ifTrue:[^ self errorAlreadyOpen]. |
705 lastErrorNumber notNil ifTrue:[^ self openError]. |
740 lastErrorNumber notNil ifTrue:[^ self openError]. |
706 ^ nil |
741 ^ nil |
707 ! |
742 ! |