Apart from the lack of wait4, libgo on IRIX 6.5 contained an undefined
reference to strerror_r.  This patch provides a replacement, based on
gnulib/lib/strerror_r.c, but massively simplified.

This allowed me to link with libgo, and has been tested on
i386-pc-solaris2.11 with the result of the configure test manually
inverted.

        Rainer


2011-01-30  Rainer Orth  <r...@cebitec.uni-bielefeld.de>

        PR go/47515
        * configure.ac: Check for strerror_r.
        * configure: Regenerate.
        * config.h.in: Regenerate.
        * syscalls/strerror_r.c: New file.
        * Makefile.am (go_syscall_c_files): Use it.
        (syscalls/strerror_r.lo): New target.
        * Makefile.in: Regenerate.

diff -r 4fb11b32a76a libgo/Makefile.am
--- a/libgo/Makefile.am Sat Mar 19 10:51:23 2011 +0100
+++ b/libgo/Makefile.am Sat Mar 19 21:55:54 2011 +0100
@@ -1301,7 +1309,8 @@
        sysinfo.go \
        syscall_arch.go
 go_syscall_c_files = \
-       syscalls/errno.c
+       syscalls/errno.c \
+       syscalls/strerror_r.c
 
 if LIBGO_IS_LINUX
 # os_lib_inotify_lo = os/inotify.lo
@@ -2511,6 +2520,8 @@
        $(BUILDPACKAGE)
 syscalls/errno.lo: $(go_syscall_c_files) syscalls/syscall.lo
        $(LTCOMPILE) -c -o $@ $(srcdir)/syscalls/errno.c
+syscalls/strerror_r.lo: $(go_syscall_c_files) syscalls/syscall.lo
+       $(LTCOMPILE) -c -o $@ $(srcdir)/syscalls/strerror_r.c
 
 # How to build a .gox file from a .lo file.
 BUILDGOX = \
diff -r 4fb11b32a76a libgo/configure.ac
--- a/libgo/configure.ac        Sat Mar 19 10:51:23 2011 +0100
+++ b/libgo/configure.ac        Sat Mar 19 21:55:54 2011 +0100
@@ -380,7 +392,7 @@
 
 AC_CHECK_HEADERS(sys/mman.h syscall.h sys/epoll.h sys/ptrace.h sys/syscall.h 
sys/user.h sys/utsname.h)
 AM_CONDITIONAL(HAVE_SYS_MMAN_H, test "$ac_cv_header_sys_mman_h" = yes)
-AC_CHECK_FUNCS(srandom random strsignal)
+AC_CHECK_FUNCS(srandom random strerror_r strsignal)
 
 AC_CACHE_CHECK([for __sync_bool_compare_and_swap_4],
 [libgo_cv_func___sync_bool_compare_and_swap_4],
diff -r 4fb11b32a76a libgo/syscalls/strerror_r.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/libgo/syscalls/strerror_r.c       Sat Mar 19 21:55:54 2011 +0100
@@ -0,0 +1,38 @@
+/* strerror_r.c -- strerror_r replacement for systems with strerror only
+
+   Copyright 2011 The Go Authors. All rights reserved.
+   Use of this source code is governed by a BSD-style
+   license that can be found in the LICENSE file.  */
+
+#include "config.h"
+#ifndef HAVE_STRERROR_R
+#include <errno.h>
+#include <string.h>
+#include <pthread.h>
+
+/* This lock protects the buffer returned by strerror().  We assume that
+   no other uses of strerror() exist in the program.  */
+static pthread_mutex_t strerror_lock = PTHREAD_MUTEX_INITIALIZER;;
+
+int
+strerror_r (int errnum, char *buf, size_t buflen)
+{
+  char *errmsg = strerror (errnum);
+  size_t len = strlen (errmsg);
+  int ret;
+
+  pthread_mutex_lock (&strerror_lock);
+
+  if (len < buflen)
+    {
+      memcpy (buf, errmsg, len + 1);
+      ret = 0;
+    }
+  else
+    ret = ERANGE;
+
+  pthread_mutex_unlock (&strerror_lock);
+
+  return ret;
+}
+#endif /* HAVE_STRERROR_R */

-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University

Reply via email to