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

  1. /*
  2.  * $Id: srvr_afs.c,v 5.1 89/11/17 18:22:16 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. /*
  29.  * Automount FS server ("localhost") modeling
  30.  */
  31.  
  32. #include "am.h"
  33.  
  34. extern qelem afs_srvr_list;
  35. qelem afs_srvr_list = { &afs_srvr_list, &afs_srvr_list };
  36.  
  37. static fserver *localhost;
  38.  
  39. /*
  40.  * Find an nfs server for the local host
  41.  */
  42. fserver *find_afs_srvr P((mntfs *));
  43. fserver *find_afs_srvr(mf)
  44. mntfs *mf;
  45. {
  46.     fserver *fs = localhost;
  47.  
  48.     if (!fs) {
  49.         fs = ALLOC(fserver);
  50.         fs->fs_refc = 0;
  51.         fs->fs_host = strdup("localhost");
  52.         fs->fs_ip = 0;
  53.         fs->fs_cid = 0;
  54.         fs->fs_pinger = 0;
  55.         fs->fs_flags = FSF_VALID;
  56.         fs->fs_private = 0;
  57.         fs->fs_prfree = 0;
  58.  
  59.         ins_que(&fs->fs_q, &afs_srvr_list);
  60.         localhost = fs;
  61.     }
  62.  
  63.     fs->fs_refc++;
  64.  
  65.     return fs;
  66. }
  67.  
  68. /*------------------------------------------------------------------*/
  69.         /* Generic routines follow */
  70.  
  71. /*
  72.  * Wakeup anything waiting for this server
  73.  */
  74. void wakeup_srvr P((fserver *fs));
  75. void wakeup_srvr(fs)
  76. fserver *fs;
  77. {
  78.     fs->fs_flags &= ~FSF_WANT;
  79.     wakeup((voidp) fs);
  80. }
  81.  
  82. /*
  83.  * Called when final ttl of server has expired
  84.  */
  85. static void timeout_srvr P((fserver *fs));
  86. static void timeout_srvr(fs)
  87. fserver *fs;
  88. {
  89.     /*
  90.      * If the reference count is still zero then
  91.      * we are free to remove this node
  92.      */
  93.     if (fs->fs_refc == 0) {
  94. #ifdef DEBUG
  95.         dlog("Deleting file server %s", fs->fs_host);
  96. #endif
  97.         if (fs->fs_flags & FSF_WANT)
  98.             wakeup_srvr(fs);
  99.  
  100.         /*
  101.          * Remove from queue.
  102.          */
  103.         rem_que(&fs->fs_q);
  104.         /*
  105.          * (Possibly) call the private free routine.
  106.          */
  107.         if (fs->fs_private && fs->fs_prfree)
  108.             (*fs->fs_prfree)(fs->fs_private);
  109.  
  110.         /*
  111.          * Free the net address
  112.          */
  113.         if (fs->fs_ip)
  114.             free((voidp) fs->fs_ip);
  115.  
  116.         /*
  117.          * Free the host name.
  118.          */
  119.         free((voidp) fs->fs_host);
  120.  
  121.         /*
  122.          * Discard the fserver object.
  123.          */
  124.         free((voidp) fs);
  125.     }
  126. }
  127.  
  128. /*
  129.  * Free a file server
  130.  */
  131. void free_srvr P((fserver *fs));
  132. void free_srvr(fs)
  133. fserver *fs;
  134. {
  135.     if (--fs->fs_refc == 0) {
  136.         /*
  137.          * The reference count is now zero,
  138.          * so arrange for this node to be
  139.          * removed in AM_TTL seconds if no
  140.          * other mntfs is referencing it.
  141.          */
  142.         int ttl = (fs->fs_flags & (FSF_DOWN|FSF_ERROR)) ? 19 : AM_TTL;
  143. #ifdef DEBUG
  144.         dlog("Last hard reference to file server %s - will timeout in %ds", fs->fs_host, ttl);
  145. #endif
  146.         if (fs->fs_cid) {
  147.             untimeout(fs->fs_cid);
  148.             /*
  149.              * Turn off pinging - XXX
  150.              */
  151.             fs->fs_flags &= ~FSF_PINGING;
  152.         }
  153.         /*
  154.          * Keep structure lying around for a while
  155.          */
  156.         fs->fs_cid = timeout(ttl, timeout_srvr, (voidp) fs);
  157.         /*
  158.          * Mark the fileserver down and invalid again
  159.          */
  160.         fs->fs_flags &= ~FSF_VALID;
  161.         fs->fs_flags |= FSF_DOWN;
  162.     }
  163. }
  164.  
  165. /*
  166.  * Make a duplicate fserver reference
  167.  */
  168. fserver *dup_srvr P((fserver *fs));
  169. fserver *dup_srvr(fs)
  170. fserver *fs;
  171. {
  172.     fs->fs_refc++;
  173.     return fs;
  174. }
  175.