stub.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:7k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  */
  33. /*
  34.  * secport.c - portability interfaces for security libraries
  35.  *
  36.  * This file abstracts out libc functionality that libsec depends on
  37.  * 
  38.  * NOTE - These are not public interfaces. These stubs are to allow the 
  39.  * SW FORTEZZA to link with some low level security functions without dragging
  40.  * in NSPR.
  41.  *
  42.  * $Id: stub.c,v 1.1 2000/03/31 19:23:15 relyea%netscape.com Exp $
  43.  */
  44. #include "seccomon.h"
  45. #include "prmem.h"
  46. #include "prerror.h"
  47. #include "plarena.h"
  48. #include "secerr.h"
  49. #include "prmon.h"
  50. #include "prbit.h"
  51. unsigned long port_allocFailures;
  52. /* locations for registering Unicode conversion functions.  
  53.  *  Is this the appropriate location?  or should they be
  54.  *     moved to client/server specific locations?
  55.  */
  56. PORTCharConversionFunc ucs4Utf8ConvertFunc;
  57. PORTCharConversionFunc ucs2Utf8ConvertFunc;
  58. PORTCharConversionWSwapFunc  ucs2AsciiConvertFunc;
  59. void *
  60. PORT_Alloc(size_t bytes)
  61. {
  62.     void *rv;
  63.     /* Always allocate a non-zero amount of bytes */
  64.     rv = (void *)malloc(bytes ? bytes : 1);
  65.     if (!rv) {
  66. ++port_allocFailures;
  67.     }
  68.     return rv;
  69. }
  70. void *
  71. PORT_Realloc(void *oldptr, size_t bytes)
  72. {
  73.     void *rv;
  74.     rv = (void *)realloc(oldptr, bytes);
  75.     if (!rv) {
  76. ++port_allocFailures;
  77.     }
  78.     return rv;
  79. }
  80. void *
  81. PORT_ZAlloc(size_t bytes)
  82. {
  83.     void *rv;
  84.     /* Always allocate a non-zero amount of bytes */
  85.     rv = (void *)calloc(1, bytes ? bytes : 1);
  86.     if (!rv) {
  87. ++port_allocFailures;
  88.     }
  89.     return rv;
  90. }
  91. void
  92. PORT_Free(void *ptr)
  93. {
  94.     if (ptr) {
  95. free(ptr);
  96.     }
  97. }
  98. void
  99. PORT_ZFree(void *ptr, size_t len)
  100. {
  101.     if (ptr) {
  102. memset(ptr, 0, len);
  103. free(ptr);
  104.     }
  105. }
  106. void
  107. PORT_SetError(int value)
  108. {
  109.     return;
  110. }
  111. int
  112. PORT_GetError(void)
  113. {
  114.     return(1);
  115. }
  116. /********************* Arena code follows *****************************/
  117. PLArenaPool *
  118. PORT_NewArena(unsigned long chunksize)
  119. {
  120.     PLArenaPool *arena;
  121.     
  122.     arena = (PLArenaPool*)PORT_ZAlloc(sizeof(PLArenaPool));
  123.     if ( arena != NULL ) {
  124. PR_InitArenaPool(arena, "security", chunksize, sizeof(double));
  125.     }
  126.     return(arena);
  127. }
  128. void *
  129. PORT_ArenaAlloc(PLArenaPool *arena, size_t size)
  130. {
  131.     void *p;
  132.     PL_ARENA_ALLOCATE(p, arena, size);
  133.     if (p == NULL) {
  134. ++port_allocFailures;
  135.     }
  136.     return(p);
  137. }
  138. void *
  139. PORT_ArenaZAlloc(PLArenaPool *arena, size_t size)
  140. {
  141.     void *p;
  142.     PL_ARENA_ALLOCATE(p, arena, size);
  143.     if (p == NULL) {
  144. ++port_allocFailures;
  145.     } else {
  146. PORT_Memset(p, 0, size);
  147.     }
  148.     return(p);
  149. }
  150. /* need to zeroize!! */
  151. void
  152. PORT_FreeArena(PLArenaPool *arena, PRBool zero)
  153. {
  154.     PR_FinishArenaPool(arena);
  155.     PORT_Free(arena);
  156. }
  157. void *
  158. PORT_ArenaGrow(PLArenaPool *arena, void *ptr, size_t oldsize, size_t newsize)
  159. {
  160.     PORT_Assert(newsize >= oldsize);
  161.     
  162.     PL_ARENA_GROW(ptr, arena, oldsize, ( newsize - oldsize ) );
  163.     
  164.     return(ptr);
  165. }
  166. void *
  167. PORT_ArenaMark(PLArenaPool *arena)
  168. {
  169.     void * result;
  170.     result = PL_ARENA_MARK(arena);
  171.     return result;
  172. }
  173. void
  174. PORT_ArenaRelease(PLArenaPool *arena, void *mark)
  175. {
  176.     PL_ARENA_RELEASE(arena, mark);
  177. }
  178. void
  179. PORT_ArenaUnmark(PLArenaPool *arena, void *mark)
  180. {
  181.     /* do nothing */
  182. }
  183. char *
  184. PORT_ArenaStrdup(PLArenaPool *arena,char *str) {
  185.     int len = PORT_Strlen(str)+1;
  186.     char *newstr;
  187.     newstr = (char*)PORT_ArenaAlloc(arena,len);
  188.     if (newstr) {
  189.         PORT_Memcpy(newstr,str,len);
  190.     }
  191.     return newstr;
  192. }
  193. PR_IMPLEMENT(void)
  194. PR_Assert(const char *expr, const char *file, int line) {
  195.     return; 
  196. }
  197. PR_IMPLEMENT(void *)
  198. PR_Alloc(PRUint32 bytes) { return malloc(bytes); }
  199. PR_IMPLEMENT(void *)
  200. PR_Malloc(PRUint32 bytes) { return malloc(bytes); }
  201. PR_IMPLEMENT(void *)
  202. PR_Calloc(PRUint32 blocks, PRUint32 bytes) { return calloc(blocks,bytes); }
  203. PR_IMPLEMENT(void)
  204. PR_Free(void *ptr) { free(ptr); }
  205. /* Old template; want to expunge it eventually. */
  206. #include "secasn1.h"
  207. #include "secoid.h"
  208. const SEC_ASN1Template SECOID_AlgorithmIDTemplate[] = {
  209.     { SEC_ASN1_SEQUENCE,
  210.   0, NULL, sizeof(SECAlgorithmID) },
  211.     { SEC_ASN1_OBJECT_ID,
  212.   offsetof(SECAlgorithmID,algorithm), },
  213.     { SEC_ASN1_OPTIONAL | SEC_ASN1_ANY,
  214.   offsetof(SECAlgorithmID,parameters), },
  215.     { 0, }
  216. };
  217. /* now make the RNG happy */ /* This is not atomic! */
  218. PR_IMPLEMENT(PRInt32) PR_AtomicIncrement(PRInt32 *val) { return ++(*val); }
  219. /* This is not atomic! */
  220. PR_IMPLEMENT(PRInt32) PR_AtomicDecrement(PRInt32 *val) { return --(*val); }
  221. PR_IMPLEMENT(PRStatus) PR_Sleep(PRIntervalTime ticks) { return PR_SUCCESS; }
  222. #include "prlock.h"
  223. #include "fmutex.h"
  224. PR_IMPLEMENT(PRLock *)
  225. PR_NewLock(void) {
  226. PRLock *lock = NULL;
  227. FMUTEX_Create(&lock);
  228. /* if we don't have a lock, FMUTEX can deal with things */
  229. if (lock == NULL) lock=(PRLock *) 1;
  230. return lock;
  231. }
  232. PR_IMPLEMENT(void) 
  233. PR_DestroyLock(PRLock *lock) {
  234. FMUTEX_Destroy(lock);
  235. }
  236. PR_IMPLEMENT(void) 
  237. PR_Lock(PRLock *lock) {
  238. FMUTEX_Lock(lock);
  239. }
  240. PR_IMPLEMENT(PRStatus) 
  241. PR_Unlock(PRLock *lock) {
  242. FMUTEX_Unlock(lock);
  243. return PR_SUCCESS;
  244. }
  245. /* this implementation is here to satisfy the PRMonitor use in plarena.c.
  246. ** It appears that it doesn't need re-entrant locks.  It could have used
  247. ** PRLock instead of PRMonitor.  So, this implementation just uses 
  248. ** PRLock for a PRMonitor.
  249. */
  250. PR_IMPLEMENT(PRMonitor*) 
  251. PR_NewMonitor(void)
  252. {
  253.     return (PRMonitor *) PR_NewLock();
  254. }
  255. PR_IMPLEMENT(void) 
  256. PR_EnterMonitor(PRMonitor *mon)
  257. {
  258.     PR_Lock( (PRLock *)mon );
  259. }
  260. PR_IMPLEMENT(PRStatus) 
  261. PR_ExitMonitor(PRMonitor *mon)
  262. {
  263.     return PR_Unlock( (PRLock *)mon );
  264. }
  265. #include "prinit.h"
  266. /* This is NOT threadsafe.  It is merely a pseudo-functional stub.
  267. */
  268. PR_IMPLEMENT(PRStatus) PR_CallOnce(
  269.     PRCallOnceType *once,
  270.     PRCallOnceFN    func)
  271. {
  272.     /* This is not really atomic! */
  273.     if (1 == PR_AtomicIncrement(&once->initialized)) {
  274. once->status = (*func)();
  275.     }  else {
  276.      /* Should wait to be sure that func has finished before returning. */
  277.     }
  278.     return once->status;
  279. }
  280. /*
  281. ** Compute the log of the least power of 2 greater than or equal to n
  282. */
  283. PRIntn PR_CeilingLog2(PRUint32 i) {
  284. PRIntn log2;
  285. PR_CEILING_LOG2(log2,i);
  286. return log2;
  287. }
  288. /********************** end of arena functions ***********************/