about summary refs log tree commit diff
path: root/Completion/User/_mount
blob: 41b8280d5d73a66743cd07ea1828ce828bcb3ee8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
#compdef mount umount

# This is table-driven: the tables for the values for the different
# file system types are directly below. The tables describing the
# arguments for the `mount' command for different operating systems
# are below these table.

local curcontext="$curcontext" state line ret=1
local args fss deffs=iso9660 descr tmp typeopt=-t _nfs_access _nfs_ufs

typeset -A opt_args

if (( ! $+_fs_any )); then

  # These are tables describing the possible values and their
  # arguments for the `-o' option. There is one array per 
  # file system type (only for those that accept more values
  # than those in the `_fs_any' array). The elements of the
  # array are used as arguments to `_values'. The first tables
  # are used by several systems while system specific tables are  
  # (re)defined in a "$OSTYPE" case.

  _fs_any=(
    '(rw)ro[mount file system read-only]'
    '(ro)rw[mount file system read-write]'
  )
  _nfs_access=(
    'acregmin[specify cached file attributes minimum hold time]:cached file attributes minimum hold time:'
    'acregmax[specify cached file attributes maximum hold time]:cached file attributes maximum hold time:'
    'acdirmin[specify cached directory attributes minimum hold time]:cached directory attributes minimum hold time:'
    'acdirmax[specify cached directory attributes maximum hold time]:cached directory attributes maximum hold time:'
    'actimeo[set all attributes'"'"' cache timeout]:set all attributes'"'"' cache timeout:'
  )
  _fs_nfs=(
    'rsize[specify read buffer size]:read buffer size:(8192)'
    'wsize[specify write buffer size]:write buffer size:(8192)'
    '(soft)hard[hang process on server crash (so to say)]'
    '(hard)soft[allow time out on server crash]'
    '(nolock)lock[use locking]'
    '(lock)nolock[don'"'"'t use locking]'
    'timeo[specify initial timeout for UDP]:initial timeout for UDP:'
    'retrans[set number of NFS retransmissions]:number of NFS retransmissions:'
    'retry[specify number of mount failure retries]:mount failure retries:'
    '(fg)bg[retry in the background]'
    '(bg)fg[retry in the foreground]'
    '(nintr)intr[allow operations to be interrupted]'
    '(intr)nintr[prevent operations from being interrupted]'
    '(nfsv3)nfsv2[use NFS version 2]'
    '(nfsv2)nfsv3[use NFS version 3]'
    'proto[specify protocol]:protocol:(udp tcp)'
    'port[specify server port number]:server port number:'
    'proplist[allow property lists]'
    "$_nfs_access[@]"
    'nocto[don'"'"'t get fresh attributes on open]'
    'noac[don'"'"'t set attribute caching]'
  )
  _nfs_ufs=(
    '(nodev)dev[interpret devices]'
    '(dev)nodev[don'"'"'t interpret devices]'
    '(nosuid)suid[use suid and sgib bits]'
    '(suid)nosuid[ignore suid and sgid bits]'
    '(nosync)sync[do I/O synchronously]'
    '(sync)nosync[do all I/O asynchronously]'
    '(noexec)exec[permit execution of binaries]'
    '(exec)noexec[don'"'"'t allow execution of binaries]'
    '(nogrpid)grpid[new file gets group ID of directory]'
    '(grpid)nogrpid[new file gets fsgid of current process]'
  )
  _fs_ufs=(
    'dirty[allow mount even if not cleanly unmounted]'
    "$_nfs_ufs[@]"
  )

  case "$OSTYPE" in
  solaris*)
    _fs_s5fs=(
      'remount[remount file system]'
      '(suid)nosuid[ignore suid and sgid bits]'
      '(nosuid)suid[use suid and sgib bits]'
    )
    _fs_ufs=(
      '(atime)noatime[don'"'"'t update access time]'
      'f[fake an /etc/mnttab entry]'
      'm[don'"'"'t make an /etc/mnttab entry]'
      '(noforcedirectio)forcedirectio[do I/O synchronously]'
      '(forcedirectio)noforcedirectio[do all I/O asynchronously]'
      '(nointr)intr[allow operations to be interrupted]'
      '(intr)nointr[prevent operations from being interrupted]'
      '(nolargefiles)largefiles[don'"'"' restrict file size]'
      '(largefiles)nolargefiles[restrict file size]'
      '(nologging)logging[log transactions]'
      '(logging)nologging[log transactions]'
      'onerror[action to recover from error]:action(panic lock umout)'
      'quota[turn on quotas]'
      '(ro rw)rq[mount file system read-write with quotas]'
      "$_fs_s5fs[@]"
    )
    _fs_tmpfs=(
      'size[set file system size]:size:'
    )
    _fs_pcfs=(
      '(nofoldcase)foldcase[force filenames to lowercase]'
      '(foldcase)nofoldcase[don'"'"'t force filenames to lowercase]'
    )
    _fs_hsfs=(
      'nrr[no rock ridge]'
      'notraildot[no trail dot when no extension]'
      'nomaplcase[don'"'"'t force lowercase]'
      'nosiud[ignore suid and sgid bits]'
    )
    _fs_nfs=(
      '(fg)bg[retry in the background]'
      '(bg)fg[retry in the foreground]'
      '(nogrpid)grpid[new file gets group ID of directory]'
      '(grpid)nogrpid[new file gets fsgid of current process]'
      '(nointr)intr[allow operations to be interrupted]'
      '(intr)nointr[prevent operations from being interrupted]'
      '(sec secure)kerberos[use kerberos authentication]'
      'noac[no attribute caching]'
      'port[server IP port number]:port:'
      'posix[posix sematics]'
      'proto[specify protocol]:protocol:'\("$(grep -v '^#' /etc/netconfig 2> /dev/null | cut -d ' ' -f 1)"\)
      'public[force public file handle]'
      '(noquota)quota[enable quotas]'
      '(quota)noquota[disable quotas]'
      'timeo[specify initial timeout for UDP]:initial timeout for UDP:'
      'retrans[set number of NFS retransmissions]:number of NFS retransmissions:(5)'
      'retry[specify number of mount failure retries]:mount failure retries:(10000)'
      'rsize[specify read buffer size]:read buffer size:(8192)'
      'wsize[specify write buffer size]:write buffer size:(8192)'
      '(kerberos secure)sec[set the security mode]:security mode:(sys dh krb4 none)'
      '(kerberos sec)secure[use Diffie-Hellman public key system]'
      'vers[set NFS vesion number]:NFS version number:(2 3)'
      "$_nfs_access[@]"
      "$_fs_s5fs[@]"
    ) 
    _fs_cachefs=(
      "$_nfs_access[@]"
      'backfstype[type of the back file system]:back file system type:(nfs hsfs)'
      'backpath[specify back file system location]:back file system location:_files -/'
      'cacheid[specify a cache ID]:cache ID:'
      'local-access[check permissions locally]'
      'noconst[disables cache consistency checking]'
      'purge[purge any cached informations]'
      '(suid)nosuid[ignore suid and sgid bits]'
      '(nosuid)suid[use suid and sgib bits]'
      '(write-around)non-shared[purge cache on writes]'
      '(non-shared)write-around[keep file in cache on writes]'
    )
    ;;
  osf*)
    _fs_advfs=(
      '(ro rw)rq[mount file system read-write]'
      'dual[allow mount even if same domain ID as already mounted domain]'
      'sync[do I/O synchronously]'
    )
    _fs_cdfs=(
      '(nodefperm)defperm[ignore permission bits]'
      '(defperm)defperm[use permission bits]'
      'noversion[strip off version extension]'
      'rrip[use RRIP extensions]'
    )
    _fs_nfs=(
      "$_nfs_ufs[@]"
      "$_fs_nfs[@]"
    )
    ;;
  linux*)
    _fs_any=(
      '(sync)async[do all I/O asynchronously]'
      '(noatime)atime[update access time]'
      '(noauto)auto[can be mounted with -a]'
      '(rw suid dev exec auto nouser async)defaults[use default options]'
      '(nodev)dev[interpret devices]'
      '(noexec)exec[permit execution of binaries]'
      '(atime)noatime[don'"'"'t update access time]'
      '(auto)noauto[can only be mounted explicitly]'
      '(dev)nodev[don'"'"'t interpret devices]'
      '(exec)noexec[don'"'"'t allow execution of binaries]'
      '(suid)nosuid[ignore suid and sgid bits]'
      '(user)nouser[can only be mounted by root]'
      'remount[mount already mounted file system]'
      '(rw)ro[mount file system read-only]'
      '(ro)rw[mount file system read-write]'
      '(nosuid)suid[use suid and sgib bits]'
      '(async)sync[do I/O synchronously]'
      '(nouser noexec nosuid nodev)user[allow normal users to mount]'
    )
    _fs_affs=(
      'uid[set owner of root]:user ID:'
      'gid[set group of root]:group ID:'
      'setuid[set owner of all files]:user ID:'
      'setgid[set group of all files]:group ID:'
      'mode[set file permissions]:file permission bits:'
      'protect[don'"'"'t allow changes to permissions]'
      'usemp[set owner of root to owner of mount point]'
      'verbose[print message per mount]'
      'prefix[prefix before volume name (link)]:prefix string:'
      'volume[prefix before '"'"'/'"'"' (symlink)]:prefix string:'
      'reserved[set number of unused blocks at start of device]:number of unused blocks:'
      'root[specify location of the root block]:root block location:'
      'bs[specify block size]:block size:(512 1024 2048 4192)'
    )
    _fs_ext2=(
      '(minixdf)bsddf[select bsddf behavior]'
      '(bsddf)minixdf[select bsddf behavior]'
      '(nocheck)check[set checking level]::checking level:((normal\:check\ inode\ and\ block\ bitmaps\ on\ mount strict\:check\ on block\ deallocation none\:no\ checking))'
      'errors[specify behavior on error]:error behavior:((continue\:ignore\ errors remount-ro\:remount\ file\ system\ read-only panic\:panic\ and\ halt\ system))'
      '(nogrpid bsdgroups sysvgroups)grpid[new file gets group ID of directory]'
      '(grpid nogrpid sysvgroups)bsdgroups[new file gets group ID of directory]'
      '(grpid bsdgroups sysvgroups)nogrpid[new file gets fsgid of current process]'
      '(grpid bsdgroups nogrpid)sysvgroups[new file gets fsgid of current process]'
      'resgid[specify access to reserved space (group ID)]:group ID:'
      'resuid[specify access to reserved space (user ID)]:user ID:'
      'sb[specify super block number]:super block number:'
    )
    _fs_fat=(
      'blocksize[specify block size]:block size:(512 1024)'
      'uid[specify user ID of all files]:user ID:'
      'gid[specify group ID of all files]:group ID:'
      'umask[specify umask]:umask value (octal):'
      'check[specify checking level]:checking level:((relaxed\:accept\ upper\ and\ lower\ case,\ truncate\ long\ name normal\:like\ '"'\`'"'relaxed'"\\'"',\ but\ reject\ special\ characters strict\:like\ '"'\`'"'normal'"\\'"',\ but\ no\ long\ parts))'
      'conf[specify CR/NL conversion]:CR/NL conversion mode:((binary\:no\ translation text\:conversion\ on\ all\ files auto\:perform\ translation\ on\ file\ without\ binary\ extension))'
      'debug[debug mode]'
      'fat[specify fat type]:fat type (bit):(12 16)'
      'quiet[quiet mode]'
    )
    _fs_msdos=( "$_fs_fat[@]" )
    _fs_umsdos=( "$_fs_fat[@]" )
    _fs_vfat=( "$_fs_fat[@]"
      'uni_xlate[translate unicode to escaped sequences]'
      'posix[allow file names only differing in case]'
      'nonumtail[try short name before number extension]'
    )
    _fs_hpfs=(
      'uid[specify user ID of all files]:user ID:'
      'gid[specify group ID of all files]:group ID:'
      'umask[specify umask]:umask value (octal):'
      'case[specify file name conversion]:file name conversion:((lower\:convert\ to\ lower\ case asis\:no\ conversion))'
      'conv[specify CR elimination]:CR elimination:((binary\:no\ elimination test\:delete\ CRs\ \(e.g.\ before\ NL\) auto\:sometimes\ yes,\ sometimes\ not))'
      'nocheck[don'"'"'t abort mount on consistency check failure]'
    )
    _fs_iso9660=(
      'norock[disable Rock Ridge extensions]'
      'check[specify file name conversion]:file name conversion:((relaxed\:convert\ to\ lower\ case\ before\ lookup strict\:no\ conversion))'
      'uid[specify user ID of all files]:user ID:'
      'gid[specify group ID of all files]:group ID:'
      'map[specify non-Rock Ridge name conversion]:file name conversion:((normal\:map\ upper\ to\ lower,\ ignore\ \;1,\ map\ \;\ to\ . off\:no\ conversion))'
      'mode[specify permissions]:file access permissions:'
      'unhide[show hidden and associated files]'
      'block[specify block size]:block size:(512 1024 2048)'
      'cruft[ignore high bits of file length]'
    )
    _fs_smbfs=( "$_fs_nfs[@]" )
    _fs_udf=(
      'uid[specify user ID of all files]:user ID:'
      'gid[specify group ID of all files]:group ID:'
      'umask[specify umask]:umask value (octal):'
      'unhide[show hidden and associated files]'
      'undelete[show deleted files]'
      'bs[set the block size]:block size:2048'
      'novrs[skip volume sequence recognition]'
      'session[set the CDROM session]:session:'
      'anchor[override standard anchor location]:anchor location:256'
      'lastblock[set the last block of the file system]:last block:'
    )
    _fs_ufs=(
      'ufstype[set ufs type]:ufs type:(old 44bsd sun sunx86 nextstep nextstep-cd openstep)'
      'onerror[set behaviour on error]:behaviour on error:(panic lock umount repair)'
    )
    ;;
  esac
fi

if [[ "$words[1]" = mount ]]; then

  # Here are the tests and tables for the arguments and options for
  # the `mount' program. The `fss' array has to be set to the names
  # of the file system types understood on this system.
  # This should also set the `deffs' parameter if the default file
  # system type is not `iso9660' (it should be set to the name of
  # the default file system type), and set 'typeops' to the mount 
  # option for file system type selection when it is not '-t'.

  case "$OSTYPE" in
  linux*)
    args=( -s
      '-h[show help]'
      '-V[show version]'
      '-v[verbose mode]'
      '(-o)-a[mount all filesystems in fstab]'
      '-F[fork off one child per device]'
      '-f[fake mount]'
      '-n[don'"'"'t write /etc/mtab]'
      '-s[tolerate sloppy mount options]'
      '-r[mount read-only]'
      '-w[mount read/write]'
      '-t[specify file system type]:file system type:->fstype'
      '-o[specify file system options]:file system option:->fsopt'
      ':dev or dir:->devordir'
      ':mount point:_files -/'
    )
    fss=( minix ext ext2 xiafs hpfs msdos umsdos vfat proc nfs iso9660
          smbfs ncpfs affs ufs romfs sysv adfs autofs coda devpts efs
          hfs ntfs qnx4 smbfs udf )
    ;;
  osf*)
    args=( -s
      '(-o)-a[mount all filesystems in fstab]'
      '-d[mount even if not unmounted]'
      '-e[list all mount points]'
      '-f[fake mount]'
      '-l[display values of all file system options]'
      '-t[specify file system type]:file system type:->fstype'
      '-o[specify file system options]:file system option:->fsopt'
      '-u[remount file system]'
      '-r[mount read-only]'
      '-w[mount read/write]'
      '-v[verbose]'
      ':dev or dir:->devordir'
      ':mount point:_files -/'
    )
    fss=( advfs ufs nfs mfs cdfs )
    deffs=cdfs
    ;;
  solaris*)
    args=( -s
      '(-p -v)-a[mount all filesystems in fstab]'
      '(-p -v)-F[specify file system type]:file system type:->fstype'
      '(-a -v)-p[print mounted file systems]'
      '(-p -a)-v[print mounted file systems verbosely]'
      '(-p -v)-V[fake mount]'
      '(-p -v)-m[don'"'"'t write /etc/mnttab]'
      '(-p -v)-g[mount globally]'
      '(-p -v)-o[specify file system options]:file system option:->fsopt'
      '(-p -v)-O[overlay mount]'
      '(-p -v)-r[mount read-only]'
      ':dev or dir:->devordir'
      ':mount point:_files -/'
    )
    fss=( ufs nfs hsfs s5fs pcfs cachefs tmpfs )
    deffs=hsfs
    typeops=-F
    ;;
  *)
    # Default for all other systems. Dunno.

    args=( -s
      '(-o)-a[mount all filesystems in fstab]'
      '-t[specify file system type]:file system type:->fstype'
      '-o[specify file system options]:file system option:->fsopt'
      '-f[fake mount]'
      ':dev or dir:->devordir'
      ':mount point:_files -/'
    )
    fss=( ufs )
    deffs=ufs
    ;;
  esac

  _arguments -C "$args[@]" && ret=0

else

  # Completion for umount.

  _arguments -C -s \
    '-h[show help]' \
    '-V[show version]' \
    '-v[verbose mode]' \
    '-n[don'"'"'t write /etc/mtab]' \
    '-r[remount read-only on failure]' \
    '-a[unmount all file systems from /etc/mtab]' \
    '-t[specify file system type]:file system type:->fstype' \
    '*:dev or dir:->udevordir' && ret=0
fi

case "$state" in
fstype)
  compset -P '*,'

  _wanted types expl 'file system type' &&
      compadd "$expl[@]" -qS, -M 'L:|no=' - "$fss[@]" && ret=0
  ;;
fsopt)
  _tags options || return 1

  eval 'tmp=(' '"$_fs_'${(s:,:)^${opt_args[$typeops]:-${deffs}}}'[@]"' ')'
  tmp=( "$_fs_any[@]" "${(@)tmp:#}" )
  _values -s , 'file system options' "$tmp[@]" && ret=0
  ;;
devordir)
  if (( $+opt_args[-a] )); then
    _message "no device or directory with option \`-a'"
  else
    _alternative \
        'devices:device:compadd /dev/\*' \
	'directories:mount point:_files -/' && ret=0
  fi
  ;;
udevordir)
  if (( $+opt_args[-a] )); then
    _message "no device or directory with option \`-a'"
  else
    local dev_tmp mp_tmp

    tmp=( "${(@f)$(< /etc/mtab)}" )
    dev_tmp=( "${(@)${(@)tmp%% *}:#none}" )
    mp_tmp=( "${(@)${(@)tmp#* }%% *}" )

    _alternative \
        'devices:device:compadd - $dev_tmp[@]' \
	'directories:mount point:compadd - $mp_tmp[@]' && ret=0
  fi
  ;;
esac

return ret