diff options
author | joerg <joerg@pkgsrc.org> | 2008-04-19 14:49:23 +0000 |
---|---|---|
committer | joerg <joerg@pkgsrc.org> | 2008-04-19 14:49:23 +0000 |
commit | b4415d1d0b1b68bbd5bd43bdbd730d0e14351540 (patch) | |
tree | c8f7cdd2298da2170804da214449f293b4aba974 | |
parent | 4f911b3f6019f4c720b74a6d73aad6348fa53645 (diff) | |
download | pkgsrc-b4415d1d0b1b68bbd5bd43bdbd730d0e14351540.tar.gz |
libfetch-2.6:
Change fetchList API to always return lists of full URLs.
-rw-r--r-- | net/libfetch/Makefile | 4 | ||||
-rw-r--r-- | net/libfetch/buildlink3.mk | 4 | ||||
-rw-r--r-- | net/libfetch/files/common.c | 77 | ||||
-rw-r--r-- | net/libfetch/files/common.h | 5 | ||||
-rw-r--r-- | net/libfetch/files/fetch.3 | 79 | ||||
-rw-r--r-- | net/libfetch/files/fetch.c | 70 | ||||
-rw-r--r-- | net/libfetch/files/fetch.cat3 | 81 | ||||
-rw-r--r-- | net/libfetch/files/fetch.h | 32 | ||||
-rw-r--r-- | net/libfetch/files/file.c | 25 | ||||
-rw-r--r-- | net/libfetch/files/ftp.c | 28 | ||||
-rw-r--r-- | net/libfetch/files/http.c | 33 |
11 files changed, 177 insertions, 261 deletions
diff --git a/net/libfetch/Makefile b/net/libfetch/Makefile index d690dd9acd4..481b6137abb 100644 --- a/net/libfetch/Makefile +++ b/net/libfetch/Makefile @@ -1,7 +1,7 @@ -# $NetBSD: Makefile,v 1.8 2008/04/18 21:13:10 joerg Exp $ +# $NetBSD: Makefile,v 1.9 2008/04/19 14:49:23 joerg Exp $ # -DISTNAME= libfetch-2.5 +DISTNAME= libfetch-2.6 CATEGORIES= net MASTER_SITES= # empty DISTFILES= # empty diff --git a/net/libfetch/buildlink3.mk b/net/libfetch/buildlink3.mk index d3c764935e7..ea4178c3001 100644 --- a/net/libfetch/buildlink3.mk +++ b/net/libfetch/buildlink3.mk @@ -1,4 +1,4 @@ -# $NetBSD: buildlink3.mk,v 1.2 2008/04/02 15:33:14 joerg Exp $ +# $NetBSD: buildlink3.mk,v 1.3 2008/04/19 14:49:23 joerg Exp $ BUILDLINK_DEPMETHOD.libfetch?= build @@ -14,7 +14,7 @@ BUILDLINK_PACKAGES+= libfetch BUILDLINK_ORDER:= ${BUILDLINK_ORDER} ${BUILDLINK_DEPTH}libfetch .if ${LIBFETCH_BUILDLINK3_MK} == "+" -BUILDLINK_API_DEPENDS.libfetch+= libfetch>=2.1 +BUILDLINK_API_DEPENDS.libfetch+= libfetch>=2.5 BUILDLINK_PKGSRCDIR.libfetch?= ../../net/libfetch .endif # LIBFETCH_BUILDLINK3_MK diff --git a/net/libfetch/files/common.c b/net/libfetch/files/common.c index 730e53fd036..fe56ab27d94 100644 --- a/net/libfetch/files/common.c +++ b/net/libfetch/files/common.c @@ -1,4 +1,4 @@ -/* $NetBSD: common.c,v 1.7 2008/04/17 19:04:12 joerg Exp $ */ +/* $NetBSD: common.c,v 1.8 2008/04/19 14:49:23 joerg Exp $ */ /*- * Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav * Copyright (c) 2008 Joerg Sonnenberger <joerg@NetBSD.org> @@ -620,40 +620,75 @@ fetch_close(conn_t *conn) /*** Directory-related utility functions *************************************/ int -fetch_add_entry(struct url_ent **p, int *size, int *len, - const char *name, struct url_stat *us) +fetch_add_entry(struct url_list *ue, struct url *base, const char *name) { - struct url_ent *tmp; - - if (*p == NULL) { - *size = 0; - *len = 0; + struct url *tmp; + char *tmp_name; + size_t base_doc_len, name_len; + + if (strchr(name, '/') != NULL || + strcmp(name, "..") == 0 || + strcmp(name, ".") == 0) + return 0; + + base_doc_len = strlen(base->doc); + name_len = strlen(name); + tmp_name = malloc( base_doc_len + name_len + 2); + if (tmp_name == NULL) { + errno = ENOMEM; + fetch_syserr(); + return (-1); } - if (*len >= *size - 1) { - tmp = realloc(*p, (*size * 2 + 1) * sizeof(**p)); + if (ue->length + 1 >= ue->alloc_size) { + tmp = realloc(ue->urls, (ue->alloc_size * 2 + 1) * sizeof(*tmp)); if (tmp == NULL) { + free(tmp_name); errno = ENOMEM; fetch_syserr(); return (-1); } - *size = (*size * 2 + 1); - *p = tmp; + ue->alloc_size = ue->alloc_size * 2 + 1; + ue->urls = tmp; } - tmp = *p + *len; - snprintf(tmp->name, PATH_MAX, "%s", name); - if (us) - memcpy(&tmp->stat, us, sizeof(*us)); - else - memset(&tmp->stat, 0, sizeof(*us)); - - (*len)++; - (++tmp)->name[0] = 0; + tmp = ue->urls + ue->length; + strcpy(tmp->scheme, base->scheme); + strcpy(tmp->user, base->user); + strcpy(tmp->pwd, base->pwd); + strcpy(tmp->host, base->host); + tmp->port = base->port; + memcpy(tmp_name, base->doc, base_doc_len); + tmp_name[base_doc_len] = '/'; + memcpy(tmp_name + base_doc_len + 1, name, name_len); + tmp_name[base_doc_len + name_len + 1] = '/'; + tmp->doc = tmp_name; + tmp->offset = 0; + tmp->length = 0; + + ++ue->length; return (0); } +void +fetch_init_url_list(struct url_list *ue) +{ + ue->length = ue->alloc_size = 0; + ue->urls = NULL; +} + +void +fetch_free_url_list(struct url_list *ue) +{ + size_t i; + + for (i = 0; i < ue->length; ++i) + free(ue->urls[i].doc); + free(ue->urls); + ue->length = ue->alloc_size = 0; +} + /*** Authentication-related utility functions ********************************/ diff --git a/net/libfetch/files/common.h b/net/libfetch/files/common.h index 0ae1f1a1400..f19230674a5 100644 --- a/net/libfetch/files/common.h +++ b/net/libfetch/files/common.h @@ -1,4 +1,4 @@ -/* $NetBSD: common.h,v 1.5 2008/04/05 02:42:13 joerg Exp $ */ +/* $NetBSD: common.h,v 1.6 2008/04/19 14:49:23 joerg Exp $ */ /*- * Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav * All rights reserved. @@ -93,8 +93,7 @@ ssize_t fetch_write(conn_t *, const char *, size_t); ssize_t fetch_writev(conn_t *, struct iovec *, int); int fetch_putln(conn_t *, const char *, size_t); int fetch_close(conn_t *); -int fetch_add_entry(struct url_ent **, int *, int *, - const char *, struct url_stat *); +int fetch_add_entry(struct url_list *, struct url *, const char *); int fetch_netrc_auth(struct url *url); int fetch_no_proxy_match(const char *); diff --git a/net/libfetch/files/fetch.3 b/net/libfetch/files/fetch.3 index b2ebe2e6f16..49800161836 100644 --- a/net/libfetch/files/fetch.3 +++ b/net/libfetch/files/fetch.3 @@ -24,9 +24,9 @@ .\" SUCH DAMAGE. .\" .\" $FreeBSD: fetch.3,v 1.64 2007/12/18 11:03:26 des Exp $ -.\" $NetBSD: fetch.3,v 1.4 2008/04/04 22:37:28 joerg Exp $ +.\" $NetBSD: fetch.3,v 1.5 2008/04/19 14:49:23 joerg Exp $ .\" -.Dd December 18, 2007 +.Dd April 19, 2008 .Dt FETCH 3 .Os .Sh NAME @@ -37,31 +37,26 @@ .Nm fetchGetURL , .Nm fetchPutURL , .Nm fetchStatURL , -.Nm fetchFilteredListURL , .Nm fetchListURL , .Nm fetchXGet , .Nm fetchGet , .Nm fetchPut , .Nm fetchStat , -.Nm fetchFilteredList , .Nm fetchList , .Nm fetchXGetFile , .Nm fetchGetFile , .Nm fetchPutFile , .Nm fetchStatFile , -.Nm fetchFilteredListFile , .Nm fetchListFile , .Nm fetchXGetHTTP , .Nm fetchGetHTTP , .Nm fetchPutHTTP , .Nm fetchStatHTTP , -.Nm fetchFilteredListHTTP , .Nm fetchListHTTP , .Nm fetchXGetFTP , .Nm fetchGetFTP , .Nm fetchPutFTP , .Nm fetchStatFTP , -.Nm fetchFilteredListFTP .Nm fetchListFTP .Nd file transfer functions .Sh LIBRARY @@ -83,10 +78,8 @@ .Fn fetchPutURL "const char *URL" "const char *flags" .Ft int .Fn fetchStatURL "const char *URL" "struct url_stat *us" "const char *flags" -.Ft struct url_ent * -.Fn fetchFilteredListURL "const char *URL" "const char *pattern" "const char *flags" -.Ft struct url_ent * -.Fn fetchListURL "const char *URL" "const char *flags" +.Ft int +.Fn fetchListURL "struct url_list *list" "const char *URL" "const char *flags" .Ft fetchIO * .Fn fetchXGet "struct url *u" "struct url_stat *us" "const char *flags" .Ft fetchIO * @@ -95,10 +88,8 @@ .Fn fetchPut "struct url *u" "const char *flags" .Ft int .Fn fetchStat "struct url *u" "struct url_stat *us" "const char *flags" -.Ft struct url_ent * -.Fn fetchFilteredList "struct url *u" "const char *pattern" "const char *flags" -.Ft struct url_ent * -.Fn fetchList "struct url *u" "const char *flags" +.Ft int +.Fn fetchList "struct url_list *list" "struct url *u" "const char *flags" .Ft fetchIO * .Fn fetchXGetFile "struct url *u" "struct url_stat *us" "const char *flags" .Ft fetchIO * @@ -107,10 +98,8 @@ .Fn fetchPutFile "struct url *u" "const char *flags" .Ft int .Fn fetchStatFile "struct url *u" "struct url_stat *us" "const char *flags" -.Ft struct url_ent * -.Fn fetchFilteredListFile "struct url *u" "const char *pattern" "const char *flags" -.Ft struct url_ent * -.Fn fetchListFile "struct url *u" "const char *flags" +.Ft int +.Fn fetchListFile "struct url_list *list" "struct url *u" "const char *flags" .Ft fetchIO * .Fn fetchXGetHTTP "struct url *u" "struct url_stat *us" "const char *flags" .Ft fetchIO * @@ -119,10 +108,8 @@ .Fn fetchPutHTTP "struct url *u" "const char *flags" .Ft int .Fn fetchStatHTTP "struct url *u" "struct url_stat *us" "const char *flags" -.Ft struct url_ent * -.Fn fetchFilteredListHTTP "struct url *u" "const char *pattern" "const char *flags" -.Ft struct url_ent * -.Fn fetchListHTTP "struct url *u" "const char *flags" +.Ft int +.Fn fetchListHTTP "struct url_list *list" "struct url *u" "const char *flags" .Ft fetchIO * .Fn fetchXGetFTP "struct url *u" "struct url_stat *us" "const char *flags" .Ft fetchIO * @@ -131,10 +118,8 @@ .Fn fetchPutFTP "struct url *u" "const char *flags" .Ft int .Fn fetchStatFTP "struct url *u" "struct url_stat *us" "const char *flags" -.Ft struct url_ent * -.Fn fetchFilteredListFTP "struct url *u" "const char *pattern" "const char *flags" -.Ft struct url_ent * -.Fn fetchListFTP "struct url *u" "const char *flags" +.Ft int +.Fn fetchListFTP "struct url_list *list" "struct url *u" "const char *flags" .Sh DESCRIPTION These functions implement a high-level library for retrieving and uploading files using Uniform Resource Locators (URLs). @@ -241,34 +226,28 @@ If the access time could not be obtained from the server, the field is set to the modification time. .Pp .Fn fetchListURL -attempts to list the contents of the directory pointed to by the URL -provided. -If successful, it returns a malloced array of -.Vt url_ent -structures. +attempts to list the contents of the directory pointed to by the URL provided. +The pattern can be a simple glob-like expression as hint. +Callers should not depend on the server to filter names. +If successful, it appends the list of entries to the +.Vt url_list +structure. The -.Vt url_ent +.Vt url_list structure is defined as follows in .In fetch.h : .Bd -literal -struct url_ent { - char name[PATH_MAX]; - struct url_stat stat; +struct url_list { + size_t length; + size_t alloc_size; + struct url *urls; }; .Ed .Pp -The list is terminated by an entry with an empty name. -.Pp -The pointer returned by -.Fn fetchListURL -should be freed using -.Fn free . -.Pp -.Fn fetchFilteredListURL -works like -.Fn fetchListURL , -but filters the list according to the given glob pattern. -Only * and ? should be used in the pattern. +The list should be initialised by calling +.Fn fetch_init_url_list +and the entries be freed by calling +.Fn fetch_free_url_list . .Pp .Fn fetchXGet , .Fn fetchGet , @@ -674,9 +653,7 @@ This manual page was written by Some parts of the library are not yet implemented. The most notable examples of this are -.Fn fetchPutHTTP , -.Fn fetchListHTTP , -.Fn fetchListFTP +.Fn fetchPutHTTP and FTP proxy support. .Pp There is no way to select a proxy at run-time other than setting the diff --git a/net/libfetch/files/fetch.c b/net/libfetch/files/fetch.c index 508d52f356d..d17227196d6 100644 --- a/net/libfetch/files/fetch.c +++ b/net/libfetch/files/fetch.c @@ -1,4 +1,4 @@ -/* $NetBSD: fetch.c,v 1.3 2008/04/04 22:37:28 joerg Exp $ */ +/* $NetBSD: fetch.c,v 1.4 2008/04/19 14:49:23 joerg Exp $ */ /*- * Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav * All rights reserved. @@ -153,44 +153,23 @@ fetchStat(struct url *URL, struct url_stat *us, const char *flags) * Select the appropriate protocol for the URL scheme, and return a * list of files in the directory pointed to by the URL. */ -struct url_ent * -fetchList(struct url *URL, const char *flags) +int +fetchList(struct url_list *ue, struct url *URL, const char *pattern, + const char *flags) { int direct; direct = CHECK_FLAG('d'); if (strcasecmp(URL->scheme, SCHEME_FILE) == 0) - return (fetchListFile(URL, flags)); + return (fetchListFile(ue, URL, pattern, flags)); else if (strcasecmp(URL->scheme, SCHEME_FTP) == 0) - return (fetchListFTP(URL, flags)); + return (fetchListFTP(ue, URL, pattern, flags)); else if (strcasecmp(URL->scheme, SCHEME_HTTP) == 0) - return (fetchListHTTP(URL, flags)); + return (fetchListHTTP(ue, URL, pattern, flags)); else if (strcasecmp(URL->scheme, SCHEME_HTTPS) == 0) - return (fetchListHTTP(URL, flags)); + return (fetchListHTTP(ue, URL, pattern, flags)); url_seterr(URL_BAD_SCHEME); - return (NULL); -} - -/* - * Select the appropriate protocol for the URL scheme, and return a - * list of files in the directory pointed to by the URL. - */ -struct url_ent * -fetchFilteredList(struct url *URL, const char *pattern, const char *flags) -{ - int direct; - - direct = CHECK_FLAG('d'); - if (strcasecmp(URL->scheme, SCHEME_FILE) == 0) - return (fetchFilteredListFile(URL, pattern, flags)); - else if (strcasecmp(URL->scheme, SCHEME_FTP) == 0) - return (fetchFilteredListFTP(URL, pattern, flags)); - else if (strcasecmp(URL->scheme, SCHEME_HTTP) == 0) - return (fetchFilteredListHTTP(URL, pattern, flags)); - else if (strcasecmp(URL->scheme, SCHEME_HTTPS) == 0) - return (fetchFilteredListHTTP(URL, pattern, flags)); - url_seterr(URL_BAD_SCHEME); - return (NULL); + return -1; } /* @@ -259,37 +238,20 @@ fetchStatURL(const char *URL, struct url_stat *us, const char *flags) /* * Attempt to parse the given URL; if successful, call fetchList(). */ -struct url_ent * -fetchListURL(const char *URL, const char *flags) -{ - struct url *u; - struct url_ent *ue; - - if ((u = fetchParseURL(URL)) == NULL) - return (NULL); - - ue = fetchList(u, flags); - - fetchFreeURL(u); - return (ue); -} - -/* - * Attempt to parse the given URL; if successful, call fetchList(). - */ -struct url_ent * -fetchFilteredListURL(const char *URL, const char *pattern, const char *flags) +int +fetchListURL(struct url_list *ue, const char *URL, const char *pattern, + const char *flags) { struct url *u; - struct url_ent *ue; + int rv; if ((u = fetchParseURL(URL)) == NULL) - return (NULL); + return -1; - ue = fetchFilteredList(u, pattern, flags); + rv = fetchList(ue, u, pattern, flags); fetchFreeURL(u); - return (ue); + return rv; } /* diff --git a/net/libfetch/files/fetch.cat3 b/net/libfetch/files/fetch.cat3 index 230d950a9ce..48fd3d92c2b 100644 --- a/net/libfetch/files/fetch.cat3 +++ b/net/libfetch/files/fetch.cat3 @@ -2,13 +2,11 @@ FETCH(3) NetBSD Library Functions Manual FETCH(3) NNAAMMEE ffeettcchhMMaakkeeUURRLL, ffeettcchhPPaarrsseeUURRLL, ffeettcchhFFrreeeeUURRLL, ffeettcchhXXGGeettUURRLL, ffeettcchhGGeettUURRLL, - ffeettcchhPPuuttUURRLL, ffeettcchhSSttaattUURRLL, ffeettcchhFFiilltteerreeddLLiissttUURRLL, ffeettcchhLLiissttUURRLL, ffeettcchhXXGGeett, - ffeettcchhGGeett, ffeettcchhPPuutt, ffeettcchhSSttaatt, ffeettcchhFFiilltteerreeddLLiisstt, ffeettcchhLLiisstt, - ffeettcchhXXGGeettFFiillee, ffeettcchhGGeettFFiillee, ffeettcchhPPuuttFFiillee, ffeettcchhSSttaattFFiillee, - ffeettcchhFFiilltteerreeddLLiissttFFiillee, ffeettcchhLLiissttFFiillee, ffeettcchhXXGGeettHHTTTTPP, ffeettcchhGGeettHHTTTTPP, - ffeettcchhPPuuttHHTTTTPP, ffeettcchhSSttaattHHTTTTPP, ffeettcchhFFiilltteerreeddLLiissttHHTTTTPP, ffeettcchhLLiissttHHTTTTPP, - ffeettcchhXXGGeettFFTTPP, ffeettcchhGGeettFFTTPP, ffeettcchhPPuuttFFTTPP, ffeettcchhSSttaattFFTTPP, - ffeettcchhFFiilltteerreeddLLiissttFFTTPP ffeettcchhLLiissttFFTTPP -- file transfer functions + ffeettcchhPPuuttUURRLL, ffeettcchhSSttaattUURRLL, ffeettcchhLLiissttUURRLL, ffeettcchhXXGGeett, ffeettcchhGGeett, ffeettcchhPPuutt, + ffeettcchhSSttaatt, ffeettcchhLLiisstt, ffeettcchhXXGGeettFFiillee, ffeettcchhGGeettFFiillee, ffeettcchhPPuuttFFiillee, + ffeettcchhSSttaattFFiillee, ffeettcchhLLiissttFFiillee, ffeettcchhXXGGeettHHTTTTPP, ffeettcchhGGeettHHTTTTPP, ffeettcchhPPuuttHHTTTTPP, + ffeettcchhSSttaattHHTTTTPP, ffeettcchhLLiissttHHTTTTPP, ffeettcchhXXGGeettFFTTPP, ffeettcchhGGeettFFTTPP, ffeettcchhPPuuttFFTTPP, + ffeettcchhSSttaattFFTTPP, ffeettcchhLLiissttFFTTPP -- file transfer functions LLIIBBRRAARRYY library ``libfetch'' @@ -39,12 +37,8 @@ SSYYNNOOPPSSIISS _i_n_t ffeettcchhSSttaattUURRLL(_c_o_n_s_t _c_h_a_r _*_U_R_L, _s_t_r_u_c_t _u_r_l___s_t_a_t _*_u_s, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); - _s_t_r_u_c_t _u_r_l___e_n_t _* - ffeettcchhFFiilltteerreeddLLiissttUURRLL(_c_o_n_s_t _c_h_a_r _*_U_R_L, _c_o_n_s_t _c_h_a_r _*_p_a_t_t_e_r_n, - _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); - - _s_t_r_u_c_t _u_r_l___e_n_t _* - ffeettcchhLLiissttUURRLL(_c_o_n_s_t _c_h_a_r _*_U_R_L, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); + _i_n_t + ffeettcchhLLiissttUURRLL(_s_t_r_u_c_t _u_r_l___l_i_s_t _*_l_i_s_t, _c_o_n_s_t _c_h_a_r _*_U_R_L, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); _f_e_t_c_h_I_O _* ffeettcchhXXGGeett(_s_t_r_u_c_t _u_r_l _*_u, _s_t_r_u_c_t _u_r_l___s_t_a_t _*_u_s, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); @@ -58,11 +52,8 @@ SSYYNNOOPPSSIISS _i_n_t ffeettcchhSSttaatt(_s_t_r_u_c_t _u_r_l _*_u, _s_t_r_u_c_t _u_r_l___s_t_a_t _*_u_s, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); - _s_t_r_u_c_t _u_r_l___e_n_t _* - ffeettcchhFFiilltteerreeddLLiisstt(_s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_p_a_t_t_e_r_n, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); - - _s_t_r_u_c_t _u_r_l___e_n_t _* - ffeettcchhLLiisstt(_s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); + _i_n_t + ffeettcchhLLiisstt(_s_t_r_u_c_t _u_r_l___l_i_s_t _*_l_i_s_t, _s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); _f_e_t_c_h_I_O _* ffeettcchhXXGGeettFFiillee(_s_t_r_u_c_t _u_r_l _*_u, _s_t_r_u_c_t _u_r_l___s_t_a_t _*_u_s, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); @@ -76,12 +67,8 @@ SSYYNNOOPPSSIISS _i_n_t ffeettcchhSSttaattFFiillee(_s_t_r_u_c_t _u_r_l _*_u, _s_t_r_u_c_t _u_r_l___s_t_a_t _*_u_s, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); - _s_t_r_u_c_t _u_r_l___e_n_t _* - ffeettcchhFFiilltteerreeddLLiissttFFiillee(_s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_p_a_t_t_e_r_n, - _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); - - _s_t_r_u_c_t _u_r_l___e_n_t _* - ffeettcchhLLiissttFFiillee(_s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); + _i_n_t + ffeettcchhLLiissttFFiillee(_s_t_r_u_c_t _u_r_l___l_i_s_t _*_l_i_s_t, _s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); _f_e_t_c_h_I_O _* ffeettcchhXXGGeettHHTTTTPP(_s_t_r_u_c_t _u_r_l _*_u, _s_t_r_u_c_t _u_r_l___s_t_a_t _*_u_s, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); @@ -95,12 +82,8 @@ SSYYNNOOPPSSIISS _i_n_t ffeettcchhSSttaattHHTTTTPP(_s_t_r_u_c_t _u_r_l _*_u, _s_t_r_u_c_t _u_r_l___s_t_a_t _*_u_s, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); - _s_t_r_u_c_t _u_r_l___e_n_t _* - ffeettcchhFFiilltteerreeddLLiissttHHTTTTPP(_s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_p_a_t_t_e_r_n, - _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); - - _s_t_r_u_c_t _u_r_l___e_n_t _* - ffeettcchhLLiissttHHTTTTPP(_s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); + _i_n_t + ffeettcchhLLiissttHHTTTTPP(_s_t_r_u_c_t _u_r_l___l_i_s_t _*_l_i_s_t, _s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); _f_e_t_c_h_I_O _* ffeettcchhXXGGeettFFTTPP(_s_t_r_u_c_t _u_r_l _*_u, _s_t_r_u_c_t _u_r_l___s_t_a_t _*_u_s, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); @@ -114,12 +97,8 @@ SSYYNNOOPPSSIISS _i_n_t ffeettcchhSSttaattFFTTPP(_s_t_r_u_c_t _u_r_l _*_u, _s_t_r_u_c_t _u_r_l___s_t_a_t _*_u_s, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); - _s_t_r_u_c_t _u_r_l___e_n_t _* - ffeettcchhFFiilltteerreeddLLiissttFFTTPP(_s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_p_a_t_t_e_r_n, - _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); - - _s_t_r_u_c_t _u_r_l___e_n_t _* - ffeettcchhLLiissttFFTTPP(_s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); + _i_n_t + ffeettcchhLLiissttFFTTPP(_s_t_r_u_c_t _u_r_l___l_i_s_t _*_l_i_s_t, _s_t_r_u_c_t _u_r_l _*_u, _c_o_n_s_t _c_h_a_r _*_f_l_a_g_s); DDEESSCCRRIIPPTTIIOONN These functions implement a high-level library for retrieving and upload- @@ -191,22 +170,19 @@ DDEESSCCRRIIPPTTIIOONN time. ffeettcchhLLiissttUURRLL() attempts to list the contents of the directory pointed to - by the URL provided. If successful, it returns a malloced array of - _u_r_l___e_n_t structures. The _u_r_l___e_n_t structure is defined as follows in - <_f_e_t_c_h_._h>: - - struct url_ent { - char name[PATH_MAX]; - struct url_stat stat; + by the URL provided. The pattern can be a simple glob-like expression as + hint. Callers should not depend on the server to filter names. If suc- + cessful, it appends the list of entries to the _u_r_l___l_i_s_t structure. The + _u_r_l___l_i_s_t structure is defined as follows in <_f_e_t_c_h_._h>: + + struct url_list { + size_t length; + size_t alloc_size; + struct url *urls; }; - The list is terminated by an entry with an empty name. - - The pointer returned by ffeettcchhLLiissttUURRLL() should be freed using ffrreeee(). - - ffeettcchhFFiilltteerreeddLLiissttUURRLL() works like ffeettcchhLLiissttUURRLL(), but filters the list - according to the given glob pattern. Only * and ? should be used in the - pattern. + The list should be initialised by calling ffeettcchh__iinniitt__uurrll__lliisstt() and the + entries be freed by calling ffeettcchh__ffrreeee__uurrll__lliisstt(). ffeettcchhXXGGeett(), ffeettcchhGGeett(), ffeettcchhPPuutt() and ffeettcchhSSttaatt() are similar to ffeettcchhXXGGeettUURRLL(), ffeettcchhGGeettUURRLL(), ffeettcchhPPuuttUURRLL() and ffeettcchhSSttaattUURRLL(), except @@ -466,8 +442,7 @@ AAUUTTHHOORRSS BBUUGGSS Some parts of the library are not yet implemented. The most notable - examples of this are ffeettcchhPPuuttHHTTTTPP(), ffeettcchhLLiissttHHTTTTPP(), ffeettcchhLLiissttFFTTPP() and - FTP proxy support. + examples of this are ffeettcchhPPuuttHHTTTTPP() and FTP proxy support. There is no way to select a proxy at run-time other than setting the HTTP_PROXY or FTP_PROXY environment variables as appropriate. @@ -490,4 +465,4 @@ BBUUGGSS Some parts of the code are not fully reentrant. -NetBSD 4.0 December 18, 2007 NetBSD 4.0 +NetBSD 4.0 April 19, 2008 NetBSD 4.0 diff --git a/net/libfetch/files/fetch.h b/net/libfetch/files/fetch.h index 55378e303f1..86696eba7c2 100644 --- a/net/libfetch/files/fetch.h +++ b/net/libfetch/files/fetch.h @@ -1,4 +1,4 @@ -/* $NetBSD: fetch.h,v 1.5 2008/04/04 22:37:28 joerg Exp $ */ +/* $NetBSD: fetch.h,v 1.6 2008/04/19 14:49:23 joerg Exp $ */ /*- * Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav * All rights reserved. @@ -62,9 +62,10 @@ struct url_stat { time_t mtime; }; -struct url_ent { - char name[PATH_MAX]; - struct url_stat stat; +struct url_list { + size_t length; + size_t alloc_size; + struct url *urls; }; /* Recognized schemes */ @@ -107,39 +108,38 @@ fetchIO *fetchXGetFile(struct url *, struct url_stat *, const char *); fetchIO *fetchGetFile(struct url *, const char *); fetchIO *fetchPutFile(struct url *, const char *); int fetchStatFile(struct url *, struct url_stat *, const char *); -struct url_ent *fetchFilteredListFile(struct url *, const char *, +int fetchListFile(struct url_list *, struct url *, const char *, const char *); -struct url_ent *fetchListFile(struct url *, const char *); /* HTTP-specific functions */ fetchIO *fetchXGetHTTP(struct url *, struct url_stat *, const char *); fetchIO *fetchGetHTTP(struct url *, const char *); fetchIO *fetchPutHTTP(struct url *, const char *); int fetchStatHTTP(struct url *, struct url_stat *, const char *); -struct url_ent *fetchFilteredListHTTP(struct url *,const char *, const char *); -struct url_ent *fetchListHTTP(struct url *, const char *); +int fetchListHTTP(struct url_list *, struct url *, const char *, + const char *); /* FTP-specific functions */ fetchIO *fetchXGetFTP(struct url *, struct url_stat *, const char *); fetchIO *fetchGetFTP(struct url *, const char *); fetchIO *fetchPutFTP(struct url *, const char *); int fetchStatFTP(struct url *, struct url_stat *, const char *); -struct url_ent *fetchFilteredListFTP(struct url *, const char *, const char *); -struct url_ent *fetchListFTP(struct url *, const char *); +int fetchListFTP(struct url_list *, struct url *, const char *, + const char *); /* Generic functions */ fetchIO *fetchXGetURL(const char *, struct url_stat *, const char *); fetchIO *fetchGetURL(const char *, const char *); fetchIO *fetchPutURL(const char *, const char *); int fetchStatURL(const char *, struct url_stat *, const char *); -struct url_ent *fetchFilteredListURL(const char *, const char *, const char *); -struct url_ent *fetchListURL(const char *, const char *); +int fetchListURL(struct url_list *, const char *, const char *, + const char *); fetchIO *fetchXGet(struct url *, struct url_stat *, const char *); fetchIO *fetchGet(struct url *, const char *); fetchIO *fetchPut(struct url *, const char *); int fetchStat(struct url *, struct url_stat *, const char *); -struct url_ent *fetchFilteredList(struct url *, const char *, const char *); -struct url_ent *fetchList(struct url *, const char *); +int fetchList(struct url_list *, struct url *, const char *, + const char *); /* URL parsing */ struct url *fetchMakeURL(const char *, const char *, int, @@ -147,6 +147,10 @@ struct url *fetchMakeURL(const char *, const char *, int, struct url *fetchParseURL(const char *); void fetchFreeURL(struct url *); +/* URL listening */ +void fetch_init_url_list(struct url_list *); +void fetch_free_url_list(struct url_list *); + /* Authentication */ typedef int (*auth_t)(struct url *); extern auth_t fetchAuthMethod; diff --git a/net/libfetch/files/file.c b/net/libfetch/files/file.c index ce5d08fa991..a580e48c16e 100644 --- a/net/libfetch/files/file.c +++ b/net/libfetch/files/file.c @@ -1,4 +1,4 @@ -/* $NetBSD: file.c,v 1.5 2008/04/04 23:19:16 joerg Exp $ */ +/* $NetBSD: file.c,v 1.6 2008/04/19 14:49:23 joerg Exp $ */ /*- * Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav * All rights reserved. @@ -187,20 +187,17 @@ fetchStatFile(struct url *u, struct url_stat *us, const char *flags) return (fetch_stat_file2(u->doc, us)); } -struct url_ent * -fetchFilteredListFile(struct url *u, const char *pattern, const char *flags) +int +fetchListFile(struct url_list *ue, struct url *u, const char *pattern, const char *flags) { struct dirent *de; - struct url_stat us; - struct url_ent *ue; - int size, len; char fn[PATH_MAX], *p; DIR *dir; int l; if ((dir = opendir(u->doc)) == NULL) { fetch_syserr(); - return (NULL); + return -1; } ue = NULL; @@ -215,18 +212,8 @@ fetchFilteredListFile(struct url *u, const char *pattern, const char *flags) continue; strncpy(p, de->d_name, l - 1); p[l - 1] = 0; - if (fetch_stat_file2(fn, &us) == -1) { - /* should I return a partial result, or abort? */ - break; - } - fetch_add_entry(&ue, &size, &len, de->d_name, &us); + fetch_add_entry(ue, u, de->d_name); } - return (ue); -} - -struct url_ent * -fetchListFile(struct url *u, const char *flags) -{ - return fetchFilteredListFile(u, "*", flags); + return 0; } diff --git a/net/libfetch/files/ftp.c b/net/libfetch/files/ftp.c index 15ba3906400..1a7c203ff62 100644 --- a/net/libfetch/files/ftp.c +++ b/net/libfetch/files/ftp.c @@ -1,4 +1,4 @@ -/* $NetBSD: ftp.c,v 1.17 2008/04/17 19:04:12 joerg Exp $ */ +/* $NetBSD: ftp.c,v 1.18 2008/04/19 14:49:23 joerg Exp $ */ /*- * Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav * Copyright (c) 2008 Joerg Sonnenberger <joerg@NetBSD.org> @@ -1192,20 +1192,20 @@ fetchStatFTP(struct url *url, struct url_stat *us, const char *flags) /* * List a directory */ -struct url_ent * -fetchFilteredListFTP(struct url *url, const char *pattern, const char *flags) +int +fetchListFTP(struct url_list *ue, struct url *url, const char *pattern, const char *flags) { - struct url_ent *ue; fetchIO *f; char buf[2 * PATH_MAX], *eol, *eos; ssize_t len; size_t cur_off; - int list_size, list_len; /* XXX What about proxies? */ + if (pattern == NULL || strcmp(pattern, "*") == 0) + pattern = ""; f = ftp_request(url, "NLST", pattern, NULL, ftp_get_proxy(url, flags), flags); if (f == NULL) - return NULL; + return -1; ue = NULL; cur_off = 0; @@ -1220,7 +1220,7 @@ fetchFilteredListFTP(struct url *url, const char *pattern, const char *flags) else eos = eol; *eos = '\0'; - fetch_add_entry(&ue, &list_size, &list_len, buf, NULL); + fetch_add_entry(ue, url, buf); cur_off -= eol - buf + 1; memmove(buf, eol + 1, cur_off); } @@ -1229,18 +1229,8 @@ fetchFilteredListFTP(struct url *url, const char *pattern, const char *flags) if (cur_off != 0 || len < 0) { /* Not RFC conform, bail out. */ fetchIO_close(f); - free(ue); - return NULL; + return -1; } fetchIO_close(f); - return ue; -} - -/* - * List a directory - */ -struct url_ent * -fetchListFTP(struct url *url, const char *flags) -{ - return fetchFilteredList(url, "", flags); + return 0; } diff --git a/net/libfetch/files/http.c b/net/libfetch/files/http.c index ba548f745ef..e821bc09817 100644 --- a/net/libfetch/files/http.c +++ b/net/libfetch/files/http.c @@ -1,4 +1,4 @@ -/* $NetBSD: http.c,v 1.14 2008/04/18 21:13:10 joerg Exp $ */ +/* $NetBSD: http.c,v 1.15 2008/04/19 14:49:24 joerg Exp $ */ /*- * Copyright (c) 2000-2004 Dag-Erling Coïdan Smørgrav * Copyright (c) 2003 Thomas Klausner <wiz@NetBSD.org> @@ -1169,9 +1169,9 @@ enum http_states { }; struct index_parser { + struct url_list *ue; + struct url *url; enum http_states state; - struct url_ent *ue; - int list_size, list_len; }; static size_t @@ -1303,7 +1303,7 @@ parse_index(struct index_parser *parser, const char *buf, size_t len) return 0; *end_attr = '\0'; parser->state = ST_TAGA; - fetch_add_entry(&parser->ue, &parser->list_size, &parser->list_len, buf, NULL); + fetch_add_entry(parser->ue, parser->url, buf); return end_attr + 1 - buf; } abort(); @@ -1312,8 +1312,8 @@ parse_index(struct index_parser *parser, const char *buf, size_t len) /* * List a directory */ -struct url_ent * -fetchFilteredListHTTP(struct url *url, const char *pattern, const char *flags) +int +fetchListHTTP(struct url_list *ue, struct url *url, const char *pattern, const char *flags) { fetchIO *f; char buf[2 * PATH_MAX]; @@ -1321,13 +1321,13 @@ fetchFilteredListHTTP(struct url *url, const char *pattern, const char *flags) ssize_t read_len; struct index_parser state; + state.url = url; state.state = ST_NONE; - state.ue = NULL; - state.list_size = state.list_len = 0; + state.ue = ue; f = fetchGetHTTP(url, flags); if (f == NULL) - return NULL; + return -1; buf_len = 0; @@ -1343,18 +1343,5 @@ fetchFilteredListHTTP(struct url *url, const char *pattern, const char *flags) } fetchIO_close(f); - if (read_len < 0) { - free(state.ue); - state.ue = NULL; - } - return state.ue; -} - -/* - * List a directory - */ -struct url_ent * -fetchListHTTP(struct url *url, const char *flags) -{ - return fetchFilteredList(url, "*", flags); + return read_len < 0 ? -1 : 0; } |