xref: /minix3/minix/lib/libsys/ds.c (revision 433d6423c39e34ec4b79c950597bb2d236f886be)
1 
2 #include <minix/ds.h>
3 #include <string.h>
4 
5 #include "syslib.h"
6 
do_invoke_ds(message * m,int type,const char * ds_name)7 static int do_invoke_ds(message *m, int type, const char *ds_name)
8 {
9 	cp_grant_id_t g_key;
10 	size_t len_key;
11 	int access, r;
12 
13 	if(type == DS_CHECK || type == DS_RETRIEVE_LABEL) {
14 		len_key = DS_MAX_KEYLEN;
15 		access = CPF_WRITE;
16 	} else {
17 		len_key = strlen(ds_name)+1;
18 		access = CPF_READ;
19 	}
20 
21 	/* Grant for key. */
22 	g_key = cpf_grant_direct(DS_PROC_NR, (vir_bytes) ds_name,
23 		len_key, access);
24 	if(!GRANT_VALID(g_key))
25 		return ENOMEM;
26 
27 	m->m_ds_req.key_grant = g_key;
28 	m->m_ds_req.key_len = len_key;
29 
30 	r = _taskcall(DS_PROC_NR, type, m);
31 
32 	cpf_revoke(g_key);
33 	return r;
34 }
35 
ds_publish_label(const char * ds_name,endpoint_t endpoint,int flags)36 int ds_publish_label(const char *ds_name, endpoint_t endpoint, int flags)
37 {
38 	message m;
39 
40 	memset(&m, 0, sizeof(m));
41 	m.m_ds_req.val_in.ep = endpoint;
42 	m.m_ds_req.flags = DSF_TYPE_LABEL | flags;
43 	return do_invoke_ds(&m, DS_PUBLISH, ds_name);
44 }
45 
ds_publish_u32(const char * ds_name,u32_t value,int flags)46 int ds_publish_u32(const char *ds_name, u32_t value, int flags)
47 {
48 	message m;
49 
50 	memset(&m, 0, sizeof(m));
51 	m.m_ds_req.val_in.u32 = value;
52 	m.m_ds_req.flags = DSF_TYPE_U32 | flags;
53 	return do_invoke_ds(&m, DS_PUBLISH, ds_name);
54 }
55 
ds_publish_raw(const char * ds_name,void * vaddr,size_t length,int flags)56 static int ds_publish_raw(const char *ds_name, void *vaddr, size_t length,
57 	int flags)
58 {
59 	cp_grant_id_t gid;
60 	message m;
61 	int r;
62 
63 	/* Grant for memory range. */
64 	gid = cpf_grant_direct(DS_PROC_NR, (vir_bytes)vaddr, length, CPF_READ);
65 	if(!GRANT_VALID(gid))
66 		return ENOMEM;
67 
68 	memset(&m, 0, sizeof(m));
69 	m.m_ds_req.val_in.grant = gid;
70 	m.m_ds_req.val_len = length;
71 	m.m_ds_req.flags = flags;
72 
73 	r = do_invoke_ds(&m, DS_PUBLISH, ds_name);
74 	cpf_revoke(gid);
75 
76 	return r;
77 }
78 
ds_publish_str(const char * ds_name,char * value,int flags)79 int ds_publish_str(const char *ds_name, char *value, int flags)
80 {
81 	size_t length;
82 	length = strlen(value) + 1;
83 	value[length - 1] = '\0';
84 	return ds_publish_raw(ds_name, value, length, flags | DSF_TYPE_STR);
85 }
86 
ds_publish_mem(const char * ds_name,void * vaddr,size_t length,int flags)87 int ds_publish_mem(const char *ds_name, void *vaddr, size_t length, int flags)
88 {
89 	return ds_publish_raw(ds_name, vaddr, length, flags | DSF_TYPE_MEM);
90 }
91 
ds_retrieve_label_name(char * ds_name,endpoint_t endpoint)92 int ds_retrieve_label_name(char *ds_name, endpoint_t endpoint)
93 {
94 	message m;
95 	int r;
96 
97 	memset(&m, 0, sizeof(m));
98 	m.m_ds_req.val_in.ep = endpoint;
99 	r = do_invoke_ds(&m, DS_RETRIEVE_LABEL, ds_name);
100 	return r;
101 }
102 
ds_retrieve_label_endpt(const char * ds_name,endpoint_t * endpoint)103 int ds_retrieve_label_endpt(const char *ds_name, endpoint_t *endpoint)
104 {
105 	message m;
106 	int r;
107 
108 	memset(&m, 0, sizeof(m));
109 	m.m_ds_req.flags = DSF_TYPE_LABEL;
110 	r = do_invoke_ds(&m, DS_RETRIEVE, ds_name);
111 	*endpoint = m.m_ds_reply.val_out.ep;
112 	return r;
113 }
114 
ds_retrieve_u32(const char * ds_name,u32_t * value)115 int ds_retrieve_u32(const char *ds_name, u32_t *value)
116 {
117 	message m;
118 	int r;
119 
120 	memset(&m, 0, sizeof(m));
121 	m.m_ds_req.flags = DSF_TYPE_U32;
122 	r = do_invoke_ds(&m, DS_RETRIEVE, ds_name);
123 	*value = m.m_ds_reply.val_out.u32;
124 	return r;
125 }
126 
ds_retrieve_raw(const char * ds_name,char * vaddr,size_t * length,int flags)127 static int ds_retrieve_raw(const char *ds_name, char *vaddr, size_t *length,
128 	int flags)
129 {
130 	message m;
131 	cp_grant_id_t gid;
132 	int r;
133 
134 	/* Grant for memory range. */
135 	gid = cpf_grant_direct(DS_PROC_NR, (vir_bytes)vaddr, *length, CPF_WRITE);
136 	if(!GRANT_VALID(gid))
137 		return ENOMEM;
138 
139 	memset(&m, 0, sizeof(m));
140 	m.m_ds_req.val_in.grant = gid;
141 	m.m_ds_req.val_len = *length;
142 	m.m_ds_req.flags = flags;
143 	r = do_invoke_ds(&m, DS_RETRIEVE, ds_name);
144 	*length = m.m_ds_reply.val_len;
145 	cpf_revoke(gid);
146 
147 	return r;
148 }
149 
ds_retrieve_str(const char * ds_name,char * value,size_t len_str)150 int ds_retrieve_str(const char *ds_name, char *value, size_t len_str)
151 {
152 	int r;
153 	size_t length = len_str + 1;
154 	r = ds_retrieve_raw(ds_name, value, &length, DSF_TYPE_STR);
155 	value[length - 1] = '\0';
156 	return r;
157 }
158 
ds_retrieve_mem(const char * ds_name,char * vaddr,size_t * length)159 int ds_retrieve_mem(const char *ds_name, char *vaddr, size_t *length)
160 {
161 	return ds_retrieve_raw(ds_name, vaddr, length, DSF_TYPE_MEM);
162 }
163 
ds_delete_u32(const char * ds_name)164 int ds_delete_u32(const char *ds_name)
165 {
166 	message m;
167 
168 	memset(&m, 0, sizeof(m));
169 	m.m_ds_req.flags = DSF_TYPE_U32;
170 	return do_invoke_ds(&m, DS_DELETE, ds_name);
171 }
172 
ds_delete_str(const char * ds_name)173 int ds_delete_str(const char *ds_name)
174 {
175 	message m;
176 
177 	memset(&m, 0, sizeof(m));
178 	m.m_ds_req.flags = DSF_TYPE_STR;
179 	return do_invoke_ds(&m, DS_DELETE, ds_name);
180 }
181 
ds_delete_mem(const char * ds_name)182 int ds_delete_mem(const char *ds_name)
183 {
184 	message m;
185 
186 	memset(&m, 0, sizeof(m));
187 	m.m_ds_req.flags = DSF_TYPE_MEM;
188 	return do_invoke_ds(&m, DS_DELETE, ds_name);
189 }
190 
ds_delete_label(const char * ds_name)191 int ds_delete_label(const char *ds_name)
192 {
193 	message m;
194 
195 	memset(&m, 0, sizeof(m));
196 	m.m_ds_req.flags = DSF_TYPE_LABEL;
197 	return do_invoke_ds(&m, DS_DELETE, ds_name);
198 }
199 
ds_subscribe(const char * regexp,int flags)200 int ds_subscribe(const char *regexp, int flags)
201 {
202 	message m;
203 
204 	memset(&m, 0, sizeof(m));
205 	m.m_ds_req.flags = flags;
206 	return do_invoke_ds(&m, DS_SUBSCRIBE, regexp);
207 }
208 
ds_check(char * ds_key,int * type,endpoint_t * owner_e)209 int ds_check(char *ds_key, int *type, endpoint_t *owner_e)
210 {
211 	message m;
212 	int r;
213 
214 	memset(&m, 0, sizeof(m));
215 	r = do_invoke_ds(&m, DS_CHECK, ds_key);
216 	if(type) *type = m.m_ds_req.flags;
217 	if(owner_e) *owner_e = m.m_ds_req.owner;
218 	return r;
219 }
220