diff options
author | Paul Smith <psmith@gnu.org> | 2013-02-28 00:55:15 -0500 |
---|---|---|
committer | Paul Smith <psmith@gnu.org> | 2013-02-28 00:55:15 -0500 |
commit | 450b7e1a3d3f0b9c84f9b8f6909fa844afacbec5 (patch) | |
tree | 8d3d5b4a83eb504559e37d2bf18b5656155934b7 | |
parent | 5058a94ee717d96285da20423324af3478df175d (diff) | |
download | gunmake-450b7e1a3d3f0b9c84f9b8f6909fa844afacbec5.tar.gz |
Use ENULLLOOP to handle EINTR during realpath(). Fixes Savannah bug #38420
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | dep.h | 1 | ||||
-rw-r--r-- | function.c | 34 | ||||
-rw-r--r-- | loadapi.c | 1 |
4 files changed, 28 insertions, 13 deletions
@@ -1,3 +1,8 @@ +2013-02-28 Paul Smith <psmith@gnu.org> + + * function.c (func_realpath): On Solaris (at least) realpath() can + fail due to EINTR, so loop it. Fixes Savannah bug #38420. + 2013-02-25 Paul Smith <psmith@gnu.org> Add a proposed supported API for GNU make loaded objects. @@ -87,4 +87,5 @@ struct dep *copy_dep_chain (const struct dep *d); void free_dep_chain (struct dep *d); void free_ns_chain (struct nameseq *n); struct dep *read_all_makefiles (const char **makefiles); +void eval_buffer (char *buffer, const gmk_floc *floc); int update_goal_chain (struct dep *goals); @@ -2070,28 +2070,35 @@ func_realpath (char *o, char **argv, const char *funcname UNUSED) const char *path = 0; int doneany = 0; unsigned int len = 0; - struct stat st; - PATH_VAR (in); - PATH_VAR (out); while ((path = find_next_token (&p, &len)) != 0) { if (len < GET_PATH_MAX) { + char *rp; + struct stat st; + PATH_VAR (in); + PATH_VAR (out); + strncpy (in, path, len); in[len] = '\0'; - if ( #ifdef HAVE_REALPATH - realpath (in, out) + ENULLLOOP (rp, realpath (in, out)); #else - abspath (in, out) + rp = abspath (in, out); #endif - && stat (out, &st) == 0) + + if (rp) { - o = variable_buffer_output (o, out, strlen (out)); - o = variable_buffer_output (o, " ", 1); - doneany = 1; + int r; + EINTRLOOP (r, stat (out, &st)); + if (r == 0) + { + o = variable_buffer_output (o, out, strlen (out)); + o = variable_buffer_output (o, " ", 1); + doneany = 1; + } } } } @@ -2150,13 +2157,14 @@ func_abspath (char *o, char **argv, const char *funcname UNUSED) const char *path = 0; int doneany = 0; unsigned int len = 0; - PATH_VAR (in); - PATH_VAR (out); while ((path = find_next_token (&p, &len)) != 0) { if (len < GET_PATH_MAX) { + PATH_VAR (in); + PATH_VAR (out); + strncpy (in, path, len); in[len] = '\0'; @@ -2191,7 +2199,7 @@ func_abspath (char *o, char **argv, const char *funcname UNUSED) static char *func_call (char *o, char **argv, const char *funcname); #define FT_ENTRY(_name, _min, _max, _exp, _func) \ - { (_func), STRING_SIZE_TUPLE(_name), (_min), (_max), (_exp), 0 } + { { (_func) }, STRING_SIZE_TUPLE(_name), (_min), (_max), (_exp), 0 } static struct function_table_entry function_table_init[] = { @@ -20,6 +20,7 @@ this program. If not, see <http://www.gnu.org/licenses/>. */ #include "filedef.h" #include "variable.h" +#include "dep.h" /* Evaluate a buffer as make syntax. Ideally eval_buffer() will take const char *, but not yet. */ |