aboutsummaryrefslogtreecommitdiffstats
path: root/camel/camel-tcp-stream-ssl.c
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@ximian.com>2003-03-22 02:54:52 +0800
committerJeffrey Stedfast <fejj@src.gnome.org>2003-03-22 02:54:52 +0800
commit911fdb7885bba5043b823f99896e7d9b62b52b1f (patch)
tree37fb24ac3fc983a490e40187dd93f1d9169b4a85 /camel/camel-tcp-stream-ssl.c
parentd66fdafdb7a8cca96aca191c717850a921be1984 (diff)
downloadgsoc2013-evolution-911fdb7885bba5043b823f99896e7d9b62b52b1f.tar
gsoc2013-evolution-911fdb7885bba5043b823f99896e7d9b62b52b1f.tar.gz
gsoc2013-evolution-911fdb7885bba5043b823f99896e7d9b62b52b1f.tar.bz2
gsoc2013-evolution-911fdb7885bba5043b823f99896e7d9b62b52b1f.tar.lz
gsoc2013-evolution-911fdb7885bba5043b823f99896e7d9b62b52b1f.tar.xz
gsoc2013-evolution-911fdb7885bba5043b823f99896e7d9b62b52b1f.tar.zst
gsoc2013-evolution-911fdb7885bba5043b823f99896e7d9b62b52b1f.zip
continue reading the cert file until we've read it all or get a non-EINTR
2003-03-21 Jeffrey Stedfast <fejj@ximian.com> * camel-tcp-stream-ssl.c (camel_certdb_nss_cert_get): continue reading the cert file until we've read it all or get a non-EINTR errno. svn path=/trunk/; revision=20457
Diffstat (limited to 'camel/camel-tcp-stream-ssl.c')
-rw-r--r--camel/camel-tcp-stream-ssl.c26
1 files changed, 19 insertions, 7 deletions
diff --git a/camel/camel-tcp-stream-ssl.c b/camel/camel-tcp-stream-ssl.c
index 614b3c552e..3a3f234544 100644
--- a/camel/camel-tcp-stream-ssl.c
+++ b/camel/camel-tcp-stream-ssl.c
@@ -630,9 +630,10 @@ camel_certdb_nss_cert_get(CamelCertDB *certdb, CERTCertificate *cert)
{
char *fingerprint, *path;
CamelCert *ccert;
- int fd;
- ssize_t len;
struct stat st;
+ size_t nread;
+ ssize_t n;
+ int fd;
fingerprint = cert_fingerprint (cert);
ccert = camel_certdb_get_cert (certdb, fingerprint);
@@ -656,11 +657,22 @@ camel_certdb_nss_cert_get(CamelCertDB *certdb, CERTCertificate *cert)
g_free(path);
ccert->rawcert = g_byte_array_new ();
- g_byte_array_set_size(ccert->rawcert, st.st_size);
- len = read(fd, ccert->rawcert->data, st.st_size);
- close(fd);
- if (len != st.st_size) {
- g_warning ("cert size read truncated %s: %d != %ld", path, len, st.st_size);
+ g_byte_array_set_size (ccert->rawcert, st.st_size);
+
+ nread = 0;
+ do {
+ do {
+ n = read (fd, ccert->rawcert->data + nread, st.st_size - nread);
+ } while (n == -1 && errno == EINTR);
+
+ if (n > 0)
+ nread += n;
+ } while (nread < st.st_size && n != -1);
+
+ close (fd);
+
+ if (nread != st.st_size) {
+ g_warning ("cert size read truncated %s: %d != %ld", path, nread, st.st_size);
g_byte_array_free(ccert->rawcert, TRUE);
ccert->rawcert = NULL;
g_free(fingerprint);