bin/151866: [libfetch] [patch] closing the cached FTP connection

Mark Johnston markjdb at gmail.com
Mon Nov 1 15:10:07 UTC 2010


>Number:         151866
>Category:       bin
>Synopsis:       [libfetch] [patch] closing the cached FTP connection
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Mon Nov 01 15:10:07 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Mark Johnston
>Release:        8.1-RELEASE
>Organization:
Sandvine Inc.
>Environment:
FreeBSD mark-laptop-bsd.mark-home 8.1-RELEASE FreeBSD 8.1-RELEASE #2: Mon Oct 25 15:07:21 EDT 2010     root at mark-laptop-bsd.mark-home:/usr/obj/usr/src/sys/GENERIC  i386
>Description:
This patch adds a function to libfetch which allows programs to close the cached socket that libfetch holds on to when performing a file transfer.

See http://lists.freebsd.org/pipermail/freebsd-current/2010-October/020694.html
>How-To-Repeat:
Running this test program and using sockstat demonstrates the issue.

#include <stdlib.h>
#include <stdio.h>
#include <sys/param.h>
#include <fetch.h>

#define URL "ftp://ftp.freebsd.org/pub/FreeBSD/releases/README.TXT"

int
main(int argc, char **argv)
{
        char c;
        FILE *f = fetchGetURL(URL, NULL);
        if (!f) {
                printf("Error: could not open connection.\n");
                return (1);
        }

        while (!feof(f)) {
                fread(&c, sizeof(char), 1, f);
                putchar(c);
        }

        printf("Transfer complete.\n");
        fclose(f);

        if (fork())
                //Close the cached FTP connection.
                //fetchCloseCachedFTP();
        else
                for ( ;; ) ;

        return (0);
}
>Fix:
My patch adds a function to libfetch which makes it possible to force close the cached connection. Included is a patch to pkg_add(1) which fixes the problem described in the email.

Patch attached with submission follows:

diff --git a/lib/libfetch/fetch.h b/lib/libfetch/fetch.h
index 11a3f77..d379e63 100644
--- a/lib/libfetch/fetch.h
+++ b/lib/libfetch/fetch.h
@@ -109,6 +109,7 @@ FILE		*fetchGetFTP(struct url *, const char *);
 FILE		*fetchPutFTP(struct url *, const char *);
 int		 fetchStatFTP(struct url *, struct url_stat *, const char *);
 struct url_ent	*fetchListFTP(struct url *, const char *);
+void		 fetchCloseCachedFTP();
 
 /* Generic functions */
 FILE		*fetchXGetURL(const char *, struct url_stat *, const char *);
diff --git a/lib/libfetch/ftp.c b/lib/libfetch/ftp.c
index 0983a76..746ad54 100644
--- a/lib/libfetch/ftp.c
+++ b/lib/libfetch/ftp.c
@@ -1204,3 +1204,12 @@ fetchListFTP(struct url *url __unused, const char *flags __unused)
 	warnx("fetchListFTP(): not implemented");
 	return (NULL);
 }
+
+/*
+ * Force close the cached connection.
+ */
+void
+fetchCloseCachedFTP()
+{
+	ftp_disconnect(cached_connection);
+}
diff --git a/usr.sbin/pkg_install/lib/url.c b/usr.sbin/pkg_install/lib/url.c
index 914ce39..68f31bb 100644
--- a/usr.sbin/pkg_install/lib/url.c
+++ b/usr.sbin/pkg_install/lib/url.c
@@ -163,5 +163,6 @@ fileGetURL(const char *base, const char *spec, int keep_package)
 	printf("tar command returns %d status\n", WEXITSTATUS(pstat));
     if (rp && (isatty(0) || Verbose))
 	printf(" Done.\n");
+    fetchCloseCachedFTP();
     return rp;
 }


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list