Annotation of GNUtools/cc/getpwd.c, revision 1.1.1.1

1.1       root        1: /* getpwd.c - get the working directory */
                      2: 
                      3: #include "config.h"
                      4: 
                      5: #include <errno.h>
                      6: #include <sys/types.h>
                      7: #include <sys/stat.h>
                      8: 
                      9: #ifndef errno
                     10: extern int errno;
                     11: #endif
                     12: 
                     13: /* Virtually every UN*X system now in common use (except for pre-4.3-tahoe
                     14:    BSD systems) now provides getcwd as called for by POSIX.  Allow for
                     15:    the few exceptions to the general rule here.  */
                     16: 
                     17: #if !(defined (POSIX) || defined (USG) || defined (VMS))
                     18: #include <sys/param.h>
                     19: extern char *getwd ();
                     20: #define getcwd(buf,len) getwd(buf)
                     21: #define GUESSPATHLEN (MAXPATHLEN + 1)
                     22: #else /* (defined (USG) || defined (VMS)) */
                     23: extern char *getcwd ();
                     24: /* We actually use this as a starting point, not a limit.  */
                     25: #define GUESSPATHLEN 100
                     26: #endif /* (defined (USG) || defined (VMS)) */
                     27: 
                     28: char *getenv ();
                     29: char *xmalloc ();
                     30: 
                     31: #ifndef VMS
                     32: 
                     33: /* Get the working directory.  Use the PWD environment variable if it's
                     34:    set correctly, since this is faster and gives more uniform answers
                     35:    to the user.  Yield the working directory if successful; otherwise,
                     36:    yield 0 and set errno.  */
                     37: 
                     38: char *
                     39: getpwd ()
                     40: {
                     41:   static char *pwd;
                     42:   static int failure_errno;
                     43: 
                     44:   char *p = pwd;
                     45:   size_t s;
                     46:   struct stat dotstat, pwdstat;
                     47: 
                     48:   if (!p && !(errno = failure_errno))
                     49:     {
                     50:       if (! ((p = getenv ("PWD")) != 0
                     51:             && *p == '/'
                     52:             && stat (p, &pwdstat) == 0
                     53:             && stat (".", &dotstat) == 0
                     54:             && dotstat.st_ino == pwdstat.st_ino
                     55:             && dotstat.st_dev == pwdstat.st_dev))
                     56: 
                     57:        /* The shortcut didn't work.  Try the slow, ``sure'' way.  */
                     58:        for (s = GUESSPATHLEN;  ! getcwd (p = xmalloc (s), s);  s *= 2)
                     59:          {
                     60:            int e = errno;
                     61:            free (p);
                     62: #ifdef ERANGE
                     63:            if (e != ERANGE)
                     64: #endif
                     65:              {
                     66:                errno = failure_errno = e;
                     67:                p = 0;
                     68:                break;
                     69:              }
                     70:          }
                     71: 
                     72:       /* Cache the result.  This assumes that the program does
                     73:         not invoke chdir between calls to getpwd.  */
                     74:       pwd = p;
                     75:     }
                     76:   return p;
                     77: }
                     78: 
                     79: #else  /* VMS */
                     80: 
                     81: #ifndef MAXPATHLEN
                     82: #define MAXPATHLEN 255
                     83: #endif
                     84: 
                     85: char *
                     86: getpwd ()
                     87: {
                     88:   static char *pwd = 0;
                     89: 
                     90:   if (!pwd) pwd = getcwd (xmalloc (MAXPATHLEN+1), MAXPATHLEN+1);
                     91:   return pwd;
                     92: }
                     93: 
                     94: #endif /* VMS */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.