/* * Reinitialize (e.g., after a fork). */ int pkcs11_CTX_reload(PKCS11_CTX * ctx) { PKCS11_CTX_private *cpriv = PRIVCTX(ctx); CK_C_INITIALIZE_ARGS _args; CK_C_INITIALIZE_ARGS *args = NULL; int rv; if (cpriv->method == NULL) /* Module not loaded */ return 0; /* Tell the PKCS11 to initialize itself */ if (cpriv->init_args != NULL) { memset(&_args, 0, sizeof(_args)); args = &_args; args->pReserved = cpriv->init_args; } rv = cpriv->method->C_Initialize(args); if (rv && rv != CKR_CRYPTOKI_ALREADY_INITIALIZED) { PKCS11err(PKCS11_F_PKCS11_CTX_LOAD, rv); return -1; } /* Reinitialize the PKCS11 internal slot table */ return pkcs11_enumerate_slots(ctx, NULL, NULL); }
/* * Enumerate slots */ int PKCS11_enumerate_slots(PKCS11_CTX * ctx, PKCS11_SLOT ** slotp, unsigned int *countp) { CHECK_FORK(ctx); return pkcs11_enumerate_slots(ctx, slotp, countp); }