コード例 #1
0
ファイル: fifo_client.c プロジェクト: iankronquist/loud-pipes
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);
}
コード例 #2
0
ファイル: fifo_client.c プロジェクト: iankronquist/loud-pipes
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);
}
コード例 #3
0
ファイル: server.c プロジェクト: lucywyman/client-server
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);
        }
    }
}
コード例 #4
0
ファイル: posixmsg_server.c プロジェクト: Rasadell09/cs344
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
	}
}