]> code.delx.au - gnu-emacs/blobdiff - src/mac.c
*** empty log message ***
[gnu-emacs] / src / mac.c
index 439f900db5b4694b88765e6f3aee83566679f2bf..9d3af053495595535dcd08d20e422feb5c95449c 100644 (file)
--- a/src/mac.c
+++ b/src/mac.c
@@ -32,6 +32,7 @@ Boston, MA 02111-1307, USA.  */
 #include <pwd.h>
 #include <sys/param.h>
 #include <stdlib.h>
+#include <fcntl.h>
 #if __MWERKS__
 #include <unistd.h>
 #endif
@@ -2768,34 +2769,49 @@ sys_select (n, rfds, wfds, efds, timeout)
 {
   if (!inhibit_window_system && rfds && FD_ISSET (0, rfds))
     return 1;
-  else if (inhibit_window_system || noninteractive)
+  else if (inhibit_window_system || noninteractive ||
+          (timeout && (EMACS_SECS(*timeout)==0) &&
+           (EMACS_USECS(*timeout)==0)))
     return select(n, rfds, wfds, efds, timeout);
   else
     {
       EMACS_TIME end_time, now;
-      
+
       EMACS_GET_TIME (end_time);
       if (timeout)
        EMACS_ADD_TIME (end_time, end_time, *timeout);
-      
+
       do
        {
          int r;
          EMACS_TIME one_second;
-         
+         SELECT_TYPE orfds;
+
+         FD_ZERO (&orfds);
+         if (rfds)
+           {
+             orfds = *rfds;
+           }
+
          EMACS_SET_SECS (one_second, 1);
          EMACS_SET_USECS (one_second, 0);
-         
-         if ((r = select (n, rfds, wfds, efds, &one_second)) > 0)
-           return r;
-         
+
+         if (timeout && EMACS_TIME_LT(*timeout, one_second))
+           one_second = *timeout;
+
+         if ((r = select (n, &orfds, wfds, efds, &one_second)) > 0)
+           {
+             *rfds = orfds;
+             return r;
+           }
+
          mac_check_for_quit_char();
-         
+
          EMACS_GET_TIME (now);
          EMACS_SUB_TIME (now, end_time, now);
        }
       while (!timeout || !EMACS_TIME_NEG_P (now));
-      
+
       return 0;
     }
 }
@@ -2811,14 +2827,15 @@ int sys_read (fds, buf, nbyte)
   int r;
 
   /* Use select to block on IO while still checking for quit_char */
-  if (!inhibit_window_system && !noninteractive)
+  if (!inhibit_window_system && !noninteractive &&
+      ! (fcntl(fds, F_GETFL, 0) & O_NONBLOCK))
     {
       FD_ZERO (&rfds);
       FD_SET (fds, &rfds);
       if (sys_select (fds+1, &rfds, 0, 0, NULL) < 0)
        return -1;
     }
-      
+
   return read (fds, buf, nbyte);
 }
 
@@ -2914,12 +2931,12 @@ init_mac_osx_environment ()
       q[0] = '\0';
 
       strcpy (p, app_bundle_pathname);
-      strcat (p, "/Contents/MacOS/bin");
+      strcat (p, "/Contents/MacOS/libexec");
       if (stat (p, &st) == 0 && (st.st_mode & S_IFMT) == S_IFDIR)
        strcat (q, p);
 
       strcpy (p, app_bundle_pathname);
-      strcat (p, "/Contents/MacOS/libexec");
+      strcat (p, "/Contents/MacOS/bin");
       if (stat (p, &st) == 0 && (st.st_mode & S_IFMT) == S_IFDIR)
        {
          if (q[0] != '\0')
@@ -2971,3 +2988,6 @@ syms_of_mac ()
   defsubr (&Smac_file_name_to_posix);
   defsubr (&Sposix_file_name_to_mac);
 }
+
+/* arch-tag: 29d30c1f-0c6b-4f88-8a6d-0558d7f9dbff
+   (do not change this comment) */