Commit 4c7240ff authored by roeber%netscape.com's avatar roeber%netscape.com
Browse files

Detect at runtime when we're running with NSPR 1 and switch the...

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.
parent f82644b5
Loading
Loading
Loading
Loading
+35 −1
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@
#define BASE_H

#ifdef DEBUG
static const char BASE_CVS_ID[] = "@(#) $RCSfile: base.h,v $ $Revision: 1.2 $ $Date: 2000/05/12 18:43:25 $ $Name:  $";
static const char BASE_CVS_ID[] = "@(#) $RCSfile: base.h,v $ $Revision: 1.3 $ $Date: 2000/05/17 20:19:23 $ $Name:  $";
#endif /* DEBUG */

/*
@@ -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

+5 −4
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@
 */

#ifdef DEBUG
static const char CVS_ID[] = "@(#) $RCSfile: error.c,v $ $Revision: 1.1 $ $Date: 2000/03/31 19:50:10 $ $Name:  $";
static const char CVS_ID[] = "@(#) $RCSfile: error.c,v $ $Revision: 1.2 $ $Date: 2000/05/17 20:19:23 $ $Name:  $";
#endif /* DEBUG */

/*
@@ -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;
}

+2 −1
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@
# may use your version of this file under either the MPL or the
# GPL.
#
MANIFEST_CVS_ID = "@(#) $RCSfile: manifest.mn,v $ $Revision: 1.1 $ $Date: 2000/03/31 19:50:19 $ $Name:  $"
MANIFEST_CVS_ID = "@(#) $RCSfile: manifest.mn,v $ $Revision: 1.2 $ $Date: 2000/05/17 20:19:24 $ $Name:  $"

CORE_DEPTH = ../../..

@@ -54,6 +54,7 @@ CSRCS = \
	libc.c	   \
	tracker.c  \
	utf8.c	   \
	whatnspr.c \
	$(NULL)

REQUIRES = security nspr
+170 −0
Original line number Diff line number Diff line
/* 
 * 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: whatnspr.c,v $ $Revision: 1.1 $ $Date: 2000/05/17 20:19:24 $ $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;
  }
}