1df930be7Sderaadt /*
2df930be7Sderaadt * Copyright (c) 1989 Jan-Simon Pendry
3df930be7Sderaadt * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
4df930be7Sderaadt * Copyright (c) 1989, 1993
5df930be7Sderaadt * The Regents of the University of California. All rights reserved.
6df930be7Sderaadt *
7df930be7Sderaadt * This code is derived from software contributed to Berkeley by
8df930be7Sderaadt * Jan-Simon Pendry at Imperial College, London.
9df930be7Sderaadt *
10df930be7Sderaadt * Redistribution and use in source and binary forms, with or without
11df930be7Sderaadt * modification, are permitted provided that the following conditions
12df930be7Sderaadt * are met:
13df930be7Sderaadt * 1. Redistributions of source code must retain the above copyright
14df930be7Sderaadt * notice, this list of conditions and the following disclaimer.
15df930be7Sderaadt * 2. Redistributions in binary form must reproduce the above copyright
16df930be7Sderaadt * notice, this list of conditions and the following disclaimer in the
17df930be7Sderaadt * documentation and/or other materials provided with the distribution.
1829295d1cSmillert * 3. Neither the name of the University nor the names of its contributors
19df930be7Sderaadt * may be used to endorse or promote products derived from this software
20df930be7Sderaadt * without specific prior written permission.
21df930be7Sderaadt *
22df930be7Sderaadt * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23df930be7Sderaadt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24df930be7Sderaadt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25df930be7Sderaadt * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26df930be7Sderaadt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27df930be7Sderaadt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28df930be7Sderaadt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29df930be7Sderaadt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30df930be7Sderaadt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31df930be7Sderaadt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32df930be7Sderaadt * SUCH DAMAGE.
33df930be7Sderaadt *
34df930be7Sderaadt * from: @(#)pfs_ops.c 8.1 (Berkeley) 6/6/93
35*26d0c865Sguenther * $Id: pfs_ops.c,v 1.8 2014/10/26 03:28:41 guenther Exp $
36df930be7Sderaadt */
37df930be7Sderaadt
38df930be7Sderaadt #include "am.h"
39df930be7Sderaadt
407f4e61d8Sderaadt #include <unistd.h>
417f4e61d8Sderaadt
42df930be7Sderaadt #ifdef HAS_PFS
43df930be7Sderaadt
44df930be7Sderaadt /*
45df930be7Sderaadt * Program file system
46df930be7Sderaadt */
47df930be7Sderaadt
48df930be7Sderaadt /*
49df930be7Sderaadt * Execute needs a mount and unmount command.
50df930be7Sderaadt */
519ad2d6d5Spvalchev static char *
pfs_match(am_opts * fo)529ad2d6d5Spvalchev pfs_match(am_opts *fo)
53df930be7Sderaadt {
54df930be7Sderaadt char *prog;
559ad2d6d5Spvalchev
56df930be7Sderaadt if (!fo->opt_mount || !fo->opt_unmount) {
57df930be7Sderaadt plog(XLOG_USER, "program: no mount/unmount specified");
58df930be7Sderaadt return 0;
59df930be7Sderaadt }
60df930be7Sderaadt prog = strchr(fo->opt_mount, ' ');
61df930be7Sderaadt return strdup(prog ? prog+1 : fo->opt_mount);
62df930be7Sderaadt }
63df930be7Sderaadt
649ad2d6d5Spvalchev static int
pfs_init(mntfs * mf)659ad2d6d5Spvalchev pfs_init(mntfs *mf)
66df930be7Sderaadt {
67df930be7Sderaadt /*
68df930be7Sderaadt * Save unmount command
69df930be7Sderaadt */
70df930be7Sderaadt if (mf->mf_refc == 1) {
71*26d0c865Sguenther mf->mf_private = strdup(mf->mf_fo->opt_unmount);
72*26d0c865Sguenther mf->mf_prfree = free;
73df930be7Sderaadt }
74df930be7Sderaadt return 0;
75df930be7Sderaadt }
76df930be7Sderaadt
779ad2d6d5Spvalchev static int
pfs_exec(char * info)789ad2d6d5Spvalchev pfs_exec(char *info)
79df930be7Sderaadt {
80df930be7Sderaadt char **xivec;
81df930be7Sderaadt int error;
82df930be7Sderaadt /*
83df930be7Sderaadt * Split copy of command info string
84df930be7Sderaadt */
85df930be7Sderaadt info = strdup(info);
86df930be7Sderaadt if (info == 0)
87df930be7Sderaadt return ENOBUFS;
88df930be7Sderaadt xivec = strsplit(info, ' ', '\'');
89df930be7Sderaadt /*
90df930be7Sderaadt * Put stdout to stderr
91df930be7Sderaadt */
92df930be7Sderaadt (void) fclose(stdout);
93df930be7Sderaadt (void) dup(fileno(logfp));
94df930be7Sderaadt if (fileno(logfp) != fileno(stderr)) {
95df930be7Sderaadt (void) fclose(stderr);
96df930be7Sderaadt (void) dup(fileno(logfp));
97df930be7Sderaadt }
98df930be7Sderaadt /*
99df930be7Sderaadt * Try the exec
100df930be7Sderaadt */
101df930be7Sderaadt #ifdef DEBUG
102df930be7Sderaadt Debug(D_FULL) {
103df930be7Sderaadt char **cp = xivec;
104df930be7Sderaadt plog(XLOG_DEBUG, "executing (un)mount command...");
105df930be7Sderaadt while (*cp) {
106df930be7Sderaadt plog(XLOG_DEBUG, "arg[%d] = '%s'", cp-xivec, *cp);
107df930be7Sderaadt cp++;
108df930be7Sderaadt }
109df930be7Sderaadt }
110df930be7Sderaadt #endif /* DEBUG */
111df930be7Sderaadt if (xivec[0] == 0 || xivec[1] == 0) {
112df930be7Sderaadt errno = EINVAL;
113df930be7Sderaadt plog(XLOG_USER, "1st/2nd args missing to (un)mount program");
114df930be7Sderaadt } else {
115df930be7Sderaadt (void) execv(xivec[0], xivec+1);
116df930be7Sderaadt }
117df930be7Sderaadt /*
118df930be7Sderaadt * Save error number
119df930be7Sderaadt */
120df930be7Sderaadt error = errno;
121df930be7Sderaadt plog(XLOG_ERROR, "exec failed: %m");
122df930be7Sderaadt
123df930be7Sderaadt /*
124df930be7Sderaadt * Free allocate memory
125df930be7Sderaadt */
126819011edSguenther free(info);
127819011edSguenther free(xivec);
128df930be7Sderaadt /*
129df930be7Sderaadt * Return error
130df930be7Sderaadt */
131df930be7Sderaadt return error;
132df930be7Sderaadt }
133df930be7Sderaadt
1349ad2d6d5Spvalchev static int
pfs_fmount(mntfs * mf)1359ad2d6d5Spvalchev pfs_fmount(mntfs *mf)
136df930be7Sderaadt {
137df930be7Sderaadt return pfs_exec(mf->mf_fo->opt_mount);
138df930be7Sderaadt }
139df930be7Sderaadt
1409ad2d6d5Spvalchev static int
pfs_fumount(mntfs * mf)1419ad2d6d5Spvalchev pfs_fumount(mntfs *mf)
142df930be7Sderaadt {
143df930be7Sderaadt return pfs_exec((char *) mf->mf_private);
144df930be7Sderaadt }
145df930be7Sderaadt
146df930be7Sderaadt /*
147df930be7Sderaadt * Ops structure
148df930be7Sderaadt */
149df930be7Sderaadt am_ops pfs_ops = {
150df930be7Sderaadt "program",
151df930be7Sderaadt pfs_match,
152df930be7Sderaadt pfs_init,
153df930be7Sderaadt auto_fmount,
154df930be7Sderaadt pfs_fmount,
155df930be7Sderaadt auto_fumount,
156df930be7Sderaadt pfs_fumount,
157df930be7Sderaadt efs_lookuppn,
158df930be7Sderaadt efs_readdir,
159df930be7Sderaadt 0, /* pfs_readlink */
160df930be7Sderaadt 0, /* pfs_mounted */
161df930be7Sderaadt 0, /* pfs_umounted */
162df930be7Sderaadt find_afs_srvr,
163df930be7Sderaadt FS_BACKGROUND|FS_AMQINFO
164df930be7Sderaadt };
165df930be7Sderaadt
166df930be7Sderaadt #endif /* HAS_PFS */
167