michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: /* michael@0: ** michael@0: ** Sample client side test program that uses SSL and NSS michael@0: ** michael@0: */ michael@0: michael@0: #include "secutil.h" michael@0: michael@0: #if defined(XP_UNIX) michael@0: #include michael@0: #else michael@0: #include "ctype.h" /* for isalpha() */ michael@0: #endif michael@0: michael@0: #include michael@0: #include michael@0: #include michael@0: #include michael@0: #include michael@0: #include michael@0: michael@0: #include "nspr.h" michael@0: #include "prio.h" michael@0: #include "prnetdb.h" michael@0: #include "nss.h" michael@0: #include "pk11func.h" michael@0: #include "plgetopt.h" michael@0: michael@0: void michael@0: Usage(char *progName) michael@0: { michael@0: fprintf(stderr,"usage: %s [-d profiledir] -t tokenName [-r]\n", progName); michael@0: exit(1); michael@0: } michael@0: michael@0: int main(int argc, char **argv) michael@0: { michael@0: char * certDir = NULL; michael@0: PLOptState *optstate; michael@0: PLOptStatus optstatus; michael@0: SECStatus rv; michael@0: char * tokenName = NULL; michael@0: PRBool cont=PR_TRUE; michael@0: PK11TokenEvent event = PK11TokenPresentEvent; michael@0: PK11TokenStatus status; michael@0: char *progName; michael@0: PK11SlotInfo *slot; michael@0: michael@0: progName = strrchr(argv[0], '/'); michael@0: if (!progName) michael@0: progName = strrchr(argv[0], '\\'); michael@0: progName = progName ? progName+1 : argv[0]; michael@0: michael@0: optstate = PL_CreateOptState(argc, argv, "rd:t:"); michael@0: while ((optstatus = PL_GetNextOpt(optstate)) == PL_OPT_OK) { michael@0: switch (optstate->option) { michael@0: michael@0: case 'd': michael@0: certDir = strdup(optstate->value); michael@0: certDir = SECU_ConfigDirectory(certDir); michael@0: break; michael@0: case 't': michael@0: tokenName = strdup(optstate->value); michael@0: break; michael@0: case 'r': michael@0: event = PK11TokenRemovedOrChangedEvent; michael@0: break; michael@0: } michael@0: } michael@0: if (optstatus == PL_OPT_BAD) michael@0: Usage(progName); michael@0: michael@0: if (tokenName == NULL) { michael@0: Usage(progName); michael@0: } michael@0: michael@0: if (!certDir) { michael@0: certDir = SECU_DefaultSSLDir(); /* Look in $SSL_DIR */ michael@0: certDir = SECU_ConfigDirectory(certDir); /* call even if it's NULL */ michael@0: } michael@0: michael@0: PR_Init( PR_SYSTEM_THREAD, PR_PRIORITY_NORMAL, 1); michael@0: michael@0: PK11_SetPasswordFunc(SECU_GetModulePassword); michael@0: michael@0: /* open the cert DB, the key DB, and the secmod DB. */ michael@0: rv = NSS_Init(certDir); michael@0: if (rv != SECSuccess) { michael@0: SECU_PrintError(progName, "unable to open cert database"); michael@0: return 1; michael@0: } michael@0: michael@0: printf("Looking up tokenNamed: <%s>\n",tokenName); michael@0: slot = PK11_FindSlotByName(tokenName); michael@0: if (slot == NULL) { michael@0: SECU_PrintError(progName, "unable to find token"); michael@0: return 1; michael@0: } michael@0: michael@0: do { michael@0: status = michael@0: PK11_WaitForTokenEvent(slot,event,PR_INTERVAL_NO_TIMEOUT, 0, 0); michael@0: michael@0: switch (status) { michael@0: case PK11TokenNotRemovable: michael@0: cont = PR_FALSE; michael@0: printf("%s Token Not Removable\n",tokenName); michael@0: break; michael@0: case PK11TokenChanged: michael@0: event = PK11TokenRemovedOrChangedEvent; michael@0: printf("%s Token Changed\n", tokenName); michael@0: break; michael@0: case PK11TokenRemoved: michael@0: event = PK11TokenPresentEvent; michael@0: printf("%s Token Removed\n", tokenName); michael@0: break; michael@0: case PK11TokenPresent: michael@0: event = PK11TokenRemovedOrChangedEvent; michael@0: printf("%s Token Present\n", tokenName); michael@0: break; michael@0: } michael@0: } while (cont); michael@0: michael@0: PK11_FreeSlot(slot); michael@0: michael@0: if (NSS_Shutdown() != SECSuccess) { michael@0: exit(1); michael@0: } michael@0: PR_Cleanup(); michael@0: return 0; michael@0: }