Fixed how errno is handled with isatty()
authorPaul Pearce <pearce@eecs.berkeley.edu>
Thu, 4 Jun 2009 02:08:46 +0000 (22:08 -0400)
committerKevin Klues <klueska@cs.berkeley.edu>
Fri, 5 Jun 2009 01:24:39 +0000 (18:24 -0700)
For some reason, isatty() defines an error response to be a return value of 0, not -1. In that case
errno is set. I modified parts of newlib_backend.c to handle this unique case.

user/apps/parlib/file_error.c
user/parlib/src/newlib_backend.c

index 67dbe84..83ecdcf 100644 (file)
@@ -9,13 +9,14 @@
 
 #define IN_BUF_SIZE 1024
 
-extern char * readline(const char *prompt);
-
 void file_error()
 {
                
        char buf[IN_BUF_SIZE];
 
+       int dne_fd = 99;
+       int result;
+
        printf("Starting error testing....\n\n");
 
        errno = 0;
@@ -24,16 +25,69 @@ void file_error()
         printf("FD:           %d\n", bad_fd);
         printf("ERRNO:        %s\n", strerror(errno));
 
+
+        errno = 0;
+        printf("\n");
+        result = close(dne_fd);
+        printf("CLOSED FD:    %d\n", dne_fd);
+        printf("RESULT:       %d\n", result);
+        printf("ERRNO:        %s\n", strerror(errno));
+
        errno = 0;
+       printf("\n");
        int result = read(bad_fd, buf, IN_BUF_SIZE - 1);
        printf("Read:         %d bytes\n", result);
        printf("ERRNO:        %s\n", strerror(errno));
 
        errno = 0;
+       printf("\n");
+        result = write(bad_fd, buf, IN_BUF_SIZE - 1);
+        printf("Wrote:        %d bytes\n", result);
+        printf("ERRNO:        %s\n", strerror(errno));
+
+       errno = 0;
+       printf("\n");
        result = unlink("DNE");
         printf("UNLINKED:     DNE\n");
        printf("RESULT:       %d\n", result);
         printf("ERRNO:        %s\n", strerror(errno));
        
+        errno = 0;
+        printf("\n");
+        result = link("DNE", "DEST");
+        printf("LINKED:       DEST to DNE\n");
+        printf("RESULT:       %d\n", result);
+        printf("ERRNO:        %s\n", strerror(errno));
+
+       errno = 0;
+        printf("\n");
+        result = isatty(dne_fd);
+        printf("ISATTY on FD: %d\n", dne_fd);
+        printf("RESULT:       %d\n", result);
+        printf("ERRNO:        %s\n", strerror(errno));
+
+       errno = 0;
+        printf("\n");
+        result = lseek(dne_fd, 0, 0);
+        printf("LSEEKED FD:   %d\n", dne_fd);
+        printf("RESULT:       %d\n", result);
+        printf("ERRNO:        %s\n", strerror(errno));
+
+       struct stat st;
+
+       errno = 0;
+        printf("\n");
+        result = stat("DNE", &st);
+        printf("STAT:         DNE\n");
+        printf("RESULT:       %d\n", result);
+        printf("ERRNO:        %s\n", strerror(errno));
+
+        errno = 0;
+        printf("\n");
+        result = fstat(dne_fd, &st);
+        printf("FSTAT on FD:  %d\n", dne_fd);
+        printf("RESULT:       %d\n", result);
+        printf("ERRNO:        %s\n", strerror(errno));
+
        printf("\nTests Complete.\n\n");
 }
index 9f77549..1e347de 100644 (file)
@@ -210,11 +210,11 @@ int isatty(int file)
        if (result != NULL) {
                // Read result
                return_val = *((int *) result);
-               if (return_val == -1) errno = *(((int *)result) + 1);
+               if (return_val == 0) errno = *(((int *)result) + 1);
                free(result);
        } else {
                errno = ECHANNEL;
-               return_val = -1;
+               return_val = 0;
        }
        
        return return_val;
@@ -522,16 +522,18 @@ char *send_message(char *message, int len)
        char* errno_pos = NULL;
        int extra_space = (response_value == -1) ? sizeof(int) : 0;
 
-
        // TODO: Make these sizes an array we index into, and only have this code once.
        // TODO: Will have a flag that tells us we have a variable length response (right now only for read case)
        // TODO: Default clause with error handling.
        switch (this_call_id) {
+               case ISATTY_ID:
+                       // This case must be at the top! Else extra space will be wrong at times 
+                       // ISATTY is special, 0 signifies error, not -1. Annoying.
+                       extra_space = (response_value == 0) ? sizeof(int) : 0;
                case OPEN_ID:           
                case CLOSE_ID:
                case WRITE_ID:  
                case LSEEK_ID:
-               case ISATTY_ID:
                case UNLINK_ID:
                case LINK_ID:
                         return_msg = (char*)malloc(sizeof(int) + extra_space);
@@ -539,10 +541,9 @@ char *send_message(char *message, int len)
                                 return NULL;
 
                        errno_pos = return_msg + sizeof(int);
-                        if ((response_value == -1)
-                            && (-1 == read_from_channel(errno_pos,
-                                                        sizeof(int), 
-                                                        NO_PEEK))) {
+                        if (extra_space && (-1 == read_from_channel(errno_pos,
+                                                                    sizeof(int), 
+                                                                    NO_PEEK))) {
                                free(return_msg);
                                 return NULL;
                        }
@@ -567,9 +568,9 @@ char *send_message(char *message, int len)
                         errno_pos = return_msg + sizeof(int) 
                                                + sizeof(struct stat);
 
-                        if ((response_value == -1)
-                            && (-1 == read_from_channel(errno_pos,
-                                                  sizeof(int), NO_PEEK))) {
+                        if (extra_space && (-1 == read_from_channel(errno_pos,
+                                                                    sizeof(int), 
+                                                                    NO_PEEK))) {
                                free(return_msg);
                                return NULL;
                        }