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 */