enable -fno-strict-aliasing until the code base gets a hefty clean up to fix all...
[platform/upstream/net-tools.git] / lib / netrom.c
1 /*
2  * lib/netrom.c       This file contains an implementation of the "NET/ROM"
3  *              support functions for the NET-2 base distribution.
4  *
5  * Version:     $Id: netrom.c,v 1.8 2000/03/05 11:26:03 philip Exp $
6  *
7  * NOTE:        I will redo this module as soon as I got the libax25.a
8  *              library sorted out.  This library contains some useful
9  *              and often used address conversion functions, database
10  *              lookup stuff, and more of the like.
11  *
12  * Author:      Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
13  *              Copyright 1993 MicroWalt Corporation
14  * 
15  * Changes:
16  * 980701 {1.21} Arnaldo Carvalho de Melo - GNU gettext instead of catgets,
17  *                                          strncpy instead of strcpy for
18  *                                          i18n strings
19  *
20  *              This program is free software; you can redistribute it
21  *              and/or  modify it under  the terms of  the GNU General
22  *              Public  License as  published  by  the  Free  Software
23  *              Foundation;  either  version 2 of the License, or  (at
24  *              your option) any later version.
25  */
26 #include "config.h"
27
28 #if HAVE_AFNETROM || HAVE_HWNETROM
29 #include <sys/types.h>
30 #include <sys/ioctl.h>
31 #include <sys/socket.h>
32 #include <net/if_arp.h>
33 #if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1)
34 #include <netax25/ax25.h>
35 #else
36 #include <linux/ax25.h>
37 #endif
38 #include <stdlib.h>
39 #include <stdio.h>
40 #include <ctype.h>
41 #include <errno.h>
42 #include <fcntl.h>
43 #include <string.h>
44 #include <termios.h>
45 #include <unistd.h>
46 #include "net-support.h"
47 #include "pathnames.h"
48 #include "intl.h"
49 #include "util.h"
50
51 static char netrom_errmsg[128];
52
53 extern struct aftype netrom_aftype;
54
55 static char *NETROM_print(unsigned char *ptr)
56 {
57     static char buff[8];
58     int i;
59
60     for (i = 0; i < 6; i++) {
61         buff[i] = ((ptr[i] & 0377) >> 1);
62         if (buff[i] == ' ')
63             buff[i] = '\0';
64     }
65     buff[6] = '\0';
66     i = ((ptr[6] & 0x1E) >> 1);
67     if (i != 0)
68         sprintf(&buff[strlen(buff)], "-%d", i);
69     return (buff);
70 }
71
72
73 /* Display an AX.25 socket address. */
74 static char *NETROM_sprint(struct sockaddr *sap, int numeric)
75 {
76     char buf[64];
77     if (sap->sa_family == 0xFFFF || sap->sa_family == 0)
78         return safe_strncpy(buf, _("[NONE SET]"), sizeof(buf));
79     return (NETROM_print(((struct sockaddr_ax25 *) sap)->sax25_call.ax25_call));
80 }
81
82
83 static int NETROM_input(int type, char *bufp, struct sockaddr *sap)
84 {
85     unsigned char *ptr;
86     char *orig, c;
87     unsigned int i;
88
89     sap->sa_family = netrom_aftype.af;
90     ptr = ((struct sockaddr_ax25 *) sap)->sax25_call.ax25_call;
91
92     /* First, scan and convert the basic callsign. */
93     orig = bufp;
94     i = 0;
95     while ((*bufp != '\0') && (*bufp != '-') && (i < 6)) {
96         c = *bufp++;
97         if (islower(c))
98             c = toupper(c);
99         if (!(isupper(c) || isdigit(c))) {
100             safe_strncpy(netrom_errmsg, _("Invalid callsign"), sizeof(netrom_errmsg));
101 #ifdef DEBUG
102             fprintf(stderr, "netrom_input(%s): %s !\n", netrom_errmsg, orig);
103 #endif
104             errno = EINVAL;
105             return (-1);
106         }
107         *ptr++ = (unsigned char) ((c << 1) & 0xFE);
108         i++;
109     }
110
111     /* Callsign too long? */
112     if ((i == 6) && (*bufp != '-') && (*bufp != '\0')) {
113         safe_strncpy(netrom_errmsg, _("Callsign too long"), sizeof(netrom_errmsg));
114 #ifdef DEBUG
115         fprintf(stderr, "netrom_input(%s): %s !\n", netrom_errmsg, orig);
116 #endif
117         errno = E2BIG;
118         return (-1);
119     }
120     /* Nope, fill out the address bytes with blanks. */
121     while (i++ < sizeof(ax25_address) - 1) {
122         *ptr++ = (unsigned char) ((' ' << 1) & 0xFE);
123     }
124
125     /* See if we need to add an SSID field. */
126     if (*bufp == '-') {
127         i = atoi(++bufp);
128         *ptr = (unsigned char) ((i << 1) & 0xFE);
129     } else {
130         *ptr = (unsigned char) '\0';
131     }
132
133     /* All done. */
134 #ifdef DEBUG
135     fprintf(stderr, "netrom_input(%s): ", orig);
136     for (i = 0; i < sizeof(ax25_address); i++)
137         fprintf(stderr, "%02X ", sap->sa_data[i] & 0377);
138     fprintf(stderr, "\n");
139 #endif
140
141     return (0);
142 }
143
144
145 /* Display an error message. */
146 static void NETROM_herror(char *text)
147 {
148     if (text == NULL)
149         fprintf(stderr, "%s\n", netrom_errmsg);
150     else
151         fprintf(stderr, "%s: %s\n", text, netrom_errmsg);
152 }
153
154
155 static int NETROM_hinput(char *bufp, struct sockaddr *sap)
156 {
157     if (NETROM_input(0, bufp, sap) < 0)
158         return (-1);
159     sap->sa_family = ARPHRD_NETROM;
160     return (0);
161 }
162
163 #if 0
164 /* Set the line discipline of a terminal line. */
165 static int KISS_set_disc(int fd, int disc)
166 {
167     if (ioctl(fd, TIOCSETD, &disc) < 0) {
168         fprintf(stderr, "KISS_set_disc(%d): %s\n", disc, strerror(errno));
169         return (-errno);
170     }
171     return (0);
172 }
173
174
175 /* Start the KISS encapsulation on the file descriptor. */
176 static int KISS_init(int fd)
177 {
178     if (KISS_set_disc(fd, N_SLIP) < 0)
179         return (-1);
180     if (ioctl(fd, SIOCSIFENCAP, 4) < 0)
181         return (-1);
182     return (0);
183 }
184 #endif
185
186 struct hwtype netrom_hwtype =
187 {
188     "netrom", NULL, /* "AMPR NET/ROM", */ ARPHRD_NETROM, 7,
189     NETROM_print, NETROM_hinput, NULL, 0
190 };
191
192 struct aftype netrom_aftype =
193 {
194     "netrom", NULL, /* "AMPR NET/ROM", */ AF_NETROM, 7,
195     NETROM_print, NETROM_sprint, NETROM_input, NETROM_herror,
196     NULL, NULL, NULL,
197     -1,
198     "/proc/net/nr"
199 };
200
201 #endif                          /* HAVE_AFNETROM */