summaryrefslogtreecommitdiffstats
path: root/lib/libfetch
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>2002-06-11 11:27:28 +0000
committerdes <des@FreeBSD.org>2002-06-11 11:27:28 +0000
commit5064d0b266233c22e85f5845aaf1aa68ebee7d88 (patch)
treec30b6b79c2759e3145ef6c2364abfc4c383dfb65 /lib/libfetch
parentf85d0f00609e74ecc0af9af261884345400f1483 (diff)
downloadFreeBSD-src-5064d0b266233c22e85f5845aaf1aa68ebee7d88.zip
FreeBSD-src-5064d0b266233c22e85f5845aaf1aa68ebee7d88.tar.gz
Add a reference count to struct fetchconn so we don't prematurely close and
free a cached FTP connection.
Diffstat (limited to 'lib/libfetch')
-rw-r--r--lib/libfetch/common.c19
-rw-r--r--lib/libfetch/common.h2
-rw-r--r--lib/libfetch/ftp.c2
3 files changed, 22 insertions, 1 deletions
diff --git a/lib/libfetch/common.c b/lib/libfetch/common.c
index c234fab..2ebb296 100644
--- a/lib/libfetch/common.c
+++ b/lib/libfetch/common.c
@@ -195,6 +195,7 @@ _fetch_default_proxy_port(const char *scheme)
return (0);
}
+
/*
* Create a connection for an existing descriptor.
*/
@@ -207,6 +208,19 @@ _fetch_reopen(int sd)
if ((conn = calloc(1, sizeof *conn)) == NULL)
return (NULL);
conn->sd = sd;
+ ++conn->ref;
+ return (conn);
+}
+
+
+/*
+ * Bump a connection's reference count.
+ */
+conn_t *
+_fetch_ref(conn_t *conn)
+{
+
+ ++conn->ref;
return (conn);
}
@@ -319,6 +333,7 @@ _fetch_ssl(conn_t *conn, int verbose)
#endif
}
+
/*
* Read a character from a connection w/ timeout
*/
@@ -377,6 +392,7 @@ _fetch_read(conn_t *conn, char *buf, size_t len)
return (total);
}
+
/*
* Read a line of text from a connection w/ timeout
*/
@@ -483,6 +499,7 @@ _fetch_write(conn_t *conn, const char *buf, size_t len)
return (total);
}
+
/*
* Write a line of text to a connection w/ timeout
*/
@@ -504,6 +521,8 @@ _fetch_close(conn_t *conn)
{
int ret;
+ if (--conn->ref > 0)
+ return (0);
ret = close(conn->sd);
free(conn);
return (ret);
diff --git a/lib/libfetch/common.h b/lib/libfetch/common.h
index d279e4d..42f68a8 100644
--- a/lib/libfetch/common.h
+++ b/lib/libfetch/common.h
@@ -58,6 +58,7 @@ struct fetchconn {
X509 *ssl_cert; /* server certificate */
SSL_METHOD *ssl_meth; /* SSL method */
#endif
+ int ref; /* reference count */
};
/* Structure used for error message lists */
@@ -74,6 +75,7 @@ int _fetch_default_port(const char *);
int _fetch_default_proxy_port(const char *);
conn_t *_fetch_connect(const char *, int, int, int);
conn_t *_fetch_reopen(int);
+conn_t *_fetch_ref(conn_t *);
int _fetch_ssl(conn_t *, int);
ssize_t _fetch_read(conn_t *, char *, size_t);
int _fetch_getln(conn_t *);
diff --git a/lib/libfetch/ftp.c b/lib/libfetch/ftp.c
index 7b1bece..e703a01 100644
--- a/lib/libfetch/ftp.c
+++ b/lib/libfetch/ftp.c
@@ -874,7 +874,7 @@ _ftp_cached_connect(struct url *url, struct url *purl, const char *flags)
return (NULL);
if (cached_connection)
_ftp_disconnect(cached_connection);
- cached_connection = conn;
+ cached_connection = _fetch_ref(conn);
memcpy(&cached_host, url, sizeof *url);
return (conn);
}
OpenPOWER on IntegriCloud