#include #include #include #include #include #include #include #include #include #define PORT 9000 #define HOST "127.0.0.1" #define BUF_SIZE 2048 int cfd; /* Signal Handler for SIGINT */ void sigintHandler(int sig_num) { errno = 0; if (fcntl(cfd, F_GETFD) != -1 || errno != EBADF) { write(cfd, "exit\n", 6); close(cfd); } printf("Terminating client\n"); fflush(stdout); exit(-1); } static inline void die(const char *msg) { perror(msg); exit(-1); } int write_all(int sock, char *buffer, int size) { int nwrite, sent = 0; while (sent < size) { if ((nwrite = write(sock, buffer + sent, size - sent)) < 0) { perror("Write"); exit(1); } sent += nwrite; } return sent; } void send_file(int server_fd, char *path) { char buffer[512]; int file_fd; if ((file_fd = open(path, O_RDONLY)) == -1) { perror("Open"); } FILE *file = fdopen(file_fd, "r"); fseek(file, 0L, SEEK_END); long int sz = ftell(file); fseek(file, 0L, SEEK_SET); int length = snprintf(NULL, 0, "%ld", sz); char msg[length + 1 + 3]; sprintf(msg, "< "); //printf("[C] awaiting command\n"); if ((length = getline(&line, &cap, stdin)) < 0) { fprintf(stderr, "Failed to read from STDIN"); fflush(stderr); exit(-1); } if (strspn(line, " \n\t") == strlen(line)) { // skip empty lines - empty being just spaces or tabs continue; } char cmd[4]; char path[BUF_SIZE - 3]; memcpy(cmd, line, 3); cmd[3] = 0; memcpy(path, line + 4, BUF_SIZE - 4); path[strlen(path) - 1] = 0; printf("cmd: \"%s\"\n", cmd); printf("path: \"%s\"\n", path); if (strcmp(cmd, "put") == 0) { if (strlen(path) == 0) { fprintf(stderr, "path missing\n"); } else { printf("got put with %s\n", path); send_file(cfd, path); } free(line); line = NULL; continue; } strncpy(buf, line, strlen(line) + 1); //printf("[C] pre send: \"%s\"\n", buf); if (write(cfd, buf, strlen(line)) < 0) die("Could not send message"); if (strcmp(line, "exit\n") == 0) { free(line); line = NULL; break; } if (read(cfd, buf, BUF_SIZE) < 0) die("Could not receive message"); printf("%s", buf); memset(buf, 0, BUF_SIZE); free(line); line = NULL; } close(cfd); return 0; }