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