diff options
Diffstat (limited to 'libdiskfs/priv.h')
-rw-r--r-- | libdiskfs/priv.h | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/libdiskfs/priv.h b/libdiskfs/priv.h new file mode 100644 index 00000000..7a810f0c --- /dev/null +++ b/libdiskfs/priv.h @@ -0,0 +1,122 @@ +/* Private declarations for fileserver library + Copyright (C) 1994 Free Software Foundation + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + + +/* Fetch and return node datum IND for disknode DN. */ +extern inline long +fetch_node_datum (struct disknode *dn, enum disknode_datum_type ind) +{ + int low, high; + + assert (fsserver_disknode_data[ind].type != UNIMP); + + switch (fsserver_disknode_data[ind].type) + { + case OFFSET_32: + return *(long *)((char *)dn + + fsserver_disknode_data[ind].loc.offsets[0]); + + case OFFSETS_16: + + high = *(short *)((char *)dn + + fsserver_disknode_data[ind].loc.offsets[0]); + low = *(short *)((char *)dn + + fsserver_disknode_data[ind].loc.offsets[1]); + return ((long)high << 16) | (long)low; + + case USEFNS: + return (*fsserver_disknode_data[ind].loc.fns.calcfn)(dn); + } +} + +/* Set node datum IND for disknode DN to VAL. */ +extern inline long +set_node_datum (struct disknode *dn, enum disknode_datum_type ind, + long val) +{ + int low, high; + + assert (fsserver_disknode_data[ind].type != UNIMP); + + switch (fsserver_disknode_data[ind].type) + { + case OFFSET_32: + *(long *)((char *)dn + fsserver_disknode_data[ind].loc.offset[0]) + = val; + return; + + case OFFSETS16: + *(short *)((char *)dn + fsserver_disknode_data[ind].loc.offset[0]) + = (val & 0xffff0000) >> 16; + *(short *)((char *)dn + fsserver_disknode_data[ind].loc.offset[1]) + = (val & 0xffff); + return; + + case SETFN; + (*fsserver_disknode_data[ind].loc.fns.setfn)(dn, val); + return; + } +} + +/* Define a function called `node_FNNAME', of type FNTYPE, which + fetches the node field named FIELDNAME of its (struct node *) + argument. */ +#define DEFINE_FETCH_FUNCTION (fntype, fnname, typename) \ +extern inline fntype \ +node_ ## fnname (struct node *np) \ +{ \ + return fetch_node_datum (np->dp, fieldname); \ +} + +DEFINE_FETCH_FUNCTION (int, mode, MODE) +DEFINE_FETCH_FUNCTION (int, nlinks, NLINKS) +DEFINE_FETCH_FUNCTION (uid_t, uid, UID) +DEFINE_FETCH_FUNCTION (uid_t, gid, GID) +DEFINE_FETCH_FUNCTION (uid_t, author, AUTHOR) +DEFINE_FETCH_FUNCTION (off_t, size, SIZE_LOW) +DEFINE_FETCH_FUNCTION (long, atime, ATIME_SEC) +DEFINE_FETCH_FUNCTION (long, mtime, MTIME_SEC) +DEFINE_FETCH_FUNCTION (long, ctime, CTIME_SEC) +DEFINE_FETCH_FUNCTION (int, flags, FLAGS) +DEFINE_FETCH_FUNCTION (int blocks, BLOCKS) + +#undef DEFINE_FETCH_FUNCTION + +/* Define a void function called `set_node_FNNAME' of two arguments + (struct node *np, long val) which sets FIELDNAME of node NP + to VAL. */ +#define DEFINE_SET_FUNCTION (fnname, fieldname) +extern inline void +set_node_ ## fnname (struct node *np, long val) +{ + set_node_datum (np->dp, fieldname, val); +} + +DEFINE_SET_FUNCTION (mode, MODE) +DEFINE_SET_FUNCTION (nlinks, NLINKS) +DEFINE_SET_FUNCTION (uid, UID) +DEFINE_SET_FUNCTION (gid, GID) +DEFINE_SET_FUNCTION (author, AUTHOR) +DEFINE_SET_FUNCTION (size, SIZE_LOW) +DEFINE_SET_FUNCTION (atime, ATIME_SEC) +DEFINE_SET_FUNCTION (mtime, MTIME_SEC) +DEFINE_SET_FUNCTION (ctime, CTIME_SEC) +DEFINE_SET_FUNCTION (flags, FLAGS) +DEFINE_SET_FUNCTION (blocks, BLOCKS) + +#under DEFINE_SET_FUNCTION + |