xref: /original-bsd/usr.sbin/amd/amd/pfs_ops.c (revision 4092c5cc)
1398a5aebSmckusick /*
2398a5aebSmckusick  * Copyright (c) 1989 Jan-Simon Pendry
3398a5aebSmckusick  * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
4*4092c5ccSbostic  * Copyright (c) 1989, 1993
5*4092c5ccSbostic  *	The Regents of the University of California.  All rights reserved.
6398a5aebSmckusick  *
7398a5aebSmckusick  * This code is derived from software contributed to Berkeley by
8398a5aebSmckusick  * Jan-Simon Pendry at Imperial College, London.
9398a5aebSmckusick  *
10398a5aebSmckusick  * %sccs.include.redist.c%
11398a5aebSmckusick  *
12*4092c5ccSbostic  *	@(#)pfs_ops.c	8.1 (Berkeley) 06/06/93
13c626267eSpendry  *
14cc0207dcSpendry  * $Id: pfs_ops.c,v 5.2.2.1 1992/02/09 15:08:56 jsp beta $
15c626267eSpendry  *
16398a5aebSmckusick  */
17398a5aebSmckusick 
18398a5aebSmckusick #include "am.h"
19398a5aebSmckusick 
20398a5aebSmckusick #ifdef HAS_PFS
21398a5aebSmckusick 
22398a5aebSmckusick /*
23398a5aebSmckusick  * Program file system
24398a5aebSmckusick  */
25398a5aebSmckusick 
26398a5aebSmckusick /*
27398a5aebSmckusick  * Execute needs a mount and unmount command.
28398a5aebSmckusick  */
pfs_match(fo)298a89c22cSpendry static char *pfs_match(fo)
30398a5aebSmckusick am_opts *fo;
31398a5aebSmckusick {
32398a5aebSmckusick 	char *prog;
33398a5aebSmckusick 	if (!fo->opt_mount || !fo->opt_unmount) {
34398a5aebSmckusick 		plog(XLOG_USER, "program: no mount/unmount specified");
358a89c22cSpendry 		return 0;
36398a5aebSmckusick 	}
37398a5aebSmckusick 	prog = strchr(fo->opt_mount, ' ');
388a89c22cSpendry 	return strdup(prog ? prog+1 : fo->opt_mount);
39398a5aebSmckusick }
40398a5aebSmckusick 
pfs_init(mf)41398a5aebSmckusick static int pfs_init(mf)
42398a5aebSmckusick mntfs *mf;
43398a5aebSmckusick {
44398a5aebSmckusick 	/*
45398a5aebSmckusick 	 * Save unmount command
46398a5aebSmckusick 	 */
47398a5aebSmckusick 	if (mf->mf_refc == 1) {
48398a5aebSmckusick 		mf->mf_private = (voidp) strdup(mf->mf_fo->opt_unmount);
49398a5aebSmckusick 		mf->mf_prfree = (void (*) ()) free;
50398a5aebSmckusick 	}
51398a5aebSmckusick 	return 0;
52398a5aebSmckusick }
53398a5aebSmckusick 
pfs_exec(info)54398a5aebSmckusick static int pfs_exec(info)
55398a5aebSmckusick char *info;
56398a5aebSmckusick {
57398a5aebSmckusick 	char **xivec;
58398a5aebSmckusick 	int error;
59398a5aebSmckusick 	/*
60398a5aebSmckusick 	 * Split copy of command info string
61398a5aebSmckusick 	 */
62398a5aebSmckusick 	info = strdup(info);
63398a5aebSmckusick 	if (info == 0)
64398a5aebSmckusick 		return ENOBUFS;
658a89c22cSpendry 	xivec = strsplit(info, ' ', '\'');
66398a5aebSmckusick 	/*
67398a5aebSmckusick 	 * Put stdout to stderr
68398a5aebSmckusick 	 */
69398a5aebSmckusick 	(void) fclose(stdout);
70398a5aebSmckusick 	(void) dup(fileno(logfp));
71398a5aebSmckusick 	if (fileno(logfp) != fileno(stderr)) {
72398a5aebSmckusick 		(void) fclose(stderr);
73398a5aebSmckusick 		(void) dup(fileno(logfp));
74398a5aebSmckusick 	}
75398a5aebSmckusick 	/*
76398a5aebSmckusick 	 * Try the exec
77398a5aebSmckusick 	 */
78398a5aebSmckusick #ifdef DEBUG
79398a5aebSmckusick 	Debug(D_FULL) {
80398a5aebSmckusick 		char **cp = xivec;
81398a5aebSmckusick 		plog(XLOG_DEBUG, "executing (un)mount command...");
82398a5aebSmckusick 		while (*cp) {
83398a5aebSmckusick 	  		plog(XLOG_DEBUG, "arg[%d] = '%s'", cp-xivec, *cp);
84398a5aebSmckusick 			cp++;
85398a5aebSmckusick 		}
86398a5aebSmckusick 	}
87398a5aebSmckusick #endif /* DEBUG */
88398a5aebSmckusick 	if (xivec[0] == 0 || xivec[1] == 0) {
89398a5aebSmckusick 		errno = EINVAL;
90398a5aebSmckusick 		plog(XLOG_USER, "1st/2nd args missing to (un)mount program");
91398a5aebSmckusick 	} else {
92398a5aebSmckusick 		(void) execv(xivec[0], xivec+1);
93398a5aebSmckusick 	}
94398a5aebSmckusick 	/*
95398a5aebSmckusick 	 * Save error number
96398a5aebSmckusick 	 */
97398a5aebSmckusick 	error = errno;
98398a5aebSmckusick 	plog(XLOG_ERROR, "exec failed: %m");
99398a5aebSmckusick 
100398a5aebSmckusick 	/*
101398a5aebSmckusick 	 * Free allocate memory
102398a5aebSmckusick 	 */
1038a89c22cSpendry 	free((voidp) info);
1048a89c22cSpendry 	free((voidp) xivec);
105398a5aebSmckusick 	/*
106398a5aebSmckusick 	 * Return error
107398a5aebSmckusick 	 */
108398a5aebSmckusick 	return error;
109398a5aebSmckusick }
110398a5aebSmckusick 
pfs_fmount(mf)1118a89c22cSpendry static int pfs_fmount(mf)
1128a89c22cSpendry mntfs *mf;
113398a5aebSmckusick {
114398a5aebSmckusick 	return pfs_exec(mf->mf_fo->opt_mount);
115398a5aebSmckusick }
116398a5aebSmckusick 
pfs_fumount(mf)1178a89c22cSpendry static int pfs_fumount(mf)
1188a89c22cSpendry mntfs *mf;
119398a5aebSmckusick {
120398a5aebSmckusick 	return pfs_exec((char *) mf->mf_private);
121398a5aebSmckusick }
122398a5aebSmckusick 
123398a5aebSmckusick /*
124398a5aebSmckusick  * Ops structure
125398a5aebSmckusick  */
126398a5aebSmckusick am_ops pfs_ops = {
127398a5aebSmckusick 	"program",
128398a5aebSmckusick 	pfs_match,
129398a5aebSmckusick 	pfs_init,
1308a89c22cSpendry 	auto_fmount,
1318a89c22cSpendry 	pfs_fmount,
1328a89c22cSpendry 	auto_fumount,
1338a89c22cSpendry 	pfs_fumount,
134398a5aebSmckusick 	efs_lookuppn,
135398a5aebSmckusick 	efs_readdir,
136398a5aebSmckusick 	0, /* pfs_readlink */
137398a5aebSmckusick 	0, /* pfs_mounted */
138398a5aebSmckusick 	0, /* pfs_umounted */
139398a5aebSmckusick 	find_afs_srvr,
140398a5aebSmckusick 	FS_BACKGROUND|FS_AMQINFO
141398a5aebSmckusick };
142398a5aebSmckusick 
143398a5aebSmckusick #endif /* HAS_PFS */
144