FreeCalypso > hg > themwi-system-sw
diff smpp-trx-sa/main.c @ 222:9d6e8d99d2b1
smpp-trx-sa: new program
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 03 Aug 2023 21:13:41 -0800 |
parents | |
children | a375639e4190 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/smpp-trx-sa/main.c Thu Aug 03 21:13:41 2023 -0800 @@ -0,0 +1,88 @@ +/* + * This C file is the main module for smpp-trx-sa - a standalone bind_trx + * client (ESME role) that writes all incoming messages into a log file + * and also allows outgoing messages to be sent via a UNIX domain local + * socket (datagram). + */ + +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/errno.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include <time.h> +#include <unistd.h> + +extern int tcpsock, localsock; + +FILE *logF; +time_t curtime; +int init_done; + +main(argc, argv) + char **argv; +{ + struct sockaddr_in server_sin; + fd_set fds; + int max_fd, rc; + + if (argc != 6) { + fprintf(stderr, + "usage: %s server-ip system-id password log-file socket-pathname\n", + argv[0]); + exit(1); + } + server_sin.sin_family = AF_INET; + server_sin.sin_addr.s_addr = inet_addr(argv[1]); + if (server_sin.sin_addr.s_addr == INADDR_NONE) { + fprintf(stderr, "error: invalid IP address argument \"%s\"\n", + argv[1]); + exit(1); + } + server_sin.sin_port = htons(2775); + if (strlen(argv[2]) > 15) { + fprintf(stderr, "error: system-id string is too long\n"); + exit(1); + } + if (strlen(argv[3]) > 8) { + fprintf(stderr, "error: password string is too long\n"); + exit(1); + } + logF = fopen(argv[4], "a"); + if (!logF) { + perror(argv[4]); + exit(1); + } + create_local_socket(argv[5]); + max_fd = localsock; + open_tcp_conn(&server_sin); + if (tcpsock > max_fd) + max_fd = tcpsock; + time(&curtime); + send_bind_req(argv[2], argv[3]); + init_done = 1; + /* main select loop */ + for (;;) { + FD_ZERO(&fds); + FD_SET(tcpsock, &fds); + FD_SET(localsock, &fds); + rc = select(max_fd+1, &fds, 0, 0, 0); + if (rc < 0) { + if (errno == EINTR) + continue; + perror("select"); + log_fatal_error("select syscall error"); + exit(1); + } + time(&curtime); + if (FD_ISSET(tcpsock, &fds)) + tcpsock_select_handler(); + if (FD_ISSET(localsock, &fds)) + localsock_select_handler(); + fflush(logF); + } +}