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 Library      Forums      Links      Apps     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-2025 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.