# HG changeset patch
# User Ali Saidi <[EMAIL PROTECTED]>
# Date 1220389563 14400
# Node ID 5de467c4d71880ff9767158561e8490c4afaeaf0
# Parent  6a27bc3fc267be638942ba02ac058812aaed86da
Make m5term use select() so OS X is happy.

diff --git a/util/term/term.c b/util/term/term.c
--- a/util/term/term.c
+++ b/util/term/term.c
@@ -144,49 +144,51 @@
 void
 readwrite(int nfd)
 {
-    struct pollfd pfd[2];
+    fd_set read_fds, write_fds; 
     char buf[BUFSIZ];
-    int wfd = fileno(stdin), n, ret;
+    int wfd = fileno(stdin), n, ret, max_fd;
     int lfd = fileno(stdout);
     int escape = 0;
 
-    /* Setup Network FD */
-    pfd[0].fd = nfd;
-    pfd[0].events = POLLIN;
 
-    /* Setup STDIN FD */
-    pfd[1].fd = wfd;
-    pfd[1].events = POLLIN;
+    if (nfd == -1) 
+        return;
 
-    while (pfd[0].fd != -1) {
-        if ((n = poll(pfd, 2, -1)) < 0) {
+    FD_ZERO(&read_fds);
+    FD_ZERO(&write_fds);
+
+    FD_SET(wfd, &read_fds);
+    FD_SET(nfd, &read_fds);
+    max_fd = nfd + 1;
+    printf("wfd: %d nfd: %d\n", wfd, nfd);
+   
+    while (1) {
+        n = select(max_fd, &read_fds, &write_fds, NULL, NULL);
+        if (n < 0) {
             close(nfd);
-            err(1, "Polling Error");
+            perror("Select Error:");
         }
 
-        if (n == 0)
+        if (n == 0) {
             return;
+        }
 
-        if (pfd[0].revents & POLLIN) {
+        if (FD_ISSET(nfd, &read_fds)) {
             if ((n = read(nfd, buf, sizeof(buf))) < 0)
                 return;
             else if (n == 0) {
                 shutdown(nfd, SHUT_RD);
-                pfd[0].fd = -1;
-                pfd[0].events = 0;
             } else {
                 if ((ret = atomicio(write, lfd, buf, n)) != n)
                     return;
             }
         }
 
-        if (pfd[1].revents & POLLIN) {
+        if (FD_ISSET(wfd, &read_fds)) {
             if ((n = read(wfd, buf, sizeof(buf))) < 0)
                 return;
             else if (n == 0) {
                 shutdown(nfd, SHUT_WR);
-                pfd[1].fd = -1;
-                pfd[1].events = 0;
             } else {
                 if (escape) {
                     char buf2[] = "~";
@@ -208,7 +210,10 @@
                     return;
             }
         }
-    }
+    FD_ZERO(&read_fds);
+    FD_SET(wfd, &read_fds);
+    FD_SET(nfd, &read_fds);
+    } // while
 }
 
 void
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to