Use ENULLLOOP to handle EINTR during realpath(). Fixes Savannah bug #38420

This commit is contained in:
Paul Smith 2013-02-28 00:55:15 -05:00
parent 5058a94ee7
commit 450b7e1a3d
4 changed files with 28 additions and 13 deletions

View File

@ -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> 2013-02-25 Paul Smith <psmith@gnu.org>
Add a proposed supported API for GNU make loaded objects. Add a proposed supported API for GNU make loaded objects.

1
dep.h
View File

@ -87,4 +87,5 @@ struct dep *copy_dep_chain (const struct dep *d);
void free_dep_chain (struct dep *d); void free_dep_chain (struct dep *d);
void free_ns_chain (struct nameseq *n); void free_ns_chain (struct nameseq *n);
struct dep *read_all_makefiles (const char **makefiles); struct dep *read_all_makefiles (const char **makefiles);
void eval_buffer (char *buffer, const gmk_floc *floc);
int update_goal_chain (struct dep *goals); int update_goal_chain (struct dep *goals);

View File

@ -2070,28 +2070,35 @@ func_realpath (char *o, char **argv, const char *funcname UNUSED)
const char *path = 0; const char *path = 0;
int doneany = 0; int doneany = 0;
unsigned int len = 0; unsigned int len = 0;
struct stat st;
PATH_VAR (in);
PATH_VAR (out);
while ((path = find_next_token (&p, &len)) != 0) while ((path = find_next_token (&p, &len)) != 0)
{ {
if (len < GET_PATH_MAX) if (len < GET_PATH_MAX)
{ {
char *rp;
struct stat st;
PATH_VAR (in);
PATH_VAR (out);
strncpy (in, path, len); strncpy (in, path, len);
in[len] = '\0'; in[len] = '\0';
if (
#ifdef HAVE_REALPATH #ifdef HAVE_REALPATH
realpath (in, out) ENULLLOOP (rp, realpath (in, out));
#else #else
abspath (in, out) rp = abspath (in, out);
#endif #endif
&& stat (out, &st) == 0)
if (rp)
{ {
o = variable_buffer_output (o, out, strlen (out)); int r;
o = variable_buffer_output (o, " ", 1); EINTRLOOP (r, stat (out, &st));
doneany = 1; 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; const char *path = 0;
int doneany = 0; int doneany = 0;
unsigned int len = 0; unsigned int len = 0;
PATH_VAR (in);
PATH_VAR (out);
while ((path = find_next_token (&p, &len)) != 0) while ((path = find_next_token (&p, &len)) != 0)
{ {
if (len < GET_PATH_MAX) if (len < GET_PATH_MAX)
{ {
PATH_VAR (in);
PATH_VAR (out);
strncpy (in, path, len); strncpy (in, path, len);
in[len] = '\0'; 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); static char *func_call (char *o, char **argv, const char *funcname);
#define FT_ENTRY(_name, _min, _max, _exp, _func) \ #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[] = static struct function_table_entry function_table_init[] =
{ {

View File

@ -20,6 +20,7 @@ this program. If not, see <http://www.gnu.org/licenses/>. */
#include "filedef.h" #include "filedef.h"
#include "variable.h" #include "variable.h"
#include "dep.h"
/* Evaluate a buffer as make syntax. /* Evaluate a buffer as make syntax.
Ideally eval_buffer() will take const char *, but not yet. */ Ideally eval_buffer() will take const char *, but not yet. */