88
99// private functions
1010struct ScriptExecResult create_result ();
11- char * read_text_file (char * , struct StringBuffer * );
11+ bool write_text_file (char * , const char * );
12+ char * read_and_delete_text_file (char * , struct StringBuffer * );
1213
1314struct ScriptExecOptions scriptexec_create_options ()
1415{
@@ -40,8 +41,7 @@ struct ScriptExecResult scriptexec_run_with_options(const char *script, struct S
4041 }
4142
4243 const size_t script_length = strlen (script );
43- struct StringBuffer * buffer = string_buffer_new_with_options (
44- script_length + 4096 , true);
44+ struct StringBuffer * buffer = string_buffer_new_with_options (script_length + 4096 , true);
4545
4646 // move to cwd
4747 char * cwd = getcwd (NULL , 0 );
@@ -71,13 +71,14 @@ struct ScriptExecResult scriptexec_run_with_options(const char *script, struct S
7171 string_buffer_append_string (buffer , (char * )script );
7272 const char * updated_script = string_buffer_to_string (buffer );
7373
74- char template [] = "/tmp/tmpdir.XXXXXX " ;
74+ char template [] = "/tmp/scriptexec_XXXXXX " ;
7575 char * dir_name = mkdtemp (template );
7676
7777 if (dir_name == NULL )
7878 {
79- result .code = -1 ;
8079 string_buffer_release (buffer );
80+
81+ result .code = -1 ;
8182 return (result );
8283 }
8384
@@ -86,8 +87,6 @@ struct ScriptExecResult scriptexec_run_with_options(const char *script, struct S
8687 string_buffer_append_string (buffer , "/script" );
8788 char * script_file = string_buffer_to_string (buffer );
8889
89- string_buffer_clear (buffer );
90- string_buffer_append_string (buffer , script_file );
9190 string_buffer_append_string (buffer , ".out" );
9291 char * out_file = string_buffer_to_string (buffer );
9392
@@ -97,15 +96,14 @@ struct ScriptExecResult scriptexec_run_with_options(const char *script, struct S
9796 char * err_file = string_buffer_to_string (buffer );
9897
9998 // write script file
100- FILE * fp = fopen (script_file , "w" );
101- if (fp == NULL )
99+ if (!write_text_file (script_file , updated_script ))
102100 {
103- result . code = -1 ;
101+ rmdir ( dir_name ) ;
104102 string_buffer_release (buffer );
103+
104+ result .code = -1 ;
105105 return (result );
106106 }
107- fprintf (fp , "%s" , updated_script );
108- fclose (fp );
109107
110108 // create command
111109 char * runner = options .runner ;
@@ -126,8 +124,8 @@ struct ScriptExecResult scriptexec_run_with_options(const char *script, struct S
126124 result .code = system (command );
127125
128126 // read out/err
129- result .out = read_text_file (out_file , buffer );
130- result .err = read_text_file (err_file , buffer );
127+ result .out = read_and_delete_text_file (out_file , buffer );
128+ result .err = read_and_delete_text_file (err_file , buffer );
131129
132130 // delete files
133131 remove (script_file );
@@ -146,7 +144,30 @@ struct ScriptExecResult create_result()
146144}
147145
148146
149- char * read_text_file (char * file , struct StringBuffer * buffer )
147+ bool write_text_file (char * file , const char * text )
148+ {
149+ FILE * fp = fopen (file , "w" );
150+
151+ if (fp == NULL )
152+ {
153+ return (false);
154+ }
155+
156+ if (fputs (text , fp ) == EOF )
157+ {
158+ fclose (fp );
159+ remove (file );
160+
161+ return (false);
162+ }
163+
164+ fclose (fp );
165+
166+ return (true);
167+ }
168+
169+
170+ char * read_and_delete_text_file (char * file , struct StringBuffer * buffer )
150171{
151172 FILE * fp = fopen (file , "r" );
152173
0 commit comments