summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkutayboz <kutayboz@gmail.com>2023-05-11 01:06:24 +0300
committerkutayboz <kutayboz@gmail.com>2023-05-11 01:06:24 +0300
commitfd0e1fe6caaefb8fbaf1d8dd027648227f6015b1 (patch)
treea4ab1e9f6360a757e741c8f6e4c3aef5f6d7bf0f
parent9f99c88628fbfcad96f38de9a86bb7f770d36497 (diff)
downloadcelnetmon-fd0e1fe6caaefb8fbaf1d8dd027648227f6015b1.tar.gz
Initial push of the local tree
-rw-r--r--.gitignore2
-rw-r--r--Makefile15
-rw-r--r--src/main.c142
3 files changed, 159 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e1f5cb3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+.vscode
+bin/ \ No newline at end of file
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..c2ec3a2
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,15 @@
+CFLAGS=-Wall -Wextra -Werror -pedantic-errors -ansi
+CFLAGS_DEBUG=${CFLAGS} -g -O0
+CFLAGS_RELEASE=${CFLAGS} -O2
+
+release: src/main.c clean mkBinDir
+ gcc ${CFLAGS_RELEASE} -o bin/network_monitor $<
+
+debug: src/main.c clean mkBinDir
+ gcc ${CFLAGS_DEBUG} -o bin/network_monitor $<
+
+mkBinDir:
+ mkdir -p bin
+
+clean:
+ rm -rf bin
diff --git a/src/main.c b/src/main.c
new file mode 100644
index 0000000..c041563
--- /dev/null
+++ b/src/main.c
@@ -0,0 +1,142 @@
+#include <bits/types/time_t.h>
+#include <errno.h> /* strerror() */
+#include <fcntl.h> /* O_RDWR */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <termios.h>
+#include <time.h>
+#include <unistd.h> /* write(), read(), close() */
+
+int openSerialPort(char pathToPort[], int baudRate) {
+
+ static int serialPort;
+ struct termios serialTerminal;
+
+ serialPort = open(pathToPort, O_RDWR);
+ if (serialPort < 0) {
+ printf("Error open(): %s\n", strerror(errno));
+ return -1;
+ }
+
+ if (tcgetattr(serialPort, &serialTerminal) != 0) {
+ printf("Error tcgetattr(): %s\n", strerror(errno));
+ return -1;
+ }
+
+ serialTerminal.c_cflag |= CREAD;
+
+ /* serialTerminal.c_iflag &= ~(BRKINT | IGNBRK | INLCR | IGNCR | ICRNL | IXOFF
+ | IUTF8 | IUCLC | IXANY | IMAXBEL); */
+ serialTerminal.c_iflag &=
+ ~(IGNBRK | BRKINT | INLCR | IGNCR | ICRNL | IXON | IXOFF | IUCLC | IXANY |
+ IMAXBEL | IGNPAR | PARMRK | INPCK | ISTRIP);
+
+ /* serialTerminal.c_lflag &= ~(ECHO | ECHONL | NOFLSH | ISIG | TOSTOP | ICANON
+ | IEXTEN | ECHOE | ECHOK); */
+ serialTerminal.c_lflag &= ~(ICANON | ISIG | ECHO | ECHONL | ECHOE | ECHOK);
+
+ /* serialTerminal.c_oflag &=
+ ~(OLCUC | OCRNL | OPOST | OFILL | ONLCR | ONOCR | ONLRET | OFDEL); */
+ serialTerminal.c_oflag &= ~(OPOST);
+
+ serialTerminal.c_cc[VTIME] = 0;
+ serialTerminal.c_cc[VMIN] = 0;
+
+ cfsetispeed(&serialTerminal, baudRate);
+ cfsetospeed(&serialTerminal, baudRate);
+
+ if (tcsetattr(serialPort, TCSANOW, &serialTerminal) != 0) {
+ printf("Error tcsetattr(): %s\n", strerror(errno));
+ close(serialPort);
+ return -1;
+ }
+
+ return serialPort;
+}
+
+int readSerialPort(int serialPort) {
+
+ time_t start;
+ int bytesRead, bufferFree, idx, returnCode, isEnd;
+ int bufferSize = sizeof(char) * 256; /* initial size in bytes */
+ char *buffer = calloc(256, sizeof(char));
+ const char *responseCodes[8] = {"\r\nOK\r\n", "\r\nCONNECT\r\n",
+ "\r\nRING\r\n", "\r\nNO CARRIER\r\n",
+ "\r\nERROR\r\n", "\r\nNO DIALTONE\r\n",
+ "\r\nBUSY\r\n", "\r\nNO ANSWER\r\n"};
+
+ bytesRead = bufferFree = bufferSize;
+ returnCode = isEnd = 0;
+ start = time(NULL);
+
+ while (!isEnd) {
+ if (bufferFree < 1) {
+ bufferSize += sizeof(char) * 256;
+ buffer = realloc(buffer, bufferSize);
+ if (buffer == NULL) {
+ printf("Error realloc(): %s\n", strerror(errno));
+ returnCode = 1;
+ break;
+ }
+ }
+ bytesRead = read(serialPort, buffer + bufferSize - bufferFree, bufferFree);
+ if (bytesRead < 0) {
+ printf("Error read(): %s\n", strerror(errno));
+ returnCode = 1;
+ break;
+ } else if (bytesRead > 0) {
+ bufferFree -= bytesRead;
+ start = time(NULL);
+ } else if (bytesRead == 0 && difftime(time(NULL), start) > 180) {
+ printf("Response timeout\n");
+ returnCode = 1;
+ break;
+ } else {
+ for (idx = 0; (long unsigned)idx <
+ sizeof(responseCodes) / sizeof(responseCodes[1]);
+ idx++) {
+ if (strstr(buffer, responseCodes[idx]) != NULL) {
+ isEnd = 1;
+ break;
+ }
+ }
+ }
+ }
+
+ printf("%s", buffer);
+ free(buffer);
+ return returnCode;
+}
+
+int main() {
+
+ int serialPort;
+
+ serialPort = openSerialPort("/dev/serial0", 115200);
+
+ if (write(serialPort, "AT\r", sizeof("AT\r")) < 0) {
+ printf("Error write(): %s\n", strerror(errno));
+ close(serialPort);
+ return 1;
+ }
+ readSerialPort(serialPort);
+
+ if (write(serialPort, "ATI\r", sizeof("ATI\r")) < 0) {
+ printf("Error write(): %s\n", strerror(errno));
+ close(serialPort);
+ return 1;
+ }
+ readSerialPort(serialPort);
+
+ if (write(serialPort, "AT+COPS?\r", sizeof("AT+COPS?\r")) < 0) {
+ printf("Error write(): %s\n", strerror(errno));
+ close(serialPort);
+ return 1;
+ }
+ readSerialPort(serialPort);
+
+ close(serialPort);
+
+ return 0;
+}