int main(void) { int fd = safe_open("/test/testfile", O_RDWR | O_TRUNC); struct stat *stat = safe_fstat(fd); assert(stat->st_size == 0 && stat->st_blocks == 0); safe_seek(fd, sizeof(buffer) * 1024 * 2, LSEEK_SET); int i; for (i = 0; i < sizeof(buffer); i ++) { buffer[i] = i; } safe_write(fd, buffer, sizeof(buffer)); memset(buffer, 0, sizeof(buffer)); safe_seek(fd, -sizeof(buffer), LSEEK_END); safe_read(fd, buffer, sizeof(buffer)); for (i = 0; i < sizeof(buffer); i ++) { assert(buffer[i] == (unsigned char)i); } fd = safe_open("/test/testfile", O_RDWR | O_TRUNC); stat = safe_fstat(fd); assert(stat->st_size == 0 && stat->st_blocks == 0); printf("sfs_filetest2 pass.\n"); return 0; }
int main(void) { int fd1, fd2; struct stat *stat; changedir("/testdir/test"); fd1 = safe_open("testfile", O_RDWR | O_TRUNC); stat = safe_fstat(fd1); assert(stat->st_size == 0 && stat->st_nlinks == 1); safe_link("testfile", "orz"); fd2 = safe_open("orz", O_RDONLY); stat = safe_fstat(fd1); assert(stat->st_size == 0 && stat->st_nlinks == 2); stat = safe_fstat(fd2); assert(stat->st_size == 0 && stat->st_nlinks == 2); const char *msg = "Hello world!!\n"; static char buffer[1024]; size_t len = strlen(msg); memcpy(buffer, msg, len); safe_write(fd1, buffer, len); changedir("."); memset(buffer, 0, sizeof(buffer)); safe_read(fd2, buffer, len); assert(strncmp(buffer, msg, len) == 0); cprintf("link test ok.\n"); safe_unlink("orz"); stat = safe_fstat(fd2); assert(stat->st_size == len && stat->st_nlinks == 1); close(fd2); changedir("."); cprintf("unlink test ok.\n"); fd2 = safe_open("testfile", O_RDWR | O_TRUNC); safe_write(fd1, buffer, len); stat = safe_fstat(fd2); assert(stat->st_size == len * 2 && stat->st_nlinks == 1); fd2 = safe_open("testfile", O_RDWR | O_TRUNC); assert(link("test", "..") != 0); assert(link("testfile", ".") != 0); assert(link("testfile", "./testfile") != 0); assert(unlink(".") != 0 && unlink("..") != 0); changedir("."); cprintf("sfs_filetest3 pass.\n"); return 0; }
int main(void) { int fd1, fd2; struct stat *stat; changedir("/testdir/test"); { safe_mkdir("/testdir/test/dir0/"); assert(mkdir("testfile") != 0 && mkdir("../test/dir0/") != 0); assert(mkdir("dir0/dir1/dir2") != 0); safe_mkdir("dir0/dir1/"); fd1 = safe_open("file1", O_CREAT | O_RDWR | O_EXCL); fd2 = safe_open("file1", O_CREAT | O_RDWR); stat = safe_fstat(fd1); assert(stat->st_nlinks == 1); stat = safe_fstat(fd2); assert(stat->st_nlinks == 1); assert(open("file1", O_CREAT | O_EXCL) < 0); changedir("."); safe_link("file1", "dir0/dir1/file2"); changedir("."); stat = safe_fstat(fd1); assert(stat->st_nlinks == 2); } changedir("dir0/dir1"); { assert(unlink("dir0/dir1") != 0); safe_unlink("/testdir/test/dir0/dir1/file2"); safe_unlink("/testdir/test/dir0/dir1"); stat = safe_fstat(fd1); assert(stat->st_nlinks == 1); } changedir("/testdir/test/dir0"); { safe_unlink("../file1"); safe_unlink("../dir0"); } changedir("/testdir/test"); printf("sfs_dirtest2 pass.\n"); return 0; }
struct sfs_fs * create_sfs(int imgfd) { uint32_t ninos, next_ino; struct stat *stat = safe_fstat(imgfd); if ((ninos = stat->st_size / SFS_BLKSIZE) > SFS_MAX_NBLKS) { ninos = SFS_MAX_NBLKS; warn("img file is too big (%llu bytes, only use %u blocks).\n", (unsigned long long)stat->st_size, ninos); } if ((next_ino = SFS_BLKN_FREEMAP + (ninos + SFS_BLKBITS - 1) / SFS_BLKBITS) >= ninos) { bug("img file is too small (%llu bytes, %u blocks, bitmap use at least %u blocks).\n", (unsigned long long)stat->st_size, ninos, next_ino - 2); } struct sfs_fs *sfs = safe_malloc(sizeof(struct sfs_fs)); sfs->super.magic = SFS_MAGIC; sfs->super.blocks = ninos, sfs->super.unused_blocks = ninos - next_ino; snprintf(sfs->super.info, SFS_MAX_INFO_LEN, "simple file system"); sfs->ninos = ninos, sfs->next_ino = next_ino, sfs->imgfd = imgfd; sfs->sp_root = sfs->sp_end = &(sfs->__sp_nil); sfs->sp_end->prev = sfs->sp_end->next = NULL; int i; for (i = 0; i < HASH_LIST_SIZE; i ++) { sfs->inodes[i] = NULL; sfs->blocks[i] = NULL; } sfs->root = alloc_cache_inode(sfs, 0, SFS_BLKN_ROOT, SFS_TYPE_DIR); return sfs; }
void check_mfd_size(const char *filename, const int lineno, int fd, size_t size) { struct stat st; safe_fstat(filename, lineno, fd, &st); if (st.st_size != (long)size) { tst_brk_(filename, lineno, TFAIL, "fstat(%d, &st): unexpected file size", fd); } tst_res_(filename, lineno, TPASS, "fstat(%d, &st): file size is correct", fd); }