
Systems like FreeBSD's Capsicum and Nuxi CloudABI apply the concept of capability-based security on the way processes can interact with the filesystem API. It is no longer possible to interact with the VFS through calls like open(), unlink(), rename(), etc. Instead, processes are only allowed to interact with files and directories to which they have been granted access. The *at() functions can be used for this purpose. This change adds a new config switch called _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE. If set, all functionality that requires the global filesystem namespace will be disabled. More concretely: - fstream's open() function will be removed. - cstdio will no longer pull in fopen(), rename(), etc. - The test suite's get_temp_file_name() will be removed. This will cause all tests that use the global filesystem namespace to break, but will at least make all the other tests run (as get_temp_file_name will not build anyway). It is important to mention that this change will make fstream rather useless on those systems for now. Still, I'd rather not have fstream disabled entirely, as it is of course possible to come up with an extension for fstream that would allow access to local filesystem namespaces (e.g., by adding an openat() member function). Differential revision: http://reviews.llvm.org/D8194 Reviewed by: jroelofs (thanks!) git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@232049 91177308-0d34-0410-b5e6-96231b3b80d8
144 lines
5.3 KiB
C++
144 lines
5.3 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is dual licensed under the MIT and the University of Illinois Open
|
|
// Source Licenses. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// test <cstdio>
|
|
|
|
#include <cstdio>
|
|
#include <type_traits>
|
|
|
|
#ifndef BUFSIZ
|
|
#error BUFSIZ not defined
|
|
#endif
|
|
|
|
#ifndef EOF
|
|
#error EOF not defined
|
|
#endif
|
|
|
|
#ifndef FILENAME_MAX
|
|
#error FILENAME_MAX not defined
|
|
#endif
|
|
|
|
#ifndef FOPEN_MAX
|
|
#error FOPEN_MAX not defined
|
|
#endif
|
|
|
|
#ifndef L_tmpnam
|
|
#error L_tmpnam not defined
|
|
#endif
|
|
|
|
#ifndef NULL
|
|
#error NULL not defined
|
|
#endif
|
|
|
|
#ifndef SEEK_CUR
|
|
#error SEEK_CUR not defined
|
|
#endif
|
|
|
|
#ifndef SEEK_END
|
|
#error SEEK_END not defined
|
|
#endif
|
|
|
|
#ifndef SEEK_SET
|
|
#error SEEK_SET not defined
|
|
#endif
|
|
|
|
#ifndef TMP_MAX
|
|
#error TMP_MAX not defined
|
|
#endif
|
|
|
|
#ifndef _IOFBF
|
|
#error _IOFBF not defined
|
|
#endif
|
|
|
|
#ifndef _IOLBF
|
|
#error _IOLBF not defined
|
|
#endif
|
|
|
|
#ifndef _IONBF
|
|
#error _IONBF not defined
|
|
#endif
|
|
|
|
#ifndef stderr
|
|
#error stderr not defined
|
|
#endif
|
|
|
|
#ifndef stdin
|
|
#error stdin not defined
|
|
#endif
|
|
|
|
#ifndef stdout
|
|
#error stdout not defined
|
|
#endif
|
|
|
|
#include <cstdarg>
|
|
|
|
#pragma clang diagnostic push
|
|
#pragma clang diagnostic ignored "-Wformat-zero-length"
|
|
|
|
int main()
|
|
{
|
|
std::FILE* fp = 0;
|
|
std::fpos_t fpos = {0};
|
|
std::size_t s = 0;
|
|
char* cp = 0;
|
|
std::va_list va;
|
|
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
|
static_assert((std::is_same<decltype(std::remove("")), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::rename("","")), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::tmpfile()), std::FILE*>::value), "");
|
|
static_assert((std::is_same<decltype(std::tmpnam(cp)), char*>::value), "");
|
|
#endif
|
|
static_assert((std::is_same<decltype(std::fclose(fp)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::fflush(fp)), int>::value), "");
|
|
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
|
static_assert((std::is_same<decltype(std::fopen("", "")), std::FILE*>::value), "");
|
|
static_assert((std::is_same<decltype(std::freopen("", "", fp)), std::FILE*>::value), "");
|
|
#endif
|
|
static_assert((std::is_same<decltype(std::setbuf(fp,cp)), void>::value), "");
|
|
static_assert((std::is_same<decltype(std::vfprintf(fp,"",va)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::fprintf(fp," ")), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::fscanf(fp,"")), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::printf(" ")), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::scanf(" ")), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::snprintf(cp,0," ")), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::sprintf(cp," ")), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::sscanf("","")), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::vfprintf(fp,"",va)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::vfscanf(fp,"",va)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::vprintf(" ",va)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::vscanf("",va)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::vsnprintf(cp,0," ",va)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::vsprintf(cp," ",va)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::vsscanf("","",va)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::fgetc(fp)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::fgets(cp,0,fp)), char*>::value), "");
|
|
static_assert((std::is_same<decltype(std::fputc(0,fp)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::fputs("",fp)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::getc(fp)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::getchar()), int>::value), "");
|
|
#if _LIBCPP_STD_VER <= 11
|
|
static_assert((std::is_same<decltype(std::gets(cp)), char*>::value), "");
|
|
#endif
|
|
static_assert((std::is_same<decltype(std::putc(0,fp)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::putchar(0)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::puts("")), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::ungetc(0,fp)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::fread((void*)0,0,0,fp)), std::size_t>::value), "");
|
|
static_assert((std::is_same<decltype(std::fwrite((const void*)0,0,0,fp)), std::size_t>::value), "");
|
|
static_assert((std::is_same<decltype(std::fgetpos(fp, &fpos)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::fseek(fp, 0,0)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::fsetpos(fp, &fpos)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::ftell(fp)), long>::value), "");
|
|
static_assert((std::is_same<decltype(std::rewind(fp)), void>::value), "");
|
|
static_assert((std::is_same<decltype(std::clearerr(fp)), void>::value), "");
|
|
static_assert((std::is_same<decltype(std::feof(fp)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::ferror(fp)), int>::value), "");
|
|
static_assert((std::is_same<decltype(std::perror("")), void>::value), "");
|
|
}
|