From 368bdd7f5a0268055c48b48ef61f8b50036df0a3 Mon Sep 17 00:00:00 2001 From: Martin 'povik' Poviser Date: Sat, 2 May 2009 21:50:44 +0200 Subject: [PATCH] Small bug in pipe.c is fixed --- kernel/include/pipe.h | 7 +++--- kernel/lib/unistd/pipe.c | 58 ++++++++++++++++++++++++++++++------------------ 2 files changed, 40 insertions(+), 25 deletions(-) diff --git a/kernel/include/pipe.h b/kernel/include/pipe.h index b2d09ab..f2ead0f 100644 --- a/kernel/include/pipe.h +++ b/kernel/include/pipe.h @@ -35,13 +35,14 @@ typedef struct pipe { pipe_buffer_t *buffer_list_end; unsigned int buffer_start_pos; unsigned int buffer_end_len; - int fd_a, fd_b; + unsigned int fd_a, fd_b; struct pipe *next, *prev; } pipe_t; -pipe_t *pipe_get (int fd); +pipe_t *pipe_get (unsigned int fd); +void pipe_close (unsigned int fd); bool pipe_write (pipe_t *p, BYTE *buffer, unsigned int buffer_len); unsigned int pipe_read (pipe_t *p, BYTE *buffer, unsigned int buffer_max_len); -void pipe (int fds[2]); +void pipe (unsigned int fds[2]); #endif diff --git a/kernel/lib/unistd/pipe.c b/kernel/lib/unistd/pipe.c index 1562a21..54223c4 100644 --- a/kernel/lib/unistd/pipe.c +++ b/kernel/lib/unistd/pipe.c @@ -23,7 +23,7 @@ pipe_t *pipe_list_start; pipe_t *pipe_list_end; -void pipe (int fds[2]) +void pipe (unsigned int fds[2]) { pipe_t *p = ((pipe_t*) kmalloc (sizeof (pipe_t))); @@ -39,6 +39,9 @@ void pipe (int fds[2]) p->next = NULL; } + p->fd_a = fds[0]; + p->fd_b = fds[1]; + p->buffer_list_start = ((pipe_buffer_t*) kmalloc (sizeof (sizeof(pipe_buffer_t)))); p->buffer_list_end = p->buffer_list_start; p->buffer_list_start->next = NULL; @@ -47,7 +50,7 @@ void pipe (int fds[2]) p->buffer_start_pos = 0; } -pipe_t *pipe_get (int fd) +pipe_t *pipe_get (unsigned int fd) { pipe_t *p = pipe_list_start; @@ -62,6 +65,8 @@ pipe_t *pipe_get (int fd) else p = p->next; } + + return NULL; } unsigned int pipe_write (pipe_t *p, BYTE* buffer, unsigned int buffer_len) @@ -70,22 +75,27 @@ unsigned int pipe_write (pipe_t *p, BYTE* buffer, unsigned int buffer_len) return 0; { // hardcore code :) + unsigned int block_size = 0; unsigned int buffer_pos = 0; pipe_buffer_t *ptr; while (buffer_pos < buffer_len) { - if ((buffer_len - buffer_pos) > (PIPE_BUFFER_PART_SIZE - p->buffer_end_len)) { + if ((buffer_len - buffer_pos) >= (PIPE_BUFFER_PART_SIZE - p->buffer_end_len)) { ptr = p->buffer_list_end; - memcpy (ptr->buffer + p->buffer_end_len, buffer + buffer_pos, PIPE_BUFFER_PART_SIZE - p->buffer_end_len); - buffer_pos += PIPE_BUFFER_PART_SIZE - p->buffer_end_len; + block_size = PIPE_BUFFER_PART_SIZE - p->buffer_end_len; + memcpy (&ptr->buffer + p->buffer_end_len, &buffer + buffer_pos, block_size); + buffer_pos += block_size; p->buffer_list_end = ((pipe_buffer_t*) kmalloc(sizeof (pipe_buffer_t))); p->buffer_end_len = 0; ptr->next = p->buffer_list_end; p->buffer_list_end->prev = ptr; } else { - memcpy (p->buffer_list_end + p->buffer_end_len, buffer + buffer_pos, buffer_len - buffer_pos); - p->buffer_end_len += buffer_len - buffer_pos; + ptr = p->buffer_list_end; + block_size = buffer_len - buffer_pos; + memcpy (&ptr->buffer + p->buffer_end_len, &buffer + buffer_pos, block_size); + p->buffer_end_len += block_size; + buffer_pos += block_size; } } @@ -103,23 +113,27 @@ unsigned int pipe_read (pipe_t *p, BYTE* buffer, unsigned int buffer_max_len) while (true) { // hardcore code :) while (buffer_pos < buffer_max_len) { pipe_buffer_t *ptr; - unsigned int pipe_buffer_sl = PIPE_BUFFER_PART_SIZE - p->buffer_start_pos; - unsigned int buffer_dl = buffer_max_len - buffer_pos; + unsigned int block_size = 0; + unsigned int buffer_space = buffer_max_len - buffer_pos; if (p->buffer_list_start == p->buffer_list_end) { - pipe_block_sl = (p->buffer_end_len - p->buffer_start_pos < buffer_dl) ? - (p->buffer_end_len - p->buffer_start_pos) : (buffer_dl); + unsigned int pipe_dl = p->buffer_end_len - p->buffer_start_pos; + block_size = (pipe_dl < buffer_space) ? (pipe_dl) : (buffer_space); if(p->buffer_start_pos == p->buffer_end_len) break; - + + ptr = p->buffer_list_start; - memcpy (buffer + buffer_pos, ptr->buffer + p->buffer_start_pos, block_size); + memcpy (&buffer + buffer_pos, &ptr->buffer + p->buffer_start_pos, block_size); p->buffer_start_pos += block_size; - } else if (buffer_dl > pipe_buffer_sl) { + buffer_pos += block_size; + } else if (buffer_space >= PIPE_BUFFER_PART_SIZE - p->buffer_start_pos) { ptr = p->buffer_list_start; - memcpy (buffer + buffer_pos, ptr->buffer + p->buffer_start_pos, pipe_buffer_sl); - buffer_pos += pipe_buffer_sl; + + block_size = PIPE_BUFFER_PART_SIZE - p->buffer_start_pos; + memcpy (&buffer + buffer_pos, &ptr->buffer + p->buffer_start_pos, block_size); + buffer_pos += block_size; p->buffer_start_pos = 0; p->buffer_list_start = ptr->next; @@ -127,8 +141,8 @@ unsigned int pipe_read (pipe_t *p, BYTE* buffer, unsigned int buffer_max_len) kfree(ptr); } else { ptr = p->buffer_list_start; - memcpy (buffer + buffer_pos, ptr->buffer + p->buffer_start_pos, pipe_dl); - p->buffer_start_pos += block_size; + memcpy (&buffer + buffer_pos, &ptr->buffer + p->buffer_start_pos, buffer_space); + p->buffer_start_pos += buffer_space; } } @@ -162,7 +176,7 @@ void pipe_remove (pipe_t *pipe) kfree (pipe); } -bool pipe_closed (int fds) +void pipe_close (unsigned int fds) { pipe_t *p = pipe_list_start; @@ -171,13 +185,13 @@ bool pipe_closed (int fds) p->fd_a = -1; if (!p->fd_b) pipe_remove(p); - return 1; + return; } if (p->fd_b == fds) { p->fd_b = -1; if (!p->fd_b) pipe_remove(p); - return 1; + return; } if (!p->next) @@ -186,5 +200,5 @@ bool pipe_closed (int fds) p = p->next; } - return 0; + return; } -- 2.11.4.GIT