int main() { signal(SIGINT, die); pid_t my_pid = getpid(); char server_fifo_name[500]; char my_read_fifo_name[500]; // server's write end char my_write_fifo_name[500]; // server's read end CREATE_SERVER_FIFO_NAME(server_fifo_name); fprintf(stderr, "%s\n", server_fifo_name); CREATE_CLIENT_READER_NAME(my_read_fifo_name, my_pid); CREATE_CLIENT_WRITER_NAME(my_write_fifo_name, my_pid); fprintf(stderr, "Client is writing to %s\n", my_write_fifo_name); fprintf(stderr, "Client is reading from %s\n", my_read_fifo_name); int server_pipe = open(server_fifo_name, O_RDWR); write(server_pipe, &my_pid, sizeof(pid_t)); close(server_pipe); int err = mkfifo(my_read_fifo_name, FIFO_PERMISSIONS); if (err) perror("Could not create fifo"); err = mkfifo(my_write_fifo_name, FIFO_PERMISSIONS); if (err) perror("Could not create fifo"); int my_read_fifo = open(my_read_fifo_name, O_RDWR); int my_write_fifo = open(my_write_fifo_name, O_RDWR); read_write_loop(my_read_fifo, my_write_fifo); close(my_read_fifo); close(my_write_fifo); remove(my_read_fifo_name); remove(my_write_fifo_name); }
void die(int sig) { // TODO: can this be done better? pid_t my_pid = getpid(); char my_read_fifo_name[500]; // server's write end char my_write_fifo_name[500]; // server's read end CREATE_CLIENT_READER_NAME(my_read_fifo_name, my_pid); CREATE_CLIENT_WRITER_NAME(my_write_fifo_name, my_pid); int my_write_fifo = open(my_write_fifo_name, O_RDWR); int exit_len = 5; write(my_write_fifo, &exit_len, sizeof(int)); write(my_write_fifo, "exit", exit_len); close(my_write_fifo); remove(my_read_fifo_name); remove(my_write_fifo_name); exit(0); }
void baby_server_read(int client_pid){ FILE* read_from; char reader[BUFFER], writer[BUFFER]; char* buffer = NULL; CREATE_CLIENT_READER_NAME(reader, client_pid); CREATE_CLIENT_WRITER_NAME(writer, client_pid); if((read_from = fopen(writer, "r+")) == NULL) fprintf(stderr,"%s\n", strerror(errno)); size_t len; ssize_t read; while((read=getline(&buffer, &len, read_from)) != -1){ if(strstr(buffer, "cd")){ if(strlen(buffer) >=4){ char cwd[BUFFER]; buffer[strlen(buffer)-1] = '\0'; fprintf(stderr, "%s\n", &buffer[3]); if(chdir(&buffer[3]) != 0) fprintf(stderr, "%s\n", strerror(errno)); sprintf(cwd, "Changed directory to %s\nexit\n", &buffer[3]); write_to_client(cwd, reader); } else{ char cwd[BUFFER]; chdir(getenv("HOME")); sprintf(cwd, "Changed directory to %s\nexit\n", getenv("HOME")); write_to_client(cwd, reader); } } if(strstr(buffer, "dir")){ char* little; FILE* dir = popen(CMD_LS_POPEN, "r"); size_t l_len = 0; ssize_t l_read; while((l_read=getline(&little, &l_len, dir)) != -1 && !feof(dir)){ write_to_client(little, reader); } write_to_client("exit\n", reader); fclose(dir); } if(strstr(buffer, "pwd")){ char cwd[BUFFER]; if(getcwd(cwd, sizeof(cwd)) != NULL){ write_to_client(cwd, reader); write_to_client("\n", reader); write_to_client("exit\n", reader); } } if(strstr(buffer, "help")){ write_to_client("Server-client:" "You are currently on a server spawned especially to help you!\n" "To restart the server, ctrl+c in the server's terminal\n" "To kill the client, ctrl+c in the client's terminal\n", reader); } if(strstr(buffer, "put")){ } if(strstr(buffer, "get")){ } if(strstr(buffer, "Terminate")){ fclose(read_from); exit(0); } } }
void *thread_func(void *arg) { char localpath[PATH_MAX] = {'\0'}; message_t *pids = (message_t *)arg; char mqRd[PATH_MAX] = {'\0'}; char mqWr[PATH_MAX] = {'\0'}; pid_t pid = (int)strtol(pids->command, NULL, 10); int s = 0; pthread_detach(pthread_self()); clients++; // printf("%d client connected\n", pid); CREATE_CLIENT_READER_NAME(mqRd, (int)pid); CREATE_CLIENT_WRITER_NAME(mqWr, (int)pid); free(pids); umask(0); s = pthread_mutex_lock(&mtx); if (s != 0) printf("Lock failed\n"); getcwd(localpath, sizeof(localpath)); s = pthread_mutex_unlock(&mtx); if (s != 0) printf("Unlock failed\n"); while (1) { mqd_t cwr, crd; message_t data; memset(&data, '\0', sizeof(data)); if ((cwr = mq_open(mqWr, O_RDONLY)) == -1) { printf("Open write queue failed!\n"); clients--; pthread_exit(EXIT_SUCCESS); } mq_receive(cwr, (char *)&data, sizeof(data), NULL); mq_close(cwr); if (strcmp(data.command, CMD_EXIT) == 0) { clients--; // printf("%d client exit\n", pid); pthread_exit(EXIT_SUCCESS); } else if (strcmp(data.command, CMD_REMOTE_CHDIR) == 0) { int ts; char local[PATH_MAX] = {'\0'}; char res[PATH_MAX] = {'\0'}; ts = pthread_mutex_lock(&mtx); if (ts != 0) printf("Lock failed\n"); getcwd(local, sizeof(local)); if (chdir(localpath) == -1) { printf("Cannot change directory\n"); continue; } if (chdir(data.payload) == -1) memcpy(res, "ERROR\n", strlen("ERROR\n")); else getcwd(res, sizeof(res)); memset(&data, '\0', sizeof(data)); memcpy(data.payload, res, strlen(res)); if (strcmp(res, "ERROR\n") != 0) { memset(localpath, '\0', sizeof(localpath)); memcpy(localpath, res, strlen(res)); } if ((crd = mq_open(mqRd, O_WRONLY)) == -1) { printf("Cannot open read queue\n"); continue; } mq_send(crd, (char *)&data, sizeof(data), 0); mq_close(crd); if (chdir(local) == -1) { printf("Cannot restore directory\n"); continue; } ts = pthread_mutex_unlock(&mtx); if (ts != 0) printf("Unlock failed\n"); }//cd else if (strcmp(data.command, CMD_REMOTE_DIR) == 0) { char cmd[PATH_MAX] = {'\0'}; FILE *fp; memcpy(cmd, CMD_LS_POPEN, strlen(CMD_LS_POPEN)); strcat(cmd, " "); strcat(cmd, localpath); if ((fp = popen(cmd, "r")) == NULL) { if ((crd = mq_open(mqRd, O_WRONLY)) == -1) { printf("Cannot open read queue\n"); continue; } memcpy(data.command, "ERROR\n", strlen("ERROR\n")); mq_send(crd, (char *)&data, sizeof(data), 0); mq_close(crd); } while (fgets(data.payload, sizeof(data.payload), fp) != NULL) { if ((crd = mq_open(mqRd, O_WRONLY)) == -1) { printf("Cannot open read queue\n"); continue; } data.message_type = MESSAGE_TYPE_DIR; mq_send(crd, (char *)&data, sizeof(data), 0); mq_close(crd); memset(&data, '\0', sizeof(data)); } memset(&data, '\0', sizeof(data)); data.message_type = MESSAGE_TYPE_DIR_END; if ((crd = mq_open(mqRd, O_WRONLY)) == -1) { printf("Cannot open read queue\n"); continue; } mq_send(crd, (char *)&data, sizeof(data), 0); mq_close(crd); }//dir else if (strcmp(data.command, CMD_REMOTE_PWD) == 0) { memset(&data, '\0', sizeof(data)); memcpy(data.payload, localpath, strlen(localpath)); if ((crd = mq_open(mqRd, O_WRONLY)) == -1) { printf("Cannot open read queue\n"); continue; } mq_send(crd, (char *)&data, sizeof(data), 0); mq_close(crd); }//pwd else if (strcmp(data.command, CMD_REMOTE_HOME) == 0) { memset(&data, '\0', sizeof(data)); memset(localpath, '\0', sizeof(localpath)); memcpy(localpath, getenv("HOME"), strlen(getenv("HOME"))); memcpy(data.payload, localpath, strlen(localpath)); if ((crd = mq_open(mqRd, O_WRONLY)) == -1) { printf("Cannot open read queue\n"); continue; } mq_send(crd, (char *)&data, sizeof(data), 0); mq_close(crd); }//home else if (strcmp(data.command, CMD_PUT) == 0) { int fd = 0; int ts = 0; char local[PATH_MAX] = {'\0'}; ts = pthread_mutex_lock(&mtx); getcwd(local, sizeof(local)); chdir(localpath); fd = open(basename(data.payload), SEND_FILE_FLAGS, SEND_FILE_PERMISSIONS); memset(&data, '\0', sizeof(data)); if ((cwr = mq_open(mqWr, O_RDONLY)) == -1) { printf("Open write queue failed!\n"); continue; } while((mq_receive(cwr, (char *)&data, sizeof(data), NULL)) && (data.message_type != MESSAGE_TYPE_SEND_END)) { write(fd, data.payload, data.num_bytes); memset(&data, '\0', sizeof(data)); } close(fd); chdir(local); ts = pthread_mutex_unlock(&mtx); }//put else if (strcmp(data.command, CMD_GET) == 0) { int fd; int len; int ts; char local[PATH_MAX] = {'\0'}; ts = pthread_mutex_lock(&mtx); getcwd(local, sizeof(local)); chdir(localpath); fd = open(data.payload, O_RDONLY); memset(&data, '\0', sizeof(data)); while ((len = read(fd, data.payload, sizeof(data.payload))) != 0) { data.num_bytes = len; if ((crd = mq_open(mqRd, O_WRONLY)) == -1) { printf("Cannot open read queue\n"); continue; } data.message_type = MESSAGE_TYPE_SEND; mq_send(crd, (char *)&data, sizeof(data), 0); mq_close(crd); memset(&data, '\0', sizeof(data)); } close(fd); memset(&data, '\0', sizeof(data)); data.message_type = MESSAGE_TYPE_SEND_END; if ((crd = mq_open(mqRd, O_WRONLY)) == -1) { printf("Cannot open read queue\n"); continue; } mq_send(crd, (char *)&data, sizeof(data), 0); mq_close(crd); chdir(local); ts = pthread_mutex_unlock(&mtx); }//get } }