MSYS2-packages/tftp-hpa/tftp-5.2-1.src.patch
2014-12-12 13:58:30 +03:00

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);
}