stub.c
来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 345 行
C
345 行
/* * 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. *//* * secport.c - portability interfaces for security libraries * * This file abstracts out libc functionality that libsec depends on * * NOTE - These are not public interfaces. These stubs are to allow the * SW FORTEZZA to link with some low level security functions without dragging * in NSPR. * * $Id: stub.c,v 1.1 2000/03/31 19:23:15 relyea%netscape.com Exp $ */#include "seccomon.h"#include "prmem.h"#include "prerror.h"#include "plarena.h"#include "secerr.h"#include "prmon.h"#include "prbit.h"unsigned long port_allocFailures;/* locations for registering Unicode conversion functions. * Is this the appropriate location? or should they be * moved to client/server specific locations? */PORTCharConversionFunc ucs4Utf8ConvertFunc;PORTCharConversionFunc ucs2Utf8ConvertFunc;PORTCharConversionWSwapFunc ucs2AsciiConvertFunc;void *PORT_Alloc(size_t bytes){ void *rv; /* Always allocate a non-zero amount of bytes */ rv = (void *)malloc(bytes ? bytes : 1); if (!rv) { ++port_allocFailures; } return rv;}void *PORT_Realloc(void *oldptr, size_t bytes){ void *rv; rv = (void *)realloc(oldptr, bytes); if (!rv) { ++port_allocFailures; } return rv;}void *PORT_ZAlloc(size_t bytes){ void *rv; /* Always allocate a non-zero amount of bytes */ rv = (void *)calloc(1, bytes ? bytes : 1); if (!rv) { ++port_allocFailures; } return rv;}voidPORT_Free(void *ptr){ if (ptr) { free(ptr); }}voidPORT_ZFree(void *ptr, size_t len){ if (ptr) { memset(ptr, 0, len); free(ptr); }}voidPORT_SetError(int value){ return;}intPORT_GetError(void){ return(1);}/********************* Arena code follows *****************************/PLArenaPool *PORT_NewArena(unsigned long chunksize){ PLArenaPool *arena; arena = (PLArenaPool*)PORT_ZAlloc(sizeof(PLArenaPool)); if ( arena != NULL ) { PR_InitArenaPool(arena, "security", chunksize, sizeof(double)); } return(arena);}void *PORT_ArenaAlloc(PLArenaPool *arena, size_t size){ void *p; PL_ARENA_ALLOCATE(p, arena, size); if (p == NULL) { ++port_allocFailures; } return(p);}void *PORT_ArenaZAlloc(PLArenaPool *arena, size_t size){ void *p; PL_ARENA_ALLOCATE(p, arena, size); if (p == NULL) { ++port_allocFailures; } else { PORT_Memset(p, 0, size); } return(p);}/* need to zeroize!! */voidPORT_FreeArena(PLArenaPool *arena, PRBool zero){ PR_FinishArenaPool(arena); PORT_Free(arena);}void *PORT_ArenaGrow(PLArenaPool *arena, void *ptr, size_t oldsize, size_t newsize){ PORT_Assert(newsize >= oldsize); PL_ARENA_GROW(ptr, arena, oldsize, ( newsize - oldsize ) ); return(ptr);}void *PORT_ArenaMark(PLArenaPool *arena){ void * result; result = PL_ARENA_MARK(arena); return result;}voidPORT_ArenaRelease(PLArenaPool *arena, void *mark){ PL_ARENA_RELEASE(arena, mark);}voidPORT_ArenaUnmark(PLArenaPool *arena, void *mark){ /* do nothing */}char *PORT_ArenaStrdup(PLArenaPool *arena,char *str) { int len = PORT_Strlen(str)+1; char *newstr; newstr = (char*)PORT_ArenaAlloc(arena,len); if (newstr) { PORT_Memcpy(newstr,str,len); } return newstr;}PR_IMPLEMENT(void)PR_Assert(const char *expr, const char *file, int line) { return; }PR_IMPLEMENT(void *)PR_Alloc(PRUint32 bytes) { return malloc(bytes); }PR_IMPLEMENT(void *)PR_Malloc(PRUint32 bytes) { return malloc(bytes); }PR_IMPLEMENT(void *)PR_Calloc(PRUint32 blocks, PRUint32 bytes) { return calloc(blocks,bytes); }PR_IMPLEMENT(void)PR_Free(void *ptr) { free(ptr); }/* Old template; want to expunge it eventually. */#include "secasn1.h"#include "secoid.h"const SEC_ASN1Template SECOID_AlgorithmIDTemplate[] = { { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(SECAlgorithmID) }, { SEC_ASN1_OBJECT_ID, offsetof(SECAlgorithmID,algorithm), }, { SEC_ASN1_OPTIONAL | SEC_ASN1_ANY, offsetof(SECAlgorithmID,parameters), }, { 0, }};/* now make the RNG happy */ /* This is not atomic! */PR_IMPLEMENT(PRInt32) PR_AtomicIncrement(PRInt32 *val) { return ++(*val); }/* This is not atomic! */PR_IMPLEMENT(PRInt32) PR_AtomicDecrement(PRInt32 *val) { return --(*val); }PR_IMPLEMENT(PRStatus) PR_Sleep(PRIntervalTime ticks) { return PR_SUCCESS; }#include "prlock.h"#include "fmutex.h"PR_IMPLEMENT(PRLock *)PR_NewLock(void) { PRLock *lock = NULL; FMUTEX_Create(&lock); /* if we don't have a lock, FMUTEX can deal with things */ if (lock == NULL) lock=(PRLock *) 1; return lock;}PR_IMPLEMENT(void) PR_DestroyLock(PRLock *lock) { FMUTEX_Destroy(lock);}PR_IMPLEMENT(void) PR_Lock(PRLock *lock) { FMUTEX_Lock(lock);}PR_IMPLEMENT(PRStatus) PR_Unlock(PRLock *lock) { FMUTEX_Unlock(lock); return PR_SUCCESS;}/* this implementation is here to satisfy the PRMonitor use in plarena.c.** It appears that it doesn't need re-entrant locks. It could have used** PRLock instead of PRMonitor. So, this implementation just uses ** PRLock for a PRMonitor.*/PR_IMPLEMENT(PRMonitor*) PR_NewMonitor(void){ return (PRMonitor *) PR_NewLock();}PR_IMPLEMENT(void) PR_EnterMonitor(PRMonitor *mon){ PR_Lock( (PRLock *)mon );}PR_IMPLEMENT(PRStatus) PR_ExitMonitor(PRMonitor *mon){ return PR_Unlock( (PRLock *)mon );}#include "prinit.h"/* This is NOT threadsafe. It is merely a pseudo-functional stub.*/PR_IMPLEMENT(PRStatus) PR_CallOnce( PRCallOnceType *once, PRCallOnceFN func){ /* This is not really atomic! */ if (1 == PR_AtomicIncrement(&once->initialized)) { once->status = (*func)(); } else { /* Should wait to be sure that func has finished before returning. */ } return once->status;}/*** Compute the log of the least power of 2 greater than or equal to n*/PRIntn PR_CeilingLog2(PRUint32 i) { PRIntn log2; PR_CEILING_LOG2(log2,i); return log2;}/********************** end of arena functions ***********************/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?