[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203
Stephane Popinet
popinet at users.sf.net
Fri May 15 02:53:27 UTC 2009
The following commit has been merged in the upstream branch:
commit d51ec859620e4b67d217c567050ed649b0d98a6f
Author: Stephane Popinet <popinet at users.sf.net>
Date: Thu Feb 15 09:20:59 2007 +1100
Much simplified GfsOutput command pipe implementation
darcs-hash:20070214222059-d4795-feb2210edcfec264273a2401e28c552911fd534e.gz
diff --git a/src/output.c b/src/output.c
index 327a3d4..485fee7 100644
--- a/src/output.c
+++ b/src/output.c
@@ -139,45 +139,12 @@ static gboolean gfs_output_event (GfsEvent * event, GfsSimulation * sim)
}
else {
if (output->format[0] == '{') { /* script */
- GString * script;
- gint status;
- gchar pname[L_tmpnam], * c;
- guint i = 1, len;
-
- if (!tmpnam (pname)) {
- g_warning ("cannot create temporary name");
- return FALSE;
- }
- if (mkfifo (pname, S_IWUSR|S_IRUSR)) {
- g_warning ("cannot create named pipe: %s", strerror (errno));
- return FALSE;
- }
- script = g_string_new ("sh -c \"");
- c = output->format; c++;
- len = strlen (output->format);
- while (*c != '\0' && ++i < len) {
- switch (*c) {
- case '$': case '"':
- g_string_append_c (script, '\\');
- default:
- g_string_append_c (script, *c);
- }
- c++;
- }
- g_string_append (script, "\" < ");
- g_string_append (script, pname);
- g_string_append (script, " &");
- status = system (script->str);
- g_string_free (script, TRUE);
- if (status != -1)
- status = WEXITSTATUS (status);
- if (status == -1 || status != 0) {
- g_warning ("error while executing script");
- unlink (pname);
- return FALSE;
- }
- output->file = gfs_output_file_open (pname, "w");
- unlink (pname);
+ guint len = strlen (output->format);
+ g_assert (output->format[len - 1] == '}');
+ output->format[len - 1] = '\0';
+ output->file = gfs_output_file_new (popen (&output->format[1], "w"));
+ output->file->is_pipe = TRUE;
+ output->format[len - 1] = '}';
}
else { /* standard file */
fname = format_string (output->formats,
@@ -413,6 +380,22 @@ void gfs_output_mute (GfsOutput * output)
static GHashTable * gfs_output_files = NULL;
/**
+ * gfs_output_file_new:
+ * @fp: a file pointer.
+ *
+ * Returns: a new #GfsOutputFile for @fp.
+ */
+GfsOutputFile * gfs_output_file_new (FILE * fp)
+{
+ GfsOutputFile * file = g_malloc (sizeof (GfsOutputFile));
+ file->refcount = 1;
+ file->name = NULL;
+ file->fp = fp;
+ file->is_pipe = FALSE;
+ return file;
+}
+
+/**
* gfs_output_file_open:
* @name: the name of the file to open.
* @mode: the fopen mode.
@@ -453,10 +436,8 @@ GfsOutputFile * gfs_output_file_open (const gchar * name, const gchar * mode)
if (fp == NULL)
return NULL;
- file = g_malloc (sizeof (GfsOutputFile));
- file->refcount = 1;
+ file = gfs_output_file_new (fp);
file->name = g_strdup (name);
- file->fp = fp;
g_hash_table_insert (gfs_output_files, file->name, file);
return file;
@@ -475,8 +456,12 @@ void gfs_output_file_close (GfsOutputFile * file)
file->refcount--;
if (file->refcount == 0) {
- g_hash_table_remove (gfs_output_files, file->name);
- fclose (file->fp);
+ if (file->name)
+ g_hash_table_remove (gfs_output_files, file->name);
+ if (file->is_pipe)
+ pclose (file->fp);
+ else
+ fclose (file->fp);
g_free (file->name);
g_free (file);
}
diff --git a/src/output.h b/src/output.h
index 5d01bbf..bc2828b 100644
--- a/src/output.h
+++ b/src/output.h
@@ -61,8 +61,10 @@ struct _GfsOutputFile {
guint refcount;
gchar * name;
FILE * fp;
+ gboolean is_pipe;
};
+GfsOutputFile * gfs_output_file_new (FILE * fp);
GfsOutputFile * gfs_output_file_open (const gchar * name,
const gchar * mode);
void gfs_output_file_close (GfsOutputFile * file);
--
Gerris Flow Solver
More information about the debian-science-commits
mailing list