From 1bbc9dc01df65d5b478fc58c4db4420445f352d8 Mon Sep 17 00:00:00 2001 From: Thomas Walker Lynch Date: Mon, 25 Nov 2024 09:48:38 +0000 Subject: [PATCH] development cp --- developer/C/server.cli.c | 30 ---- developer/a.out | Bin 21800 -> 0 bytes developer/cc/hello.cli.c | 16 ++ developer/cc/hello.lib.c | 84 +++++++++ developer/cc/server.cli.c | 72 ++++++++ developer/cc/server.lib.c | 161 ++++++++++++++++++ developer/{C => deprecated}/server.lib.c | 50 +++--- developer/mockup/subu_server_home/hello | Bin 0 -> 21368 bytes developer/mockup/subu_server_home/server | Bin 0 -> 23272 bytes developer/mockup/subu_server_home/server.log | 7 + .../mockup/subu_server_home/server_test.log | 0 developer/mockup/subu_server_home/todo.txt | 10 ++ developer/tool/makefile | 15 +- 13 files changed, 385 insertions(+), 60 deletions(-) delete mode 100644 developer/C/server.cli.c delete mode 100755 developer/a.out create mode 100644 developer/cc/hello.cli.c create mode 100644 developer/cc/hello.lib.c create mode 100644 developer/cc/server.cli.c create mode 100644 developer/cc/server.lib.c rename developer/{C => deprecated}/server.lib.c (50%) create mode 100755 developer/mockup/subu_server_home/hello create mode 100755 developer/mockup/subu_server_home/server create mode 100644 developer/mockup/subu_server_home/server.log create mode 100644 developer/mockup/subu_server_home/server_test.log create mode 100644 developer/mockup/subu_server_home/todo.txt diff --git a/developer/C/server.cli.c b/developer/C/server.cli.c deleted file mode 100644 index 78a56ee..0000000 --- a/developer/C/server.cli.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - * This command implements a simple Unix domain socket server. - * - * Usage: - * server - * - * Description: - * This program creates a Unix domain socket at the specified path - * (defined in `server.lib.c`) and listens for incoming connections. - * When a client sends data, the server logs it to a file and echoes - * a receipt. The server runs until interrupted or an error occurs. - * - * Command-line Options and Arguments: - * None: The program is self-contained and does not accept any - * command-line arguments. All configuration is handled within - * the implementation. - */ - -#define IFACE -#include -#include -#include "server.lib.c" - -int main(int argc, char *argv[]) { - (void)argc; // Suppress unused variable warnings - (void)argv; - - // Call the core server function - return Server·run(); -} diff --git a/developer/a.out b/developer/a.out deleted file mode 100755 index 771510f461295db1fc4db436413c48f0f4f64252..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21800 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 diff --git a/developer/cc/hello.cli.c b/developer/cc/hello.cli.c new file mode 100644 index 0000000..979b5b8 --- /dev/null +++ b/developer/cc/hello.cli.c @@ -0,0 +1,16 @@ +/* + Sends "hello" to `subu_server.sock` +*/ + +#define IFACE +#include +#include +#include "hello.lib.c" + +int main(int argc, char *argv[]) { + (void)argc; // Suppress unused variable warnings + (void)argv; + + // Call the core server function + return Hello·run(); +} diff --git a/developer/cc/hello.lib.c b/developer/cc/hello.lib.c new file mode 100644 index 0000000..27acf6d --- /dev/null +++ b/developer/cc/hello.lib.c @@ -0,0 +1,84 @@ +#ifndef IFACE +#define Hello·IMPLEMENTATION +#define IFACE +#endif + +#ifndef Hello·IFACE +#define Hello·IFACE + + // Necessary interface includes + #include + #include + #include + + // Interface prototypes + int Hello·run(); + +#endif // Hello·IFACE + +#ifdef Hello·IMPLEMENTATION + + // Implementation-specific includes + #include + #include + #include + #include + #include + + // Constants + #define Hello·SOCKET_PATH "/var/user_data/Thomas-developer/subu/developer/mockup/subu_server_home/subu_server.sock" + #define Hello·LOG_PATH "server_test.log" + #define Hello·BUFFER_SIZE 256 + + int Hello·run(){ + int client_fd; + struct sockaddr_un address; + char buffer[Hello·BUFFER_SIZE]; + FILE *log_file; + + // Open the log file + log_file = fopen(Hello·LOG_PATH ,"a+"); + if( log_file == NULL ){ + perror("Hello·run:: error opening log file"); + return EXIT_FAILURE; + } + + client_fd = socket(AF_UNIX ,SOCK_STREAM ,0); + if( client_fd == -1 ){ + perror("Hello·run:: error opening socket"); + fclose(log_file); + return EXIT_FAILURE; + } + + // Configure server socket address + memset(&address ,0 ,sizeof(address)); + address.sun_family = AF_UNIX; + strncpy(address.sun_path ,Hello·SOCKET_PATH ,sizeof(address.sun_path) - 1); + + // Connect to the server + if( connect(client_fd ,(struct sockaddr *)&address ,sizeof(address)) == -1 ){ + perror("Hello·run:: error connecting to server"); + fclose(log_file); + close(client_fd); + return EXIT_FAILURE; + } + + // Send message to the server + char *out_buf = "hello\n"; + if( write(client_fd ,out_buf ,strlen(out_buf)) == -1 ){ + perror("Hello·run:: error writing to server"); + fclose(log_file); + close(client_fd); + return EXIT_FAILURE; + } + + printf("Hello·run:: sent \"%s\"\n" ,out_buf); + + // Clean up + fclose(log_file); + close(client_fd); + + return EXIT_SUCCESS; + } + +#endif // Hello·IMPLEMENTATION diff --git a/developer/cc/server.cli.c b/developer/cc/server.cli.c new file mode 100644 index 0000000..04bceae --- /dev/null +++ b/developer/cc/server.cli.c @@ -0,0 +1,72 @@ +/* + The subu server command line interface. + + Usage: + server [-s ] [-l ] [arguments...] + + Options: + -s Specify the Unix socket file path. Default: ./socket + -l Specify the log file path. Default: ./log.txt +*/ + +#define IFACE +#include +#include +#include +#include +#include "server.lib.c" + +// Define defaults +#define DEFAULT_SOCKET_PATH "socket" +#define DEFAULT_LOG_PATH "log.txt" + +int main( int argc ,char *argv[] ){ + char *socket_path = DEFAULT_SOCKET_PATH; + char *log_path = DEFAULT_LOG_PATH; + int error_flag = 0; // Flag to track errors + + // Parse options + int opt; + while( (opt = getopt(argc ,argv ,"s:l:")) != -1 ){ + switch( opt ){ + case 's': + socket_path = optarg; + break; + case 'l': + log_path = optarg; + break; + case '?': // Unknown option + fprintf( stderr ,"Error: Unknown option '-%c'\n" ,optopt ); + error_flag = 1; + break; + case ':': // Missing argument + fprintf( stderr ,"Error: Missing argument for '-%c'\n" ,optopt ); + error_flag = 1; + break; + } + } + + // Check for too many arguments + if( optind > argc - 1 ){ + fprintf( stderr ,"Error: Too many arguments provided.\n" ); + error_flag = 1; + } + + // Exit on error after processing all options + if( error_flag ){ + fprintf( stderr ,"Usage: %s [-s ] [-l ] [arguments...]\n" ,argv[0] ); + return EXIT_FAILURE; + } + + // Rebase argv to prepare for run + argv[optind - 1] = argv[0]; // Program name at the new base + argc -= (optind - 1); + argv += (optind - 1); + + // Log parsed options + printf( "Socket Path: %s\n" ,socket_path ); + printf( "Log Path: %s\n" ,log_path ); + + // Call the core server function with the rebased arguments + return Server·run(argv ,argc ,socket_path ,log_path); +} diff --git a/developer/cc/server.lib.c b/developer/cc/server.lib.c new file mode 100644 index 0000000..31a683b --- /dev/null +++ b/developer/cc/server.lib.c @@ -0,0 +1,161 @@ +#ifndef IFACE +#define Server·IMPLEMENTATION +#define IFACE +#endif + +#ifndef Server·IFACE +#define Server·IFACE + + // Interface prototype + int Server·run(); + +#endif // Server·IFACE + +#ifdef Server·IMPLEMENTATION + + // Implementation-specific includes + #include + #include + #include + #include + #include // Ensure full definition of struct ucred + #include + #include + #include + #include + #include + + // Type alias for ucred + typedef struct ucred ucred_t; + + // Constants + #define Server·SOCKET_PATH "/var/user_data/Thomas-developer/subu/developer/mockup/subu_server_home/subu_server.sock" + #define Server·LOG_PATH "server.log" + #define Server·BUFFER_SIZE 256 + #define MAX_ARGC 16 + + // Internal function prototypes + static void parse(const ucred_t *client_cred, const char *input_line); + static void hello(const ucred_t *client_cred, int argc, char *argv[]); + + int Server·run(){ + int server_fd, client_fd; + struct sockaddr_un address; + char buffer[Server·BUFFER_SIZE]; + FILE *log_file; + + log_file = fopen(Server·LOG_PATH, "a+"); + if(log_file == NULL) { + perror("Server·run:: error opening log file"); + return EXIT_FAILURE; + } + + if((server_fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { + perror("Server·run:: error creating socket"); + fclose(log_file); + return EXIT_FAILURE; + } + + memset(&address, 0, sizeof(address)); + address.sun_family = AF_UNIX; + strncpy(address.sun_path, Server·SOCKET_PATH, sizeof(address.sun_path) - 1); + + unlink(Server·SOCKET_PATH); + if(bind(server_fd, (struct sockaddr *)&address, sizeof(address)) == -1) { + perror("Server·run:: error binding socket"); + fclose(log_file); + close(server_fd); + return EXIT_FAILURE; + } + + if(listen(server_fd, 5) == -1) { + perror("Server·run:: error listening on socket"); + fclose(log_file); + close(server_fd); + return EXIT_FAILURE; + } + + printf("Server·run:: server running, waiting for connections...\n"); + + while((client_fd = accept(server_fd, NULL, NULL)) != -1) { + ucred_t client_cred; + socklen_t len = sizeof(client_cred); + + if(getsockopt(client_fd, SOL_SOCKET, SO_PEERCRED, &client_cred, &len) == -1) { + perror("Server·run:: error getting client credentials"); + close(client_fd); + continue; + } + + // Log client credentials + fprintf(log_file, "Connection from PID=%d, UID=%d, GID=%d\n", + client_cred.pid, client_cred.uid, client_cred.gid); + fflush(log_file); + + ssize_t bytes_read; + memset(buffer, 0, Server·BUFFER_SIZE); + bytes_read = read(client_fd, buffer, Server·BUFFER_SIZE - 1); + if(bytes_read > 0) { + printf("Server·run:: received: %s\n", buffer); + fprintf(log_file, "Received: %s\n", buffer); + fflush(log_file); + + char *line = strtok(buffer, "\n"); + while(line != NULL) { + parse(&client_cred, line); + line = strtok(NULL, "\n"); + } + } else if(bytes_read == -1) { + perror("Server·run:: error reading from client"); + } + + close(client_fd); + } + + perror("Server·run:: error accepting connection"); + fclose(log_file); + close(server_fd); + unlink(Server·SOCKET_PATH); + + return EXIT_FAILURE; + } + + // Parse a single input line and dispatch to the appropriate command + static void parse(const ucred_t *client_cred, const char *input_line) { + char *argv[MAX_ARGC + 1] = {0}; + int argc = 0; + + char *line_copy = strdup(input_line); + if(!line_copy) { + perror("parse:: memory allocation failed"); + return; + } + + char *token = strtok(line_copy, " "); + while(token != NULL && argc < MAX_ARGC) { + argv[argc++] = token; + token = strtok(NULL, " "); + } + + if(argc > 0) { + if(strcmp(argv[0], "hello") == 0) { + hello(client_cred, argc, argv); + }else{ + fprintf(stderr, "Unknown command: %s\n", argv[0]); + } + } + + free(line_copy); + } + + // Example command: hello + static void hello(const ucred_t *client_cred, int argc, char *argv[]) { + printf("hello:: invoked by PID=%d, UID=%d, GID=%d\n", + client_cred->pid, client_cred->uid, client_cred->gid); + printf("hello:: arguments:\n"); + for (int i = 1; i < argc; ++i) { + printf(" Arg %d: %s\n", i, argv[i]); + } + } + +#endif // Server·IMPLEMENTATION diff --git a/developer/C/server.lib.c b/developer/deprecated/server.lib.c similarity index 50% rename from developer/C/server.lib.c rename to developer/deprecated/server.lib.c index 144c3de..baf5469 100644 --- a/developer/C/server.lib.c +++ b/developer/deprecated/server.lib.c @@ -26,72 +26,74 @@ #include // Constants - #define Server·SOCKET_PATH "mockup/subu_server_home/subu_server.sock" - #define Server·LOG_PATH "mockup/subu_server_home/server.log" + #define Server·SOCKET_PATH "/var/user_data/Thomas-developer/subu/developer/mockup/subu_server_home/subu_server.sock" + #define Server·LOG_PATH "server.log" #define Server·BUFFER_SIZE 256 - int Server·run() { - int server_fd, client_fd; + int Server·run(){ + int server_fd ,client_fd; struct sockaddr_un address; char buffer[Server·BUFFER_SIZE]; FILE *log_file; // Open the log file - log_file = fopen(Server·LOG_PATH, "a"); - if (log_file == NULL) { - perror("Error opening log file"); + log_file = fopen(Server·LOG_PATH ,"a+"); + if( log_file == NULL ){ + perror("Server·run:: error opening log file"); return EXIT_FAILURE; } // Create the socket - if ((server_fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { - perror("Error creating socket"); + if( (server_fd = socket(AF_UNIX ,SOCK_STREAM ,0)) == -1 ){ + perror("Server·run:: error creating socket"); fclose(log_file); return EXIT_FAILURE; } // Configure socket address - memset(&address, 0, sizeof(address)); + memset(&address ,0 ,sizeof(address)); address.sun_family = AF_UNIX; - strncpy(address.sun_path, Server·SOCKET_PATH, sizeof(address.sun_path) - 1); + strncpy(address.sun_path ,Server·SOCKET_PATH ,sizeof(address.sun_path) - 1); // Bind the socket unlink(Server·SOCKET_PATH); // Remove existing file if present - if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) == -1) { - perror("Error binding socket"); + if( bind(server_fd ,(struct sockaddr *)&address ,sizeof(address)) == -1 ){ + perror("Server·run:: error binding socket"); fclose(log_file); close(server_fd); return EXIT_FAILURE; } // Listen for connections - if (listen(server_fd, 5) == -1) { - perror("Error listening on socket"); + if( listen(server_fd ,5) == -1 ){ + perror("Server·run:: error listening on socket"); fclose(log_file); close(server_fd); return EXIT_FAILURE; } - printf("Server running, waiting for connections...\n"); + printf("Server·run:: server running, waiting for connections...\n"); // Accept and handle client connections - while ((client_fd = accept(server_fd, NULL, NULL)) != -1) { + while( (client_fd = accept(server_fd ,NULL ,NULL)) != -1 ){ ssize_t bytes_read; + printf("Server·run:: connection made!\n"); - memset(buffer, 0, Server·BUFFER_SIZE); - bytes_read = read(client_fd, buffer, Server·BUFFER_SIZE - 1); - if (bytes_read > 0) { - fprintf(log_file, "Received: %s\n", buffer); + memset(buffer ,0 ,Server·BUFFER_SIZE); + bytes_read = read(client_fd ,buffer ,Server·BUFFER_SIZE - 1); + if( bytes_read > 0 ){ + printf("Server·run:: connection said: %s\n" ,buffer); + fprintf(log_file ,"Received: %s\n" ,buffer); fflush(log_file); - } else if (bytes_read == -1) { - perror("Error reading from client"); + } else if( bytes_read == -1 ){ + perror("Server·run:: error reading from client"); } close(client_fd); } // Clean up - perror("Error accepting connection"); + perror("Server·run:: error accepting connection"); fclose(log_file); close(server_fd); unlink(Server·SOCKET_PATH); diff --git a/developer/mockup/subu_server_home/hello b/developer/mockup/subu_server_home/hello new file mode 100755 index 0000000000000000000000000000000000000000..5a6d61d6555c20c91b4eae68dab896b49b1111c2 GIT binary patch literal 21368 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 gh|=)Fpaddc;oQ`#qL7J%`hmd# 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 VEDzHKB9iqF8