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