diff options
author | Thomas Osterried <thomas@osterried.de> | 2012-01-31 23:18:37 +0000 |
---|---|---|
committer | Thomas Osterried <thomas@osterried.de> | 2012-01-31 23:18:37 +0000 |
commit | ed11cf70be0935d8e5dd389e829aa2527ccf674f (patch) | |
tree | 85f50458887bc24e0d601ff56a30308e1335eb73 | |
parent | 211d51d5e4d8c5665f70a7d85a82ba6e0ac2a426 (diff) |
Fixed Bug: libax25 cannot find interfaces with callsign's without SSID.
In http://www.linux-ax25.org/cvsweb/libax25/ChangeLog we read:
Revision 1.8: download - view: text, markup, annotated - select for diffs
Thu Sep 10 16:53:28 2009 UTC (2 years, 4 months ago) by ralf
Branches: MAIN
CVS tags: HEAD
Diff to: previous 1.7: preferred, colored
Changes since revision 1.7: +5 -0 lines
ax25_ntoa: Don't emit SSID suffix if the SSID is zero.
From: Matti Aarnio OH2MQK <matti.aarnio@zmailer.org>
In http://www.linux-ax25.org/cvsweb/libax25/axutils.c.diff?r1=1.4;r2=1.5
funtion char *ax25_ntoa(const ax25_address *a):
- *s++ = '-';
+ /* Convention is: -0 suffixes are NOT printed */
+ if (a->ax25_call[6] & 0x1E) {
+ *s++ = '-';
- if ((n = ((a->ax25_call[6] >> 1) & 0x0F)) > 9) {
- *s++ = '1';
- n -= 10;
+ if ((n = ((a->ax25_call[6] >> 1) & 0x0F)) > 9) {
+ *s++ = '1';
+ n -= 10;
+ }
+ *s++ = n + '0';
}
-
- *s++ = n + '0';
+
*s++ = '\0';
This is diametral to the previous situation, where ax25_ntoa always returned
a call with SSID.
Unfortunately, that patch broke a fixe introduced in April 2009; that patch
fixed the same issue introduced by a patch in April 2008:
http://www.linux-ax25.org/cvsweb/libax25/axconfig.c
This is a fix for a bug introduced 2008-04-02, which caused interfaces
containing CALL without SSID not being found anymore (user had to
address CALL-0 instead of just CALL).
http://www.linux-ax25.org/cvsweb/libax25/axconfig.c.diff?r1=1.7;r2=1.8
[..]
+ /* user may have configured "DL9SAU". But we compare to *ifcalls,
+ * which comes from ifr_hwaddr.sa_data and it always contains a SSID;
+ * in this case, "DL9SAU-0". This fixes a bug introduced 2008-04-02,
+ * which caused interfaces without SSID not being found anymore. :(
+ */
[..]
It has been overseen that libax25 internaly uses ax25_ntoa, not just for
user-presentation.
The fix today resolves the problem, and cleans up helper routines like
strip_zero_ssid() that are no longer needed.
Affected files: axconfig.c, nrconfig.c and procutils.c.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | axconfig.c | 19 | ||||
-rw-r--r-- | nrconfig.c | 10 | ||||
-rw-r--r-- | procutils.c | 13 |
4 files changed, 15 insertions, 33 deletions
@@ -1,3 +1,9 @@ + * Interfaces with a callsign without SSID were not been found anymore + after the last patch below. See cvs comment for detail. + Affected files: axconfig.c, nrconfig.c and procutils.c. + + -- Thomas Osterried DL9SAU <ax25@x-berg.in-berlin.de> Wed, 01 Feb 2012 00:10:45 +0100 + * ax25_ntoa() does no longer print a zero SSID. This avoids addresses like AB3DEF-0 which is general convention anyway. @@ -195,7 +195,6 @@ static int ax25_config_init_port(int fd, int lineno, char *line, const char **if char *name, *call, *baud, *paclen, *window, *desc; const char *dev = NULL; int found; - char call_beautified[10]; /* DL9SAU-10\0 */ name = strtok(line, " \t"); call = strtok(NULL, " \t"); @@ -237,26 +236,18 @@ static int ax25_config_init_port(int fd, int lineno, char *line, const char **if } strupr(call); - /* user may have configured "DL9SAU". But we compare to *ifcalls, - * which comes from ifr_hwaddr.sa_data and it always contains a SSID; - * in this case, "DL9SAU-0". This fixes a bug introduced 2008-04-02, - * which caused interfaces without SSID not being found anymore. :( - */ - strncpy(call_beautified, call, sizeof(call_beautified)-1); - call_beautified[sizeof(call_beautified)-1] = 0; - if (strchr(call_beautified, '-') == NULL && strlen(call_beautified) < 7) - strcat(call_beautified, "-0"); - found = 0; + char *cp; + if ((cp = strstr(call, "-0")) != NULL) + *cp = '\0'; for (;ifcalls && *ifcalls; ++ifcalls, ++ifdevs) { - if (strcmp(call_beautified, *ifcalls) == 0) { + if (strcmp(call, *ifcalls) == 0) { found = 1; dev = *ifdevs; break; } } - if (!found) { #if 0 /* None of your business to complain about some port being down... */ fprintf(stderr, "axconfig: port with call '%s' is not active\n", call); @@ -270,7 +261,7 @@ static int ax25_config_init_port(int fd, int lineno, char *line, const char **if } p->Name = strdup(name); - p->Call = strdup(call_beautified); + p->Call = strdup(call); p->Device = strdup(dev); p->Baud = atoi(baud); p->Window = atoi(window); @@ -179,7 +179,6 @@ static int nr_config_init_port(int fd, int lineno, char *line, const char **ifca char *name, *call, *alias, *paclen, *desc; const char *dev = NULL; int found = 0; - char call_beautified[10]; name = strtok(line, " \t"); call = strtok(NULL, " \t"); @@ -216,14 +215,13 @@ static int nr_config_init_port(int fd, int lineno, char *line, const char **ifca strupr(call); strupr(alias); - strncpy(call_beautified, call, sizeof(call_beautified)-1); - call_beautified[sizeof(call_beautified)-1] = 0; - if (strchr(call_beautified, '-') == NULL && strlen(call_beautified) < 7) - strcat(call_beautified, "-0"); + char *cp; + if ((cp = strstr(call, "-0")) != NULL) + *cp = 0; found = 0; for (;ifcalls && *ifcalls; ++ifcalls, ++ifdevs) { - if (strcmp(call_beautified, *ifcalls) == 0) { + if (strcmp(call, *ifcalls) == 0) { found = 1; dev = *ifdevs; break; diff --git a/procutils.c b/procutils.c index 816fa40..8eec81f 100644 --- a/procutils.c +++ b/procutils.c @@ -70,15 +70,6 @@ static char *token(char **ptr, const char *delim) return buf; } -static char *strip_zero_ssid(char *call) -{ - char *cp; - - if ((cp = strstr(call, "-0")) != NULL) - *cp = 0; - return call; -} - struct proc_ax25 *read_proc_ax25(void) { FILE *fp; @@ -345,8 +336,6 @@ struct proc_nr_nodes *read_proc_nr_nodes(void) cp = buffer; safe_strncpy(new->call, token(&cp, space), 9); - strip_zero_ssid(new->call); - safe_strncpy(new->alias, token(&cp, space), 6); new->w = safe_atoi(token(&cp, space)); @@ -386,7 +375,6 @@ struct proc_nr_nodes *read_proc_nr_nodes(void) break; if ((cp = nr_config_get_addr(name)) == NULL) break; - strip_zero_ssid(cp); safe_strncpy(new->call, cp, 9); if ((cp = nr_config_get_alias(name)) == NULL) break; @@ -670,7 +658,6 @@ struct proc_nr_nodes *find_node(char *addr, struct proc_nr_nodes *nodes) static struct proc_nr_nodes n; struct proc_nr_nodes *p, *list; - strip_zero_ssid(addr); list = nodes ? nodes : read_proc_nr_nodes(); for (p = list; p != NULL; p = p->next) { if (!strcasecmp(addr, p->call) || !strcasecmp(addr, p->alias)) { |