aboutsummaryrefslogtreecommitdiffstats
path: root/agent/findkey.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--agent/findkey.c81
1 files changed, 35 insertions, 46 deletions
diff --git a/agent/findkey.c b/agent/findkey.c
index 9405342d1..30aa7c938 100644
--- a/agent/findkey.c
+++ b/agent/findkey.c
@@ -57,9 +57,8 @@ agent_write_private_key (const unsigned char *grip,
const void *buffer, size_t length, int force)
{
char *fname;
- FILE *fp;
+ estream_t fp;
char hexgrip[40+4+1];
- int fd;
bin2hex (grip, 20, hexgrip);
strcpy (hexgrip+40, ".key");
@@ -73,53 +72,30 @@ agent_write_private_key (const unsigned char *grip,
return gpg_error (GPG_ERR_GENERAL);
}
- /* In FORCE mode we would like to create FNAME but only if it does
- not already exist. We cannot make this guarantee just using
- POSIX (GNU provides the "x" opentype for fopen, however, this is
- not portable). Thus, we use the more flexible open function and
- then use fdopen to obtain a stream. */
- fd = open (fname, force? (O_CREAT | O_TRUNC | O_WRONLY | O_BINARY)
- : (O_CREAT | O_EXCL | O_WRONLY | O_BINARY),
- S_IRUSR | S_IWUSR
-#ifndef HAVE_W32_SYSTEM
- | S_IRGRP
-#endif
- );
- if (fd < 0)
- fp = NULL;
- else
- {
- fp = fdopen (fd, "wb");
- if (!fp)
- {
- int save_e = errno;
- close (fd);
- errno = save_e;
- }
- }
-
+ /* FIXME: On POSIX systems we used include S_IRGRP as well. */
+ fp = es_fopen (fname, force? "wb" : "wbx");
if (!fp)
{
- gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno));
- log_error ("can't create `%s': %s\n", fname, strerror (errno));
+ gpg_error_t tmperr = gpg_error_from_syserror ();
+ log_error ("can't create `%s': %s\n", fname, gpg_strerror (tmperr));
xfree (fname);
return tmperr;
}
- if (fwrite (buffer, length, 1, fp) != 1)
+ if (es_fwrite (buffer, length, 1, fp) != 1)
{
- gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno));
- log_error ("error writing `%s': %s\n", fname, strerror (errno));
- fclose (fp);
- remove (fname);
+ gpg_error_t tmperr = gpg_error_from_syserror ();
+ log_error ("error writing `%s': %s\n", fname, gpg_strerror (tmperr));
+ es_fclose (fp);
+ gnupg_remove (fname);
xfree (fname);
return tmperr;
}
- if ( fclose (fp) )
+ if (es_fclose (fp))
{
- gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno));
- log_error ("error closing `%s': %s\n", fname, strerror (errno));
- remove (fname);
+ gpg_error_t tmperr = gpg_error_from_syserror ();
+ log_error ("error closing `%s': %s\n", fname, gpg_strerror (tmperr));
+ gnupg_remove (fname);
xfree (fname);
return tmperr;
}
@@ -425,7 +401,7 @@ read_key_file (const unsigned char *grip, gcry_sexp_t *result)
{
int rc;
char *fname;
- FILE *fp;
+ estream_t fp;
struct stat st;
unsigned char *buf;
size_t buflen, erroff;
@@ -438,7 +414,7 @@ read_key_file (const unsigned char *grip, gcry_sexp_t *result)
strcpy (hexgrip+40, ".key");
fname = make_filename (opt.homedir, GNUPG_PRIVATE_KEYS_DIR, hexgrip, NULL);
- fp = fopen (fname, "rb");
+ fp = es_fopen (fname, "rb");
if (!fp)
{
rc = gpg_error_from_syserror ();
@@ -448,23 +424,36 @@ read_key_file (const unsigned char *grip, gcry_sexp_t *result)
return rc;
}
- if (fstat (fileno(fp), &st))
+ if (fstat (es_fileno (fp), &st))
{
rc = gpg_error_from_syserror ();
log_error ("can't stat `%s': %s\n", fname, strerror (errno));
xfree (fname);
- fclose (fp);
+ es_fclose (fp);
return rc;
}
buflen = st.st_size;
buf = xtrymalloc (buflen+1);
- if (!buf || fread (buf, buflen, 1, fp) != 1)
+ if (!buf)
+ {
+ rc = gpg_error_from_syserror ();
+ log_error ("error allocating %zu bytes for `%s': %s\n",
+ buflen, fname, strerror (errno));
+ xfree (fname);
+ es_fclose (fp);
+ xfree (buf);
+ return rc;
+
+ }
+
+ if (es_fread (buf, buflen, 1, fp) != 1)
{
rc = gpg_error_from_syserror ();
- log_error ("error reading `%s': %s\n", fname, strerror (errno));
+ log_error ("error reading %zu bytes from `%s': %s\n",
+ buflen, fname, strerror (errno));
xfree (fname);
- fclose (fp);
+ es_fclose (fp);
xfree (buf);
return rc;
}
@@ -472,7 +461,7 @@ read_key_file (const unsigned char *grip, gcry_sexp_t *result)
/* Convert the file into a gcrypt S-expression object. */
rc = gcry_sexp_sscan (&s_skey, &erroff, (char*)buf, buflen);
xfree (fname);
- fclose (fp);
+ es_fclose (fp);
xfree (buf);
if (rc)
{