From 450b7e1a3d3f0b9c84f9b8f6909fa844afacbec5 Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Thu, 28 Feb 2013 00:55:15 -0500 Subject: Use ENULLLOOP to handle EINTR during realpath(). Fixes Savannah bug #38420 --- ChangeLog | 5 +++++ dep.h | 1 + function.c | 34 +++++++++++++++++++++------------- loadapi.c | 1 + 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9918dc6..8dc920a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-02-28 Paul Smith + + * 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 Add a proposed supported API for GNU make loaded objects. diff --git a/dep.h b/dep.h index 1a50e25..3eab961 100644 --- a/dep.h +++ b/dep.h @@ -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); diff --git a/function.c b/function.c index b6060d6..1242d9a 100644 --- a/function.c +++ b/function.c @@ -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[] = { diff --git a/loadapi.c b/loadapi.c index 3170dd1..f2823e1 100644 --- a/loadapi.c +++ b/loadapi.c @@ -20,6 +20,7 @@ this program. If not, see . */ #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. */ -- cgit v1.2.3