Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 Aug 2013 18:06:59 +0000 (UTC)
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r253862 - head/sys/boot/ficl
Message-ID:  <201308011806.r71I6xpd088690@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marcel
Date: Thu Aug  1 18:06:58 2013
New Revision: 253862
URL: http://svnweb.freebsd.org/changeset/base/253862

Log:
  Fix the build of the testmain target. This target compiles a Forth
  interpreter that can be run on the system and as such cannot be
  compiled against libbstand. On the one hand this means we need to
  include the usual headers for system interfaces that we use and
  on the the other hand we can only use standard system interfaces.
  
  While here, define local variables only when needed to make this
  WARNS=2 clean on amd64.
  
  PR:		172542
  Obtained from:	peterj@
  Pointed out by: Jan Beich <jbeich@tormail.org>

Modified:
  head/sys/boot/ficl/loader.c

Modified: head/sys/boot/ficl/loader.c
==============================================================================
--- head/sys/boot/ficl/loader.c	Thu Aug  1 16:04:48 2013	(r253861)
+++ head/sys/boot/ficl/loader.c	Thu Aug  1 18:06:58 2013	(r253862)
@@ -33,7 +33,13 @@
 *******************************************************************/
 
 #ifdef TESTMAIN
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <stdio.h>
 #include <stdlib.h>
+#include <unistd.h>
 #else
 #include <stand.h>
 #endif
@@ -135,9 +141,9 @@ void
 ficlGetenv(FICL_VM *pVM)
 {
 #ifndef TESTMAIN
-	char	*name;
+	char	*name, *value;
 #endif
-	char	*namep, *value;
+	char	*namep;
 	int	names;
 
 #if FICL_ROBUST > 1
@@ -243,9 +249,9 @@ void
 ficlFindfile(FICL_VM *pVM)
 {
 #ifndef TESTMAIN
-	char	*name;
+	char	*name, *type;
 #endif
-	char	*type, *namep, *typep;
+	char	*namep, *typep;
 	struct	preloaded_file* fp;
 	int	names, types;
 
@@ -511,6 +517,14 @@ static void pfread(FICL_VM *pVM)
  */
 static void pfreaddir(FICL_VM *pVM)
 {
+#ifdef TESTMAIN
+    static union { 
+	struct dirent dirent;
+	char buf[512];
+    } u;
+    off_t off;
+    int len;
+#endif
     struct dirent *d;
     int fd;
 
@@ -519,7 +533,20 @@ static void pfreaddir(FICL_VM *pVM)
 #endif
 
     fd = stackPopINT(pVM->pStack);
+#if TESTMAIN
+    /*
+     * The readdirfd() function is specific to the loader environment.
+     * We do the best we can to make freaddir work, but it's not at
+     * all guaranteed.
+     */
+    off = lseek(fd, 0LL, SEEK_CUR);
+    len = getdents(fd, u.buf, sizeof(u.buf));
+    d = (len != -1) ? &u.dirent : NULL;
+    if (d != NULL)
+	lseek(fd, off + d->d_reclen, SEEK_SET);
+#else
     d = readdirfd(fd);
+#endif
     if (d != NULL) {
         stackPushPtr(pVM->pStack, d->d_name);
         stackPushINT(pVM->pStack, strlen(d->d_name));



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201308011806.r71I6xpd088690>