Am-Utils Cross Reference
am-utils/amd/amfs_program.c

source navigation ]
diff markup ]
identifier search ]
freetext search ]
file search ]
 
Version: 6.0.1 ] [ 6.0.2 ] [ 6.0.3 ] [ 6.0.4 ] [ 6.0.5 ] [ 6.0.6 ] [ 6.0.7 ] [ 6.0.8 ] [ 6.0.9 ] [ 6.0.10 ] [ 6.1 ] [ 6.1.1 ]

  1 /*
  2  * Copyright (c) 1997-2005 Erez Zadok
  3  * Copyright (c) 1989 Jan-Simon Pendry
  4  * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
  5  * Copyright (c) 1989 The Regents of the University of California.
  6  * All rights reserved.
  7  *
  8  * This code is derived from software contributed to Berkeley by
  9  * Jan-Simon Pendry at Imperial College, London.
 10  *
 11  * Redistribution and use in source and binary forms, with or without
 12  * modification, are permitted provided that the following conditions
 13  * are met:
 14  * 1. Redistributions of source code must retain the above copyright
 15  *    notice, this list of conditions and the following disclaimer.
 16  * 2. Redistributions in binary form must reproduce the above copyright
 17  *    notice, this list of conditions and the following disclaimer in the
 18  *    documentation and/or other materials provided with the distribution.
 19  * 3. All advertising materials mentioning features or use of this software
 20  *    must display the following acknowledgment:
 21  *      This product includes software developed by the University of
 22  *      California, Berkeley and its contributors.
 23  * 4. Neither the name of the University nor the names of its contributors
 24  *    may be used to endorse or promote products derived from this software
 25  *    without specific prior written permission.
 26  *
 27  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 28  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 29  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 30  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 31  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 32  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 33  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 34  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 35  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 36  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 37  * SUCH DAMAGE.
 38  *
 39  *
 40  * File: am-utils/amd/amfs_program.c
 41  *
 42  */
 43 
 44 /*
 45  * Program file system
 46  */
 47 
 48 #ifdef HAVE_CONFIG_H
 49 # include <config.h>
 50 #endif /* HAVE_CONFIG_H */
 51 #include <am_defs.h>
 52 #include <amd.h>
 53 
 54 /* forward definitions */
 55 static char *amfs_program_match(am_opts *fo);
 56 static int amfs_program_mount(am_node *am, mntfs *mf);
 57 static int amfs_program_umount(am_node *am, mntfs *mf);
 58 static int amfs_program_init(mntfs *mf);
 59 
 60 /*
 61  * Ops structure
 62  */
 63 am_ops amfs_program_ops =
 64 {
 65   "program",
 66   amfs_program_match,
 67   amfs_program_init,
 68   amfs_program_mount,
 69   amfs_program_umount,
 70   amfs_error_lookup_child,
 71   amfs_error_mount_child,
 72   amfs_error_readdir,
 73   0,                            /* amfs_program_readlink */
 74   0,                            /* amfs_program_mounted */
 75   0,                            /* amfs_program_umounted */
 76   amfs_generic_find_srvr,
 77   0,                            /* amfs_program_get_wchan */
 78   FS_MKMNT | FS_BACKGROUND | FS_AMQINFO,        /* nfs_fs_flags */
 79 #ifdef HAVE_FS_AUTOFS
 80   AUTOFS_PROGRAM_FS_FLAGS,
 81 #endif /* HAVE_FS_AUTOFS */
 82 };
 83 
 84 
 85 /*
 86  * Execute needs a mount and unmount command.
 87  */
 88 static char *
 89 amfs_program_match(am_opts *fo)
 90 {
 91   char *prog;
 92 
 93   if (fo->opt_unmount && fo->opt_umount) {
 94     plog(XLOG_ERROR, "program: cannot specify both unmount and umount options");
 95     return 0;
 96   }
 97   if (!fo->opt_mount) {
 98     plog(XLOG_ERROR, "program: must specify mount command");
 99     return 0;
100   }
101   if (!fo->opt_unmount && !fo->opt_umount) {
102     fo->opt_unmount = str3cat(NULL, UNMOUNT_PROGRAM, " umount ", fo->opt_fs);
103     plog(XLOG_INFO, "program: un/umount not specified; using default \"%s\"",
104          fo->opt_unmount);
105   }
106   prog = strchr(fo->opt_mount, ' ');
107 
108   return strdup(prog ? prog + 1 : fo->opt_mount);
109 }
110 
111 
112 static int
113 amfs_program_init(mntfs *mf)
114 {
115   /* check if already saved value */
116   if (mf->mf_private != NULL)
117     return 0;
118 
119   /* save unmount (or umount) command */
120   if (mf->mf_fo->opt_unmount != NULL)
121     mf->mf_private = (opaque_t) strdup(mf->mf_fo->opt_unmount);
122   else
123     mf->mf_private = (opaque_t) strdup(mf->mf_fo->opt_umount);
124   mf->mf_prfree = (void (*)(opaque_t)) free;
125 
126   return 0;
127 }
128 
129 
130 static int
131 amfs_program_exec(char *info)
132 {
133   char **xivec;
134   int error;
135 
136   /*
137    * Split copy of command info string
138    */
139   info = strdup(info);
140   if (info == 0)
141     return ENOBUFS;
142   xivec = strsplit(info, ' ', '\'');
143 
144   /*
145    * Put stdout to stderr
146    */
147   (void) fclose(stdout);
148   if (!logfp)
149     logfp = stderr;             /* initialize before possible first use */
150   (void) dup(fileno(logfp));
151   if (fileno(logfp) != fileno(stderr)) {
152     (void) fclose(stderr);
153     (void) dup(fileno(logfp));
154   }
155 
156   /*
157    * Try the exec
158    */
159   if (amuDebug(D_FULL)) {
160     char **cp = xivec;
161     plog(XLOG_DEBUG, "executing (un)mount command...");
162     while (*cp) {
163       plog(XLOG_DEBUG, "arg[%ld] = '%s'", (long) (cp - xivec), *cp);
164       cp++;
165     }
166   }
167 
168   if (xivec[0] == 0 || xivec[1] == 0) {
169     errno = EINVAL;
170     plog(XLOG_USER, "1st/2nd args missing to (un)mount program");
171   } else {
172     (void) execv(xivec[0], xivec + 1);
173   }
174 
175   /*
176    * Save error number
177    */
178   error = errno;
179   plog(XLOG_ERROR, "exec failed: %m");
180 
181   /*
182    * Free allocate memory
183    */
184   XFREE(info);
185   XFREE(xivec);
186 
187   /*
188    * Return error
189    */
190   return error;
191 }
192 
193 
194 static int
195 amfs_program_mount(am_node *am, mntfs *mf)
196 {
197   return amfs_program_exec(mf->mf_fo->opt_mount);
198 }
199 
200 
201 static int
202 amfs_program_umount(am_node *am, mntfs *mf)
203 {
204   return amfs_program_exec((char *) mf->mf_private);
205 }
206 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
This page is hosted at the Filesystems and Storage Lab at Stony Brook.