The CI, now with gcc 14, reports a compilation error on Solaris 11 OmniOS:
In file included from ../../gltests/test-accept.c:21:
../../gltests/test-accept.c:22:18: error: initialization of 'int (*)(int,
struct sockaddr *, socklen_t *)' {aka 'int (*)(int, struct sockaddr *,
unsigned int *)'} from incompatible pointer type 'int (*)(int, struct sockaddr
* restrict, void *)' [-Wincompatible-pointer-types]
22 | SIGNATURE_CHECK (accept, int, (int, struct sockaddr *, socklen_t *));
| ^~~~~~
With older gcc versions, I see these warnings:
../../gltests/test-accept.c:22:18: warning: initialization of 'int (*)(int,
struct sockaddr *, socklen_t *)' {aka 'int (*)(int, struct sockaddr *,
unsigned int *)'} from incompatible pointer type 'int (*)(int, struct sockaddr
* restrict, void *)' [-Wincompatible-pointer-types]
../../gltests/test-gethostname.c:24:18: warning: initialization of 'int
(*)(char *, size_t)' {aka 'int (*)(char *, long unsigned int)'} from
incompatible pointer type 'int (*)(char *, int)' [-Wincompatible-pointer-types]
../../gltests/test-getpeername.c:22:18: warning: initialization of 'int
(*)(int, struct sockaddr *, socklen_t *)' {aka 'int (*)(int, struct sockaddr
*, unsigned int *)'} from incompatible pointer type 'int (*)(int, struct
sockaddr * restrict, void *)' [-Wincompatible-pointer-types]
../../gltests/test-getsockname.c:22:18: warning: initialization of 'int
(*)(int, struct sockaddr *, socklen_t *)' {aka 'int (*)(int, struct sockaddr
*, unsigned int *)'} from incompatible pointer type 'int (*)(int, struct
sockaddr * restrict, void *)' [-Wincompatible-pointer-types]
../../gltests/test-getsockopt.c:22:18: warning: initialization of 'int (*)(int,
int, int, void *, socklen_t *)' {aka 'int (*)(int, int, int, void *,
unsigned int *)'} from incompatible pointer type 'int (*)(int, int, int,
void * restrict, void *)' [-Wincompatible-pointer-types]
../../gltests/test-recvfrom.c:22:18: warning: initialization of 'ssize_t
(*)(int, void *, size_t, int, struct sockaddr *, socklen_t *)' {aka 'long
int (*)(int, void *, long unsigned int, int, struct sockaddr *, unsigned int
*)'} from incompatible pointer type 'ssize_t (*)(int, void * restrict,
size_t, int, struct sockaddr * restrict, void *)' {aka 'long int (*)(int,
void * restrict, long unsigned int, int, struct sockaddr * restrict, void
*)'} [-Wincompatible-pointer-types]
It's not worth working around these declarations (that are wrong w.r.t. POSIX),
because hardly anyone uses these functions through function pointers.
So, let me just document the problem and avoid a compilation error:
2025-01-24 Bruno Haible <[email protected]>
tests: Fix a few compilation errors on Solaris 11 OmniOS with gcc 14.
* tests/test-accept.c: Omit the signature check on Solaris.
* tests/test-gethostname.c: Likewise.
* tests/test-getpeername.c: Likewise.
* tests/test-getsockname.c: Likewise.
* tests/test-getsockopt.c: Likewise.
* tests/test-recvfrom.c: Likewise.
* doc/posix-functions/accept.texi: Mention the Solaris 11 OmniOS
problem.
* doc/posix-functions/gethostname.texi: Likewise.
* doc/posix-functions/getpeername.texi: Likewise.
* doc/posix-functions/getsockname.texi: Likewise.
* doc/posix-functions/getsockopt.texi: Likewise.
* doc/posix-functions/recvfrom.texi: Likewise.
diff --git a/doc/posix-functions/accept.texi b/doc/posix-functions/accept.texi
index d89de215d1..61bcc7fd4f 100644
--- a/doc/posix-functions/accept.texi
+++ b/doc/posix-functions/accept.texi
@@ -38,5 +38,5 @@
@item
On some platforms, this function's third argument type is @samp{void *},
not @samp{socklen_t *}:
-Solaris 10.
+Solaris 10, Solaris 11 OmniOS.
@end itemize
diff --git a/doc/posix-functions/gethostname.texi
b/doc/posix-functions/gethostname.texi
index 73df5bd0bf..0c105e1c29 100644
--- a/doc/posix-functions/gethostname.texi
+++ b/doc/posix-functions/gethostname.texi
@@ -23,7 +23,7 @@
@item
This function's second argument type is @code{int} instead of @code{size_t}
on some platforms:
-Solaris 10.
+Solaris 10, Solaris 11 OmniOS.
@item
If the given buffer is too small for the host name, some implementations
fail with @code{EINVAL}, instead of returning a truncated host name.
diff --git a/doc/posix-functions/getpeername.texi
b/doc/posix-functions/getpeername.texi
index a53c059dd9..d9c8daa55f 100644
--- a/doc/posix-functions/getpeername.texi
+++ b/doc/posix-functions/getpeername.texi
@@ -30,4 +30,8 @@
@item
Some platforms don't have a @code{socklen_t} type; in this case this function's
third argument type is @samp{int *}.
+@item
+On some platforms, this function's third argument type is @samp{void *},
+not @samp{socklen_t *}:
+Solaris 11 OmniOS.
@end itemize
diff --git a/doc/posix-functions/getsockname.texi
b/doc/posix-functions/getsockname.texi
index 1e6c3981a2..a254da1096 100644
--- a/doc/posix-functions/getsockname.texi
+++ b/doc/posix-functions/getsockname.texi
@@ -30,4 +30,8 @@
@item
Some platforms don't have a @code{socklen_t} type; in this case this function's
third argument type is @samp{int *}.
+@item
+On some platforms, this function's third argument type is @samp{void *},
+not @samp{socklen_t *}:
+Solaris 11 OmniOS.
@end itemize
diff --git a/doc/posix-functions/getsockopt.texi
b/doc/posix-functions/getsockopt.texi
index 41af61beee..8835303d1f 100644
--- a/doc/posix-functions/getsockopt.texi
+++ b/doc/posix-functions/getsockopt.texi
@@ -33,5 +33,9 @@
Some platforms don't have a @code{socklen_t} type; in this case this function's
fifth argument type is @samp{int *}.
@item
+On some platforms, this function's fifth argument type is @samp{void *},
+not @samp{socklen_t *}:
+Solaris 11 OmniOS.
+@item
Many socket options are not available on all platforms.
@end itemize
diff --git a/doc/posix-functions/recvfrom.texi
b/doc/posix-functions/recvfrom.texi
index 6edddbebdb..5ca7b525e7 100644
--- a/doc/posix-functions/recvfrom.texi
+++ b/doc/posix-functions/recvfrom.texi
@@ -30,4 +30,8 @@
@item
Some platforms don't have a @code{socklen_t} type; in this case this function's
sixth argument type is @samp{int *}.
+@item
+On some platforms, this function's sixth argument type is @samp{void *},
+not @samp{socklen_t *}:
+Solaris 11 OmniOS.
@end itemize
diff --git a/tests/test-accept.c b/tests/test-accept.c
index 01cb1984d8..2557d06e20 100644
--- a/tests/test-accept.c
+++ b/tests/test-accept.c
@@ -19,7 +19,9 @@
#include <sys/socket.h>
#include "signature.h"
+#if !defined __sun
SIGNATURE_CHECK (accept, int, (int, struct sockaddr *, socklen_t *));
+#endif
#include <errno.h>
#include <netinet/in.h>
diff --git a/tests/test-gethostname.c b/tests/test-gethostname.c
index f1822deb73..c10bdc5370 100644
--- a/tests/test-gethostname.c
+++ b/tests/test-gethostname.c
@@ -21,7 +21,9 @@
#include <unistd.h>
#include "signature.h"
+#if !defined __sun
SIGNATURE_CHECK (gethostname, int, (char *, size_t));
+#endif
/* Get HOST_NAME_MAX definition. */
#include <limits.h>
diff --git a/tests/test-getpeername.c b/tests/test-getpeername.c
index 97d4a57785..24db394f1e 100644
--- a/tests/test-getpeername.c
+++ b/tests/test-getpeername.c
@@ -19,7 +19,9 @@
#include <sys/socket.h>
#include "signature.h"
+#if !defined __sun
SIGNATURE_CHECK (getpeername, int, (int, struct sockaddr *, socklen_t *));
+#endif
#include <errno.h>
#include <netinet/in.h>
diff --git a/tests/test-getsockname.c b/tests/test-getsockname.c
index 9c75a43ce2..b5ad73a5d2 100644
--- a/tests/test-getsockname.c
+++ b/tests/test-getsockname.c
@@ -19,7 +19,9 @@
#include <sys/socket.h>
#include "signature.h"
+#if !defined __sun
SIGNATURE_CHECK (getsockname, int, (int, struct sockaddr *, socklen_t *));
+#endif
#include <stdio.h>
#include <string.h>
diff --git a/tests/test-getsockopt.c b/tests/test-getsockopt.c
index 34698fd9db..0a8254ca06 100644
--- a/tests/test-getsockopt.c
+++ b/tests/test-getsockopt.c
@@ -19,7 +19,9 @@
#include <sys/socket.h>
#include "signature.h"
+#if !defined __sun
SIGNATURE_CHECK (getsockopt, int, (int, int, int, void *, socklen_t *));
+#endif
#include <errno.h>
#include <unistd.h>
diff --git a/tests/test-recvfrom.c b/tests/test-recvfrom.c
index ccf606cba4..8bb839d87b 100644
--- a/tests/test-recvfrom.c
+++ b/tests/test-recvfrom.c
@@ -19,9 +19,10 @@
#include <sys/socket.h>
#include "signature.h"
+#if !defined __sun
SIGNATURE_CHECK (recvfrom, ssize_t,
- (int, void *, size_t, int,
- struct sockaddr *, socklen_t *));
+ (int, void *, size_t, int, struct sockaddr *, socklen_t *));
+#endif
#include <errno.h>
#include <netinet/in.h>