patch from debian to be a bit more verbose about IRQ conflicts
[oss-qm-packages.git] / lib / netrom.c
blob1de9dc398d6164ed9077f87d01d4c27b27f4f8ff
1 /*
2 * lib/netrom.c This file contains an implementation of the "NET/ROM"
3 * support functions for the NET-2 base distribution.
5 * Version: $Id: netrom.c,v 1.8 2000/03/05 11:26:03 philip Exp $
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.
12 * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
13 * Copyright 1993 MicroWalt Corporation
15 * Changes:
16 * 980701 {1.21} Arnaldo Carvalho de Melo - GNU gettext instead of catgets,
17 * strncpy instead of strcpy for
18 * i18n strings
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.
26 #include "config.h"
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"
51 static char netrom_errmsg[128];
53 extern struct aftype netrom_aftype;
55 static char *NETROM_print(unsigned char *ptr)
57 static char buff[8];
58 int i;
60 for (i = 0; i < 6; i++) {
61 buff[i] = ((ptr[i] & 0377) >> 1);
62 if (buff[i] == ' ')
63 buff[i] = '\0';
65 buff[6] = '\0';
66 i = ((ptr[6] & 0x1E) >> 1);
67 if (i != 0)
68 sprintf(&buff[strlen(buff)], "-%d", i);
69 return (buff);
73 /* Display an AX.25 socket address. */
74 static char *NETROM_sprint(struct sockaddr *sap, int numeric)
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));
83 static int NETROM_input(int type, char *bufp, struct sockaddr *sap)
85 unsigned char *ptr;
86 char *orig, c;
87 unsigned int i;
89 sap->sa_family = netrom_aftype.af;
90 ptr = ((struct sockaddr_ax25 *) sap)->sax25_call.ax25_call;
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);
107 *ptr++ = (unsigned char) ((c << 1) & 0xFE);
108 i++;
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);
120 /* Nope, fill out the address bytes with blanks. */
121 while (i++ < sizeof(ax25_address) - 1) {
122 *ptr++ = (unsigned char) ((' ' << 1) & 0xFE);
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';
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
141 return (0);
145 /* Display an error message. */
146 static void NETROM_herror(char *text)
148 if (text == NULL)
149 fprintf(stderr, "%s\n", netrom_errmsg);
150 else
151 fprintf(stderr, "%s: %s\n", text, netrom_errmsg);
155 static int NETROM_hinput(char *bufp, struct sockaddr *sap)
157 if (NETROM_input(0, bufp, sap) < 0)
158 return (-1);
159 sap->sa_family = ARPHRD_NETROM;
160 return (0);
163 #if 0
164 /* Set the line discipline of a terminal line. */
165 static int KISS_set_disc(int fd, int disc)
167 if (ioctl(fd, TIOCSETD, &disc) < 0) {
168 fprintf(stderr, "KISS_set_disc(%d): %s\n", disc, strerror(errno));
169 return (-errno);
171 return (0);
175 /* Start the KISS encapsulation on the file descriptor. */
176 static int KISS_init(int fd)
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);
184 #endif
186 struct hwtype netrom_hwtype =
188 "netrom", NULL, /* "AMPR NET/ROM", */ ARPHRD_NETROM, 7,
189 NETROM_print, NETROM_hinput, NULL, 0
192 struct aftype netrom_aftype =
194 "netrom", NULL, /* "AMPR NET/ROM", */ AF_NETROM, 7,
195 NETROM_print, NETROM_sprint, NETROM_input, NETROM_herror,
196 NULL, NULL, NULL,
198 "/proc/net/nr"
201 #endif /* HAVE_AFNETROM */