Hi,
This patch fixes 4 problems which prevented the VM from building on Solaris/SPARC. They shouldn't cause problems for other platforms (famous last words), so please would someone (Ian?) confirm this before checking in.
The problems fixed by this patch are:
1. "sun" is already defined by some header or other in Solaris; I've changed it to s_un. 2. AF_LOCAL isn't defined on Solaris. W Richard Stevens' "Advanced programming in the Unix environment" says that AF_UNIX is more standard anyway. 3. Solaris' feof() call really wants a FILE*. 4. A missing prototype is added for sound_AvailableSpace(void)
With this patch, the VM builds and runs fine if built with gcc-3.4.3. I've checked both the stock 3.9a-7024 image as well as the etoys image. (My motivation for this whole exercise is to fix the problems with audio under Solaris for my young daughter to use etoys: the first sound plays, but after that, no sounds ever play.)
With gcc-4.2.1 and -O2, the VM won't even start up (complains about a missing vm-display-X11, even though it's there). With gcc-4.2.1 and no -O2, the VM starts, runs for a short while, and then cores with a bus error. gdb shows a corrupt stack. I'm about to build gcc-4.1.2 and give it a spin building the VM to try to track this down. But I do suspect bad code generation with gcc-4.2.1.
Thanks, Andrew
Index: platforms/unix/plugins/SocketPlugin/sqUnixSocket.c =================================================================== --- platforms/unix/plugins/SocketPlugin/sqUnixSocket.c (revision 1762) +++ platforms/unix/plugins/SocketPlugin/sqUnixSocket.c (working copy) @@ -149,7 +149,7 @@ union sockaddr_any { struct sockaddr sa; - struct sockaddr_un sun; + struct sockaddr_un s_un; struct sockaddr_in sin; struct sockaddr_in6 sin6; }; @@ -533,7 +533,7 @@ switch (domain) { case 0: domain= AF_INET; break; /* SQ_SOCKET_DOMAIN_UNSPECIFIED */ - case 1: domain= AF_LOCAL; break; /* SQ_SOCKET_DOMAIN_LOCAL */ + case 1: domain= AF_UNIX; break; /* SQ_SOCKET_DOMAIN_LOCAL */ case 2: domain= AF_INET; break; /* SQ_SOCKET_DOMAIN_INET4 */ case 3: domain= AF_INET6; break; /* SQ_SOCKET_DOMAIN_INET6 */ } @@ -1563,16 +1563,16 @@ struct stat st; if ((0 == stat(servName, &st)) && (st.st_mode & S_IFSOCK)) { - struct sockaddr_un *sun= calloc(1, sizeof(struct sockaddr_un)); + struct sockaddr_un *s_un= calloc(1, sizeof(struct sockaddr_un)); localInfo= (struct addrinfo *)calloc(1, sizeof(struct addrinfo)); - localInfo->ai_family= AF_LOCAL; + localInfo->ai_family= AF_UNIX; localInfo->ai_socktype= SOCK_STREAM; localInfo->ai_addrlen= sizeof(struct sockaddr_un); - localInfo->ai_addr= (struct sockaddr *)sun; - /*sun->sun_len= sizeof(struct sockaddr_un);*/ - sun->sun_family= AF_LOCAL; - memcpy(sun->sun_path, servName, servSize); - sun->sun_path[servSize]= '\0'; + localInfo->ai_addr= (struct sockaddr *)s_un; + /*s_un->sun_len= sizeof(struct sockaddr_un);*/ + s_un->sun_family= AF_UNIX; + memcpy(s_un->sun_path, servName, servSize); + s_un->sun_path[servSize]= '\0'; addrInfo= localInfo; interpreterProxy->signalSemaphoreWithIndex(resolverSema); return; @@ -1586,7 +1586,7 @@
switch (family) { - case SQ_SOCKET_FAMILY_LOCAL: request.ai_family=AF_LOCAL; break; + case SQ_SOCKET_FAMILY_LOCAL: request.ai_family=AF_UNIX; break; case SQ_SOCKET_FAMILY_INET4: request.ai_family=AF_INET; break; case SQ_SOCKET_FAMILY_INET6: request.ai_family=AF_INET6; break; } @@ -1657,7 +1657,7 @@ fprintf(stderr, " "); switch (addr->sa_family) { - case AF_LOCAL: fprintf(stderr, "local\n"); break; + case AF_UNIX: fprintf(stderr, "local\n"); break; case AF_INET: fprintf(stderr, "inet\n"); break; case AF_INET6: fprintf(stderr, "inet6\n"); break; default: fprintf(stderr, "?\n"); break; @@ -1698,7 +1698,7 @@
switch (addrInfo->ai_family) { - case AF_LOCAL: return SQ_SOCKET_FAMILY_LOCAL; + case AF_UNIX: return SQ_SOCKET_FAMILY_LOCAL; case AF_INET: return SQ_SOCKET_FAMILY_INET4; case AF_INET6: return SQ_SOCKET_FAMILY_INET6; } Index: platforms/unix/src/plugins/UnixOSProcessPlugin/UnixOSProcessPlugin.c =================================================================== --- platforms/unix/src/plugins/UnixOSProcessPlugin/UnixOSProcessPlugin.c (revision 1762) +++ platforms/unix/src/plugins/UnixOSProcessPlugin/UnixOSProcessPlugin.c (working copy) @@ -1818,7 +1818,7 @@ return interpreterProxy->primitiveFail(); } sqFile = interpreterProxy->arrayValueOf(sqFileOop); - if ((feof(sqFile->file)) == 0) { + if ((feof((FILE*)(sqFile->file))) == 0) { result = interpreterProxy->falseObject(); } else { result = interpreterProxy->trueObject(); Index: platforms/unix/vm-sound-Sun/sqUnixSoundSun.c =================================================================== --- platforms/unix/vm-sound-Sun/sqUnixSoundSun.c (revision 1762) +++ platforms/unix/vm-sound-Sun/sqUnixSoundSun.c (working copy) @@ -55,6 +55,7 @@ #endif
static int sound_Stop(void); +static int sound_AvailableSpace(void);
static int auFd= -1; /* open on /dev/dsp */ static int fmtStereo= 0; /* whether we are playing in stereo or not */