4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering/***
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering This file is part of systemd.
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering Copyright 2012 Kay Sievers <kay@vrfy.org>
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering systemd is free software; you can redistribute it and/or modify it
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering under the terms of the GNU Lesser General Public License as published by
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering (at your option) any later version.
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering systemd is distributed in the hope that it will be useful, but
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering Lesser General Public License for more details.
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering You should have received a copy of the GNU Lesser General Public License
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering***/
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering#pragma once
b5efdb8af40ea759a1ea584c1bc44ecc81dd00ceLennart Poettering
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering#include "sparse-endian.h"
a0f29c767a3bb3d621c658fa5b87063e1f44e24aLennart Poettering#include "util.h"
b5efdb8af40ea759a1ea584c1bc44ecc81dd00ceLennart Poettering
6bedfcbb2970e06a4d3280c8fb62083d252ede73Lennart Poettering#define HWDB_SIG { 'K', 'S', 'L', 'P', 'H', 'H', 'R', 'H' }
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering
6bedfcbb2970e06a4d3280c8fb62083d252ede73Lennart Poettering/* on-disk trie objects */
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poetteringstruct trie_header_f {
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering uint8_t signature[8];
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering /* version of tool which created the file */
0eac462399c8e87bcce252cf058eba9f2678f2bdLennart Poettering le64_t tool_version;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering le64_t file_size;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering /* size of structures to allow them to grow */
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering le64_t header_size;
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering le64_t node_size;
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering le64_t child_entry_size;
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering le64_t value_entry_size;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering /* offset of the root trie node */
4b95f1798f22c1bb75295f448188560cb6ec9eceLennart Poettering le64_t nodes_root_off;
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering /* size of the nodes and string section */
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering le64_t nodes_len;
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering le64_t strings_len;
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering} _packed_;
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poetteringstruct trie_node_f {
0b58db658b5c3f586ac3a837427f1f7fec2abb2eLennart Poettering /* prefix of lookup string, shared by all children */
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering le64_t prefix_off;
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering /* size of children entry array appended to the node */
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering uint8_t children_count;
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering uint8_t padding[7];
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering /* size of value entry array appended to the node */
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering le64_t values_count;
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering} _packed_;
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering/* array of child entries, follows directly the node record */
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poetteringstruct trie_child_entry_f {
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering /* index of the child node */
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering uint8_t c;
880603a13c7ff8a6cab87135dd1eac3f0cd9baabSusant Sahani uint8_t padding[7];
b5efdb8af40ea759a1ea584c1bc44ecc81dd00ceLennart Poettering /* offset of the child node */
880603a13c7ff8a6cab87135dd1eac3f0cd9baabSusant Sahani le64_t child_off;
880603a13c7ff8a6cab87135dd1eac3f0cd9baabSusant Sahani} _packed_;
880603a13c7ff8a6cab87135dd1eac3f0cd9baabSusant Sahani
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering/* array of value entries, follows directly the node record/child array */
880603a13c7ff8a6cab87135dd1eac3f0cd9baabSusant Sahanistruct trie_value_entry_f {
880603a13c7ff8a6cab87135dd1eac3f0cd9baabSusant Sahani le64_t key_off;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering le64_t value_off;
636e813dc98ea40c58c6c85bc5e7e3c9f0904ea2Lennart Poettering} _packed_;
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poettering