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

  1. /*
  2.  * $Id: am_ops.c,v 5.1.1.1 89/11/28 17:39:32 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. static am_ops *vops[] = {
  31. #ifdef HAS_UFS
  32.     &ufs_ops,
  33. #endif
  34. #ifdef HAS_NFS
  35.     &nfs_ops,
  36. #endif
  37. #ifdef HAS_SFS
  38.     &sfs_ops,
  39. #endif
  40. #ifdef HAS_LOFS
  41.     &lofs_ops,
  42. #endif
  43. #ifdef HAS_PFS
  44.     &pfs_ops,
  45. #endif
  46.     &afs_ops,    /* These three should be last ... */
  47.     &dfs_ops,    /* ... */
  48.     &efs_ops,    /* ... in the order afs; dfs; efs */
  49.     0
  50. };
  51.  
  52. #ifdef SUNOS4_COMPAT
  53. /*
  54.  * Crack a SunOS4-style host:fs:sub-link line
  55.  * Construct an amd-style line and call the
  56.  * normal amd matcher.
  57.  */
  58. am_ops *sunos4_match(fo, key, g_key, path, keym, map)
  59. am_opts *fo;
  60. char *key;
  61. char *g_key;
  62. char *path;
  63. char *keym;
  64. char *map;
  65. {
  66.     char *host = key;
  67.     char *fs = strchr(host, ':');
  68.     char *sublink = fs ? strchr(fs+1, ':') : 0;
  69.     char keybuf[MAXPATHLEN];
  70.  
  71.     sprintf(keybuf, "type:=nfs;rhost:=%s;rfs:=%s;sublink:=%s;opts:=%s", host,
  72.         fs ? fs+1 : "",
  73.         sublink ? sublink+1  : "",
  74.         g_key);
  75.     return ops_match(fo, keybuf, "", path, keym, map);
  76. }
  77. #endif /* SUNOS4_COMPAT */
  78.  
  79. am_ops *ops_match(fo, key, g_key, path, keym, map)
  80. am_opts *fo;
  81. char *key;
  82. char *g_key;
  83. char *path;
  84. char *keym;
  85. char *map;
  86. {
  87.     am_ops **vp;
  88.     am_ops *rop = 0;
  89.  
  90.     /*
  91.      * First crack the global opts and the local opts
  92.      */
  93.     if (!eval_fs_opts(fo, key, g_key, path, keym, map)) {
  94.         rop = &efs_ops;
  95.     } else if (fo->opt_type == 0) {
  96.         plog(XLOG_USER, "No fs type specified (somewhere!)");
  97.         rop = &efs_ops;
  98.     } else {
  99.         /*
  100.          * Next find the correct filesystem type
  101.          */
  102.         for (vp = vops; rop = *vp; vp++)
  103.             if (strcmp(rop->fs_type, fo->opt_type) == 0)
  104.                 break;
  105.  
  106.         if (!rop) {
  107.             plog(XLOG_USER, "fs type \"%s\" not recognised", fo->opt_type);
  108.             rop = &efs_ops;
  109.         }
  110.     }
  111.  
  112.     /*
  113.      * Make sure we have a default mount option.
  114.      * Otherwise skip past any leading '-'.
  115.      */
  116.     if (fo->opt_opts == 0)
  117.         fo->opt_opts = "rw,defaults";
  118.     else if (*fo->opt_opts == '-')
  119.         fo->opt_opts++;
  120.  
  121.     /*
  122.      * Check the filesystem is happy
  123.      */
  124.     if ((*rop->fs_match)(fo))
  125.         return rop;
  126.  
  127.     /*
  128.      * Return error file system
  129.      */
  130.     (void) (*efs_ops.fs_match)(fo);
  131.     return &efs_ops;
  132. }
  133.