diff options
author | des <des@FreeBSD.org> | 1998-11-05 19:48:17 +0000 |
---|---|---|
committer | des <des@FreeBSD.org> | 1998-11-05 19:48:17 +0000 |
commit | e9582417392ed244d57d8d625ab335a3589831fe (patch) | |
tree | f937a3458c7c3f4987fe77d8a77a47b948807065 /lib | |
parent | 58045d2d2c66cc826418c2c40735d7130c308a14 (diff) | |
download | FreeBSD-src-e9582417392ed244d57d8d625ab335a3589831fe.zip FreeBSD-src-e9582417392ed244d57d8d625ab335a3589831fe.tar.gz |
First of a series of cleanups to libfetch. Changed files, in
alphabetical order:
Makefile:
Add common.c to SRCS.
Make debugging easier by making 'CFLAGS += -DNDEBUG' conditional on DEBUG
Don't declare struct {ftp,http}err in {ftp,http}err.c; use struct fetcherr
instead.
README:
Remove the todo list, which is out of date anyway.
common.c: (new file)
Gather utility functions in this file.
Merge the error reporting functions intp _fetch_errstring(),
_fetch_seterr() and _fetch_syserr().
Set fetchLastErrCode and fetchLastErrText appropriately when fetchConnect
fails.
common.h: (new file)
Gather internal prototypes and structures in this files.
fetch.3:
Undocument fetchFreeURL().
Document a few more known bugs.
Document fetchLastErrCode and fetchLastErrText.
fetch.c:
Add descriptive comments to all functions that lacked them.
Move fetchConnect() to common.c.
Obviate the need for fetchFreeURL(), and remove it.
fetch.h:
Modify struct url_t so the document part is at the end.
ftp.c:
Remove code that is duplicated elsewhere.
http.c:
Remove code that is duplicated elsewhere.
Prompted by: jkh
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libfetch/Makefile | 26 | ||||
-rw-r--r-- | lib/libfetch/README | 17 | ||||
-rw-r--r-- | lib/libfetch/common.c | 134 | ||||
-rw-r--r-- | lib/libfetch/common.h | 44 | ||||
-rw-r--r-- | lib/libfetch/fetch.3 | 37 | ||||
-rw-r--r-- | lib/libfetch/fetch.c | 85 | ||||
-rw-r--r-- | lib/libfetch/fetch.h | 6 | ||||
-rw-r--r-- | lib/libfetch/ftp.c | 47 | ||||
-rw-r--r-- | lib/libfetch/http.c | 17 |
9 files changed, 260 insertions, 153 deletions
diff --git a/lib/libfetch/Makefile b/lib/libfetch/Makefile index 2afd8bb..ca48d06 100644 --- a/lib/libfetch/Makefile +++ b/lib/libfetch/Makefile @@ -1,8 +1,11 @@ -# $Id$ +# $Id: Makefile,v 1.5 1998/08/17 20:39:09 bde Exp $ LIB= fetch -CFLAGS+= -I. -Wall -pedantic -DNDEBUG -SRCS= fetch.c ftp.c http.c file.c +CFLAGS+= -I. -Wall -pedantic +.if !defined(DEBUG) +CFLAGS+= -DNDEBUG +.endif +SRCS= fetch.c common.c ftp.c http.c file.c DPSRCS= ftperr.c httperr.c MAN3= fetch.3 CLEANFILES= ${DPSRCS} @@ -17,11 +20,7 @@ beforeinstall: ${DESTDIR}/usr/include ftperr.c: ftp.errors - @echo "struct ftperr {" \ > ${.TARGET} - @echo " const int num;" \ >> ${.TARGET} - @echo " const char *string;" \ >> ${.TARGET} - @echo "};" \ >> ${.TARGET} - @echo "static struct ftperr _ftp_errlist[] = {" \ >> ${.TARGET} + @echo "static struct fetcherr _ftp_errlist[] = {" \ >> ${.TARGET} @cat ${.ALLSRC} \ | grep -v ^# \ | sort \ @@ -30,13 +29,12 @@ ftperr.c: ftp.errors done >> ${.TARGET} @echo " { -1, \"Unknown FTP error\" }" >> ${.TARGET} @echo "};" >> ${.TARGET} + @echo "#define _ftp_errstring(n) _fetch_errstring(_ftp_errlist, n)" >> ${.TARGET} + @echo "#define _ftp_seterr(n) _fetch_seterr(_ftp_errlist, n)" >> ${.TARGET} + httperr.c: http.errors - @echo "struct httperr {" \ > ${.TARGET} - @echo " const int num;" \ >> ${.TARGET} - @echo " const char *string;" \ >> ${.TARGET} - @echo "};" \ >> ${.TARGET} - @echo "static struct httperr _http_errlist[] = {" \ >> ${.TARGET} + @echo "static struct fetcherr _http_errlist[] = {" \ >> ${.TARGET} @cat ${.ALLSRC} \ | grep -v ^# \ | sort \ @@ -45,6 +43,8 @@ httperr.c: http.errors done >> ${.TARGET} @echo " { -1, \"Unknown HTTP error\" }" >> ${.TARGET} @echo "};" >> ${.TARGET} + @echo "#define _http_errstring(n) _fetch_errstring(_http_errlist, n)" >> ${.TARGET} + @echo "#define _http_seterr(n) _fetch_seterr(_http_errlist, n)" >> ${.TARGET} .include <bsd.lib.mk> diff --git a/lib/libfetch/README b/lib/libfetch/README index ce50f56..7b85376 100644 --- a/lib/libfetch/README +++ b/lib/libfetch/README @@ -3,19 +3,8 @@ library and provide a new, unified backend for all fetch(1), pkg_add(1) and sysinstall(8). Note that this is very much work in progress. It compiles (with a few -warnings), but there is much left to be implemented. Amongst other -items: - - * The man page needs work. Really. I mean it. Now. - - * HTTP authentication doesn't work. I'm not sure if I bungled http.c - or fubared base64.c (which was ripped from MIT fetch(1)). - - * The library needs a decent interface for reporting errors. I've - started on something (sending back an error code in the url_t that - was sent in) but we're Not There (tm) yet. - -Comments, patches etc. of all kinds are welcome, but please don't -commit anything without talking to me first. +warnings), but there is much left to be implemented. Comments, patches +etc. of all kinds are welcome, but please don't commit anything +without talking to me first. -- Dag-Erling C. Smørgrav (des@FreeBSD.org) diff --git a/lib/libfetch/common.c b/lib/libfetch/common.c new file mode 100644 index 0000000..be0da67 --- /dev/null +++ b/lib/libfetch/common.c @@ -0,0 +1,134 @@ +/*- + * Copyright (c) 1998 Dag-Erling Coïdan Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $Id$ + */ + +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> + +#include <errno.h> +#include <netdb.h> +#include <string.h> +#include <unistd.h> + +#include "fetch.h" +#include "common.h" + +/*** Local data **************************************************************/ + +/* + * Error messages for resolver errors + */ +static struct fetcherr _netdb_errlist[] = { + { HOST_NOT_FOUND, "Host not found" }, + { TRY_AGAIN, "Transient resolver failure" }, + { NO_RECOVERY, "Non-recoverable resolver failure" }, + { NO_DATA, "No address record" }, + { -1, "Unknown resolver error" } +}; +#define _netdb_errstring(n) _fetch_errstring(_netdb_errlist, n) +#define _netdb_seterr(n) _fetch_seterr(_netdb_errlist, n) + + +/*** Error-reporting functions ***********************************************/ + +/* + * Map error code to string + */ +const char * +_fetch_errstring(struct fetcherr *p, int e) +{ + while ((p->num != -1) && (p->num != e)) + p++; + + return p->string; +} + +/* + * Set error code + */ +void +_fetch_seterr(struct fetcherr *p, int e) +{ + fetchLastErrCode = e; + fetchLastErrText = _fetch_errstring(p, e); +} + +/* + * Set error code according to errno + */ +void +_fetch_syserr(void) +{ + fetchLastErrCode = errno; + fetchLastErrText = strerror(errno); +} + + +/*** Network-related utility functions ***************************************/ + +/* + * Establish a TCP connection to the specified port on the specified host. + */ +int +fetchConnect(char *host, int port) +{ + struct sockaddr_in sin; + struct hostent *he; + int sd; + +#ifndef NDEBUG + fprintf(stderr, "\033[1m---> %s:%d\033[m\n", host, port); +#endif + + /* look up host name */ + if ((he = gethostbyname(host)) == NULL) { + _netdb_seterr(h_errno); + return -1; + } + + /* set up socket address structure */ + bzero(&sin, sizeof(sin)); + bcopy(he->h_addr, (char *)&sin.sin_addr, he->h_length); + sin.sin_family = he->h_addrtype; + sin.sin_port = htons(port); + + /* try to connect */ + if ((sd = socket(sin.sin_family, SOCK_STREAM, IPPROTO_TCP)) == -1) { + _fetch_syserr(); + return -1; + } + if (connect(sd, (struct sockaddr *)&sin, sizeof sin) == -1) { + _fetch_syserr(); + close(sd); + return -1; + } + + return sd; +} diff --git a/lib/libfetch/common.h b/lib/libfetch/common.h new file mode 100644 index 0000000..f031b91 --- /dev/null +++ b/lib/libfetch/common.h @@ -0,0 +1,44 @@ +/*- + * Copyright (c) 1998 Dag-Erling Coïdan Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $Id$ + */ + +#ifndef _COMMON_H_INCLUDED +#define _COMMON_H_INCLUDED + +/* Structure used for error message lists */ +struct fetcherr { + const int num; + const char *string; +}; + +const char *_fetch_errstring(struct fetcherr *, int); +void _fetch_seterr(struct fetcherr *, int); +void _fetch_syserr(void); + +#endif diff --git a/lib/libfetch/fetch.3 b/lib/libfetch/fetch.3 index c23d067..2b4c63a 100644 --- a/lib/libfetch/fetch.3 +++ b/lib/libfetch/fetch.3 @@ -22,7 +22,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $Id: fetch.3,v 1.1.1.1 1998/07/09 16:52:43 des Exp $ +.\" $Id: fetch.3,v 1.2 1998/09/26 20:42:44 des Exp $ .\" .Dd July 1, 1998 .Dt FETCH 3 @@ -31,7 +31,6 @@ .Nm fetchGetURL , .Nm fetchPutURL , .Nm fetchParseURL , -.Nm fetchFreeURL , .Nm fetchGet , .Nm fetchPut , .Nm fetchGetFile , @@ -49,8 +48,6 @@ .Fn fetchPutURL "char *URL" "char *flags" .Ft url_t * .Fn fetchParseURL "char *URL" "char *flags" -.Ft void -.Fn fetchFreeURL "url_t *u" .Ft FILE * .Fn fetchGet "url_t *URL" "char *flags" .Ft FILE * @@ -67,6 +64,8 @@ .Fn fetchGetFTP "url_t *u" "char *flags" .Ft FILE * .Fn fetchPutFTP "url_t *u" "char *flags" +.Vt extern int fetchLastErrCode; +.Vt extern const char *fetchLastErrText; .Sh DESCRIPTION These functions implement a high-level library for retrieving and uploading files using Uniform Resource Locators (URLs). @@ -100,7 +99,7 @@ and <document> components. The pointer returned by .Fn fetchParseURL should be freed using -.Fn fetchFreeURL . +.Fn free . .Pp .Fn fetchGet and @@ -182,12 +181,13 @@ unable to allocate memory, or the URL is syntactically incorrect, .Fn fetchParseURL returns a NULL pointer. .Pp -.Fn fetchFreeURL -does not return any value. -.Pp All other functions return a stream pointer which may be used to -access the requested document. Upon failure of any kind, they return a -NULL pointer. +access the requested document, or NULL if an error occurred. In the +latter case, the variables +.Va fetchLastErrCode +and +.Va fetchLastErrText +are set to appropriately descriptive values. .Sh ENVIRONMENT The FTP and HTTP related functions use the .Ev HTTP_PROXY @@ -259,6 +259,21 @@ code; as far as I can determine, .Nm libfetch handles HTTP/1.1 basic authentication correctly as outlined in RFC2068, but I haven't been able to find an HTTP server that honors -the Authentication: header field. +the Authentication: header field. Also, +.Nm libfetch +does not attempt to interpret and respond to authentication requests +from the HTTP server. +.Pp +No attempt is made to encode spaces etc. within URLs. Spaces in the +document part of an URLshould be replaced with "%20" in HTTP URLs and +"\\ " in FTP URLs. +.Pp +Error numbers are unique only within a certain context; the error +codes used for FTP and HTTP overlap, as do those used for resolver and +system errors. For instance, error code 202 means "Command not +implemented, superfluous at this site" in an FTP context and +"Accepted" in an HTTP context. +.Pp +The man page is poorly written and produces badly formatted text. .Pp Tons of other stuff. diff --git a/lib/libfetch/fetch.c b/lib/libfetch/fetch.c index 54421a2..226b628 100644 --- a/lib/libfetch/fetch.c +++ b/lib/libfetch/fetch.c @@ -25,20 +25,15 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: fetch.c,v 1.3 1998/07/11 21:29:07 des Exp $ + * $Id: fetch.c,v 1.4 1998/08/17 09:30:19 des Exp $ */ #include <sys/param.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> #include <ctype.h> -#include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <unistd.h> #include "fetch.h" @@ -51,6 +46,10 @@ int fetchLastErrCode; const char *fetchLastErrText; +/* + * Select the appropriate protocol for the URL scheme, and return a + * read-only stream connected to the document referenced by the URL. + */ FILE * fetchGet(url_t *URL, char *flags) { @@ -64,6 +63,10 @@ fetchGet(url_t *URL, char *flags) } +/* + * Select the appropriate protocol for the URL scheme, and return a + * write-only stream connected to the document referenced by the URL. + */ FILE * fetchPut(url_t *URL, char *flags) { @@ -76,7 +79,9 @@ fetchPut(url_t *URL, char *flags) else return NULL; } -/* get URL */ +/* + * Attempt to parse the given URL; if successful, call fetchGet(). + */ FILE * fetchGetURL(char *URL, char *flags) { @@ -88,12 +93,14 @@ fetchGetURL(char *URL, char *flags) f = fetchGet(u, flags); - fetchFreeURL(u); + free(u); return f; } -/* put URL */ +/* + * Attempt to parse the given URL; if successful, call fetchPut(). + */ FILE * fetchPutURL(char *URL, char *flags) { @@ -105,7 +112,7 @@ fetchPutURL(char *URL, char *flags) f = fetchPut(u, flags); - fetchFreeURL(u); + free(u); return f; } @@ -171,11 +178,17 @@ fetchParseURL(char *URL) nohost: /* document */ - if (*p) - u->doc = strdup(p); - u->doc = strdup(*p ? p : "/"); - if (!u->doc) - goto ouch; + if (*p) { + url_t *t; + t = realloc(u, sizeof(*u)+strlen(p)-1); + if (t == NULL) + goto ouch; + u = t; + strcpy(u->doc, p); + } else { + u->doc[0] = '/'; + u->doc[1] = 0; + } DEBUG(fprintf(stderr, "scheme: [\033[1m%s\033[m]\n" @@ -193,45 +206,3 @@ ouch: free(u); return NULL; } - -void -fetchFreeURL(url_t *u) -{ - if (u) { - if (u->doc) - free(u->doc); - free(u); - } -} - -int -fetchConnect(char *host, int port) -{ - struct sockaddr_in sin; - struct hostent *he; - int sd; - -#ifndef NDEBUG - fprintf(stderr, "\033[1m---> %s:%d\033[m\n", host, port); -#endif - - /* look up host name */ - if ((he = gethostbyname(host)) == NULL) - return -1; - - /* set up socket address structure */ - bzero(&sin, sizeof(sin)); - bcopy(he->h_addr, (char *)&sin.sin_addr, he->h_length); - sin.sin_family = he->h_addrtype; - sin.sin_port = htons(port); - - /* try to connect */ - if ((sd = socket(sin.sin_family, SOCK_STREAM, IPPROTO_TCP)) == -1) - return -1; - if (connect(sd, (struct sockaddr *)&sin, sizeof sin) == -1) { - close(sd); - return -1; - } - - return sd; -} diff --git a/lib/libfetch/fetch.h b/lib/libfetch/fetch.h index 377edad..cc39e36 100644 --- a/lib/libfetch/fetch.h +++ b/lib/libfetch/fetch.h @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: fetch.h,v 1.3 1998/07/11 21:29:08 des Exp $ + * $Id: fetch.h,v 1.4 1998/08/17 09:30:19 des Exp $ */ #ifndef _FETCH_H_INCLUDED @@ -45,8 +45,8 @@ struct url_s { char user[URL_USERLEN+1]; char pwd[URL_PWDLEN+1]; char host[MAXHOSTNAMELEN+1]; - char *doc; - int port; + int port; + char doc[2]; }; typedef struct url_s url_t; diff --git a/lib/libfetch/ftp.c b/lib/libfetch/ftp.c index d66b7c3..1899d03 100644 --- a/lib/libfetch/ftp.c +++ b/lib/libfetch/ftp.c @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: ftp.c,v 1.4 1998/07/12 22:34:39 des Exp $ + * $Id: ftp.c,v 1.5 1998/08/17 09:30:19 des Exp $ */ /* @@ -70,6 +70,7 @@ #include <unistd.h> #include "fetch.h" +#include "common.h" #include "ftperr.c" #define FTP_DEFAULT_TO_ANONYMOUS @@ -93,40 +94,6 @@ static FILE *cached_socket; static char *_ftp_last_reply; /* - * Map error code to string - */ -static const char * -_ftp_errstring(int e) -{ - struct ftperr *p = _ftp_errlist; - - while ((p->num != -1) && (p->num != e)) - p++; - - return p->string; -} - -/* - * Set error code - */ -static void -_ftp_seterr(int e) -{ - fetchLastErrCode = e; - fetchLastErrText = _ftp_errstring(e); -} - -/* - * Set error code according to errno - */ -static void -_ftp_syserr(void) -{ - fetchLastErrCode = errno; - fetchLastErrText = strerror(errno); -} - -/* * Get server response, check that first digit is a '2' */ static int @@ -140,7 +107,7 @@ _ftp_chkerr(FILE *s, int *e) do { if (((line = fgetln(s, &len)) == NULL) || (len < 4)) { - _ftp_syserr(); + _fetch_syserr(); return -1; } } while (line[3] == '-'); @@ -217,7 +184,7 @@ _ftp_transfer(FILE *cf, char *oper, char *file, char *mode, int pasv) /* open data socket */ if ((sd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { - _ftp_syserr(); + _fetch_syserr(); return NULL; } @@ -296,7 +263,7 @@ _ftp_transfer(FILE *cf, char *oper, char *file, char *mode, int pasv) return df; sysouch: - _ftp_syserr(); + _fetch_syserr(); ouch: close(sd); return NULL; @@ -330,13 +297,13 @@ _ftp_connect(char *host, int port, char *user, char *pwd) /* check connection */ if (sd == -1) { - _ftp_syserr(); + _fetch_syserr(); return NULL; } /* streams make life easier */ if ((f = fdopen(sd, "r+")) == NULL) { - _ftp_syserr(); + _fetch_syserr(); goto ouch; } diff --git a/lib/libfetch/http.c b/lib/libfetch/http.c index 9ce86a9..aea3d1d 100644 --- a/lib/libfetch/http.c +++ b/lib/libfetch/http.c @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: http.c,v 1.4 1998/07/12 22:34:40 des Exp $ + * $Id: http.c,v 1.5 1998/08/17 09:30:19 des Exp $ */ /* @@ -77,6 +77,7 @@ #include <unistd.h> #include "fetch.h" +#include "common.h" #include "httperr.c" #ifndef NDEBUG @@ -103,20 +104,6 @@ struct cookie }; /* - * Look up error code - */ -static const char * -_http_errstring(int e) -{ - struct httperr *p = _http_errlist; - - while ((p->num != -1) && (p->num != e)) - p++; - - return p->string; -} - -/* * Send a formatted line; optionally echo to terminal */ static int |