Skip to content
Snippets Groups Projects
Select Git revision
  • 89c20c9599dd3aade2c057b436f2a10601efd14b
  • main default
2 results

rsh_cli.c

Blame
  • rsh_cli.c 1.77 KiB
    
    #include "rshlib.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    
    
    int start_client(char *server_ip, int port) {
        int sock;
        struct sockaddr_in server;
    
        // Create socket
        sock = socket(AF_INET, SOCK_STREAM, 0);
        if (sock == -1) {
            perror("[ERROR] Could not create socket");
            return ERR_RDSH_CLIENT;
        }
    
        server.sin_addr.s_addr = inet_addr(server_ip);
        server.sin_family = AF_INET;
        server.sin_port = htons(port);
    
        // Connect to server
        if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) {
            perror("[ERROR] Connection failed");
            return ERR_RDSH_CLIENT;
        }
    
        printf("[DEBUG] Connected to server at %s:%d\n", server_ip, port);
        return sock;
    }
    
    /**
     * Main loop for remote command execution.
     */
    int exec_remote_cmd_loop(char *address, int port) {
        int sock = start_client(address, port);
        if (sock < 0) return sock;
    
        char cmd[RDSH_COMM_BUFF_SZ];
        while (1) {
            printf("dsh4> ");
            if (fgets(cmd, sizeof(cmd), stdin) == NULL) {
                printf("\n");
                break;
            }
            cmd[strcspn(cmd, "\n")] = '\0';
    
            if (strcmp(cmd, "exit") == 0) {
                break;
            }
    
            // Send command to server
            if (send(sock, cmd, strlen(cmd) + 1, 0) < 0) {
                perror("[ERROR] Send failed");
                break;
            }
    
            // Receive output
            char response[RDSH_COMM_BUFF_SZ];
            int recv_size;
            while ((recv_size = recv(sock, response, sizeof(response), 0)) > 0) {
                response[recv_size] = '\0';
                printf("%s", response);
                if (response[recv_size - 1] == RDSH_EOF_CHAR) break;
            }
        }
    
        close(sock);
        return OK;
    }