Home | History | Annotate | Line # | Download | only in amd
      1 /*	$NetBSD: amfs_auto.c,v 1.1.1.3 2015/01/17 16:34:15 christos Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1997-2014 Erez Zadok
      5  * Copyright (c) 1990 Jan-Simon Pendry
      6  * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
      7  * Copyright (c) 1990 The Regents of the University of California.
      8  * All rights reserved.
      9  *
     10  * This code is derived from software contributed to Berkeley by
     11  * Jan-Simon Pendry at Imperial College, London.
     12  *
     13  * Redistribution and use in source and binary forms, with or without
     14  * modification, are permitted provided that the following conditions
     15  * are met:
     16  * 1. Redistributions of source code must retain the above copyright
     17  *    notice, this list of conditions and the following disclaimer.
     18  * 2. Redistributions in binary form must reproduce the above copyright
     19  *    notice, this list of conditions and the following disclaimer in the
     20  *    documentation and/or other materials provided with the distribution.
     21  * 3. Neither the name of the University nor the names of its contributors
     22  *    may be used to endorse or promote products derived from this software
     23  *    without specific prior written permission.
     24  *
     25  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     27  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     28  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     29  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     30  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     31  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     32  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     34  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     35  * SUCH DAMAGE.
     36  *
     37  *
     38  * File: am-utils/amd/amfs_auto.c
     39  *
     40  */
     41 
     42 /*
     43  * Automount file system
     44  */
     45 
     46 #ifdef HAVE_CONFIG_H
     47 # include <config.h>
     48 #endif /* HAVE_CONFIG_H */
     49 #include <am_defs.h>
     50 #include <amd.h>
     51 
     52 /****************************************************************************
     53  *** MACROS                                                               ***
     54  ****************************************************************************/
     55 
     56 
     57 /****************************************************************************
     58  *** STRUCTURES                                                           ***
     59  ****************************************************************************/
     60 
     61 
     62 /****************************************************************************
     63  *** FORWARD DEFINITIONS                                                  ***
     64  ****************************************************************************/
     65 static int amfs_auto_mount(am_node *mp, mntfs *mf);
     66 
     67 
     68 /****************************************************************************
     69  *** OPS STRUCTURES                                                       ***
     70  ****************************************************************************/
     71 am_ops amfs_auto_ops =
     72 {
     73   "auto",
     74   amfs_generic_match,
     75   0,				/* amfs_auto_init */
     76   amfs_auto_mount,
     77   amfs_generic_umount,
     78   amfs_generic_lookup_child,
     79   amfs_generic_mount_child,
     80   amfs_generic_readdir,
     81   0,				/* amfs_auto_readlink */
     82   amfs_generic_mounted,
     83   0,				/* amfs_auto_umounted */
     84   amfs_generic_find_srvr,
     85   0,				/* amfs_auto_get_wchan */
     86   FS_AMQINFO | FS_DIRECTORY,
     87 #ifdef HAVE_FS_AUTOFS
     88   AUTOFS_AUTO_FS_FLAGS,
     89 #endif /* HAVE_FS_AUTOFS */
     90 };
     91 
     92 
     93 /****************************************************************************
     94  *** FUNCTIONS                                                             ***
     95  ****************************************************************************/
     96 /*
     97  * Mount a sub-mount
     98  */
     99 static int
    100 amfs_auto_mount(am_node *mp, mntfs *mf)
    101 {
    102   if (mp->am_parent == NULL)
    103     return EINVAL;
    104   /*
    105    * Pseudo-directories are used to provide some structure
    106    * to the automounted directories instead
    107    * of putting them all in the top-level automount directory.
    108    *
    109    * Here, just increment the parent's link count.
    110    */
    111   mp->am_parent->am_fattr.na_nlink++;
    112 
    113   /*
    114    * Info field of . means use parent's info field.
    115    * Historical - not documented.
    116    */
    117   if (mf->mf_info[0] == '.' && mf->mf_info[1] == '\0')
    118     mf->mf_info = strealloc(mf->mf_info, mp->am_parent->am_al->al_mnt->mf_info);
    119 
    120   /*
    121    * Compute prefix:
    122    *
    123    * If there is an option prefix then use that else
    124    * If the parent had a prefix then use that with name
    125    *      of this node appended else
    126    * Use the name of this node.
    127    *
    128    * That means if you want no prefix you must say so
    129    * in the map.
    130    */
    131   if (mf->mf_fo->opt_pref) {
    132     /* allow pref:=null to set a real null prefix */
    133     if (STREQ(mf->mf_fo->opt_pref, "null")) {
    134       mp->am_pref = xstrdup("");
    135     } else {
    136       /*
    137        * the prefix specified as an option
    138        */
    139       mp->am_pref = xstrdup(mf->mf_fo->opt_pref);
    140     }
    141   } else {
    142     /*
    143      * else the parent's prefix
    144      * followed by the name
    145      * followed by /
    146      */
    147     char *ppref = mp->am_parent->am_pref;
    148     if (ppref == 0)
    149       ppref = "";
    150     mp->am_pref = str3cat((char *) NULL, ppref, mp->am_name, "/");
    151   }
    152 
    153 #ifdef HAVE_FS_AUTOFS
    154   if (mf->mf_flags & MFF_IS_AUTOFS) {
    155     char opts[SIZEOF_OPTS];
    156     int error;
    157 
    158     autofs_get_opts(opts, sizeof(opts), mp->am_autofs_fh);
    159 
    160     /* now do the mount */
    161     error = amfs_mount(mp, mf, opts);
    162     if (error) {
    163       errno = error;
    164       plog(XLOG_FATAL, "amfs_auto_mount: amfs_mount failed: %m");
    165       return error;
    166     }
    167   }
    168 #endif /* HAVE_FS_AUTOFS */
    169 
    170   /*
    171    * Attach a map cache
    172    */
    173   amfs_mkcacheref(mf);
    174 
    175   return 0;
    176 }
    177