From Christian Sievers: add support for TFTP option acknowledgements
(RFC 2347), and add an opening quotation mark to the error message
string.

Don't use the system's <arpa/tftp.h>, use our own.

Update the README to reflect the current practice for submitting
patches, and fix a spelling error.
diff --git a/CREDITS b/CREDITS
index f80ed4b..3394029 100644
--- a/CREDITS
+++ b/CREDITS
@@ -34,6 +34,7 @@
 	Charles M. Hannum		<mycroft@netbsd.org>
 	Chris Cogdon			<chris@cogdon.org>
 	Chris G. Demetriou		<cgd@netbsd.org>
+	Christian Sievers		<c_s@users.sourceforge.net>
 	Chris Jepeway			<jepeway@blasted-heath.com>
 	Chris Larson			<clarson@kergoth.com>
 	Craig Rodrigues			<rodrigc@mediaone.net>
diff --git a/FILES b/FILES
index eca4cd1..dd7a355 100644
--- a/FILES
+++ b/FILES
@@ -241,6 +241,7 @@
 tcpdump.c
 tcpdump-stdinc.h
 telnet.h
+tftp.h
 timed.h
 token.h
 udp.h
diff --git a/INSTALL b/INSTALL
index 8fb41cf..3982a57 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,4 +1,4 @@
-@(#) $Header: /tcpdump/master/tcpdump/Attic/INSTALL,v 1.69 2007-09-12 19:36:18 guy Exp $ (LBL)
+@(#) $Header: /tcpdump/master/tcpdump/Attic/INSTALL,v 1.70 2007-09-14 01:02:07 guy Exp $ (LBL)
 
 If you have not built libpcap, and your system does not have libpcap
 installed, install libpcap first.  Your system might provide a version
@@ -243,6 +243,7 @@
 tcpdump.1	- manual entry
 tcpdump.c	- main program
 telnet.h	- Telnet definitions
+tftp.h		- TFTP definitions
 timed.h		- BSD time daemon protocol definitions
 token.h		- Token Ring definitions
 udp.h		- UDP definitions
diff --git a/README b/README
index b166cb2..46710ba 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-@(#) $Header: /tcpdump/master/tcpdump/README,v 1.65 2004-10-12 02:01:59 guy Exp $ (LBL)
+@(#) $Header: /tcpdump/master/tcpdump/README,v 1.66 2007-09-14 01:02:07 guy Exp $ (LBL)
 
 TCPDUMP 3.9
 Now maintained by "The Tcpdump Group"
@@ -11,10 +11,11 @@
 	(password "anoncvs")
 	cvs -d :pserver:cvs.tcpdump.org:/tcpdump/master checkout tcpdump
 
-Version 3.9 of TCPDUMP can be retrived with the CVS tag "tcpdump_3_9rel1":
+Version 3.9 of TCPDUMP can be retrieved with the CVS tag "tcpdump_3_9rel1":
 	cvs -d :pserver:cvs.tcpdump.org:/tcpdump/master checkout -r tcpdump_3_9rel1 tcpdump
 
-Please send patches against the master copy to patches@tcpdump.org.
+Please submit patches against the master copy to the tcpdump project on
+sourceforge.net.
 
 formerly from 	Lawrence Berkeley National Laboratory
 		Network Research Group <tcpdump@ee.lbl.gov>
diff --git a/print-tftp.c b/print-tftp.c
index 3ab61bc..6baf82e 100644
--- a/print-tftp.c
+++ b/print-tftp.c
@@ -23,7 +23,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-tftp.c,v 1.37 2003-11-16 09:36:40 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-tftp.c,v 1.38 2007-09-14 01:02:07 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -35,7 +35,6 @@
 #ifdef SEGSIZE
 #undef SEGSIZE					/* SINIX sucks */
 #endif
-#include <arpa/tftp.h>
 
 #include <stdio.h>
 #include <string.h>
@@ -43,6 +42,7 @@
 #include "interface.h"
 #include "addrtoname.h"
 #include "extract.h"
+#include "tftp.h"
 
 /* op code to string mapping */
 static struct tok op2str[] = {
@@ -51,6 +51,7 @@
 	{ DATA,		"DATA" },	/* data packet */
 	{ ACK,		"ACK" },	/* acknowledgement */
 	{ ERROR,	"ERROR" },	/* error code */
+	{ OACK,		"OACK" },	/* option acknowledgement */
 	{ 0,		NULL }
 };
 
@@ -97,6 +98,7 @@
 
 	case RRQ:
 	case WRQ:
+	case OACK:
 		/*
 		 * XXX Not all arpa/tftp.h's specify th_stuff as any
 		 * array; use address of th_block instead
@@ -106,11 +108,15 @@
 #else
 		p = (u_char *)&tp->th_block;
 #endif
-		fputs(" \"", stdout);
+		putchar(' ');
+		/* Print filename or first option */
+		if (opcode != OACK)
+			putchar('"');
 		i = fn_print(p, snapend);
-		putchar('"');
+		if (opcode != OACK)
+			putchar('"');
 
-		/* Print the mode and any options */
+		/* Print the mode (RRQ and WRQ only) and any options */
 		while ((p = (const u_char *)strchr((const char *)p, '\0')) != NULL) {
 			if (length <= (u_int)(p - (const u_char *)&tp->th_block))
 				break;
@@ -134,7 +140,7 @@
 	case ERROR:
 		/* Print error code string */
 		TCHECK(tp->th_code);
-		printf(" %s ", tok2str(err2str, "tftp-err-#%d \"",
+		printf(" %s \"", tok2str(err2str, "tftp-err-#%d \"",
 				       EXTRACT_16BITS(&tp->th_code)));
 		/* Print error message string */
 		i = fn_print((const u_char *)tp->th_data, snapend);
diff --git a/tftp.h b/tftp.h
new file mode 100644
index 0000000..b591322
--- /dev/null
+++ b/tftp.h
@@ -0,0 +1,82 @@
+/* @(#) $Header: /tcpdump/master/tcpdump/tftp.h,v 1.1 2007-09-14 01:02:07 guy Exp $ (LBL) */
+/*
+ * Copyright (c) 1983, 1993
+ *	The Regents of the University of California.  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.
+ * 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. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
+ *
+ *	@(#)tftp.h	8.1 (Berkeley) 6/2/93
+ */
+
+#ifndef _TFTP_H_
+#define	_TFTP_H_
+
+/*
+ * Trivial File Transfer Protocol (IEN-133)
+ */
+#define	SEGSIZE		512		/* data segment size */
+
+/*
+ * Packet types.
+ */
+#define	RRQ	01			/* read request */
+#define	WRQ	02			/* write request */
+#define	DATA	03			/* data packet */
+#define	ACK	04			/* acknowledgement */
+#define	ERROR	05			/* error code */
+#define OACK	06			/* option acknowledgement */
+
+struct	tftphdr {
+	unsigned short	th_opcode;		/* packet type */
+	union {
+		unsigned short	tu_block;	/* block # */
+		unsigned short	tu_code;	/* error code */
+		char	tu_stuff[1];	/* request packet stuff */
+	} th_u;
+	char	th_data[1];		/* data or error string */
+};
+
+#define	th_block	th_u.tu_block
+#define	th_code		th_u.tu_code
+#define	th_stuff	th_u.tu_stuff
+#define	th_msg		th_data
+
+/*
+ * Error codes.
+ */
+#define	EUNDEF		0		/* not defined */
+#define	ENOTFOUND	1		/* file not found */
+#define	EACCESS		2		/* access violation */
+#define	ENOSPACE	3		/* disk full or allocation exceeded */
+#define	EBADOP		4		/* illegal TFTP operation */
+#define	EBADID		5		/* unknown transfer ID */
+#define	EEXISTS		6		/* file already exists */
+#define	ENOUSER		7		/* no such user */
+
+#endif /* !_TFTP_H_ */