# \[Bug #1919\] sparc-solaris-2.10 $B$G(B 1.9.2-preview1 $B$,%S%k%I$G$-$J$$(B

**URL:** <https://www.ruby-forum.com/t/bug-1919-sparc-solaris-2-10-b-g-b-1-9-2-preview1-b-s-k-i-g-j-b/173536>\
**Category:** Development\
**Created:** [August 11, 2009, 5:53am UTC](https://www.ruby-forum.com/t/bug-1919-sparc-solaris-2-10-b-g-b-1-9-2-preview1-b-s-k-i-g-j-b/173536 "2009-08-11T05:53:34Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Naohisa\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/f4b2a3/32.png) [@Naohisa\_G](https://www.ruby-forum.com/u/Naohisa_G)\
**Post date:** [August 11, 2009, 5:53am UTC](https://www.ruby-forum.com/t/bug-1919-sparc-solaris-2-10-b-g-b-1-9-2-preview1-b-s-k-i-g-j-b/173536/1 "2009-08-11T05:53:34Z")

</div>

e$B%A%1%C%He(B #1919 e$B$,99?7$5$l$^$7$?!#e(B (by Naohisa G.)

e$B%U%!%$%ke(B config.h e$BDI2Ce(B

Solaris e$B$Ne(B readdir\_r e$B$K$D$$$FD4$Y$F$\_$?$H$3$m!"e(B  
“readdir\_r considered harmful”  
[http://womble.decadentplace.org.uk/readdir\_r-advisory.html](http://womble.decadentplace.org.uk/readdir_r-advisory.html)  
e$B$H$$$&J8\>O$r8+$D$1$^$7$?!#$3$l$K$h$k$H!"e(B

> On Linux (with glibc) and most versions of Unix, struct dirent  
> is large enough to hold maximum-length names from most filesystems,  
> so this is safe (though \> wasteful). This is not true of Solaris  
> and BeOS, where the d\_name member is an array of length 1.

e$B$H$N$3$H$G$7$?!#$I$&$d$ie(B Solaris e$B$G$O!“e(Bstruct dirent entry  
e$B$N%a%b%j$re(B  
e$B3NJ]$9$k:]!”%U%!%$%kL\>$ND9$5$r9MN8$KF~$l$?==J,$JD9$5$r\<+A0$G3NJ]$9$ke(B  
e$BI,MW$,$"$k$h$&$G$9!#e(B

> e$B$3$l$G$I$&$G$7$g$&$+!#e(B

config.h e$B$r\<($9$N$rK:$l$F$$$^$7$?!#e(B  
1.9.2-preview1e$B$N\>l9g$Ne(Bconfig.he$B$re(Bredminee$B\>e$K$FE:IU$7$^$9!#e(B  
autoconf (e$B%P!\<%8%g%se(B 2.61 e$B$r;HMQe(B)e$B$,\<+F0E\*$Ke(B  
#define \_POSIX\_PTHREAD\_SEMANTICS 1  
e$B$rDI2C$7$F$/$l$F$$$?$h$&$G$9!#e(B

e$B%Q%C%A$bG0$N$?$a;n$7$^$7$?$,!"$d$O$j%@%a$G$7$?!#e(B  
e$B$3$N\>l9g$Ne(B config.h e$B$N\<B\<AE\*$JJQ99E@$O!"E:IU$N$b$N$+$ie(B  
#define \_ALL\_SOURCE 1  
e$B$N9T$,H4$1$?$@$1$G$7$?!#e(B

* * *

[http://redmine.ruby-lang.org/issues/show/1919](http://redmine.ruby-lang.org/issues/show/1919)

---

<div class="post-metadata">

**Author:** ![Naohisa\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/f4b2a3/32.png) [@Naohisa\_G](https://www.ruby-forum.com/u/Naohisa_G)\
**Post date:** [August 19, 2009, 3:43pm UTC](https://www.ruby-forum.com/t/bug-1919-sparc-solaris-2-10-b-g-b-1-9-2-preview1-b-s-k-i-g-j-b/173536/2 "2009-08-19T15:43:42Z")

</div>

e$B8eF#$H$$$$$^$9!#\<+8J%l%9$G$9!#e(B

On Tue, 11 Aug 2009 12:49:55 +0900  
Naohisa G. wrote:

> e$B$H$N$3$H$G$7$?!#$I$&$d$ie(B Solaris e$B$G$O!“e(Bstruct dirent entry e$B$N%a%b%j$re(B  
> e$B3NJ]$9$k:]!”%U%!%$%kL\>$ND9$5$r9MN8$KF~$l$?==J,$JD9$5$r\<+A0$G3NJ]$9$ke(B  
> e$BI,MW$,$"$k$h$&$G$9!#e(B

e$B$H$j$"$($:$O!"6&MQBN$K$7$FL5M}LpM}%a%b%j$r3NJ]$9$k$H!"e(Bmake  
e$B$ODL$j!"e(B  
make install e$B$G$-$^$7$?!#0J2\<$K%Q%C%A$rE:IU$7$^$9!#e(B

e$B$h$j@5$7$/$O!"\>e5-J8\>O$N$h$&$KKh2se(B fpathconf e$B$r8F$S=P$7$Fe(B  
e$B%U%!%$%kL\>$N:GBgD9$r\<hF@$7!"$=$l$r85$K%a%b%j$r3NJ]$9$kI,MW$,e(B  
e$B$"$k$N$@$H$O;W$$$^$9$,!"$H$j$"$($:$N%Q%C%A$G$9!#e(B

e$BAjJQ$o$i$:e(Bdle$B$N%F%9%H$O\<:GT$7$^$9$,!"e(Bdle$B$K$D$$$F$O!"JL%A%1%C%H$re(B  
e$B:n$j$?$$$H;W$$$^$9!#e(B

# Index: dir.c

— dir.c (revision 24578)  
+++ dir.c (working copy)  
@@ -491,6 +491,39 @@

# define IF\_HAVE\_READDIR\_R(something) /\* nothing \*/

#endif

+#if defined SIZEOF\_STRUCT\_DIRENT\_TOO\_SMALL  
+# include \<limits.h\>  
+# define NAME\_MAX\_FOR\_STRUCT\_DIRENT 255  
+# if defined NAME\_MAX  
+# if NAME\_MAX\_FOR\_STRUCT\_DIRENT \< NAME\_MAX  
+# undef NAME\_MAX\_FOR\_STRUCT\_DIRENT  
+# define NAME\_MAX\_FOR\_STRUCT\_DIRENT NAME\_MAX  
+# endif  
+# endif  
+# if defined \_POSIX\_NAME\_MAX  
+# if NAME\_MAX\_FOR\_STRUCT\_DIRENT \< \_POSIX\_NAME\_MAX  
+# undef NAME\_MAX\_FOR\_STRUCT\_DIRENT  
+# define NAME\_MAX\_FOR\_STRUCT\_DIRENT \_POSIX\_NAME\_MAX  
+# endif  
+# endif  
+# if defined \_XOPEN\_NAME\_MAX  
+# if NAME\_MAX\_FOR\_STRUCT\_DIRENT \< \_XOPEN\_NAME\_MAX  
+# undef NAME\_MAX\_FOR\_STRUCT\_DIRENT  
+# define NAME\_MAX\_FOR\_STRUCT\_DIRENT \_XOPEN\_NAME\_MAX  
+# endif  
+# endif  
+# define DEFINE\_STRUCT\_DIRENT \

- union { \
- struct dirent dirent; \
- char dummy[offsetof(struct dirent, d\_name) + \
- 

```
    NAME_MAX_FOR_STRUCT_DIRENT + 1]; \

```

- }  
+# define STRUCT\_DIRENT(entry) ((entry).dirent)  
+#else  
+# define DEFINE\_STRUCT\_DIRENT struct dirent  
+# define STRUCT\_DIRENT(entry) (entry)  
+#endif
- 

/\*

- call-seq:
- 

```
dir.read => string or nil

```

@@ -508,11 +541,11 @@  
{  
struct dir\_data \*dirp;  
struct dirent \*dp;

- IF\_HAVE\_READDIR\_R(struct dirent entry);

- IF\_HAVE\_READDIR\_R(DEFINE\_STRUCT\_DIRENT entry);

- if (READDIR(dirp-\>dir, dirp-\>enc, &entry, dp)) {

- if (READDIR(dirp-\>dir, dirp-\>enc, &STRUCT\_DIRENT(entry), dp)) {  
return rb\_external\_str\_new\_with\_enc(dp-\>d\_name, NAMLEN(dp),  
dirp-\>enc);  
}  
else if (errno == 0) { /\* end of stream \*/  
@@ -546,12 +579,12 @@  
{  
struct dir\_data \*dirp;  
struct dirent \*dp;

- IF\_HAVE\_READDIR\_R(struct dirent entry);

- IF\_HAVE\_READDIR\_R(DEFINE\_STRUCT\_DIRENT entry);

- while (READDIR(dirp-\>dir, dirp-\>enc, &entry, dp)) {

- while (READDIR(dirp-\>dir, dirp-\>enc, &STRUCT\_DIRENT(entry), dp)) {  
rb\_yield(rb\_external\_str\_new\_with\_enc(dp-\>d\_name, NAMLEN(dp),  
dirp-\>enc));  
if (dirp-\>dir == NULL) dir\_closed();  
}  
@@ -1270,11 +1303,11 @@  
if (magical || recursive) {  
struct dirent \*dp;  
DIR \*dirp;

- IF\_HAVE\_READDIR\_R(struct dirent entry);

- IF\_HAVE\_READDIR\_R(DEFINE\_STRUCT\_DIRENT entry);  
dirp = do\_opendir(\*path ? path : “.”, flags);  
if (dirp == NULL) return 0;

- while (READDIR(dirp, enc, &entry, dp)) {

- while (READDIR(dirp, enc, &STRUCT\_DIRENT(entry), dp)) {  
char \*buf = join\_path(path, dirsep, dp-\>d\_name);  
enum answer new\_isdir = UNKNOWN;

# Index: configure.in

— configure.in (revision 24578)  
+++ configure.in (working copy)  
@@ -750,6 +750,10 @@  
esac

case “$target\_os” in  
+when(solaris\*)

- AC\_DEFINE(SIZEOF\_STRUCT\_DIRENT\_TOO\_SMALL, 1)
- LIBS="-lm $LIBS"
- ;;  
when(nextstep\*) ;;  
when(openstep\*) ;;  
when(rhapsody\*) ;;

---

<div class="post-metadata">

**Author:** ![Naohisa\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/f4b2a3/32.png) [@Naohisa\_G](https://www.ruby-forum.com/u/Naohisa_G)\
**Post date:** [August 19, 2009, 6:10pm UTC](https://www.ruby-forum.com/t/bug-1919-sparc-solaris-2-10-b-g-b-1-9-2-preview1-b-s-k-i-g-j-b/173536/3 "2009-08-19T18:10:03Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:39132] Re: [Bug #1919] sparc-solaris-2.10  
e$B$Ge(B 1.9.2-preview1 e$B$,%S%k%I$G$-$J$$e(B”  
on Wed, 19 Aug 2009 22:42:58 +0900, Naohisa GOTO  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

|\> Solaris e$B$Ne(B readdir\_r e$B$K$D$$$FD4$Y$F$\_$?$H$3$m!“e(B  
|\> “readdir\_r considered harmful”  
|\> [http://womble.decadentplace.org.uk/readdir\_r-advisory.html](http://womble.decadentplace.org.uk/readdir_r-advisory.html)  
|\> e$B$H$$$&J8\>O$r8+$D$1$^$7$?!#$3$l$K$h$k$H!“e(B  
|\>  
|\> \> On Linux (with glibc) and most versions of Unix, struct dirent  
|\> \> is large enough to hold maximum-length names from most filesystems,  
|\> \> so this is safe (though \> wasteful). This is not true of Solaris  
|\> \> and BeOS, where the d\_name member is an array of length 1.  
|\>  
|\> e$B$H$N$3$H$G$7$?!#$I$&$d$ie(B Solaris e$B$G$O!“e(Bstruct dirent entry e$B$N%a%b%j$re(B  
|\> e$B3NJ]$9$k:]!”%U%!%$%kL\>$ND9$5$r9MN8$KF~$l$?==J,$JD9$5$r\<+A0$G3NJ]$9$ke(B  
|\> e$BI,MW$,$”$k$h$&$G$9!#e(B  
|  
|e$B$H$j$”$($:$O!"6&MQBN$K$7$FL5M}LpM}%a%b%j$r3NJ]$9$k$H!"e(Bmake e$B$ODL$j!"e(B  
|make install e$B$G$-$^$7$?!#0J2\<$K%Q%C%A$rE:IU$7$^$9!#e(B

e$B$"$j$,$H$&$4$6$$$^$9!#\<h$j9~$\_$^$9!#e(Bfpathconfe$B$r;H$C$?%Q%C%Ae(B  
e$B$,Ds6!$5$l$l$P$=$l$b9MN8$7$^$9!#e(B
