Hello, I have developed a solution implementing full IPv6-support for bsd-finger-0.17. It is attached in the form of an NMUdiff against the latest package bsd-finger_0.17-13. Best regards, -- Mats Erik Andersson, fil. dr Abbonerar på: debian-mentors, debian-devel-games, debian-perl, debian-ipv6
diff -u bsd-finger-0.17/debian/changelog bsd-finger-0.17/debian/changelog --- bsd-finger-0.17/debian/changelog +++ bsd-finger-0.17/debian/changelog @@ -1,3 +1,13 @@ +bsd-finger (0.17-13.1) unstable; urgency=low + + * Non-maintainer upload. + * Implement IPv6-support. + + debian/patches/10-fingerd-ipv6.patch: New file. + + debian/patches/20-finger-ipv6.patch: New file. + * [lintian] New file debian/README.source, conditioned on Quilt. + + -- Mats Erik Andersson <mats.andersson@gisladisker.se> Sat, 06 Feb 2010 02:11:58 +0100 + bsd-finger (0.17-13) unstable; urgency=low * Priority is optional diff -u bsd-finger-0.17/debian/patches/series bsd-finger-0.17/debian/patches/series --- bsd-finger-0.17/debian/patches/series +++ bsd-finger-0.17/debian/patches/series @@ -2,0 +3,2 @@ +10-fingerd-ipv6.patch +20-finger-ipv6.patch only in patch2: unchanged: --- bsd-finger-0.17.orig/debian/README.source +++ bsd-finger-0.17/debian/README.source @@ -0,0 +1,6 @@ +This package uses quilt to manage all modifications to the upstream +source. Changes are stored in the source package as diffs in +debian/patches and applied during the build. + +See /usr/share/doc/quilt/README.source for a detailed explanation. + only in patch2: unchanged: --- bsd-finger-0.17.orig/debian/patches/10-fingerd-ipv6.patch +++ bsd-finger-0.17/debian/patches/10-fingerd-ipv6.patch @@ -0,0 +1,24 @@ +Description: Implement IPv6 capacity for the server Fingerd. +Author: Mats Erik Andersson <debian@gisladisker.se> +Forwarded: no +Last-Update: 2010-02-06 +--- bsd-finger-0.17/fingerd/fingerd.c.debian ++++ bsd-finger-0.17/fingerd/fingerd.c +@@ -112,7 +112,7 @@ main(int argc, char *argv[]) + int k, nusers; + char *s, *t; + const char *fingerpath = NULL; +- struct sockaddr_in sn; ++ struct sockaddr_storage sn; + socklen_t sval = sizeof(sn); + + +@@ -182,7 +182,7 @@ main(int argc, char *argv[]) + } + + if (welcome) { +- char buf[256]; ++ char buf[256] = ""; + struct hostent *hp; + struct utsname utsname; + only in patch2: unchanged: --- bsd-finger-0.17.orig/debian/patches/20-finger-ipv6.patch +++ bsd-finger-0.17/debian/patches/20-finger-ipv6.patch @@ -0,0 +1,104 @@ +Description: Implement IPv6 capability for the client Finger. +Author: Mats Erik Andersson <debian@gisladisker.se> +Forwarded: no +Last-Updated: 2010-02-06 +--- bsd-finger-0.17/finger/finger.c.debian ++++ bsd-finger-0.17/finger/finger.c +@@ -93,7 +93,7 @@ + int main(int argc, char *argv[]) { + int ch; + int err = 0; +- struct sockaddr_in sin; ++ struct sockaddr_storage sin; + socklen_t slen = sizeof(sin); + + while ((ch = getopt(argc, argv, "lmps")) != EOF) { +@@ -137,6 +137,8 @@ int main(int argc, char *argv[]) { + * Also check stdin for nofinger processing, because of older + * fingerds that make stdout a pipe for CRLF handling. + */ ++ slen = sizeof(slen); /* For safety: sockaddr_in and sockaddr_in6 */ ++ + if (getsockname(STDIN_FILENO, (struct sockaddr *)&sin, &slen)==0) { + enable_nofinger = 1; + } +--- bsd-finger-0.17/finger/net.c.debian ++++ bsd-finger-0.17/finger/net.c +@@ -53,13 +53,12 @@ + + int netfinger(const char *name) { + register FILE *fp; +- struct in_addr defaddr; + register int c, sawret, ateol; +- struct hostent *hp, def; ++ struct addrinfo hints, *result; + struct servent *sp; +- struct sockaddr_in sn; +- int s; +- char *alist[1], *host; ++ struct sockaddr_storage sn; ++ int s, status; ++ char *host; + + host = strrchr(name, '@'); + if (!host) return 1; +@@ -72,36 +71,36 @@ int netfinger(const char *name) { + eprintf("finger: tcp/finger: unknown service\n"); + return 1; + } +- sn.sin_port = sp->s_port; +- +- hp = gethostbyname(host); +- if (!hp) { +- if (!inet_aton(host, &defaddr)) { +- eprintf("finger: unknown host: %s\n", host); +- return 1; +- } +- def.h_name = host; +- def.h_addr_list = alist; +- def.h_addr = (char *)&defaddr; +- def.h_length = sizeof(struct in_addr); +- def.h_addrtype = AF_INET; +- def.h_aliases = 0; +- hp = &def; +- } +- sn.sin_family = hp->h_addrtype; +- if (hp->h_length > (int)sizeof(sn.sin_addr)) { +- hp->h_length = sizeof(sn.sin_addr); ++ memset(&hints, 0, sizeof(hints)); ++ hints.ai_flags = AI_CANONNAME | AI_ADDRCONFIG; ++ hints.ai_family = AF_UNSPEC; ++ hints.ai_socktype = SOCK_STREAM; ++ hints.ai_protocol = IPPROTO_TCP; ++ ++ status = getaddrinfo(host, "finger", &hints, &result); ++ if (status != 0) { ++ eprintf("finger: unknown host: %s\n", host); ++ eprintf("getaddrinfo: %s\n", gai_strerror(status)); ++ return 1; + } +- memcpy(&sn.sin_addr, hp->h_addr, hp->h_length); + +- if ((s = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0) { ++ /* Assemble the gained information. */ ++ memcpy( &sn, result->ai_addr, result->ai_addrlen); ++ ++ if ((s = socket(sn.ss_family, SOCK_STREAM, 0)) < 0) { + eprintf("finger: socket: %s\n", strerror(errno)); + return 1; + } + + /* print hostname before connecting, in case it takes a while */ +- xprintf("[%s]\n", hp->h_name); +- if (connect(s, (struct sockaddr *)&sn, sizeof(sn)) < 0) { ++ xprintf("[%s]\n", result->ai_canonname); ++ freeaddrinfo(result); ++ ++ if (connect(s, (struct sockaddr *)&sn, ++ (sn.ss_family == AF_INET) ++ ? sizeof(struct sockaddr_in) ++ : sizeof(struct sockaddr_in6) ) ++ < 0) { + eprintf("finger: connect: %s\n", strerror(errno)); + close(s); + return 1;
Attachment:
signature.asc
Description: Digital signature