On Fri, Jan 29, 2021 at 07:22:11PM +0100, Christian Weisgerber wrote:
> Make use of getline(3) in ftp(1).
> 
> Replace fparseln(3) with getline(3).  This removes the only use
> of libutil.a(fparseln.o) from the ramdisk.
> Replace a complicated fgetln(3) idiom with the much simpler getline(3).
> 
> OK?
> 
> Index: distrib/special/ftp/Makefile
> ===================================================================
> RCS file: /cvs/src/distrib/special/ftp/Makefile,v
> retrieving revision 1.14
> diff -u -p -r1.14 Makefile
> --- distrib/special/ftp/Makefile      16 May 2019 12:44:17 -0000      1.14
> +++ distrib/special/ftp/Makefile      29 Jan 2021 18:05:46 -0000
> @@ -6,7 +6,4 @@ PROG= ftp
>  SRCS=        fetch.c ftp.c main.c small.c util.c
>  .PATH:       ${.CURDIR}/../../../usr.bin/ftp
>  
> -LDADD+=      -lutil
> -DPADD+=      ${LIBUTIL}
> -
>  .include <bsd.prog.mk>
> Index: usr.bin/ftp/Makefile
> ===================================================================
> RCS file: /cvs/src/usr.bin/ftp/Makefile,v
> retrieving revision 1.34
> diff -u -p -r1.34 Makefile
> --- usr.bin/ftp/Makefile      27 Jan 2021 22:27:41 -0000      1.34
> +++ usr.bin/ftp/Makefile      29 Jan 2021 17:57:31 -0000
> @@ -8,8 +8,8 @@ PROG= ftp
>  SRCS=        cmds.c cmdtab.c complete.c cookie.c domacro.c fetch.c ftp.c \
>       list.c main.c ruserpass.c small.c stringlist.c util.c
>  
> -LDADD+=      -ledit -lcurses -lutil -ltls -lssl -lcrypto
> -DPADD+=      ${LIBEDIT} ${LIBCURSES} ${LIBUTIL} ${LIBTLS} ${LIBSSL} 
> ${LIBCRYPTO}
> +LDADD+=      -ledit -lcurses -ltls -lssl -lcrypto
> +DPADD+=      ${LIBEDIT} ${LIBCURSES} ${LIBTLS} ${LIBSSL} ${LIBCRYPTO}
>  
>  #COPTS+= -Wall -Wconversion -Wstrict-prototypes -Wmissing-prototypes
>  
> Index: usr.bin/ftp/cookie.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/ftp/cookie.c,v
> retrieving revision 1.9
> diff -u -p -r1.9 cookie.c
> --- usr.bin/ftp/cookie.c      16 May 2019 12:44:17 -0000      1.9
> +++ usr.bin/ftp/cookie.c      29 Jan 2021 16:07:56 -0000
> @@ -58,10 +58,9 @@ void
>  cookie_load(void)
>  {
>       field_t          field;
> -     size_t           len;
>       time_t           date;
> -     char            *line;
> -     char            *lbuf;
> +     char            *line = NULL;
> +     size_t           linesize = 0;
>       char            *param;
>       const char      *estr;
>       FILE            *fp;
> @@ -75,19 +74,8 @@ cookie_load(void)
>       if (fp == NULL)
>               err(1, "cannot open cookie file %s", cookiefile);
>       date = time(NULL);
> -     lbuf = NULL;
> -     while ((line = fgetln(fp, &len)) != NULL) {
> -             if (line[len - 1] == '\n') {
> -                     line[len - 1] = '\0';
> -                     --len;
> -             } else {
> -                     if ((lbuf = malloc(len + 1)) == NULL)
> -                             err(1, NULL);
> -                     memcpy(lbuf, line, len);
> -                     lbuf[len] = '\0';
> -                     line = lbuf;
> -             }
> -             line[strcspn(line, "\r")] = '\0';
> +     while (getline(&line, &linesize, fp) != -1) {
> +             line[strcspn(line, "\r\n")] = '\0';
>  

getline returns the number of characters read including the delimeter. This
size could be used to '\0' terminate the string instead of a strcspn() call.

>               line += strspn(line, " \t");
>               if ((*line == '#') || (*line == '\0')) {
> @@ -172,7 +160,7 @@ cookie_load(void)
>               } else
>                       TAILQ_INSERT_TAIL(&jar, ck, entry);
>       }
> -     free(lbuf);
> +     free(line);
>       fclose(fp);
>  }
>  
> Index: usr.bin/ftp/fetch.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/ftp/fetch.c,v
> retrieving revision 1.199
> diff -u -p -r1.199 fetch.c
> --- usr.bin/ftp/fetch.c       1 Jan 2021 17:39:54 -0000       1.199
> +++ usr.bin/ftp/fetch.c       29 Jan 2021 17:57:58 -0000
> @@ -56,7 +56,6 @@
>  #include <stdlib.h>
>  #include <string.h>
>  #include <unistd.h>
> -#include <util.h>
>  #include <resolv.h>
>  
>  #ifndef NOSSL
> @@ -75,7 +74,6 @@ static void aborthttp(int);
>  static char  hextochar(const char *);
>  static char  *urldecode(const char *);
>  static char  *recode_credentials(const char *_userinfo);
> -static char  *ftp_readline(FILE *, size_t *);
>  static void  ftp_close(FILE **, struct tls **, int *);
>  static const char *sockerror(struct tls *);
>  #ifdef SMALL
> @@ -329,6 +327,7 @@ url_get(const char *origline, const char
>       off_t hashbytes;
>       const char *errstr;
>       ssize_t len, wlen;
> +     size_t bufsize;
>       char *proxyhost = NULL;
>  #ifndef NOSSL
>       char *sslpath = NULL, *sslhost = NULL;
> @@ -790,12 +789,13 @@ noslash:
>       free(buf);
>  #endif /* !NOSSL */
>       buf = NULL;
> +     bufsize = 0;
>  
>       if (fflush(fin) == EOF) {
>               warnx("Writing HTTP request: %s", sockerror(tls));
>               goto cleanup_url_get;
>       }
> -     if ((buf = ftp_readline(fin, &len)) == NULL) {
> +     if ((len = getline(&buf, &bufsize, fin)) == -1) {
>               warnx("Receiving HTTP reply: %s", sockerror(tls));
>               goto cleanup_url_get;
>       }
> @@ -867,11 +867,10 @@ noslash:
>       /*
>        * Read the rest of the header.
>        */
> -     free(buf);
>       filesize = -1;
>  
>       for (;;) {
> -             if ((buf = ftp_readline(fin, &len)) == NULL) {
> +             if ((len = getline(&buf, &bufsize, fin)) == -1) {
>                       warnx("Receiving HTTP reply: %s", sockerror(tls));
>                       goto cleanup_url_get;
>               }
> @@ -974,8 +973,8 @@ noslash:
>                       if (strcasecmp(cp, "chunked") == 0)
>                               chunked = 1;
>               }
> -             free(buf);
>       }
> +     free(buf);
>  
>       /* Content-Length should be ignored for Transfer-Encoding: chunked */
>       if (chunked)
> @@ -1019,7 +1018,6 @@ noslash:
>  #endif
>       }
>  
> -     free(buf);
>       if ((buf = malloc(buflen)) == NULL)
>               errx(1, "Can't allocate memory for transfer buffer");
>  
> @@ -1130,15 +1128,14 @@ static int
>  save_chunked(FILE *fin, struct tls *tls, int out, char *buf, size_t buflen)
>  {
>  
> -     char                    *header, *end, *cp;
> +     char                    *header = NULL, *end, *cp;
>       unsigned long           chunksize;
> -     size_t                  hlen, rlen, wlen;
> +     size_t                  hsize = 0, rlen, wlen;
>       ssize_t                 written;
>       char                    cr, lf;
>  
>       for (;;) {
> -             header = ftp_readline(fin, &hlen);
> -             if (header == NULL)
> +             if (getline(&header, &hsize, fin) == -1)
>                       break;
>               /* strip CRLF and any optional chunk extension */
>               header[strcspn(header, ";\r\n")] = '\0';
> @@ -1150,10 +1147,10 @@ save_chunked(FILE *fin, struct tls *tls,
>                       free(header);
>                       return -1;
>               }
> -             free(header);
>  
>               if (chunksize == 0) {
>                       /* We're done.  Ignore optional trailer. */
> +                     free(header);
>                       return 0;
>               }
>  
> @@ -1167,6 +1164,7 @@ save_chunked(FILE *fin, struct tls *tls,
>                           wlen -= written, cp += written) {
>                               if ((written = write(out, cp, wlen)) == -1) {
>                                       warn("Writing output file");
> +                                     free(header);
>                                       return -1;
>                               }
>                       }
> @@ -1179,9 +1177,11 @@ save_chunked(FILE *fin, struct tls *tls,
>  
>               if (cr != '\r' || lf != '\n') {
>                       warnx("Invalid chunked encoding");
> +                     free(header);
>                       return -1;
>               }
>       }
> +     free(header);
>  
>       if (ferror(fin))
>               warnx("Error while reading from socket: %s", sockerror(tls));
> @@ -1614,12 +1614,6 @@ isurl(const char *p)
>           strstr(p, ":/"))
>               return (1);
>       return (0);
> -}
> -
> -static char *
> -ftp_readline(FILE *fp, size_t *lenp)
> -{
> -     return fparseln(fp, lenp, NULL, "\0\0\0", 0);
>  }
>  
>  #ifndef SMALL
> -- 
> Christian "naddy" Weisgerber                          na...@mips.inka.de
> 

-- 
Kind regards,
Hiltjo

Reply via email to