1*cceaa36bSkettenis /* $OpenBSD: mdstore.c,v 1.1 2012/11/04 20:09:02 kettenis Exp $ */ 2*cceaa36bSkettenis 3*cceaa36bSkettenis /* 4*cceaa36bSkettenis * Copyright (c) 2012 Mark Kettenis 5*cceaa36bSkettenis * 6*cceaa36bSkettenis * Permission to use, copy, modify, and distribute this software for any 7*cceaa36bSkettenis * purpose with or without fee is hereby granted, provided that the above 8*cceaa36bSkettenis * copyright notice and this permission notice appear in all copies. 9*cceaa36bSkettenis * 10*cceaa36bSkettenis * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11*cceaa36bSkettenis * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12*cceaa36bSkettenis * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13*cceaa36bSkettenis * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14*cceaa36bSkettenis * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15*cceaa36bSkettenis * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16*cceaa36bSkettenis * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17*cceaa36bSkettenis */ 18*cceaa36bSkettenis 19*cceaa36bSkettenis #include <stdio.h> 20*cceaa36bSkettenis #include <string.h> 21*cceaa36bSkettenis 22*cceaa36bSkettenis #include "ds.h" 23*cceaa36bSkettenis #include "mdstore.h" 24*cceaa36bSkettenis #include "util.h" 25*cceaa36bSkettenis 26*cceaa36bSkettenis void mdstore_start(struct ldc_conn *, uint64_t); 27*cceaa36bSkettenis void mdstore_rx_data(struct ldc_conn *, uint64_t, void *, size_t); 28*cceaa36bSkettenis 29*cceaa36bSkettenis struct ds_service mdstore_service = { 30*cceaa36bSkettenis "mdstore", 1, 0, mdstore_start, mdstore_rx_data 31*cceaa36bSkettenis }; 32*cceaa36bSkettenis 33*cceaa36bSkettenis #define MDSET_LIST_REQUEST 0x0004 34*cceaa36bSkettenis 35*cceaa36bSkettenis struct mdstore_msg { 36*cceaa36bSkettenis uint32_t msg_type; 37*cceaa36bSkettenis uint32_t payload_len; 38*cceaa36bSkettenis uint64_t svc_handle; 39*cceaa36bSkettenis uint64_t reqnum; 40*cceaa36bSkettenis uint16_t command; 41*cceaa36bSkettenis } __packed; 42*cceaa36bSkettenis 43*cceaa36bSkettenis #define MDSET_LIST_REPLY 0x0104 44*cceaa36bSkettenis 45*cceaa36bSkettenis struct mdstore_list_resp { 46*cceaa36bSkettenis uint32_t msg_type; 47*cceaa36bSkettenis uint32_t payload_len; 48*cceaa36bSkettenis uint64_t svc_handle; 49*cceaa36bSkettenis uint64_t reqnum; 50*cceaa36bSkettenis uint32_t result; 51*cceaa36bSkettenis uint16_t booted_set; 52*cceaa36bSkettenis uint16_t boot_set; 53*cceaa36bSkettenis char sets[1]; 54*cceaa36bSkettenis } __packed; 55*cceaa36bSkettenis 56*cceaa36bSkettenis #define MDST_SUCCESS 0x0 57*cceaa36bSkettenis #define MDST_FAILURE 0x1 58*cceaa36bSkettenis #define MDST_INVALID_MSG 0x2 59*cceaa36bSkettenis #define MDST_MAX_MDS_ERR 0x3 60*cceaa36bSkettenis #define MDST_BAD_NAME_ERR 0x4 61*cceaa36bSkettenis #define MDST_SET_EXISTS_ERR 0x5 62*cceaa36bSkettenis #define MDST_ALLOC_SET_ERR 0x6 63*cceaa36bSkettenis #define MDST_ALLOC_MD_ERR 0x7 64*cceaa36bSkettenis #define MDST_MD_COUNT_ERR 0x8 65*cceaa36bSkettenis #define MDST_MD_SIZE_ERR 0x9 66*cceaa36bSkettenis #define MDST_MD_TYPE_ERR 0xa 67*cceaa36bSkettenis #define MDST_NOT_EXIST_ERR 0xb 68*cceaa36bSkettenis 69*cceaa36bSkettenis struct mdstore_set_head mdstore_sets = TAILQ_HEAD_INITIALIZER(mdstore_sets); 70*cceaa36bSkettenis 71*cceaa36bSkettenis void 72*cceaa36bSkettenis mdstore_start(struct ldc_conn *lc, uint64_t svc_handle) 73*cceaa36bSkettenis { 74*cceaa36bSkettenis struct mdstore_msg mm; 75*cceaa36bSkettenis 76*cceaa36bSkettenis bzero(&mm, sizeof(mm)); 77*cceaa36bSkettenis mm.msg_type = DS_DATA; 78*cceaa36bSkettenis mm.payload_len = sizeof(mm) - 8; 79*cceaa36bSkettenis mm.svc_handle = svc_handle; 80*cceaa36bSkettenis mm.reqnum = 0; 81*cceaa36bSkettenis mm.command = MDSET_LIST_REQUEST; 82*cceaa36bSkettenis ds_send_msg(lc, &mm, sizeof(mm)); 83*cceaa36bSkettenis } 84*cceaa36bSkettenis 85*cceaa36bSkettenis void 86*cceaa36bSkettenis mdstore_rx_data(struct ldc_conn *lc, uint64_t svc_handle, void *data, 87*cceaa36bSkettenis size_t len) 88*cceaa36bSkettenis { 89*cceaa36bSkettenis struct mdstore_list_resp *mr = data; 90*cceaa36bSkettenis struct mdstore_set *set; 91*cceaa36bSkettenis int idx; 92*cceaa36bSkettenis 93*cceaa36bSkettenis if (mr->result != MDST_SUCCESS) { 94*cceaa36bSkettenis DPRINTF(("Unexpected result 0x%x\n", mr->result)); 95*cceaa36bSkettenis return; 96*cceaa36bSkettenis } 97*cceaa36bSkettenis 98*cceaa36bSkettenis len = 0; 99*cceaa36bSkettenis for (idx = 0; len < mr->payload_len - 24; idx++) { 100*cceaa36bSkettenis set = xmalloc(sizeof(*set)); 101*cceaa36bSkettenis set->name = xstrdup(&mr->sets[len]); 102*cceaa36bSkettenis set->booted_set = (idx == mr->booted_set); 103*cceaa36bSkettenis set->boot_set = (idx == mr->boot_set); 104*cceaa36bSkettenis TAILQ_INSERT_TAIL(&mdstore_sets, set, link); 105*cceaa36bSkettenis len += strlen(&mr->sets[len]) + 1; 106*cceaa36bSkettenis } 107*cceaa36bSkettenis } 108