1*ba736c79SDavid van Moolenbroek /* Created (MFS based):
2*ba736c79SDavid van Moolenbroek * February 2010 (Evgeniy Ivanov)
3*ba736c79SDavid van Moolenbroek */
4*ba736c79SDavid van Moolenbroek
5*ba736c79SDavid van Moolenbroek #include "fs.h"
6*ba736c79SDavid van Moolenbroek
7*ba736c79SDavid van Moolenbroek #include <stdarg.h>
8*ba736c79SDavid van Moolenbroek
9*ba736c79SDavid van Moolenbroek /*
10*ba736c79SDavid van Moolenbroek * Match by inode number in a puffs_pn_nodewalk call. This should not exist.
11*ba736c79SDavid van Moolenbroek */
12*ba736c79SDavid van Moolenbroek void *
find_inode_cb(struct puffs_usermount * __unused pu,struct puffs_node * pn,void * arg)13*ba736c79SDavid van Moolenbroek find_inode_cb(struct puffs_usermount * __unused pu, struct puffs_node * pn,
14*ba736c79SDavid van Moolenbroek void * arg)
15*ba736c79SDavid van Moolenbroek {
16*ba736c79SDavid van Moolenbroek
17*ba736c79SDavid van Moolenbroek if (pn->pn_va.va_fileid == *(ino_t *)arg)
18*ba736c79SDavid van Moolenbroek return pn;
19*ba736c79SDavid van Moolenbroek else
20*ba736c79SDavid van Moolenbroek return NULL;
21*ba736c79SDavid van Moolenbroek }
22*ba736c79SDavid van Moolenbroek
23*ba736c79SDavid van Moolenbroek /*===========================================================================*
24*ba736c79SDavid van Moolenbroek * update_timens *
25*ba736c79SDavid van Moolenbroek *===========================================================================*/
update_timens(struct puffs_node * pn,int flags,struct timespec * t)26*ba736c79SDavid van Moolenbroek int update_timens(struct puffs_node *pn, int flags, struct timespec *t)
27*ba736c79SDavid van Moolenbroek {
28*ba736c79SDavid van Moolenbroek int r;
29*ba736c79SDavid van Moolenbroek struct vattr va;
30*ba736c79SDavid van Moolenbroek struct timespec new_time;
31*ba736c79SDavid van Moolenbroek PUFFS_MAKECRED(pcr, &global_kcred);
32*ba736c79SDavid van Moolenbroek
33*ba736c79SDavid van Moolenbroek if (!flags)
34*ba736c79SDavid van Moolenbroek return 0;
35*ba736c79SDavid van Moolenbroek
36*ba736c79SDavid van Moolenbroek if (global_pu->pu_ops.puffs_node_setattr == NULL)
37*ba736c79SDavid van Moolenbroek return EINVAL;
38*ba736c79SDavid van Moolenbroek
39*ba736c79SDavid van Moolenbroek if (t != NULL)
40*ba736c79SDavid van Moolenbroek new_time = *t;
41*ba736c79SDavid van Moolenbroek else
42*ba736c79SDavid van Moolenbroek (void)clock_time(&new_time);
43*ba736c79SDavid van Moolenbroek
44*ba736c79SDavid van Moolenbroek puffs_vattr_null(&va);
45*ba736c79SDavid van Moolenbroek /* librefuse modifies atime and mtime together,
46*ba736c79SDavid van Moolenbroek * so set old values to avoid setting either one
47*ba736c79SDavid van Moolenbroek * to PUFFS_VNOVAL (set by puffs_vattr_null).
48*ba736c79SDavid van Moolenbroek */
49*ba736c79SDavid van Moolenbroek va.va_atime = pn->pn_va.va_atime;
50*ba736c79SDavid van Moolenbroek va.va_mtime = pn->pn_va.va_mtime;
51*ba736c79SDavid van Moolenbroek
52*ba736c79SDavid van Moolenbroek if (flags & ATIME)
53*ba736c79SDavid van Moolenbroek va.va_atime = new_time;
54*ba736c79SDavid van Moolenbroek if (flags & MTIME)
55*ba736c79SDavid van Moolenbroek va.va_mtime = new_time;
56*ba736c79SDavid van Moolenbroek if (flags & CTIME)
57*ba736c79SDavid van Moolenbroek va.va_ctime = new_time;
58*ba736c79SDavid van Moolenbroek
59*ba736c79SDavid van Moolenbroek r = global_pu->pu_ops.puffs_node_setattr(global_pu, pn, &va, pcr);
60*ba736c79SDavid van Moolenbroek
61*ba736c79SDavid van Moolenbroek return(r);
62*ba736c79SDavid van Moolenbroek }
63*ba736c79SDavid van Moolenbroek
64*ba736c79SDavid van Moolenbroek
65*ba736c79SDavid van Moolenbroek /*===========================================================================*
66*ba736c79SDavid van Moolenbroek * lpuffs_debug *
67*ba736c79SDavid van Moolenbroek *===========================================================================*/
lpuffs_debug(const char * format,...)68*ba736c79SDavid van Moolenbroek void lpuffs_debug(const char *format, ...)
69*ba736c79SDavid van Moolenbroek {
70*ba736c79SDavid van Moolenbroek char buffer[256];
71*ba736c79SDavid van Moolenbroek va_list args;
72*ba736c79SDavid van Moolenbroek va_start (args, format);
73*ba736c79SDavid van Moolenbroek vsprintf (buffer,format, args);
74*ba736c79SDavid van Moolenbroek printf("%s: %s", fs_name, buffer);
75*ba736c79SDavid van Moolenbroek va_end (args);
76*ba736c79SDavid van Moolenbroek }
77