Subject: Re: pkg/31489
To: None <pkg-manager@netbsd.org, gnats-admin@netbsd.org,>
From: RUMI Szabolcs <rumi@rtfm.hu>
List: pkgsrc-bugs
Date: 10/06/2005 10:17:02
The following reply was made to PR pkg/31489; it has been noted by GNATS.

From: RUMI Szabolcs <rumi@rtfm.hu>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: pkg/31489
Date: Thu, 6 Oct 2005 12:16:27 +0200

 looks like the __P macro wasn't defined.
 I added #define __P(x) x and it seems to work.
 
 I got past this but I ran into another problem. I don't know if it is a good
 practice but I'd think this synopsis allows me to append all compilation
 problem reports of this package to this PR so here is the next one:
 
 source='DirectoryScanner.c++' object='DirectoryScanner.o' libtool=no \
 depfile='.deps/DirectoryScanner.Po' tmpdepfile='.deps/DirectoryScanner.TPo' \
 depmode=tru64 /bin/ksh ../depcomp \
 cxx -DHAVE_CONFIG_H -I. -I. -I.. -I../include -DFAM_CONF=\"/usr/pkg/etc/fam.conf\"    -O2 -ieee -ieee -c -o DirectoryScanner.o `test -f 'DirectoryScanner.c++' || echo './'`DirectoryScanner.c++
 cxx: Error: DirectoryScanner.c++, line 103: a value of type "dirent *" cannot
           be used to initialize an entity of type "direct *"
         struct direct *dp = readdir(dir);
 ----------------------------^
 cxx: Error: DirectoryScanner.c++, line 112: pointer to incomplete class type
           is not allowed
         if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
 --------------------^
 cxx: Error: DirectoryScanner.c++, line 112: pointer to incomplete class type
           is not allowed
         if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
 ------------------------------------------------^
 cxx: Error: DirectoryScanner.c++, line 116: pointer to incomplete class type
           is not allowed
         if (ep && !strcmp(dp->d_name, ep->name()))
 --------------------------^
 cxx: Error: DirectoryScanner.c++, line 122: pointer to incomplete class type
           is not allowed
         else if ((epp2 = match_name(&discard, dp->d_name)) != NULL)
 ----------------------------------------------^
 cxx: Error: DirectoryScanner.c++, line 132: pointer to incomplete class type
           is not allowed
         else if (ep && (epp2 = match_name(&ep->next, dp->d_name)))
 -----------------------------------------------------^
 cxx: Error: DirectoryScanner.c++, line 147: pointer to incomplete class type
           is not allowed
             ep = new DirEntry(dp->d_name, &directory, *epp);
 ------------------------------^
 cxx: Info: 7 errors detected in the compilation of "DirectoryScanner.c++".
 gmake[2]: *** [DirectoryScanner.o] Error 1
 gmake[2]: Leaving directory `/home/admin/pkgsrc/work/sysutils/fam/work/fam-2.7.0/src'
 gmake[1]: *** [all-recursive] Error 1
 gmake[1]: Leaving directory `/home/admin/pkgsrc/work/sysutils/fam/work/fam-2.7.0'
 gmake: *** [all] Error 2
 *** Error code 2
 
 Stop.
 
 Excerpt from the dirent.h of Tru64 UNIX:
 
 /*
  * The POSIX standard way of returning directory entries is in directory entry
  * structures, which are of variable length.  Each directory entry has
  * a struct direct at the front of it, containing its inode number,
  * the length of the entry, and the length of the name contained in
  * the entry.  These are followed by the name padded to a 4 byte boundary
  * with null bytes.  All names are guaranteed null terminated.
  * The maximum length of a name in a directory is returned by
  * pathconf(directory_pathname, _PC_NAME_MAX).  The type struct dirent is
  * a template for the beginning of the actual structure, since the
  * length is variable, and so should only be used to declare
  * struct dirent * pointer types.
  */
 
 Another excerpt from dirent.h:
 
 #ifndef _KERNEL
 #define direct dirent
 
 When I change the type of dp to struct dirent *, errors go away.