Fix some bugs

This commit is contained in:
Justine Tunney 2022-08-14 13:28:07 -07:00
parent 5584f6adcf
commit 6c0bbfac4a
15 changed files with 289 additions and 136 deletions

View file

@ -16,15 +16,78 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
*/
#include "libc/calls/calls.h"
#include "libc/calls/struct/dirent.h"
#include "libc/calls/struct/stat.h"
#include "libc/calls/syscall_support-sysv.internal.h"
#include "libc/dce.h"
#include "libc/intrin/kprintf.h"
#include "libc/runtime/gc.internal.h"
#include "libc/runtime/runtime.h"
#include "libc/stdio/stdio.h"
#include "libc/stdio/temp.h"
#include "libc/str/str.h"
#include "libc/sysv/consts/at.h"
#include "libc/testlib/testlib.h"
#include "libc/x/x.h"
char testlib_enable_tmp_setup_teardown;
char oldtmpdir[PATH_MAX];
bool IsDirectoryEmpty(const char *path) {
DIR *d;
bool res = true;
struct dirent *e;
ASSERT_NE(NULL, (d = opendir(path)));
while ((e = readdir(d))) {
if (!strcmp(e->d_name, ".")) continue;
if (!strcmp(e->d_name, "..")) continue;
res = false;
}
closedir(d);
return res;
}
void SetUp(void) {
strcpy(oldtmpdir, kTmpPath);
strcpy(kTmpPath, ".");
}
void TearDown(void) {
strcpy(kTmpPath, oldtmpdir);
}
TEST(tmpfile, test) {
FILE *f = tmpfile();
FILE *f;
struct stat st;
EXPECT_TRUE(IsDirectoryEmpty(kTmpPath));
f = tmpfile();
if (IsWindows()) {
EXPECT_FALSE(IsDirectoryEmpty(kTmpPath));
} else {
EXPECT_TRUE(IsDirectoryEmpty(kTmpPath));
}
EXPECT_SYS(0, 0, fstat(fileno(f), &st));
EXPECT_NE(010600, st.st_mode);
EXPECT_NE(-1, fputc('t', f));
EXPECT_NE(-1, fflush(f));
rewind(f);
EXPECT_EQ('t', fgetc(f));
EXPECT_NE(-1, fclose(f));
EXPECT_EQ(0, fclose(f));
EXPECT_TRUE(IsDirectoryEmpty(kTmpPath));
}
TEST(tmpfile, renameToRealFile) {
if (!IsLinux() || !__is_linux_2_6_23()) return;
FILE *f;
f = tmpfile();
ASSERT_EQ(2, fputs("hi", f));
ASSERT_SYS(0, 0,
linkat(AT_FDCWD, gc(xasprintf("/proc/self/fd/%d", fileno(f))),
AT_FDCWD, "real", AT_SYMLINK_FOLLOW));
ASSERT_EQ(0, fclose(f));
ASSERT_NE(NULL, (f = fopen("real", "r")));
ASSERT_EQ('h', fgetc(f));
ASSERT_EQ('i', fgetc(f));
ASSERT_EQ(0, fclose(f));
}