138494Sobrien/* 2310490Scy * Copyright (c) 1997-2014 Erez Zadok 338494Sobrien * Copyright (c) 1990 Jan-Simon Pendry 438494Sobrien * Copyright (c) 1990 Imperial College of Science, Technology & Medicine 538494Sobrien * Copyright (c) 1990 The Regents of the University of California. 638494Sobrien * All rights reserved. 738494Sobrien * 838494Sobrien * This code is derived from software contributed to Berkeley by 938494Sobrien * Jan-Simon Pendry at Imperial College, London. 1038494Sobrien * 1138494Sobrien * Redistribution and use in source and binary forms, with or without 1238494Sobrien * modification, are permitted provided that the following conditions 1338494Sobrien * are met: 1438494Sobrien * 1. Redistributions of source code must retain the above copyright 1538494Sobrien * notice, this list of conditions and the following disclaimer. 1638494Sobrien * 2. Redistributions in binary form must reproduce the above copyright 1738494Sobrien * notice, this list of conditions and the following disclaimer in the 1838494Sobrien * documentation and/or other materials provided with the distribution. 19310490Scy * 3. Neither the name of the University nor the names of its contributors 2038494Sobrien * may be used to endorse or promote products derived from this software 2138494Sobrien * without specific prior written permission. 2238494Sobrien * 2338494Sobrien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2438494Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2538494Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2638494Sobrien * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2738494Sobrien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2838494Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2938494Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3038494Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3138494Sobrien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3238494Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3338494Sobrien * SUCH DAMAGE. 3438494Sobrien * 3538494Sobrien * 36174294Sobrien * File: am-utils/amd/ops_TEMPLATE.c 3738494Sobrien * 3838494Sobrien */ 3938494Sobrien 4038494Sobrien/* 4138494Sobrien * An empty template for an amd pseudo filesystem "foofs". 4238494Sobrien */ 4338494Sobrien 4438494Sobrien/* 4538494Sobrien * NOTE: if this is an Amd file system, prepend "amfs_" to all foofs symbols 4638494Sobrien * and renamed the file name to amfs_foofs.c. If it is a native file system 4738494Sobrien * (such as pcfs, isofs, or ffs), then you can keep the names as is, and 4838494Sobrien * just rename the file to ops_foofs.c. 4938494Sobrien */ 5038494Sobrien 5138494Sobrien#ifdef HAVE_CONFIG_H 5238494Sobrien# include <config.h> 5338494Sobrien#endif /* HAVE_CONFIG_H */ 5438494Sobrien#include <am_defs.h> 5538494Sobrien#include <amd.h> 5638494Sobrien 5738494Sobrien/* forward declarations */ 5882794Sobrienstatic char *foofs_match(am_opts *fo); 5938494Sobrienstatic int foofs_init(mntfs *mf); 60174294Sobrienstatic int foofs_mount(am_node *mp, mntfs *mf); 61174294Sobrienstatic int foofs_umount(am_node *mp, mntfs *mf); 6282794Sobrienstatic am_node *foofs_lookuppn(am_node *mp, char *fname, int *error_return, int op); 63310490Scystatic int foofs_readdir(am_node *mp, void cookie, voidp dp, voidp ep, u_int count); 6482794Sobrienstatic am_node *foofs_readlink(am_node *mp, int *error_return); 65174294Sobrienstatic void foofs_mounted(am_node *am, mntfs *mf); 66174294Sobrienstatic void foofs_umounted(am_node *mp, mntfs *mf); 67174294Sobrienstatic fserver *foofs_ffserver(mntfs *mf); 6838494Sobrien 6938494Sobrien 7038494Sobrien/* 7138494Sobrien * Foofs operations. 7238494Sobrien * Define only those you need, others set to 0 (NULL) 7338494Sobrien */ 7438494Sobrienam_ops foofs_ops = 7538494Sobrien{ 7638494Sobrien "foofs", /* name of file system */ 7738494Sobrien foofs_match, /* match */ 7838494Sobrien foofs_init, /* initialize */ 7938494Sobrien foofs_mount, /* mount vnode */ 8038494Sobrien foofs_umount, /* unmount vnode */ 81174294Sobrien foofs_lookup_child, /* lookup path-name */ 82174294Sobrien foofs_mount_child, /* mount path-name */ 8338494Sobrien foofs_readdir, /* read directory */ 8438494Sobrien foofs_readlink, /* read link */ 8538494Sobrien foofs_mounted, /* after-mount extra actions */ 8638494Sobrien foofs_umounted, /* after-umount extra actions */ 8738494Sobrien foofs_ffserver, /* find a file server */ 88174294Sobrien foofs_get_wchan, /* return the waiting channel */ 89174294Sobrien FS_MKMNT | FS_BACKGROUND | FS_AMQINFO, /* nfs_fs_flags */ 90174294Sobrien#ifdef HAVE_FS_AUTOFS 91174294Sobrien AUTOFS_TEMPLATE_FS_FLAGS, 92174294Sobrien#endif /* HAVE_FS_AUTOFS */ 9338494Sobrien}; 9438494Sobrien 9538494Sobrien 9638494Sobrien/* 9738494Sobrien * Check that f/s has all needed fields. 9838494Sobrien * Returns: matched string if found, NULL otherwise. 9938494Sobrien */ 10038494Sobrienstatic char * 10138494Sobrienfoofs_match(am_opts *fo) 10238494Sobrien{ 10338494Sobrien char *cp = "fill this with a way to find the match"; 10438494Sobrien 10538494Sobrien plog(XLOG_INFO, "entering foofs_match..."); 10638494Sobrien 10738494Sobrien if (cp) 10838494Sobrien return cp; /* OK */ 10938494Sobrien 11038494Sobrien return NULL; /* not OK */ 11138494Sobrien} 11238494Sobrien 11338494Sobrien 11438494Sobrien/* 11538494Sobrien * Initialize. 11638494Sobrien * Returns: 0 if OK, non-zero (errno) if failed. 11738494Sobrien */ 11838494Sobrienstatic int 11938494Sobrienfoofs_init(mntfs *mf) 12038494Sobrien{ 12138494Sobrien int error = 0; 12238494Sobrien 12338494Sobrien plog(XLOG_INFO, "entering foofs_init..."); 12438494Sobrien 12538494Sobrien error = EPERM; /* XXX: fixme */ 12638494Sobrien return error; 12738494Sobrien} 12838494Sobrien 12938494Sobrien 13038494Sobrien/* 13138494Sobrien * Mount vnode. 13238494Sobrien * Returns: 0 if OK, non-zero (errno) if failed. 13338494Sobrien */ 13438494Sobrienstatic int 13538494Sobrienfoofs_mount(am_node *mp) 13638494Sobrien{ 13738494Sobrien int error = 0; 13838494Sobrien 13938494Sobrien plog(XLOG_INFO, "entering foofs_mount..."); 14038494Sobrien 14138494Sobrien error = EPERM; /* XXX: fixme */ 14238494Sobrien return error; 14338494Sobrien} 14438494Sobrien 14538494Sobrien 14638494Sobrien/* 14738494Sobrien * Mount vfs. 14838494Sobrien * Returns: 0 if OK, non-zero (errno) if failed. 14938494Sobrien */ 15038494Sobrienstatic int 15138494Sobrienfoofs_fmount(mntfs *mf) 15238494Sobrien{ 15338494Sobrien int error = 0; 15438494Sobrien 15538494Sobrien plog(XLOG_INFO, "entering foofs_fmount..."); 15638494Sobrien 15738494Sobrien error = EPERM; /* XXX: fixme */ 15838494Sobrien return error; 15938494Sobrien} 16038494Sobrien 16138494Sobrien 16238494Sobrien/* 16338494Sobrien * Unmount vnode. 16438494Sobrien * Returns: 0 if OK, non-zero (errno) if failed. 16538494Sobrien */ 16638494Sobrienstatic int 16738494Sobrienfoofs_umount(am_node *mp) 16838494Sobrien{ 16938494Sobrien int error = 0; 17038494Sobrien 17138494Sobrien plog(XLOG_INFO, "entering foofs_umount..."); 17238494Sobrien 17338494Sobrien error = EPERM; /* XXX: fixme */ 17438494Sobrien return error; 17538494Sobrien} 17638494Sobrien 17738494Sobrien 17838494Sobrien/* 17938494Sobrien * Unmount VFS. 18038494Sobrien * Returns: 0 if OK, non-zero (errno) if failed. 18138494Sobrien */ 18238494Sobrienstatic int 18338494Sobrienfoofs_fumount(mntfs *mf) 18438494Sobrien{ 18538494Sobrien int error = 0; 18638494Sobrien 18738494Sobrien plog(XLOG_INFO, "entering foofs_fumount..."); 18838494Sobrien 18938494Sobrien error = EPERM; /* XXX: fixme */ 19038494Sobrien return error; 19138494Sobrien} 19238494Sobrien 19338494Sobrien 19438494Sobrien/* 19538494Sobrien * Lookup path-name. 19638494Sobrien * Returns: the am_node that was found, or NULL if failed. 19738494Sobrien * If failed, also fills in errno in error_return. 19838494Sobrien */ 19938494Sobrienstatic am_node * 20038494Sobrienfoofs_lookuppn(am_node *mp, char *fname, int *error_return, int op) 20138494Sobrien{ 20238494Sobrien int error = 0; 20338494Sobrien 20438494Sobrien plog(XLOG_INFO, "entering foofs_lookuppn..."); 20538494Sobrien 20638494Sobrien error = EPERM; /* XXX: fixme */ 20738494Sobrien 20838494Sobrien *error_return = error; 20938494Sobrien return NULL; 21038494Sobrien} 21138494Sobrien 21238494Sobrien 21338494Sobrien/* 21438494Sobrien * Read directory. 21538494Sobrien * Returns: 0 if OK, non-zero (errno) if failed. 21638494Sobrien * If OK, fills in ep with chain of directory entries. 21738494Sobrien */ 21838494Sobrienstatic int 219310490Scyfoofs_readdir(am_node *mp, void cookie, voidp dp, voidp ep, u_int count) 22038494Sobrien{ 22138494Sobrien int error = 0; 22238494Sobrien 22338494Sobrien plog(XLOG_INFO, "entering foofs_readdir..."); 22438494Sobrien 22538494Sobrien error = EPERM; /* XXX: fixme */ 22638494Sobrien return error; 22738494Sobrien} 22838494Sobrien 22938494Sobrien 23038494Sobrien/* 23138494Sobrien * Read link. 23238494Sobrien * Returns: am_node found, or NULL if not found. 23338494Sobrien * If failed, fills in errno in error_return. 23438494Sobrien */ 23538494Sobrienstatic am_node * 23638494Sobrienfoofs_readlink(am_node *mp, int *error_return) 23738494Sobrien{ 23838494Sobrien int error = 0; 23938494Sobrien 24038494Sobrien plog(XLOG_INFO, "entering foofs_readlink..."); 24138494Sobrien 24238494Sobrien error = EPERM; /* XXX: fixme */ 24338494Sobrien 24438494Sobrien *error_return = error; 24538494Sobrien return NULL; 24638494Sobrien} 24738494Sobrien 24838494Sobrien 24938494Sobrien/* 25038494Sobrien * Async mount callback function. 25138494Sobrien * After the base mount went OK, sometimes 25238494Sobrien * there are additional actions that are needed. See union_mounted() and 25338494Sobrien * toplvl_mounted(). 25438494Sobrien */ 25538494Sobrienstatic void 25638494Sobrienfoofs_mounted(mntfs *mf) 25738494Sobrien{ 25838494Sobrien plog(XLOG_INFO, "entering foofs_mounted..."); 25938494Sobrien 26038494Sobrien return; 26138494Sobrien} 26238494Sobrien 26338494Sobrien 26438494Sobrien/* 26538494Sobrien * Async unmount callback function. 26638494Sobrien * After the base umount() succeeds, we may want to take extra actions, 26738494Sobrien * such as informing remote mount daemons that we've unmounted them. 26838494Sobrien * See amfs_auto_umounted(), host_umounted(), nfs_umounted(). 26938494Sobrien */ 27038494Sobrienstatic void 27138494Sobrienfoofs_umounted(am_node *mp) 27238494Sobrien{ 27338494Sobrien plog(XLOG_INFO, "entering foofs_umounted..."); 27438494Sobrien 27538494Sobrien return; 27638494Sobrien} 27738494Sobrien 27838494Sobrien 27938494Sobrien/* 28038494Sobrien * Find a file server. 28138494Sobrien * Returns: fserver of found server, or NULL if not found. 28238494Sobrien */ 283174294Sobrienstatic fserver * 28438494Sobrienfoofs_ffserver(mntfs *mf) 28538494Sobrien{ 28638494Sobrien plog(XLOG_INFO, "entering foofs_ffserver..."); 28738494Sobrien 28838494Sobrien return NULL; 28938494Sobrien} 290174294Sobrien 291174294Sobrien 292174294Sobrien/* 293174294Sobrien * Normally just return mf. Only inherit needs to do special tricks. 294174294Sobrien */ 295174294Sobrienstatic wchan_t * 296174294Sobrienfoofs_get_wchan(mntfs *mf) 297174294Sobrien{ 298174294Sobrien plog(XLOG_INFO, "entering foofs_get_wchan..."); 299174294Sobrien 300174294Sobrien return mf; 301174294Sobrien} 302