FLTK logo

[master] bf95eb1 - Remove FL_CFG_SYS_POSIX preprocessor variable from fl_open_uri.cxx

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 All Forums  |  Back to fltk.commit  ]
 
Previous Message ]Next Message ]

[master] bf95eb1 - Remove FL_CFG_SYS_POSIX preprocessor variable from fl_open_uri.cxx "ManoloFLTK" Feb 16, 2021  
 
commit bf95eb1c09c6a3bf6a04dcc4ca55a78ade32d6a2
Author:     ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
AuthorDate: Tue Feb 16 15:15:00 2021 +0100
Commit:     ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
CommitDate: Tue Feb 16 15:50:15 2021 +0100

    Remove FL_CFG_SYS_POSIX preprocessor variable from fl_open_uri.cxx

 src/drivers/Posix/Fl_Posix_System_Driver.cxx | 82 ++++++++++++++++++++++++++-
 src/fl_open_uri.cxx                          | 85 ----------------------------
 2 files changed, 80 insertions(+), 87 deletions(-)

diff --git src/drivers/Posix/Fl_Posix_System_Driver.cxx src/drivers/Posix/Fl_Posix_System_Driver.cxx
index 20b7aef..75df02e 100644
--- src/drivers/Posix/Fl_Posix_System_Driver.cxx
+++ src/drivers/Posix/Fl_Posix_System_Driver.cxx
@@ -1,7 +1,7 @@
 //
-// Definition of Apple Darwin system driver.
+// Definition of Posix system driver (used by both the X11 and macOS platforms).
 //
-// Copyright 1998-2020 by Bill Spitzak and others.
+// Copyright 1998-2021 by Bill Spitzak and others.
 //
 // This library is free software. Distribution and use rights are outlined in
 // the file "COPYING" which should have been included with this file.  If this
@@ -33,6 +33,11 @@
 #include <pwd.h>
 #include <unistd.h>
 #include <time.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <errno.h>
 
 //
 // Define missing POSIX/XPG4 macros as needed...
@@ -93,3 +98,76 @@ void Fl_Posix_System_Driver::gettime(time_t *sec, int *usec) {
   *sec = tv.tv_sec;
   *usec = tv.tv_usec;
 }
+
+// Run the specified program, returning 1 on success and 0 on failure
+int Fl_Posix_System_Driver::run_program(const char *program, char **argv, char *msg, int msglen) {
+  pid_t pid;                            // Process ID of first child
+  int status;                           // Exit status from first child
+  sigset_t set, oldset;                 // Signal masks
+
+
+  // Block SIGCHLD while we run the program...
+  //
+  // Note that I only use the POSIX signal APIs, however older operating
+  // systems may either not support POSIX signals or have side effects.
+  // IRIX, for example, provides three separate and incompatible signal
+  // APIs, so it is possible that an application setting a signal handler
+  // via signal() or sigset() will not have its SIGCHLD signals blocked...
+
+  sigemptyset(&set);
+  sigaddset(&set, SIGCHLD);
+  sigprocmask(SIG_BLOCK, &set, &oldset);
+
+  // Create child processes that actually run the program for us...
+  if ((pid = fork()) == 0) {
+    // First child comes here, fork a second child and exit...
+    if (!fork()) {
+      // Second child comes here, redirect stdin/out/err to /dev/null...
+      close(0);
+      ::open("/dev/null", O_RDONLY);
+
+      close(1);
+      ::open("/dev/null", O_WRONLY);
+
+      close(2);
+      ::open("/dev/null", O_WRONLY);
+
+      // Detach from the current process group...
+      setsid();
+
+      // Run the program...
+      execv(program, argv);
+      _exit(0);
+    } else {
+      // First child gets here, exit immediately...
+      _exit(0);
+    }
+  } else if (pid < 0) {
+    // Restore signal handling...
+    sigprocmask(SIG_SETMASK, &oldset, NULL);
+
+    // Return indicating failure...
+    return 0;
+  }
+
+  // Wait for the first child to exit...
+  while (waitpid(pid, &status, 0) < 0) {
+    if (errno != EINTR) {
+      // Someone else grabbed the child status...
+      if (msg) snprintf(msg, msglen, "waitpid(%ld) failed: %s", (long)pid,
+                        strerror(errno));
+
+      // Restore signal handling...
+      sigprocmask(SIG_SETMASK, &oldset, NULL);
+
+      // Return indicating failure...
+      return 0;
+    }
+  }
+
+  // Restore signal handling...
+  sigprocmask(SIG_SETMASK, &oldset, NULL);
+
+  // Return indicating success...
+  return 1;
+}
diff --git src/fl_open_uri.cxx src/fl_open_uri.cxx
index 5f454c9..1a8da62 100644
--- src/fl_open_uri.cxx
+++ src/fl_open_uri.cxx
@@ -127,91 +127,6 @@ void fl_decode_uri(char *uri)
 
 /**   @} */
 
-
-#if defined(FL_CFG_SYS_POSIX) && !defined(FL_DOXYGEN)
-// code shared by the Mac OS and USE_X11 platforms
-#  include "drivers/Posix/Fl_Posix_System_Driver.H"
-#  include <unistd.h>
-#  include <sys/wait.h>
-#  include <signal.h>
-#  include <fcntl.h>
-#  include <errno.h>
-
-// Run the specified program, returning 1 on success and 0 on failure
-int Fl_Posix_System_Driver::run_program(const char *program, char **argv, char *msg, int msglen) {
-  pid_t pid;                            // Process ID of first child
-  int status;                           // Exit status from first child
-  sigset_t set, oldset;                 // Signal masks
-
-
-  // Block SIGCHLD while we run the program...
-  //
-  // Note that I only use the POSIX signal APIs, however older operating
-  // systems may either not support POSIX signals or have side effects.
-  // IRIX, for example, provides three separate and incompatible signal
-  // APIs, so it is possible that an application setting a signal handler
-  // via signal() or sigset() will not have its SIGCHLD signals blocked...
-
-  sigemptyset(&set);
-  sigaddset(&set, SIGCHLD);
-  sigprocmask(SIG_BLOCK, &set, &oldset);
-
-  // Create child processes that actually run the program for us...
-  if ((pid = fork()) == 0) {
-    // First child comes here, fork a second child and exit...
-    if (!fork()) {
-      // Second child comes here, redirect stdin/out/err to /dev/null...
-      close(0);
-      ::open("/dev/null", O_RDONLY);
-
-      close(1);
-      ::open("/dev/null", O_WRONLY);
-
-      close(2);
-      ::open("/dev/null", O_WRONLY);
-
-      // Detach from the current process group...
-      setsid();
-
-      // Run the program...
-      execv(program, argv);
-      _exit(0);
-    } else {
-      // First child gets here, exit immediately...
-      _exit(0);
-    }
-  } else if (pid < 0) {
-    // Restore signal handling...
-    sigprocmask(SIG_SETMASK, &oldset, NULL);
-
-    // Return indicating failure...
-    return 0;
-  }
-
-  // Wait for the first child to exit...
-  while (waitpid(pid, &status, 0) < 0) {
-    if (errno != EINTR) {
-      // Someone else grabbed the child status...
-      if (msg) snprintf(msg, msglen, "waitpid(%ld) failed: %s", (long)pid,
-                        strerror(errno));
-
-      // Restore signal handling...
-      sigprocmask(SIG_SETMASK, &oldset, NULL);
-
-      // Return indicating failure...
-      return 0;
-    }
-  }
-
-  // Restore signal handling...
-  sigprocmask(SIG_SETMASK, &oldset, NULL);
-
-  // Return indicating success...
-  return 1;
-}
-#endif // FL_CFG_SYS_POSIX
-
-
 #ifdef TEST
 //
 // Test code...
Direct Link to Message ]
 
     
Previous Message ]Next Message ]
 
 

Comments are owned by the poster. All other content is copyright 1998-2024 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.