[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