138494Sobrien/*
2174294Sobrien * Copyright (c) 1997-2006 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.
1938494Sobrien * 3. All advertising materials mentioning features or use of this software
2042629Sobrien *    must display the following acknowledgment:
2138494Sobrien *      This product includes software developed by the University of
2238494Sobrien *      California, Berkeley and its contributors.
2338494Sobrien * 4. Neither the name of the University nor the names of its contributors
2438494Sobrien *    may be used to endorse or promote products derived from this software
2538494Sobrien *    without specific prior written permission.
2638494Sobrien *
2738494Sobrien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2838494Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2938494Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
3038494Sobrien * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
3138494Sobrien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3238494Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3338494Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3438494Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3538494Sobrien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3638494Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3738494Sobrien * SUCH DAMAGE.
3838494Sobrien *
3938494Sobrien *
40174294Sobrien * File: am-utils/amd/amfs_auto.c
4138494Sobrien *
4238494Sobrien */
4338494Sobrien
4438494Sobrien/*
4538494Sobrien * Automount file system
4638494Sobrien */
4738494Sobrien
4838494Sobrien#ifdef HAVE_CONFIG_H
4938494Sobrien# include <config.h>
5038494Sobrien#endif /* HAVE_CONFIG_H */
5138494Sobrien#include <am_defs.h>
5238494Sobrien#include <amd.h>
5338494Sobrien
5438494Sobrien/****************************************************************************
5538494Sobrien *** MACROS                                                               ***
5638494Sobrien ****************************************************************************/
5738494Sobrien
5838494Sobrien
5938494Sobrien/****************************************************************************
6038494Sobrien *** STRUCTURES                                                           ***
6138494Sobrien ****************************************************************************/
6238494Sobrien
6338494Sobrien
6438494Sobrien/****************************************************************************
6538494Sobrien *** FORWARD DEFINITIONS                                                  ***
6638494Sobrien ****************************************************************************/
67174294Sobrienstatic int amfs_auto_mount(am_node *mp, mntfs *mf);
6838494Sobrien
6938494Sobrien
7038494Sobrien/****************************************************************************
7138494Sobrien *** OPS STRUCTURES                                                       ***
7238494Sobrien ****************************************************************************/
7338494Sobrienam_ops amfs_auto_ops =
7438494Sobrien{
7538494Sobrien  "auto",
76174294Sobrien  amfs_generic_match,
7738494Sobrien  0,				/* amfs_auto_init */
7838494Sobrien  amfs_auto_mount,
79174294Sobrien  amfs_generic_umount,
80174294Sobrien  amfs_generic_lookup_child,
81174294Sobrien  amfs_generic_mount_child,
82174294Sobrien  amfs_generic_readdir,
8338494Sobrien  0,				/* amfs_auto_readlink */
84174294Sobrien  amfs_generic_mounted,
85174294Sobrien  0,				/* amfs_auto_umounted */
86174294Sobrien  amfs_generic_find_srvr,
87174294Sobrien  0,				/* amfs_auto_get_wchan */
88174294Sobrien  FS_AMQINFO | FS_DIRECTORY,
89174294Sobrien#ifdef HAVE_FS_AUTOFS
90174294Sobrien  AUTOFS_AUTO_FS_FLAGS,
91174294Sobrien#endif /* HAVE_FS_AUTOFS */
9238494Sobrien};
9338494Sobrien
9438494Sobrien
9538494Sobrien/****************************************************************************
9638494Sobrien *** FUNCTIONS                                                             ***
9738494Sobrien ****************************************************************************/
9838494Sobrien/*
9938494Sobrien * Mount a sub-mount
10038494Sobrien */
10138494Sobrienstatic int
102174294Sobrienamfs_auto_mount(am_node *mp, mntfs *mf)
10338494Sobrien{
10438494Sobrien  /*
10538494Sobrien   * Pseudo-directories are used to provide some structure
10638494Sobrien   * to the automounted directories instead
10738494Sobrien   * of putting them all in the top-level automount directory.
10838494Sobrien   *
10938494Sobrien   * Here, just increment the parent's link count.
11038494Sobrien   */
11138494Sobrien  mp->am_parent->am_fattr.na_nlink++;
11238494Sobrien
11338494Sobrien  /*
11438494Sobrien   * Info field of . means use parent's info field.
11538494Sobrien   * Historical - not documented.
11638494Sobrien   */
11738494Sobrien  if (mf->mf_info[0] == '.' && mf->mf_info[1] == '\0')
11838494Sobrien    mf->mf_info = strealloc(mf->mf_info, mp->am_parent->am_mnt->mf_info);
11938494Sobrien
12038494Sobrien  /*
12138494Sobrien   * Compute prefix:
12238494Sobrien   *
12338494Sobrien   * If there is an option prefix then use that else
12438494Sobrien   * If the parent had a prefix then use that with name
12538494Sobrien   *      of this node appended else
12638494Sobrien   * Use the name of this node.
12738494Sobrien   *
12838494Sobrien   * That means if you want no prefix you must say so
12938494Sobrien   * in the map.
13038494Sobrien   */
13138494Sobrien  if (mf->mf_fo->opt_pref) {
13238494Sobrien    /* allow pref:=null to set a real null prefix */
13338494Sobrien    if (STREQ(mf->mf_fo->opt_pref, "null")) {
134119679Smbr      mp->am_pref = strdup("");
13538494Sobrien    } else {
13638494Sobrien      /*
13738494Sobrien       * the prefix specified as an option
13838494Sobrien       */
13938494Sobrien      mp->am_pref = strdup(mf->mf_fo->opt_pref);
14038494Sobrien    }
14138494Sobrien  } else {
14238494Sobrien    /*
14338494Sobrien     * else the parent's prefix
14438494Sobrien     * followed by the name
14538494Sobrien     * followed by /
14638494Sobrien     */
14738494Sobrien    char *ppref = mp->am_parent->am_pref;
14838494Sobrien    if (ppref == 0)
14938494Sobrien      ppref = "";
15038494Sobrien    mp->am_pref = str3cat((char *) 0, ppref, mp->am_name, "/");
15138494Sobrien  }
15238494Sobrien
153174294Sobrien#ifdef HAVE_FS_AUTOFS
154174294Sobrien  if (mf->mf_flags & MFF_IS_AUTOFS) {
155174294Sobrien    char opts[SIZEOF_OPTS];
156174294Sobrien    int error;
15738494Sobrien
158174294Sobrien    autofs_get_opts(opts, sizeof(opts), mp->am_autofs_fh);
15938494Sobrien
160174294Sobrien    /* now do the mount */
161174294Sobrien    error = amfs_mount(mp, mf, opts);
162174294Sobrien    if (error) {
163174294Sobrien      errno = error;
164174294Sobrien      plog(XLOG_FATAL, "amfs_auto_mount: amfs_mount failed: %m");
165174294Sobrien      return error;
16638494Sobrien    }
16738494Sobrien  }
168174294Sobrien#endif /* HAVE_FS_AUTOFS */
16938494Sobrien
17038494Sobrien  /*
171174294Sobrien   * Attach a map cache
17238494Sobrien   */
173174294Sobrien  amfs_mkcacheref(mf);
17438494Sobrien
17538494Sobrien  return 0;
17638494Sobrien}
177