* lib-src/etags.c (O_CLOEXEC) [WINDOWSNT]: Define.
Include fcntl.h, for O_CLOEXEC.
(process_file_name): Don't use 'popen', whose streams cannot be
rewound. Instead, uncompress the file to a temporary file,
created by 'etags_mktmp', and read from that as usual.
(etags_mktmp): New function.
* test/etags/ETAGS.good_1:
* test/etags/ETAGS.good_2:
* test/etags/ETAGS.good_3:
* test/etags/ETAGS.good_4:
* test/etags/ETAGS.good_5: Update to be consistent with latest
changes in etags.c regarding reading compressed files.
# undef HAVE_NTGUI
# undef DOS_NT
# define DOS_NT
+# define O_CLOEXEC O_NOINHERIT
#endif /* WINDOWSNT */
#include <unistd.h>
#include <sysstdio.h>
#include <ctype.h>
#include <errno.h>
+#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <binary-io.h>
static char *absolute_dirname (char *, char *);
static bool filename_is_absolute (char *f);
static void canonicalize_filename (char *);
+static char *etags_mktmp (void);
static void linebuffer_init (linebuffer *);
static void linebuffer_setlen (linebuffer *, int);
static void *xmalloc (size_t);
fdesc *fdp;
compressor *compr;
char *compressed_name, *uncompressed_name;
- char *ext, *real_name;
+ char *ext, *real_name, *tmp_name;
int retval;
canonicalize_filename (file);
}
if (real_name == compressed_name)
{
- char *cmd = concat (compr->command, " ", real_name);
- inf = popen (cmd, "r" FOPEN_BINARY);
- free (cmd);
+ tmp_name = etags_mktmp ();
+ if (!tmp_name)
+ inf = NULL;
+ else
+ {
+ char *cmd1 = concat (compr->command, " ", real_name);
+ char *cmd = concat (cmd1, " > ", tmp_name);
+ free (cmd1);
+ if (system (cmd) == -1)
+ inf = NULL;
+ else
+ inf = fopen (tmp_name, "r" FOPEN_BINARY);
+ free (cmd);
+ }
}
else
inf = fopen (real_name, "r" FOPEN_BINARY);
process_file (inf, uncompressed_name, lang);
+ retval = fclose (inf);
if (real_name == compressed_name)
- retval = pclose (inf);
- else
- retval = fclose (inf);
+ {
+ remove (tmp_name);
+ free (tmp_name);
+ }
if (retval < 0)
pfatal (file);
}
}
- /* We rewind here, even if inf may be a pipe. We fail if the
- length of the first line is longer than the pipe block size,
- which is unlikely. */
rewind (inf);
/* Else try to guess the language given the case insensitive file name. */
if (old_last_node == last_node)
/* No Fortran entries found. Try C. */
{
- /* We do not tag if rewind fails.
- Only the file name will be recorded in the tags file. */
rewind (inf);
curfdp->lang = get_language_from_langname (cplusplus ? "c++" : "c");
find_entries (inf);
TEX_opgrp = '<';
TEX_clgrp = '>';
}
- /* If the input file is compressed, inf is a pipe, and rewind may fail.
- No attempt is made to correct the situation. */
rewind (inf);
}
return path;
}
+/* Return a newly allocated string containing a name of a temporary file. */
+static char *
+etags_mktmp (void)
+{
+ const char *tmpdir = getenv ("TMPDIR");
+ const char *slash = "/";
+
+#if MSDOS || defined (DOS_NT)
+ if (!tmpdir)
+ tmpdir = getenv ("TEMP");
+ if (!tmpdir)
+ tmpdir = getenv ("TMP");
+ if (!tmpdir)
+ tmpdir = ".";
+ if (tmpdir[strlen (tmpdir) - 1] == '/'
+ || tmpdir[strlen (tmpdir) - 1] == '\\')
+ slash = "";
+#else
+ if (!tmpdir)
+ tmpdir = "/tmp";
+ if (tmpdir[strlen (tmpdir) - 1] == '/')
+ slash = "";
+#endif
+
+ char *templt = concat (tmpdir, slash, "etXXXXXX");
+ int fd = mkostemp (templt, O_CLOEXEC);
+ if (fd < 0)
+ {
+ free (templt);
+ templt = NULL;
+ }
+ else
+ close (fd);
+
+#if defined (DOS_NT)
+ /* The file name will be used in shell redirection, so it needs to have
+ DOS-style backslashes, or else the Windows shell will barf. */
+ char *p;
+ for (p = templt; *p; p++)
+ if (*p == '/')
+ *p = '\\';
+#endif
+ return templt;
+}
+
/* Return a newly allocated string containing the file name of FILE
relative to the absolute directory DIR (which should end with a slash). */
static char *
& intensity1(\7f577,12231
character*(*) function foo(\7f579,12307
\f
-f-src/entry.strange,171
- LOGICAL FUNCTION PRTPKG \7f2,2
- ENTRY SETPRT \7f193,3793
- ENTRY MSGSEL \7f394,8405
- & intensity1(\7f576,12158
- character*(*) function foo(\7f578,12234
+f-src/entry.strange,172
+ LOGICAL FUNCTION PRTPKG \7f3,75
+ ENTRY SETPRT \7f194,3866
+ ENTRY MSGSEL \7f395,8478
+ & intensity1(\7f577,12231
+ character*(*) function foo(\7f579,12307
\f
forth-src/test-forth.fth,408
: a-forth-word \7f20,301
& intensity1(\7f577,12231
character*(*) function foo(\7f579,12307
\f
-f-src/entry.strange,171
- LOGICAL FUNCTION PRTPKG \7f2,2
- ENTRY SETPRT \7f193,3793
- ENTRY MSGSEL \7f394,8405
- & intensity1(\7f576,12158
- character*(*) function foo(\7f578,12234
+f-src/entry.strange,172
+ LOGICAL FUNCTION PRTPKG \7f3,75
+ ENTRY SETPRT \7f194,3866
+ ENTRY MSGSEL \7f395,8478
+ & intensity1(\7f577,12231
+ character*(*) function foo(\7f579,12307
\f
forth-src/test-forth.fth,408
: a-forth-word \7f20,301
& intensity1(\7f577,12231
character*(*) function foo(\7f579,12307
\f
-f-src/entry.strange,171
- LOGICAL FUNCTION PRTPKG \7f2,2
- ENTRY SETPRT \7f193,3793
- ENTRY MSGSEL \7f394,8405
- & intensity1(\7f576,12158
- character*(*) function foo(\7f578,12234
+f-src/entry.strange,172
+ LOGICAL FUNCTION PRTPKG \7f3,75
+ ENTRY SETPRT \7f194,3866
+ ENTRY MSGSEL \7f395,8478
+ & intensity1(\7f577,12231
+ character*(*) function foo(\7f579,12307
\f
forth-src/test-forth.fth,408
: a-forth-word \7f20,301
& intensity1(\7f577,12231
character*(*) function foo(\7f579,12307
\f
-f-src/entry.strange,171
- LOGICAL FUNCTION PRTPKG \7f2,2
- ENTRY SETPRT \7f193,3793
- ENTRY MSGSEL \7f394,8405
- & intensity1(\7f576,12158
- character*(*) function foo(\7f578,12234
+f-src/entry.strange,172
+ LOGICAL FUNCTION PRTPKG \7f3,75
+ ENTRY SETPRT \7f194,3866
+ ENTRY MSGSEL \7f395,8478
+ & intensity1(\7f577,12231
+ character*(*) function foo(\7f579,12307
\f
forth-src/test-forth.fth,408
: a-forth-word \7f20,301
& intensity1(\7f577,12231
character*(*) function foo(\7f579,12307
\f
-f-src/entry.strange,171
- LOGICAL FUNCTION PRTPKG \7f2,2
- ENTRY SETPRT \7f193,3793
- ENTRY MSGSEL \7f394,8405
- & intensity1(\7f576,12158
- character*(*) function foo(\7f578,12234
+f-src/entry.strange,172
+ LOGICAL FUNCTION PRTPKG \7f3,75
+ ENTRY SETPRT \7f194,3866
+ ENTRY MSGSEL \7f395,8478
+ & intensity1(\7f577,12231
+ character*(*) function foo(\7f579,12307
\f
forth-src/test-forth.fth,408
: a-forth-word \7f20,301