Home | History | Annotate | Download | only in libiberty
      1 /* Emulate getcwd using getwd.
      2    This function is in the public domain. */
      3 
      4 /*
      5 
      6 @deftypefn Supplemental char* getcwd (char *@var{pathname}, int @var{len})
      7 
      8 Copy the absolute pathname for the current working directory into
      9 @var{pathname}, which is assumed to point to a buffer of at least
     10 @var{len} bytes, and return a pointer to the buffer.  If the current
     11 directory's path doesn't fit in @var{len} characters, the result is
     12 @code{NULL} and @code{errno} is set.  If @var{pathname} is a null pointer,
     13 @code{getcwd} will obtain @var{len} bytes of space using
     14 @code{malloc}.
     15 
     16 @end deftypefn
     17 
     18 */
     19 
     20 #include "config.h"
     21 
     22 #ifdef HAVE_SYS_PARAM_H
     23 #include <sys/param.h>
     24 #endif
     25 #include <errno.h>
     26 #ifdef HAVE_STRING_H
     27 #include <string.h>
     28 #endif
     29 #ifdef HAVE_STDLIB_H
     30 #include <stdlib.h>
     31 #endif
     32 
     33 extern char *getwd ();
     34 extern int errno;
     35 
     36 #ifndef MAXPATHLEN
     37 #define MAXPATHLEN 1024
     38 #endif
     39 
     40 char *
     41 getcwd (char *buf, size_t len)
     42 {
     43   char ourbuf[MAXPATHLEN];
     44   char *result;
     45 
     46   result = getwd (ourbuf);
     47   if (result) {
     48     if (strlen (ourbuf) >= len) {
     49       errno = ERANGE;
     50       return 0;
     51     }
     52     if (!buf) {
     53        buf = (char*)malloc(len);
     54        if (!buf) {
     55            errno = ENOMEM;
     56 	   return 0;
     57        }
     58     }
     59     strcpy (buf, ourbuf);
     60   }
     61   return buf;
     62 }
     63