forked from mirrors/tftp-hpa-google
		
	- Better parsing of the "connect" command (tftp).
- Move missing header file stuff consistently into config.h. - Make "make -j" work correctly.
This commit is contained in:
		
							parent
							
								
									d2206bf9b9
								
							
						
					
					
						commit
						06bfb2bf4f
					
				
					 11 changed files with 146 additions and 57 deletions
				
			
		
							
								
								
									
										15
									
								
								CHANGES
									
										
									
									
									
								
							
							
						
						
									
										15
									
								
								CHANGES
									
										
									
									
									
								
							|  | @ -1,5 +1,20 @@ | ||||||
| $Id$ | $Id$ | ||||||
| 
 | 
 | ||||||
|  | Changes in 0.26: | ||||||
|  | 	Fix the configuration process so tftpd doesn't end up | ||||||
|  | 	depending on readline, which apparently could happen on some | ||||||
|  | 	platforms before. | ||||||
|  | 
 | ||||||
|  | 	Make parallel builds (make -j) work correctly. | ||||||
|  | 
 | ||||||
|  | 	Improve parsing of the "connect" command in the tftp client. | ||||||
|  | 
 | ||||||
|  | 	Add a -V option to both tftp and tftpd to print the version | ||||||
|  | 	number on stdout and immediately exit. | ||||||
|  | 
 | ||||||
|  | 	Add a -v option to tftp to start out in verbose mode. | ||||||
|  | 	 | ||||||
|  | 
 | ||||||
| Changes in 0.25: | Changes in 0.25: | ||||||
| 	Fixed Sorcerer's Apprentice bug in both the client and the | 	Fixed Sorcerer's Apprentice bug in both the client and the | ||||||
| 	server.  These bugs were inherited from the original BSD code. | 	server.  These bugs were inherited from the original BSD code. | ||||||
|  |  | ||||||
|  | @ -43,8 +43,9 @@ CFLAGS  = @CFLAGS@ -I$(SRCROOT) | ||||||
| # Link flags | # Link flags | ||||||
| LDFLAGS = @LDFLAGS@ | LDFLAGS = @LDFLAGS@ | ||||||
| 
 | 
 | ||||||
| # Libraries | # Libraries (client and server) | ||||||
| LIBS    = @LIBS@ | TFTP_LIBS  = @TFTP_LIBS@ | ||||||
|  | TFTPD_LIBS = @TFTPD_LIBS@ | ||||||
| 
 | 
 | ||||||
| # Additional library we need to build | # Additional library we need to build | ||||||
| LIBOBJS	= @LIBOBJS@ | LIBOBJS	= @LIBOBJS@ | ||||||
|  |  | ||||||
							
								
								
									
										11
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								Makefile
									
										
									
									
									
								
							|  | @ -3,10 +3,10 @@ | ||||||
| 
 | 
 | ||||||
| SUB =   lib tftp tftpd | SUB =   lib tftp tftpd | ||||||
| 
 | 
 | ||||||
| %.build: | %.build: MCONFIG acconfig.h version.h | ||||||
| 	$(MAKE) -C $(patsubst %.build, %, $@) | 	$(MAKE) -C $(patsubst %.build, %, $@) | ||||||
| 
 | 
 | ||||||
| %.install: | %.install: MCONFIG acconfig.h version.h | ||||||
| 	$(MAKE) -C $(patsubst %.install, %, $@) install | 	$(MAKE) -C $(patsubst %.install, %, $@) install | ||||||
| 
 | 
 | ||||||
| %.clean: | %.clean: | ||||||
|  | @ -17,9 +17,13 @@ SUB =   lib tftp tftpd | ||||||
| 
 | 
 | ||||||
| all:      MCONFIG $(patsubst %, %.build, $(SUB)) | all:      MCONFIG $(patsubst %, %.build, $(SUB)) | ||||||
| 
 | 
 | ||||||
|  | tftp.build: lib.build | ||||||
|  | tftpd.build: lib.build | ||||||
|  | 
 | ||||||
| install:  MCONFIG $(patsubst %, %.install, $(SUB)) | install:  MCONFIG $(patsubst %, %.install, $(SUB)) | ||||||
| 
 | 
 | ||||||
| clean:    $(patsubst %, %.clean, $(SUB)) | clean:    $(patsubst %, %.clean, $(SUB)) | ||||||
|  | 	rm -f version.h | ||||||
| 
 | 
 | ||||||
| distclean: $(patsubst %, %.distclean, $(SUB)) | distclean: $(patsubst %, %.distclean, $(SUB)) | ||||||
| 	rm -f MCONFIG config.status config.log acconfig.h *~ \#* | 	rm -f MCONFIG config.status config.log acconfig.h *~ \#* | ||||||
|  | @ -51,3 +55,6 @@ acconfig.h.in: configure.in aclocal.m4 | ||||||
| configure: configure.in aclocal.m4 | configure: configure.in aclocal.m4 | ||||||
| 	autoconf | 	autoconf | ||||||
| 	rm -f MCONFIG config.cache config.log acconfig.h | 	rm -f MCONFIG config.cache config.log acconfig.h | ||||||
|  | 
 | ||||||
|  | version.h: version | ||||||
|  | 	echo \#define VERSION \"tftp-hpa `cat version`\" > version.h | ||||||
|  |  | ||||||
							
								
								
									
										20
									
								
								config.h
									
										
									
									
									
								
							
							
						
						
									
										20
									
								
								config.h
									
										
									
									
									
								
							|  | @ -78,7 +78,6 @@ | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #include <setjmp.h> | #include <setjmp.h> | ||||||
| #include <netinet/in.h> |  | ||||||
| #include <sys/socket.h> | #include <sys/socket.h> | ||||||
| 
 | 
 | ||||||
| /* If we don't have intmax_t, try creating it */ | /* If we don't have intmax_t, try creating it */ | ||||||
|  | @ -172,7 +171,9 @@ typedef unsigned long u_long; | ||||||
| #endif | #endif | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| /* Sometimes IPPORT_TFTP isn't defined */ | /* netinet/in.h, and possible missing pieces */ | ||||||
|  | 
 | ||||||
|  | #include <netinet/in.h> | ||||||
| 
 | 
 | ||||||
| #ifndef HAVE_IPPORT_TFTP_DEFINITION | #ifndef HAVE_IPPORT_TFTP_DEFINITION | ||||||
| #ifndef IPPORT_TFTP | #ifndef IPPORT_TFTP | ||||||
|  | @ -180,4 +181,19 @@ typedef unsigned long u_long; | ||||||
| #endif | #endif | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | /* arpa/tftp.h, and possible missing pieces */ | ||||||
|  | 
 | ||||||
|  | #include <arpa/tftp.h> | ||||||
|  | 
 | ||||||
|  | #ifndef OACK | ||||||
|  | #define OACK 6 | ||||||
|  | #endif | ||||||
|  | #ifndef EOPTNEG | ||||||
|  | #define EOPTNEG 8 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /* tftp-hpa version */ | ||||||
|  | 
 | ||||||
|  | #include "version.h" | ||||||
|  | 
 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
							
								
								
									
										40
									
								
								configure.in
									
										
									
									
									
								
							
							
						
						
									
										40
									
								
								configure.in
									
										
									
									
									
								
							|  | @ -73,6 +73,23 @@ AC_CHECK_FUNCS(strtoull) | ||||||
| PA_MSGHDR_MSG_CONTROL | PA_MSGHDR_MSG_CONTROL | ||||||
| PA_STRUCT_IN_PKTINFO | PA_STRUCT_IN_PKTINFO | ||||||
| 
 | 
 | ||||||
|  | AH_TEMPLATE([HAVE_SIGSETJMP], | ||||||
|  | [Define if we have sigsetjmp, siglongjmp and sigjmp_buf.]) | ||||||
|  | PA_SIGSETJMP([AC_DEFINE(HAVE_SIGSETJMP)]) | ||||||
|  | 
 | ||||||
|  | LIBXTRA=false | ||||||
|  | AC_SEARCH_LIBS(xmalloc, iberty, , LIBXTRA=true LIBOBJS="$LIBOBJS xmalloc.o") | ||||||
|  | AC_SEARCH_LIBS(xstrdup, iberty, , LIBXTRA=true LIBOBJS="$LIBOBJS xstrdup.o") | ||||||
|  | AC_SEARCH_LIBS(bsd_signal, bsd, , LIBXTRA=true LIBOBJS="$LIBOBJS bsdsignal.o") | ||||||
|  | if $LIBXTRA; then | ||||||
|  | 	LIBS="../lib/libxtra.a $LIBS" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | dnl | ||||||
|  | dnl These libraries apply to the server only | ||||||
|  | dnl | ||||||
|  | 
 | ||||||
|  | common_libs="$LIBS" | ||||||
| 
 | 
 | ||||||
| AH_TEMPLATE([HAVE_IPPORT_TFTP_DEFINITION], | AH_TEMPLATE([HAVE_IPPORT_TFTP_DEFINITION], | ||||||
| [Define if netinet/in.h defines IPPORT_TFTP.]) | [Define if netinet/in.h defines IPPORT_TFTP.]) | ||||||
|  | @ -85,6 +102,7 @@ PA_WITH_BOOL(tcpwrappers, 1, | ||||||
| 	PA_HAVE_TCPWRAPPERS | 	PA_HAVE_TCPWRAPPERS | ||||||
| ],:) | ],:) | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| AH_TEMPLATE([WITH_REGEX], | AH_TEMPLATE([WITH_REGEX], | ||||||
| [Define if we are compiling with regex filename remapping.]) | [Define if we are compiling with regex filename remapping.]) | ||||||
| 
 | 
 | ||||||
|  | @ -101,6 +119,13 @@ PA_WITH_BOOL(remap, 1, | ||||||
| 	]) | 	]) | ||||||
| ],:) | ],:) | ||||||
| 
 | 
 | ||||||
|  | TFTPD_LIBS="$LIBS" | ||||||
|  | LIBS="$common_libs" | ||||||
|  | 
 | ||||||
|  | dnl | ||||||
|  | dnl These libraries apply to the client only | ||||||
|  | dnl | ||||||
|  | 
 | ||||||
| AH_TEMPLATE([WITH_READLINE], | AH_TEMPLATE([WITH_READLINE], | ||||||
| [Define if we are compiling with readline command-line editing.]) | [Define if we are compiling with readline command-line editing.]) | ||||||
| 
 | 
 | ||||||
|  | @ -119,18 +144,11 @@ PA_WITH_BOOL(readline, 1, | ||||||
| 	fi | 	fi | ||||||
| ],:) | ],:) | ||||||
| 
 | 
 | ||||||
| AH_TEMPLATE([HAVE_SIGSETJMP], | TFTP_LIBS="$LIBS" | ||||||
| [Define if we have sigsetjmp, siglongjmp and sigjmp_buf.]) | LIBS="$common_libs" | ||||||
| PA_SIGSETJMP([AC_DEFINE(HAVE_SIGSETJMP)]) |  | ||||||
| 
 |  | ||||||
| LIBXTRA=false |  | ||||||
| AC_SEARCH_LIBS(xmalloc, iberty, , LIBXTRA=true LIBOBJS="$LIBOBJS xmalloc.o") |  | ||||||
| AC_SEARCH_LIBS(xstrdup, iberty, , LIBXTRA=true LIBOBJS="$LIBOBJS xstrdup.o") |  | ||||||
| AC_SEARCH_LIBS(bsd_signal, bsd, , LIBXTRA=true LIBOBJS="$LIBOBJS bsdsignal.o") |  | ||||||
| if $LIBXTRA; then |  | ||||||
| 	LIBS="../lib/libxtra.a $LIBS" |  | ||||||
| fi |  | ||||||
| 
 | 
 | ||||||
|  | AC_SUBST(TFTP_LIBS) | ||||||
|  | AC_SUBST(TFTPD_LIBS) | ||||||
| AC_SUBST(LIBOBJS) | AC_SUBST(LIBOBJS) | ||||||
| AC_SUBST(TFTPDOBJS) | AC_SUBST(TFTPDOBJS) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -8,7 +8,7 @@ include ../MRULES | ||||||
| OBJS = tftp.o main.o tftpsubs.o | OBJS = tftp.o main.o tftpsubs.o | ||||||
| 
 | 
 | ||||||
| tftp: $(OBJS) | tftp: $(OBJS) | ||||||
| 	$(CC) $(LDFLAGS) $^ $(LIBS) -o $@ | 	$(CC) $(LDFLAGS) $^ $(TFTP_LIBS) -o $@ | ||||||
| 
 | 
 | ||||||
| $(OBJS): tftpsubs.h | $(OBJS): tftpsubs.h | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										64
									
								
								tftp/main.c
									
										
									
									
									
								
							
							
						
						
									
										64
									
								
								tftp/main.c
									
										
									
									
									
								
							|  | @ -81,7 +81,7 @@ static const char *rcsid UNUSED = | ||||||
| 
 | 
 | ||||||
| struct	sockaddr_in peeraddr; | struct	sockaddr_in peeraddr; | ||||||
| int	f; | int	f; | ||||||
| short   port; | u_short port; | ||||||
| int	trace; | int	trace; | ||||||
| int	verbose; | int	verbose; | ||||||
| int	connected; | int	connected; | ||||||
|  | @ -182,10 +182,37 @@ int | ||||||
| main(int argc, char *argv[]) | main(int argc, char *argv[]) | ||||||
| { | { | ||||||
| 	struct sockaddr_in s_in; | 	struct sockaddr_in s_in; | ||||||
|  | 	int c; | ||||||
|  | 	int pargc; | ||||||
|  | 	char **pargv; | ||||||
|  | 
 | ||||||
|  | 	while ((c = getopt(argc, argv, "Vv")) != -1) { | ||||||
|  | 	  switch (c) { | ||||||
|  | 	  case 'v': | ||||||
|  | 	    verbose = 1; | ||||||
|  | 	    break; | ||||||
|  | 	  case 'V': | ||||||
|  | 	    /* Print version to stdout and exit */ | ||||||
|  | 	    printf("%s\n", VERSION); | ||||||
|  | 	    exit(0); | ||||||
|  | 	  default: | ||||||
|  | 	    fprintf(stderr, "Usage: %s [-v] [host]\n", argv[0]); | ||||||
|  | 	    exit(EX_USAGE); | ||||||
|  | 	  } | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	pargc = argc - (optind-1); | ||||||
|  | 	pargv = argv + (optind-1); | ||||||
| 
 | 
 | ||||||
| 	sp = getservbyname("tftp", "udp"); | 	sp = getservbyname("tftp", "udp"); | ||||||
| 	if (sp == 0) { | 	if (sp == 0) { | ||||||
| 		fprintf(stderr, "tftp: udp/tftp: unknown service\n"); | 		/* Use canned values */ | ||||||
|  | 		fprintf(stderr, "tftp: tftp/udp: unknown service, faking it...\n"); | ||||||
|  | 		sp = xmalloc(sizeof(struct servent)); | ||||||
|  | 		sp->s_name    = (char *)"tftp"; | ||||||
|  | 		sp->s_aliases = NULL; | ||||||
|  | 		sp->s_port    = htons(IPPORT_TFTP); | ||||||
|  | 		sp->s_proto   = (char *)"udp"; | ||||||
| 		exit(1); | 		exit(1); | ||||||
| 	} | 	} | ||||||
| 	f = socket(AF_INET, SOCK_DGRAM, 0); | 	f = socket(AF_INET, SOCK_DGRAM, 0); | ||||||
|  | @ -201,10 +228,10 @@ main(int argc, char *argv[]) | ||||||
| 	} | 	} | ||||||
| 	strcpy(mode, "netascii"); | 	strcpy(mode, "netascii"); | ||||||
| 	bsd_signal(SIGINT, intr); | 	bsd_signal(SIGINT, intr); | ||||||
| 	if (argc > 1) { | 	if (pargc > 1) { | ||||||
| 		if (sigsetjmp(toplevel,1) != 0) | 		if (sigsetjmp(toplevel,1) != 0) | ||||||
| 			exit(0); | 			exit(0); | ||||||
| 		setpeer(argc, argv); | 		setpeer(pargc, pargv); | ||||||
| 	} | 	} | ||||||
| 	if (sigsetjmp(toplevel,1) != 0) | 	if (sigsetjmp(toplevel,1) != 0) | ||||||
| 		(void)putchar('\n'); | 		(void)putchar('\n'); | ||||||
|  | @ -269,10 +296,7 @@ setpeer(int argc, char *argv[]) | ||||||
| 		printf("usage: %s host-name [port]\n", argv[0]); | 		printf("usage: %s host-name [port]\n", argv[0]); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 	if (inet_aton(argv[1], &peeraddr.sin_addr) != 0) { | 
 | ||||||
| 		peeraddr.sin_family = AF_INET; |  | ||||||
| 		hostname = xstrdup(argv[1]); |  | ||||||
| 	} else { |  | ||||||
| 	host = gethostbyname(argv[1]); | 	host = gethostbyname(argv[1]); | ||||||
| 	if (host == 0) { | 	if (host == 0) { | ||||||
| 		connected = 0; | 		connected = 0; | ||||||
|  | @ -282,16 +306,30 @@ setpeer(int argc, char *argv[]) | ||||||
| 	peeraddr.sin_family = host->h_addrtype; | 	peeraddr.sin_family = host->h_addrtype; | ||||||
| 	bcopy(host->h_addr, &peeraddr.sin_addr, host->h_length); | 	bcopy(host->h_addr, &peeraddr.sin_addr, host->h_length); | ||||||
| 	hostname = xstrdup(host->h_name); | 	hostname = xstrdup(host->h_name); | ||||||
| 	} | 
 | ||||||
| 	port = sp->s_port; | 	port = sp->s_port; | ||||||
| 	if (argc == 3) { | 	if (argc == 3) { | ||||||
| 		port = atoi(argv[2]); | 		struct servent *usp; | ||||||
| 		if (port < 0) { | 		usp = getservbyname(argv[2], "udp"); | ||||||
|  | 		if ( usp ) { | ||||||
|  | 			port = usp->s_port; | ||||||
|  | 		} else { | ||||||
|  | 			unsigned long myport; | ||||||
|  | 			char *ep; | ||||||
|  | 			myport = strtoul(argv[2], &ep, 10); | ||||||
|  | 			if (*ep || myport > 65535UL) { | ||||||
| 				printf("%s: bad port number\n", argv[2]); | 				printf("%s: bad port number\n", argv[2]); | ||||||
| 				connected = 0; | 				connected = 0; | ||||||
| 				return; | 				return; | ||||||
| 			} | 			} | ||||||
| 		port = htons(port); | 			port = htons((u_short)myport); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (verbose) { | ||||||
|  | 		printf("Connected to %s (%s), port %u\n", | ||||||
|  | 		       hostname, inet_ntoa(peeraddr.sin_addr), | ||||||
|  | 		       (unsigned int)ntohs(port)); | ||||||
| 	} | 	} | ||||||
| 	connected = 1; | 	connected = 1; | ||||||
| } | } | ||||||
|  | @ -740,6 +778,8 @@ help(int argc, char *argv[]) | ||||||
| { | { | ||||||
| 	struct cmd *c; | 	struct cmd *c; | ||||||
| 
 | 
 | ||||||
|  | 	printf("%s\n", VERSION); | ||||||
|  | 
 | ||||||
| 	if (argc == 1) { | 	if (argc == 1) { | ||||||
| 		printf("Commands may be abbreviated.  Commands are:\n\n"); | 		printf("Commands may be abbreviated.  Commands are:\n\n"); | ||||||
| 		for (c = cmdtab; c->name; c++) | 		for (c = cmdtab; c->name; c++) | ||||||
|  |  | ||||||
|  | @ -74,13 +74,6 @@ extern  int     verbose; | ||||||
| extern  int     rexmtval; | extern  int     rexmtval; | ||||||
| extern  int     maxtimeout; | extern  int     maxtimeout; | ||||||
| 
 | 
 | ||||||
| #ifndef EOPTNEG |  | ||||||
| #define EOPTNEG	8 |  | ||||||
| #endif |  | ||||||
| #ifndef OACK |  | ||||||
| #define OACK	6 |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #define PKTSIZE    SEGSIZE+4 | #define PKTSIZE    SEGSIZE+4 | ||||||
| char    ackbuf[PKTSIZE]; | char    ackbuf[PKTSIZE]; | ||||||
| int	timeout; | int	timeout; | ||||||
|  |  | ||||||
|  | @ -8,7 +8,7 @@ include ../MRULES | ||||||
| OBJS = tftpd.o tftpsubs.o recvfrom.o misc.o $(TFTPDOBJS) | OBJS = tftpd.o tftpsubs.o recvfrom.o misc.o $(TFTPDOBJS) | ||||||
| 
 | 
 | ||||||
| tftpd: $(OBJS) | tftpd: $(OBJS) | ||||||
| 	$(CC) $(LDFLAGS) $^ $(LIBS) -o $@ | 	$(CC) $(LDFLAGS) $^ $(TFTPD_LIBS) -o $@ | ||||||
| 
 | 
 | ||||||
| tftpsubs.c:  | tftpsubs.c:  | ||||||
| 	ln -sf ../tftp/tftpsubs.c . | 	ln -sf ../tftp/tftpsubs.c . | ||||||
|  |  | ||||||
|  | @ -98,13 +98,6 @@ struct request_info wrap_request; | ||||||
| #define TRIES   4		/* Number of attempts to send each packet */ | #define TRIES   4		/* Number of attempts to send each packet */ | ||||||
| #define TIMEOUT_LIMIT (TRIES*(TRIES+1)/2) | #define TIMEOUT_LIMIT (TRIES*(TRIES+1)/2) | ||||||
| 
 | 
 | ||||||
| #ifndef OACK |  | ||||||
| #define OACK	6 |  | ||||||
| #endif |  | ||||||
| #ifndef EOPTNEG |  | ||||||
| #define EOPTNEG	8 |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| char   *__progname; | char   *__progname; | ||||||
| int	peer; | int	peer; | ||||||
| int	timeout    = TIMEOUT; | int	timeout    = TIMEOUT; | ||||||
|  | @ -221,7 +214,7 @@ main(int argc, char **argv) | ||||||
|    |    | ||||||
|   openlog(__progname, LOG_PID|LOG_NDELAY, LOG_DAEMON); |   openlog(__progname, LOG_PID|LOG_NDELAY, LOG_DAEMON); | ||||||
|    |    | ||||||
|   while ((c = getopt(argc, argv, "csvla:u:r:t:m:")) != -1) |   while ((c = getopt(argc, argv, "csvVla:u:r:t:m:")) != -1) | ||||||
|     switch (c) { |     switch (c) { | ||||||
|     case 'c': |     case 'c': | ||||||
|       cancreate = 1; |       cancreate = 1; | ||||||
|  | @ -265,6 +258,11 @@ main(int argc, char **argv) | ||||||
|     case 'v': |     case 'v': | ||||||
|       verbosity++; |       verbosity++; | ||||||
|       break; |       break; | ||||||
|  |     case 'V': | ||||||
|  |       /* Print version to stdout and exit */ | ||||||
|  |       printf("%s\n", VERSION); | ||||||
|  |       exit(0); | ||||||
|  |       break; | ||||||
|     default: |     default: | ||||||
|       usage(); |       usage(); | ||||||
|       break; |       break; | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								version
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								version
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | 0.26 | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 hpa
						hpa