/*
 * NSS utility functions
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "prtypes.h"
#include "prinit.h"
#include "seccomon.h"
#include "secerr.h"
#include "ssl.h"
#include "sslimpl.h"
#include "sslproto.h"

static int ssl_isInited = 0;
static PRCallOnceType ssl_init = { 0 };
PR_STATIC_ASSERT(sizeof(unsigned long) <= sizeof(PRUint64));

PRStatus
ssl_InitCallOnce(void *arg)
{
    int *error = (int *)arg;
    SECStatus rv;

    rv = ssl_InitializePRErrorTable();
    if (rv != SECSuccess) {
        *error = SEC_ERROR_NO_MEMORY;
        return PR_FAILURE;
    }
#ifdef DEBUG
    ssl3_CheckCipherSuiteOrderConsistency();
#endif

    rv = ssl3_ApplyNSSPolicy();
    if (rv != SECSuccess) {
        *error = PORT_GetError();
        return PR_FAILURE;
    }
    return PR_SUCCESS;
}

SECStatus
ssl_Init(void)
{
    PRStatus nrv;

    /* short circuit test if we are already inited */
    if (!ssl_isInited) {
        int error;
        /* only do this once at init time, block all others until we are done */
        nrv = PR_CallOnceWithArg(&ssl_init, ssl_InitCallOnce, &error);
        if (nrv != PR_SUCCESS) {
            PORT_SetError(error);
            return SECFailure;
        }
        ssl_isInited = 1;
    }
    return SECSuccess;
}
