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
16 * 980701 {1.21} Arnaldo Carvalho de Melo - GNU gettext instead of catgets,
17 * strncpy instead of strcpy for
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.
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>
36 #include <linux/ax25.h>
46 #include "net-support.h"
47 #include "pathnames.h"
51 static char netrom_errmsg[128];
53 extern struct aftype netrom_aftype;
55 static char *NETROM_print(unsigned char *ptr)
60 for (i = 0; i < 6; i++) {
61 buff[i] = ((ptr[i] & 0377) >> 1);
66 i = ((ptr[6] & 0x1E) >> 1);
68 sprintf(&buff[strlen(buff)], "-%d", i);
73 /* Display an AX.25 socket address. */
74 static char *NETROM_sprint(struct sockaddr *sap, int numeric)
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)
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. */
95 while ((*bufp != '\0') && (*bufp != '-') && (i < 6)) {
99 if (!(isupper(c) || isdigit(c))) {
100 safe_strncpy(netrom_errmsg, _("Invalid callsign"), sizeof(netrom_errmsg));
102 fprintf(stderr, "netrom_input(%s): %s !\n", netrom_errmsg, orig);
107 *ptr++ = (unsigned char) ((c << 1) & 0xFE);
111 /* Callsign too long? */
112 if ((i == 6) && (*bufp != '-') && (*bufp != '\0')) {
113 safe_strncpy(netrom_errmsg, _("Callsign too long"), sizeof(netrom_errmsg));
115 fprintf(stderr, "netrom_input(%s): %s !\n", netrom_errmsg, orig);
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. */
128 *ptr = (unsigned char) ((i << 1) & 0xFE);
130 *ptr = (unsigned char) '\0';
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");
145 /* Display an error message. */
146 static void NETROM_herror(char *text)
149 fprintf(stderr, "%s\n", netrom_errmsg);
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)
159 sap->sa_family = ARPHRD_NETROM;
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));
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)
180 if (ioctl(fd, SIOCSIFENCAP, 4) < 0)
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,
201 #endif /* HAVE_AFNETROM */