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

  1. /*
  2.  * $Id: umount_fs.c,v 5.1.1.2 90/01/11 17:22:48 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 NEED_UMOUNT_BSD
  31.  
  32. #include <sys/mount.h>        /* For MNT_NOFORCE */
  33.  
  34. int umount_fs(fs_name)
  35. char *fs_name;
  36. {
  37.     int error;
  38.  
  39. eintr:
  40.     error = unmount(fs_name, MNT_NOFORCE);
  41.     if (error < 0)
  42.         error = errno;
  43.  
  44.     switch (error) {
  45.     case EINVAL:
  46.     case ENOTBLK:
  47.         plog(XLOG_WARNING, "unmount: %s is not mounted", fs_name);
  48.         error = 0;    /* Not really an error */
  49.         break;
  50.  
  51.     case ENOENT:
  52.         plog(XLOG_ERROR, "mount point %s: %m", fs_name);
  53.         break;
  54.  
  55.     case EINTR:
  56. #ifdef DEBUG
  57.         dlog("%s: unmount: %m", fs_name);
  58. #endif
  59.         goto eintr;
  60.  
  61. #ifdef DEBUG
  62.     default:
  63.         dlog("%s: unmount: %m", fs_name);
  64.         break;
  65. #endif
  66.     }
  67.  
  68.     return error;
  69. }
  70.  
  71. #endif /* NEED_UMOUNT_BSD */
  72.  
  73. #ifdef NEED_UMOUNT_FS
  74.  
  75. int umount_fs(fs_name)
  76. char *fs_name;
  77. {
  78.     mntlist *mlist, *mp, *mp_save = 0;
  79.     int error = 0;
  80.  
  81.     mp = mlist = read_mtab(fs_name);
  82.  
  83.     /*
  84.      * Search the mount table looking for
  85.      * the correct (ie last) matching entry
  86.      */
  87.     while (mp) {
  88.         if (strcmp(mp->mnt->mnt_fsname, fs_name) == 0 ||
  89.                 strcmp(mp->mnt->mnt_dir, fs_name) == 0)
  90.             mp_save = mp;
  91.         mp = mp->mnext;
  92.     }
  93.  
  94.     if (mp_save) {
  95. #ifdef DEBUG
  96.         dlog("Trying unmount(%s)", mp_save->mnt->mnt_dir);
  97. #endif
  98.         if (UNMOUNT_TRAP(mp_save->mnt) < 0) {
  99.             switch (error = errno) {
  100.             case EINVAL:
  101.             case ENOTBLK:
  102.                 plog(XLOG_WARNING, "unmount: %s is not mounted", mp_save->mnt->mnt_dir);
  103.                 error = 0;    /* Not really an error */
  104.                 break;
  105.  
  106.             case ENOENT:
  107.                 plog(XLOG_ERROR, "mount point %s: %m", mp_save->mnt->mnt_dir);
  108.                 break;
  109.  
  110.             default:
  111. #ifdef DEBUG
  112.                 dlog("%s: unmount: %m", mp_save->mnt->mnt_dir);
  113. #endif
  114.                 break;
  115.             }
  116.         }
  117.  
  118. #ifdef UPDATE_MTAB
  119.         if (!error) {
  120.             mnt_free(mp_save->mnt);
  121.             mp_save->mnt = 0;
  122.  
  123.             rewrite_mtab(mlist);
  124.         }
  125. #endif
  126.     } else {
  127.         plog(XLOG_ERROR, "Couldn't find how to unmount %s", fs_name);
  128.         /*
  129.          * Assume it is already unmounted
  130.          */
  131.         error = 0;
  132.     }
  133.  
  134.     free_mntlist(mlist);
  135.  
  136.     return error;
  137. }
  138.  
  139. #endif /* NEED_UMOUNT_FS */
  140.