verify a file's existence before copying it

From-SVN: r26898
This commit is contained in:
Bruce Korb 1999-05-12 07:32:58 +00:00 committed by Bruce Korb
parent 41af162ca7
commit 94db2f7184
2 changed files with 87 additions and 55 deletions

View File

@ -1,3 +1,9 @@
Wed May 12 07:30:31 1999 Bruce Korb <ddsinc09@ix.netcom.com>
* fixinc/fixincl.c(quoted_file_exists): new procedure to ensure that
a file exists before trying to copy it into the destination
(extract_quoted_files): use that routine.
Wed May 12 07:27:31 1999 Craig Burley <craig@jcb-sc.com>
Allow front end (like g77's) to override maintenance of errno:

View File

@ -22,14 +22,6 @@ along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifdef FIXINC_BROKEN
/* The fixincl program is known to not run properly on this particular
system. Instead of producing a probably broken executable, we force
a compilation error and let the mkfixinc.sh script install the
inclhack.sh shell script instead. */
# include "The fixincl program does not work properly on this system!"
#endif
#include "auto-host.h"
#include <sys/types.h>
@ -147,10 +139,10 @@ pid_t process_chain_head = (pid_t) -1;
const char incl_quote_pat[] = "^[ \t]*#[ \t]*include[ \t]*\"[^/]";
regex_t incl_quote_re;
char *load_file (const char *);
void process (char *, const char *);
char *load_file _P_((const char *));
void process _P_((char *, const char *));
void run_compiles ();
void wait_for_pid( pid_t, int );
void wait_for_pid _P_(( pid_t ));
void initialize ();
#include "fixincl.x"
@ -253,6 +245,9 @@ main (argc, argv)
if (file_name_ct == 0)
return EXIT_SUCCESS;
fflush (stdout);
fflush (stderr);
{
pid_t child = fork ();
if (child == NULLPROCESS)
@ -265,6 +260,11 @@ main (argc, argv)
exit (EXIT_FAILURE);
}
#ifdef DEBUG
fprintf (stderr, "Waiting for %d to complete %d files\n",
child, file_name_ct);
#endif
wait_for_pid( child, file_name_ct );
}
}
@ -279,11 +279,6 @@ main (argc, argv)
signal (SIGCLD, SIG_IGN);
#ifdef DEBUG
fprintf (stderr, "Child start -- processing %d files\n",
file_name_ct);
#endif
/* For every file specified in stdandard in
(except as throttled for bogus reasons)...
*/
@ -389,11 +384,6 @@ initialize()
void
wait_for_pid( pid_t child, int file_name_ct )
{
#ifdef DEBUG
fprintf (stderr, "Waiting for %d to complete %d files\n",
child, file_name_ct);
#endif
for (;;) {
int status;
pid_t dead_kid = wait (&status);
@ -412,10 +402,6 @@ wait_for_pid( pid_t child, int file_name_ct )
child, WEXITSTATUS( status ));
exit (EXIT_FAILURE);
}
#ifdef DEBUG
fprintf (stderr, "child finished %d files %s\n", file_name_ct,
status ? strerror (status & 0xFF) : "ok");
#endif
break; /* normal child completion */
}
@ -530,8 +516,8 @@ load_file (pz_file_name)
void
run_compiles ()
{
tSCC z_bad_comp[] = "fixincl ERROR: cannot compile %s regex for %s\n"
"\texpr = `%s'\n" "\terror %s\n";
tSCC z_bad_comp[] = "fixincl ERROR: cannot compile %s regex for %s\n\
\texpr = `%s'\n\terror %s\n";
tFixDesc *p_fixd = fixDescList;
int fix_ct = FIX_COUNT;
tTestDesc *p_test;
@ -771,16 +757,17 @@ test_test (p_test, pz_file_name)
tTestDesc *p_test;
char* pz_file_name;
{
tSCC cmd_fmt[] =
"file=%s\n\
if ( test %s ) > /dev/null 2>&1\n\
then echo TRUE\n\
else echo FALSE\n\
fi";
char *pz_res;
t_success res = FAILURE;
static char cmd_buf[4096];
tSCC cmd_fmt[] =
"file=%s\n"
"if ( test %s ) > /dev/null 2>&1\n"
"then echo TRUE\n"
"else echo FALSE\n"
"fi";
sprintf (cmd_buf, cmd_fmt, pz_file_name, p_test->pz_test_text);
pz_res = run_shell (cmd_buf);
@ -819,6 +806,41 @@ egrep_test (pz_data, p_test)
}
/* * * * * * * * * * * * *
quoted_file_exists Make sure that a file exists before we emit
the file name. If we emit the name, our invoking shell will try
to copy a non-existing file into the destination directory. */
int
quoted_file_exists (pz_src_path, pz_file_path, pz_file)
char* pz_src_path;
char* pz_file_path;
char* pz_file;
{
char z[ MAXPATHLEN ];
char* pz;
sprintf (z, "%s/%s/", pz_src_path, pz_file_path);
pz = z + strlen ( z );
for (;;) {
char ch = *pz_file++;
if (! isgraph( ch ))
return 0;
if (ch == '"')
break;
*pz++ = ch;
}
*pz = '\0';
{
struct stat s;
if (stat (z, &s) != 0)
return 0;
return S_ISREG( s.st_mode );
}
}
/* * * * * * * * * * * * *
*
extract_quoted_files
@ -840,6 +862,7 @@ egrep_test (pz_data, p_test)
Result: internally nothing. The results are written to stdout
for interpretation by the invoking shell */
void
extract_quoted_files (pz_data, pz_file_name, p_re_match)
char *pz_data;
@ -852,7 +875,7 @@ extract_quoted_files (pz_data, pz_file_name, p_re_match)
fprintf (stderr, "Quoted includes in %s\n", pz_file_name);
/* Set "pz_file_name" to point to the containing subdirectory of the source
If there is none, then it is in our current direcory, ".". */
If there is none, then it is in our current directory, ".". */
if (pz_dir_end == (char *) NULL)
pz_file_name = ".";
@ -872,23 +895,26 @@ extract_quoted_files (pz_data, pz_file_name, p_re_match)
while (*pz_incl_quot++ != '"')
;
/* Print the source directory and the subdirectory of the file
in question. */
printf ("%s %s/", pz_src_dir, pz_file_name);
pz_dir_end = pz_incl_quot;
if (quoted_file_exists (pz_src_dir, pz_file_name, pz_incl_quot))
{
/* Print the source directory and the subdirectory
of the file in question. */
printf ("%s %s/", pz_src_dir, pz_file_name);
pz_dir_end = pz_incl_quot;
/* Append to the directory the relative path of the desired file */
while (*pz_incl_quot != '"')
putc (*pz_incl_quot++, stdout);
/* Append to the directory the relative path of the desired file */
while (*pz_incl_quot != '"')
putc (*pz_incl_quot++, stdout);
/* Now print the destination directory appended with the
relative path of the desired file */
printf (" %s/%s/", pz_dest_dir, pz_file_name);
while (*pz_dir_end != '"')
putc (*pz_dir_end++, stdout);
/* Now print the destination directory appended with the
relative path of the desired file */
printf (" %s/%s/", pz_dest_dir, pz_file_name);
while (*pz_dir_end != '"')
putc (*pz_dir_end++, stdout);
/* End of entry */
putc ('\n', stdout);
/* End of entry */
putc ('\n', stdout);
}
/* Find the next entry */
if (regexec (&incl_quote_re, pz_incl_quot, 1, p_re_match, 0) != 0)
@ -936,7 +962,7 @@ process (pz_data, pz_file_name)
*/
strcpy (env_current_file + 5, pz_file_name);
process_chain_head = NOPROCESS;
fprintf (stderr, "%-50s \r", pz_file_name );
/* For every fix in our fix list, ... */
for (; todo_ct > 0; p_fixd++, todo_ct--)
{
@ -982,7 +1008,7 @@ process (pz_data, pz_file_name)
test_ct-- > 0;
p_test++)
{
#ifdef DEBUG
#ifdef DEBUG_TEST
static const char z_test_fail[] =
"%16s test %2d failed for %s\n";
#endif
@ -991,7 +1017,7 @@ process (pz_data, pz_file_name)
case TT_TEST:
if (!SUCCESSFUL (test_test (p_test, pz_file_name)))
{
#ifdef DEBUG
#ifdef DEBUG_TEST
fprintf (stderr, z_test_fail, p_fixd->fix_name,
p_fixd->test_ct - test_ct, pz_file_name);
#endif
@ -1002,7 +1028,7 @@ process (pz_data, pz_file_name)
case TT_EGREP:
if (!SUCCESSFUL (egrep_test (pz_data, p_test)))
{
#ifdef DEBUG
#ifdef DEBUG_TEST
fprintf (stderr, z_test_fail, p_fixd->fix_name,
p_fixd->test_ct - test_ct, pz_file_name);
#endif
@ -1013,7 +1039,7 @@ process (pz_data, pz_file_name)
case TT_NEGREP:
if (SUCCESSFUL (egrep_test (pz_data, p_test)))
{
#ifdef DEBUG
#ifdef DEBUG_TEST
fprintf (stderr, z_test_fail, p_fixd->fix_name,
p_fixd->test_ct - test_ct, pz_file_name);
#endif
@ -1050,6 +1076,7 @@ process (pz_data, pz_file_name)
for (;;)
{
tSCC z_err[] = "Error %d (%s) starting filter process for %s\n";
static int failCt = 0;
int fd = chain_open (fdp.read_fd,
(t_pchar *) p_fixd->patch_args,
@ -1062,8 +1089,7 @@ process (pz_data, pz_file_name)
break;
}
fprintf (stderr, "Error %d (%s) starting filter process "
"for %s\n", errno, strerror (errno),
fprintf (stderr, z_err, errno, strerror (errno),
p_fixd->fix_name);
if ((errno != EAGAIN) || (++failCt > 10))