From 0104e542e17ea00ff3a0b873fe41124ddfbf5e32 Mon Sep 17 00:00:00 2001 From: damage Date: Sun, 21 Jan 2024 12:47:01 +0100 Subject: [PATCH] split network code into extra file --- .gitignore | 1 + Makefile | 2 +- command.c | 71 +++++++-------------------------------------------- network.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ network.h | 9 +++++++ 5 files changed, 95 insertions(+), 63 deletions(-) create mode 100644 .gitignore create mode 100644 network.c create mode 100644 network.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e660fd9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +bin/ diff --git a/Makefile b/Makefile index dd52620..43a92fa 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ BIN=bin all: dirs command command: command.c - gcc -o ${BIN}/command command.c + gcc -o ${BIN}/command network.c command.c .PHONY: clean dirs clean: diff --git a/command.c b/command.c index 4a96012..bb20b28 100644 --- a/command.c +++ b/command.c @@ -2,52 +2,10 @@ #include #include -#include -#include // BSD compatible -#include -#include - -#include -#include - -#define SERVER "::1" -#define PORT 49000 - -#define COMMAND_BUFFER 256 - -char* printable(char *str) { - char *ret = strdup(str); - - for (int i = strlen(ret); i >= 0; i--) { - if (ret[i] == '\r' || ret[i] == '\n') { - ret[i] = '\0'; - } - } - - return ret; -} - -void sendCommand(int sock, char *cmd) { - char bytesToSend[COMMAND_BUFFER]; - memset(bytesToSend, 0, COMMAND_BUFFER); - - strcpy(&bytesToSend[0], "CMND"); - strcpy(&bytesToSend[5], cmd); - - int numBytesSend = send(sock, bytesToSend, 5 + strlen(cmd), 0); - if (numBytesSend >= 0) { - //printf("Send %d bytes to %s:%d: %s\n", numBytesSend, SERVER, PORT, printable(bytesToSend)); - } else { - fprintf(stderr, "Failed to send message to %s:%d (%d): %s", SERVER, PORT, errno, strerror(errno)); - exit(EXIT_FAILURE); - } -} +#include "network.h" int main(int argc, char *argv[]) { - int xplaneSocket; - struct sockaddr_in6 xplaneAddress; - - int err; + int xPlaneSocket; // check argument if (argc != 2) { @@ -55,29 +13,18 @@ int main(int argc, char *argv[]) { exit(EXIT_FAILURE); } - // create socket - xplaneSocket = socket(AF_INET6, SOCK_DGRAM, 0); - if (xplaneSocket == -1) { - fprintf(stderr, "Error creating socket (%d): %s\n", errno, strerror(errno)); - exit(EXIT_FAILURE); - } - - // prepare address struct - xplaneAddress.sin6_family = AF_INET6; - xplaneAddress.sin6_port = htons(PORT); - inet_pton(AF_INET6, SERVER, &xplaneAddress.sin6_addr.s6_addr); - - // connect to xplane - err = connect(xplaneSocket, (struct sockaddr *)&xplaneAddress, sizeof(xplaneAddress)); - if (err) { - fprintf(stderr, "Error connecting %s:%d (%d): %s\n", SERVER, PORT, err, gai_strerror(err)); + // network + xPlaneSocket = connectXPlane(SERVER, PORT); + if (xPlaneSocket < 0) { exit(EXIT_FAILURE); } // send payload - sendCommand(xplaneSocket, argv[1]); + if (sendCommand(xPlaneSocket, argv[1]) < 0) { + exit(EXIT_FAILURE); + } // bye bye (and no, I don't care about error anymore; I'll exit anyway?!) - close(xplaneSocket); + disconnectXPlane(xPlaneSocket); exit(EXIT_SUCCESS); } diff --git a/network.c b/network.c new file mode 100644 index 0000000..7f4d38e --- /dev/null +++ b/network.c @@ -0,0 +1,75 @@ +#include +#include +#include + +#include +#include // BSD compatible +#include +#include + +#include +#include + +#include "network.h" + +char* printable(char *str) { + char *ret = strdup(str); + + for (int i = strlen(ret); i >= 0; i--) { + if (ret[i] == '\r' || ret[i] == '\n') { + ret[i] = '\0'; + } + } + + return ret; +} + +int sendCommand(int sock, char *cmd) { + char bytesToSend[COMMAND_BUFFER]; + memset(bytesToSend, 0, COMMAND_BUFFER); + + strcpy(&bytesToSend[0], "CMND"); + strcpy(&bytesToSend[5], cmd); + + int numBytesSend = send(sock, bytesToSend, 5 + strlen(cmd), 0); + if (numBytesSend >= 0) { + //printf("Send %d bytes to %s:%d: %s\n", numBytesSend, SERVER, PORT, printable(bytesToSend)); + return numBytesSend; + } else { + fprintf(stderr, "Failed to send message to %s:%d (%d): %s", SERVER, PORT, errno, strerror(errno)); + return -1; + } +} + +int connectXPlane(char *addr, int port) { + int xPlaneSocket; + struct sockaddr_in6 xPlaneAddress; + + int err; + + // create socket + xPlaneSocket = socket(AF_INET6, SOCK_DGRAM, 0); + if (xPlaneSocket == -1) { + fprintf(stderr, "Error creating socket (%d): %s\n", errno, strerror(errno)); + return -1; + } + + // prepare address struct + xPlaneAddress.sin6_family = AF_INET6; + xPlaneAddress.sin6_port = htons(PORT); + inet_pton(AF_INET6, SERVER, &xPlaneAddress.sin6_addr.s6_addr); + + // connect to xPlane + err = connect(xPlaneSocket, (struct sockaddr *)&xPlaneAddress, sizeof(xPlaneAddress)); + if (err) { + fprintf(stderr, "Error connecting %s:%d (%d): %s\n", SERVER, PORT, err, gai_strerror(err)); + return -1; + } + + return xPlaneSocket; +} + +int disconnectXPlane(int sock) { + // bye bye (and no, I don't care about error anymore; I'll exit anyway?!) + close(sock); +} diff --git a/network.h b/network.h new file mode 100644 index 0000000..5b80f1f --- /dev/null +++ b/network.h @@ -0,0 +1,9 @@ +#define SERVER "::1" +#define PORT 49000 + +#define COMMAND_BUFFER 256 + +char* printable(char *str); +int sendCommand(int sock, char *cmd); +int connectXPlane(char *addr, int port); +int disconnectXPlane(int sock);