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