194 lines
5.8 KiB
Diff
194 lines
5.8 KiB
Diff
--- origsrc/tftp-hpa-5.2/MCONFIG.in 2011-12-11 23:13:52.000000000 +0100
|
|
+++ src/tftp-hpa-5.2/MCONFIG.in 2013-08-01 11:12:04.990443758 +0200
|
|
@@ -21,6 +21,7 @@ OBJROOT = @OBJROOT@
|
|
# Prefixes
|
|
prefix = @prefix@
|
|
exec_prefix = @exec_prefix@
|
|
+datarootdir = @datarootdir@
|
|
|
|
# Directory for user binaries
|
|
BINDIR = @bindir@
|
|
@@ -51,7 +52,7 @@ INSTALL_DATA = @INSTALL_DATA@
|
|
|
|
# Compiler and compiler flags
|
|
CC = @CC@
|
|
-CFLAGS = @CFLAGS@ -I$(SRCROOT)
|
|
+CFLAGS = @CFLAGS@ -I$(OBJROOT) -I$(SRCROOT)/headers -I$(SRCROOT)
|
|
|
|
# Link flags
|
|
LDFLAGS = @LDFLAGS@
|
|
--- origsrc/tftp-hpa-5.2/configure.in 2011-12-11 23:13:52.000000000 +0100
|
|
+++ src/tftp-hpa-5.2/configure.in 2013-08-01 11:12:05.014443645 +0200
|
|
@@ -5,6 +5,7 @@ dnl
|
|
AC_PREREQ(2.61)
|
|
AC_INIT(MCONFIG.in)
|
|
AC_PREFIX_DEFAULT(/usr)
|
|
+AC_CANONICAL_HOST
|
|
|
|
AC_USE_SYSTEM_EXTENSIONS
|
|
AC_ISC_POSIX
|
|
@@ -159,6 +160,16 @@ OBJROOT=`pwd`
|
|
XTRA=false
|
|
PA_SEARCH_LIBS_AND_ADD(xmalloc, iberty)
|
|
PA_SEARCH_LIBS_AND_ADD(xstrdup, iberty)
|
|
+
|
|
+# Force using the "correct" getopt_long implementation on cygwin
|
|
+case $host in
|
|
+ *-*-cygwin*)
|
|
+ case "$LIBS" in
|
|
+ *-liberty* )
|
|
+ LIBS=`echo $LIBS | sed -e 's@-liberty@-lcygwin -liberty@g'` ;;
|
|
+ esac
|
|
+esac
|
|
+
|
|
PA_SEARCH_LIBS_AND_ADD(bsd_signal, bsd, bsdsignal)
|
|
PA_SEARCH_LIBS_AND_ADD(getopt_long, getopt, getopt_long)
|
|
PA_SEARCH_LIBS_AND_ADD(getaddrinfo, [nsl resolv])
|
|
--- origsrc/tftp-hpa-5.2/tftp-xinetd 2013-08-01 11:12:00.849463159 +0200
|
|
+++ src/tftp-hpa-5.2/tftp-xinetd 2013-08-01 11:12:05.036443542 +0200
|
|
@@ -8,9 +8,9 @@ service tftp
|
|
socket_type = dgram
|
|
protocol = udp
|
|
wait = yes
|
|
- user = root
|
|
+ user = cyg_server
|
|
server = /usr/sbin/tftpd
|
|
- server_args = -s /tftpboot
|
|
+ server_args = -c -p -u tftpd -U 022 -s /var/lib/tftpboot
|
|
disable = yes
|
|
per_source = 11
|
|
cps = 100 2
|
|
--- origsrc/tftp-hpa-5.2/tftpd/recvfrom.c 2013-08-01 11:12:01.522460006 +0200
|
|
+++ src/tftp-hpa-5.2/tftpd/recvfrom.c 2013-08-01 11:12:05.050443477 +0200
|
|
@@ -222,7 +222,10 @@ myrecvfrom(int s, void *buf, int len, un
|
|
|
|
#ifdef HAVE_STRUCT_IN6_PKTINFO
|
|
if (cmptr->cmsg_level == IPPROTO_IPV6 &&
|
|
- (cmptr->cmsg_type == IPV6_RECVPKTINFO ||
|
|
+ (
|
|
+#ifdef IPV6_RECVPKTINFO
|
|
+ cmptr->cmsg_type == IPV6_RECVPKTINFO ||
|
|
+#endif
|
|
cmptr->cmsg_type == IPV6_PKTINFO)) {
|
|
memcpy(&pktinfo6, CMSG_DATA(cmptr),
|
|
sizeof(struct in6_pktinfo));
|
|
--- origsrc/tftp-hpa-5.2/tftpd/tftpd.c 2013-08-01 11:12:02.189456881 +0200
|
|
+++ src/tftp-hpa-5.2/tftpd/tftpd.c 2013-08-01 11:12:05.073443369 +0200
|
|
@@ -48,6 +48,7 @@
|
|
#include <pwd.h>
|
|
#include <limits.h>
|
|
#include <syslog.h>
|
|
+#include <getopt.h>
|
|
|
|
#include "common/tftpsubs.h"
|
|
#include "recvfrom.h"
|
|
@@ -60,8 +61,13 @@
|
|
#ifdef HAVE_TCPWRAPPERS
|
|
#include <tcpd.h>
|
|
|
|
+#if defined(__CYGWIN__)
|
|
+extern int deny_severity; /* set value in main() */
|
|
+extern int allow_severity; /* set value in main() */
|
|
+#else
|
|
int deny_severity = LOG_WARNING;
|
|
int allow_severity = -1; /* Don't log at all */
|
|
+#endif
|
|
|
|
static struct request_info wrap_request;
|
|
#endif
|
|
@@ -76,6 +82,11 @@ static int ai_fam = AF_INET;
|
|
#define TRIES 6 /* Number of attempts to send each packet */
|
|
#define TIMEOUT_LIMIT ((1 << TRIES)-1)
|
|
|
|
+#if defined(__CYGWIN__)
|
|
+/* from libiberty */
|
|
+const char * lbasename (const char *);
|
|
+#endif
|
|
+
|
|
const char *__progname;
|
|
static int peer;
|
|
static unsigned long timeout = TIMEOUT; /* Current timeout value */
|
|
@@ -376,7 +387,11 @@ int main(int argc, char **argv)
|
|
int c;
|
|
int setrv;
|
|
int waittime = 900; /* Default time to wait for a connect */
|
|
+#ifdef __CYGWIN__
|
|
+ const char *user = "tftpd"; /* Default user */
|
|
+#else
|
|
const char *user = "nobody"; /* Default user */
|
|
+#endif /* __CYGWIN__ */
|
|
char *p, *ep;
|
|
#ifdef WITH_REGEX
|
|
char *rewrite_file = NULL;
|
|
@@ -384,10 +399,20 @@ int main(int argc, char **argv)
|
|
const char *pidfile = NULL;
|
|
u_short tp_opcode;
|
|
|
|
+#if defined(HAVE_TCPWRAPPERS) && defined(__CYGWIN__)
|
|
+ allow_severity = -1; /* Don't log at all */
|
|
+ deny_severity = LOG_WARNING;
|
|
+#endif
|
|
/* basename() is way too much of a pain from a portability standpoint */
|
|
|
|
+#if !defined(__CYGWIN__)
|
|
p = strrchr(argv[0], '/');
|
|
__progname = (p && p[1]) ? p + 1 : argv[0];
|
|
+#else
|
|
+ /* maybe so, but (a) it's already in libiberty and (b) it knows how to */
|
|
+ /* handle win32 pathnames, which might be important on cygwin. */
|
|
+ __progname = lbasename (argv[0]);
|
|
+#endif
|
|
|
|
openlog(__progname, LOG_PID | LOG_NDELAY, LOG_DAEMON);
|
|
|
|
@@ -534,11 +559,36 @@ int main(int argc, char **argv)
|
|
}
|
|
}
|
|
|
|
+#ifdef __CYGWIN__
|
|
+ /* On cygwin, inetd and xinetd convention is that when requesting
|
|
+ * a user named "root" (which doesn't exist on a typical Windows
|
|
+ * system), the daemon should simply run as "the current user".
|
|
+ */
|
|
+ if (strcmp (user, "root") == 0) {
|
|
+ pw = getpwuid (getuid ());
|
|
+ if (!pw) {
|
|
+ syslog(LOG_ERR, "error obtaining information for current user: %m");
|
|
+ exit(EX_NOUSER);
|
|
+ }
|
|
+ if (pw->pw_name && *(pw->pw_name)) {
|
|
+ user = xstrdup (pw->pw_name);
|
|
+ }
|
|
+ else {
|
|
+ syslog(LOG_ERR, "error obtaining name of current user");
|
|
+ exit(EX_NOUSER);
|
|
+ }
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+#endif /* __CYGWIN__ */
|
|
pw = getpwnam(user);
|
|
if (!pw) {
|
|
syslog(LOG_ERR, "no user %s: %m", user);
|
|
exit(EX_NOUSER);
|
|
}
|
|
+#ifdef __CYGWIN__
|
|
+ }
|
|
+#endif /* __CYGWIN__ */
|
|
|
|
#ifdef WITH_REGEX
|
|
if (rewrite_file)
|
|
@@ -1016,7 +1066,12 @@ int main(int argc, char **argv)
|
|
tp = (struct tftphdr *)buf;
|
|
tp_opcode = ntohs(tp->th_opcode);
|
|
if (tp_opcode == RRQ || tp_opcode == WRQ)
|
|
+ {
|
|
+ syslog(LOG_INFO, "uid=%d: handling transfer: %s",
|
|
+ getuid(),
|
|
+ (tp_opcode == RRQ ? "server->client" : "client->server" ));
|
|
tftp(tp, n);
|
|
+ }
|
|
exit(0);
|
|
}
|
|
|