Blame gnulib-tests/test-getcwd-lgpl.c

Packit 33f14e
/* Test of getcwd() function.
Packit 33f14e
   Copyright (C) 2009-2017 Free Software Foundation, Inc.
Packit 33f14e
Packit 33f14e
   This program is free software: you can redistribute it and/or modify
Packit 33f14e
   it under the terms of the GNU General Public License as published by
Packit 33f14e
   the Free Software Foundation; either version 3 of the License, or
Packit 33f14e
   (at your option) any later version.
Packit 33f14e
Packit 33f14e
   This program is distributed in the hope that it will be useful,
Packit 33f14e
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 33f14e
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 33f14e
   GNU General Public License for more details.
Packit 33f14e
Packit 33f14e
   You should have received a copy of the GNU General Public License
Packit 33f14e
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit 33f14e
Packit 33f14e
#include <config.h>
Packit 33f14e
Packit 33f14e
#include <unistd.h>
Packit 33f14e
Packit 33f14e
#include "signature.h"
Packit 33f14e
SIGNATURE_CHECK (getcwd, char *, (char *, size_t));
Packit 33f14e
Packit 33f14e
#include <errno.h>
Packit 33f14e
#include <stdio.h>
Packit 33f14e
#include <stdlib.h>
Packit 33f14e
#include <string.h>
Packit 33f14e
Packit 33f14e
#include "macros.h"
Packit 33f14e
Packit 33f14e
int
Packit 33f14e
main (int argc, char **argv)
Packit 33f14e
{
Packit 33f14e
  char *pwd1;
Packit 33f14e
  char *pwd2;
Packit 33f14e
  /* If the user provides an argument, attempt to chdir there first.  */
Packit 33f14e
  if (1 < argc)
Packit 33f14e
    {
Packit 33f14e
      if (chdir (argv[1]) == 0)
Packit 33f14e
        printf ("changed to directory %s\n", argv[1]);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  pwd1 = getcwd (NULL, 0);
Packit 33f14e
  ASSERT (pwd1 && *pwd1);
Packit 33f14e
  if (1 < argc)
Packit 33f14e
    printf ("cwd=%s\n", pwd1);
Packit 33f14e
Packit 33f14e
  /* Make sure the result is usable.  */
Packit 33f14e
  ASSERT (chdir (pwd1) == 0);
Packit 33f14e
  ASSERT (chdir (".//./.") == 0);
Packit 33f14e
Packit 33f14e
  /* Make sure that result is normalized.  */
Packit 33f14e
  pwd2 = getcwd (NULL, 0);
Packit 33f14e
  ASSERT (pwd2);
Packit 33f14e
  ASSERT (strcmp (pwd1, pwd2) == 0);
Packit 33f14e
  free (pwd2);
Packit 33f14e
  {
Packit 33f14e
    size_t len = strlen (pwd1);
Packit 33f14e
    ssize_t i = len - 10;
Packit 33f14e
    if (i < 1)
Packit 33f14e
      i = 1;
Packit 33f14e
    pwd2 = getcwd (NULL, len + 1);
Packit 33f14e
    ASSERT (pwd2);
Packit 33f14e
    free (pwd2);
Packit 33f14e
    pwd2 = malloc (len + 2);
Packit 33f14e
    for ( ; i <= len; i++)
Packit 33f14e
      {
Packit 33f14e
        char *tmp;
Packit 33f14e
        errno = 0;
Packit 33f14e
        ASSERT (getcwd (pwd2, i) == NULL);
Packit 33f14e
        ASSERT (errno == ERANGE);
Packit 33f14e
        /* Allow either glibc or BSD behavior, since POSIX allows both.  */
Packit 33f14e
        errno = 0;
Packit 33f14e
        tmp = getcwd (NULL, i);
Packit 33f14e
        if (tmp)
Packit 33f14e
          {
Packit 33f14e
            ASSERT (strcmp (pwd1, tmp) == 0);
Packit 33f14e
            free (tmp);
Packit 33f14e
          }
Packit 33f14e
        else
Packit 33f14e
          {
Packit 33f14e
            ASSERT (errno == ERANGE);
Packit 33f14e
          }
Packit 33f14e
      }
Packit 33f14e
    ASSERT (getcwd (pwd2, len + 1) == pwd2);
Packit 33f14e
    pwd2[len] = '/';
Packit 33f14e
    pwd2[len + 1] = '\0';
Packit 33f14e
  }
Packit 33f14e
  ASSERT (strstr (pwd2, "/./") == NULL);
Packit 33f14e
  ASSERT (strstr (pwd2, "/../") == NULL);
Packit 33f14e
  ASSERT (strstr (pwd2 + 1 + (pwd2[1] == '/'), "//") == NULL);
Packit 33f14e
Packit 33f14e
  /* Validate a POSIX requirement on size.  */
Packit 33f14e
  errno = 0;
Packit 33f14e
  ASSERT (getcwd(pwd2, 0) == NULL);
Packit 33f14e
  ASSERT (errno == EINVAL);
Packit 33f14e
Packit 33f14e
  free (pwd1);
Packit 33f14e
  free (pwd2);
Packit 33f14e
Packit 33f14e
  return 0;
Packit 33f14e
}