fix eglibc compatibility
authorFelix Fietkau <nbd@openwrt.org>
Fri, 10 Apr 2015 19:47:22 +0000 (21:47 +0200)
committerFelix Fietkau <nbd@openwrt.org>
Fri, 10 Apr 2015 19:47:22 +0000 (21:47 +0200)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
CMakeLists.txt
clnt_perror.c
compat.h [deleted file]
create_xid.c
getrpcent.c
rcmd.c
rpc/compat.h [new file with mode: 0644]
rpc/netdb.h
rpc/types.h
rpc_thread.c

index e82217e798b619f25fe74506bdb74797687cd15e..dbb31c516c0480efad1947247335861723582f14 100644 (file)
@@ -1,7 +1,7 @@
 cmake_minimum_required(VERSION 2.6)
 
 PROJECT(rpc C)
-ADD_DEFINITIONS(-Os -Wall --std=gnu99 -g3 -I. -include compat.h)
+ADD_DEFINITIONS(-Os -Wall --std=gnu99 -g3 -I. -include rpc/compat.h)
 
 FILE(GLOB SOURCES *.c)
 
index 8dbae729ff30c6174155deda86f5eeb5add6dadf..aceb535a9fbf1a99dad840891b49ccacbadc5a36 100644 (file)
@@ -246,7 +246,7 @@ clnt_sperror (CLIENT * rpch, const char *msg)
 
     case RPC_CANTSEND:
     case RPC_CANTRECV:
-      __glibc_strerror_r (e.re_errno, chrbuf, sizeof chrbuf);
+      strerror_r (e.re_errno, chrbuf, sizeof chrbuf);
       len = sprintf (str, "; errno = %s", chrbuf);
       str += len;
       break;
@@ -336,7 +336,7 @@ clnt_spcreateerror (const char *msg)
       (void) strcpy(cp, " - ");
       cp += strlen(cp);
 
-      __glibc_strerror_r (ce->cf_error.re_errno, chrbuf, sizeof chrbuf);
+      strerror_r (ce->cf_error.re_errno, chrbuf, sizeof chrbuf);
       (void) strcpy(cp, chrbuf);
       cp += strlen(cp);
       break;
diff --git a/compat.h b/compat.h
deleted file mode 100644 (file)
index 6acf5ee..0000000
--- a/compat.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef __UCLIBC_COMPAT_H
-#define __UCLIBC_COMPAT_H
-
-#define _XOPEN_SOURCE
-#define _GNU_SOURCE
-
-#include <features.h>
-#include <errno.h>
-
-#undef __UCLIBC_HAS_THREADS__
-#include <bits/uClibc_mutex.h>
-#include <sys/poll.h>
-
-#if 0
-#undef __UCLIBC_MUTEX_LOCK
-#undef __UCLIBC_MUTEX_UNLOCK
-#define __UCLIBC_MUTEX_LOCK(M) pthread_mutex_lock(&(M))
-#define __UCLIBC_MUTEX_UNLOCK(M) pthread_mutex_unlock(&(M))
-#endif
-
-#define smallint int
-
-#define _(...) __VA_ARGS__
-#define internal_function
-#define attribute_hidden
-#define attribute_unused
-#define attribute_noreturn
-#define libc_hidden_def(...)
-
-#define __set_errno(_val) errno = _val
-
-#endif
index 3b4e8c08d3339d186b034fb29d802994bf80e3bd..1ba5f554d4aaf4a7f40b6acd875fd8e5b77bee06 100644 (file)
@@ -28,7 +28,6 @@
 
 /* The RPC code is not threadsafe, but new code should be threadsafe. */
 
-#include <bits/uClibc_mutex.h>
 __UCLIBC_MUTEX_STATIC(mylock, PTHREAD_MUTEX_INITIALIZER);
 
 static smallint is_initialized;
index de20d64d4726f950fc60a11c5c166abb569ac011..9da55627ec2d75830e8217660f077abea96c7db6 100644 (file)
@@ -257,7 +257,6 @@ static struct rpcent *interpret(register struct rpcdata *d)
 
 #if defined(__UCLIBC_HAS_REENTRANT_RPC__)
 
-#include <bits/uClibc_mutex.h>
 __UCLIBC_MUTEX_STATIC(mylock, PTHREAD_MUTEX_INITIALIZER);
 
 
diff --git a/rcmd.c b/rcmd.c
index fb1bd93208d0c7145be5e4ace360079aa85fb376..7712f87544002d7d0014b4f9ed19d476e420c2b2 100644 (file)
--- a/rcmd.c
+++ b/rcmd.c
@@ -85,7 +85,6 @@ static char sccsid[] = "@(#)rcmd.c    8.3 (Berkeley) 3/26/94";
 #include <wchar.h>
 #endif
 #include <sys/uio.h>
-#include <bits/uClibc_alloc.h>
 
 
 /* some forward declarations */
diff --git a/rpc/compat.h b/rpc/compat.h
new file mode 100644 (file)
index 0000000..de8b497
--- /dev/null
@@ -0,0 +1,53 @@
+#ifndef __UCLIBC_COMPAT_H
+#define __UCLIBC_COMPAT_H
+
+#define _XOPEN_SOURCE
+#define _GNU_SOURCE
+
+#include <features.h>
+#include <errno.h>
+
+#ifndef __UCLIBC_HAS_THREADS__
+#define __UCLIBC_HAS_THREADS__
+#endif
+
+#include <sys/poll.h>
+#include <pthread.h>
+
+#ifdef __UCLIBC__
+#include <bits/libc-lock.h>
+#else
+#undef __UCLIBC_MUTEX_STATIC
+#undef __UCLIBC_MUTEX_LOCK
+#undef __UCLIBC_MUTEX_UNLOCK
+#define __UCLIBC_MUTEX_STATIC(M,I) static pthread_mutex_t M = I
+#define __UCLIBC_MUTEX_LOCK(M) pthread_mutex_lock(&(M))
+#define __UCLIBC_MUTEX_UNLOCK(M) pthread_mutex_unlock(&(M))
+#endif
+
+#define smallint int
+
+#define _(...) __VA_ARGS__
+#define internal_function
+#define attribute_hidden
+#define attribute_unused
+#define attribute_noreturn
+#define libc_hidden_def(...)
+
+#ifndef libc_hidden_proto
+#define libc_hidden_proto(name, attrs...)
+#endif
+
+#define __set_errno(_val) errno = _val
+
+# define attribute_tls_model_ie __attribute__ ((tls_model ("initial-exec")))
+
+# define __libc_tsd_define(CLASS, KEY)  \
+  CLASS __thread void *__libc_tsd_##KEY attribute_tls_model_ie;
+
+# define __libc_tsd_address(KEY)    (&__libc_tsd_##KEY)
+# define __libc_tsd_get(KEY)        (__libc_tsd_##KEY)
+# define __libc_tsd_set(KEY, VALUE) (__libc_tsd_##KEY = (VALUE))
+
+
+#endif
index e9a6565adf21a699a698a943194f2ddb5a9d42a1..92f264ad81db39edec1ab55214e05b36d112068f 100644 (file)
@@ -41,6 +41,8 @@
 #define __need_size_t
 #include <stddef.h>
 
+#include "types.h"
+
 __BEGIN_DECLS
 
 struct rpcent
index 05f49c33a6b91b34a526be2731765ddfb0c85237..cf3c9e3efe4fc74214932b8b895a4a9d6a348514 100644 (file)
@@ -33,6 +33,8 @@
 #ifndef _RPC_TYPES_H
 #define _RPC_TYPES_H 1
 
+#include "compat.h"
+
 #ifdef _LIBC
 /* Some adjustments to make the libc source from glibc
  * compile more easily with uClibc... */
index 71303b2be7ef49aa2788c53193bfa34782cf890c..0032dcb3bc6faaf0c3664edb0b32437ff443a2dc 100644 (file)
@@ -13,9 +13,6 @@
 
 #ifdef __UCLIBC_HAS_THREADS__
 
-#include <bits/libc-tsd.h>
-#include <bits/libc-lock.h>
-
 /* Variable used in non-threaded applications or for the first thread.  */
 static struct rpc_thread_variables __libc_tsd_RPC_VARS_mem;
 __libc_tsd_define (, RPC_VARS)
@@ -52,16 +49,17 @@ rpc_thread_multi (void)
   __libc_tsd_set (RPC_VARS, &__libc_tsd_RPC_VARS_mem);
 }
 
+__UCLIBC_MUTEX_STATIC(mylock, PTHREAD_MUTEX_INITIALIZER);
 
 struct rpc_thread_variables attribute_hidden *
 __rpc_thread_variables (void)
 {
-       __libc_once_define (static, once);
        struct rpc_thread_variables *tvp;
 
+       __UCLIBC_MUTEX_LOCK(mylock);
        tvp = __libc_tsd_get (RPC_VARS);
        if (tvp == NULL) {
-               __libc_once (once, rpc_thread_multi);
+               rpc_thread_multi();
                tvp = __libc_tsd_get (RPC_VARS);
                if (tvp == NULL) {
                        tvp = calloc (1, sizeof *tvp);
@@ -71,6 +69,7 @@ __rpc_thread_variables (void)
                                tvp = __libc_tsd_get (RPC_VARS);
                }
        }
+       __UCLIBC_MUTEX_UNLOCK(mylock);
        return tvp;
 }