summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorroeber%netscape.com <devnull@localhost>2000-05-17 20:19:24 +0000
committerroeber%netscape.com <devnull@localhost>2000-05-17 20:19:24 +0000
commitb5893a4fa863132f6529c69bcd2126cd06c9ca3d (patch)
tree28a768c62bebb6ac1bed87766bff0afa645384e4
parent19e40114414a391cfca1287fa8f3856bd66b8ee5 (diff)
downloadnss-hg-b5893a4fa863132f6529c69bcd2126cd06c9ca3d.tar.gz
Detect at runtime when we're running with NSPR 1 and switch the thread-private-data calls accordingly. This lets our pkcs#11 modules be loaded into Communicator.
-rw-r--r--security/nss/lib/base/base.h34
-rw-r--r--security/nss/lib/base/error.c7
-rw-r--r--security/nss/lib/base/manifest.mn1
-rw-r--r--security/nss/lib/base/whatnspr.c170
4 files changed, 209 insertions, 3 deletions
diff --git a/security/nss/lib/base/base.h b/security/nss/lib/base/base.h
index 3b327803b..4206cb542 100644
--- a/security/nss/lib/base/base.h
+++ b/security/nss/lib/base/base.h
@@ -1023,6 +1023,40 @@ extern const NSSError NSS_ERROR_INVALID_POINTER;
#define nsslibc_offsetof(str, memb) ((PRPtrdiff)(&(((str *)0)->memb)))
+/*
+ * nss_NewThreadPrivateIndex
+ *
+ */
+
+NSS_EXTERN PRStatus
+nss_NewThreadPrivateIndex
+(
+ PRUintn *ip
+);
+
+/*
+ * nss_GetThreadPrivate
+ *
+ */
+
+NSS_EXTERN void *
+nss_GetThreadPrivate
+(
+ PRUintn i
+);
+
+/*
+ * nss_SetThreadPrivate
+ *
+ */
+
+NSS_EXTERN void
+nss_SetThreadPrivate
+(
+ PRUintn i,
+ void *v
+);
+
PR_END_EXTERN_C
diff --git a/security/nss/lib/base/error.c b/security/nss/lib/base/error.c
index ba02bb9ac..d3b44c7a0 100644
--- a/security/nss/lib/base/error.c
+++ b/security/nss/lib/base/error.c
@@ -94,7 +94,8 @@ error_once_function
void
)
{
- return PR_NewThreadPrivateIndex(&error_stack_index, PR_Free);
+ return nss_NewThreadPrivateIndex(&error_stack_index);
+ /* return PR_NewThreadPrivateIndex(&error_stack_index, PR_Free); */
}
/*
@@ -124,7 +125,7 @@ error_get_my_stack
}
}
- rv = (error_stack *)PR_GetThreadPrivate(error_stack_index);
+ rv = (error_stack *)nss_GetThreadPrivate(error_stack_index);
if( (error_stack *)NULL == rv ) {
/* Doesn't exist; create one */
new_size = 16;
@@ -152,7 +153,7 @@ error_get_my_stack
}
/* Set the value, whether or not the allocation worked */
- PR_SetThreadPrivate(error_stack_index, new_stack);
+ nss_SetThreadPrivate(error_stack_index, new_stack);
return new_stack;
}
diff --git a/security/nss/lib/base/manifest.mn b/security/nss/lib/base/manifest.mn
index 5860b77e7..89e64f938 100644
--- a/security/nss/lib/base/manifest.mn
+++ b/security/nss/lib/base/manifest.mn
@@ -54,6 +54,7 @@ CSRCS = \
libc.c \
tracker.c \
utf8.c \
+ whatnspr.c \
$(NULL)
REQUIRES = security nspr
diff --git a/security/nss/lib/base/whatnspr.c b/security/nss/lib/base/whatnspr.c
new file mode 100644
index 000000000..e82c34166
--- /dev/null
+++ b/security/nss/lib/base/whatnspr.c
@@ -0,0 +1,170 @@
+/*
+ * The contents of this file are subject to the Mozilla Public
+ * License Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ *
+ * The Original Code is the Netscape security libraries.
+ *
+ * The Initial Developer of the Original Code is Netscape
+ * Communications Corporation. Portions created by Netscape are
+ * Copyright (C) 1994-2000 Netscape Communications Corporation. All
+ * Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the
+ * terms of the GNU General Public License Version 2 or later (the
+ * "GPL"), in which case the provisions of the GPL are applicable
+ * instead of those above. If you wish to allow use of your
+ * version of this file only under the terms of the GPL and not to
+ * allow others to use your version of this file under the MPL,
+ * indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by
+ * the GPL. If you do not delete the provisions above, a recipient
+ * may use your version of this file under either the MPL or the
+ * GPL.
+ */
+
+#ifdef DEBUG
+static const char CVS_ID[] = "@(#) $RCSfile$ $Revision$ $Date$ $Name$";
+#endif /* DEBUG */
+
+#ifndef BASE_H
+#include "base.h"
+#endif /* BASE_H */
+
+/*
+ * This file isolates us from differences in NSPR versions.
+ * We have to detect the library with which we're running at
+ * runtime, and switch behaviours there. This lets us do
+ * stuff like load cryptoki modules in Communicator.
+ *
+ * Hey, it's the PORT layer all over again!
+ */
+
+static int whatnspr = 0;
+
+static int
+set_whatnspr
+(
+ void
+)
+{
+ /*
+ * The only runtime difference I could find was the
+ * return value of PR_dtoa. We can't just look for
+ * a symbol in NSPR >=2, because it'll always be
+ * found (because we compile against NSPR >=2).
+ * Maybe we could look for a symbol merely in NSPR 1?
+ *
+ */
+
+ char buffer[64];
+ int decpt = 0, sign = 0;
+ char *rve = (char *)0;
+ /* extern int PR_dtoa(double, int, int, int *, int *, char **, char *, int); */
+ int r = (int)PR_dtoa((double)1.0, 0, 5, &decpt, &sign, &rve,
+ buffer, sizeof(buffer));
+
+ switch( r ) {
+ case 0:
+ case -1:
+ whatnspr = 2;
+ /*
+ * If we needed to, *now* we could look up "libVersionPoint"
+ * and get more data there.. except all current NSPR's (up
+ * to NSPR 4.x at time of writing) still say 2 in their
+ * version structure.
+ */
+ break;
+ default:
+ whatnspr = 1;
+ break;
+ }
+
+ return whatnspr;
+}
+
+#define WHATNSPR (whatnspr ? whatnspr : set_whatnspr())
+
+NSS_IMPLEMENT PRStatus
+nss_NewThreadPrivateIndex
+(
+ PRUintn *ip
+)
+{
+ switch( WHATNSPR ) {
+ case 1:
+ {
+ PRLibrary *l = (PRLibrary *)0;
+ void *f = PR_FindSymbolAndLibrary("PR_NewThreadPrivateID", &l);
+ typedef PRInt32 (*ntpt)(void);
+ ntpt ntp = (ntpt) f;
+
+ PR_ASSERT((void *)0 != f);
+
+ *ip = ntp();
+ return PR_SUCCESS;
+ }
+ case 2:
+ default:
+ return PR_NewThreadPrivateIndex(ip, NULL);
+ }
+}
+
+NSS_IMPLEMENT void *
+nss_GetThreadPrivate
+(
+ PRUintn i
+)
+{
+ switch( WHATNSPR ) {
+ case 1:
+ {
+ PRLibrary *l = (PRLibrary *)0;
+ void *f = PR_FindSymbolAndLibrary("PR_GetThreadPrivate", &l);
+ typedef void *(*gtpt)(PRThread *, PRInt32);
+ gtpt gtp = (gtpt) f;
+
+ PR_ASSERT((void *)0 != f);
+
+ return gtp(PR_CurrentThread(), i);
+ }
+ case 2:
+ default:
+ return PR_GetThreadPrivate(i);
+ }
+}
+
+NSS_IMPLEMENT void
+nss_SetThreadPrivate
+(
+ PRUintn i,
+ void *v
+)
+{
+ switch( WHATNSPR ) {
+ case 1:
+ {
+ PRLibrary *l = (PRLibrary *)0;
+ void *f = PR_FindSymbolAndLibrary("PR_SetThreadPrivate", &l);
+ typedef PRStatus (*stpt)(PRThread *, PRInt32, void *);
+ stpt stp = (stpt) f;
+
+ PR_ASSERT((void *)0 != f);
+
+ (void)stp(PR_CurrentThread(), i, v);
+ return;
+ }
+ case 2:
+ default:
+ (void)PR_SetThreadPrivate(i, v);
+ return;
+ }
+}