atftp: create recipe.

This commit is contained in:
Augustin Cavalier
2015-02-27 02:14:09 -05:00
parent 5b9538a97e
commit 69baca2204
2 changed files with 309 additions and 0 deletions

View File

@@ -0,0 +1,55 @@
SUMMARY="Advanced tftp server and client"
DESCRIPTION="atftp is a client/server implementation of the TFTP protocol \
that implements RFCs 1350, 2090, 2347, 2348, and 2349. The server is \
multi-threaded and the client presents a friendly interface using libreadline."
HOMEPAGE="http://sourceforge.net/projects/atftp/"
SRC_URI="http://sourceforge.net/projects/atftp/files/atftp-$portVersion.tar.gz/download"
SRC_FILENAME="atfp-$portVersion.tar.gz"
CHECKSUM_SHA256="ae4c6f09cadb8d2150c3ce32d88f19036a54e8211f22d723e97864bb5e18f92d"
REVISION="1"
LICENSE="GNU GPL v2"
COPYRIGHT="2000-2012 Jean-Pierre Lefebvre & Remi Lefebvre"
ARCHITECTURES="x86_gcc2 ?x86 ?x86_64"
PATCHES="atftp-$portVersion.patchset"
PROVIDES="
atftp = $portVersion
cmd:atftp = $portVersion
cmd:atftpd = $portVersion
cmd:in.tftpd = $portVersion
"
REQUIRES="
haiku
lib:libreadline
lib:libncurses
"
BUILD_REQUIRES="
haiku_devel
devel:libreadline
devel:libncurses
"
BUILD_PREREQUIRES="
cmd:awk
cmd:gcc
cmd:make
"
PATCH()
{
sed -i "s/-lpthread/-lroot/g" configure
}
BUILD()
{
runConfigure ./configure
sed -i "s/LIBS =/LIBS = -lnetwork -lbsd/" Makefile
make $jobArgs
}
INSTALL()
{
make install
}

View File

@@ -0,0 +1,254 @@
From a0ca8184a43966f1b82862ce7aa7caaa3cfb176e Mon Sep 17 00:00:00 2001
From: Augustin Cavalier <waddlesplash@gmail.com>
Date: Fri, 27 Feb 2015 01:14:25 -0500
Subject: [PATCH] Merging Axel's patches from trunk.
---
argz.h | 6 +++++-
logger.c | 1 -
tftp_def.c | 7 +++----
tftp_io.c | 13 +++++++++++--
tftpd.c | 6 +++++-
5 files changed, 24 insertions(+), 9 deletions(-)
diff --git a/argz.h b/argz.h
index 582be55..f1ded53 100644
--- a/argz.h
+++ b/argz.h
@@ -38,7 +38,7 @@
#ifndef _ARGZ_H
#define _ARGZ_H 1
-#include <features.h>
+#include <sys/cdefs.h>
#define __need_error_t
#include <errno.h>
@@ -52,6 +52,10 @@
typedef int error_t;
#endif
+#define __THROW
+#define __restrict
+#define __attribute_pure__
+#define __BEGIN_DECLS
__BEGIN_DECLS
diff --git a/logger.c b/logger.c
index 2ef1ba3..40d0707 100644
--- a/logger.c
+++ b/logger.c
@@ -20,7 +20,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
-#include <sys/stat.h>
#include <fcntl.h>
#include <stdarg.h>
#include <string.h>
diff --git a/tftp_def.c b/tftp_def.c
index 96abdc5..9fcbf36 100644
--- a/tftp_def.c
+++ b/tftp_def.c
@@ -159,20 +159,19 @@ int Gethostbyname(char *addr, struct hostent *host)
struct hostent *hp;
char *tmpbuf;
size_t tmpbuflen;
- int res;
int herr;
-
+
tmpbuflen = 1024;
if ((tmpbuf = (char *)malloc(tmpbuflen)) == NULL)
return ERR;
- res = gethostbyname_r(addr, host, tmpbuf, tmpbuflen, &hp, &herr);
+ hp = gethostbyname_r(addr, host, tmpbuf, tmpbuflen, &herr);
free(tmpbuf);
/* Check for errors. */
- if (res != 0)
+ if (hp == NULL)
{
logger(LOG_ERR, "%s: %d: gethostbyname_r: %s",
__FILE__, __LINE__, strerror(herr));
diff --git a/tftp_io.c b/tftp_io.c
index 605a9c2..f84a8b9 100644
--- a/tftp_io.c
+++ b/tftp_io.c
@@ -217,8 +217,6 @@ int tftp_get_packet(int sock1, int sock2, int *sock, struct sockaddr_storage *sa
struct msghdr msg; /* used to get client's packet info */
struct cmsghdr *cmsg;
- struct in_pktinfo *pktinfo4;
- struct in6_pktinfo *pktinfo6;
struct iovec iov;
char cbuf[1024];
@@ -288,10 +286,12 @@ int tftp_get_packet(int sock1, int sock2, int *sock, struct sockaddr_storage *sa
cmsg != NULL && cmsg->cmsg_len >= sizeof(*cmsg);
cmsg = CMSG_NXTHDR(&msg, cmsg))
{
+#ifndef __HAIKU__
#if defined(SOL_IP) && defined(IP_PKTINFO)
if (cmsg->cmsg_level == SOL_IP
&& cmsg->cmsg_type == IP_PKTINFO)
{
+ struct in_pktinfo *pktinfo4;
pktinfo4 = (struct in_pktinfo *)CMSG_DATA(cmsg);
sa_to->ss_family = AF_INET;
((struct sockaddr_in *)sa_to)->sin_addr =
@@ -302,12 +302,21 @@ int tftp_get_packet(int sock1, int sock2, int *sock, struct sockaddr_storage *sa
if (cmsg->cmsg_level == SOL_IPV6
&& cmsg->cmsg_type == IPV6_PKTINFO)
{
+ struct in6_pktinfo *pktinfo6;
pktinfo6 = (struct in6_pktinfo *)CMSG_DATA(cmsg);
sa_to->ss_family = AF_INET6;
((struct sockaddr_in6 *)sa_to)->sin6_addr =
pktinfo6->ipi6_addr;
}
#endif
+#else // !__HAIKU__
+ if (cmsg->cmsg_level == IPPROTO_IP
+ && cmsg->cmsg_type == IP_RECVDSTADDR)
+ {
+ struct in_addr *addr = (struct in_addr *)CMSG_DATA(cmsg);
+ ((struct sockaddr_in *)sa_to)->sin_addr = *addr;
+ }
+#endif
break;
}
}
diff --git a/tftpd.c b/tftpd.c
index b9822c4..8611a6f 100644
--- a/tftpd.c
+++ b/tftpd.c
@@ -334,9 +334,13 @@ int main(int argc, char **argv)
open_logger("atftpd", log_file, logging_level);
}
-#if defined(SOL_IP) && defined(IP_PKTINFO)
+#if defined(SOL_IP) && defined(IP_PKTINFO) || defined(__HAIKU__)
/* We need to retieve some information from incomming packets */
+#ifndef __HAIKU__
if (setsockopt(0, SOL_IP, IP_PKTINFO, &one, sizeof(one)) != 0)
+#else
+ if (setsockopt(0, IPPROTO_IP, IP_RECVDSTADDR, &one, sizeof(one)) != 0)
+#endif
{
logger(LOG_WARNING, "Failed to set socket option: %s", strerror(errno));
}
--
2.2.2
From fbddc427e3eb9259093c5d7e392b1dd40a615d69 Mon Sep 17 00:00:00 2001
From: Augustin Cavalier <waddlesplash@gmail.com>
Date: Fri, 27 Feb 2015 01:26:36 -0500
Subject: [PATCH] Disable IPv6.
---
tftp_file.c | 4 ++++
tftp_mtftp.c | 4 ++++
tftpd_file.c | 2 ++
tftpd_mtftp.c | 2 ++
4 files changed, 12 insertions(+)
diff --git a/tftp_file.c b/tftp_file.c
index 27ae4d0..6dcbcac 100644
--- a/tftp_file.c
+++ b/tftp_file.c
@@ -505,10 +505,12 @@ int tftp_receive_file(struct client_data *data)
err = setsockopt(mcast_sockfd, IPPROTO_IP,
IP_ADD_MEMBERSHIP,
&mreq.v4, sizeof(mreq.v4));
+#ifdef USE_IPV6
else
err = setsockopt(mcast_sockfd, IPPROTO_IPV6,
IPV6_ADD_MEMBERSHIP,
&mreq.v6, sizeof(mreq.v6));
+#endif
if (err < 0)
{
perror("setsockopt");
@@ -579,10 +581,12 @@ int tftp_receive_file(struct client_data *data)
err = setsockopt(mcast_sockfd, IPPROTO_IP,
IP_DROP_MEMBERSHIP,
&mreq.v4, sizeof(mreq.v4));
+#ifdef USE_IPV6
else
err = setsockopt(mcast_sockfd, IPPROTO_IPV6,
IPV6_DROP_MEMBERSHIP,
&mreq.v6, sizeof(mreq.v6));
+#endif
if (err < 0)
{
perror("setsockopt");
diff --git a/tftp_mtftp.c b/tftp_mtftp.c
index edc739c..74a5bf3 100644
--- a/tftp_mtftp.c
+++ b/tftp_mtftp.c
@@ -214,9 +214,11 @@ int tftp_mtftp_receive_file(struct client_data *data)
if (sa_mcast_group.ss_family == AF_INET)
err = setsockopt(mcast_sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
&mreq.v4, sizeof(mreq.v4));
+#ifdef USE_IPV6
else
err = setsockopt(mcast_sockfd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP,
&mreq.v6, sizeof(mreq.v6));
+#endif
if (err < 0)
{
perror("atftp: setsockopt");
@@ -504,10 +506,12 @@ int tftp_mtftp_receive_file(struct client_data *data)
err = setsockopt(mcast_sockfd, IPPROTO_IP,
IP_DROP_MEMBERSHIP,
&mreq.v4, sizeof(mreq.v4));
+#ifdef USE_IPV6
else
err = setsockopt(mcast_sockfd, IPPROTO_IPV6,
IPV6_DROP_MEMBERSHIP,
&mreq.v6, sizeof(mreq.v6));
+#endif
if (err < 0)
{
perror("setsockopt");
diff --git a/tftpd_file.c b/tftpd_file.c
index da1d6c9..075a29b 100644
--- a/tftpd_file.c
+++ b/tftpd_file.c
@@ -665,9 +665,11 @@ int tftpd_send_file(struct thread_data *data)
if (data->sa_mcast.ss_family == AF_INET)
setsockopt(data->sockfd, IPPROTO_IP, IP_MULTICAST_TTL,
&data->mcast_ttl, sizeof(data->mcast_ttl));
+#ifdef USE_IPV6
else
setsockopt(data->sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
&data->mcast_ttl, sizeof(data->mcast_ttl));
+#endif
/* set options data for OACK */
opt_set_multicast(data->tftp_options, data->mc_addr,
diff --git a/tftpd_mtftp.c b/tftpd_mtftp.c
index f69f9b0..36f9562 100644
--- a/tftpd_mtftp.c
+++ b/tftpd_mtftp.c
@@ -475,9 +475,11 @@ void *tftpd_mtftp_server(void *arg)
if (thread->sa_mcast.ss_family == AF_INET)
setsockopt(thread->sockfd, IPPROTO_IP, IP_MULTICAST_TTL,
&data->mcast_ttl, sizeof(data->mcast_ttl));
+#ifdef USE_IPV6
else
setsockopt(thread->sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
&data->mcast_ttl, sizeof(data->mcast_ttl));
+#endif
/* give server thread access to mtftp options */
thread->mtftp_data = data;
--
2.2.2