[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203

Stephane Popinet popinet at users.sf.net
Fri May 15 02:55:00 UTC 2009


The following commit has been merged in the upstream branch:
commit d512c1bafa4173ef3ee192e3eec1fd4f5431f783
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Fri Feb 22 10:28:45 2008 +1100

    Cleanup of GfsEventScript temporary files handling
    
    darcs-hash:20080221232845-d4795-bd3384aa45c6cc2a1066464ff92500e28a7c3725.gz

diff --git a/src/event.c b/src/event.c
index 47da9f1..5bcdb91 100644
--- a/src/event.c
+++ b/src/event.c
@@ -19,6 +19,9 @@
 
 #include <stdlib.h>
 #include <sys/wait.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
 #include <unistd.h>
 #include <math.h>
 #include "event.h"
@@ -1560,39 +1563,52 @@ static void gfs_event_script_read (GtsObject ** o, GtsFile * fp)
     gts_file_next_token (fp);
 }
 
+static FILE * gfs_popen (GfsSimulation * sim, const char * command, const char * type)
+{
+  g_return_val_if_fail (command != NULL, NULL);
+  g_return_val_if_fail (type != NULL, NULL);
+  
+  gchar sname[] = "/tmp/gfsXXXXXX";
+  mktemp (sname);
+  if (mkfifo (sname, 0666)) {
+    g_warning ("gfs_popen() cannot create FIFO: %s", strerror (errno));
+    return NULL;
+  }
+  /* When adding pre-defined shell variables please update this page:
+     http://gfs.sourceforge.net/wiki/index.php/GfsEventScript */
+  gchar * scommand = g_strdup_printf ("GfsTime=%g GfsIter=%d GfsPid=%d "
+				      "GFS_STOP=%d sh %s",
+				      sim->time.t, sim->time.i, 
+				      GFS_DOMAIN (sim)->pid,
+				      GFS_EVENT_SCRIPT_STOP,
+				      sname);
+  fflush (stdout);
+  fflush (stderr);
+  FILE * fp = popen (scommand, type);
+  g_free (scommand);
+  if (fp != NULL) {
+    FILE * f = fopen (sname, "w");
+    fputs (command, f);
+    fclose (f);
+  }
+  remove (sname);
+  return fp;
+}
+
 static gboolean gfs_event_script_event (GfsEvent * event, GfsSimulation * sim)
 {
   if ((* GFS_EVENT_CLASS (GTS_OBJECT_CLASS (gfs_event_script_class ())->parent_class)->event) 
       (event, sim)) {
     GfsEventScript * s = GFS_EVENT_SCRIPT (event);
     if (s->script) {
-      gchar * scommand;
-      gchar sname[] = "/tmp/gfsXXXXXX";
-      gint sf = mkstemp (sname);
-      gint status;
-      FILE * f;
-
-      if (sf < 0) {
-	g_warning ("GfsEventScript cannot create temporary files");
+      FILE * fp = gfs_popen (sim, s->script, "w");
+      if (fp == NULL) {
+	g_warning ("GfsEventScript cannot start script");
 	return TRUE;
       }
-      f = fdopen (sf, "w");
-      fputs (s->script, f);
-      fclose (f);
-      close (sf);
-      scommand = g_strdup_printf ("GfsTime=%g GfsIter=%d GfsPid=%d "
-				  "GFS_STOP=%d sh %s",
-				  sim->time.t, sim->time.i, 
-				  GFS_DOMAIN (sim)->pid,
-				  GFS_EVENT_SCRIPT_STOP,
-				  sname);
-      fflush (stdout);
-      fflush (stderr);
-      status = system (scommand);
+      int status = pclose (fp);
       if (status != -1)
 	status = WEXITSTATUS (status);
-      g_free (scommand);
-      remove (sname);
       if (status == GFS_EVENT_SCRIPT_STOP)
 	exit (1);
     }

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list