summary refs log tree commit diff
path: root/Completion/User/_mount
blob: cbd762583df6ee756bca729d9730b1d292fa5911 (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
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
#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 typeops=-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
  aix*)
    _fs_any=(
      'bsy[prevent mount over cwd of process]'
      'log[logical volume to log operations]:logical volume name'
      'nodev[cannot open devices from mount]'
      'nosuid[prevent running setuid/setgid from mount]'
      "$_fs_any[@]"
    )
    
    _fs_nfs=(
      '(fg)bg[mount in background]'
      '(bg)fg[mount in foreground]'
      'vers[NFS version]:NFS version:(2 3)'
      'proto[specify transport protocol]'
      'retry[number of retries]:no. of retries'
      'rsize[read buffer size]:read buffer size'
      'wsize[write buffer size]:write buffer size'
      'llock[local locking]'
      'timeo[time-out period]:time-out period'
      'retrans[NFS transmissions]:no. of NFS transmissions'
      'port[IP port no]:IP port no'
      '(hard)soft[error on no server response]'
      '(soft)hard[retry pending server response]'
      '(nointr)intr[allow keyboard interrupts on hard mount]'
      '(intr)nointr[disallow keyboard interrupts on hard mount]'
      'posix[exchange pathconf info on NFS version 2 mount]'
      'secure[use DES encryption]'
      'grpid[inherit group id of parent directory]'
      '(acl)noacl[don'"'"'t use access control lists]'
      '(noacl)acl[Use acces control lists for this mount]'
      'noac[no attribute or directory caching]'
      'shortdev[server lack support for 32-bit device special files]'
      "$_nfs_access[@]"
    )
    ;;
  irix*)
    _fs_any=(
      'nodev[cannot open devices from mount]'
      'nosuid[prevent running setuid/setgid from mount]'
      'grpid[inherit group id of parent directory]'
      "$_fs_any[@]"
    )
    
    _fs_efs=(
      'raw[raw device pathname to filesystem]:raw device pathname:->devordir'
      '(nofsck)fsck[fsck should check this filesystem by default]'
      '(fsck)nofsck[fsck should not check this filesystem by default]'
      '(noquota)quota[turn on quotas]'
      '(quota)noquota[turn off quotas]'
      'lbsize[no of bytes transferred in each operation]:bytes'
    )
    
    _fs_iso9660=(
      'setx[set execute permissions on every file]'
      'notranslate[don'\''t translate filenames]'
      'cache[no of 2048 blocks for directory cache]:cache size'
      'noext[ignore rock ridge extensions]'
      '(nosusp)susp[enable system use sharing protocol]'
      '(susp)nosusp[disable system use sharing protocol]'
      '(norrip)rrip[enable rock ridge extensions]'
      '(rrip)norrip[disable rock ridge extensions]'
      'nmconv[specify filename translation]:filename translation:(c l m)'
    )
      
    _fs_nfs=(
      '(fg)bg[mount in background]'
      '(bg)fg[mount in foreground]'
      'retry[number of retries]:no. of retries'
      'rsize[read buffer size]:read buffer size'
      'wsize[write buffer size]:write buffer size'
      'timeo[time-out period]:time-out period'
      'retrans[NFS transmissions]:no. of NFS transmissions'
      'port[IP port no]:IP port no'
      '(hard)soft[error on no server response]'
      '(soft)hard[retry pending server response]'
      'intr[allow keyboard interrupts on hard mount]'
      'noac[no attribute caching]'
      'private[use local locking and do not flush on last close]'
      'symttl[time-to-live of cached symbolic links]:seconds'
      "$_nfs_access[@]"
    )
    
    _fs_cachefs=(
      'backfstype[type of the back file system]:back file system type:(efs nfs iso9660 dos hfs cachefs)'
      'backpath[specify back file system location]:back file system location:_files -/'
      'cachedir[name of the cache directory]:name of cache directory:_files -/'
      'cacheid[cache ID]:cache ID'
      '(write-around)non-shared[cache not shared]'
      '(non-shared)write-around[cache shared]'
      'noconst[disable consistency checking]'
      'local-access[check permissions locally]'
      'purge[purge any cached information]'
      "$_nfs_access[@]"
    ) 
    
    ;;  
  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=(
      '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[disable cache consistency checking]'
      'purge[purge any cached information]'
      '(suid)nosuid[ignore setuid and setgid bits]'
      '(nosuid)suid[use setuid and setgid bits]'
      '(write-around)non-shared[purge cache on writes]'
      '(non-shared)write-around[keep file in cache on writes]'
      "$_nfs_access[@]"
    )
    ;;
  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 [[ "$service" = 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
  aix*)
    args=( -s
      '-a[mount all filesystems in /etc/fstab]'
      '-f[forced mount]'
      '-n[remote node]:remote node:_hosts'
      '-p[mount as removable file system]'
      '-r[mount read-only]'
      '-t[specify file system type]:file system type:->fstype'
      '-o[specify file system options]:file system option:->fsopt'
      '-v[filesystem defined by /etc/vfs]:VfsName'
      ':dev or dir:->devordir'
      ':mount point:_files -/'
    )
    fss=( jfs nfs cdrfs )
    deffs=jfs
    ;;
  irix*)
    args=( -s
      '-a[mount all filesystems in /etc/fstab]'
      '-b[mount all filesystems in /etc/fstab except those listed]:list of directories:_files -/ -S,'
      '-c[check any dirty filesystems before mounting]'
      '-f[fake a new /etc/mtab entry, but don'\''t mount any filesystems]'
      '-h[mount all filesystems associated with host]:hostnames:_hosts'
      '-n[mount filesystem without making entry in /etc/mtab]'
      '-o[specify file system options]:file system option:->fsopt'
      '-p[print list of mounted filesystems in format suitable for /etc/fstab]'
      '-r[mount read-only]'
      '-t[specify file system type]:file system type:->fstype'
      '-v[verbose]'
      '-M[use alternate mtab]:alternate mtab:_files'
      '-P[with -p, prepend prefix to paths]:prefix'
    )
    fss=( efs proc fd nfs iso9660 dos hfs cachefs )
    deffs=efs
    ;;
  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 )
    [[ -r /proc/filesystems ]] &&
        fss=( ${$(</proc/filesystems)#nodev} )
    ;;
  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.

  case "$OSTYPE" in
    aix*)
      args=(
	'-a[unmount all mounted file systems]'
	'-f[force unmount]'
	'-n[remote node]:remote node:_hosts'
	'-t[specify file system type]:file system type:->fstype'
	'*:dev or dir:->udevordir'
      )
    ;;
    irix*)
      args=(
	'-a[unmount all mounted file systems]'
	'-b[unmount all filesystems in /etc/fstab except those listed]:list of directories:_files -/ -S,'
	'-h[unmount all filesystems associated with host]:hostnames:_hosts'
	'-k[kill all processes with files open on filesystems before unmounting]'
	'-t[unmount all filesystems of specified type]:file system type:->fstype'
	'-v[verbose]'
      )
    ;;  
    *)
      args=( \
	'-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'
      )
    ;;
  esac

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

fi

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

  _wanted types expl 'file system type' \
      compadd -qS, -M 'L:|no=' -a 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 "$expl[@]" /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 -a dev_tmp' \
	'directories:mount point:compadd -a mp_tmp' && ret=0
  fi
  ;;
esac

return ret