Fix build on Solaris 10.
[ircu2.10.12-pk.git] / ircd / os_generic.c
index f72bbe900bede427e86a6a9c2b2c47bc4d9c5b28..ff56fce7f263bddbdfa06d62ca44e109a2b388d1 100644 (file)
  */
 #include "config.h"
 
-#define _XOPEN_SOURCE  500 /**< make limits.h #define IOV_MAX */
-#define __EXTENSIONS__  1   /**< make Solaris netinet/in.h know IPv6 */
+#ifdef IRCU_SOLARIS
+/* Solaris requires C99 support for SUSv3, but C99 support breaks other
+ * parts of the build.  So fall back to SUSv2, but request IPv6 support
+ * by defining __EXTENSIONS__.
+ */
+#define _XOPEN_SOURCE   500
+#define __EXTENSIONS__  1
+#else
+/* FreeBSD 6.0 requires SUSv3 to support IPv6.  Apparently some other
+ * OS requires SUSv3 to define IOV_MAX, but its identity is lost for
+ * the time being.
+ */
+#define _XOPEN_SOURCE   600
+#endif
 
 #include "ircd_osdep.h"
 #include "msgq.h"
 #define getrusage(a,b) syscall(SYS_GETRUSAGE, a, b)
 #endif
 
+
+static void sockaddr_in_to_irc(const struct sockaddr_in *v4,
+                               struct irc_sockaddr *irc)
+{
+    memset(&irc->addr, 0, 5*sizeof(int16_t));
+    irc->addr.in6_16[5] = 0xffff;
+    memcpy(&irc->addr.in6_16[6], &v4->sin_addr, sizeof(v4->sin_addr));
+    irc->port = ntohs(v4->sin_port);
+}
+
+
 #ifdef IPV6
 /** Native socket address type. */
 #define sockaddr_native sockaddr_in6
@@ -86,11 +109,7 @@ void sockaddr_to_irc(const struct sockaddr_in6 *v6, struct irc_sockaddr *irc)
         irc->port = ntohs(v6->sin6_port);
     }
     else if (v6->sin6_family == AF_INET) {
-        const struct sockaddr_in *v4 = (const struct sockaddr_in*)v6;
-        memset(&irc->addr, 0, 5*sizeof(int16_t));
-        irc->addr.in6_16[5] = 0xffff;
-        memcpy(&irc->addr.in6_16[6], &v4->sin_addr, sizeof(v4->sin_addr));
-        irc->port = ntohs(v4->sin_port);
+        sockaddr_in_to_irc((struct sockaddr_in *)v6, irc);
     }
     else assert(0 && "Unhandled native address family");
 }
@@ -136,14 +155,7 @@ int sockaddr_from_irc(struct sockaddr_in6 *v6, const struct irc_sockaddr *irc, i
 #else
 #define sockaddr_native sockaddr_in
 #define sn_family sin_family
-
-void sockaddr_to_irc(const struct sockaddr_in *v4, struct irc_sockaddr *irc)
-{
-    assert(v4->sin_family == AF_INET);
-    memset(&irc->addr, 0, 6*sizeof(irc->addr.in6_16[0]));
-    memcpy(&irc->addr.in6_16[6], &v4->sin_addr, sizeof(v4->sin_addr));
-    irc->port = ntohs(v4->sin_port);
-}
+#define sockaddr_to_irc sockaddr_in_to_irc
 
 int sockaddr_from_irc(struct sockaddr_in *v4, const struct irc_sockaddr *irc, int compat_fd)
 {
@@ -162,14 +174,8 @@ int sockaddr_from_irc(struct sockaddr_in *v4, const struct irc_sockaddr *irc, in
 
 #endif
 
-/*
- * This is part of the STATS replies. There is no offical numeric for this
- * since this isnt an official command, in much the same way as HASH isnt.
- * It is also possible that some systems wont support this call or have
- * different field names for "struct rusage".
- * -avalon
- */
-/** Send resource usage information to a client.
+#ifdef DEBUGMODE
+/** Send resource usage information to an enumerator function.
  * @param[in] cptr Client requesting information.
  * @param[in] uptime Wall time in seconds since the server started.
  * @param[in] enumerator Function to call to send a line to \a cptr.
@@ -262,6 +268,7 @@ int os_get_rusage(struct Client *cptr, int uptime, EnumFn enumerator)
 #endif /* HAVE_GETRUSAGE */
   return 1;
 }
+#endif
 
 /** Look up the most recent socket error for a socket file descriptor.
  * @param[in] fd File descriptor to check.