xref: /netbsd-src/lib/libpuffs/pnode.c (revision d256e3841403bf241540db5be774ac9813acf3e7)
1*d256e384Smanu /*	$NetBSD: pnode.c,v 1.13 2012/08/16 09:25:43 manu Exp $	*/
2184a7d78Spooka 
3184a7d78Spooka /*
4184a7d78Spooka  * Copyright (c) 2006 Antti Kantee.  All Rights Reserved.
5184a7d78Spooka  *
6184a7d78Spooka  * Redistribution and use in source and binary forms, with or without
7184a7d78Spooka  * modification, are permitted provided that the following conditions
8184a7d78Spooka  * are met:
9184a7d78Spooka  * 1. Redistributions of source code must retain the above copyright
10184a7d78Spooka  *    notice, this list of conditions and the following disclaimer.
11184a7d78Spooka  * 2. Redistributions in binary form must reproduce the above copyright
12184a7d78Spooka  *    notice, this list of conditions and the following disclaimer in the
13184a7d78Spooka  *    documentation and/or other materials provided with the distribution.
14184a7d78Spooka  *
15184a7d78Spooka  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
16184a7d78Spooka  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17184a7d78Spooka  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18184a7d78Spooka  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19184a7d78Spooka  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20184a7d78Spooka  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21184a7d78Spooka  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22184a7d78Spooka  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23184a7d78Spooka  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24184a7d78Spooka  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25184a7d78Spooka  * SUCH DAMAGE.
26184a7d78Spooka  */
27184a7d78Spooka 
28184a7d78Spooka #include <sys/cdefs.h>
29184a7d78Spooka #if !defined(lint)
30*d256e384Smanu __RCSID("$NetBSD: pnode.c,v 1.13 2012/08/16 09:25:43 manu Exp $");
31184a7d78Spooka #endif /* !lint */
32184a7d78Spooka 
33184a7d78Spooka #include <sys/types.h>
34184a7d78Spooka 
35184a7d78Spooka #include <assert.h>
36184a7d78Spooka #include <puffs.h>
37184a7d78Spooka #include <stdlib.h>
38184a7d78Spooka #include <stdio.h>
39184a7d78Spooka #include <string.h>
40184a7d78Spooka 
41184a7d78Spooka #include "puffs_priv.h"
42184a7d78Spooka 
43184a7d78Spooka /*
44184a7d78Spooka  * Well, you're probably wondering why this isn't optimized.
45184a7d78Spooka  * The reason is simple: my available time is not optimized for
46184a7d78Spooka  * size ... so please be patient ;)
47184a7d78Spooka  */
48184a7d78Spooka struct puffs_node *
puffs_pn_new(struct puffs_usermount * pu,void * privdata)49184a7d78Spooka puffs_pn_new(struct puffs_usermount *pu, void *privdata)
50184a7d78Spooka {
51184a7d78Spooka 	struct puffs_node *pn;
52184a7d78Spooka 
53184a7d78Spooka 	pn = calloc(1, sizeof(struct puffs_node));
54184a7d78Spooka 	if (pn == NULL)
55184a7d78Spooka 		return NULL;
56184a7d78Spooka 
57184a7d78Spooka 	pn->pn_data = privdata;
5805861b92Spooka 	pn->pn_mnt = pu;
59184a7d78Spooka 	puffs_vattr_null(&pn->pn_va);
60184a7d78Spooka 
61184a7d78Spooka 	LIST_INSERT_HEAD(&pu->pu_pnodelst, pn, pn_entries);
62184a7d78Spooka 
63*d256e384Smanu 	pu->pu_flags |= PUFFS_FLAG_PNCOOKIE;
64*d256e384Smanu 
65184a7d78Spooka 	return pn;
66184a7d78Spooka }
67184a7d78Spooka 
68184a7d78Spooka void
puffs_pn_remove(struct puffs_node * pn)69564336f0Spooka puffs_pn_remove(struct puffs_node *pn)
70564336f0Spooka {
71564336f0Spooka 
72564336f0Spooka 	LIST_REMOVE(pn, pn_entries);
73564336f0Spooka 	pn->pn_flags |= PUFFS_NODE_REMOVED;
74564336f0Spooka }
75564336f0Spooka 
76564336f0Spooka void
puffs_pn_put(struct puffs_node * pn)77184a7d78Spooka puffs_pn_put(struct puffs_node *pn)
78184a7d78Spooka {
7905861b92Spooka 	struct puffs_usermount *pu = pn->pn_mnt;
80184a7d78Spooka 
8105861b92Spooka 	pu->pu_pathfree(pu, &pn->pn_po);
82564336f0Spooka 	if ((pn->pn_flags & PUFFS_NODE_REMOVED) == 0)
83184a7d78Spooka 		LIST_REMOVE(pn, pn_entries);
84184a7d78Spooka 	free(pn);
85184a7d78Spooka }
86e639bec8Spooka 
87e639bec8Spooka /* walk list, rv can be used either to halt or to return a value */
88e639bec8Spooka void *
puffs_pn_nodewalk(struct puffs_usermount * pu,puffs_nodewalk_fn fn,void * arg)8905861b92Spooka puffs_pn_nodewalk(struct puffs_usermount *pu, puffs_nodewalk_fn fn, void *arg)
90e639bec8Spooka {
91e639bec8Spooka 	struct puffs_node *pn_cur, *pn_next;
92e639bec8Spooka 	void *rv;
93e639bec8Spooka 
94e639bec8Spooka 	pn_cur = LIST_FIRST(&pu->pu_pnodelst);
95e639bec8Spooka 	while (pn_cur) {
96e639bec8Spooka 		pn_next = LIST_NEXT(pn_cur, pn_entries);
9705861b92Spooka 		rv = fn(pu, pn_cur, arg);
98e639bec8Spooka 		if (rv)
99e639bec8Spooka 			return rv;
100e639bec8Spooka 		pn_cur = pn_next;
101e639bec8Spooka 	}
102e639bec8Spooka 
103e639bec8Spooka 	return NULL;
104e639bec8Spooka }
10595a18d20Spooka 
1064385b647Spooka struct vattr *
puffs_pn_getvap(struct puffs_node * pn)1074385b647Spooka puffs_pn_getvap(struct puffs_node *pn)
1084385b647Spooka {
1094385b647Spooka 
1104385b647Spooka 	return &pn->pn_va;
1114385b647Spooka }
1124385b647Spooka 
1134385b647Spooka void *
puffs_pn_getpriv(struct puffs_node * pn)1144385b647Spooka puffs_pn_getpriv(struct puffs_node *pn)
1154385b647Spooka {
1164385b647Spooka 
1174385b647Spooka 	return pn->pn_data;
1184385b647Spooka }
1194385b647Spooka 
1204385b647Spooka void
puffs_pn_setpriv(struct puffs_node * pn,void * priv)1214385b647Spooka puffs_pn_setpriv(struct puffs_node *pn, void *priv)
1224385b647Spooka {
1234385b647Spooka 
1244385b647Spooka 	pn->pn_data = priv;
1254385b647Spooka }
1264385b647Spooka 
1274385b647Spooka struct puffs_pathobj *
puffs_pn_getpo(struct puffs_node * pn)1284385b647Spooka puffs_pn_getpo(struct puffs_node *pn)
1294385b647Spooka {
1304385b647Spooka 
1314385b647Spooka 	return &pn->pn_po;
1324385b647Spooka }
1334385b647Spooka 
1344385b647Spooka struct puffs_usermount *
puffs_pn_getmnt(struct puffs_node * pn)1354385b647Spooka puffs_pn_getmnt(struct puffs_node *pn)
1364385b647Spooka {
1374385b647Spooka 
1384385b647Spooka 	return pn->pn_mnt;
1394385b647Spooka }
1404385b647Spooka 
14195a18d20Spooka /* convenience / shortcut */
14295a18d20Spooka void *
puffs_pn_getmntspecific(struct puffs_node * pn)14395a18d20Spooka puffs_pn_getmntspecific(struct puffs_node *pn)
14495a18d20Spooka {
14595a18d20Spooka 
14695a18d20Spooka 	return pn->pn_mnt->pu_privdata;
14795a18d20Spooka }
14880234546Spooka 
14980234546Spooka /*
15080234546Spooka  * newnode parameters
15180234546Spooka  */
15280234546Spooka void
puffs_newinfo_setcookie(struct puffs_newinfo * pni,puffs_cookie_t cookie)153ff423327Spooka puffs_newinfo_setcookie(struct puffs_newinfo *pni, puffs_cookie_t cookie)
15480234546Spooka {
15580234546Spooka 
15680234546Spooka 	*pni->pni_cookie = cookie;
15780234546Spooka }
15880234546Spooka 
15980234546Spooka void
puffs_newinfo_setvtype(struct puffs_newinfo * pni,enum vtype vt)16080234546Spooka puffs_newinfo_setvtype(struct puffs_newinfo *pni, enum vtype vt)
16180234546Spooka {
16280234546Spooka 
16380234546Spooka 	*pni->pni_vtype = vt;
16480234546Spooka }
16580234546Spooka 
16680234546Spooka void
puffs_newinfo_setsize(struct puffs_newinfo * pni,voff_t size)16780234546Spooka puffs_newinfo_setsize(struct puffs_newinfo *pni, voff_t size)
16880234546Spooka {
16980234546Spooka 
17080234546Spooka 	*pni->pni_size = size;
17180234546Spooka }
17280234546Spooka 
17380234546Spooka void
puffs_newinfo_setrdev(struct puffs_newinfo * pni,dev_t rdev)17480234546Spooka puffs_newinfo_setrdev(struct puffs_newinfo *pni, dev_t rdev)
17580234546Spooka {
17680234546Spooka 
17780234546Spooka 	*pni->pni_rdev = rdev;
17880234546Spooka }
17970d81924Smanu 
18070d81924Smanu void
puffs_newinfo_setva(struct puffs_newinfo * pni,struct vattr * va)18170d81924Smanu puffs_newinfo_setva(struct puffs_newinfo *pni, struct vattr *va)
18270d81924Smanu {
18370d81924Smanu 
18470d81924Smanu 	(void)memcpy(pni->pni_va, va, sizeof(struct vattr));
18570d81924Smanu }
18670d81924Smanu 
18770d81924Smanu void
puffs_newinfo_setvattl(struct puffs_newinfo * pni,struct timespec * va_ttl)18870d81924Smanu puffs_newinfo_setvattl(struct puffs_newinfo *pni, struct timespec *va_ttl)
18970d81924Smanu {
19070d81924Smanu 
19170d81924Smanu 	pni->pni_va_ttl->tv_sec = va_ttl->tv_sec;
19270d81924Smanu 	pni->pni_va_ttl->tv_nsec = va_ttl->tv_nsec;
19370d81924Smanu }
19470d81924Smanu 
19570d81924Smanu void
puffs_newinfo_setcnttl(struct puffs_newinfo * pni,struct timespec * cn_ttl)19670d81924Smanu puffs_newinfo_setcnttl(struct puffs_newinfo *pni, struct timespec *cn_ttl)
19770d81924Smanu {
19870d81924Smanu 
19970d81924Smanu 	pni->pni_cn_ttl->tv_sec = cn_ttl->tv_sec;
20070d81924Smanu 	pni->pni_cn_ttl->tv_nsec = cn_ttl->tv_nsec;
20170d81924Smanu }
20270d81924Smanu 
203