home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
unix
/
volume21
/
amd
/
part03
/
pfs_ops.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-04-11
|
3KB
|
160 lines
/*
* $Id: pfs_ops.c,v 5.1.1.1 90/01/11 17:17:20 jsp Exp Locker: jsp $
*
* Copyright (c) 1989 Jan-Simon Pendry
* Copyright (c) 1989 Imperial College of Science, Technology & Medicine
* Copyright (c) 1989 The Regents of the University of California.
* All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Jan-Simon Pendry at Imperial College, London.
*
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by Imperial College of Science, Technology and Medicine, London, UK.
* The names of the College and University may not be used to endorse
* or promote products derived from this software without specific
* prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* %W% (Berkeley) %G%
*/
#include "am.h"
#ifdef HAS_PFS
/*
* Program file system
*/
/*
* Execute needs a mount and unmount command.
*/
static int pfs_match(fo)
am_opts *fo;
{
char *prog;
if (!fo->opt_mount || !fo->opt_unmount) {
plog(XLOG_USER, "program: no mount/unmount specified");
return FALSE;
}
prog = strchr(fo->opt_mount, ' ');
if (fo->fs_mtab = strealloc(fo->fs_mtab, prog ? prog+1 : fo->opt_mount))
return TRUE;
return FALSE;
}
static int pfs_init(mf)
mntfs *mf;
{
/*
* Save unmount command
*/
if (mf->mf_refc == 1) {
mf->mf_private = (voidp) strdup(mf->mf_fo->opt_unmount);
mf->mf_prfree = free;
}
return 0;
}
static int pfs_exec(info)
char *info;
{
char **xivec;
int error;
/*
* Split copy of command info string
*/
info = strdup(info);
if (info == 0)
return ENOBUFS;
xivec = strsplit(info, '\'');
/*
* Put stdout to stderr
*/
(void) fclose(stdout);
(void) dup(fileno(logfp));
if (fileno(logfp) != fileno(stderr)) {
(void) fclose(stderr);
(void) dup(fileno(logfp));
}
/*
* Try the exec
*/
#ifdef DEBUG
Debug(D_FULL) {
char **cp = xivec;
plog(XLOG_DEBUG, "executing (un)mount command...");
while (*cp) {
plog(XLOG_DEBUG, "arg[%d] = '%s'", cp-xivec, *cp);
cp++;
}
}
#endif
if (xivec[0] == 0 || xivec[1] == 0) {
errno = EINVAL;
plog(XLOG_USER, "1st/2nd args missing to (un)mount program");
} else {
(void) execv(xivec[0], xivec+1);
}
/*
* Save error number
*/
error = errno;
plog(XLOG_ERROR, "exec failed: %m");
/*
* Free allocate memory
*/
free(info);
free(xivec);
/*
* Return error
*/
return error;
}
/*ARGSUSED*/
static int pfs_mount(mp)
am_node *mp;
{
mntfs *mf = mp->am_mnt;
return pfs_exec(mf->mf_fo->opt_mount);
}
static int pfs_umount(mp)
am_node *mp;
{
mntfs *mf = mp->am_mnt;
return pfs_exec((char *) mf->mf_private);
}
/*
* Ops structure
*/
am_ops pfs_ops = {
"program",
pfs_match,
pfs_init,
pfs_mount,
pfs_umount,
efs_lookuppn,
efs_readdir,
0, /* pfs_readlink */
0, /* pfs_mounted */
0, /* pfs_umounted */
find_afs_srvr,
FS_BACKGROUND|FS_AMQINFO,
&afs_srvr_list
};
#endif