xref: /openbsd-src/usr.sbin/amd/amd/pfs_ops.c (revision 26d0c865b2e28f6e7d4c71090534c37cab976ea0)
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