FreeCalypso > hg > themwi-system-sw
view smpp-trx-sa/main.c @ 267:81958b35f74d
NANP validation: allow made-up area codes of N9X form
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 13 Nov 2023 15:28:09 -0800 |
parents | 1bf989f60aa3 |
children |
line wrap: on
line source
/* * 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; char fmt_time[32]; int init_done; static void format_time() { struct tm *tm; tm = gmtime(&curtime); sprintf(fmt_time, "%d-%02d-%02dT%02d:%02d:%02dZ", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); } main(argc, argv) char **argv; { struct sockaddr_in server_sin; fd_set fds; int max_fd, rc; if (argc < 6 || argc > 7) { fprintf(stderr, "usage: %s server-ip system-id password log-file socket-pathname [enq-link]\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); } if (argv[6]) log_enquire_link_open(argv[6]); create_local_socket(argv[5]); max_fd = localsock; open_tcp_conn(&server_sin); if (tcpsock > max_fd) max_fd = tcpsock; time(&curtime); format_time(); 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); format_time(); if (FD_ISSET(tcpsock, &fds)) tcpsock_select_handler(); if (FD_ISSET(localsock, &fds)) localsock_select_handler(); fflush(logF); } }