Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
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;
}
Ejemplo n.º 4
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;
}
Ejemplo n.º 5
0
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);
}