xref: /openbsd/usr.sbin/ldomctl/mdstore.c (revision cceaa36b)
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