![]() System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, Directory : /usr/share/emscripten/tests/unistd/ |
Upload File : |
#include <assert.h> #include <errno.h> #include <fcntl.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/stat.h> #ifdef __EMSCRIPTEN__ #include <emscripten.h> #endif static void create_file(const char *path, const char *buffer, int mode) { int fd = open(path, O_WRONLY | O_CREAT | O_EXCL, mode); assert(fd >= 0); int err = write(fd, buffer, sizeof(char) * strlen(buffer)); assert(err == (sizeof(char) * strlen(buffer))); close(fd); } void setup() { mkdir("working", 0777); #ifdef __EMSCRIPTEN__ EM_ASM( #if NODEFS FS.mount(NODEFS, { root: '.' }, 'working'); #endif ); #endif chdir("working"); create_file("file", "test", 0777); create_file("file1", "test", 0777); symlink("file1", "file1-link"); mkdir("dir-empty", 0777); symlink("dir-empty", "dir-empty-link"); mkdir("dir-readonly", 0777); create_file("dir-readonly/anotherfile", "test", 0777); mkdir("dir-readonly/anotherdir", 0777); chmod("dir-readonly", 0555); mkdir("dir-full", 0777); create_file("dir-full/anotherfile", "test", 0777); } void cleanup() { unlink("file"); unlink("file1"); unlink("file1-link"); rmdir("dir-empty"); unlink("dir-empty-link"); chmod("dir-readonly", 0777); unlink("dir-readonly/anotherfile"); rmdir("dir-readonly/anotherdir"); rmdir("dir-readonly"); unlink("dir-full/anotherfile"); rmdir("dir-full"); } void test() { int err; char buffer[512]; // // test unlink // err = unlink("noexist"); assert(err == -1); assert(errno == ENOENT); err = unlink("dir-readonly"); assert(err == -1); #ifdef __linux__ assert(errno == EISDIR); #else assert(errno == EPERM); #endif err = unlink("dir-readonly/anotherfile"); assert(err == -1); assert(errno == EACCES); // try unlinking the symlink first to make sure // we don't follow the link err = unlink("file1-link"); assert(!err); err = access("file1", F_OK); assert(!err); err = access("file1-link", F_OK); assert(err == -1); err = unlink("file"); assert(!err); err = access("file", F_OK); assert(err == -1); // // test rmdir // err = rmdir("noexist"); assert(err == -1); assert(errno == ENOENT); err = rmdir("file1"); assert(err == -1); assert(errno == ENOTDIR); err = rmdir("dir-readonly/anotherdir"); assert(err == -1); assert(errno == EACCES); err = rmdir("dir-full"); assert(err == -1); assert(errno == ENOTEMPTY); // test removing the cwd / root. The result isn't specified by // POSIX, but Linux seems to set EBUSY in both cases. #ifndef __APPLE__ getcwd(buffer, sizeof(buffer)); err = rmdir(buffer); assert(err == -1); assert(errno == EBUSY); #endif err = rmdir("/"); assert(err == -1); #ifdef __APPLE__ assert(errno == EISDIR); #else assert(errno == EBUSY); #endif err = rmdir("dir-empty-link"); assert(err == -1); assert(errno == ENOTDIR); err = rmdir("dir-empty"); assert(!err); err = access("dir-empty", F_OK); assert(err == -1); puts("success"); } int main() { atexit(cleanup); signal(SIGABRT, cleanup); setup(); test(); return EXIT_SUCCESS; }