hack(6): fix very old mis-merge by restoring code from OpenBSD
[games.git] / games / hack / hack.unix.c
index 318d88b..6810cba 100644 (file)
@@ -19,7 +19,9 @@
 
 #include       <sys/types.h>           /* for time_t and stat */
 #include       <sys/stat.h>
+#include       <sys/param.h>
 #include       <time.h>
+#include       <err.h>
 
 static struct tm       *getlt(void);
 static bool             veryold(int);
@@ -95,13 +97,32 @@ struct stat buf, hbuf;
 void
 gethdate(const char *name)
 {
-/* old version - for people short of space */
-char *np;
-
-       name = "/usr/games/hide/hack";
-       if(stat(name, &hbuf))
-               error("Cannot get status of %s.",
-                       (np = rindex(name, '/')) ? np+1 : name);
+       char *p, *np, *path;
+       char filename[MAXPATHLEN+1];
+
+       if (strchr(name, '/') != NULL || (p = getenv("PATH")) == NULL)
+               p = "";
+       np = path = strdup(p);  /* Make a copy for strsep. */
+       if (path == NULL)
+               err(1, NULL);
+
+       for (;;) {
+               if ((p = strsep(&np, ":")) == NULL)
+                       break;
+               if (*p == '\0')                 /* :: */
+                       (void) strlcpy(filename, name, sizeof(filename));
+               else
+                       (void) snprintf(filename, sizeof(filename),
+                           "%s/%s", p, name);
+
+               if (stat(filename, &hbuf) == 0) {
+                       free(path);
+                       return;
+               }
+       }
+       error("Cannot get status of %s.",
+               (p = strrchr(name, '/')) ? p+1 : name);
+       free(path);
 }
 
 bool