summaryrefslogtreecommitdiffstats
path: root/usr.bin/xlint
diff options
context:
space:
mode:
authorasmodai <asmodai@FreeBSD.org>2001-04-19 15:40:04 +0000
committerasmodai <asmodai@FreeBSD.org>2001-04-19 15:40:04 +0000
commitfbae347995e452c80144b480ff5963ed5774f522 (patch)
treef795f7553034526629613707408f27edf3ff8dab /usr.bin/xlint
parent571ff11b355dd8c78bba55d92b62df11dc64218f (diff)
downloadFreeBSD-src-fbae347995e452c80144b480ff5963ed5774f522.zip
FreeBSD-src-fbae347995e452c80144b480ff5963ed5774f522.tar.gz
Change uses of mktemp() to mkstemp().
Call cc -E, not cpp, this allows lint to be unaware of any machine-dependent defines that cc(1) may normally define. Change fork() to vfork() and exit() to _exit(). Reuse temporary file so that multiple files passed can be processed without problems.
Diffstat (limited to 'usr.bin/xlint')
-rw-r--r--usr.bin/xlint/xlint/pathnames.h5
-rw-r--r--usr.bin/xlint/xlint/xlint.c124
2 files changed, 72 insertions, 57 deletions
diff --git a/usr.bin/xlint/xlint/pathnames.h b/usr.bin/xlint/xlint/pathnames.h
index d03845d..93a842a 100644
--- a/usr.bin/xlint/xlint/pathnames.h
+++ b/usr.bin/xlint/xlint/pathnames.h
@@ -29,10 +29,15 @@
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
*/
/* directory where lint1 and lint2 reside */
#define PATH_LIBEXEC "/usr/libexec"
+/* directory where cc(1) resides */
+#define PATH_USRBIN "/usr/bin"
+
/* default library search path */
#define PATH_LINTLIB "/usr/libdata/lint"
diff --git a/usr.bin/xlint/xlint/xlint.c b/usr.bin/xlint/xlint/xlint.c
index 3735688..7505bdd 100644
--- a/usr.bin/xlint/xlint/xlint.c
+++ b/usr.bin/xlint/xlint/xlint.c
@@ -58,6 +58,9 @@ static const char *tmpdir;
/* path name for cpp output */
static char *cppout;
+/* filedescriptor for cpp output */
+static int cppoutfd = -1;
+
/* files created by 1st pass */
static char **p1out;
@@ -67,11 +70,11 @@ static char **p2in;
/* library which will be created by 2nd pass */
static char *p2out;
-/* flags always passed to cpp */
-static char **cppflags;
+/* flags always passed to cc(1) */
+static char **cflags;
-/* flags for cpp, controled by sflag/tflag */
-static char **lcppflgs;
+/* flags for cc(1), controled by sflag/tflag */
+static char **lcflags;
/* flags for lint1 */
static char **l1flags;
@@ -121,7 +124,8 @@ static const char *basename __P((const char *, int));
static void appdef __P((char ***, const char *));
static void usage __P((void));
static void fname __P((const char *, int));
-static void runchild __P((const char *, char *const *, const char *));
+static void runchild __P((const char *, char *const *, const char *,
+ int));
static void findlibs __P((char *const *));
static int rdok __P((const char *));
static void lint2 __P((void));
@@ -226,6 +230,8 @@ terminate(signo)
{
int i;
+ if (cppoutfd != -1)
+ (void)close(cppoutfd);
if (cppout != NULL)
(void)remove(cppout);
@@ -292,7 +298,6 @@ main(argc, argv)
int c;
char flgbuf[3], *tmp, *s;
size_t len;
- struct utsname un;
if ((tmp = getenv("TMPDIR")) == NULL || (len = strlen(tmp)) == 0) {
tmpdir = xstrdup(_PATH_TMP);
@@ -304,15 +309,16 @@ main(argc, argv)
cppout = xmalloc(strlen(tmpdir) + sizeof ("lint0.XXXXXX"));
(void)sprintf(cppout, "%slint0.XXXXXX", tmpdir);
- if (mktemp(cppout) == NULL) {
+ cppoutfd = mkstemp(cppout);
+ if (cppoutfd == -1) {
warn("can't make temp");
terminate(-1);
}
p1out = xcalloc(1, sizeof (char *));
p2in = xcalloc(1, sizeof (char *));
- cppflags = xcalloc(1, sizeof (char *));
- lcppflgs = xcalloc(1, sizeof (char *));
+ cflags = xcalloc(1, sizeof (char *));
+ lcflags = xcalloc(1, sizeof (char *));
l1flags = xcalloc(1, sizeof (char *));
l2flags = xcalloc(1, sizeof (char *));
l2libs = xcalloc(1, sizeof (char *));
@@ -320,34 +326,19 @@ main(argc, argv)
libs = xcalloc(1, sizeof (char *));
libsrchpath = xcalloc(1, sizeof (char *));
- appcstrg(&cppflags, "-lang-c");
- appcstrg(&cppflags, "-$");
- appcstrg(&cppflags, "-C");
- appcstrg(&cppflags, "-Wcomment");
-#ifdef __FreeBSD__
- appcstrg(&cppflags, "-D__FreeBSD__=" __XSTRING(__FreeBSD__));
-#else
-# error "This ain't NetBSD. You lose!"
- appcstrg(&cppflags, "-D__NetBSD__");
-#endif
- appcstrg(&cppflags, "-Dlint"); /* XXX don't def. with -s */
- appdef(&cppflags, "lint");
- appdef(&cppflags, "unix");
+ appcstrg(&cflags, "-E");
+ appcstrg(&cflags, "-x");
+ appcstrg(&cflags, "c");
+ appcstrg(&cflags, "-D__attribute__(x)=");
+ appcstrg(&cflags, "-Wp,-$");
+ appcstrg(&cflags, "-Wp,-Cc");
+ appcstrg(&cflags, "-Wcomment");
+ appcstrg(&cflags, "-Dlint"); /* XXX don't def. with -s */
- appcstrg(&lcppflgs, "-Wtraditional");
+ appdef(&cflags, "lint");
- if (uname(&un) == -1)
- err(1, "uname");
- appdef(&cppflags, un.machine);
- appstrg(&lcppflgs, concat2("-D", un.machine));
+ appcstrg(&lcflags, "-Wtraditional");
-#ifdef MACHINE_ARCH
- if (strcmp(un.machine, MACHINE_ARCH) != 0) {
- appdef(&cppflags, MACHINE_ARCH);
- appstrg(&lcppflgs, concat2("-D", MACHINE_ARCH));
- }
-#endif
-
appcstrg(&deflibs, "c");
if (signal(SIGHUP, terminate) == SIG_IGN)
@@ -410,11 +401,11 @@ main(argc, argv)
case 's':
if (tflag)
usage();
- freelst(&lcppflgs);
- appcstrg(&lcppflgs, "-trigraphs");
- appcstrg(&lcppflgs, "-Wtrigraphs");
- appcstrg(&lcppflgs, "-pedantic");
- appcstrg(&lcppflgs, "-D__STRICT_ANSI__");
+ freelst(&lcflags);
+ appcstrg(&lcflags, "-trigraphs");
+ appcstrg(&lcflags, "-Wtrigraphs");
+ appcstrg(&lcflags, "-pedantic");
+ appcstrg(&lcflags, "-D__STRICT_ANSI__");
appcstrg(&l1flags, "-s");
appcstrg(&l2flags, "-s");
sflag = 1;
@@ -423,11 +414,11 @@ main(argc, argv)
case 't':
if (sflag)
usage();
- freelst(&lcppflgs);
- appcstrg(&lcppflgs, "-traditional");
- appstrg(&lcppflgs, concat2("-D", MACHINE));
+ freelst(&lcflags);
+ appcstrg(&lcflags, "-traditional");
+ appstrg(&lcflags, concat2("-D", MACHINE));
#ifdef MACHINE_ARCH
- appstrg(&lcppflgs, concat2("-D", MACHINE_ARCH));
+ appstrg(&lcflags, concat2("-D", MACHINE_ARCH));
#endif
appcstrg(&l1flags, "-t");
appcstrg(&l2flags, "-t");
@@ -452,7 +443,7 @@ main(argc, argv)
case 'I':
case 'U':
(void)sprintf(flgbuf, "-%c", c);
- appstrg(&cppflags, concat2(flgbuf, optarg));
+ appstrg(&cflags, concat2(flgbuf, optarg));
break;
case 'l':
@@ -531,6 +522,7 @@ fname(name, last)
const char *bn, *suff;
char **args, *ofn, *path;
size_t len;
+ int fd;
bn = basename(name, '/');
suff = basename(bn, '.');
@@ -564,28 +556,39 @@ fname(name, last)
} else {
ofn = xmalloc(strlen(tmpdir) + sizeof ("lint1.XXXXXX"));
(void)sprintf(ofn, "%slint1.XXXXXX", tmpdir);
- if (mktemp(ofn) == NULL) {
+ fd = mkstemp(ofn);
+ if (fd == -1) {
warn("can't make temp");
terminate(-1);
}
+ close(fd);
}
if (!iflag)
appcstrg(&p1out, ofn);
args = xcalloc(1, sizeof (char *));
- /* run cpp */
+ /* run cc */
- path = xmalloc(strlen(PATH_LIBEXEC) + sizeof ("/cpp"));
- (void)sprintf(path, "%s/cpp", PATH_LIBEXEC);
+ path = xmalloc(strlen(PATH_USRBIN) + sizeof ("/cc"));
+ (void)sprintf(path, "%s/cc", PATH_USRBIN);
appcstrg(&args, path);
- applst(&args, cppflags);
- applst(&args, lcppflgs);
+ applst(&args, cflags);
+ applst(&args, lcflags);
appcstrg(&args, name);
- appcstrg(&args, cppout);
- runchild(path, args, cppout);
+ /* we reuse the same tmp file for cpp output, so rewind and truncate */
+ if (lseek(cppoutfd, SEEK_SET, (off_t)0) != 0) {
+ warn("lseek");
+ terminate(-1);
+ }
+ if (ftruncate(cppoutfd, (off_t)0) != 0) {
+ warn("ftruncate");
+ terminate(-1);
+ }
+
+ runchild(path, args, cppout, cppoutfd);
free(path);
freelst(&args);
@@ -599,7 +602,7 @@ fname(name, last)
appcstrg(&args, cppout);
appcstrg(&args, ofn);
- runchild(path, args, ofn);
+ runchild(path, args, ofn, -1);
free(path);
freelst(&args);
@@ -610,9 +613,10 @@ fname(name, last)
}
static void
-runchild(path, args, crfn)
+runchild(path, args, crfn, fdout)
const char *path, *crfn;
char *const *args;
+ int fdout;
{
int status, rv, signo, i;
@@ -626,7 +630,7 @@ runchild(path, args, crfn)
(void)fflush(stdout);
- switch (fork()) {
+ switch (vfork()) {
case -1:
warn("cannot fork");
terminate(-1);
@@ -636,9 +640,15 @@ runchild(path, args, crfn)
break;
case 0:
/* child */
+
+ /* setup the standard output if necessary */
+ if (fdout != -1) {
+ dup2(fdout, STDOUT_FILENO);
+ close(fdout);
+ }
(void)execv(path, args);
warn("cannot exec %s", path);
- exit(1);
+ _exit(1);
/* NOTREACHED */
}
@@ -720,7 +730,7 @@ lint2()
applst(&args, l2libs);
applst(&args, p2in);
- runchild(path, args, p2out);
+ runchild(path, args, p2out, -1);
free(path);
freelst(&args);
free(args);
OpenPOWER on IntegriCloud