xref: /minix3/minix/lib/libfsdriver/utility.c (revision 89c9de7d091f384bd4337bd6775fb15c93b8e8c6)
1*89c9de7dSDavid van Moolenbroek 
2*89c9de7dSDavid van Moolenbroek #include "fsdriver.h"
3*89c9de7dSDavid van Moolenbroek 
4*89c9de7dSDavid van Moolenbroek /*
5*89c9de7dSDavid van Moolenbroek  * Copy data from the caller into the local address space.
6*89c9de7dSDavid van Moolenbroek  */
7*89c9de7dSDavid van Moolenbroek int
fsdriver_copyin(const struct fsdriver_data * data,size_t off,void * ptr,size_t len)8*89c9de7dSDavid van Moolenbroek fsdriver_copyin(const struct fsdriver_data * data, size_t off, void * ptr,
9*89c9de7dSDavid van Moolenbroek 	size_t len)
10*89c9de7dSDavid van Moolenbroek {
11*89c9de7dSDavid van Moolenbroek 
12*89c9de7dSDavid van Moolenbroek 	/* Do nothing for peek requests. */
13*89c9de7dSDavid van Moolenbroek 	if (data == NULL)
14*89c9de7dSDavid van Moolenbroek 		return OK;
15*89c9de7dSDavid van Moolenbroek 
16*89c9de7dSDavid van Moolenbroek 	/* The data size field is used only for this integrity check. */
17*89c9de7dSDavid van Moolenbroek 	if (off + len > data->size)
18*89c9de7dSDavid van Moolenbroek 		panic("fsdriver: copy-in buffer overflow");
19*89c9de7dSDavid van Moolenbroek 
20*89c9de7dSDavid van Moolenbroek 	if (data->endpt == SELF) {
21*89c9de7dSDavid van Moolenbroek 		memcpy(ptr, &data->ptr[off], len);
22*89c9de7dSDavid van Moolenbroek 
23*89c9de7dSDavid van Moolenbroek 		return OK;
24*89c9de7dSDavid van Moolenbroek 	}
25*89c9de7dSDavid van Moolenbroek 
26*89c9de7dSDavid van Moolenbroek 	return sys_safecopyfrom(data->endpt, data->grant, off, (vir_bytes)ptr,
27*89c9de7dSDavid van Moolenbroek 	    (phys_bytes)len);
28*89c9de7dSDavid van Moolenbroek }
29*89c9de7dSDavid van Moolenbroek 
30*89c9de7dSDavid van Moolenbroek /*
31*89c9de7dSDavid van Moolenbroek  * Copy data from the local address space to the caller.
32*89c9de7dSDavid van Moolenbroek  */
33*89c9de7dSDavid van Moolenbroek int
fsdriver_copyout(const struct fsdriver_data * data,size_t off,const void * ptr,size_t len)34*89c9de7dSDavid van Moolenbroek fsdriver_copyout(const struct fsdriver_data * data, size_t off,
35*89c9de7dSDavid van Moolenbroek 	const void * ptr, size_t len)
36*89c9de7dSDavid van Moolenbroek {
37*89c9de7dSDavid van Moolenbroek 
38*89c9de7dSDavid van Moolenbroek 	/* Do nothing for peek requests. */
39*89c9de7dSDavid van Moolenbroek 	if (data == NULL)
40*89c9de7dSDavid van Moolenbroek 		return OK;
41*89c9de7dSDavid van Moolenbroek 
42*89c9de7dSDavid van Moolenbroek 	/* The data size field is used only for this integrity check. */
43*89c9de7dSDavid van Moolenbroek 	if (off + len > data->size)
44*89c9de7dSDavid van Moolenbroek 		panic("fsdriver: copy-out buffer overflow");
45*89c9de7dSDavid van Moolenbroek 
46*89c9de7dSDavid van Moolenbroek 	if (data->endpt == SELF) {
47*89c9de7dSDavid van Moolenbroek 		memcpy(&data->ptr[off], ptr, len);
48*89c9de7dSDavid van Moolenbroek 
49*89c9de7dSDavid van Moolenbroek 		return OK;
50*89c9de7dSDavid van Moolenbroek 	}
51*89c9de7dSDavid van Moolenbroek 
52*89c9de7dSDavid van Moolenbroek 	return sys_safecopyto(data->endpt, data->grant, off, (vir_bytes)ptr,
53*89c9de7dSDavid van Moolenbroek 	    (phys_bytes)len);
54*89c9de7dSDavid van Moolenbroek }
55*89c9de7dSDavid van Moolenbroek 
56*89c9de7dSDavid van Moolenbroek /*
57*89c9de7dSDavid van Moolenbroek  * Zero out a data region in the caller.
58*89c9de7dSDavid van Moolenbroek  */
59*89c9de7dSDavid van Moolenbroek int
fsdriver_zero(const struct fsdriver_data * data,size_t off,size_t len)60*89c9de7dSDavid van Moolenbroek fsdriver_zero(const struct fsdriver_data * data, size_t off, size_t len)
61*89c9de7dSDavid van Moolenbroek {
62*89c9de7dSDavid van Moolenbroek 
63*89c9de7dSDavid van Moolenbroek 	/* Do nothing for peek requests. */
64*89c9de7dSDavid van Moolenbroek 	if (data == NULL)
65*89c9de7dSDavid van Moolenbroek 		return OK;
66*89c9de7dSDavid van Moolenbroek 
67*89c9de7dSDavid van Moolenbroek 	/* The data size field is used only for this integrity check. */
68*89c9de7dSDavid van Moolenbroek 	if (off + len > data->size)
69*89c9de7dSDavid van Moolenbroek 		panic("fsdriver: copy-out buffer overflow");
70*89c9de7dSDavid van Moolenbroek 
71*89c9de7dSDavid van Moolenbroek 	if (data->endpt == SELF) {
72*89c9de7dSDavid van Moolenbroek 		memset(&data->ptr[off], 0, len);
73*89c9de7dSDavid van Moolenbroek 
74*89c9de7dSDavid van Moolenbroek 		return OK;
75*89c9de7dSDavid van Moolenbroek 	}
76*89c9de7dSDavid van Moolenbroek 
77*89c9de7dSDavid van Moolenbroek 	return sys_safememset(data->endpt, data->grant, off, 0, len);
78*89c9de7dSDavid van Moolenbroek }
79*89c9de7dSDavid van Moolenbroek 
80*89c9de7dSDavid van Moolenbroek /*
81*89c9de7dSDavid van Moolenbroek  * Copy in a null-terminated name, and perform sanity checks.
82*89c9de7dSDavid van Moolenbroek  */
83*89c9de7dSDavid van Moolenbroek int
fsdriver_getname(endpoint_t endpt,cp_grant_id_t grant,size_t len,char * name,size_t size,int not_empty)84*89c9de7dSDavid van Moolenbroek fsdriver_getname(endpoint_t endpt, cp_grant_id_t grant, size_t len,
85*89c9de7dSDavid van Moolenbroek 	char * name, size_t size, int not_empty)
86*89c9de7dSDavid van Moolenbroek {
87*89c9de7dSDavid van Moolenbroek 	int r;
88*89c9de7dSDavid van Moolenbroek 
89*89c9de7dSDavid van Moolenbroek 	/* The given length includes the null terminator. */
90*89c9de7dSDavid van Moolenbroek 	if (len == 0 || (not_empty && len == 1))
91*89c9de7dSDavid van Moolenbroek 		return EINVAL;
92*89c9de7dSDavid van Moolenbroek 	if (len > size)
93*89c9de7dSDavid van Moolenbroek 		return ENAMETOOLONG;
94*89c9de7dSDavid van Moolenbroek 
95*89c9de7dSDavid van Moolenbroek 	if ((r = sys_safecopyfrom(endpt, grant, 0, (vir_bytes)name,
96*89c9de7dSDavid van Moolenbroek 	    (phys_bytes)len)) != OK)
97*89c9de7dSDavid van Moolenbroek 		return r;
98*89c9de7dSDavid van Moolenbroek 
99*89c9de7dSDavid van Moolenbroek 	if (name[len - 1] != 0) {
100*89c9de7dSDavid van Moolenbroek 		printf("fsdriver: name not null-terminated\n");
101*89c9de7dSDavid van Moolenbroek 		return EINVAL;
102*89c9de7dSDavid van Moolenbroek 	}
103*89c9de7dSDavid van Moolenbroek 
104*89c9de7dSDavid van Moolenbroek 	return OK;
105*89c9de7dSDavid van Moolenbroek }
106