All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bernard Pidoux <bernard.pidoux@upmc.fr>
To: Thomas Osterried <thomas@x-berg.in-berlin.de>
Cc: linux-hams@vger.kernel.org,
	Ralf Baechle DL5RB <ralf@linux-mips.org>,
	ax25@x-berg.in-berlin.de
Subject: Re: [PATCH] ax25ipd : added provision for dynamic dns hosts
Date: Fri, 06 Nov 2009 23:43:44 +0100	[thread overview]
Message-ID: <4AF4A6A0.9090707@upmc.fr> (raw)
In-Reply-To: <4AF03451.9030505@free.fr>

[-- Attachment #1: Type: text/plain, Size: 1124 bytes --]

Hi All,

I resend the complete ax25ipd patch, taking into account Thomas remarks
about fixed array values.
However sizeof() was not appropriate and I put strnlen() instead. 

73 de Bernard, f6bvp



Pidoux wrote :
> Hi Thomas,
> 
> You are absolutely right.
> There was a part of the code missing in io.c patch.
> I have just sent a patch including the call to update_dns().
> 
> I agree with you about the use of sizeof() instead of a fixed value.
> 
> I removed exit() when the progam detects an UDP failure for it aborts
> unecessarily ax25ipd daemon.
> 
> UDP socket could not be set when remote station is not on line at the time
> ax25ipd tries to resolve a dynamic IP address.
> This is usually corrected by a later call to update_dns().
> 
> 73 de Bernard, f6bvp
> 
> 
> 
> Thomas Osterried wrote :
>> Hello Bernard,
>>
>> On 2009-10-23 15:06:52 +0200, Bernard Pidoux <bernard.pidoux@upmc.fr>
>> wrote in <4AE1AA6C.9040500@upmc.fr>:
...
>>
>> You're right. I admit I was not very happy about the code. I remember I
>> tried to minimize unnecessary DNS requests, but I did not like my 
>> solution
>> neither.
>>


 

[-- Attachment #2: ax25ipd-0.0.8-rc2.new.patch --]
[-- Type: text/plain, Size: 7043 bytes --]

diff -ruN ax25-apps-0.0.8-rc2/ax25ipd/ax25ipd.h ax25-apps-0.0.8-rc2-new/ax25ipd/ax25ipd.h
--- ax25-apps-0.0.8-rc2/ax25ipd/ax25ipd.h	2009-06-14 10:11:48.000000000 +0200
+++ ax25-apps-0.0.8-rc2-new/ax25ipd/ax25ipd.h	2009-11-03 15:31:33.178816102 +0100
@@ -25,6 +25,10 @@
  * Terry Dawson, VK2KTJ, September 2001.
  */
 
+/*
+* added provision for dynamic dns hosts
+  Steve Fraser vk5asf, June 2005
+*/
 /* Define the current version number
  *
  * The first digit represents the major release (0 is a prototype release)
@@ -133,12 +137,13 @@
 
 /* routing.c */
 void route_init(void);
-void route_add(unsigned char *, unsigned char *, int, unsigned int);
+void route_add(unsigned char *, unsigned char *, unsigned char *, int, unsigned int);
 void bcast_add(unsigned char *);
 unsigned char *call_to_ip(unsigned char *);
 int is_call_bcast(unsigned char *);
 void send_broadcast(unsigned char *, int);
 void dump_routes(void);
+void update_dns(void);
 
 /* config.c */
 void config_init(void);
diff -ruN ax25-apps-0.0.8-rc2/ax25ipd/config.c ax25-apps-0.0.8-rc2-new/ax25ipd/config.c
--- ax25-apps-0.0.8-rc2/ax25ipd/config.c	2009-06-14 10:07:11.000000000 +0200
+++ ax25-apps-0.0.8-rc2-new/ax25ipd/config.c	2009-11-06 23:28:00.062795762 +0100
@@ -154,7 +154,7 @@
 int parse_line(char *buf)
 {
 	char *p, *q;
-	unsigned char tcall[7], tip[4];
+	unsigned char tcall[7], tip[4], thost [256];
 	struct hostent *he;
 	int i, j, uport;
 	unsigned int flags;
@@ -212,8 +212,7 @@
 		q = strtok(NULL, " \t\n\r");
 		if (q == NULL)
 			return -1;
-		strncpy(ttydevice, q, sizeof(ttydevice)-1);
-		ttydevice[sizeof(ttydevice)-1] = 0;
+		strcpy(ttydevice, q);
 		return 0;
 
 	} else if (strcmp(p, "mode") == 0) {
@@ -280,8 +279,7 @@
 		if (strlen(q) > sizeof(bc_text))
 			return -7;
 		q[strlen(q) - 1] = '\0';
-		strncpy(bc_text, q, sizeof(bc_text)-1);
-		bc_text[sizeof(bc_text)-1] = 0;
+		strcpy(bc_text, q);
 		return 0;
 
 	} else if (strcmp(p, "loglevel") == 0) {
@@ -305,14 +303,20 @@
 		q = strtok(NULL, " \t\n\r");
 		if (q == NULL)
 			return -1;
-		he = gethostbyname(q);
-		if (he != NULL) {
+
+		j = inet_addr(q);
+                if (j != -1) {
+                   memcpy(tip, (char *) &j, 4);
+                   thost[0]=0;
+                } else {
+                   he = gethostbyname(q);
+		   if (he != NULL){
 			memcpy(tip, he->h_addr_list[0], 4);
-		} else {	/* maybe user specified a numeric addr? */
-			j = inet_addr(q);
-			if (j == -1)
-				return -5;	/* if -1, bad deal! */
-			memcpy(tip, (char *) &j, 4);
+                        strncpy(thost, q, strlen(q));
+                        thost[strlen(q)] = 0;
+		   } else {
+			fprintf(stderr,"ax25ipd: %s host IP address unknown - will probe it again later\n",q);
+		   }
 		}
 
 		while ((q = strtok(NULL, " \t\n\r")) != NULL) {
@@ -336,7 +340,7 @@
 				}
 			}
 		}
-		route_add(tip, tcall, uport, flags);
+		route_add(thost,tip, tcall, uport, flags);
 		return 0;
 
 	} else if (strcmp(p, "broadcast") == 0) {
diff -ruN ax25-apps-0.0.8-rc2/ax25ipd/io.c ax25-apps-0.0.8-rc2-new/ax25ipd/io.c
--- ax25-apps-0.0.8-rc2/ax25ipd/io.c	2009-06-14 17:42:11.000000000 +0200
+++ ax25-apps-0.0.8-rc2-new/ax25ipd/io.c	2009-11-03 15:31:33.178816102 +0100
@@ -15,7 +15,6 @@
 
 #include <sys/types.h>
 #include <sys/time.h>
-#include <time.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <netinet/in_systm.h>
@@ -67,8 +66,7 @@
 struct sockaddr_in from;
 socklen_t fromlen;
 
-time_t last_bc_time;
-
+time_t last_bc_time, last_dns_time;
 int ttyfd_bpq = 0;
 
 /*
@@ -134,6 +132,8 @@
 
 	bzero((char *) &udpbind, sizeof(struct sockaddr));
 	udpbind.sin_family = AF_INET;
+
+        last_dns_time = time(NULL);
 }
 
 /*
@@ -378,9 +378,19 @@
 		if (nb == 0) {
 			fflush(stdout);
 			fflush(stderr);
+/*                      do we need to check hostname->ip mappings? */
+                        if (time(NULL) > last_dns_time + 300) {
+                           update_dns();
+                           last_dns_time = time(NULL); 
+                        }
 			/* just so we go back to the top of the loop! */
 			continue;
 		}
+/*              just in case we've been too busy......... */
+                if (time(NULL) > last_dns_time + 900) {
+                   update_dns();
+                   last_dns_time = time(NULL); 
+                }
 
 		if (FD_ISSET(ttyfd, &readfds)) {
 			do {
@@ -599,8 +609,9 @@
 			perror("reading from raw ip socket");
 			exit(2);
 		} else if (mode == UDP_MODE) {
-			perror("reading from udp socket");
+/*			perror("reading from udp socket");
 			exit(2);
+*/
 		} else if (mode == TTY_MODE) {
 			perror("reading from tty device");
 			exit(2);
@@ -645,8 +656,9 @@
 				usleep(100000);	/* sleep a bit */
 				return 1;	/* and retry */
 			}
-			perror("writing to udp socket");
+/*			perror("writing to udp socket");
 			exit(2);
+*/
 		} else if (mode == TTY_MODE) {
 			if (errno == EWOULDBLOCK) {
 				LOGL4("write to tty would block, sleeping and retrying!\n");
diff -ruN ax25-apps-0.0.8-rc2/ax25ipd/routing.c ax25-apps-0.0.8-rc2-new/ax25ipd/routing.c
--- ax25-apps-0.0.8-rc2/ax25ipd/routing.c	2009-06-14 10:07:11.000000000 +0200
+++ ax25-apps-0.0.8-rc2-new/ax25ipd/routing.c	2009-11-06 23:28:53.082799117 +0100
@@ -10,8 +10,11 @@
 #include "ax25ipd.h"
 #include <sys/types.h>
 #include <netinet/in.h>
+#include <sys/socket.h>
+#include <netdb.h> 
 #include <memory.h>
 #include <syslog.h>
+#include <string.h>
 
 /* The routing table structure is not visible outside this module. */
 
@@ -23,6 +26,7 @@
 	unsigned char pad1;
 	unsigned char pad2;
 	unsigned int flags;	/* route flags */
+	unsigned char hostnm[256]; /* host name or null */
 	struct route_table_entry *next;
 };
 
@@ -47,7 +51,7 @@
 }
 
 /* Add a new route entry */
-void route_add(unsigned char *ip, unsigned char *call, int udpport,
+void route_add(unsigned char *host, unsigned char *ip, unsigned char *call, int udpport, 
 	unsigned int flags)
 {
 	struct route_table_entry *rl, *rn;
@@ -75,6 +79,7 @@
 		rn->callsign[i] = call[i] & 0xfe;
 	rn->callsign[6] = (call[6] & 0x1e) | 0x60;
 	rn->padcall = 0;
+	strncpy(rn->hostnm, host, strlen(host));
 	memcpy(rn->ip_addr, ip, 4);
 	rn->udp_port = htons(udpport);
 	rn->pad1 = 0;
@@ -242,12 +247,30 @@
 
 	rp = route_tbl;
 	while (rp) {
-		LOGL1("  %s\t%s\t%s\t%d\t%d\n",
+		LOGL1("  %s %s %s %d %d %s\n",
 		      call_to_a(rp->callsign),
 		      (char *) inet_ntoa(*(struct in_addr *) rp->ip_addr),
 		      rp->udp_port ? "udp" : "ip",
-		      ntohs(rp->udp_port), rp->flags);
+		      ntohs(rp->udp_port), rp->flags,
+                      rp->hostnm);
 		rp = rp->next;
 	}
 	fflush(stdout);
 }
+/*update DNS entries of routes */
+void update_dns(void)
+{
+        struct hostent *he;
+	struct route_table_entry *rp;
+
+	rp = route_tbl;
+	while (rp) {
+           if (strlen(rp->hostnm) > 0) {
+              he = gethostbyname(rp->hostnm);
+                if (he != NULL) {
+                        memcpy(rp->ip_addr, he->h_addr_list[0], 4);
+                }
+           }
+	rp = rp->next;
+	}
+}

  reply	other threads:[~2009-11-06 22:43 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-26 17:31 ax25-apps/-tools: clarification about the project status IT2 Stuart Blake Tener, USNR
2009-10-23 13:06 ` [PATCH] ax25ipd : added provision for dynamic dns hosts Bernard Pidoux
2009-11-02 17:22   ` Thomas Osterried
2009-11-03 13:46     ` Pidoux
2009-11-06 22:43       ` Bernard Pidoux [this message]
2009-11-03 13:33   ` Bernard Pidoux

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4AF4A6A0.9090707@upmc.fr \
    --to=bernard.pidoux@upmc.fr \
    --cc=ax25@x-berg.in-berlin.de \
    --cc=linux-hams@vger.kernel.org \
    --cc=ralf@linux-mips.org \
    --cc=thomas@x-berg.in-berlin.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.