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

  1. /*
  2.  * $Id: sfs_ops.c,v 5.1.1.1 90/01/11 17:20:21 jsp Exp Locker: jsp $
  3.  *
  4.  * Copyright (c) 1990 Jan-Simon Pendry
  5.  * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
  6.  * Copyright (c) 1990 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_SFS
  31.  
  32. /*
  33.  * Symbol-link file system
  34.  */
  35.  
  36. /*
  37.  * SFS needs a link.
  38.  */
  39. static int sfs_match(fo)
  40. am_opts *fo;
  41. {
  42.     if (!fo->opt_fs) {
  43.         plog(XLOG_USER, "link: no fs specified");
  44.         return 0;
  45.     }
  46.  
  47.     /*
  48.      * Bug report (14/12/89) from Jay Plett <jay@princeton.edu>
  49.      * If an automount point has the same name as an existing
  50.      * link type mount Amd hits a race condition and either hangs
  51.      * or causes a symlink loop.
  52.      *
  53.      * If fs begins with a '/' change the opt_fs & opt_sublink
  54.      * fields so that the fs option doesn't end up pointing at
  55.      * an existing symlink.
  56.      *
  57.      * If sublink is nil then set sublink to fs
  58.      * else set sublink to fs / sublink
  59.      *
  60.      * Finally set fs to ".".
  61.      */
  62.     if (*fo->opt_fs == '/') {
  63.         char *fullpath;
  64.         char *link = fo->opt_sublink;
  65.         if (link) {
  66.             if (*link == '/')
  67.                 fullpath = strdup(link);
  68.             else
  69.                 fullpath = str3cat((char *)0, fo->opt_fs, "/", link);
  70.         } else {
  71.             fullpath = strdup(fo->opt_fs);
  72.         }
  73.  
  74.         if (fo->opt_sublink)
  75.             free(fo->opt_sublink);
  76.         fo->opt_sublink = fullpath;
  77.         free(fo->opt_fs);
  78.         fo->opt_fs = strdup(".");
  79.     }
  80.  
  81.     fo->fs_mtab = strealloc(fo->fs_mtab, fo->opt_fs);
  82.  
  83.     return 1;
  84. }
  85.  
  86. /*ARGUSED*/
  87. static int sfs_mount(mp)
  88. am_node *mp;
  89. {
  90.     /*
  91.      * Wow - this is hard to implement!
  92.      */
  93.  
  94.     return 0;
  95. }
  96.  
  97. /*ARGUSED*/
  98. static int sfs_umount(mp)
  99. am_node *mp;
  100. {
  101.     return 0;
  102. }
  103.  
  104. /*
  105.  * Ops structure
  106.  */
  107. am_ops sfs_ops = {
  108.     "link",
  109.     sfs_match,
  110.     0, /* sfs_init */
  111.     sfs_mount,
  112.     sfs_umount,
  113.     efs_lookuppn,
  114.     efs_readdir,
  115.     0, /* sfs_readlink */
  116.     0, /* sfs_mounted */
  117.     0, /* sfs_umounted */
  118.     find_afs_srvr,
  119.     FS_UBACKGROUND,
  120.     &afs_srvr_list
  121. };
  122.  
  123. #endif
  124.