int libretrodb_open(const char *path, libretrodb_t *db) { libretrodb_header_t header; libretrodb_metadata_t md; int rv; RFILE *fd = filestream_open(path, RFILE_MODE_READ, -1); if (!fd) return -errno; strlcpy(db->path, path, sizeof(db->path)); db->root = filestream_seek(fd, 0, SEEK_CUR); if ((rv = filestream_read(fd, &header, sizeof(header))) == -1) { rv = -errno; goto error; } if (strncmp(header.magic_number, MAGIC_NUMBER, sizeof(MAGIC_NUMBER)) != 0) { rv = -EINVAL; goto error; } header.metadata_offset = swap_if_little64(header.metadata_offset); filestream_seek(fd, (ssize_t)header.metadata_offset, SEEK_SET); if (libretrodb_read_metadata(fd, &md) < 0) { rv = -EINVAL; goto error; } db->count = md.count; db->first_index_offset = filestream_seek(fd, 0, SEEK_CUR); db->fd = fd; return 0; error: if (fd) filestream_close(fd); return rv; }
int libretrodb_open(const char *path, libretrodb_t *db) { libretrodb_header_t header; libretrodb_metadata_t md; int rv; int fd = open(path, O_RDWR); if (fd == -1) return -errno; strcpy(db->path, path); db->root = lseek(fd, 0, SEEK_CUR); if ((rv = read(fd, &header, sizeof(header))) == -1) { rv = -errno; goto error; } if (strncmp(header.magic_number, MAGIC_NUMBER, sizeof(MAGIC_NUMBER)) != 0) { rv = -EINVAL; goto error; } header.metadata_offset = betoht64(header.metadata_offset); lseek(fd, header.metadata_offset, SEEK_SET); if (libretrodb_read_metadata(fd, &md) < 0) { rv = -EINVAL; goto error; } db->count = md.count; db->first_index_offset = lseek(fd, 0, SEEK_CUR); db->fd = fd; return 0; error: close(fd); return rv; }