retval = -1; }
JarWho(char *filename)  {  FILE *fp;  JAR *jar;  JAR_Context *ctx;  int status;  int retval = 0;  JAR_Item *it;  JAR_Cert *fing;  CERTCertificate *cert, *prev = NULL;  jar = JAR_new();  if ((fp = fopen (filename, "r")) == NULL)    {    perror (filename);    exit (ERRX);    }  else    fclose (fp);  status = JAR_pass_archive (jar, jarArchGuess, filename, "some-url");  if (status < 0 || jar->valid < 0)    {    PR_fprintf(outputFD,		"NOTE -- \"%s\" archive DID NOT PASS crypto verification.\n", filename);    retval = -1;    if (jar->valid < 0 || status != -1)      {      char *errtext;      if (status >= JAR_BASE && status <= JAR_BASE_END)        {        errtext = JAR_get_error (status);        }      else        {        errtext = SECU_ErrorString ((int16) PORT_GetError());        }      PR_fprintf(outputFD, "  (reported reason: %s)\n\n", errtext);      }    }  PR_fprintf(outputFD, "\nSigner information:\n\n");  ctx = JAR_find (jar, NULL, jarTypeSign);  while (JAR_find_next (ctx, &it) >= 0)    {    fing = (JAR_Cert *) it->data;    cert = fing->cert;    if (cert)      {      if (prev == cert)        break;      if (cert->nickname)         PR_fprintf(outputFD, "nickname: %s\n", cert->nickname);      if (cert->subjectName)        PR_fprintf(outputFD, "subject name: %s\n", cert->subjectName);      if (cert->issuerName)        PR_fprintf(outputFD, "issuer name: %s\n", cert->issuerName);      }    else      PR_fprintf(outputFD, "no certificate could be found\n");    prev = cert;    }  JAR_find_end (ctx);  JAR_destroy (jar);  return retval;}