The branch main has been updated by fernape:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=fc002631af3e25c65d74ca6869c13b59f1af8689

commit fc002631af3e25c65d74ca6869c13b59f1af8689
Author:     Fernando Apesteguía <[email protected]>
AuthorDate: 2026-09-04 18:27:34 +0000
Commit:     Fernando Apesteguía <[email protected]>
CommitDate: 2026-09-06 15:25:59 +0000

    whereis(1): Respect PORTSDIR variable
    
    Respect PORTSDIR variable for those who have the ports collection in a 
different
    place than /usr/ports. PORTSDIR is a very common variable used in the ports
    framework and in /etc/make.conf among other places.
    
    While here, remove and old reference to CVS.
    
    Reviewed by:    delphij@, ngie@
    Approved by:    ngie@
    Differential Revision:  https://reviews.freebsd.org/D42156
---
 usr.bin/whereis/whereis.1 |  4 +++-
 usr.bin/whereis/whereis.c | 38 +++++++++++++++++++++-----------------
 2 files changed, 24 insertions(+), 18 deletions(-)

diff --git a/usr.bin/whereis/whereis.1 b/usr.bin/whereis/whereis.1
index 90922ce61db5..e6e2074acc40 100644
--- a/usr.bin/whereis/whereis.1
+++ b/usr.bin/whereis/whereis.1
@@ -27,7 +27,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd August 22, 2002
+.Dd September 6, 2026
 .Dt WHEREIS 1
 .Os
 .Sh NAME
@@ -71,6 +71,8 @@ Program sources are located in a list of known standard 
places,
 including all the subdirectories of
 .Pa /usr/src
 and
+.Ev PORTSDIR
+If the environment variable is not defined it defaults to
 .Pa /usr/ports .
 .Pp
 The following options are available:
diff --git a/usr.bin/whereis/whereis.c b/usr.bin/whereis/whereis.c
index 8de56b9cf654..987ff68de44c 100644
--- a/usr.bin/whereis/whereis.c
+++ b/usr.bin/whereis/whereis.c
@@ -253,6 +253,7 @@ defaults(void)
 {
        size_t s;
        char *b, buf[BUFSIZ], *cp;
+       const char *path_ports;
        int nele;
        FILE *p;
        DIR *dir;
@@ -305,7 +306,8 @@ defaults(void)
                decolonify(b, &mandirs, &nele);
        }
 
-       /* -s defaults to precompiled list, plus subdirs of /usr/ports */
+       /* -s defaults to precompiled list, plus subdirs of
+        * $PORTSDIR. If not set, it defaults to /usr/ports */
        if (!sourcedirs) {
                b = strdup(sourcepath);
                if (b == NULL)
@@ -313,32 +315,34 @@ defaults(void)
                nele = 0;
                decolonify(b, &sourcedirs, &nele);
 
-               if (stat(PATH_PORTS, &sb) == -1) {
+               path_ports = getenv("PORTSDIR");
+               if (!path_ports)
+                       path_ports = PATH_PORTS;
+
+               if (stat(path_ports, &sb) == -1) {
                        if (errno == ENOENT)
-                               /* no /usr/ports, we are done */
+                               /* no ports directory, we are done */
                                return;
-                       err(EX_OSERR, "stat(" PATH_PORTS ")");
+                       err(EX_OSERR, "stat(%s)", path_ports);
                }
                if ((sb.st_mode & S_IFMT) != S_IFDIR)
-                       /* /usr/ports is not a directory, ignore */
+                       /* path_ports is not a directory, ignore */
                        return;
-               if (access(PATH_PORTS, R_OK | X_OK) != 0)
+               if (access(path_ports, R_OK | X_OK) != 0)
                        return;
-               if ((dir = opendir(PATH_PORTS)) == NULL)
-                       err(EX_OSERR, "opendir" PATH_PORTS ")");
+               if ((dir = opendir(path_ports)) == NULL)
+                       err(EX_OSERR, "opendir(%s)", path_ports);
                while ((dirp = readdir(dir)) != NULL) {
                        /*
-                        * Not everything below PATH_PORTS is of
+                        * Not everything below path_ports is of
                         * interest.  First, all dot files and
                         * directories (e. g. .snap) can be ignored.
                         * Also, all subdirectories starting with a
-                        * capital letter are not going to be
+                        * capital letter are not going to
                         * examined, as they are used for internal
-                        * purposes (Mk, Tools, ...).  This also
-                        * matches a possible CVS subdirectory.
-                        * Finally, the distfiles subdirectory is also
-                        * special, and should not be considered to
-                        * avoid false matches.
+                        * purposes (Mk, Tools, ...).  Finally, the distfiles
+                        * subdirectory is also special, and should not be
+                        * considered to avoid false matches.
                         */
                        if (dirp->d_name[0] == '.' ||
                            /*
@@ -350,10 +354,10 @@ defaults(void)
                            (dirp->d_name[0] >= 'A' && dirp->d_name[0] <= 'Z') 
||
                            strcmp(dirp->d_name, "distfiles") == 0)
                                continue;
-                       if ((b = malloc(sizeof PATH_PORTS + 1 + dirp->d_namlen))
+                       if ((b = malloc(strlen(path_ports) + 1 + dirp->d_namlen 
+ 1))
                            == NULL)
                                abort();
-                       strcpy(b, PATH_PORTS);
+                       strcpy(b, path_ports);
                        strcat(b, "/");
                        strcat(b, dirp->d_name);
                        if (stat(b, &sb) == -1 ||

Reply via email to