[rtems commit] Remove getcwd()

Sebastian Huber sebh at rtems.org
Mon Oct 22 06:16:37 UTC 2018


Module:    rtems
Branch:    master
Commit:    f59edebf7e18953af6a37c717a53a7623bfd3887
Changeset: http://git.rtems.org/rtems/commit/?id=f59edebf7e18953af6a37c717a53a7623bfd3887

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Thu Oct 18 14:39:09 2018 +0200

Remove getcwd()

This function is provided by Newlib since 2000.

Update #3409.

---

 cpukit/Makefile.am              |   1 -
 cpukit/configure.ac             |   4 -
 cpukit/libcsupport/src/getcwd.c | 296 ----------------------------------------
 3 files changed, 301 deletions(-)

diff --git a/cpukit/Makefile.am b/cpukit/Makefile.am
index 3524d39..0f550cf 100644
--- a/cpukit/Makefile.am
+++ b/cpukit/Makefile.am
@@ -137,7 +137,6 @@ librtemscpu_a_SOURCES += libcsupport/src/ftruncate.c
 librtemscpu_a_SOURCES += libcsupport/src/ftrylockfile.c
 librtemscpu_a_SOURCES += libcsupport/src/funlockfile.c
 librtemscpu_a_SOURCES += libcsupport/src/getchark.c
-librtemscpu_a_SOURCES += libcsupport/src/getcwd.c
 librtemscpu_a_SOURCES += libcsupport/src/getdents.c
 librtemscpu_a_SOURCES += libcsupport/src/getegid.c
 librtemscpu_a_SOURCES += libcsupport/src/geteuid.c
diff --git a/cpukit/configure.ac b/cpukit/configure.ac
index ae96f55..ffc8d51 100644
--- a/cpukit/configure.ac
+++ b/cpukit/configure.ac
@@ -160,10 +160,6 @@ AC_MSG_RESULT([no])
 ])
 AC_LANG_POP(C)
 
-# Newlib's unix/ directory
-AC_CHECK_FUNCS([getcwd])
-# </FIXME>
-
 # Check if the installed toolchain provides these headers
 # and error out if not.
 AC_CHECK_HEADERS([errno.h sched.h semaphore.h sys/cdefs.h sys/queue.h tar.h threads.h],,
diff --git a/cpukit/libcsupport/src/getcwd.c b/cpukit/libcsupport/src/getcwd.c
deleted file mode 100644
index 6e05c5d..0000000
--- a/cpukit/libcsupport/src/getcwd.c
+++ /dev/null
@@ -1,296 +0,0 @@
-/**
- * @file
- *
- * @brief Get Current Working Directory
- * @ingroup libcsupport
- */
-
-/*
- * Copyright (c) 1989, 1991 The Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *  Copied from newlib 1.8.1.  RTEMS can not build all of the contents
- *  of the UNIX directory but we need this routine.
- */
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#ifndef HAVE_GETCWD
-
-/*
- *  Added these when moved to RTEMS
- */
-
-#define _stat     stat
-#define _opendir  opendir
-#define _fstat    fstat
-#define _readdir  readdir
-#define _closedir closedir
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)getcwd.c	5.11 (Berkeley) 2/24/91";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/stat.h>
-#include <errno.h>
-#include <dirent.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <reent.h>
-#include <_syslist.h>
-
-#define bcopy(a,b,c)	memmove (b,a,c)
-
-#define	ISDOT(dp) \
-	(dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || \
-	    (dp->d_name[1] == '.' && dp->d_name[2] == '\0')))
-
-#ifndef _REENT_ONLY
-
-char *
-getcwd (
-     char *pt,
-     size_t size)
-{
-  register struct dirent *dp;
-  register DIR *dir = 0;
-  register dev_t dev;
-  register ino_t ino;
-  register int first;
-  register char *bpt, *bup;
-  struct stat s;
-  dev_t root_dev;
-  ino_t root_ino;
-  size_t ptsize, upsize;
-  int save_errno;
-  char *ept, *eup, *up;
-
-  /*
-   * If no buffer specified by the user, allocate one as necessary.
-   * If a buffer is specified, the size has to be non-zero.  The path
-   * is built from the end of the buffer backwards.
-   */
-
-  if (pt)
-    {
-      ptsize = 0;
-      if (!size)
-	{
-	  errno = EINVAL;
-	  return (char *) NULL;
-	}
-      ept = pt + size;
-    }
-  else
-    {
-      if (!(pt = (char *) malloc (ptsize = 1024 - 4)))
-	{
-	  return (char *) NULL;
-	}
-      ept = pt + ptsize;
-    }
-  bpt = ept - 1;
-  *bpt = '\0';
-
-  /*
-   * Allocate bytes (1024 - malloc space) for the string of "../"'s.
-   * Should always be enough (it's 340 levels).  If it's not, allocate
-   * as necessary.  Special * case the first stat, it's ".", not "..".
-   */
-
-  if (!(up = (char *) malloc (upsize = 1024 - 4)))
-    {
-      goto err;
-    }
-  eup = up + MAXPATHLEN;
-  bup = up;
-  up[0] = '.';
-  up[1] = '\0';
-
-  /* Save root values, so know when to stop. */
-  if (stat ("/", &s))
-    goto err;
-  root_dev = s.st_dev;
-  root_ino = s.st_ino;
-
-  errno = 0;			/* XXX readdir has no error return. */
-
-  for (first = 1;; first = 0)
-    {
-      /* Stat the current level. */
-      if (_stat (up, &s))
-	goto err;
-
-      /* Save current node values. */
-      ino = s.st_ino;
-      dev = s.st_dev;
-
-      /* Check for reaching root. */
-      if (root_dev == dev && root_ino == ino)
-	{
-	  *--bpt = '/';
-	  /*
-	   * It's unclear that it's a requirement to copy the
-	   * path to the beginning of the buffer, but it's always
-	   * been that way and stuff would probably break.
-	   */
-	  (void) bcopy (bpt, pt, ept - bpt);
-	  free (up);
-	  return pt;
-	}
-
-      /*
-       * Build pointer to the parent directory, allocating memory
-       * as necessary.  Max length is 3 for "../", the largest
-       * possible component name, plus a trailing NULL.
-       */
-
-      if (bup + 3 + MAXNAMLEN + 1 >= eup)
-	{
-	  if (!(up = (char *) realloc (up, upsize *= 2)))
-	    {
-	      goto err;
-	    }
-	  bup = up;
-	  eup = up + upsize;
-	}
-      *bup++ = '.';
-      *bup++ = '.';
-      *bup = '\0';
-
-      /* Open and stat parent directory. */
-      if (!(dir = _opendir (up)) || _fstat (__dirfd (dir), &s))
-	goto err;
-
-      /* Add trailing slash for next directory. */
-      *bup++ = '/';
-
-      /*
-       * If it's a mount point, have to stat each element because
-       * the inode number in the directory is for the entry in the
-       * parent directory, not the inode number of the mounted file.
-       */
-
-      save_errno = 0;
-      if (s.st_dev == dev)
-	{
-	  for (;;)
-	    {
-	      if (!(dp = _readdir (dir)))
-		goto notfound;
-	      if (dp->d_ino == ino)
-		break;
-	    }
-	}
-      else
-	for (;;)
-	  {
-	    if (!(dp = _readdir (dir)))
-	      goto notfound;
-	    if (ISDOT (dp))
-	      continue;
-	    bcopy (dp->d_name, bup, strlen (dp->d_name) + 1);
-
-	    /* Save the first error for later. */
-	    if (stat (up, &s))
-	      {
-		if (!save_errno)
-		  save_errno = errno;
-		errno = 0;
-		continue;
-	      }
-	    if (s.st_dev == dev && s.st_ino == ino)
-	      break;
-	  }
-
-      /*
-       * Check for length of the current name, preceding slash,
-       * leading slash.
-       */
-
-      if (bpt - pt <= strlen (dp->d_name) + (first ? 1 : 2))
-	{
-	  size_t len, off;
-
-	  if (!ptsize)
-	    {
-	      errno = ERANGE;
-	      goto err;
-	    }
-	  off = bpt - pt;
-	  len = ept - bpt;
-	  if (!(pt = (char *) realloc (pt, ptsize *= 2)))
-	    {
-	      goto err;
-	    }
-	  bpt = pt + off;
-	  ept = pt + ptsize;
-	  (void) bcopy (bpt, ept - len, len);
-	  bpt = ept - len;
-	}
-      if (!first)
-	*--bpt = '/';
-      bpt -= strlen (dp->d_name);
-      bcopy (dp->d_name, bpt, strlen (dp->d_name));
-      (void) _closedir (dir);
-      dir = 0;
-
-      /* Truncate any file name. */
-      *bup = '\0';
-    }
-
-notfound:
-  /*
-   * If readdir set errno, use it, not any saved error; otherwise,
-   * didn't find the current directory in its parent directory, set
-   * errno to ENOENT.
-   */
-
-  if (!errno)
-    errno = save_errno ? save_errno : ENOENT;
-  /* FALLTHROUGH */
-
-err:
-  if(dir)
-    (void) _closedir (dir);
-  if (ptsize)
-    free (pt);
-  free (up);
-  return (char *) NULL;
-}
-
-#endif /* _REENT_ONLY */
-
-#endif




More information about the vc mailing list