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