1172302Spjd/*- 2172302Spjd * Copyright (c) 2005 Ivan Voras <ivoras@freebsd.org> 3172302Spjd * All rights reserved. 4172302Spjd * 5172302Spjd * Redistribution and use in source and binary forms, with or without 6172302Spjd * modification, are permitted provided that the following conditions 7172302Spjd * are met: 8172302Spjd * 1. Redistributions of source code must retain the above copyright 9172302Spjd * notice, this list of conditions and the following disclaimer. 10172302Spjd * 2. Redistributions in binary form must reproduce the above copyright 11172302Spjd * notice, this list of conditions and the following disclaimer in the 12172302Spjd * documentation and/or other materials provided with the distribution. 13172302Spjd * 14172302Spjd * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 15172302Spjd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16172302Spjd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17172302Spjd * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 18172302Spjd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19172302Spjd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20172302Spjd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21172302Spjd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22172302Spjd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23172302Spjd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24172302Spjd * SUCH DAMAGE. 25172302Spjd */ 26172302Spjd 27172302Spjd#include <sys/cdefs.h> 28172302Spjd__FBSDID("$FreeBSD$"); 29172302Spjd 30172302Spjd#include <sys/param.h> 31172302Spjd#include <sys/endian.h> 32172302Spjd 33172302Spjd#include <geom/virstor/g_virstor_md.h> 34172302Spjd#include <geom/virstor/binstream.h> 35172302Spjd 36172302Spjd/* 37172302Spjd * Encode data from g_virstor_metadata structure into a endian-independant 38172302Spjd * byte stream. 39172302Spjd */ 40172302Spjdvoid 41172302Spjdvirstor_metadata_encode(struct g_virstor_metadata *md, unsigned char *data) 42172302Spjd{ 43172302Spjd bin_stream_t bs; 44172302Spjd 45172302Spjd bs_open(&bs, data); 46172302Spjd 47172302Spjd bs_write_buf(&bs, md->md_magic, sizeof(md->md_magic)); 48172302Spjd bs_write_u32(&bs, md->md_version); 49172302Spjd bs_write_buf(&bs, md->md_name, sizeof(md->md_name)); 50172302Spjd bs_write_u64(&bs, md->md_virsize); 51172302Spjd bs_write_u32(&bs, md->md_chunk_size); 52172302Spjd bs_write_u32(&bs, md->md_id); 53172302Spjd bs_write_u16(&bs, md->md_count); 54172302Spjd 55172302Spjd bs_write_buf(&bs, md->provider, sizeof(md->provider)); 56172302Spjd bs_write_u16(&bs, md->no); 57172302Spjd bs_write_u64(&bs, md->provsize); 58172302Spjd bs_write_u32(&bs, md->chunk_count); 59172302Spjd bs_write_u32(&bs, md->chunk_next); 60172302Spjd bs_write_u16(&bs, md->chunk_reserved); 61172302Spjd bs_write_u16(&bs, md->flags); 62172302Spjd} 63172302Spjd 64172302Spjd 65172302Spjd/* 66172302Spjd * Decode data from endian-independant byte stream into g_virstor_metadata 67172302Spjd * structure. 68172302Spjd */ 69172302Spjdvoid 70172302Spjdvirstor_metadata_decode(unsigned char *data, struct g_virstor_metadata *md) 71172302Spjd{ 72172302Spjd bin_stream_t bs; 73172302Spjd 74172302Spjd bs_open(&bs, (char *)(data)); 75172302Spjd 76172302Spjd bs_read_buf(&bs, md->md_magic, sizeof(md->md_magic)); 77172302Spjd md->md_version = bs_read_u32(&bs); 78172302Spjd bs_read_buf(&bs, md->md_name, sizeof(md->md_name)); 79172302Spjd md->md_virsize = bs_read_u64(&bs); 80172302Spjd md->md_chunk_size = bs_read_u32(&bs); 81172302Spjd md->md_id = bs_read_u32(&bs); 82172302Spjd md->md_count = bs_read_u16(&bs); 83172302Spjd 84172302Spjd bs_read_buf(&bs, md->provider, sizeof(md->provider)); 85172302Spjd md->no = bs_read_u16(&bs); 86172302Spjd md->provsize = bs_read_u64(&bs); 87172302Spjd md->chunk_count = bs_read_u32(&bs); 88172302Spjd md->chunk_next = bs_read_u32(&bs); 89172302Spjd md->chunk_reserved = bs_read_u16(&bs); 90172302Spjd md->flags = bs_read_u16(&bs); 91172302Spjd} 92