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

  1. /*
  2.  * $Id: mount_fs.c,v 5.1.1.2 90/01/11 17:10:47 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. #ifdef NFS_3
  30. typedef nfs_fh fhandle_t;
  31. #endif
  32. #include <sys/mount.h>
  33.  
  34. /*
  35.  * System Vr4 / SunOS 4.1 compatibility
  36.  * - put dev= in the options list
  37.  *
  38.  * From: Brent Callaghan <brent@eng.sun.com>
  39.  */
  40. #define    MNTINFO_DEV    "dev"
  41. #include <sys/stat.h>
  42.  
  43. int compute_mount_flags(mnt)
  44. struct mntent *mnt;
  45. {
  46.     int flags;
  47. #ifdef NFS_4
  48.     flags = M_NEWTYPE;
  49. #else
  50.     flags = 0;
  51. #endif
  52.  
  53.     /*
  54.      * Crack basic mount options
  55.      */
  56.     flags |= hasmntopt(mnt, "ro") ? M_RDONLY : 0;
  57. #ifdef M_CACHE
  58.     flags |= hasmntopt(mnt, "nocache") ? M_NOCACHE : 0;
  59. #endif
  60. #ifdef M_GRPID
  61.     flags |= hasmntopt(mnt, "grpid") ? M_GRPID : 0;
  62. #endif
  63. #ifdef M_MULTI
  64.     flags |= hasmntopt(mnt, "multi") ? M_MULTI : 0;
  65. #endif
  66. #ifdef M_NODEV
  67.     flags |= hasmntopt(mnt, "nodev") ? M_NODEV : 0;
  68. #endif
  69. #ifdef M_NOEXEC
  70.     flags |= hasmntopt(mnt, "noexec") ? M_NOEXEC : 0;
  71. #endif
  72. #ifdef M_NOSUB
  73.     flags |= hasmntopt(mnt, "nosub") ? M_NOSUB : 0;
  74. #endif
  75. #ifdef hpux
  76. /* HP-UX has an annoying feature of printing error msgs on /dev/console */
  77. #undef M_NOSUID
  78. #endif
  79. #ifdef M_NOSUID
  80.     flags |= hasmntopt(mnt, "nosuid") ? M_NOSUID : 0;
  81. #endif
  82. #ifdef M_SYNC
  83.     flags |= hasmntopt(mnt, "sync") ? M_SYNC : 0;
  84. #endif
  85.  
  86.     return flags;
  87. }
  88.  
  89. int mount_fs(mnt, flags, mnt_data, retry, type)
  90. struct mntent *mnt;
  91. int flags;
  92. caddr_t mnt_data;
  93. int retry;
  94. MTYPE_TYPE type;
  95. {
  96.     int error = 0;
  97.     int automount = 0;
  98. #ifdef MNTINFO_DEV
  99.     struct stat stb;
  100.     char *xopts = 0;
  101. #endif
  102.  
  103. #ifdef DEBUG
  104. #ifdef NFS_4
  105.     dlog("%s fstype %s (%s) flags %#x (%s)",
  106.         mnt->mnt_dir, type, mnt->mnt_type, flags, mnt->mnt_opts);
  107. #else
  108.     dlog("%s fstype %d (%s) flags %#x (%s)",
  109.         mnt->mnt_dir, type, mnt->mnt_type, flags, mnt->mnt_opts);
  110. #endif /* NFS_4 */
  111. #endif /* DEBUG */
  112.  
  113.     /*
  114.      * Fake some mount table entries for the automounter
  115.      */
  116.     if (STREQ(mnt->mnt_type, MNTTYPE_AUTO)) {
  117.         automount = 1;
  118.         mnt->mnt_fsname = pid_fsname;
  119.         /*
  120.          * Try it with the normal name
  121.          */
  122. #ifdef notdef
  123.         mnt->mnt_type = MNTTYPE_IGNORE;
  124. #endif
  125.         mnt->mnt_type = MNTTYPE_NFS;
  126.         /*
  127.          * Background the mount, so that the stat of the
  128.          * mountpoint is done in a background process.
  129.          */
  130.         if (background())
  131.             return 0;
  132.     }
  133.  
  134. again:
  135.     clock_valid = 0;
  136.     error = MOUNT_TRAP(type, mnt, flags, mnt_data);
  137.     if (error < 0)
  138.         plog(XLOG_ERROR, "%s: mount: %m", mnt->mnt_dir);
  139.     if (error < 0 && --retry > 0) {
  140.         sleep(1);
  141.         goto again;
  142.     }
  143.     if (error < 0) {
  144.         if (automount)
  145.             going_down(errno);
  146.         return errno;
  147.     }
  148.  
  149. #ifdef UPDATE_MTAB
  150. #ifdef MNTINFO_DEV
  151.     /*
  152.      * Add the extra dev= field to the mount table.
  153.      */
  154.     if (stat(mnt->mnt_dir, &stb) == 0) {
  155.         char *zopts = (char *) xmalloc(strlen(mnt->mnt_opts) + 32);
  156.         xopts = mnt->mnt_opts;
  157.         if (sizeof(stb.st_dev) == 2) {
  158.             /* SunOS 4.1 */
  159.             sprintf(zopts, "%s,%s=%04lx", xopts, MNTINFO_DEV,
  160.                     (u_long) stb.st_dev & 0xffff);
  161.         } else {
  162.             /* System Vr4 */
  163.             sprintf(zopts, "%s,%s=%08lx", xopts, MNTINFO_DEV,
  164.                     (u_long) stb.st_dev);
  165.         }
  166.         mnt->mnt_opts = zopts;
  167.     }
  168. #endif /* MNTINFO_DEV */
  169.  
  170. #ifdef hpux
  171.     /*
  172.      * Yet another gratuitously incompatible change in HP-UX
  173.      */
  174.     mnt->mnt_time = clocktime();
  175. #endif
  176.     write_mntent(mnt);
  177. #ifdef MNTINFO_DEV
  178.     if (xopts) {
  179.         free(mnt->mnt_opts);
  180.         mnt->mnt_opts = xopts;
  181.     }
  182. #endif
  183. #endif /* UPDATE_MTAB */
  184.  
  185.     /*
  186.      * Needed this way since mnt may contain a pointer
  187.      * to a local variable in this stack frame.
  188.      */
  189.     if (automount)
  190.         going_down(0);
  191.     return 0;
  192. }
  193.  
  194. #ifdef NEED_MNTOPT_PARSER
  195. /*
  196.  * Some systems don't provide these to the user,
  197.  * but amd needs them, so...
  198.  *
  199.  * From: Piete Brooks <pb@cl.cam.ac.uk>
  200.  */
  201.  
  202. #include <ctype.h>
  203.  
  204. static char *nextmntopt(p)
  205. char **p;
  206. {
  207.     char *cp = *p;
  208.     char *rp;
  209.     /*
  210.      * Skip past white space
  211.      */
  212.     while (*cp && isspace(*cp))
  213.         cp++;
  214.     /*
  215.      * Word starts here
  216.      */
  217.     rp = cp;
  218.     /*
  219.      * Scan to send of string or separator
  220.      */
  221.     while (*cp && *cp != ',')
  222.         cp++;
  223.     /*
  224.      * If separator found the overwrite with nul char.
  225.      */
  226.     if (*cp) {
  227.         *cp = '\0';
  228.         cp++;
  229.     }
  230.     /*
  231.      * Return value for next call
  232.      */
  233.     *p = cp;
  234.     return rp;
  235. }
  236.  
  237. char *hasmntopt(mnt, opt)
  238. struct mntent *mnt;
  239. char *opt;
  240. {
  241.     char t[MNTMAXSTR];
  242.     char *f;
  243.     char *o = t;
  244.     int l = strlen(opt);
  245.     strcpy(t, mnt->mnt_opts);
  246.  
  247.     while (*(f = nextmntopt(&o)))
  248.         if (strncmp(opt, f, l) == 0)
  249.             return f - t + mnt->mnt_opts;
  250.  
  251.     return 0;
  252. }
  253. #endif /* NEED_MNTOPT_PARSER */
  254.