summaryrefslogtreecommitdiff
path: root/nss/cmd/derdump/derdump.c
diff options
context:
space:
mode:
Diffstat (limited to 'nss/cmd/derdump/derdump.c')
-rw-r--r--nss/cmd/derdump/derdump.c117
1 files changed, 70 insertions, 47 deletions
diff --git a/nss/cmd/derdump/derdump.c b/nss/cmd/derdump/derdump.c
index 3184b1b..d687a8b 100644
--- a/nss/cmd/derdump/derdump.c
+++ b/nss/cmd/derdump/derdump.c
@@ -13,93 +13,116 @@ extern int fprintf(FILE *, char *, ...);
#endif
#include "plgetopt.h"
-static void Usage(char *progName)
+static void
+Usage(char *progName)
{
fprintf(stderr,
- "Usage: %s [-r] [-i input] [-o output]\n",
- progName);
+ "Usage: %s [-r] [-i input] [-o output]\n",
+ progName);
fprintf(stderr, "%-20s For formatted items, dump raw bytes as well\n",
- "-r");
+ "-r");
fprintf(stderr, "%-20s Define an input file to use (default is stdin)\n",
- "-i input");
+ "-i input");
fprintf(stderr, "%-20s Define an output file to use (default is stdout)\n",
- "-o output");
+ "-o output");
exit(-1);
}
-int main(int argc, char **argv)
+int
+main(int argc, char **argv)
{
char *progName;
FILE *outFile;
PRFileDesc *inFile;
- SECItem der;
+ SECItem der = { siBuffer, NULL, 0 };
SECStatus rv;
PRInt16 xp_error;
PRBool raw = PR_FALSE;
PLOptState *optstate;
PLOptStatus status;
+ int retval = -1;
progName = strrchr(argv[0], '/');
- progName = progName ? progName+1 : argv[0];
+ progName = progName ? progName + 1 : argv[0];
/* Parse command line arguments */
inFile = 0;
outFile = 0;
optstate = PL_CreateOptState(argc, argv, "i:o:r");
while ((status = PL_GetNextOpt(optstate)) == PL_OPT_OK) {
- switch (optstate->option) {
- case 'i':
- inFile = PR_Open(optstate->value, PR_RDONLY, 0);
- if (!inFile) {
- fprintf(stderr, "%s: unable to open \"%s\" for reading\n",
- progName, optstate->value);
- return -1;
- }
- break;
+ switch (optstate->option) {
+ case 'i':
+ inFile = PR_Open(optstate->value, PR_RDONLY, 0);
+ if (!inFile) {
+ fprintf(stderr, "%s: unable to open \"%s\" for reading\n",
+ progName, optstate->value);
+ goto cleanup;
+ }
+ break;
- case 'o':
- outFile = fopen(optstate->value, "w");
- if (!outFile) {
- fprintf(stderr, "%s: unable to open \"%s\" for writing\n",
- progName, optstate->value);
- return -1;
- }
- break;
+ case 'o':
+ outFile = fopen(optstate->value, "w");
+ if (!outFile) {
+ fprintf(stderr, "%s: unable to open \"%s\" for writing\n",
+ progName, optstate->value);
+ goto cleanup;
+ }
+ break;
- case 'r':
- raw = PR_TRUE;
- break;
+ case 'r':
+ raw = PR_TRUE;
+ break;
- default:
- Usage(progName);
- break;
- }
+ default:
+ Usage(progName);
+ break;
+ }
}
- if (status == PL_OPT_BAD)
- Usage(progName);
+ if (status == PL_OPT_BAD)
+ Usage(progName);
- if (!inFile) inFile = PR_STDIN;
- if (!outFile) outFile = stdout;
+ if (!inFile)
+ inFile = PR_STDIN;
+ if (!outFile)
+ outFile = stdout;
- rv = NSS_NoDB_Init(NULL); /* XXX */
+ rv = NSS_NoDB_Init(NULL);
if (rv != SECSuccess) {
- SECU_PrintPRandOSError(progName);
- return -1;
+ SECU_PrintPRandOSError(progName);
+ goto cleanup;
}
- rv = SECU_ReadDERFromFile(&der, inFile, PR_FALSE, PR_FALSE);
+ rv = SECU_ReadDERFromFile(&der, inFile, PR_FALSE, PR_FALSE);
if (rv == SECSuccess) {
- rv = DER_PrettyPrint(outFile, &der, raw);
- if (rv == SECSuccess)
- return 0;
+ rv = DER_PrettyPrint(outFile, &der, raw);
+ if (rv == SECSuccess) {
+ retval = 0;
+ goto cleanup;
+ }
}
xp_error = PORT_GetError();
if (xp_error) {
- SECU_PrintError(progName, "error %d", xp_error);
+ SECU_PrintError(progName, "error %d", xp_error);
}
if (errno) {
- SECU_PrintSystemError(progName, "errno=%d", errno);
+ SECU_PrintSystemError(progName, "errno=%d", errno);
}
- return 1;
+ retval = 1;
+
+cleanup:
+ retval |= NSS_Shutdown();
+ if (inFile) {
+ PR_Close(inFile);
+ }
+ if (outFile) {
+ fflush(outFile);
+ fclose(outFile);
+ }
+ PL_DestroyOptState(optstate);
+ if (der.data) {
+ PORT_Free(der.data);
+ }
+
+ return retval;
}