aboutsummaryrefslogtreecommitdiffstats
path: root/dirmngr/crlcache.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2010-07-16 13:19:45 +0000
committerWerner Koch <[email protected]>2010-07-16 13:19:45 +0000
commit8b8925a2bdbb12dd537dde20a27cdb1416c2f1ae (patch)
tree366acb6bb52e61242bb39682ddddb76615c3ba34 /dirmngr/crlcache.c
parentMake it build on W32 again. (diff)
downloadgnupg-8b8925a2bdbb12dd537dde20a27cdb1416c2f1ae.tar.gz
gnupg-8b8925a2bdbb12dd537dde20a27cdb1416c2f1ae.zip
Some work on porting dirmngr (unfinished)
Ported gpgtar to W32.
Diffstat (limited to 'dirmngr/crlcache.c')
-rw-r--r--dirmngr/crlcache.c237
1 files changed, 119 insertions, 118 deletions
diff --git a/dirmngr/crlcache.c b/dirmngr/crlcache.c
index 9ec5414fa..aeb6304b0 100644
--- a/dirmngr/crlcache.c
+++ b/dirmngr/crlcache.c
@@ -218,7 +218,7 @@ create_directory_if_needed (const char *name)
log_error (_("error creating directory `%s': %s\n"),
fname, strerror (errno));
xfree (fname);
- errno = save_errno;
+ gpg_err_set_errno (save_errno);
return -1;
}
}
@@ -298,7 +298,7 @@ cleanup_cache_dir (int force)
removed, the function will read the last line of a file, even if
that is not terminated by a LF. */
static char *
-next_line_from_file (FILE *fp, gpg_error_t *r_err)
+next_line_from_file (estream_t fp, gpg_error_t *r_err)
{
char buf[300];
char *largebuf = NULL;
@@ -311,7 +311,7 @@ next_line_from_file (FILE *fp, gpg_error_t *r_err)
*r_err = 0;
p = buf;
buflen = sizeof buf - 1;
- while ((c=getc (fp)) != EOF && c != '\n')
+ while ((c=es_getc (fp)) != EOF && c != '\n')
{
if (len >= buflen)
{
@@ -401,12 +401,12 @@ release_cache (crl_cache_t cache)
/* Open the dir file FNAME or create a new one if it does not yet
exist. */
-static FILE *
+static estream_t
open_dir_file (const char *fname)
{
- FILE *fp;
+ estream_t fp;
- fp = fopen (fname, "r");
+ fp = es_fopen (fname, "r");
if (!fp)
{
log_error (_("failed to open cache dir file `%s': %s\n"),
@@ -416,22 +416,22 @@ open_dir_file (const char *fname)
if (create_directory_if_needed (NULL)
|| create_directory_if_needed (DBDIR_D))
return NULL;
- fp = fopen (fname, "w");
+ fp = es_fopen (fname, "w");
if (!fp)
{
log_error (_("error creating new cache dir file `%s': %s\n"),
fname, strerror (errno));
return NULL;
}
- fprintf (fp, "v:%d:\n", DBDIRVERSION);
- if (ferror (fp))
+ es_fprintf (fp, "v:%d:\n", DBDIRVERSION);
+ if (es_ferror (fp))
{
log_error (_("error writing new cache dir file `%s': %s\n"),
fname, strerror (errno));
- fclose (fp);
+ es_fclose (fp);
return NULL;
}
- if (fclose (fp))
+ if (es_fclose (fp))
{
log_error (_("error closing new cache dir file `%s': %s\n"),
fname, strerror (errno));
@@ -440,7 +440,7 @@ open_dir_file (const char *fname)
log_info (_("new cache dir file `%s' created\n"), fname);
- fp = fopen (fname, "r");
+ fp = es_fopen (fname, "r");
if (!fp)
{
log_error (_("failed to re-open cache dir file `%s': %s\n"),
@@ -454,13 +454,13 @@ open_dir_file (const char *fname)
/* Helper for open_dir. */
static gpg_error_t
-check_dir_version (FILE **fpadr, const char *fname,
+check_dir_version (estream_t *fpadr, const char *fname,
unsigned int *lineno,
int cleanup_on_mismatch)
{
char *line;
gpg_error_t lineerr = 0;
- FILE *fp = *fpadr;
+ estream_t fp = *fpadr;
int created = 0;
retry:
@@ -485,7 +485,7 @@ check_dir_version (FILE **fpadr, const char *fname,
if (!created && cleanup_on_mismatch)
{
log_error (_("old version of cache directory - cleaning up\n"));
- fclose (fp);
+ es_fclose (fp);
*fpadr = NULL;
if (!cleanup_cache_dir (1))
{
@@ -521,7 +521,7 @@ open_dir (crl_cache_t *r_cache)
char *fname;
char *line = NULL;
gpg_error_t lineerr = 0;
- FILE *fp;
+ estream_t fp;
crl_cache_entry_t entry, *entrytail;
unsigned int lineno;
gpg_error_t err = 0;
@@ -649,7 +649,7 @@ open_dir (crl_cache_t *r_cache)
log_error (_("error reading `%s': %s\n"), fname, gpg_strerror (err));
goto leave;
}
- if (ferror (fp))
+ if (es_ferror (fp))
{
log_error (_("error reading `%s': %s\n"), fname, strerror (errno));
err = gpg_error (GPG_ERR_CONFIGURATION);
@@ -695,8 +695,7 @@ open_dir (crl_cache_t *r_cache)
leave:
- if (fp)
- fclose (fp);
+ es_fclose (fp);
xfree (line);
xfree (fname);
if (err)
@@ -709,54 +708,54 @@ open_dir (crl_cache_t *r_cache)
}
static void
-write_percented_string (const char *s, FILE *fp)
+write_percented_string (const char *s, estream_t fp)
{
for (; *s; s++)
if (*s == ':')
- fputs ("%3A", fp);
+ es_fputs ("%3A", fp);
else if (*s == '\n')
- fputs ("%0A", fp);
+ es_fputs ("%0A", fp);
else if (*s == '\r')
- fputs ("%0D", fp);
+ es_fputs ("%0D", fp);
else
- putc (*s, fp);
+ es_putc (*s, fp);
}
static void
-write_dir_line_crl (FILE *fp, crl_cache_entry_t e)
+write_dir_line_crl (estream_t fp, crl_cache_entry_t e)
{
if (e->invalid)
- fprintf (fp, "i%d", e->invalid);
+ es_fprintf (fp, "i%d", e->invalid);
else if (e->user_trust_req)
- putc ('u', fp);
+ es_putc ('u', fp);
else
- putc ('c', fp);
- putc (':', fp);
- fputs (e->issuer_hash, fp);
- putc (':', fp);
+ es_putc ('c', fp);
+ es_putc (':', fp);
+ es_fputs (e->issuer_hash, fp);
+ es_putc (':', fp);
write_percented_string (e->issuer, fp);
- putc (':', fp);
+ es_putc (':', fp);
write_percented_string (e->url, fp);
- putc (':', fp);
- fwrite (e->this_update, 15, 1, fp);
- putc (':', fp);
- fwrite (e->next_update, 15, 1, fp);
- putc (':', fp);
- fputs (e->dbfile_hash, fp);
- putc (':', fp);
+ es_putc (':', fp);
+ es_fwrite (e->this_update, 15, 1, fp);
+ es_putc (':', fp);
+ es_fwrite (e->next_update, 15, 1, fp);
+ es_putc (':', fp);
+ es_fputs (e->dbfile_hash, fp);
+ es_putc (':', fp);
if (e->crl_number)
- fputs (e->crl_number, fp);
- putc (':', fp);
+ es_fputs (e->crl_number, fp);
+ es_putc (':', fp);
if (e->authority_issuer)
write_percented_string (e->authority_issuer, fp);
- putc (':', fp);
+ es_putc (':', fp);
if (e->authority_serialno)
- fputs (e->authority_serialno, fp);
- putc (':', fp);
+ es_fputs (e->authority_serialno, fp);
+ es_putc (':', fp);
if (e->check_trust_anchor && e->user_trust_req)
- fputs (e->check_trust_anchor, fp);
- putc ('\n', fp);
+ es_fputs (e->check_trust_anchor, fp);
+ es_putc ('\n', fp);
}
@@ -768,7 +767,8 @@ update_dir (crl_cache_t cache)
char *tmpfname = NULL;
char *line = NULL;
gpg_error_t lineerr = 0;
- FILE *fp, *fpout = NULL;
+ estream_t fp;
+ estream_t fpout = NULL;
crl_cache_entry_t e;
unsigned int lineno;
gpg_error_t err = 0;
@@ -781,7 +781,7 @@ update_dir (crl_cache_t cache)
e->mark = 1;
lineno = 0;
- fp = fopen (fname, "r");
+ fp = es_fopen (fname, "r");
if (!fp)
{
err = gpg_error_from_errno (errno);
@@ -792,7 +792,7 @@ update_dir (crl_cache_t cache)
err = check_dir_version (&fp, fname, &lineno, 0);
if (err)
goto leave;
- rewind (fp);
+ es_rewind (fp);
lineno = 0;
/* Create a temporary DIR file. */
@@ -827,7 +827,7 @@ update_dir (crl_cache_t cache)
tmpfname = make_filename (opt.homedir_cache, DBDIR_D, tmpbuf, NULL);
xfree (tmpbuf);
}
- fpout = fopen (tmpfname, "w");
+ fpout = es_fopen (tmpfname, "w");
if (!fpout)
{
err = gpg_error_from_errno (errno);
@@ -868,30 +868,30 @@ update_dir (crl_cache_t cache)
{ /* We ignore entries we don't have in our cache
because they may have been added in the meantime
by other instances of dirmngr. */
- fprintf (fpout, "# Next line added by "
- "another process; our pid is %lu\n",
- (unsigned long)getpid ());
- fputs (line, fpout);
- putc ('\n', fpout);
+ es_fprintf (fpout, "# Next line added by "
+ "another process; our pid is %lu\n",
+ (unsigned long)getpid ());
+ es_fputs (line, fpout);
+ es_putc ('\n', fpout);
}
}
else
{
- fputs ("# Invalid line detected: ", fpout);
- fputs (line, fpout);
- putc ('\n', fpout);
+ es_fputs ("# Invalid line detected: ", fpout);
+ es_fputs (line, fpout);
+ es_putc ('\n', fpout);
}
}
else
{
/* Write out all non CRL lines as they are. */
- fputs (line, fpout);
- putc ('\n', fpout);
+ es_fputs (line, fpout);
+ es_putc ('\n', fpout);
}
xfree (line);
}
- if (!ferror (fp) && !ferror (fpout) && !lineerr)
+ if (!es_ferror (fp) && !ferror (es_fpout) && !lineerr)
{
/* Write out the remaining entries. */
for (e= cache->entries; e; e = e->next)
@@ -908,12 +908,12 @@ update_dir (crl_cache_t cache)
log_error (_("error reading `%s': %s\n"), fname, gpg_strerror (err));
goto leave;
}
- if (ferror (fp))
+ if (es_ferror (fp))
{
err = gpg_error_from_errno (errno);
log_error (_("error reading `%s': %s\n"), fname, strerror (errno));
}
- if (ferror (fpout))
+ if (es_ferror (fpout))
{
err = gpg_error_from_errno (errno);
log_error (_("error writing `%s': %s\n"), tmpfname, strerror (errno));
@@ -922,9 +922,9 @@ update_dir (crl_cache_t cache)
goto leave;
/* Rename the files. */
- fclose (fp);
+ es_fclose (fp);
fp = NULL;
- if (fclose (fpout))
+ if (es_fclose (fpout))
{
err = gpg_error_from_errno (errno);
log_error (_("error closing `%s': %s\n"), tmpfname, strerror (errno));
@@ -947,14 +947,13 @@ update_dir (crl_cache_t cache)
leave:
/* Fixme: Relinquish update lock. */
xfree (line);
- if (fp)
- fclose (fp);
+ es_fclose (fp);
xfree (fname);
if (fpout)
{
- fclose (fpout);
+ es_fclose (fpout);
if (err && tmpfname)
- remove (tmpfname);
+ gnupg_remove (tmpfname);
}
xfree (tmpfname);
return err;
@@ -984,14 +983,14 @@ make_db_file_name (const char *issuer_hash)
static int
hash_dbfile (const char *fname, unsigned char *md5buffer)
{
- FILE *fp;
+ estream_t fp;
char *buffer;
size_t n;
gcry_md_hd_t md5;
gpg_err_code_t err;
buffer = xtrymalloc (65536);
- fp = buffer? fopen (fname, "rb") : NULL;
+ fp = buffer? es_fopen (fname, "rb") : NULL;
if (!fp)
{
log_error (_("can't hash `%s': %s\n"), fname, strerror (errno));
@@ -1005,7 +1004,7 @@ hash_dbfile (const char *fname, unsigned char *md5buffer)
log_error (_("error setting up MD5 hash context: %s\n"),
gpg_strerror (err));
xfree (buffer);
- fclose (fp);
+ es_fclose (fp);
return -1;
}
@@ -1015,12 +1014,12 @@ hash_dbfile (const char *fname, unsigned char *md5buffer)
for (;;)
{
- n = fread (buffer, 1, 65536, fp);
- if (n < 65536 && ferror (fp))
+ n = es_fread (buffer, 1, 65536, fp);
+ if (n < 65536 && es_ferror (fp))
{
log_error (_("error hashing `%s': %s\n"), fname, strerror (errno));
xfree (buffer);
- fclose (fp);
+ es_fclose (fp);
gcry_md_close (md5);
return -1;
}
@@ -1028,7 +1027,7 @@ hash_dbfile (const char *fname, unsigned char *md5buffer)
break;
gcry_md_write (md5, buffer, n);
}
- fclose (fp);
+ es_fclose (fp);
xfree (buffer);
gcry_md_final (md5);
@@ -2017,7 +2016,7 @@ crl_cache_insert (ctrl_t ctrl, const char *url, ksba_reader_t reader)
*p = '.';
fname = make_filename (opt.homedir_cache, DBDIR_D, tmpfname, NULL);
xfree (tmpfname);
- if (!remove (fname))
+ if (!gnupg_remove (fname))
log_info (_("removed stale temporary cache file `%s'\n"), fname);
else if (errno != ENOENT)
{
@@ -2198,7 +2197,7 @@ crl_cache_insert (ctrl_t ctrl, const char *url, ksba_reader_t reader)
close (fd_cdb);
if (fname)
{
- remove (fname);
+ gnupg_remove (fname);
xfree (fname);
}
xfree (newfname);
@@ -2214,7 +2213,7 @@ crl_cache_insert (ctrl_t ctrl, const char *url, ksba_reader_t reader)
/* Print one cached entry E in a human readable format to stream
FP. Return 0 on success. */
static gpg_error_t
-list_one_crl_entry (crl_cache_t cache, crl_cache_entry_t e, FILE *fp)
+list_one_crl_entry (crl_cache_t cache, crl_cache_entry_t e, estream_t fp)
{
struct cdb_find cdbfp;
struct cdb *cdb;
@@ -2222,44 +2221,46 @@ list_one_crl_entry (crl_cache_t cache, crl_cache_entry_t e, FILE *fp)
int warn = 0;
const unsigned char *s;
- fputs ("--------------------------------------------------------\n", fp );
- fprintf (fp, _("Begin CRL dump (retrieved via %s)\n"), e->url );
- fprintf (fp, " Issuer:\t%s\n", e->issuer );
- fprintf (fp, " Issuer Hash:\t%s\n", e->issuer_hash );
- fprintf (fp, " This Update:\t%s\n", e->this_update );
- fprintf (fp, " Next Update:\t%s\n", e->next_update );
- fprintf (fp, " CRL Number :\t%s\n", e->crl_number? e->crl_number: "none");
- fprintf (fp, " AuthKeyId :\t%s\n",
- e->authority_serialno? e->authority_serialno:"none");
+ es_fputs ("--------------------------------------------------------\n", fp );
+ es_fprintf (fp, _("Begin CRL dump (retrieved via %s)\n"), e->url );
+ es_fprintf (fp, " Issuer:\t%s\n", e->issuer );
+ es_fprintf (fp, " Issuer Hash:\t%s\n", e->issuer_hash );
+ es_fprintf (fp, " This Update:\t%s\n", e->this_update );
+ es_fprintf (fp, " Next Update:\t%s\n", e->next_update );
+ es_fprintf (fp, " CRL Number :\t%s\n", e->crl_number? e->crl_number: "none");
+ es_fprintf (fp, " AuthKeyId :\t%s\n",
+ e->authority_serialno? e->authority_serialno:"none");
if (e->authority_serialno && e->authority_issuer)
{
- fputs (" \t", fp);
+ es_fputs (" \t", fp);
for (s=e->authority_issuer; *s; s++)
if (*s == '\x01')
- fputs ("\n \t", fp);
+ es_fputs ("\n \t", fp);
else
- putc (*s, fp);
- putc ('\n', fp);
+ es_putc (*s, fp);
+ es_putc ('\n', fp);
}
- fprintf (fp, " Trust Check:\t%s\n",
- !e->user_trust_req? "[system]" :
- e->check_trust_anchor? e->check_trust_anchor:"[missing]");
+ es_fprintf (fp, " Trust Check:\t%s\n",
+ !e->user_trust_req? "[system]" :
+ e->check_trust_anchor? e->check_trust_anchor:"[missing]");
if ((e->invalid & 1))
- fprintf (fp, _(" ERROR: The CRL will not be used because it was still too old after an update!\n"));
+ es_fprintf (fp, _(" ERROR: The CRL will not be used "
+ "because it was still too old after an update!\n"));
if ((e->invalid & 2))
- fprintf (fp, _(" ERROR: The CRL will not be used due to an unknown critical extension!\n"));
+ es_fprintf (fp, _(" ERROR: The CRL will not be used "
+ "due to an unknown critical extension!\n"));
if ((e->invalid & ~3))
- fprintf (fp, _(" ERROR: The CRL will not be used\n"));
+ es_fprintf (fp, _(" ERROR: The CRL will not be used\n"));
cdb = lock_db_file (cache, e);
if (!cdb)
return gpg_error (GPG_ERR_GENERAL);
if (!e->dbfile_checked)
- fprintf (fp, _(" ERROR: This cached CRL may has been tampered with!\n"));
+ es_fprintf (fp, _(" ERROR: This cached CRL may has been tampered with!\n"));
- putc ('\n', fp);
+ es_putc ('\n', fp);
rc = cdb_findinit (&cdbfp, cdb, NULL, 0);
while (!rc && (rc=cdb_findnext (&cdbfp)) > 0 )
@@ -2299,36 +2300,36 @@ list_one_crl_entry (crl_cache_t cache, crl_cache_entry_t e, FILE *fp)
}
reason = *record;
- fputs (" ", fp);
+ es_fputs (" ", fp);
for (i = 0; i < n; i++)
- fprintf (fp, "%02X", keyrecord[i]);
- fputs (":\t reasons( ", fp);
+ es_fprintf (fp, "%02X", keyrecord[i]);
+ es_fputs (":\t reasons( ", fp);
if (reason & KSBA_CRLREASON_UNSPECIFIED)
- fputs( "unspecified ", fp ), any = 1;
+ es_fputs( "unspecified ", fp ), any = 1;
if (reason & KSBA_CRLREASON_KEY_COMPROMISE )
- fputs( "key_compromise ", fp ), any = 1;
+ es_fputs( "key_compromise ", fp ), any = 1;
if (reason & KSBA_CRLREASON_CA_COMPROMISE )
- fputs( "ca_compromise ", fp ), any = 1;
+ es_fputs( "ca_compromise ", fp ), any = 1;
if (reason & KSBA_CRLREASON_AFFILIATION_CHANGED )
- fputs( "affiliation_changed ", fp ), any = 1;
+ es_fputs( "affiliation_changed ", fp ), any = 1;
if (reason & KSBA_CRLREASON_SUPERSEDED )
- fputs( "superseeded", fp ), any = 1;
+ es_fputs( "superseeded", fp ), any = 1;
if (reason & KSBA_CRLREASON_CESSATION_OF_OPERATION )
- fputs( "cessation_of_operation", fp ), any = 1;
+ es_fputs( "cessation_of_operation", fp ), any = 1;
if (reason & KSBA_CRLREASON_CERTIFICATE_HOLD )
- fputs( "certificate_hold", fp ), any = 1;
+ es_fputs( "certificate_hold", fp ), any = 1;
if (reason && !any)
- fputs( "other", fp );
+ es_fputs( "other", fp );
- fprintf (fp, ") rdate: %.15s\n", record+1);
+ es_fprintf (fp, ") rdate: %.15s\n", record+1);
}
if (rc)
log_error (_("error reading cache entry from db: %s\n"), strerror (rc));
unlock_db_file (cache, e);
- fprintf (fp, _("End CRL dump\n") );
- putc ('\n', fp);
+ es_fprintf (fp, _("End CRL dump\n") );
+ es_putc ('\n', fp);
return (rc||warn)? gpg_error (GPG_ERR_GENERAL) : 0;
}
@@ -2337,7 +2338,7 @@ list_one_crl_entry (crl_cache_t cache, crl_cache_entry_t e, FILE *fp)
/* Print the contents of the CRL CACHE in a human readable format to
stream FP. */
gpg_error_t
-crl_cache_list (FILE *fp)
+crl_cache_list (estream_t fp)
{
crl_cache_t cache = get_current_cache ();
crl_cache_entry_t entry;
@@ -2357,10 +2358,10 @@ gpg_error_t
crl_cache_load (ctrl_t ctrl, const char *filename)
{
gpg_error_t err;
- FILE *fp;
+ estream_t fp;
ksba_reader_t reader;
- fp = fopen (filename, "r");
+ fp = es_fopen (filename, "r");
if (!fp)
{
err = gpg_error_from_errno (errno);
@@ -2380,7 +2381,7 @@ crl_cache_load (ctrl_t ctrl, const char *filename)
}
err = crl_cache_insert (ctrl, filename, reader);
ksba_reader_release (reader);
- fclose (fp);
+ es_fclose (fp);
return err;
}