Module Name: src Committed By: martin Date: Sun Oct 13 16:06:37 UTC 2024
Modified Files: src/distrib/sets/lists/tests [netbsd-10]: mi src/etc/mtree [netbsd-10]: NetBSD.dist.tests src/tests/usr.bin [netbsd-10]: Makefile src/usr.bin/ftp [netbsd-10]: cmds.c complete.c fetch.c ftp.1 ftp.c ftp_var.h main.c progressbar.c ruserpass.c ssl.c util.c Added Files: src/tests/usr.bin/ftp [netbsd-10]: Makefile custom_headers.sh t_custom_headers.sh Log Message: Pull up following revision(s) (requested by riastradh in ticket #970): tests/usr.bin/Makefile: revision 1.42 usr.bin/ftp/ruserpass.c: revision 1.34 usr.bin/ftp/main.c: revision 1.130 usr.bin/ftp/ssl.c: revision 1.17 usr.bin/ftp/main.c: revision 1.131 usr.bin/ftp/ssl.c: revision 1.18 usr.bin/ftp/main.c: revision 1.132 usr.bin/ftp/ssl.c: revision 1.19 usr.bin/ftp/main.c: revision 1.133 distrib/sets/lists/tests/mi: revision 1.1342 usr.bin/ftp/ftp.1: revision 1.151 usr.bin/ftp/ftp.1: revision 1.152 usr.bin/ftp/progressbar.c: revision 1.25 usr.bin/ftp/ftp.1: revision 1.153 usr.bin/ftp/progressbar.c: revision 1.26 usr.bin/ftp/ftp.1: revision 1.155 usr.bin/ftp/ftp.1: revision 1.156 usr.bin/ftp/fetch.c: revision 1.239 usr.bin/ftp/ftp.1: revision 1.157 usr.bin/ftp/ftp.1: revision 1.158 usr.bin/ftp/ftp.1: revision 1.159 usr.bin/ftp/ftp_var.h: revision 1.87 etc/mtree/NetBSD.dist.tests: revision 1.208 usr.bin/ftp/ftp_var.h: revision 1.88 usr.bin/ftp/ftp_var.h: revision 1.89 usr.bin/ftp/cmds.c: revision 1.142 usr.bin/ftp/util.c: revision 1.168 usr.bin/ftp/cmds.c: revision 1.143 tests/usr.bin/ftp/custom_headers.sh: revision 1.1 usr.bin/ftp/ssl.c: revision 1.20 usr.bin/ftp/complete.c: revision 1.48 tests/usr.bin/ftp/Makefile: revision 1.1 tests/usr.bin/ftp/t_custom_headers.sh: revision 1.1 usr.bin/ftp/fetch.c: revision 1.240 usr.bin/ftp/fetch.c: revision 1.241 usr.bin/ftp/ftp.c: revision 1.176 usr.bin/ftp/ftp.c: revision 1.177 (all via patch) ftp(1): wording and formatting improvements Fix grammar issue with "Support values" reported in private mail. Document all file transfer types in "type" and cross-reference that. Consistency fixes in describing file transfer parameters and types. Fix some mandoc -Tlint issues (except "useless macro: Tn"). Add -b <buflen> to specify the buffer size. ftp: bump FTPBUFLEN from 4kB to 16kB sourceforge.net returns a 5kB content-security-policy. Analyzed by mlelstv@ who reports usual limits are between 4kB and 48kB. default is now 16K ftp: improve -b documentation Order -b bufsize in the synopsis. Document the actual default value. ftp: improve units used in comments and errors Use "KiB" instead of "K" in errors. Clarify related comments. pass some lint. PR/58581: Sunil Nimmagadda: Add flag to allow specifying extra http header fields. ftp(1): Nix trailing whitespace in man page. No functional change intended. PR bin/58581: ftp(1) should allow specifying header fields in http requests fix markup (h -> H), explain about multiple headers, fix usage (from RVP) Don't forget the dot, use the intended macro name (I think), and improve the wording a little. (All related to the -H option.) ftp(1): Add test for custom HTTP header fields. Based on a patch from Sunil Nimmagadda. PR bin/58581: ftp(1) should allow specifying header fields in http requests To generate a diff of this commit: cvs rdiff -u -r1.1238.2.15 -r1.1238.2.16 src/distrib/sets/lists/tests/mi cvs rdiff -u -r1.197.2.4 -r1.197.2.5 src/etc/mtree/NetBSD.dist.tests cvs rdiff -u -r1.37.2.1 -r1.37.2.2 src/tests/usr.bin/Makefile cvs rdiff -u -r0 -r1.1.2.2 src/tests/usr.bin/ftp/Makefile \ src/tests/usr.bin/ftp/custom_headers.sh \ src/tests/usr.bin/ftp/t_custom_headers.sh cvs rdiff -u -r1.141 -r1.141.6.1 src/usr.bin/ftp/cmds.c cvs rdiff -u -r1.47 -r1.47.10.1 src/usr.bin/ftp/complete.c cvs rdiff -u -r1.235.2.2 -r1.235.2.3 src/usr.bin/ftp/fetch.c cvs rdiff -u -r1.147.2.4 -r1.147.2.5 src/usr.bin/ftp/ftp.1 cvs rdiff -u -r1.174.2.1 -r1.174.2.2 src/usr.bin/ftp/ftp.c cvs rdiff -u -r1.86 -r1.86.2.1 src/usr.bin/ftp/ftp_var.h cvs rdiff -u -r1.128.2.1 -r1.128.2.2 src/usr.bin/ftp/main.c cvs rdiff -u -r1.24 -r1.24.6.1 src/usr.bin/ftp/progressbar.c cvs rdiff -u -r1.33 -r1.33.86.1 src/usr.bin/ftp/ruserpass.c cvs rdiff -u -r1.12.2.4 -r1.12.2.5 src/usr.bin/ftp/ssl.c cvs rdiff -u -r1.164.2.2 -r1.164.2.3 src/usr.bin/ftp/util.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/distrib/sets/lists/tests/mi diff -u src/distrib/sets/lists/tests/mi:1.1238.2.15 src/distrib/sets/lists/tests/mi:1.1238.2.16 --- src/distrib/sets/lists/tests/mi:1.1238.2.15 Sun Oct 13 15:05:17 2024 +++ src/distrib/sets/lists/tests/mi Sun Oct 13 16:06:36 2024 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.1238.2.15 2024/10/13 15:05:17 martin Exp $ +# $NetBSD: mi,v 1.1238.2.16 2024/10/13 16:06:36 martin Exp $ # # Note: don't delete entries from here - mark them as "obsolete" instead. # @@ -4858,6 +4858,11 @@ ./usr/tests/usr.bin/fstat/Atffile tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/fstat/Kyuafile tests-usr.bin-tests compattestfile,atf,kyua ./usr/tests/usr.bin/fstat/t_fstat tests-usr.bin-tests compattestfile,atf +./usr/tests/usr.bin/ftp tests-usr.bin-tests compattestfile,atf +./usr/tests/usr.bin/ftp/Atffile tests-usr.bin-tests compattestfile,atf +./usr/tests/usr.bin/ftp/Kyuafile tests-usr.bin-tests compattestfile,atf,kyua +./usr/tests/usr.bin/ftp/custom_headers.sh tests-usr.bin-tests compattestfile,atf +./usr/tests/usr.bin/ftp/t_custom_headers tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/gdb tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/gdb/Atffile tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/gdb/Kyuafile tests-usr.bin-tests compattestfile,atf,kyua Index: src/etc/mtree/NetBSD.dist.tests diff -u src/etc/mtree/NetBSD.dist.tests:1.197.2.4 src/etc/mtree/NetBSD.dist.tests:1.197.2.5 --- src/etc/mtree/NetBSD.dist.tests:1.197.2.4 Thu Sep 5 09:22:44 2024 +++ src/etc/mtree/NetBSD.dist.tests Sun Oct 13 16:06:36 2024 @@ -1,4 +1,4 @@ -# $NetBSD: NetBSD.dist.tests,v 1.197.2.4 2024/09/05 09:22:44 martin Exp $ +# $NetBSD: NetBSD.dist.tests,v 1.197.2.5 2024/10/13 16:06:36 martin Exp $ ./usr/libdata/debug/usr/tests ./usr/libdata/debug/usr/tests/atf @@ -446,6 +446,7 @@ ./usr/tests/usr.bin/dirname ./usr/tests/usr.bin/find ./usr/tests/usr.bin/fstat +./usr/tests/usr.bin/ftp ./usr/tests/usr.bin/gdb ./usr/tests/usr.bin/grep ./usr/tests/usr.bin/gzip Index: src/tests/usr.bin/Makefile diff -u src/tests/usr.bin/Makefile:1.37.2.1 src/tests/usr.bin/Makefile:1.37.2.2 --- src/tests/usr.bin/Makefile:1.37.2.1 Thu Sep 5 09:22:42 2024 +++ src/tests/usr.bin/Makefile Sun Oct 13 16:06:35 2024 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.37.2.1 2024/09/05 09:22:42 martin Exp $ +# $NetBSD: Makefile,v 1.37.2.2 2024/10/13 16:06:35 martin Exp $ # .include <bsd.own.mk> @@ -6,7 +6,7 @@ TESTSDIR= ${TESTSBASE}/usr.bin TESTS_SUBDIRS= awk basename bzip2 cc cmp compress config cpio col cut \ - diff dirname find fstat gdb grep gzip id indent \ + diff dirname find fstat ftp gdb grep gzip id indent \ infocmp jot ld locale m4 make mixerctl mkdep nbperf \ netpgpverify patch pkill pr printf pwhash realpath rump_server \ shmif_dumpbus shmif_pcapin sdiff sed sort tar tmux tr \ Index: src/usr.bin/ftp/cmds.c diff -u src/usr.bin/ftp/cmds.c:1.141 src/usr.bin/ftp/cmds.c:1.141.6.1 --- src/usr.bin/ftp/cmds.c:1.141 Wed Jan 6 09:15:59 2021 +++ src/usr.bin/ftp/cmds.c Sun Oct 13 16:06:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: cmds.c,v 1.141 2021/01/06 09:15:59 lukem Exp $ */ +/* $NetBSD: cmds.c,v 1.141.6.1 2024/10/13 16:06:36 martin Exp $ */ /*- * Copyright (c) 1996-2021 The NetBSD Foundation, Inc. @@ -96,7 +96,7 @@ #if 0 static char sccsid[] = "@(#)cmds.c 8.6 (Berkeley) 10/9/94"; #else -__RCSID("$NetBSD: cmds.c,v 1.141 2021/01/06 09:15:59 lukem Exp $"); +__RCSID("$NetBSD: cmds.c,v 1.141.6.1 2024/10/13 16:06:36 martin Exp $"); #endif #endif /* not lint */ @@ -172,7 +172,7 @@ confirm(const char *cmd, const char *fil promptleft = cmd; promptright = file; } - while (1) { + for (;;) { fprintf(ttyout, "%s %s [anpqy?]? ", promptleft, promptright); (void)fflush(ttyout); if (get_line(stdin, cline, sizeof(cline), &errormsg) < 0) { @@ -1830,10 +1830,10 @@ account(int argc, char *argv[]) memset(ap, 0, strlen(ap)); } -sigjmp_buf abortprox; +static sigjmp_buf abortprox; void -proxabort(int notused) +proxabort(int notused __unused) { sigint_raised = 1; @@ -1855,7 +1855,7 @@ void doproxy(int argc, char *argv[]) { struct cmd *c; - int cmdpos; + size_t cmdpos; sigfunc oldintr; char cmdbuf[MAX_C_NAME]; @@ -2038,7 +2038,7 @@ setnmap(int argc, char *argv[]) } static const char * -domap(char *dst, size_t dlen, const char *src) +domap(char *dst, size_t dlen __unused, const char *src) { const char *cp1 = src; char *cp2 = mapin; @@ -2483,11 +2483,11 @@ macdef(int argc, char *argv[]) } tmp++; } - while (1) { + for (;;) { while ((c = getchar()) != '\n' && c != EOF) /* LOOP */; if (c == EOF || getchar() == '\n') { - fputs("Macro not defined - 4K buffer exceeded.\n", + fputs("Macro not defined - 4 KiB buffer exceeded.\n", ttyout); code = -1; return; @@ -2605,7 +2605,8 @@ lpage(int argc, char *argv[]) void page(int argc, char *argv[]) { - int ohash, orestart_point, overbose; + int ohash, overbose; + off_t orestart_point; size_t len; const char *p; char *pager; @@ -2627,7 +2628,8 @@ page(int argc, char *argv[]) ohash = hash; orestart_point = restart_point; overbose = verbose; - hash = restart_point = verbose = 0; + hash = verbose = 0; + restart_point = 0; recvrequest("RETR", pager, argv[1], "r+", 1, 0); hash = ohash; restart_point = orestart_point; Index: src/usr.bin/ftp/complete.c diff -u src/usr.bin/ftp/complete.c:1.47 src/usr.bin/ftp/complete.c:1.47.10.1 --- src/usr.bin/ftp/complete.c:1.47 Mon Jan 28 12:04:16 2019 +++ src/usr.bin/ftp/complete.c Sun Oct 13 16:06:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: complete.c,v 1.47 2019/01/28 12:04:16 christos Exp $ */ +/* $NetBSD: complete.c,v 1.47.10.1 2024/10/13 16:06:36 martin Exp $ */ /*- * Copyright (c) 1997-2009 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: complete.c,v 1.47 2019/01/28 12:04:16 christos Exp $"); +__RCSID("$NetBSD: complete.c,v 1.47.10.1 2024/10/13 16:06:36 martin Exp $"); #endif /* not lint */ /* @@ -349,7 +349,7 @@ complete_remote(char *word, int list) * Generic complete routine */ unsigned char -complete(EditLine *cel, int ch) +complete(EditLine *cel, int ch __unused) { static char word[FTPBUFLEN]; static size_t lastc_argc, lastc_argo; Index: src/usr.bin/ftp/fetch.c diff -u src/usr.bin/ftp/fetch.c:1.235.2.2 src/usr.bin/ftp/fetch.c:1.235.2.3 --- src/usr.bin/ftp/fetch.c:1.235.2.2 Mon Jan 15 16:12:08 2024 +++ src/usr.bin/ftp/fetch.c Sun Oct 13 16:06:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: fetch.c,v 1.235.2.2 2024/01/15 16:12:08 martin Exp $ */ +/* $NetBSD: fetch.c,v 1.235.2.3 2024/10/13 16:06:36 martin Exp $ */ /*- * Copyright (c) 1997-2015 The NetBSD Foundation, Inc. @@ -37,7 +37,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: fetch.c,v 1.235.2.2 2024/01/15 16:12:08 martin Exp $"); +__RCSID("$NetBSD: fetch.c,v 1.235.2.3 2024/10/13 16:06:36 martin Exp $"); #endif /* not lint */ /* @@ -261,8 +261,8 @@ freeurlinfo(struct urlinfo *ui) static int auth_url(const char *challenge, char **response, const struct authinfo *auth) { - const char *cp, *scheme, *errormsg; - char *ep, *clear, *realm; + const char *cp, *ep, *scheme, *errormsg; + char *clear, *realm; char uuser[BUFSIZ], *gotpass; const char *upass; int rval; @@ -590,7 +590,7 @@ parse_url(const char *url, const char *d cp, desc, origurl); goto cleanup_parse_url; } - ui->portnum = nport; + ui->portnum = (in_port_t)nport; tport = cp; } else tport = get_port(ui); @@ -614,7 +614,7 @@ parse_url(const char *url, const char *d return (0); } -sigjmp_buf httpabort; +static sigjmp_buf httpabort; static int ftp_socket(const struct urlinfo *ui, void **ssl, struct authinfo *auth) @@ -865,6 +865,7 @@ print_get(FETCH *fin, int hasleading, in const struct urlinfo *ui) { const char *leading = hasleading ? ", " : " ("; + struct entry *np; if (isproxy) { if (verbose) { @@ -882,6 +883,10 @@ print_get(FETCH *fin, int hasleading, in print_host(fin, ui); fetch_printf(fin, "Accept: */*\r\n"); fetch_printf(fin, "Connection: close\r\n"); + SLIST_FOREACH(np, &custom_headers, entries) { + fetch_printf(fin, "%s\r\n", np->header); + } + if (restart_point) { fputs(leading, ttyout); fetch_printf(fin, "Range: bytes=" LLF "-\r\n", @@ -1116,15 +1121,17 @@ negotiate_connection(FETCH *fin, const c char **auth, struct urlinfo *ui) { int len, hcode, rv; - char buf[FTPBUFLEN], *ep; + char *buf = NULL, *ep; const char *cp, *token; char *location, *message; *auth = message = location = NULL; + buf = ftp_malloc(ftp_buflen); + /* Read the response */ ep = buf; - switch (getresponse(fin, &ep, sizeof(buf), &hcode)) { + switch (getresponse(fin, &ep, ftp_buflen, &hcode)) { case C_CLEANUP: goto cleanup_fetch_url; case C_IMPROPER: @@ -1137,7 +1144,7 @@ negotiate_connection(FETCH *fin, const c /* Read the rest of the header. */ for (;;) { - if ((rv = getresponseline(fin, buf, sizeof(buf), &len)) != C_OK) + if ((rv = getresponseline(fin, buf, ftp_buflen, &len)) != C_OK) goto cleanup_fetch_url; if (len == 0) break; @@ -1265,6 +1272,7 @@ improper: rv = C_IMPROPER; goto out; out: + FREEPTR(buf); FREEPTR(message); FREEPTR(location); return rv; @@ -1279,7 +1287,7 @@ connectmethod(FETCH *fin, const char *ur void *ssl; int hcode, rv; const char *cp; - char buf[FTPBUFLEN], *ep; + char *buf = NULL, *ep; char *message = NULL; print_connect(fin, oui); @@ -1299,9 +1307,11 @@ connectmethod(FETCH *fin, const char *ur } alarmtimer(0); + buf = ftp_malloc(ftp_buflen); + /* Read the response */ ep = buf; - switch (getresponse(fin, &ep, sizeof(buf), &hcode)) { + switch (getresponse(fin, &ep, ftp_buflen, &hcode)) { case C_CLEANUP: goto cleanup_fetch_url; case C_IMPROPER: @@ -1313,7 +1323,7 @@ connectmethod(FETCH *fin, const char *ur for (;;) { int len; - if (getresponseline(fin, buf, sizeof(buf), &len) != C_OK) + if (getresponseline(fin, buf, ftp_buflen, &len) != C_OK) goto cleanup_fetch_url; if (len == 0) break; @@ -1364,6 +1374,7 @@ cleanup_fetch_url: rv = C_CLEANUP; goto out; out: + FREEPTR(buf); FREEPTR(message); return rv; } @@ -1710,7 +1721,7 @@ fetch_url(const char *url, const char *p lastchunk = 0; /* read chunk-size */ if (ischunked) { - if (fetch_getln(xferbuf, bufsize, fin) == NULL) { + if (fetch_getln(xferbuf, (int)bufsize, fin) == NULL) { warnx("Unexpected EOF reading chunk-size"); goto cleanup_fetch_url; } @@ -1753,7 +1764,7 @@ fetch_url(const char *url, const char *p } } /* transfer file or chunk */ - while (1) { + for (;;) { struct timeval then, now, td; volatile off_t bufrem; @@ -1792,7 +1803,7 @@ fetch_url(const char *url, const char *p } } if (rate_get) { - while (1) { + for (;;) { (void)gettimeofday(&now, NULL); timersub(&now, &then, &td); if (td.tv_sec > 0) @@ -1806,7 +1817,7 @@ fetch_url(const char *url, const char *p /* read CRLF after chunk*/ chunkdone: if (ischunked) { - if (fetch_getln(xferbuf, bufsize, fin) == NULL) { + if (fetch_getln(xferbuf, (int)bufsize, fin) == NULL) { alarmtimer(0); warnx("Unexpected EOF reading chunk CRLF"); goto cleanup_fetch_url; @@ -1890,7 +1901,7 @@ chunkerror: * Abort a HTTP retrieval */ static void -aborthttp(int notused) +aborthttp(int notused __unused) { char msgbuf[100]; int len; @@ -1907,7 +1918,7 @@ aborthttp(int notused) } static void -timeouthttp(int notused) +timeouthttp(int notused __unused) { char msgbuf[100]; int len; @@ -2269,7 +2280,7 @@ static int go_fetch(const char *url, struct urlinfo *rui) { char *proxyenv; - char *p; + const char *p; #ifndef NO_ABOUT /* Index: src/usr.bin/ftp/ftp.1 diff -u src/usr.bin/ftp/ftp.1:1.147.2.4 src/usr.bin/ftp/ftp.1:1.147.2.5 --- src/usr.bin/ftp/ftp.1:1.147.2.4 Thu Jun 20 18:04:49 2024 +++ src/usr.bin/ftp/ftp.1 Sun Oct 13 16:06:36 2024 @@ -1,6 +1,6 @@ -.\" $NetBSD: ftp.1,v 1.147.2.4 2024/06/20 18:04:49 martin Exp $ +.\" $NetBSD: ftp.1,v 1.147.2.5 2024/10/13 16:06:36 martin Exp $ .\" -.\" Copyright (c) 1996-2023 The NetBSD Foundation, Inc. +.\" Copyright (c) 1996-2024 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" This code is derived from software contributed to The NetBSD Foundation @@ -57,7 +57,7 @@ .\" .\" @(#)ftp.1 8.3 (Berkeley) 10/9/94 .\" -.Dd April 17, 2024 +.Dd September 30, 2024 .Dt FTP 1 .Os .Sh NAME @@ -66,6 +66,8 @@ .Sh SYNOPSIS .Nm .Op Fl 46AadefginpRtVv? +.Op Fl b Ar bufsize +.Op Fl H Ar header .Op Fl N Ar netrc .Op Fl o Ar output .Op Fl P Ar port @@ -201,6 +203,14 @@ implement passive mode properly. Causes .Nm to bypass normal login procedure, and use an anonymous login instead. +.It Fl b Ar bufsize +Change the input buffer size to +.Ar bufsize . +The default +.Ar bufsize +is +.Dv 16384 +(16 KiB). .It Fl d Enables debugging. .It Fl e @@ -214,6 +224,17 @@ or proxies. .It Fl g Disables file name globbing. +.It Fl H Ar header +Include the provided +.Ar header +string as a custom +.Tn HTTP +header for an +.Tn HTTP +request. +The +.Fl H +option can be repeated to add additional headers. .It Fl i Turns off interactive prompting during multiple file transfers. Index: src/usr.bin/ftp/ftp.c diff -u src/usr.bin/ftp/ftp.c:1.174.2.1 src/usr.bin/ftp/ftp.c:1.174.2.2 --- src/usr.bin/ftp/ftp.c:1.174.2.1 Tue May 16 16:26:03 2023 +++ src/usr.bin/ftp/ftp.c Sun Oct 13 16:06:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: ftp.c,v 1.174.2.1 2023/05/16 16:26:03 martin Exp $ */ +/* $NetBSD: ftp.c,v 1.174.2.2 2024/10/13 16:06:36 martin Exp $ */ /*- * Copyright (c) 1996-2021 The NetBSD Foundation, Inc. @@ -92,7 +92,7 @@ #if 0 static char sccsid[] = "@(#)ftp.c 8.6 (Berkeley) 10/27/94"; #else -__RCSID("$NetBSD: ftp.c,v 1.174.2.1 2023/05/16 16:26:03 martin Exp $"); +__RCSID("$NetBSD: ftp.c,v 1.174.2.2 2024/10/13 16:06:36 martin Exp $"); #endif #endif /* not lint */ @@ -123,13 +123,14 @@ __RCSID("$NetBSD: ftp.c,v 1.174.2.1 2023 #include "ftp_var.h" -volatile sig_atomic_t abrtflag; -volatile sig_atomic_t timeoutflag; +static volatile sig_atomic_t abrtflag; +static volatile sig_atomic_t timeoutflag; -sigjmp_buf ptabort; -int ptabflg; -int ptflag = 0; -char pasv[BUFSIZ]; /* passive port for proxy data connection */ +static sigjmp_buf ptabort; +static int ptabflg; +static int ptflag = 0; +static char pasv[BUFSIZ]; /* passive port for proxy data connection */ +size_t ftp_buflen = FTPBUFLEN; static int empty(FILE *, FILE *, int); __dead static void abort_squared(int); @@ -154,7 +155,7 @@ struct sockinet { #define su_family si_su.su_sin.sin_family #define su_port si_su.su_sin.sin_port -struct sockinet myctladdr, hisctladdr, data_addr; +static struct sockinet myctladdr, hisctladdr, data_addr; char * hookup(const char *host, const char *port) @@ -240,7 +241,7 @@ hookup(const char *host, const char *por res0 = res = NULL; len = hisctladdr.su_len; - if (getsockname(s, (struct sockaddr *)&myctladdr.si_su, &len) == -1) { + if (getsockname(s, (struct sockaddr *)(void *)&myctladdr.si_su, &len) == -1) { warn("Can't determine my address of connection to `%s:%s'", host, port); code = -1; @@ -297,7 +298,7 @@ hookup(const char *host, const char *por } void -cmdabort(int notused) +cmdabort(int notused __unused) { int oerrno = errno; @@ -312,7 +313,7 @@ cmdabort(int notused) } void -cmdtimeout(int notused) +cmdtimeout(int notused __unused) { int oerrno = errno; @@ -568,10 +569,10 @@ empty(FILE *ecin, FILE *din, int sec) return nr; } -sigjmp_buf xferabort; +static sigjmp_buf xferabort; __dead static void -abortxfer(int notused) +abortxfer(int notused __unused) { char msgbuf[100]; size_t len; @@ -622,7 +623,7 @@ copy_bytes(int infd, int outfd, char *bu else bufchunk = bufsize; - while (1) { + for (;;) { if (rate_limit) { (void)gettimeofday(&tvthen, NULL); } @@ -663,7 +664,7 @@ copy_bytes(int infd, int outfd, char *bu } } if (rate_limit) { /* rate limited; wait if necessary */ - while (1) { + for (;;) { (void)gettimeofday(&tvnow, NULL); timersub(&tvnow, &tvthen, &tvdiff); if (tvdiff.tv_sec > 0) @@ -775,7 +776,7 @@ sendrequest(const char *cmd, const char if (restart_point && (strcmp(cmd, "STOR") == 0 || strcmp(cmd, "APPE") == 0)) { - int rc; + off_t rc; rc = -1; switch (curtype) { @@ -1517,7 +1518,7 @@ initconn(void) } else goto bad; - if (ftp_connect(data, (struct sockaddr *)&data_addr.si_su, + if (ftp_connect(data, (struct sockaddr *)(void *)&data_addr.si_su, data_addr.su_len, 1) < 0) { if (activefallback) { (void)close(data); @@ -1562,7 +1563,7 @@ initconn(void) warn("Can't set SO_REUSEADDR on data connection"); goto bad; } - if (bind(data, (struct sockaddr *)&data_addr.si_su, + if (bind(data, (struct sockaddr *)(void *)&data_addr.si_su, data_addr.su_len) < 0) { warn("Can't bind for data connection"); goto bad; @@ -1574,7 +1575,7 @@ initconn(void) } len = sizeof(data_addr.si_su); memset((char *)&data_addr, 0, sizeof (data_addr)); - if (getsockname(data, (struct sockaddr *)&data_addr.si_su, &len) == -1) { + if (getsockname(data, (struct sockaddr *)(void *)&data_addr.si_su, &len) == -1) { warn("Can't determine my address of data connection"); goto bad; } @@ -1606,7 +1607,7 @@ initconn(void) if (tmp.su_family == AF_INET6) tmp.si_su.su_sin6.sin6_scope_id = 0; #endif - if (getnameinfo((struct sockaddr *)&tmp.si_su, + if (getnameinfo((struct sockaddr *)(void *)&tmp.si_su, tmp.su_len, hname, sizeof(hname), sname, sizeof(sname), NI_NUMERICHOST | NI_NUMERICSERV)) { result = ERROR; @@ -1729,7 +1730,7 @@ dataconn(const char *lmode) do { (void)gettimeofday(&now, NULL); timersub(&endtime, &now, &td); - timeout = td.tv_sec * 1000 + td.tv_usec/1000; + timeout = (int)(td.tv_sec * 1000 + td.tv_usec / 1000); if (timeout < 0) timeout = 0; rv = ftp_poll(pfd, 1, timeout); @@ -1747,7 +1748,7 @@ dataconn(const char *lmode) /* (non-blocking) accept the connection */ fromlen = myctladdr.su_len; do { - s = accept(data, (struct sockaddr *) &from.si_su, &fromlen); + s = accept(data, (struct sockaddr *)(void *)&from.si_su, &fromlen); /* loop until accept !EINTR && !EAGAIN */ } while (s == -1 && (errno == EINTR || errno == EAGAIN)); if (s == -1) { @@ -1778,7 +1779,7 @@ dataconn(const char *lmode) } void -psabort(int notused) +psabort(int notused __unused) { int oerrno = errno; @@ -1876,7 +1877,7 @@ pswitch(int flag) } __dead static void -abortpt(int notused) +abortpt(int notused __unused) { sigint_raised = 1; @@ -2040,7 +2041,8 @@ gunique(const char *local) { static char new[MAXPATHLEN]; char *cp = strrchr(local, '/'); - int d, count=0, len; + int d, count = 0; + size_t len; char ext = '1'; if (cp) @@ -2175,7 +2177,7 @@ ai_unmapped(struct addrinfo *ai) if (ai->ai_addrlen != sizeof(struct sockaddr_in6) || sizeof(sin) > ai->ai_addrlen) return; - sin6 = (struct sockaddr_in6 *)ai->ai_addr; + sin6 = (struct sockaddr_in6 *)(void *)ai->ai_addr; if (!IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) return; Index: src/usr.bin/ftp/ftp_var.h diff -u src/usr.bin/ftp/ftp_var.h:1.86 src/usr.bin/ftp/ftp_var.h:1.86.2.1 --- src/usr.bin/ftp/ftp_var.h:1.86 Fri Sep 10 21:52:17 2021 +++ src/usr.bin/ftp/ftp_var.h Sun Oct 13 16:06:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: ftp_var.h,v 1.86 2021/09/10 21:52:17 rillig Exp $ */ +/* $NetBSD: ftp_var.h,v 1.86.2.1 2024/10/13 16:06:36 martin Exp $ */ /*- * Copyright (c) 1996-2009 The NetBSD Foundation, Inc. @@ -101,6 +101,7 @@ #endif #include <sys/param.h> +#include <sys/queue.h> #include <netinet/in.h> #include <arpa/inet.h> @@ -165,11 +166,19 @@ enum { FEAT_max }; +/* + * Custom HTTP headers + */ +struct entry { + SLIST_ENTRY(entry) entries; + const char *header; +}; +SLIST_HEAD(http_headers, entry); /* * Global defines */ -#define FTPBUFLEN (4 * MAXPATHLEN) +#define FTPBUFLEN (16 * 1024) #define MAX_IN_PORT_T 0xffffU #define HASHBYTES 1024 /* default mark for `hash' command */ @@ -320,9 +329,11 @@ GLOBAL FILE *cin; GLOBAL FILE *cout; GLOBAL int data; -extern struct cmd cmdtab[]; -extern struct option optiontab[]; +extern struct cmd cmdtab[]; +extern struct option optiontab[]; +extern struct http_headers custom_headers; +extern size_t ftp_buflen; #define EMPTYSTRING(x) ((x) == NULL || (*(x) == '\0')) #define FREEPTR(x) if ((x) != NULL) { free(x); (x) = NULL; } Index: src/usr.bin/ftp/main.c diff -u src/usr.bin/ftp/main.c:1.128.2.1 src/usr.bin/ftp/main.c:1.128.2.2 --- src/usr.bin/ftp/main.c:1.128.2.1 Tue May 16 16:16:00 2023 +++ src/usr.bin/ftp/main.c Sun Oct 13 16:06:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: main.c,v 1.128.2.1 2023/05/16 16:16:00 martin Exp $ */ +/* $NetBSD: main.c,v 1.128.2.2 2024/10/13 16:06:36 martin Exp $ */ /*- * Copyright (c) 1996-2023 The NetBSD Foundation, Inc. @@ -98,7 +98,7 @@ __COPYRIGHT("@(#) Copyright (c) 1985, 19 #if 0 static char sccsid[] = "@(#)main.c 8.6 (Berkeley) 10/9/94"; #else -__RCSID("$NetBSD: main.c,v 1.128.2.1 2023/05/16 16:16:00 martin Exp $"); +__RCSID("$NetBSD: main.c,v 1.128.2.2 2024/10/13 16:06:36 martin Exp $"); #endif #endif /* not lint */ @@ -134,11 +134,14 @@ static int usage(void); static int usage_help(void); static void setupoption(const char *, const char *, const char *); +struct http_headers custom_headers; + int main(int volatile argc, char **volatile argv) { int ch, rval; struct passwd *pw; + struct entry *p; char *cp, *ep, *anonpass, *upload_path, *src_addr; const char *anonuser; int dumbterm, isupload; @@ -267,7 +270,8 @@ main(int volatile argc, char **volatile } } - while ((ch = getopt(argc, argv, ":46AadefginN:o:pP:q:r:Rs:tT:u:vVx:")) != -1) { + SLIST_INIT(&custom_headers); + while ((ch = getopt(argc, argv, ":46Aab:defgH:inN:o:pP:q:r:Rs:tT:u:vVx:")) != -1) { switch (ch) { case '4': family = AF_INET; @@ -290,6 +294,12 @@ main(int volatile argc, char **volatile anonftp = 1; break; + case 'b': + ftp_buflen = strtol(optarg, &ep, 0); + if (ftp_buflen < 1 || *ep != '\0') + errx(1, "Bad buflen value: %s", optarg); + break; + case 'd': options |= SO_DEBUG; ftp_debug++; @@ -309,6 +319,12 @@ main(int volatile argc, char **volatile doglob = 0; break; + case 'H': + p = ftp_malloc(sizeof(*p)); + p->header = ftp_strdup(optarg); + SLIST_INSERT_HEAD(&custom_headers, p, entries); + break; + case 'i': interactive = 0; break; @@ -340,13 +356,13 @@ main(int volatile argc, char **volatile break; case 'q': - quit_time = strtol(optarg, &ep, 10); + quit_time = (int)strtol(optarg, &ep, 10); if (quit_time < 1 || *ep != '\0') errx(1, "Bad quit value: %s", optarg); break; case 'r': - retry_connect = strtol(optarg, &ep, 10); + retry_connect = (int)strtol(optarg, &ep, 10); if (retry_connect < 1 || *ep != '\0') errx(1, "Bad retry value: %s", optarg); break; @@ -759,7 +775,8 @@ getcmd(const char *name) { const char *p, *q; struct cmd *c, *found; - int nmatches, longest; + int nmatches; + ptrdiff_t longest; if (name == NULL) return (0); @@ -789,7 +806,7 @@ getcmd(const char *name) * Slice a string up into argc/argv. */ -int slrflag; +static int slrflag; void makeargv(void) @@ -1063,8 +1080,9 @@ synopsis(FILE * stream) const char * progname = getprogname(); fprintf(stream, -"usage: %s [-46AadefginpRtVv] [-N NETRC] [-o OUTPUT] [-P PORT] [-q QUITTIME]\n" -" [-r RETRY] [-s SRCADDR] [-T DIR,MAX[,INC]] [-x XFERSIZE]\n" +"usage: %s [-46AadefginpRtVv] [-H HEADER] [-N NETRC] [-o OUTPUT] [-P PORT]\n" +" [-q QUITTIME] [-r RETRY] [-s SRCADDR] [-T DIR,MAX[,INC]]\n" +" [-x XFERSIZE]\n" " [[USER@]HOST [PORT]]\n" " [[USER@]HOST:[PATH][/]]\n" " [file:///PATH]\n" @@ -1089,6 +1107,7 @@ usage_help(void) " -6 Only use IPv6 addresses\n" " -A Force active mode\n" " -a Use anonymous login\n" +" -b BUFLEN Use BUFLEN bytes for fetch buffer\n" " -d Enable debugging\n" " -e Disable command-line editing\n" " -f Force cache reload for FTP or HTTP proxy transfers\n" Index: src/usr.bin/ftp/progressbar.c diff -u src/usr.bin/ftp/progressbar.c:1.24 src/usr.bin/ftp/progressbar.c:1.24.6.1 --- src/usr.bin/ftp/progressbar.c:1.24 Wed Jan 6 04:43:14 2021 +++ src/usr.bin/ftp/progressbar.c Sun Oct 13 16:06:36 2024 @@ -1,7 +1,7 @@ -/* $NetBSD: progressbar.c,v 1.24 2021/01/06 04:43:14 lukem Exp $ */ +/* $NetBSD: progressbar.c,v 1.24.6.1 2024/10/13 16:06:36 martin Exp $ */ /*- - * Copyright (c) 1997-2021 The NetBSD Foundation, Inc. + * Copyright (c) 1997-2024 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: progressbar.c,v 1.24 2021/01/06 04:43:14 lukem Exp $"); +__RCSID("$NetBSD: progressbar.c,v 1.24.6.1 2024/10/13 16:06:36 martin Exp $"); #endif /* not lint */ /* @@ -76,7 +76,7 @@ static void updateprogressmeter(int); * SIGALRM handler to update the progress meter */ static void -updateprogressmeter(int dummy) +updateprogressmeter(int dummy __unused) { int oerrno = errno; @@ -89,17 +89,17 @@ updateprogressmeter(int dummy) */ #if !defined(NO_PROGRESS) || !defined(STANDALONE_PROGRESS) static const char * const suffixes[] = { - "", /* 2^0 (byte) */ - "KiB", /* 2^10 Kibibyte */ - "MiB", /* 2^20 Mebibyte */ - "GiB", /* 2^30 Gibibyte */ - "TiB", /* 2^40 Tebibyte */ - "PiB", /* 2^50 Pebibyte */ - "EiB", /* 2^60 Exbibyte */ + "", /* 2^0, (byte) */ + "KiB", /* 2^10, Kibibyte */ + "MiB", /* 2^20, Mebibyte */ + "GiB", /* 2^30, Gibibyte */ + "TiB", /* 2^40, Tebibyte */ + "PiB", /* 2^50, Pebibyte */ + "EiB", /* 2^60, Exbibyte */ #if 0 /* The following are not necessary for signed 64-bit off_t */ - "ZiB", /* 2^70 Zebibyte */ - "YiB", /* 2^80 Yobibyte */ + "ZiB", /* 2^70, Zebibyte */ + "YiB", /* 2^80, Yobibyte */ #endif }; #define NSUFFIXES (int)(sizeof(suffixes) / sizeof(suffixes[0])) @@ -376,7 +376,7 @@ ptransfer(int siginfo) * SIG{INFO,QUIT} handler to print transfer stats if a transfer is in progress */ void -psummary(int notused) +psummary(int notused __unused) { int oerrno = errno; Index: src/usr.bin/ftp/ruserpass.c diff -u src/usr.bin/ftp/ruserpass.c:1.33 src/usr.bin/ftp/ruserpass.c:1.33.86.1 --- src/usr.bin/ftp/ruserpass.c:1.33 Tue Apr 17 05:52:04 2007 +++ src/usr.bin/ftp/ruserpass.c Sun Oct 13 16:06:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: ruserpass.c,v 1.33 2007/04/17 05:52:04 lukem Exp $ */ +/* $NetBSD: ruserpass.c,v 1.33.86.1 2024/10/13 16:06:36 martin Exp $ */ /* * Copyright (c) 1985, 1993, 1994 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)ruserpass.c 8.4 (Berkeley) 4/27/95"; #else -__RCSID("$NetBSD: ruserpass.c,v 1.33 2007/04/17 05:52:04 lukem Exp $"); +__RCSID("$NetBSD: ruserpass.c,v 1.33.86.1 2024/10/13 16:06:36 martin Exp $"); #endif #endif /* not lint */ @@ -247,7 +247,7 @@ ruserpass(const char *host, char **aname tmp++; } if (tmp == macbuf + 4096) { - fputs("4K macro buffer exceeded.\n", + fputs("4 KiB macro buffer exceeded.\n", ttyout); goto bad; } Index: src/usr.bin/ftp/ssl.c diff -u src/usr.bin/ftp/ssl.c:1.12.2.4 src/usr.bin/ftp/ssl.c:1.12.2.5 --- src/usr.bin/ftp/ssl.c:1.12.2.4 Mon Aug 26 07:28:17 2024 +++ src/usr.bin/ftp/ssl.c Sun Oct 13 16:06:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: ssl.c,v 1.12.2.4 2024/08/26 07:28:17 martin Exp $ */ +/* $NetBSD: ssl.c,v 1.12.2.5 2024/10/13 16:06:36 martin Exp $ */ /*- * Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: ssl.c,v 1.12.2.4 2024/08/26 07:28:17 martin Exp $"); +__RCSID("$NetBSD: ssl.c,v 1.12.2.5 2024/10/13 16:06:36 martin Exp $"); #endif #include <err.h> @@ -113,7 +113,8 @@ fetch_writev(struct fetch_connect *conn, do { (void)gettimeofday(&now, NULL); timersub(&timeout, &now, &delta); - timeout_secs = delta.tv_sec * 1000 + delta.tv_usec/1000; + timeout_secs = (int)(delta.tv_sec * 1000 + + delta.tv_usec / 1000); if (timeout_secs < 0) timeout_secs = 0; rv = ftp_poll(pfd, 1, timeout_secs); @@ -129,7 +130,7 @@ fetch_writev(struct fetch_connect *conn, errno = 0; #ifdef WITH_SSL if (conn->ssl != NULL) - len = SSL_write(conn->ssl, iov->iov_base, iov->iov_len); + len = SSL_write(conn->ssl, iov->iov_base, (int)iov->iov_len); else #endif len = writev(fd, iov, iovcnt); @@ -177,7 +178,7 @@ fetch_printf(struct fetch_connect *conn, va_list ap; size_t len; char *msg; - int r; + ssize_t r; va_start(ap, fmt); len = vasprintf(&msg, fmt, ap); @@ -190,7 +191,7 @@ fetch_printf(struct fetch_connect *conn, r = fetch_write(msg, len, conn); free(msg); - return r; + return (int)r; } int @@ -301,8 +302,8 @@ fetch_close(struct fetch_connect *conn) static ssize_t fetch_ssl_read(SSL *ssl, void *buf, size_t len) { - ssize_t rlen; - rlen = SSL_read(ssl, buf, len); + int rlen; + rlen = SSL_read(ssl, buf, (int)len); if (rlen >= 0) return rlen; @@ -376,7 +377,8 @@ fetch_wait(struct fetch_connect *conn, s if (quit_time > 0) { gettimeofday(&now, NULL); timersub(timeout, &now, &delta); - timeout_secs = delta.tv_sec * 1000 + delta.tv_usec/1000; + timeout_secs = (int)(delta.tv_sec * 1000 + + delta.tv_usec / 1000); if (timeout_secs < 0) timeout_secs = 0; } else { @@ -555,7 +557,7 @@ fetch_getline(struct fetch_connect *conn size_t len; int rv; - if (fetch_getln(buf, buflen, conn) == NULL) { + if (fetch_getln(buf, (int)buflen, conn) == NULL) { if (conn->iseof) { /* EOF */ rv = -2; if (errormsg) @@ -572,20 +574,20 @@ fetch_getline(struct fetch_connect *conn if (buf[len - 1] == '\n') { /* clear any trailing newline */ buf[--len] = '\0'; } else if (len == buflen - 1) { /* line too long */ - while (1) { + for (;;) { char c; size_t rlen = fetch_read(&c, sizeof(c), 1, conn); if (rlen == 0 || c == '\n') break; } if (errormsg) - *errormsg = "Input line is too long"; + *errormsg = "Input line is too long (specify -b > 16384)"; fetch_clearerr(conn); return -3; } if (errormsg) *errormsg = NULL; - return len; + return (int)len; } #ifdef WITH_SSL @@ -687,7 +689,8 @@ fetch_start_ssl(int sock, const char *se } (void)gettimeofday(&now, NULL); timersub(&timeout, &now, &delta); - timeout_secs = delta.tv_sec * 1000 + delta.tv_usec/1000; + timeout_secs = (int)(delta.tv_sec * 1000 + + delta.tv_usec / 1000); if (timeout_secs < 0) timeout_secs = 0; rv = ftp_poll(pfd, 1, timeout_secs); Index: src/usr.bin/ftp/util.c diff -u src/usr.bin/ftp/util.c:1.164.2.2 src/usr.bin/ftp/util.c:1.164.2.3 --- src/usr.bin/ftp/util.c:1.164.2.2 Tue May 16 16:26:03 2023 +++ src/usr.bin/ftp/util.c Sun Oct 13 16:06:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: util.c,v 1.164.2.2 2023/05/16 16:26:03 martin Exp $ */ +/* $NetBSD: util.c,v 1.164.2.3 2024/10/13 16:06:36 martin Exp $ */ /*- * Copyright (c) 1997-2023 The NetBSD Foundation, Inc. @@ -64,7 +64,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: util.c,v 1.164.2.2 2023/05/16 16:26:03 martin Exp $"); +__RCSID("$NetBSD: util.c,v 1.164.2.3 2024/10/13 16:06:36 martin Exp $"); #endif /* not lint */ /* @@ -202,11 +202,11 @@ getremoteinfo(void) /* determine remote system type */ if (command("SYST") == COMPLETE) { if (overbose) { - int os_len = strcspn(reply_string + 4, " \r\n\t"); + off_t os_len = strcspn(reply_string + 4, " \r\n\t"); if (os_len > 1 && reply_string[4 + os_len - 1] == '.') os_len--; fprintf(ttyout, "Remote system type is %.*s.\n", - os_len, reply_string + 4); + (int)os_len, reply_string + 4); } /* * Decide whether we should default to bninary. @@ -311,7 +311,7 @@ cleanuppeer(void) * Top-level signal handler for interrupted commands. */ void -intr(int signo) +intr(int signo __unused) { sigint_raised = 1; @@ -949,7 +949,7 @@ list_vertical(StringList *sl) * Update the global ttywidth value, using TIOCGWINSZ. */ void -setttywidth(int a) +setttywidth(int a __unused) { struct winsize winsize; int oerrno = errno; @@ -1072,7 +1072,7 @@ strsuftoi(const char *arg) if (val < 0 || val > INT_MAX) return (-1); - return (val); + return (int)(val); } /* @@ -1314,7 +1314,7 @@ get_line(FILE *stream, char *buf, size_t int rv, ch; size_t len; - if (fgets(buf, buflen, stream) == NULL) { + if (fgets(buf, (int)buflen, stream) == NULL) { if (feof(stream)) { /* EOF */ rv = -2; if (errormsg) @@ -1340,7 +1340,7 @@ get_line(FILE *stream, char *buf, size_t } if (errormsg) *errormsg = NULL; - return len; + return (int)len; } /* @@ -1431,7 +1431,8 @@ ftp_connect(int sock, const struct socka if (quit_time > 0) { /* determine timeout */ (void)gettimeofday(&now, NULL); timersub(&endtime, &now, &td); - timeout = td.tv_sec * 1000 + td.tv_usec/1000; + timeout = (int)(td.tv_sec * 1000 + + td.tv_usec / 1000); if (timeout < 0) timeout = 0; } else { Added files: Index: src/tests/usr.bin/ftp/Makefile diff -u /dev/null src/tests/usr.bin/ftp/Makefile:1.1.2.2 --- /dev/null Sun Oct 13 16:06:37 2024 +++ src/tests/usr.bin/ftp/Makefile Sun Oct 13 16:06:37 2024 @@ -0,0 +1,15 @@ +# $NetBSD: Makefile,v 1.1.2.2 2024/10/13 16:06:37 martin Exp $ + +.include <bsd.own.mk> + +TESTSDIR= ${TESTSBASE}/usr.bin/ftp +TESTS_SH= t_custom_headers + +SCRIPTSDIR= ${TESTSDIR} +SCRIPTS+= custom_headers.sh + +# Keep the .sh suffix because we use it to trigger cgi-bin handling in +# bozohttpd (rather silly but it's easier that way). +SCRIPTSNAME_custom_headers.sh= custom_headers.sh + +.include <bsd.test.mk> Index: src/tests/usr.bin/ftp/custom_headers.sh diff -u /dev/null src/tests/usr.bin/ftp/custom_headers.sh:1.1.2.2 --- /dev/null Sun Oct 13 16:06:37 2024 +++ src/tests/usr.bin/ftp/custom_headers.sh Sun Oct 13 16:06:37 2024 @@ -0,0 +1,36 @@ +#! /bin/sh +# +# $NetBSD: custom_headers.sh,v 1.1.2.2 2024/10/13 16:06:37 martin Exp $ +# +# Copyright (c) 2024 The NetBSD Foundation, Inc. +# All rights reserved. +# +# This code is derived from software contributed to The NetBSD Foundation +# by Sunil Nimmagadda. +# +# 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. +# 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. +# +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +# ``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 FOUNDATION OR CONTRIBUTORS +# 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. +# + +echo "Content-type: text/plain; charset=utf-8" +echo "" +echo "HTTP_X_ORIGIN=$HTTP_X_ORIGIN" +echo "HTTP_X_RATE_LIMIT=$HTTP_X_RATE_LIMIT" Index: src/tests/usr.bin/ftp/t_custom_headers.sh diff -u /dev/null src/tests/usr.bin/ftp/t_custom_headers.sh:1.1.2.2 --- /dev/null Sun Oct 13 16:06:37 2024 +++ src/tests/usr.bin/ftp/t_custom_headers.sh Sun Oct 13 16:06:37 2024 @@ -0,0 +1,67 @@ +# $NetBSD: t_custom_headers.sh,v 1.1.2.2 2024/10/13 16:06:37 martin Exp $ +# +# Copyright (c) 2024 The NetBSD Foundation, Inc. +# All rights reserved. +# +# This code is derived from software contributed to The NetBSD Foundation +# by Sunil Nimmagadda. +# +# 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. +# 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. +# +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +# ``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 FOUNDATION OR CONTRIBUTORS +# 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. +# + +atf_test_case custom_headers cleanup +custom_headers_head() +{ + atf_require_prog ftp + atf_set "descr" "Check for custom HTTP headers" +} + +HTTPD_PID=./.__httpd.pid +custom_headers_body() +{ + # start httpd in daemon mode + atf_check -s exit:0 \ + /usr/libexec/httpd -P $HTTPD_PID -I 8080 -b -C .sh /bin/sh \ + -c "$(atf_get_srcdir)" . + + atf_check \ + -o inline:'HTTP_X_ORIGIN=example.com\nHTTP_X_RATE_LIMIT=1000\n' \ + ftp -V -o - \ + -H 'X-Origin: example.com' \ + -H 'X-Rate-Limit: 1000' \ + http://127.0.0.1:8080/cgi-bin/custom_headers.sh +} + +custom_headers_cleanup() +{ + if [ -f "$HTTPD_PID" ]; then + echo kill -9 "$(cat $HTTPD_PID)" + kill -9 "$(cat $HTTPD_PID)" + echo '# wait for httpd to exit' + sleep 1 + fi +} + +atf_init_test_cases() +{ + atf_add_test_case custom_headers +}