summaryrefslogtreecommitdiffstats
path: root/user_call/ax25_call.c
diff options
context:
space:
mode:
Diffstat (limited to 'user_call/ax25_call.c')
-rw-r--r--user_call/ax25_call.c90
1 files changed, 45 insertions, 45 deletions
diff --git a/user_call/ax25_call.c b/user_call/ax25_call.c
index 235feb9..cbedf63 100644
--- a/user_call/ax25_call.c
+++ b/user_call/ax25_call.c
@@ -1,3 +1,4 @@
+#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
@@ -8,8 +9,8 @@
#include <sys/time.h>
#include <sys/types.h>
-
#include <sys/socket.h>
+
#ifdef HAVE_NETAX25_AX25_H
#include <netax25/ax25.h>
#else
@@ -24,27 +25,46 @@
#include <netax25/axlib.h>
#include <netax25/axconfig.h>
-void alarm_handler(int sig)
-{
-}
+#include "user_io.h"
-void err(char *message)
+void alarm_handler(int sig)
{
- write(STDOUT_FILENO, message, strlen(message));
- exit(1);
}
int main(int argc, char **argv)
{
- char buffer[512], *addr;
- fd_set read_fd;
- int n, s, addrlen = sizeof(struct full_sockaddr_ax25);
+ char buffer[256], *addr;
+ int s, addrlen = sizeof(struct full_sockaddr_ax25);
struct full_sockaddr_ax25 axbind, axconnect;
+ while ((s = getopt(argc, argv, "ci:o:")) != -1) {
+ switch (s) {
+ case 'c':
+ init_compress();
+ compression = 1;
+ break;
+ case 'i':
+ paclen_in = atoi(optarg);
+ break;
+ case 'o':
+ paclen_out = atoi(optarg);
+ break;
+ case ':':
+ case '?':
+ err("ERROR: invalid option usage\r");
+ return 1;
+ }
+ }
+
+ if (paclen_in < 1 || paclen_out < 1) {
+ err("ERROR: invalid paclen\r");
+ return 1;
+ }
+
/*
* Arguments should be "ax25_call port mycall remcall [digis ...]"
*/
- if (argc < 4) {
+ if ((argc - optind) < 3) {
strcpy(buffer, "ERROR: invalid number of parameters\r");
err(buffer);
}
@@ -60,22 +80,22 @@ int main(int argc, char **argv)
axconnect.fsa_ax25.sax25_family = axbind.fsa_ax25.sax25_family = AF_AX25;
axbind.fsa_ax25.sax25_ndigis = 1;
- if ((addr = ax25_config_get_addr(argv[1])) == NULL) {
- sprintf(buffer, "ERROR: invalid AX.25 port name - %s\r", argv[1]);
+ if ((addr = ax25_config_get_addr(argv[optind])) == NULL) {
+ sprintf(buffer, "ERROR: invalid AX.25 port name - %s\r", argv[optind]);
err(buffer);
}
if (ax25_aton_entry(addr, axbind.fsa_digipeater[0].ax25_call) == -1) {
- sprintf(buffer, "ERROR: invalid AX.25 port callsign - %s\r", argv[1]);
+ sprintf(buffer, "ERROR: invalid AX.25 port callsign - %s\r", argv[optind]);
err(buffer);
}
- if (ax25_aton_entry(argv[2], axbind.fsa_ax25.sax25_call.ax25_call) == -1) {
- sprintf(buffer, "ERROR: invalid callsign - %s\r", argv[2]);
+ if (ax25_aton_entry(argv[optind + 1], axbind.fsa_ax25.sax25_call.ax25_call) == -1) {
+ sprintf(buffer, "ERROR: invalid callsign - %s\r", argv[optind + 1]);
err(buffer);
}
- if (ax25_aton_arglist(argv + 3, &axconnect) == -1) {
+ if (ax25_aton_arglist(argv + optind + 2, &axconnect) == -1) {
sprintf(buffer, "ERROR: invalid destination callsign or digipeater\r");
err(buffer);
}
@@ -96,8 +116,8 @@ int main(int argc, char **argv)
err(buffer);
}
- sprintf(buffer, "Connecting to %s ...\r", argv[3]);
- write(STDOUT_FILENO, buffer, strlen(buffer));
+ sprintf(buffer, "Connecting to %s ...\r", argv[optind + 2]);
+ user_write(STDOUT_FILENO, buffer, strlen(buffer));
/*
* If no response in 30 seconds, go away.
@@ -134,34 +154,14 @@ int main(int argc, char **argv)
alarm(0);
strcpy(buffer, "*** Connected\r");
- write(STDOUT_FILENO, buffer, strlen(buffer));
+ user_write(STDOUT_FILENO, buffer, strlen(buffer));
- /*
- * Loop until one end of the connection goes away.
- */
- for (;;) {
- FD_ZERO(&read_fd);
- FD_SET(STDIN_FILENO, &read_fd);
- FD_SET(s, &read_fd);
-
- select(s + 1, &read_fd, NULL, NULL, NULL);
-
- if (FD_ISSET(s, &read_fd)) {
- if ((n = read(s, buffer, 512)) == -1) {
- strcpy(buffer, "\r*** Disconnected\r");
- err(buffer);
- }
- write(STDOUT_FILENO, buffer, n);
- }
+ select_loop(s);
- if (FD_ISSET(STDIN_FILENO, &read_fd)) {
- if ((n = read(STDIN_FILENO, buffer, 512)) == -1) {
- close(s);
- break;
- }
- write(s, buffer, n);
- }
- }
+ strcpy(buffer, "\r*** Disconnected\r");
+ user_write(STDOUT_FILENO, buffer, strlen(buffer));
+
+ end_compress();
return 0;
}