summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNHOrus <jy6x2b32pie9@yahoo.com>2024-04-24 14:59:21 +0400
committerViorel Munteanu <ceamac@gentoo.org>2024-04-29 08:18:39 +0300
commit9041943e464b5d219db2101df1eebcab907e4b60 (patch)
tree1a33966f2255ffc98c2cd57236b396bb983fb4fd /net-ftp/linksys-tftp
parentdev-perl/Crypt-SMIME: add 0.300.0 (diff)
downloadgentoo-9041943e464b5d219db2101df1eebcab907e4b60.tar.gz
gentoo-9041943e464b5d219db2101df1eebcab907e4b60.tar.bz2
gentoo-9041943e464b5d219db2101df1eebcab907e4b60.zip
net-ftp/linksys-tftp: Port to C99, fix compile on musl systems
Primary patch by Richard Narron from bug 928051 Musl fix by me. Closes: https://bugs.gentoo.org/928051 Closes: https://bugs.gentoo.org/714212 Closes: https://bugs.gentoo.org/874582 Closes: https://bugs.gentoo.org/885699 Closes: https://bugs.gentoo.org/913577 Signed-off-by: NHOrus <jy6x2b32pie9@yahoo.com> Closes: https://github.com/gentoo/gentoo/pull/36399 Signed-off-by: Viorel Munteanu <ceamac@gentoo.org>
Diffstat (limited to 'net-ftp/linksys-tftp')
-rw-r--r--net-ftp/linksys-tftp/files/linksys-tftp-1.2.1-r4-c99-port.patch572
-rw-r--r--net-ftp/linksys-tftp/linksys-tftp-1.2.1-r4.ebuild31
2 files changed, 603 insertions, 0 deletions
diff --git a/net-ftp/linksys-tftp/files/linksys-tftp-1.2.1-r4-c99-port.patch b/net-ftp/linksys-tftp/files/linksys-tftp-1.2.1-r4-c99-port.patch
new file mode 100644
index 000000000000..b4db3d2df8b0
--- /dev/null
+++ b/net-ftp/linksys-tftp/files/linksys-tftp-1.2.1-r4-c99-port.patch
@@ -0,0 +1,572 @@
+Following patches are by Richard Narron from https://bugs.gentoo.org/928051
+--- linksys-tftp-1.2.1/tftpsubs.c 2024-04-16 08:27:50.310449884 -0700
++++ linksys-tftp-1.2.1/tftpsubs.c 2024-04-16 08:53:26.084521570 -0700
+@@ -38,6 +38,7 @@ static char sccsid[] = "@(#)tftpsubs.c 5
+ // modified tftp header to include pass
+ #include <tftp.h>
+ #include <stdio.h>
++#include <unistd.h>
+
+ #define PKTSIZE (1432+4) /* SEGSIZE+4 */ /* should be moved to tftp.h */
+
+@@ -60,14 +61,22 @@ static int current; /* index of buff
+ int newline = 0; /* fillbuf: in middle of newline expansion */
+ int prevchar = -1; /* putbuf: previous char (cr check) */
+
+-struct tftphdr *rw_init();
++/* functions declared in this program */
++struct tftphdr *w_init();
++struct tftphdr *r_init();
++struct tftphdr *rw_init(int x);
++int readit(FILE *file, struct tftphdr **dpp, int convert);
++int read_ahead(FILE *file, int convert);
++int writeit(FILE *file, struct tftphdr **dpp, int ct, int convert);
++int write_behind( FILE *file, int convert);
++int synchnet(int f);
+
+ struct tftphdr *w_init() { return rw_init(0); } /* write-behind */
+ struct tftphdr *r_init() { return rw_init(1); } /* read-ahead */
+
+-struct tftphdr *
+-rw_init(x) /* init for either read-ahead or write-behind */
+-int x; /* zero for write-behind, one for read-head */
++/* init for either read-ahead or write-behind */
++struct tftphdr *rw_init(int x)
++ /* zero for write-behind, one for read-head */
+ {
+ newline = 0; /* init crlf flag */
+ prevchar = -1;
+@@ -82,10 +91,8 @@ int x; /* zero for writ
+ /* Have emptied current buffer by sending to net and getting ack.
+ Free it and return next buffer filled with data.
+ */
+-readit(file, dpp, convert)
+- FILE *file; /* file opened for read */
+- struct tftphdr **dpp;
+- int convert; /* if true, convert to ascii */
++int readit(FILE *file, struct tftphdr **dpp, int convert)
++ /* file opened for read if true, convert to ascii */
+ {
+ struct bf *b;
+
+@@ -104,9 +111,9 @@ readit(file, dpp, convert)
+ * fill the input buffer, doing ascii conversions if requested
+ * conversions are lf -> cr,lf and cr -> cr, nul
+ */
+-read_ahead(file, convert)
+- FILE *file; /* file opened for read */
+- int convert; /* if true, convert to ascii */
++int read_ahead(FILE *file, int convert)
++ /* file opened for read */
++ /* if true, convert to ascii */
+ {
+ register int i;
+ register char *p;
+@@ -154,16 +161,14 @@ read_ahead(file, convert)
+ *p++ = c;
+ }
+ b->counter = (int)(p - dp->th_data);
++ return 0;
+ }
+
+ /* Update count associated with the buffer, get new buffer
+ from the queue. Calls write_behind only if next buffer not
+ available.
+ */
+-writeit(file, dpp, ct, convert)
+- FILE *file;
+- struct tftphdr **dpp;
+- int convert;
++int writeit(FILE *file, struct tftphdr **dpp, int ct, int convert)
+ {
+ bfs[current].counter = ct; /* set size of data to write */
+ current = !current; /* switch to other buffer */
+@@ -180,9 +185,7 @@ writeit(file, dpp, ct, convert)
+ * Note spec is undefined if we get CR as last byte of file or a
+ * CR followed by anything else. In this case we leave it alone.
+ */
+-write_behind(file, convert)
+- FILE *file;
+- int convert;
++int write_behind( FILE *file, int convert)
+ {
+ char *buf;
+ int count;
+@@ -238,9 +241,8 @@ skipit:
+ * when trace is active).
+ */
+
+-int
+-synchnet(f)
+-int f; /* socket to flush */
++int synchnet(int f)
++ /* socket to flush */
+ {
+ int i, j = 0;
+ char rbuf[PKTSIZE];
+@@ -258,4 +260,5 @@ int f; /* socket to flush */
+ return(j);
+ }
+ }
++ return 0; /* should never get here */
+ }
+--- linksys-tftp-1.2.1/tftp.c 2024-04-16 08:27:50.328449885 -0700
++++ linksys-tftp-1.2.1/tftp.c 2024-04-15 21:26:36.259371211 -0700
+@@ -47,6 +47,13 @@ extern int rexmtval;
+ extern int maxtimeout;
+ extern int segsize;
+
++/* functions from tftpsubs */
++extern int readit(FILE *file, struct tftphdr **dpp, int convert);
++extern int read_ahead(FILE *file, int convert);
++extern int writeit(FILE *file, struct tftphdr **dpp, int ct, int convert);
++extern int write_behind( FILE *file, int convert);
++extern int synchnet(int f);
++
+ #define PKTSIZE (1432+4) /* SEGSIZE+4 */
+ char ackbuf[PKTSIZE];
+ int timeout;
+@@ -57,6 +64,19 @@ jmp_buf timeoutbuf;
+ #define OACK 6
+ #endif
+
++/* functions declared herein */
++void timer(int sig);
++void parseoack(char *cp, int sz);
++void sendfile(int fd, char *name, char *mode, char *linkpass);
++void recvfile(int fd, char *name, char *mode, char *linkpass);
++int makerequest(int request, char *name, struct tftphdr *tp, char *mode, char *linkpass);
++void nak(int error);
++void topts(char *cp, int sz);
++void tpacket(char *s, struct tftphdr *tp, int n);
++void startclock();
++void stopclock();
++void printstats(char *direction, unsigned long amount);
++
+ void timer(int sig)
+ {
+
+@@ -72,9 +92,7 @@ void timer(int sig)
+ /*
+ * Parse an OACK package and set blocksize accordingly
+ */
+-parseoack(cp, sz)
+- char *cp;
+- int sz;
++void parseoack(char *cp, int sz)
+ {
+ int n;
+
+@@ -106,11 +124,7 @@ parseoack(cp, sz)
+ /*
+ * Send the requested file.
+ */
+-sendfile(fd, name, mode, linkpass)
+- int fd;
+- char *name;
+- char *mode;
+- char *linkpass;
++void sendfile(int fd, char *name, char *mode, char *linkpass)
+ {
+ register struct tftphdr *ap; /* data and ack packets */
+ struct tftphdr *r_init(), *dp;
+@@ -211,7 +225,7 @@ send_data:
+ printf("protocol violation\n");
+ longjmp(toplevel, -1);
+ }
+- parseoack(&ap->th_stuff, n - 2);
++ parseoack(ap->th_stuff, n - 2);
+ break;
+ }
+ }
+@@ -231,11 +245,7 @@ abort:
+ /*
+ * Receive a file.
+ */
+-recvfile(fd, name, mode, linkpass)
+- int fd;
+- char *name;
+- char *mode;
+- char *linkpass;
++void recvfile(int fd, char *name, char *mode, char *linkpass)
+ {
+ register struct tftphdr *ap;
+ struct tftphdr *dp, *w_init();
+@@ -336,7 +346,7 @@ send_ack:
+ longjmp(toplevel, -1);
+ }
+ waitforoack = 0;
+- parseoack(&dp->th_stuff, n - 2);
++ parseoack(dp->th_stuff, n - 2);
+ ap->th_opcode = htons((u_short)ACK);
+ ap->th_block = htons(0);
+ size = 4;
+@@ -362,10 +372,7 @@ abort:
+ printstats("Received", amount);
+ }
+
+-makerequest(request, name, tp, mode, linkpass)
+- int request;
+- char *name, *mode, *linkpass;
+- struct tftphdr *tp;
++int makerequest(int request, char *name, struct tftphdr *tp, char *mode, char *linkpass)
+ {
+ register char *cp;
+
+@@ -404,8 +411,7 @@ struct errmsg {
+ * standard TFTP codes, or a UNIX errno
+ * offset by 100.
+ */
+-nak(error)
+- int error;
++void nak(int error)
+ {
+ register struct tftphdr *tp;
+ int length;
+@@ -431,9 +437,7 @@ nak(error)
+ perror("nak");
+ }
+
+-topts(cp, sz)
+- char *cp;
+- int sz;
++void topts(char *cp, int sz)
+ {
+ int n, i = 0;
+
+@@ -454,10 +458,7 @@ topts(cp, sz)
+ }
+ }
+
+-tpacket(s, tp, n)
+- char *s;
+- struct tftphdr *tp;
+- int n;
++void tpacket(char *s, struct tftphdr *tp, int n)
+ {
+ static char *opcodes[] =
+ { "#0", "RRQ", "WRQ", "DATA", "ACK", "ERROR", "OACK" };
+@@ -505,17 +506,15 @@ struct timeval tstart;
+ struct timeval tstop;
+ struct timezone zone;
+
+-startclock() {
++void startclock() {
+ gettimeofday(&tstart, &zone);
+ }
+
+-stopclock() {
++void stopclock() {
+ gettimeofday(&tstop, &zone);
+ }
+
+-printstats(direction, amount)
+-char *direction;
+-unsigned long amount;
++void printstats(char *direction, unsigned long amount)
+ {
+ double delta;
+ /* compute delta in 1/10's second units */
+--- linksys-tftp-1.2.1/main.c 2024-04-16 08:27:50.327449884 -0700
++++ linksys-tftp-1.2.1/main.c 2024-04-15 21:36:43.035399534 -0700
+@@ -33,6 +33,7 @@ static char sccsid[] = "@(#)main.c 5.8 (
+ #include <sys/file.h>
+
+ #include <netinet/in.h>
++#include <arpa/inet.h>
+
+ #include <signal.h>
+ #include <stdio.h>
+@@ -43,7 +44,11 @@ static char sccsid[] = "@(#)main.c 5.8 (
+ #include <stdlib.h>
+ #include <string.h>
+ #include <unistd.h>
+-#include <sys/sendfile.h>
++/* #include <sys/sendfile.h> */
++
++/* routines from tftp.c */
++extern void sendfile(int fd, char *name, char *mode, char *linkpass);
++extern void recvfile(int fd, char *name, char *mode, char *linkpass);
+
+ #define TIMEOUT 5 /* secs between rexmt's */
+
+@@ -64,9 +69,13 @@ struct servent *sp;
+
+ int segsize = 512;
+
+-int quit(), help(), setverbose(), settrace(), status();
+-int get(), put(), setpeer(), modecmd(), setrexmt(), settimeout();
+-int setbinary(), banner(), setascii(), setblocksize();
++/* local routines */
++int quit(), help(), setverbose(), settrace(), status(), command();
++int get(), getusage(), put(), putusage();
++int setpeer(), modecmd(), setrexmt(), settimeout(), status();
++int setbinary(), setascii();
++void setmode(), makeargv();
++int setblocksize(), banner();
+
+ #define HELPINDENT (sizeof("connect"))
+
+@@ -114,8 +123,7 @@ struct cmd *getcmd();
+ char *index();
+ char *rindex();
+
+-int main(argc, argv)
+- char *argv[];
++int main(int argc, char *argv[])
+ {
+ struct sockaddr_in sin;
+ int top;
+@@ -147,13 +155,12 @@ int main(argc, argv)
+ top = setjmp(toplevel) == 0;
+ for (;;)
+ command(top);
++ return 0;
+ }
+
+ char hostname[100];
+
+-setpeer(argc, argv)
+- int argc;
+- char *argv[];
++int setpeer(int argc, char *argv[])
+ {
+ struct hostent *host;
+
+@@ -187,6 +194,7 @@ setpeer(argc, argv)
+ port = htons(port);
+ }
+ connected = 1;
++ return 0;
+ }
+
+ struct modes {
+@@ -201,8 +209,7 @@ struct modes {
+ { 0, 0 }
+ };
+
+-modecmd(argc, argv)
+- char *argv[];
++int modecmd(int argc, char *argv[])
+ {
+ register struct modes *p;
+ char *sep;
+@@ -234,18 +241,17 @@ modecmd(argc, argv)
+ return 0;
+ }
+
+-setbinary(argc, argv)
+-char *argv[];
+-{ setmode("octet");
++int setbinary(int argc, char *argv[])
++{
++ setmode("octet");
+ }
+
+-setascii(argc, argv)
+-char *argv[];
+-{ setmode("netascii");
+-}
++int setascii(int argc, char *argv[])
++{
++ setmode("netascii");
++ }
+
+-setmode(newmode)
+-char *newmode;
++void setmode(char *newmode)
+ {
+ strcpy(mode, newmode);
+ if (verbose)
+@@ -256,8 +262,7 @@ char *newmode;
+ * Send file(s).
+ */
+
+-put(argc, argv)
+- char *argv[];
++int put(int argc, char *argv[])
+ {
+ int fd;
+ register int n;
+@@ -286,8 +291,7 @@ put(argc, argv)
+ return 0;
+ }
+
+-putusage(s)
+- char *s;
++int putusage(char *s)
+ {
+ printf("usage: %s file [linksys pass] (you must be connected)\n", s);
+ return 0;
+@@ -296,8 +300,7 @@ putusage(s)
+ /*
+ * Receive file(s).
+ */
+-get(argc, argv)
+- char *argv[];
++int get(int argc, char *argv[])
+ {
+ int fd;
+ register int n;
+@@ -327,16 +330,15 @@ get(argc, argv)
+ return 0;
+ }
+
+-getusage(s)
+-char * s;
++int getusage(char *s)
+ {
+ printf("usage: %s file [linksys pass] (you must be connected)\n", s);
++ return 0;
+ }
+
+ int rexmtval = TIMEOUT;
+
+-setrexmt(argc, argv)
+- char *argv[];
++int setrexmt(int argc, char *argv[])
+ {
+ int t;
+
+@@ -357,12 +359,12 @@ setrexmt(argc, argv)
+ printf("%d: bad value\n", t);
+ else
+ rexmtval = t;
++ return 0;
+ }
+
+ int maxtimeout = 5 * TIMEOUT;
+
+-settimeout(argc, argv)
+- char *argv[];
++int settimeout(int argc, char *argv[])
+ {
+ int t;
+
+@@ -383,10 +385,10 @@ settimeout(argc, argv)
+ printf("%d: bad value\n", t);
+ else
+ maxtimeout = t;
++ return 0;
+ }
+
+-status(argc, argv)
+- char *argv[];
++int status(int argc, char *argv[])
+ {
+ if (connected)
+ printf("Connected to %s.\n", hostname);
+@@ -396,6 +398,7 @@ status(argc, argv)
+ verbose ? "on" : "off", trace ? "on" : "off");
+ printf("Rexmt-interval: %d seconds, Max-timeout: %d seconds\n",
+ rexmtval, maxtimeout);
++ return 0;
+ }
+
+ void intr(int sig)
+@@ -408,8 +411,7 @@ void intr(int sig)
+ /*
+ * Command parser.
+ */
+-command(top)
+- int top;
++int command(int top)
+ {
+ register struct cmd *c;
+
+@@ -438,11 +440,10 @@ command(top)
+ }
+ (*c->handler)(margc, margv);
+ }
++ return 0;
+ }
+
+-struct cmd *
+-getcmd(name)
+- register char *name;
++struct cmd *getcmd(register char *name)
+ {
+ register char *p, *q;
+ register struct cmd *c, *found;
+@@ -473,7 +474,7 @@ getcmd(name)
+ /*
+ * Slice a string up into argc/argv.
+ */
+-makeargv()
++void makeargv()
+ {
+ register char *cp;
+ register char **argp = margv;
+@@ -496,7 +497,7 @@ makeargv()
+ }
+
+ /*VARARGS*/
+-quit()
++int quit()
+ {
+ exit(0);
+ }
+@@ -504,9 +505,7 @@ quit()
+ /*
+ * Help command.
+ */
+-help(argc, argv)
+- int argc;
+- char *argv[];
++int help(int argc, char *argv[])
+ {
+ register struct cmd *c;
+
+@@ -527,24 +526,26 @@ help(argc, argv)
+ else
+ printf("%s\n", c->help);
+ }
++ return 0;
+ }
+
+ /*VARARGS*/
+-settrace()
++int settrace()
+ {
+ trace = !trace;
+ printf("Packet tracing %s.\n", trace ? "on" : "off");
++ return 0;
+ }
+
+ /*VARARGS*/
+-setverbose()
++int setverbose()
+ {
+ verbose = !verbose;
+ printf("Verbose mode %s.\n", verbose ? "on" : "off");
++ return 0;
+ }
+
+-setblocksize(argc, argv)
+- char *argv[];
++int setblocksize(int argc, char *argv[])
+ {
+ int t;
+
+@@ -565,8 +566,9 @@ setblocksize(argc, argv)
+ printf("%d: bad value\n", t);
+ else
+ segsize = t;
++ return 0;
+ }
+-banner() {
++int banner() {
+ printf("TJ Shelton\tredsand [at] redsand.net\n");
+ printf("Mike Lynn\tabaddon [at] 802.11ninja.net\n");
+ printf("Linksys TFTP Client for *BSD/Linux\tThe Firmware gets sexier\n");
+Following is to fix one last missing include on musl systems
+--- linksys-tftp-1.2.1.orig/main.c 2024-04-24 10:53:18.768850587 +0000
++++ linksys-tftp-1.2.1/main.c 2024-04-24 10:56:29.329427589 +0000
+@@ -44,6 +44,7 @@
+ #include <stdlib.h>
+ #include <string.h>
+ #include <unistd.h>
++#include <fcntl.h>
+ /* #include <sys/sendfile.h> */
+
+ /* routines from tftp.c */
diff --git a/net-ftp/linksys-tftp/linksys-tftp-1.2.1-r4.ebuild b/net-ftp/linksys-tftp/linksys-tftp-1.2.1-r4.ebuild
new file mode 100644
index 000000000000..7a669f8ed51f
--- /dev/null
+++ b/net-ftp/linksys-tftp/linksys-tftp-1.2.1-r4.ebuild
@@ -0,0 +1,31 @@
+# Copyright 1999-2024 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+inherit toolchain-funcs
+
+DESCRIPTION="TFTP client suitable for uploading to the Linksys WRT54G Wireless Router"
+HOMEPAGE="https://wiki.gentoo.org/wiki/No_homepage"
+SRC_URI="https://www.redsand.net/solutions/${P}.tar.bz2"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="~amd64 ~ppc ~riscv ~x86"
+
+PATCHES=(
+ "${FILESDIR}/${P}-r1-header.patch"
+ "${FILESDIR}/${P}-r1-Makefile.patch"
+ "${FILESDIR}/${P}-r1-fno-common.patch"
+ "${FILESDIR}/${P}-r1-clang.patch"
+ "${FILESDIR}/${P}-r4-c99-port.patch"
+)
+
+src_compile() {
+ emake CC="$(tc-getCC)"
+}
+
+src_install() {
+ dobin linksys-tftp
+ einstalldocs
+}