Expanded on open/read test, fixing some small bugs along the way.
authorKevin Klues <klueska@cs.berkeley.edu>
Fri, 5 Jun 2009 01:12:09 +0000 (18:12 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Fri, 5 Jun 2009 01:12:09 +0000 (18:12 -0700)
kern/src/syscall.c
user/apps/parlib/open_read.c
user/parlib/src/newlib_backend.c

index e26bd3d..e48ea40 100644 (file)
@@ -50,8 +50,10 @@ static uint16_t sys_serial_read(env_t* e, char *DANGEROUS buf, uint16_t len)
     char *COUNT(len) _buf = user_mem_assert(e, buf, len, PTE_U);
        uint16_t bytes_read = 0;
        int c;
-       while((c = serial_read_byte()) != -1)
+       while((c = serial_read_byte()) != -1) {
                buf[bytes_read++] = (uint8_t)c;
+               if(bytes_read == len) break;
+       }
        return bytes_read;
 }
 
index 9c1cea6..f55e85d 100644 (file)
@@ -7,18 +7,18 @@ int main(int argc, char** argv)
 {
        printf("Hello world from newlib!!\n");
        int fd = open("/test/file", O_RDWR, 0);
-//     char buf[10];
-//     int read_amt = read(fd, buf, 10);
+       char buf[10];
+       int read_amt = read(fd, buf, 10);
        printf("FD: %d\n", fd);
-//     printf("read_amt: %d\n", read_amt);
-//     printf("read: %s\n", buf);
-/*
+       printf("read_amt: %d\n", read_amt);
+       printf("read: %s\n", buf);
+
        char buf2[] = "NANWAN!\n";
 
        int write_amt = write(fd, buf2, 8);
         printf("write_amt: %d\n", write_amt);        
        printf("wrote: %s\n", buf2);
-*/
+
 
        return 0;
 }
index d647e0e..21b73c7 100644 (file)
@@ -43,6 +43,10 @@ int close(int file)
 {
        debug("CLOSE\n");
 
+       // If trying to close stdin/out/err just return
+        if ((file > -1) && (file <3))
+                return 0;
+
        // Allocate a new buffer of proper size
        byte *out_msg = malloc(CLOSE_MESSAGE_FIXED_SIZE);
        if(out_msg == NULL)
@@ -228,6 +232,7 @@ ssize_t read(int file, void *ptr, size_t len)
 {
        debug("READ\n");
 
+
        // Allocate a new buffer of proper size
        byte *out_msg = (byte*)malloc(READ_MESSAGE_FIXED_SIZE);
        if (out_msg == NULL)
@@ -255,7 +260,8 @@ ssize_t read(int file, void *ptr, size_t len)
 
        if (result != NULL) {
                return_val = *((int *)result);
-               memcpy(ptr, ((int *)result) + 1, return_val);
+               if (return_val > 0)
+                       memcpy(ptr, ((int *)result) + 1, return_val);
                free(result);
        } else {
                return_val = -1;
@@ -360,11 +366,11 @@ byte *send_message(byte *message, int len)
                        break;
 
                case READ_ID:
-                       if ((return_msg = (byte*)malloc(READ_RETURN_MESSAGE_FIXED_SIZE + response_value)) == NULL)
+                       if ((return_msg = (byte*)malloc(READ_RETURN_MESSAGE_FIXED_SIZE + ((response_value > 0) ? response_value : 0))) == NULL)
                                return NULL;
 
 
-                       if ((read_from_channel(return_msg + sizeof(int), response_value, 0)) == -1)
+                       if ((response_value != -1) &&  (read_from_channel(return_msg + sizeof(int), response_value, 0) == -1))
                                return NULL;
 
                        break;
@@ -412,7 +418,7 @@ byte *send_message(byte *message, int len)
                        if ((return_msg = (byte*)malloc(FSTAT_RETURN_MESSAGE_FIXED_SIZE + ((response_value != -1) ? 0 : sizeof(int)))) == NULL)
                                return NULL;
 
-                       if ((read_from_channel(return_msg + sizeof(int), sizeof(struct stat), 0)) == -1)
+                       if (read_from_channel(return_msg + sizeof(int), sizeof(struct stat), 0) == -1)
                                return NULL;
 
                        if ((response_value == -1) && ((read_from_channel(return_msg + sizeof(int) + sizeof(struct stat), sizeof(int), 0)) == -1))
@@ -424,10 +430,10 @@ byte *send_message(byte *message, int len)
                        if ((return_msg = (byte*)malloc(STAT_RETURN_MESSAGE_FIXED_SIZE + ((response_value != -1) ? 0 : sizeof(int)))) == NULL)
                                return NULL;
 
-                       if ((read_from_channel(return_msg + sizeof(int), sizeof(struct stat), 0)) == -1)
+                       if (read_from_channel(return_msg + sizeof(int), sizeof(struct stat), 0) == -1)
                                return NULL;
 
-                       if ((response_value == -1) && ((read_from_channel(return_msg + sizeof(int) + sizeof(struct stat), sizeof(int), 0)) == -1))
+                       if ((response_value == -1) && (read_from_channel(return_msg + sizeof(int) + sizeof(struct stat), sizeof(int), 0) == -1))
                                return NULL;
 
                        break;
@@ -489,7 +495,8 @@ ssize_t write(int file, void *ptr, size_t len) {
        
        debug("WRITE\n");       
        debug("\tFILE: %u\n", file);
-       if(file == 1 || file == 2) //STDOUT_FILENO || STDERR_FILENO
+
+       if ((file > -1) && (file < 3))  //STDOUT_FILENO || STDERR_FILENO || STDIN_FILENO
                return sys_cputs(ptr, len);
        
        int out_msg_len = WRITE_MESSAGE_FIXED_SIZE + len;