mirror of
https://github.com/mirror/make.git
synced 2025-01-28 05:10:24 +08:00
Use ENULLLOOP to handle EINTR during realpath(). Fixes Savannah bug #38420
This commit is contained in:
parent
5058a94ee7
commit
450b7e1a3d
@ -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
1
dep.h
@ -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);
|
||||||
|
34
function.c
34
function.c
@ -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[] =
|
||||||
{
|
{
|
||||||
|
@ -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. */
|
||||||
|
Loading…
Reference in New Issue
Block a user