| 1 | 
 -- | 
 
 
 
 
 
 | 2 | 
 -- fstab.lua | 
 
 
 
 
 
 | 3 | 
 -- | 
 
 
 
 
 
 | 4 | 
 -- $Id$ | 
 
 
 
 
 
 | 5 | 
 -- | 
 
 
 
 
 
 | 6 | 
 -- Lua 5.2 module providing a mingw-get setup hook for the MSYS fstab. | 
 
 
 
 
 
 | 7 | 
 -- | 
 
 
 
 
 
 | 8 | 
 -- Written by Keith Marshall <keithmarshall@users.sourceforge.net> | 
 
 
 
 
 
 | 9 | 
 -- Copyright (C) 2014, 2015, MinGW.org Project | 
 
 
 
 
 
 | 10 | 
 -- | 
 
 
 
 
 
 | 11 | 
 -- | 
 
 
 
 
 
 | 12 | 
 -- Permission is hereby granted, free of charge, to any person obtaining a | 
 
 
 
 
 
 | 13 | 
 -- copy of this software and associated documentation files (the "Software"), | 
 
 
 
 
 
 | 14 | 
 -- to deal in the Software without restriction, including without limitation | 
 
 
 
 
 
 | 15 | 
 -- the rights to use, copy, modify, merge, publish, distribute, sublicense, | 
 
 
 
 
 
 | 16 | 
 -- and/or sell copies of the Software, and to permit persons to whom the | 
 
 
 
 
 
 | 17 | 
 -- Software is furnished to do so, subject to the following conditions: | 
 
 
 
 
 
 | 18 | 
 -- | 
 
 
 
 
 
 | 19 | 
 -- The above copyright notice and this permission notice shall be included | 
 
 
 
 
 
 | 20 | 
 -- in all copies or substantial portions of the Software. | 
 
 
 
 
 
 | 21 | 
 -- | 
 
 
 
 
 
 | 22 | 
 -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | 
 
 
 
 
 
 | 23 | 
 -- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 
 
 
 
 
 
 | 24 | 
 -- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL | 
 
 
 
 
 
 | 25 | 
 -- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 
 
 
 
 
 
 | 26 | 
 -- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | 
 
 
 
 
 
 | 27 | 
 -- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 
 
 
 
 
 
 | 28 | 
 -- DEALINGS IN THE SOFTWARE. | 
 
 
 
 
 
 | 29 | 
 -- | 
 
 
 
 
 
 | 30 | 
 -- | 
 
 
 
 
 
 | 31 | 
 -- We begin by initializing a container, for construction of a Lua module | 
 
 
 
 
 
 | 32 | 
 -- to encapsulate the content of this source file. | 
 
 
 
 
 
 | 33 | 
 -- | 
 
 
 
 
 
 | 34 | 
    local M = {} | 
 
 
 
 
 
 | 35 | 
 -- | 
 
 
 
 
 
 | 36 | 
 -- mingw-get passes the MSYS installation root directory path, | 
 
 
 
 
 
 | 37 | 
 -- in the $MSYS_SYSROOT environment variable; from this, we deduce | 
 
 
 
 
 
 | 38 | 
 -- the path name for the working copy of the fstab file... | 
 
 
 
 
 
 | 39 | 
 -- | 
 
 
 
 
 
 | 40 | 
    local function syspath( varname ) | 
 
 
 
 
 
 | 41 | 
 -- | 
 
 
 
 
 
 | 42 | 
 --   ...using this local helper function to ensure that the path name | 
 
 
 
 
 
 | 43 | 
 --   string, returned from the environment, is free from insignificant | 
 
 
 
 
 
 | 44 | 
 --   trailing directory name separators, and that all internal sequences | 
 
 
 
 
 
 | 45 | 
 --   of directory name separators are normalized to a single '/'. | 
 
 
 
 
 
 | 46 | 
 -- | 
 
 
 
 
 
 | 47 | 
      local pathname = string.gsub( os.getenv( varname ), "[/\\]+", "/" ) | 
 
 
 
 
 
 | 48 | 
      return string.match( pathname, "(.*[^/])/*$" ) | 
 
 
 
 
 
 | 49 | 
    end | 
 
 
 
 
 
 | 50 | 
    local sysroot = syspath( "MSYS_SYSROOT" ) | 
 
 
 
 
 
 | 51 | 
    local mingw32_sysroot = syspath( "MINGW32_SYSROOT" ) | 
 
 
 
 
 
 | 52 | 
    local fstab_file_name = sysroot .. "/etc/fstab" | 
 
 
 
 
 
 | 53 | 
 -- | 
 
 
 
 
 
 | 54 | 
 -- The following may be adjusted, to control the layout of the mount | 
 
 
 
 
 
 | 55 | 
 -- point mapping records, within the fstab file. | 
 
 
 
 
 
 | 56 | 
 -- | 
 
 
 
 
 
 | 57 | 
    local path_name_field_width, tab_width = 40, 8 | 
 
 
 
 
 
 | 58 | 
 -- | 
 
 
 
 
 
 | 59 | 
 -- Define a template, from which a sample fstab file for the current | 
 
 
 
 
 
 | 60 | 
 -- MSYS installation may be generated, on invocation of this module's | 
 
 
 
 
 
 | 61 | 
 -- "dump_sample" method... | 
 
 
 
 
 
 | 62 | 
 -- | 
 
 
 
 
 
 | 63 | 
    local fstab_sample = | 
 
 
 
 
 
 | 64 | 
    { '# /etc/fstab.sample -- sample mount table configuration for MSYS.', | 
 
 
 
 
 
 | 65 | 
      '', | 
 
 
 
 
 
 | 66 | 
      '# Lines with a "#" in column one are interpreted as comment lines;', | 
 
 
 
 
 
 | 67 | 
      '# with the exception of comments described as "magic", neither these', | 
 
 
 
 
 
 | 68 | 
      '# lines, nor any blank lines, are interpreted as configuration.', | 
 
 
 
 
 
 | 69 | 
      '', | 
 
 
 
 
 
 | 70 | 
      '# Comment lines which are described as "magic" should neither be', | 
 
 
 
 
 
 | 71 | 
      '# deleted, nor edited manually; ignoring this advice may cause your', | 
 
 
 
 
 
 | 72 | 
      '# MSYS installation to malfunction.', | 
 
 
 
 
 
 | 73 | 
      '', | 
 
 
 
 
 
 | 74 | 
      '# When running MSYS from a portable device, such as a USB thumb drive,', | 
 
 
 
 
 
 | 75 | 
      '# the following "magic" comment is used to track changes in host drive', | 
 
 
 
 
 
 | 76 | 
      '# letter assignment, so allowing MSYS-Portable start-up hooks to remap', | 
 
 
 
 
 
 | 77 | 
      '# mount table entries which refer to the relocated device:', | 
 
 
 
 
 
 | 78 | 
      '#', | 
 
 
 
 
 
 | 79 | 
      '# MSYSROOT=D:/PortableApps/MSYS/1.0', | 
 
 
 
 
 
 | 80 | 
      '', | 
 
 
 
 
 
 | 81 | 
      '# The mount table configuration follows below.  The line format is', | 
 
 
 
 
 
 | 82 | 
      '# simple: you specify the Win32 path, followed by one or more space or', | 
 
 
 
 
 
 | 83 | 
      '# tab delimiters, followed by the mount point name.  In a typical UNIX', | 
 
 
 
 
 
 | 84 | 
      '# installation, each mount point must exist as a named directory on a', | 
 
 
 
 
 
 | 85 | 
      '# physically accessible device, before it can actually be used as a', | 
 
 
 
 
 
 | 86 | 
      '# mount point.  For this implementation the "must exist" requirement', | 
 
 
 
 
 
 | 87 | 
      '# is not enforced; however, it will assist programs such as find, and', | 
 
 
 
 
 
 | 88 | 
      "# readline's tab completion if each does physically exist.", | 
 
 
 
 
 
 | 89 | 
      '', | 
 
 
 
 
 
 | 90 | 
      '# Win32_Path                              Mount_Point', | 
 
 
 
 
 
 | 91 | 
      '#-------------------------------------    -----------', | 
 
 
 
 
 
 | 92 | 
      'c:/mingw                                  /mingw' | 
 
 
 
 
 
 | 93 | 
    } | 
 
 
 
 
 
 | 94 | 
 -- | 
 
 
 
 
 
 | 95 | 
 -- ...and a further template for a working configuration. | 
 
 
 
 
 
 | 96 | 
 -- | 
 
 
 
 
 
 | 97 | 
    local fstab_basic = | 
 
 
 
 
 
 | 98 | 
    { '# /etc/fstab -- mount table configuration for MSYS.', | 
 
 
 
 
 
 | 99 | 
      '# Please refer to /etc/fstab.sample for explanatory annotation.', | 
 
 
 
 
 
 | 100 | 
      '', | 
 
 
 
 
 
 | 101 | 
      '# MSYS-Portable needs this "magic" comment:', | 
 
 
 
 
 
 | 102 | 
      '# MSYSROOT=D:/PortableApps/MSYS/1.0', | 
 
 
 
 
 
 | 103 | 
      '', | 
 
 
 
 
 
 | 104 | 
      '# Win32_Path                              Mount_Point', | 
 
 
 
 
 
 | 105 | 
      '#-------------------------------------    -----------', | 
 
 
 
 
 
 | 106 | 
      'c:/mingw                                  /mingw' | 
 
 
 
 
 
 | 107 | 
    } | 
 
 
 
 
 
 | 108 | 
 -- | 
 
 
 
 
 
 | 109 | 
 -- Define Lua regular expressions which may be used to identify | 
 
 
 
 
 
 | 110 | 
 -- comment lines within the fstab file; (the first will match any | 
 
 
 
 
 
 | 111 | 
 -- comment, while the second is specific to the "magic" comment, | 
 
 
 
 
 
 | 112 | 
 -- as used by MSYS-Portable, to track changes in the allocation | 
 
 
 
 
 
 | 113 | 
 -- of the drive identifier for the host device). | 
 
 
 
 
 
 | 114 | 
 -- | 
 
 
 
 
 
 | 115 | 
    local fstab_comment_line = "^#" | 
 
 
 
 
 
 | 116 | 
    local fstab_device_magic = "^(#%s*MSYSROOT=)(%S*)" | 
 
 
 
 
 
 | 117 | 
 -- | 
 
 
 
 
 
 | 118 | 
    local function map_root_device( assignment ) | 
 
 
 
 
 
 | 119 | 
 -- | 
 
 
 
 
 
 | 120 | 
 --   A function to update the "magic" comment, which records the | 
 
 
 
 
 
 | 121 | 
 --   allocation of the MSYS-Portable host device. | 
 
 
 
 
 
 | 122 | 
 -- | 
 
 
 
 
 
 | 123 | 
      return string.gsub( assignment, fstab_device_magic, "%1" .. sysroot ) | 
 
 
 
 
 
 | 124 | 
    end | 
 
 
 
 
 
 | 125 | 
 -- | 
 
 
 
 
 
 | 126 | 
 -- Define a Lua regular expression which may be used to verify | 
 
 
 
 
 
 | 127 | 
 -- that any fstab file record represents a well formed mount point | 
 
 
 
 
 
 | 128 | 
 -- specification; it also incorporates capture fields, which may | 
 
 
 
 
 
 | 129 | 
 -- be used to extract each of the path name and mount point | 
 
 
 
 
 
 | 130 | 
 -- identification fields from the specification. | 
 
 
 
 
 
 | 131 | 
 -- | 
 
 
 
 
 
 | 132 | 
    local fstab_mount_specification = "^%s*(%S+)%s+(%S+)%s*$" | 
 
 
 
 
 
 | 133 | 
 -- | 
 
 
 
 
 
 | 134 | 
    local function is_mount_specification( line ) | 
 
 
 
 
 
 | 135 | 
 -- | 
 
 
 
 
 
 | 136 | 
 --   A function to verify any fstab file record against the | 
 
 
 
 
 
 | 137 | 
 --   preceding regular expression, to confirm whether it does | 
 
 
 
 
 
 | 138 | 
 --   represent a well formed mount point specification. | 
 
 
 
 
 
 | 139 | 
 -- | 
 
 
 
 
 
 | 140 | 
      return string.match( line, fstab_mount_specification ) | 
 
 
 
 
 
 | 141 | 
    end | 
 
 
 
 
 
 | 142 | 
 -- | 
 
 
 
 
 
 | 143 | 
    local function get_mapped_path( specification ) | 
 
 
 
 
 
 | 144 | 
 -- | 
 
 
 
 
 
 | 145 | 
 --   A function to extract the associated path name field from | 
 
 
 
 
 
 | 146 | 
 --   any well formed mount point specification record. | 
 
 
 
 
 
 | 147 | 
 -- | 
 
 
 
 
 
 | 148 | 
      return string.gsub( specification, fstab_mount_specification, "%1" ) | 
 
 
 
 
 
 | 149 | 
    end | 
 
 
 
 
 
 | 150 | 
 -- | 
 
 
 
 
 
 | 151 | 
    local function get_mount_point( specification ) | 
 
 
 
 
 
 | 152 | 
 -- | 
 
 
 
 
 
 | 153 | 
 --   A function to extract the mount point identification field | 
 
 
 
 
 
 | 154 | 
 --   from any well formed mount point specification record. | 
 
 
 
 
 
 | 155 | 
 -- | 
 
 
 
 
 
 | 156 | 
      return string.gsub( specification, fstab_mount_specification, "%2" ) | 
 
 
 
 
 
 | 157 | 
    end | 
 
 
 
 
 
 | 158 | 
 -- | 
 
 
 
 
 
 | 159 | 
 -- In the event that a mount table configuration has already been | 
 
 
 
 
 
 | 160 | 
 -- specified for this installation, capture this into an internal | 
 
 
 
 
 
 | 161 | 
 -- "as built" configuration table... | 
 
 
 
 
 
 | 162 | 
 -- | 
 
 
 
 
 
 | 163 | 
    local fstab_as_built = {} | 
 
 
 
 
 
 | 164 | 
    local fstab = io.open( fstab_file_name ) | 
 
 
 
 
 
 | 165 | 
    if fstab | 
 
 
 
 
 
 | 166 | 
    then | 
 
 
 
 
 
 | 167 | 
 -- | 
 
 
 
 
 
 | 168 | 
 --   ...reading the existing configuration file, line by line... | 
 
 
 
 
 
 | 169 | 
 -- | 
 
 
 
 
 
 | 170 | 
      for line in fstab:lines() | 
 
 
 
 
 
 | 171 | 
      do | 
 
 
 
 
 
 | 172 | 
 -- | 
 
 
 
 
 
 | 173 | 
 --     ...identifying comment lines... | 
 
 
 
 
 
 | 174 | 
 -- | 
 
 
 
 
 
 | 175 | 
        if string.match( line, fstab_comment_line ) | 
 
 
 
 
 
 | 176 | 
        then | 
 
 
 
 
 
 | 177 | 
 -- | 
 
 
 
 
 
 | 178 | 
 --       ...and ignoring all such, except any "device magic" line... | 
 
 
 
 
 
 | 179 | 
 -- | 
 
 
 
 
 
 | 180 | 
          if string.match( line, fstab_device_magic ) | 
 
 
 
 
 
 | 181 | 
          then | 
 
 
 
 
 
 | 182 | 
 -- | 
 
 
 
 
 
 | 183 | 
 --         ...from which we retrieve, and subsequently update, the | 
 
 
 
 
 
 | 184 | 
 --         configuration-specific "sysroot" identification. | 
 
 
 
 
 
 | 185 | 
 -- | 
 
 
 
 
 
 | 186 | 
            sysroot = string.gsub( line, fstab_device_magic, "%2" ) | 
 
 
 
 
 
 | 187 | 
          end | 
 
 
 
 
 
 | 188 | 
 -- | 
 
 
 
 
 
 | 189 | 
 --     Also identify mount point specification lines... | 
 
 
 
 
 
 | 190 | 
 -- | 
 
 
 
 
 
 | 191 | 
        elseif is_mount_specification( line ) | 
 
 
 
 
 
 | 192 | 
        then | 
 
 
 
 
 
 | 193 | 
          if string.match( get_mount_point( line ), "^/mingw$" ) | 
 
 
 
 
 
 | 194 | 
          then | 
 
 
 
 
 
 | 195 | 
 -- | 
 
 
 
 
 
 | 196 | 
 --         ...and preserve the user's pre-configured path assignment | 
 
 
 
 
 
 | 197 | 
 --         for the "/mingw" mount point, if any. | 
 
 
 
 
 
 | 198 | 
 -- | 
 
 
 
 
 
 | 199 | 
            mingw32_sysroot = get_mapped_path( line ) | 
 
 
 
 
 
 | 200 | 
 -- | 
 
 
 
 
 
 | 201 | 
          else | 
 
 
 
 
 
 | 202 | 
 -- | 
 
 
 
 
 
 | 203 | 
 --         ...while, for all EXCEPT the "/mingw" mount point, | 
 
 
 
 
 
 | 204 | 
 --         simply record the configuration. | 
 
 
 
 
 
 | 205 | 
 -- | 
 
 
 
 
 
 | 206 | 
            table.insert( fstab_as_built, line ) | 
 
 
 
 
 
 | 207 | 
          end | 
 
 
 
 
 
 | 208 | 
        end | 
 
 
 
 
 
 | 209 | 
      end | 
 
 
 
 
 
 | 210 | 
    end | 
 
 
 
 
 
 | 211 | 
 -- | 
 
 
 
 
 
 | 212 | 
 -- | 
 
 
 
 
 
 | 213 | 
    local function fstab_write_configuration( fstab, template, current ) | 
 
 
 
 
 
 | 214 | 
 -- | 
 
 
 
 
 
 | 215 | 
 --   A function to write an fstab configuration to a designated output | 
 
 
 
 
 
 | 216 | 
 --   stream, based on a specified template, reproducing and encapsulating | 
 
 
 
 
 
 | 217 | 
 --   any existing configuration which may also have been specified... | 
 
 
 
 
 
 | 218 | 
 -- | 
 
 
 
 
 
 | 219 | 
      local function fstab_writeln( line ) | 
 
 
 
 
 
 | 220 | 
 -- | 
 
 
 
 
 
 | 221 | 
 --     ...using this helper function to write line by line. | 
 
 
 
 
 
 | 222 | 
 -- | 
 
 
 
 
 
 | 223 | 
        fstab:write( line .. "\n" ) | 
 
 
 
 
 
 | 224 | 
      end | 
 
 
 
 
 
 | 225 | 
 -- | 
 
 
 
 
 
 | 226 | 
      local function assign_mount_point( mapped_path, mount_point ) | 
 
 
 
 
 
 | 227 | 
 -- | 
 
 
 
 
 
 | 228 | 
 --     This helper function formats each mount point specification | 
 
 
 
 
 
 | 229 | 
 --     into a neatly tabulated layout... | 
 
 
 
 
 
 | 230 | 
 -- | 
 
 
 
 
 
 | 231 | 
        local filled = string.len( mapped_path ) | 
 
 
 
 
 
 | 232 | 
        repeat | 
 
 
 
 
 
 | 233 | 
          mapped_path, filled = mapped_path .. "\t", filled + tab_width | 
 
 
 
 
 
 | 234 | 
        until filled >= path_name_field_width | 
 
 
 
 
 
 | 235 | 
 -- | 
 
 
 
 
 
 | 236 | 
 --     ...to be written out, with one line per mount point. | 
 
 
 
 
 
 | 237 | 
 -- | 
 
 
 
 
 
 | 238 | 
        fstab_writeln( mapped_path .. mount_point ) | 
 
 
 
 
 
 | 239 | 
      end | 
 
 
 
 
 
 | 240 | 
 -- | 
 
 
 
 
 
 | 241 | 
 --   Process the template, line by line... | 
 
 
 
 
 
 | 242 | 
 -- | 
 
 
 
 
 
 | 243 | 
      for ref, line in next, template | 
 
 
 
 
 
 | 244 | 
      do | 
 
 
 
 
 
 | 245 | 
 --     ...and for each comment, or blank line encountered... | 
 
 
 
 
 
 | 246 | 
 -- | 
 
 
 
 
 
 | 247 | 
        if string.match( line, "^#" ) or string.match( line, "^%s*$" ) | 
 
 
 
 
 
 | 248 | 
        then | 
 
 
 
 
 
 | 249 | 
 --       ...simply reproduce it in the output stream, while taking | 
 
 
 
 
 
 | 250 | 
 --       care to update any "device magic" which it may incorporate, | 
 
 
 
 
 
 | 251 | 
 --       so that it fits the configuration of this installation. | 
 
 
 
 
 
 | 252 | 
 -- | 
 
 
 
 
 
 | 253 | 
          fstab_writeln( map_root_device( line ) ) | 
 
 
 
 
 
 | 254 | 
 -- | 
 
 
 
 
 
 | 255 | 
 --     When we encounter a mount point specification line -- for | 
 
 
 
 
 
 | 256 | 
 --     which each of the embedded templates should include exactly | 
 
 
 
 
 
 | 257 | 
 --     one example... | 
 
 
 
 
 
 | 258 | 
 -- | 
 
 
 
 
 
 | 259 | 
        elseif is_mount_specification( line ) | 
 
 
 
 
 
 | 260 | 
        then | 
 
 
 
 
 
 | 261 | 
 --       ...write out the specification for the "/mingw" mount | 
 
 
 
 
 
 | 262 | 
 --       point, as appropriate for this installation. | 
 
 
 
 
 
 | 263 | 
 -- | 
 
 
 
 
 
 | 264 | 
          assign_mount_point( mingw32_sysroot, "/mingw" ) | 
 
 
 
 
 
 | 265 | 
        end | 
 
 
 
 
 
 | 266 | 
      end | 
 
 
 
 
 
 | 267 | 
 -- | 
 
 
 
 
 
 | 268 | 
 --   And finally... | 
 
 
 
 
 
 | 269 | 
 -- | 
 
 
 
 
 
 | 270 | 
      if current | 
 
 
 
 
 
 | 271 | 
      then | 
 
 
 
 
 
 | 272 | 
 --     ...when inclusion of the current mount configuration has been | 
 
 
 
 
 
 | 273 | 
 --     specified, we process each configuration record in turn... | 
 
 
 
 
 
 | 274 | 
 -- | 
 
 
 
 
 
 | 275 | 
        for ref, line in next, current | 
 
 
 
 
 
 | 276 | 
        do | 
 
 
 
 
 
 | 277 | 
 --       ...and write out its corresponding mount point specification, | 
 
 
 
 
 
 | 278 | 
 --       (noting that we have already excluded the "/mingw" mount point | 
 
 
 
 
 
 | 279 | 
 --       from the recorded configuration, but we have already written a | 
 
 
 
 
 
 | 280 | 
 --       specification record for it). | 
 
 
 
 
 
 | 281 | 
 -- | 
 
 
 
 
 
 | 282 | 
          assign_mount_point( get_mapped_path( line ), get_mount_point( line ) ) | 
 
 
 
 
 
 | 283 | 
        end | 
 
 
 
 
 
 | 284 | 
      end | 
 
 
 
 
 
 | 285 | 
    end | 
 
 
 
 
 
 | 286 | 
 -- | 
 
 
 
 
 
 | 287 | 
 -- | 
 
 
 
 
 
 | 288 | 
    function M.pathname( suffix ) | 
 
 
 
 
 
 | 289 | 
 -- | 
 
 
 
 
 
 | 290 | 
 --   An exported utility function, to facilitate identification of | 
 
 
 
 
 
 | 291 | 
 --   the full MS-Windows path name for the "/etc/fstab" configuration | 
 
 
 
 
 
 | 292 | 
 --   file, as appropriate to the current installation... | 
 
 
 
 
 
 | 293 | 
 -- | 
 
 
 
 
 
 | 294 | 
      if suffix | 
 
 
 
 
 
 | 295 | 
      then | 
 
 
 
 
 
 | 296 | 
 --     ...appending any suffix which may have been specified, (e.g. | 
 
 
 
 
 
 | 297 | 
 --     to specify a reference to the "/etc/fstab.sample" file)... | 
 
 
 
 
 
 | 298 | 
 -- | 
 
 
 
 
 
 | 299 | 
        return fstab_file_name .. suffix | 
 
 
 
 
 
 | 300 | 
      end | 
 
 
 
 
 
 | 301 | 
 -- | 
 
 
 
 
 
 | 302 | 
 --   ...otherwise, specifying a reference to "/etc/fstab" itself. | 
 
 
 
 
 
 | 303 | 
 -- | 
 
 
 
 
 
 | 304 | 
      return fstab_file_name | 
 
 
 
 
 
 | 305 | 
    end | 
 
 
 
 
 
 | 306 | 
 -- | 
 
 
 
 
 
 | 307 | 
 -- | 
 
 
 
 
 
 | 308 | 
    function M.dump_sample( stream_file ) | 
 
 
 
 
 
 | 309 | 
 -- | 
 
 
 
 
 
 | 310 | 
 --   An exported utility function, providing a method for displaying, | 
 
 
 
 
 
 | 311 | 
 --   or otherwise emitting suitable content for the "/etc/fstab.sample" | 
 
 
 
 
 
 | 312 | 
 --   file, as directed by the embedded "fstab_sample" template... | 
 
 
 
 
 
 | 313 | 
 -- | 
 
 
 
 
 
 | 314 | 
      if not stream_file | 
 
 
 
 
 
 | 315 | 
      then | 
 
 
 
 
 
 | 316 | 
 --     ...writing to "stdout", in the event that no other destination | 
 
 
 
 
 
 | 317 | 
 --     has been specified. | 
 
 
 
 
 
 | 318 | 
 -- | 
 
 
 
 
 
 | 319 | 
        stream_file = io.stdout | 
 
 
 
 
 
 | 320 | 
      end | 
 
 
 
 
 
 | 321 | 
 -- | 
 
 
 
 
 
 | 322 | 
 --   Regardless of output destination, we delegate output to this local | 
 
 
 
 
 
 | 323 | 
 --   function, processing the integral sample file template, but we omit | 
 
 
 
 
 
 | 324 | 
 --   the current mount table configuration. | 
 
 
 
 
 
 | 325 | 
 -- | 
 
 
 
 
 
 | 326 | 
      fstab_write_configuration( stream_file, fstab_sample ) | 
 
 
 
 
 
 | 327 | 
    end | 
 
 
 
 
 
 | 328 | 
 -- | 
 
 
 
 
 
 | 329 | 
 -- | 
 
 
 
 
 
 | 330 | 
    function M.initialize( stream_file ) | 
 
 
 
 
 
 | 331 | 
 -- | 
 
 
 
 
 
 | 332 | 
 --   The primary initialization function, exported for use by mingw-get, | 
 
 
 
 
 
 | 333 | 
 --   to write a working mount table configuration to the specified file | 
 
 
 
 
 
 | 334 | 
 --   stream, which, unless otherwise specified... | 
 
 
 
 
 
 | 335 | 
 -- | 
 
 
 
 
 
 | 336 | 
      local default_stream_file = nil | 
 
 
 
 
 
 | 337 | 
      if not stream_file | 
 
 
 
 
 
 | 338 | 
      then | 
 
 
 
 
 
 | 339 | 
 --     ...is to be directed to the default "/etc/fstab" file. | 
 
 
 
 
 
 | 340 | 
 -- | 
 
 
 
 
 
 | 341 | 
        default_stream_file = io.open( fstab_file_name, "w" ) | 
 
 
 
 
 
 | 342 | 
        stream_file = default_stream_file | 
 
 
 
 
 
 | 343 | 
      end | 
 
 
 
 
 
 | 344 | 
 -- | 
 
 
 
 
 
 | 345 | 
 --   Once again, regardless of how the output file has been identified, | 
 
 
 
 
 
 | 346 | 
 --   provided the stream has been successfully assigned... | 
 
 
 
 
 
 | 347 | 
 -- | 
 
 
 
 
 
 | 348 | 
      if stream_file | 
 
 
 
 
 
 | 349 | 
      then | 
 
 
 
 
 
 | 350 | 
 --     ...we delegate the actual output function to the local helper, | 
 
 
 
 
 
 | 351 | 
 --     this time, processing the integral working file template, and we | 
 
 
 
 
 
 | 352 | 
 --     include the record of the current mount table configuration. | 
 
 
 
 
 
 | 353 | 
 -- | 
 
 
 
 
 
 | 354 | 
        fstab_write_configuration( stream_file, fstab_basic, fstab_as_built ) | 
 
 
 
 
 
 | 355 | 
      end | 
 
 
 
 
 
 | 356 | 
 -- | 
 
 
 
 
 
 | 357 | 
 --   Finally, when updating the default "/etc/fstab" configuration, | 
 
 
 
 
 
 | 358 | 
 --   via a locally opened output file stream... | 
 
 
 
 
 
 | 359 | 
 -- | 
 
 
 
 
 
 | 360 | 
      if default_stream_file | 
 
 
 
 
 
 | 361 | 
      then | 
 
 
 
 
 
 | 362 | 
 --     ...we must now ensure that this output stream is closed. | 
 
 
 
 
 
 | 363 | 
 -- | 
 
 
 
 
 
 | 364 | 
        io.close( default_stream_file ) | 
 
 
 
 
 
 | 365 | 
      end | 
 
 
 
 
 
 | 366 | 
    end | 
 
 
 
 
 
 | 367 | 
 -- | 
 
 
 
 
 
 | 368 | 
 -- Since this source file is intended to be loaded as a Lua module, we | 
 
 
 
 
 
 | 369 | 
 -- must ultimately return a reference handle for it. | 
 
 
 
 
 
 | 370 | 
 -- | 
 
 
 
 
 
 | 371 | 
    return M | 
 
 
 
 
 
 | 372 | 
 -- | 
 
 
 
 
 
 | 373 | 
 -- $RCSfile$: end of file */ |