X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=tests%2Ftest-symlinkat.c;h=11d383516e952d94ae762ae15749752b7194d5c3;hb=23eecb48e39afd0d267d64d40ba6bf97aa865e13;hp=7942d27b68316a15143a236580bb40f33c548186;hpb=ac181274675d799dc733b278418b2caa530e4c4d;p=gnulib.git diff --git a/tests/test-symlinkat.c b/tests/test-symlinkat.c index 7942d27b6..11d383516 100644 --- a/tests/test-symlinkat.c +++ b/tests/test-symlinkat.c @@ -1,5 +1,5 @@ -/* Tests of symlinkat and readlinkat. - Copyright (C) 2009 Free Software Foundation, Inc. +/* Tests of symlinkat. + Copyright (C) 2009-2013 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,101 +20,70 @@ #include +#include "signature.h" +SIGNATURE_CHECK (symlinkat, int, (char const *, int, char const *)); + #include #include +#include #include #include #include #include +#include "ignore-value.h" +#include "macros.h" + #ifndef HAVE_SYMLINK # define HAVE_SYMLINK 0 #endif -#define ASSERT(expr) \ - do \ - { \ - if (!(expr)) \ - { \ - fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \ - fflush (stderr); \ - abort (); \ - } \ - } \ - while (0) +#define BASE "test-symlinkat.t" -int -main () +#include "test-symlink.h" + +static int dfd = AT_FDCWD; + +static int +do_symlink (char const *contents, char const *name) { - char buf[80]; + return symlinkat (contents, dfd, name); +} - /* Create handle for future use. */ - int dfd = openat (AT_FDCWD, ".", O_RDONLY); +int +main (void) +{ + int result; + + /* Remove any leftovers from a previous partial run. */ + ignore_value (system ("rm -rf " BASE "*")); + + /* Test behaviour for invalid file descriptors. */ + { + errno = 0; + ASSERT (symlinkat ("foo", -1, "bar") == -1); + ASSERT (errno == EBADF + || errno == ENOSYS /* seen on mingw */ + ); + } + { + close (99); + errno = 0; + ASSERT (symlinkat ("foo", 99, "bar") == -1); + ASSERT (errno == EBADF + || errno == ENOSYS /* seen on mingw */ + ); + } + + /* Perform same checks as counterpart functions. */ + result = test_symlink (do_symlink, false); + dfd = openat (AT_FDCWD, ".", O_RDONLY); ASSERT (0 <= dfd); - - /* Sanity checks of failures. Mingw lacks symlinkat, but readlinkat - can still distinguish between various errors. */ - errno = 0; - ASSERT (readlinkat (AT_FDCWD, "no_such", buf, sizeof buf) == -1); - ASSERT (errno == ENOENT); - errno = 0; - ASSERT (readlinkat (dfd, "no_such", buf, sizeof buf) == -1); - ASSERT (errno == ENOENT); - errno = 0; - ASSERT (readlinkat (AT_FDCWD, "", buf, sizeof buf) == -1); - ASSERT (errno == ENOENT); - errno = 0; - ASSERT (readlinkat (dfd, "", buf, sizeof buf) == -1); - ASSERT (errno == ENOENT); - errno = 0; - ASSERT (readlinkat (AT_FDCWD, ".", buf, sizeof buf) == -1); - ASSERT (errno == EINVAL); - errno = 0; - ASSERT (readlinkat (dfd, ".", buf, sizeof buf) == -1); - ASSERT (errno == EINVAL); - errno = 0; - ASSERT (symlinkat ("who cares", AT_FDCWD, "") == -1); - ASSERT (errno == ENOENT || errno == ENOSYS); - errno = 0; - ASSERT (symlinkat ("who cares", dfd, "") == -1); - ASSERT (errno == ENOENT || errno == ENOSYS); - - /* Skip everything else on mingw. */ - if (HAVE_SYMLINK) - { - const char *linkname = "test-symlinkat.link"; - const char *contents = "don't matter!"; - int exp = strlen (contents); - - /* Create link while cwd is '.', then read it in '..'. */ - ASSERT (symlinkat (contents, AT_FDCWD, linkname) == 0); - errno = 0; - ASSERT (symlinkat (contents, dfd, linkname) == -1); - ASSERT (errno == EEXIST); - ASSERT (chdir ("..") == 0); - errno = 0; - ASSERT (readlinkat (AT_FDCWD, linkname, buf, sizeof buf) == -1); - ASSERT (errno == ENOENT); - ASSERT (readlinkat (dfd, linkname, buf, sizeof buf) == exp); - ASSERT (strncmp (contents, buf, exp) == 0); - ASSERT (unlinkat (dfd, linkname, 0) == 0); - - /* Create link while cwd is '..', then read it in '.'. */ - ASSERT (symlinkat (contents, dfd, linkname) == 0); - ASSERT (fchdir (dfd) == 0); - errno = 0; - ASSERT (symlinkat (contents, AT_FDCWD, linkname) == -1); - ASSERT (errno == EEXIST); - buf[0] = '\0'; - ASSERT (readlinkat (AT_FDCWD, linkname, buf, sizeof buf) == exp); - ASSERT (strncmp (contents, buf, exp) == 0); - buf[0] = '\0'; - ASSERT (readlinkat (dfd, linkname, buf, sizeof buf) == exp); - ASSERT (strncmp (contents, buf, exp) == 0); - ASSERT (unlink (linkname) == 0); - } + ASSERT (test_symlink (do_symlink, false) == result); ASSERT (close (dfd) == 0); - - return 0; + if (result == 77) + fputs ("skipping test: symlinks not supported on this file system\n", + stderr); + return result; }