From f606d589b9434611c3842592a739b4d49a201043 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dag-Erling=20Sm=C3=B8rgrav?= Date: Tue, 11 Jun 2002 11:27:28 +0000 Subject: [PATCH] Add a reference count to struct fetchconn so we don't prematurely close and free a cached FTP connection. --- lib/libfetch/common.c | 19 +++++++++++++++++++ lib/libfetch/common.h | 2 ++ lib/libfetch/ftp.c | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/libfetch/common.c b/lib/libfetch/common.c index c234fab6a410..2ebb29661f6d 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 d279e4d01ae3..42f68a8de6b1 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 7b1beced89dc..e703a01635dc 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); }