summaryrefslogtreecommitdiffstats
path: root/ax25ipd/io.c
diff options
context:
space:
mode:
Diffstat (limited to 'ax25ipd/io.c')
-rw-r--r--ax25ipd/io.c372
1 files changed, 194 insertions, 178 deletions
diff --git a/ax25ipd/io.c b/ax25ipd/io.c
index 88a4923..ec8de4a 100644
--- a/ax25ipd/io.c
+++ b/ax25ipd/io.c
@@ -28,6 +28,7 @@
#include <stdio.h>
#include <string.h>
#include <errno.h>
+#include <syslog.h>
#ifdef __bsdi__
#define USE_TERMIOS
@@ -46,12 +47,12 @@ struct termios nterm;
#ifdef USE_TERMIO
#include <termio.h>
-struct termio nterm;
+struct termio nterm;
#endif
#ifdef USE_SGTTY
#include <sys/ioctl.h>
-struct sgttyb nterm;
+struct sgttyb nterm;
#endif
int ttyfd = -1;
@@ -88,8 +89,7 @@ time_t last_bc_time;
* Initialize the io variables
*/
-void
-io_init()
+void io_init()
{
/*
@@ -97,23 +97,22 @@ io_init()
* will be able to support a re-initialization if sent a SIGHUP.
*/
- if(ttyfd>=0){
+ if (ttyfd >= 0) {
close(ttyfd);
ttyfd = -1;
}
- if(sock>=0){
+ if (sock >= 0) {
close(sock);
sock = -1;
}
- if(udpsock>=0){
+ if (udpsock >= 0) {
close(udpsock);
udpsock = -1;
}
-
#ifdef USE_ICMP
- if(icmpsock>=0){
+ if (icmpsock >= 0) {
close(icmpsock);
icmpsock = -1;
}
@@ -124,13 +123,13 @@ io_init()
* address structure. Since both to and from are static, they are
* already clear.
*/
- bzero( (char *)&to, sizeof(struct sockaddr) );
+ bzero((char *) &to, sizeof(struct sockaddr));
to.sin_family = AF_INET;
- bzero( (char *)&from, sizeof(struct sockaddr) );
+ bzero((char *) &from, sizeof(struct sockaddr));
from.sin_family = AF_INET;
- bzero( (char *)&udpbind, sizeof(struct sockaddr) );
+ bzero((char *) &udpbind, sizeof(struct sockaddr));
udpbind.sin_family = AF_INET;
}
@@ -142,9 +141,9 @@ void io_open()
{
int baudrate;
- if(ip_mode){
+ if (ip_mode) {
sock = socket(AF_INET, SOCK_RAW, IPPROTO_AX25);
- if (sock<0) {
+ if (sock < 0) {
perror("opening raw socket");
exit(1);
}
@@ -152,10 +151,9 @@ void io_open()
perror("setting non-blocking I/O on raw socket");
exit(1);
}
-
#ifdef USE_ICMP
icmpsock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
- if (icmpsock<0) {
+ if (icmpsock < 0) {
perror("opening raw ICMP socket");
exit(1);
}
@@ -166,9 +164,9 @@ void io_open()
#endif
}
- if(udp_mode){
+ if (udp_mode) {
udpsock = socket(AF_INET, SOCK_DGRAM, 0);
- if (udpsock<0) {
+ if (udpsock < 0) {
perror("opening udp socket");
exit(1);
}
@@ -182,14 +180,14 @@ void io_open()
*/
udpbind.sin_addr.s_addr = INADDR_ANY;
udpbind.sin_port = my_udp;
- if(bind(udpsock,(struct sockaddr *)&udpbind,sizeof udpbind)<0){
+ if (bind(udpsock, (struct sockaddr *) &udpbind, sizeof udpbind) < 0) {
perror("binding udp socket");
exit(1);
}
}
ttyfd = open(ttydevice, O_RDWR, 0);
- if (ttyfd<0) {
+ if (ttyfd < 0) {
perror("opening tty device");
exit(1);
}
@@ -197,77 +195,96 @@ void io_open()
perror("setting non-blocking I/O on tty device");
exit(1);
}
-
#ifdef USE_TERMIOS
- if(ioctl(ttyfd, TCGETS, &nterm)<0){
+ if (ioctl(ttyfd, TCGETS, &nterm) < 0) {
#endif
#ifdef USE_TERMIO
- if(ioctl(ttyfd, TCGETA, &nterm)<0){
+ if (ioctl(ttyfd, TCGETA, &nterm) < 0) {
#endif
#ifdef USE_SGTTY
- if(ioctl(ttyfd, TIOCGETP, &nterm)<0){
+ if (ioctl(ttyfd, TIOCGETP, &nterm) < 0) {
#endif
perror("fetching tty device parameters");
exit(1);
}
- if(ttyspeed==50)baudrate=B50;
- else if(ttyspeed==50)baudrate=B50;
- else if(ttyspeed==75)baudrate=B75;
- else if(ttyspeed==110)baudrate=B110;
- else if(ttyspeed==134)baudrate=B134;
- else if(ttyspeed==150)baudrate=B150;
- else if(ttyspeed==200)baudrate=B200;
- else if(ttyspeed==300)baudrate=B300;
- else if(ttyspeed==600)baudrate=B600;
- else if(ttyspeed==1200)baudrate=B1200;
- else if(ttyspeed==1800)baudrate=B1800;
- else if(ttyspeed==2400)baudrate=B2400;
- else if(ttyspeed==4800)baudrate=B4800;
- else if(ttyspeed==9600)baudrate=B9600;
+ if (ttyspeed == 50)
+ baudrate = B50;
+ else if (ttyspeed == 50)
+ baudrate = B50;
+ else if (ttyspeed == 75)
+ baudrate = B75;
+ else if (ttyspeed == 110)
+ baudrate = B110;
+ else if (ttyspeed == 134)
+ baudrate = B134;
+ else if (ttyspeed == 150)
+ baudrate = B150;
+ else if (ttyspeed == 200)
+ baudrate = B200;
+ else if (ttyspeed == 300)
+ baudrate = B300;
+ else if (ttyspeed == 600)
+ baudrate = B600;
+ else if (ttyspeed == 1200)
+ baudrate = B1200;
+ else if (ttyspeed == 1800)
+ baudrate = B1800;
+ else if (ttyspeed == 2400)
+ baudrate = B2400;
+ else if (ttyspeed == 4800)
+ baudrate = B4800;
+ else if (ttyspeed == 9600)
+ baudrate = B9600;
#ifdef B19200
- else if(ttyspeed==19200)baudrate=B19200;
+ else if (ttyspeed == 19200)
+ baudrate = B19200;
#else
#ifdef EXTA
- else if(ttyspeed==19200)baudrate=EXTA;
-#endif
-#endif
+ else if (ttyspeed == 19200)
+ baudrate = EXTA;
+#endif /* EXTA */
+#endif /* B19200 */
#ifdef B38400
- else if(ttyspeed==38400)baudrate=B38400;
+ else if (ttyspeed == 38400)
+ baudrate = B38400;
#else
#ifdef EXTB
- else if(ttyspeed==38400)baudrate=EXTB;
-#endif
-#endif
- else baudrate = B9600;
+ else if (ttyspeed == 38400)
+ baudrate = EXTB;
+#endif /* EXTB */
+#endif /* B38400 */
+ else
+ baudrate = B9600;
#ifdef USE_SGTTY
nterm.sg_flags = (RAW | ANYP);
nterm.sg_ispeed = baudrate;
nterm.sg_ospeed = baudrate;
#else
- nterm.c_iflag = 0;
- nterm.c_oflag = 0;
+ nterm.c_iflag = 0;
+ nterm.c_oflag = 0;
nterm.c_cflag = baudrate | CS8 | CREAD | CLOCAL;
nterm.c_lflag = 0;
- nterm.c_cc[VMIN] = 0;
- nterm.c_cc[VTIME] = 0;
-#endif
+ nterm.c_cc[VMIN] = 0;
+ nterm.c_cc[VTIME] = 0;
+#endif /* USE_SGTTY */
#ifdef USE_TERMIOS
- if(ioctl(ttyfd, TCSETS, &nterm)<0){
-#endif
+ if (ioctl(ttyfd, TCSETS, &nterm) < 0) {
+#endif /* USE_TERMIOS */
#ifdef USE_TERMIO
- if(ioctl(ttyfd, TCSETA, &nterm)<0){
-#endif
+ if (ioctl(ttyfd, TCSETA, &nterm) < 0) {
+#endif /* USE_TERMIO */
#ifdef USE_SGTTY
- if(ioctl(ttyfd, TIOCSETP, &nterm)<0){
-#endif
+ if (ioctl (ttyfd, TIOCSETP, &nterm) < 0) {
+#endif /* USE_SGTTY */
perror("setting tty device parameters");
exit(1);
}
- if(digi)send_params();
+ if (digi)
+ send_params();
last_bc_time = 0; /* force immediate id */
}
@@ -277,9 +294,7 @@ void io_open()
* run in a loop, using the select call to handle input.
*/
-void
-io_start()
-{
+void io_start() {
int n, nb, hdr_len;
fd_set readfds;
unsigned char buf[MAX_FRAME];
@@ -287,153 +302,150 @@ io_start()
struct iphdr *ipptr;
time_t now;
- for(;;){
+ for (;;) {
- if((bc_interval>0)&&digi){
+ if ((bc_interval > 0) && digi) {
now = time(NULL);
- if (last_bc_time + bc_interval < now){
+ if (last_bc_time + bc_interval < now) {
last_bc_time = now;
LOGL4("iostart: BEACON\n");
do_beacon();
}
}
- wait.tv_sec = 10; /* lets us keep the beacon going */
+ wait.tv_sec = 10; /* lets us keep the beacon going */
wait.tv_usec = 0;
FD_ZERO(&readfds);
FD_SET(ttyfd, &readfds);
- if(ip_mode){
+ if (ip_mode) {
FD_SET(sock, &readfds);
#ifdef USE_ICMP
FD_SET(icmpsock, &readfds);
#endif
}
- if(udp_mode){
+ if (udp_mode) {
FD_SET(udpsock, &readfds);
}
- nb = select(FD_SETSIZE,&readfds,(fd_set *)0,(fd_set *)0,&wait);
+ nb = select(FD_SETSIZE, &readfds, (fd_set *) 0, (fd_set *) 0, &wait);
- if(nb < 0){
- if(errno == EINTR)continue; /* Ignore */
+ if (nb < 0) {
+ if (errno == EINTR)
+ continue; /* Ignore */
perror("select");
exit(1);
}
- if(nb == 0){
+ if (nb == 0) {
fflush(stdout);
fflush(stderr);
/* just so we go back to the top of the loop! */
continue;
}
- if(FD_ISSET(ttyfd, &readfds)){
+ if (FD_ISSET(ttyfd, &readfds)) {
do {
n = read(ttyfd, buf, MAX_FRAME);
- } while(io_error(n, buf, n, READ_MSG, TTY_MODE));
- LOGL4("ttydata l=%d\n",n);
- if(n>0)assemble_kiss(buf,n);
+ }
+ while (io_error(n, buf, n, READ_MSG, TTY_MODE));
+ LOGL4("ttydata l=%d\n", n);
+ if (n > 0)
+ assemble_kiss(buf, n);
/*
* If we are in "beacon after" mode, reset the "last_bc_time" each time
* we hear something on the channel.
*/
- if(!bc_every)last_bc_time = time(NULL);
+ if (!bc_every)
+ last_bc_time = time(NULL);
}
- if(udp_mode){
- if(FD_ISSET(udpsock, &readfds)){
+ if (udp_mode) {
+ if (FD_ISSET(udpsock, &readfds)) {
do {
fromlen = sizeof from;
- n = recvfrom(udpsock, buf, MAX_FRAME, 0,
- (struct sockaddr *)&from, &fromlen);
- } while(io_error(n, buf, n, READ_MSG, UDP_MODE));
- LOGL4("udpdata from=%s port=%d l=%d\n",
- (char *)inet_ntoa(from.sin_addr),
- ntohs(from.sin_port), n);
+ n = recvfrom(udpsock, buf, MAX_FRAME, 0, (struct sockaddr *) &from, &fromlen);
+ }
+ while (io_error(n, buf, n, READ_MSG, UDP_MODE));
+ LOGL4("udpdata from=%s port=%d l=%d\n", (char *) inet_ntoa(from. sin_addr), ntohs(from. sin_port), n);
stats.udp_in++;
- if(n>0)from_ip(buf, n);
+ if (n > 0)
+ from_ip(buf, n);
}
- } /* if udp_mode */
-
- if(ip_mode){
- if(FD_ISSET(sock, &readfds)){
- do{
+ }
+ /* if udp_mode */
+ if (ip_mode) {
+ if (FD_ISSET(sock, &readfds)) {
+ do {
fromlen = sizeof from;
- n = recvfrom(sock, buf, MAX_FRAME, 0,
- (struct sockaddr *)&from, &fromlen);
- } while(io_error(n, buf, n, READ_MSG, IP_MODE));
- ipptr = (struct iphdr *)buf;
- hdr_len = 4 * ipptr->ihl;
- LOGL4("ipdata from=%s l=%d, hl=%d\n",
- (char *)inet_ntoa(from.sin_addr),
- n, hdr_len);
+ n = recvfrom(sock, buf, MAX_FRAME, 0, (struct sockaddr *) &from, &fromlen);
+ }
+ while (io_error(n, buf, n, READ_MSG, IP_MODE));
+ ipptr = (struct iphdr *) buf;
+ hdr_len = 4 * ipptr-> ihl;
+ LOGL4("ipdata from=%s l=%d, hl=%d\n", (char *) inet_ntoa(from. sin_addr), n, hdr_len);
stats.ip_in++;
- if(n>hdr_len)from_ip(buf+hdr_len, n-hdr_len);
+ if (n > hdr_len)
+ from_ip(buf + hdr_len, n - hdr_len);
}
-
#ifdef USE_ICMP
- if(FD_ISSET(icmpsock, &readfds)){
+ if (FD_ISSET(icmpsock, &readfds)) {
do {
fromlen = sizeof from;
- n = recvfrom(icmpsock, buf, MAX_FRAME, 0,
- (struct sockaddr *)&from, &fromlen);
- } while(io_error(n, buf, n, READ_MSG, ICMP_MODE));
- ipptr = (struct iphdr *)buf;
- hdr_len = 4 * ipptr->ihl;
- LOGL4("icmpdata from=%s l=%d, hl=%d\n",
- (char *)inet_ntoa(from.sin_addr),
- n, hdr_len);
+ n = recvfrom(icmpsock, buf, MAX_FRAME, 0, (struct sockaddr *) &from, &fromlen);
+ }
+ while (io_error(n, buf, n, READ_MSG, ICMP_MODE));
+ ipptr = (struct iphdr *) buf;
+ hdr_len = 4 * ipptr-> ihl;
+ LOGL4("icmpdata from=%s l=%d, hl=%d\n", (char *) inet_ntoa(from. sin_addr), n, hdr_len);
}
#endif
- } /* if ip_mode */
-
- } /* for forever */
+ }
+ /* if ip_mode */
+ } /* for forever */
}
/* Send an IP frame */
-void
-send_ip(buf, l, targetip)
+void send_ip(buf, l, targetip)
unsigned char *buf;
int l;
unsigned char *targetip;
{
int n;
- if(l<=0)return;
- memcpy((char *)&to.sin_addr, targetip, 4);
- memcpy((char *)&to.sin_port, &targetip[4], 2);
- LOGL4("sendipdata to=%s %s %d l=%d\n",
- (char *)inet_ntoa(to.sin_addr),
- to.sin_port ? "udp" : "ip",
- ntohs(to.sin_port), l);
- if(to.sin_port){
- if(udp_mode){
+ if (l <= 0)
+ return;
+ memcpy((char *) &to.sin_addr,
+ targetip, 4);
+ memcpy((char *) &to.sin_port,
+ &targetip[4], 2);
+ LOGL4("sendipdata to=%s %s %d l=%d\n", (char *) inet_ntoa(to. sin_addr), to.sin_port ? "udp" : "ip", ntohs(to.sin_port), l);
+ if (to.sin_port) {
+ if (udp_mode) {
stats.udp_out++;
do {
- n = sendto(udpsock, buf, l, 0,
- (struct sockaddr *)&to, sizeof to);
- } while(io_error(n, buf, l, SEND_MSG, UDP_MODE));
+ n = sendto(udpsock, buf, l, 0, (struct sockaddr *) &to, sizeof to);
+ }
+ while (io_error(n, buf, l, SEND_MSG, UDP_MODE));
}
} else {
- if(ip_mode){
+ if (ip_mode) {
stats.ip_out++;
do {
- n = sendto(sock, buf, l, 0,
- (struct sockaddr *)&to, sizeof to);
- } while(io_error(n, buf, l, SEND_MSG, IP_MODE));
+ n = sendto(sock, buf, l, 0, (struct sockaddr *) &to, sizeof to);
+ }
+ while (io_error(n, buf, l, SEND_MSG, IP_MODE));
}
}
}
/* Send a kiss frame */
-void
-send_tty(buf, l)
+void send_tty(buf, l)
unsigned char *buf;
int l;
{
@@ -441,8 +453,9 @@ int l;
unsigned char *p;
int nc;
- if(l<=0)return;
- LOGL4("sendttydata l=%d\tsent: ",l);
+ if (l <= 0)
+ return;
+ LOGL4("sendttydata l=%d\tsent: ", l);
stats.kiss_out++;
p = buf;
@@ -460,105 +473,108 @@ int l;
* error code.
*/
do {
- if((n>0)&&(n<nc)) { /* did we put only write a bit? */
- p += n; /* point to the new data */
- nc -= n; /* drop the length */
+ if ((n > 0) && (n < nc)) { /* did we put only write a bit? */
+ p += n; /* point to the new data */
+ nc -= n; /* drop the length */
}
n = write(ttyfd, p, nc);
- if(n>0){
- if(n!=nc){
- LOGL4("%d ",n); /* no-one said loglevel 4 */
+ if (n > 0) {
+ if (n != nc) {
+ LOGL4("%d ", n); /* no-one said loglevel 4 */
} else {
- LOGL4("%d\n",n); /* was efficient!!! */
+ LOGL4("%d\n", n); /* was efficient!!! */
}
}
- } while( ((n>0)&&(n<nc)) || (io_error(n, p, nc, SEND_MSG, TTY_MODE)));
+ }
+ while (((n > 0) && (n < nc)) || (io_error(n, p, nc, SEND_MSG, TTY_MODE)));
}
/* process an I/O error; return true if a retry is needed */
-int
-io_error(oops, buf, bufsize, dir, mode)
-int oops; /* the error flag; < 0 indicates a problem */
-unsigned char *buf; /* the data in question */
-int bufsize; /* the size of the data buffer */
-int dir; /* the direction; input or output */
-int mode; /* the fd on which we got the error */
+int io_error(oops, buf, bufsize, dir, mode)
+int oops; /* the error flag; < 0 indicates a problem */
+unsigned char *buf; /* the data in question */
+int bufsize; /* the size of the data buffer */
+int dir; /* the direction; input or output */
+int mode; /* the fd on which we got the error */
{
- if(oops >= 0) return 0; /* do we have an error ? */
+ if (oops >= 0)
+ return 0; /* do we have an error ? */
#ifdef EAGAIN
- if(errno == EAGAIN){
+ if (errno == EAGAIN) {
perror("System 5 I/O error!");
- fprintf(stderr,"A System 5 style I/O error was detected. This program requires BSD 4.2\n");
- fprintf(stderr,"behaviour. This is probably a result of compile-time environment.\n");
+ fprintf(stderr, "A System 5 style I/O error was detected. This program requires BSD 4.2\n");
+ fprintf(stderr, "behaviour. This is probably a result of compile-time environment.\n");
exit(3);
}
#endif
- if(dir == READ_MSG){
- if(errno == EINTR) return 0; /* never retry read */
- if(errno == EWOULDBLOCK){
+ if (dir == READ_MSG) {
+ if (errno == EINTR)
+ return 0; /* never retry read */
+ if (errno == EWOULDBLOCK) {
LOGL4("READ would block (?!), sleeping and retrying!\n");
usleep(100000); /* sleep a bit */
- return 1; /* and retry */
+ return 1; /* and retry */
}
- if(mode == IP_MODE){
+ if (mode == IP_MODE) {
perror("reading from raw ip socket");
exit(2);
- } else if(mode == UDP_MODE){
+ } else if (mode == UDP_MODE) {
perror("reading from udp socket");
exit(2);
- } else if(mode == TTY_MODE){
+ } else if (mode == TTY_MODE) {
perror("reading from tty device");
exit(2);
} else {
perror("reading from unknown I/O");
exit(2);
}
- } else if(dir == SEND_MSG){
- if(errno == EINTR) return 1; /* always retry on writes */
- if(mode == IP_MODE){
- if(errno == EMSGSIZE){ /* msg too big, drop it */
+ } else if (dir == SEND_MSG) {
+ if (errno == EINTR)
+ return 1; /* always retry on writes */
+ if (mode == IP_MODE) {
+ if (errno == EMSGSIZE) { /* msg too big, drop it */
perror("message dropped on raw ip socket");
- fprintf(stderr,"message was %d bytes long.\n",bufsize);
+ fprintf (stderr, "message was %d bytes long.\n", bufsize);
return 0;
}
- if(errno == ENOBUFS){ /* congestion; sleep + retry */
+ if (errno == ENOBUFS) { /* congestion; sleep + retry */
LOGL4("send congestion on raw ip, sleeping and retrying!\n");
usleep(100000);
return 1;
}
- if(errno == EWOULDBLOCK){
+ if (errno == EWOULDBLOCK) {
LOGL4("send on raw ip would block, sleeping and retrying!\n");
usleep(100000); /* sleep a bit */
- return 1; /* and retry */
+ return 1; /* and retry */
}
perror("writing to raw ip socket");
exit(2);
- } else if(mode == UDP_MODE){
- if(errno == EMSGSIZE){ /* msg too big, drop it */
+ } else if (mode == UDP_MODE) {
+ if (errno == EMSGSIZE) { /* msg too big, drop it */
perror("message dropped on udp socket");
- fprintf(stderr,"message was %d bytes long.\n",bufsize);
+ fprintf(stderr, "message was %d bytes long.\n", bufsize);
return 0;
}
- if(errno == ENOBUFS){ /* congestion; sleep + retry */
+ if (errno == ENOBUFS) { /* congestion; sleep + retry */
LOGL4("send congestion on udp, sleeping and retrying!\n");
usleep(100000);
return 1;
}
- if(errno == EWOULDBLOCK){
+ if (errno == EWOULDBLOCK) {
LOGL4("send on udp would block, sleeping and retrying!\n");
usleep(100000); /* sleep a bit */
- return 1; /* and retry */
+ return 1; /* and retry */
}
perror("writing to udp socket");
exit(2);
- } else if(mode == TTY_MODE){
- if(errno == EWOULDBLOCK){
+ } else if (mode == TTY_MODE) {
+ if (errno == EWOULDBLOCK) {
LOGL4("write to tty would block, sleeping and retrying!\n");
usleep(100000); /* sleep a bit */
- return 1; /* and retry */
+ return 1; /* and retry */
}
perror("writing to tty device");
exit(2);