home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume21 / amd / part03 / pfs_ops.c < prev    next >
C/C++ Source or Header  |  1990-04-11  |  3KB  |  160 lines

  1. /*
  2.  * $Id: pfs_ops.c,v 5.1.1.1 90/01/11 17:17:20 jsp Exp Locker: jsp $
  3.  *
  4.  * Copyright (c) 1989 Jan-Simon Pendry
  5.  * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
  6.  * Copyright (c) 1989 The Regents of the University of California.
  7.  * All rights reserved.
  8.  *
  9.  * This code is derived from software contributed to Berkeley by
  10.  * Jan-Simon Pendry at Imperial College, London.
  11.  *
  12.  * Redistribution and use in source and binary forms are permitted
  13.  * provided that the above copyright notice and this paragraph are
  14.  * duplicated in all such forms and that any documentation,
  15.  * advertising materials, and other materials related to such
  16.  * distribution and use acknowledge that the software was developed
  17.  * by Imperial College of Science, Technology and Medicine, London, UK.
  18.  * The names of the College and University may not be used to endorse
  19.  * or promote products derived from this software without specific
  20.  * prior written permission.
  21.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  22.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  23.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  24.  *
  25.  *    %W% (Berkeley) %G%
  26.  */
  27.  
  28. #include "am.h"
  29.  
  30. #ifdef HAS_PFS
  31.  
  32. /*
  33.  * Program file system
  34.  */
  35.  
  36. /*
  37.  * Execute needs a mount and unmount command.
  38.  */
  39. static int pfs_match(fo)
  40. am_opts *fo;
  41. {
  42.     char *prog;
  43.     if (!fo->opt_mount || !fo->opt_unmount) {
  44.         plog(XLOG_USER, "program: no mount/unmount specified");
  45.         return FALSE;
  46.     }
  47.     prog = strchr(fo->opt_mount, ' ');
  48.     if (fo->fs_mtab = strealloc(fo->fs_mtab, prog ? prog+1 : fo->opt_mount))
  49.         return TRUE;
  50.     return FALSE;
  51. }
  52.  
  53. static int pfs_init(mf)
  54. mntfs *mf;
  55. {
  56.     /*
  57.      * Save unmount command
  58.      */
  59.     if (mf->mf_refc == 1) {
  60.         mf->mf_private = (voidp) strdup(mf->mf_fo->opt_unmount);
  61.         mf->mf_prfree = free;
  62.     }
  63.     return 0;
  64. }
  65.  
  66. static int pfs_exec(info)
  67. char *info;
  68. {
  69.     char **xivec;
  70.     int error;
  71.     /*
  72.      * Split copy of command info string
  73.      */
  74.     info = strdup(info);
  75.     if (info == 0)
  76.         return ENOBUFS;
  77.     xivec = strsplit(info, '\'');
  78.     /*
  79.      * Put stdout to stderr
  80.      */
  81.     (void) fclose(stdout);
  82.     (void) dup(fileno(logfp));
  83.     if (fileno(logfp) != fileno(stderr)) {
  84.         (void) fclose(stderr);
  85.         (void) dup(fileno(logfp));
  86.     }
  87.     /*
  88.      * Try the exec
  89.      */
  90. #ifdef DEBUG
  91.     Debug(D_FULL) {
  92.         char **cp = xivec;
  93.         plog(XLOG_DEBUG, "executing (un)mount command...");
  94.         while (*cp) {
  95.               plog(XLOG_DEBUG, "arg[%d] = '%s'", cp-xivec, *cp);
  96.             cp++;
  97.         }
  98.     }
  99. #endif
  100.     if (xivec[0] == 0 || xivec[1] == 0) {
  101.         errno = EINVAL;
  102.         plog(XLOG_USER, "1st/2nd args missing to (un)mount program");
  103.     } else {
  104.         (void) execv(xivec[0], xivec+1);
  105.     }
  106.     /*
  107.      * Save error number
  108.      */
  109.     error = errno;
  110.     plog(XLOG_ERROR, "exec failed: %m");
  111.  
  112.     /*
  113.      * Free allocate memory
  114.      */
  115.     free(info);
  116.     free(xivec);
  117.     /*
  118.      * Return error
  119.      */
  120.     return error;
  121. }
  122.  
  123. /*ARGSUSED*/
  124. static int pfs_mount(mp)
  125. am_node *mp;
  126. {
  127.     mntfs *mf = mp->am_mnt;
  128.  
  129.     return pfs_exec(mf->mf_fo->opt_mount);
  130. }
  131.  
  132. static int pfs_umount(mp)
  133. am_node *mp;
  134. {
  135.     mntfs *mf = mp->am_mnt;
  136.  
  137.     return pfs_exec((char *) mf->mf_private);
  138. }
  139.  
  140. /*
  141.  * Ops structure
  142.  */
  143. am_ops pfs_ops = {
  144.     "program",
  145.     pfs_match,
  146.     pfs_init,
  147.     pfs_mount,
  148.     pfs_umount,
  149.     efs_lookuppn,
  150.     efs_readdir,
  151.     0, /* pfs_readlink */
  152.     0, /* pfs_mounted */
  153.     0, /* pfs_umounted */
  154.     find_afs_srvr,
  155.     FS_BACKGROUND|FS_AMQINFO,
  156.     &afs_srvr_list
  157. };
  158.  
  159. #endif
  160.