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