Hex Artifact Content

Artifact 98d6e1112ef93e01a50cbb00309d1368163aa4a6:


0000: 23 21 20 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20  #! /usr/bin/env 
0010: 74 63 6c 73 68 0a 0a 23 20 43 6f 70 79 72 69 67  tclsh..# Copyrig
0020: 68 74 20 28 63 29 20 32 30 31 34 2d 32 30 31 37  ht (c) 2014-2017
0030: 20 52 6f 79 20 4b 65 65 6e 65 0a 23 20 0a 23 20   Roy Keene.# .# 
0040: 50 65 72 6d 69 73 73 69 6f 6e 20 69 73 20 68 65  Permission is he
0050: 72 65 62 79 20 67 72 61 6e 74 65 64 2c 20 66 72  reby granted, fr
0060: 65 65 20 6f 66 20 63 68 61 72 67 65 2c 20 74 6f  ee of charge, to
0070: 20 61 6e 79 20 70 65 72 73 6f 6e 20 6f 62 74 61   any person obta
0080: 69 6e 69 6e 67 20 61 20 0a 23 20 63 6f 70 79 20  ining a .# copy 
0090: 6f 66 20 74 68 69 73 20 73 6f 66 74 77 61 72 65  of this software
00a0: 20 61 6e 64 20 61 73 73 6f 63 69 61 74 65 64 20   and associated 
00b0: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 69  documentation fi
00c0: 6c 65 73 20 28 74 68 65 20 22 53 6f 66 74 77 61  les (the "Softwa
00d0: 72 65 22 29 2c 20 0a 23 20 74 6f 20 64 65 61 6c  re"), .# to deal
00e0: 20 69 6e 20 74 68 65 20 53 6f 66 74 77 61 72 65   in the Software
00f0: 20 77 69 74 68 6f 75 74 20 72 65 73 74 72 69 63   without restric
0100: 74 69 6f 6e 2c 20 69 6e 63 6c 75 64 69 6e 67 20  tion, including 
0110: 77 69 74 68 6f 75 74 20 6c 69 6d 69 74 61 74 69  without limitati
0120: 6f 6e 20 0a 23 20 74 68 65 20 72 69 67 68 74 73  on .# the rights
0130: 20 74 6f 20 75 73 65 2c 20 63 6f 70 79 2c 20 6d   to use, copy, m
0140: 6f 64 69 66 79 2c 20 6d 65 72 67 65 2c 20 70 75  odify, merge, pu
0150: 62 6c 69 73 68 2c 20 64 69 73 74 72 69 62 75 74  blish, distribut
0160: 65 2c 20 73 75 62 6c 69 63 65 6e 73 65 2c 20 0a  e, sublicense, .
0170: 23 20 61 6e 64 2f 6f 72 20 73 65 6c 6c 20 63 6f  # and/or sell co
0180: 70 69 65 73 20 6f 66 20 74 68 65 20 53 6f 66 74  pies of the Soft
0190: 77 61 72 65 2c 20 61 6e 64 20 74 6f 20 70 65 72  ware, and to per
01a0: 6d 69 74 20 70 65 72 73 6f 6e 73 20 74 6f 20 77  mit persons to w
01b0: 68 6f 6d 20 74 68 65 20 0a 23 20 53 6f 66 74 77  hom the .# Softw
01c0: 61 72 65 20 69 73 20 66 75 72 6e 69 73 68 65 64  are is furnished
01d0: 20 74 6f 20 64 6f 20 73 6f 2c 20 73 75 62 6a 65   to do so, subje
01e0: 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  ct to the follow
01f0: 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a  ing conditions:.
0200: 23 20 0a 23 20 54 68 65 20 61 62 6f 76 65 20 63  # .# The above c
0210: 6f 70 79 72 69 67 68 74 20 6e 6f 74 69 63 65 20  opyright notice 
0220: 61 6e 64 20 74 68 69 73 20 70 65 72 6d 69 73 73  and this permiss
0230: 69 6f 6e 20 6e 6f 74 69 63 65 20 73 68 61 6c 6c  ion notice shall
0240: 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   be included in 
0250: 0a 23 20 61 6c 6c 20 63 6f 70 69 65 73 20 6f 72  .# all copies or
0260: 20 73 75 62 73 74 61 6e 74 69 61 6c 20 70 6f 72   substantial por
0270: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 53 6f 66  tions of the Sof
0280: 74 77 61 72 65 2e 0a 23 20 0a 23 20 54 48 45 20  tware..# .# THE 
0290: 53 4f 46 54 57 41 52 45 20 49 53 20 50 52 4f 56  SOFTWARE IS PROV
02a0: 49 44 45 44 20 22 41 53 20 49 53 22 2c 20 57 49  IDED "AS IS", WI
02b0: 54 48 4f 55 54 20 57 41 52 52 41 4e 54 59 20 4f  THOUT WARRANTY O
02c0: 46 20 41 4e 59 20 4b 49 4e 44 2c 20 45 58 50 52  F ANY KIND, EXPR
02d0: 45 53 53 20 4f 52 20 0a 23 20 49 4d 50 4c 49 45  ESS OR .# IMPLIE
02e0: 44 2c 20 49 4e 43 4c 55 44 49 4e 47 20 42 55 54  D, INCLUDING BUT
02f0: 20 4e 4f 54 20 4c 49 4d 49 54 45 44 20 54 4f 20   NOT LIMITED TO 
0300: 54 48 45 20 57 41 52 52 41 4e 54 49 45 53 20 4f  THE WARRANTIES O
0310: 46 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  F MERCHANTABILIT
0320: 59 2c 20 0a 23 20 46 49 54 4e 45 53 53 20 46 4f  Y, .# FITNESS FO
0330: 52 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50  R A PARTICULAR P
0340: 55 52 50 4f 53 45 20 41 4e 44 20 4e 4f 4e 49 4e  URPOSE AND NONIN
0350: 46 52 49 4e 47 45 4d 45 4e 54 2e 20 49 4e 20 4e  FRINGEMENT. IN N
0360: 4f 20 45 56 45 4e 54 20 53 48 41 4c 4c 20 0a 23  O EVENT SHALL .#
0370: 20 54 48 45 20 41 55 54 48 4f 52 53 20 4f 52 20   THE AUTHORS OR 
0380: 43 4f 50 59 52 49 47 48 54 20 48 4f 4c 44 45 52  COPYRIGHT HOLDER
0390: 53 20 42 45 20 4c 49 41 42 4c 45 20 46 4f 52 20  S BE LIABLE FOR 
03a0: 41 4e 59 20 43 4c 41 49 4d 2c 20 44 41 4d 41 47  ANY CLAIM, DAMAG
03b0: 45 53 20 4f 52 20 4f 54 48 45 52 20 0a 23 20 4c  ES OR OTHER .# L
03c0: 49 41 42 49 4c 49 54 59 2c 20 57 48 45 54 48 45  IABILITY, WHETHE
03d0: 52 20 49 4e 20 41 4e 20 41 43 54 49 4f 4e 20 4f  R IN AN ACTION O
03e0: 46 20 43 4f 4e 54 52 41 43 54 2c 20 54 4f 52 54  F CONTRACT, TORT
03f0: 20 4f 52 20 4f 54 48 45 52 57 49 53 45 2c 20 41   OR OTHERWISE, A
0400: 52 49 53 49 4e 47 20 0a 23 20 46 52 4f 4d 2c 20  RISING .# FROM, 
0410: 4f 55 54 20 4f 46 20 4f 52 20 49 4e 20 43 4f 4e  OUT OF OR IN CON
0420: 4e 45 43 54 49 4f 4e 20 57 49 54 48 20 54 48 45  NECTION WITH THE
0430: 20 53 4f 46 54 57 41 52 45 20 4f 52 20 54 48 45   SOFTWARE OR THE
0440: 20 55 53 45 20 4f 52 20 4f 54 48 45 52 20 0a 23   USE OR OTHER .#
0450: 20 44 45 41 4c 49 4e 47 53 20 49 4e 20 54 48 45   DEALINGS IN THE
0460: 20 53 4f 46 54 57 41 52 45 2e 0a 0a 6e 61 6d 65   SOFTWARE...name
0470: 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 74 75 61  space eval ::tua
0480: 70 69 20 7b 7d 0a 6e 61 6d 65 73 70 61 63 65 20  pi {}.namespace 
0490: 65 76 61 6c 20 3a 3a 74 75 61 70 69 3a 3a 68 65  eval ::tuapi::he
04a0: 6c 70 65 72 20 7b 7d 0a 6e 61 6d 65 73 70 61 63  lper {}.namespac
04b0: 65 20 65 76 61 6c 20 3a 3a 74 75 61 70 69 3a 3a  e eval ::tuapi::
04c0: 63 61 63 68 65 20 7b 7d 0a 0a 73 65 74 20 3a 3a  cache {}..set ::
04d0: 74 75 61 70 69 3a 3a 5f 6d 6f 75 6e 74 5f 66 6c  tuapi::_mount_fl
04e0: 61 67 73 28 62 69 6e 64 29 20 42 49 4e 44 0a 73  ags(bind) BIND.s
04f0: 65 74 20 3a 3a 74 75 61 70 69 3a 3a 5f 6d 6f 75  et ::tuapi::_mou
0500: 6e 74 5f 66 6c 61 67 73 28 6d 6f 76 65 29 20 4d  nt_flags(move) M
0510: 4f 56 45 0a 73 65 74 20 3a 3a 74 75 61 70 69 3a  OVE.set ::tuapi:
0520: 3a 5f 6d 6f 75 6e 74 5f 66 6c 61 67 73 28 72 65  :_mount_flags(re
0530: 6d 6f 75 6e 74 29 20 52 45 4d 4f 55 4e 54 0a 73  mount) REMOUNT.s
0540: 65 74 20 3a 3a 74 75 61 70 69 3a 3a 5f 6d 6f 75  et ::tuapi::_mou
0550: 6e 74 5f 66 6c 61 67 73 28 6d 61 6e 64 6c 6f 63  nt_flags(mandloc
0560: 6b 29 20 4d 41 4e 44 4c 4f 43 4b 0a 73 65 74 20  k) MANDLOCK.set 
0570: 3a 3a 74 75 61 70 69 3a 3a 5f 6d 6f 75 6e 74 5f  ::tuapi::_mount_
0580: 66 6c 61 67 73 28 64 69 72 73 79 6e 63 29 20 44  flags(dirsync) D
0590: 49 52 53 59 4e 43 0a 73 65 74 20 3a 3a 74 75 61  IRSYNC.set ::tua
05a0: 70 69 3a 3a 5f 6d 6f 75 6e 74 5f 66 6c 61 67 73  pi::_mount_flags
05b0: 28 6e 6f 61 74 69 6d 65 29 20 4e 4f 41 54 49 4d  (noatime) NOATIM
05c0: 45 0a 73 65 74 20 3a 3a 74 75 61 70 69 3a 3a 5f  E.set ::tuapi::_
05d0: 6d 6f 75 6e 74 5f 66 6c 61 67 73 28 6e 6f 64 69  mount_flags(nodi
05e0: 72 61 74 69 6d 65 29 20 4e 4f 44 49 52 41 54 49  ratime) NODIRATI
05f0: 4d 45 0a 73 65 74 20 3a 3a 74 75 61 70 69 3a 3a  ME.set ::tuapi::
0600: 5f 6d 6f 75 6e 74 5f 66 6c 61 67 73 28 72 65 6c  _mount_flags(rel
0610: 61 74 69 6d 65 29 20 52 45 4c 41 54 49 4d 45 0a  atime) RELATIME.
0620: 73 65 74 20 3a 3a 74 75 61 70 69 3a 3a 5f 6d 6f  set ::tuapi::_mo
0630: 75 6e 74 5f 66 6c 61 67 73 28 73 74 72 69 63 74  unt_flags(strict
0640: 61 74 69 6d 65 29 20 53 54 52 49 43 54 41 54 49  atime) STRICTATI
0650: 4d 45 0a 73 65 74 20 3a 3a 74 75 61 70 69 3a 3a  ME.set ::tuapi::
0660: 5f 6d 6f 75 6e 74 5f 66 6c 61 67 73 28 6e 6f 64  _mount_flags(nod
0670: 65 76 29 20 4e 4f 44 45 56 0a 73 65 74 20 3a 3a  ev) NODEV.set ::
0680: 74 75 61 70 69 3a 3a 5f 6d 6f 75 6e 74 5f 66 6c  tuapi::_mount_fl
0690: 61 67 73 28 6e 6f 65 78 65 63 29 20 4e 4f 45 58  ags(noexec) NOEX
06a0: 45 43 0a 73 65 74 20 3a 3a 74 75 61 70 69 3a 3a  EC.set ::tuapi::
06b0: 5f 6d 6f 75 6e 74 5f 66 6c 61 67 73 28 6e 6f 73  _mount_flags(nos
06c0: 75 69 64 29 20 4e 4f 53 55 49 44 0a 73 65 74 20  uid) NOSUID.set 
06d0: 3a 3a 74 75 61 70 69 3a 3a 5f 6d 6f 75 6e 74 5f  ::tuapi::_mount_
06e0: 66 6c 61 67 73 28 72 6f 29 20 52 44 4f 4e 4c 59  flags(ro) RDONLY
06f0: 0a 73 65 74 20 3a 3a 74 75 61 70 69 3a 3a 5f 6d  .set ::tuapi::_m
0700: 6f 75 6e 74 5f 66 6c 61 67 73 28 73 69 6c 65 6e  ount_flags(silen
0710: 74 29 20 53 49 4c 45 4e 54 0a 73 65 74 20 3a 3a  t) SILENT.set ::
0720: 74 75 61 70 69 3a 3a 5f 6d 6f 75 6e 74 5f 66 6c  tuapi::_mount_fl
0730: 61 67 73 28 73 79 6e 63 68 72 6f 6e 6f 75 73 29  ags(synchronous)
0740: 20 53 59 4e 43 48 52 4f 4e 4f 55 53 0a 73 65 74   SYNCHRONOUS.set
0750: 20 3a 3a 74 75 61 70 69 3a 3a 5f 6d 6f 75 6e 74   ::tuapi::_mount
0760: 5f 66 6c 61 67 73 28 73 79 6e 63 29 20 53 59 4e  _flags(sync) SYN
0770: 43 48 52 4f 4e 4f 55 53 0a 0a 0a 23 20 44 65 74  CHRONOUS...# Det
0780: 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74 6f 20  ermine where to 
0790: 6d 6f 75 6e 74 20 61 20 67 69 76 65 6e 20 64 65  mount a given de
07a0: 76 69 63 65 20 28 75 73 75 61 6c 6c 79 20 62 79  vice (usually by
07b0: 20 63 68 65 63 6b 69 6e 67 20 22 2f 65 74 63 2f   checking "/etc/
07c0: 66 73 74 61 62 22 29 0a 70 72 6f 63 20 3a 3a 74  fstab").proc ::t
07d0: 75 61 70 69 3a 3a 68 65 6c 70 65 72 3a 3a 66 69  uapi::helper::fi
07e0: 6e 64 5f 6d 6f 75 6e 74 70 6f 69 6e 74 20 7b 64  nd_mountpoint {d
07f0: 65 76 69 63 65 7d 20 7b 0a 09 73 65 74 20 64 61  evice} {..set da
0800: 74 61 20 22 22 0a 09 63 61 74 63 68 20 7b 0a 09  ta ""..catch {..
0810: 09 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 22 2f  .set fd [open "/
0820: 65 74 63 2f 66 73 74 61 62 22 5d 0a 09 09 73 65  etc/fstab"]...se
0830: 74 20 64 61 74 61 20 5b 72 65 61 64 20 2d 6e 6f  t data [read -no
0840: 6e 65 77 6c 69 6e 65 20 24 66 64 5d 0a 09 09 63  newline $fd]...c
0850: 6c 6f 73 65 20 24 66 64 0a 09 7d 0a 0a 09 66 6f  lose $fd..}...fo
0860: 72 65 61 63 68 20 6c 69 6e 65 20 5b 73 70 6c 69  reach line [spli
0870: 74 20 24 64 61 74 61 20 22 5c 6e 22 5d 20 7b 0a  t $data "\n"] {.
0880: 09 09 73 65 74 20 6c 69 6e 65 20 5b 73 74 72 69  ..set line [stri
0890: 6e 67 20 74 72 69 6d 20 5b 72 65 67 73 75 62 20  ng trim [regsub 
08a0: 7b 23 2e 2a 24 7d 20 24 6c 69 6e 65 20 22 22 5d  {#.*$} $line ""]
08b0: 5d 0a 09 09 73 65 74 20 6c 69 6e 65 20 5b 72 65  ]...set line [re
08c0: 67 73 75 62 20 2d 61 6c 6c 20 7b 5b 20 5c 74 5d  gsub -all {[ \t]
08d0: 5b 20 5c 74 5d 5b 20 5c 74 5d 2a 7d 20 24 6c 69  [ \t][ \t]*} $li
08e0: 6e 65 20 22 20 22 5d 0a 0a 09 09 73 65 74 20 77  ne " "]....set w
08f0: 6f 72 6b 20 5b 73 70 6c 69 74 20 24 6c 69 6e 65  ork [split $line
0900: 5d 0a 0a 09 09 73 65 74 20 63 75 72 72 5f 64 65  ]....set curr_de
0910: 76 69 63 65 20 20 20 20 20 5b 6c 69 6e 64 65 78  vice     [lindex
0920: 20 24 77 6f 72 6b 20 30 5d 0a 09 09 73 65 74 20   $work 0]...set 
0930: 63 75 72 72 5f 6d 6f 75 6e 74 70 6f 69 6e 74 20  curr_mountpoint 
0940: 5b 6c 69 6e 64 65 78 20 24 77 6f 72 6b 20 31 5d  [lindex $work 1]
0950: 0a 09 09 73 65 74 20 63 75 72 72 5f 66 73 74 79  ...set curr_fsty
0960: 70 65 20 20 20 20 20 5b 6c 69 6e 64 65 78 20 24  pe     [lindex $
0970: 77 6f 72 6b 20 32 5d 0a 09 09 73 65 74 20 63 75  work 2]...set cu
0980: 72 72 5f 6f 70 74 73 20 20 20 20 20 20 20 5b 73  rr_opts       [s
0990: 70 6c 69 74 20 5b 6c 69 6e 64 65 78 20 24 77 6f  plit [lindex $wo
09a0: 72 6b 20 33 5d 20 22 2c 22 5d 0a 09 09 73 65 74  rk 3] ","]...set
09b0: 20 63 75 72 72 5f 64 75 6d 70 66 72 65 71 20 20   curr_dumpfreq  
09c0: 20 5b 6c 69 6e 64 65 78 20 24 77 6f 72 6b 20 34   [lindex $work 4
09d0: 5d 0a 09 09 73 65 74 20 63 75 72 72 5f 66 73 63  ]...set curr_fsc
09e0: 6b 70 61 73 73 20 20 20 5b 6c 69 6e 64 65 78 20  kpass   [lindex 
09f0: 24 77 6f 72 6b 20 35 5d 0a 0a 0a 09 09 69 66 20  $work 5].....if 
0a00: 7b 24 63 75 72 72 5f 64 65 76 69 63 65 20 3d 3d  {$curr_device ==
0a10: 20 24 64 65 76 69 63 65 20 7c 7c 20 24 63 75 72   $device || $cur
0a20: 72 5f 6d 6f 75 6e 74 70 6f 69 6e 74 20 3d 3d 20  r_mountpoint == 
0a30: 24 64 65 76 69 63 65 7d 20 7b 0a 09 09 09 72 65  $device} {....re
0a40: 74 75 72 6e 20 5b 6c 69 73 74 20 73 6f 75 72 63  turn [list sourc
0a50: 65 20 24 63 75 72 72 5f 64 65 76 69 63 65 20 74  e $curr_device t
0a60: 61 72 67 65 74 20 24 63 75 72 72 5f 6d 6f 75 6e  arget $curr_moun
0a70: 74 70 6f 69 6e 74 20 66 73 74 79 70 65 20 24 63  tpoint fstype $c
0a80: 75 72 72 5f 66 73 74 79 70 65 20 6f 70 74 69 6f  urr_fstype optio
0a90: 6e 73 20 24 63 75 72 72 5f 6f 70 74 73 20 64 75  ns $curr_opts du
0aa0: 6d 70 66 72 65 71 20 24 63 75 72 72 5f 64 75 6d  mpfreq $curr_dum
0ab0: 70 66 72 65 71 20 66 73 63 6b 70 61 73 73 20 24  pfreq fsckpass $
0ac0: 63 75 72 72 5f 66 73 63 6b 70 61 73 73 5d 0a 09  curr_fsckpass]..
0ad0: 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20 2d  .}..}...return -
0ae0: 63 6f 64 65 20 65 72 72 6f 72 20 22 6e 6f 20 65  code error "no e
0af0: 6e 74 72 79 20 66 6f 75 6e 64 20 69 6e 20 5c 22  ntry found in \"
0b00: 2f 65 74 63 2f 66 73 74 61 62 5c 22 20 66 6f 72  /etc/fstab\" for
0b10: 20 5c 22 24 64 65 76 69 63 65 5c 22 22 0a 7d 0a   \"$device\"".}.
0b20: 0a 70 72 6f 63 20 3a 3a 74 75 61 70 69 3a 3a 6d  .proc ::tuapi::m
0b30: 6f 75 6e 74 20 61 72 67 73 20 7b 0a 09 73 65 74  ount args {..set
0b40: 20 6f 70 74 69 6f 6e 73 5f 6c 69 73 74 20 5b 6c   options_list [l
0b50: 69 73 74 5d 0a 0a 09 66 6f 72 20 7b 73 65 74 20  ist]...for {set 
0b60: 69 64 78 20 30 7d 20 7b 24 69 64 78 20 3c 20 5b  idx 0} {$idx < [
0b70: 6c 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 7d 20  llength $args]} 
0b80: 7b 69 6e 63 72 20 69 64 78 7d 20 7b 0a 09 09 73  {incr idx} {...s
0b90: 65 74 20 63 75 72 72 5f 61 72 67 20 5b 6c 69 6e  et curr_arg [lin
0ba0: 64 65 78 20 24 61 72 67 73 20 24 69 64 78 5d 0a  dex $args $idx].
0bb0: 0a 09 09 73 77 69 74 63 68 20 2d 67 6c 6f 62 20  ...switch -glob 
0bc0: 2d 2d 20 24 63 75 72 72 5f 61 72 67 20 7b 0a 09  -- $curr_arg {..
0bd0: 09 09 22 2d 74 22 20 7b 0a 09 09 09 09 69 6e 63  .."-t" {.....inc
0be0: 72 20 69 64 78 0a 09 09 09 09 73 65 74 20 66 73  r idx.....set fs
0bf0: 74 79 70 65 20 5b 6c 69 6e 64 65 78 20 24 61 72  type [lindex $ar
0c00: 67 73 20 24 69 64 78 5d 0a 09 09 09 7d 0a 09 09  gs $idx]....}...
0c10: 09 22 2d 72 22 20 7b 0a 09 09 09 09 6c 61 70 70  ."-r" {.....lapp
0c20: 65 6e 64 20 6f 70 74 69 6f 6e 73 5f 6c 69 73 74  end options_list
0c30: 20 22 52 44 4f 4e 4c 59 22 0a 09 09 09 7d 0a 09   "RDONLY"....}..
0c40: 09 09 22 2d 77 22 20 7b 0a 09 09 09 09 73 65 74  .."-w" {.....set
0c50: 20 69 64 78 20 5b 6c 73 65 61 72 63 68 20 2d 65   idx [lsearch -e
0c60: 78 61 63 74 20 24 6f 70 74 69 6f 6e 73 5f 6c 69  xact $options_li
0c70: 73 74 20 22 52 44 4f 4e 4c 59 22 5d 0a 09 09 09  st "RDONLY"]....
0c80: 09 69 66 20 7b 24 69 64 78 20 21 3d 20 2d 31 7d  .if {$idx != -1}
0c90: 20 7b 0a 09 09 09 09 09 73 65 74 20 6f 70 74 69   {......set opti
0ca0: 6f 6e 73 5f 6c 69 73 74 20 5b 6c 72 65 70 6c 61  ons_list [lrepla
0cb0: 63 65 20 24 6f 70 74 69 6f 6e 73 5f 6c 69 73 74  ce $options_list
0cc0: 20 24 69 64 78 20 24 69 64 78 5d 0a 09 09 09 09   $idx $idx].....
0cd0: 7d 0a 09 09 09 7d 0a 09 09 09 22 2d 6f 22 20 7b  }....}...."-o" {
0ce0: 0a 09 09 09 09 69 6e 63 72 20 69 64 78 0a 09 09  .....incr idx...
0cf0: 09 09 73 65 74 20 6f 70 74 69 6f 6e 73 20 5b 6c  ..set options [l
0d00: 69 6e 64 65 78 20 24 61 72 67 73 20 24 69 64 78  index $args $idx
0d10: 5d 0a 09 09 09 7d 0a 09 09 09 22 2d 2d 22 20 7b  ]....}...."--" {
0d20: 0a 09 09 09 09 69 6e 63 72 20 69 64 78 0a 0a 09  .....incr idx...
0d30: 09 09 09 62 72 65 61 6b 0a 09 09 09 7d 0a 09 09  ...break....}...
0d40: 09 22 2d 2a 22 20 7b 0a 09 09 09 09 72 65 74 75  ."-*" {.....retu
0d50: 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22  rn -code error "
0d60: 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c  unknown option \
0d70: 22 24 63 75 72 72 5f 61 72 67 5c 22 22 0a 09 09  "$curr_arg\""...
0d80: 09 7d 0a 09 09 09 64 65 66 61 75 6c 74 20 7b 0a  .}....default {.
0d90: 09 09 09 09 62 72 65 61 6b 0a 09 09 09 7d 0a 09  ....break....}..
0da0: 09 7d 0a 09 7d 0a 0a 09 73 65 74 20 61 72 67 73  .}..}...set args
0db0: 20 5b 6c 72 61 6e 67 65 20 24 61 72 67 73 20 24   [lrange $args $
0dc0: 69 64 78 20 65 6e 64 5d 0a 0a 09 69 66 20 7b 5b  idx end]...if {[
0dd0: 6c 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 20 3c  llength $args] <
0de0: 20 31 20 7c 7c 20 5b 6c 6c 65 6e 67 74 68 20 24   1 || [llength $
0df0: 61 72 67 73 5d 20 3e 20 32 7d 20 7b 0a 09 09 72  args] > 2} {...r
0e00: 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f  eturn -code erro
0e10: 72 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  r "wrong # args:
0e20: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 3a 3a 74   should be \"::t
0e30: 75 61 70 69 3a 3a 6d 6f 75 6e 74 20 3f 6f 70 74  uapi::mount ?opt
0e40: 69 6f 6e 73 3f 20 73 6f 75 72 63 65 20 3f 74 61  ions? source ?ta
0e50: 72 67 65 74 3f 5c 22 22 0a 09 7d 0a 0a 09 73 65  rget?\""..}...se
0e60: 74 20 73 6f 75 72 63 65 20 5b 6c 69 6e 64 65 78  t source [lindex
0e70: 20 24 61 72 67 73 20 30 5d 0a 0a 09 69 66 20 7b   $args 0]...if {
0e80: 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 20  [llength $args] 
0e90: 3d 3d 20 32 7d 20 7b 0a 09 09 73 65 74 20 74 61  == 2} {...set ta
0ea0: 72 67 65 74 20 5b 6c 69 6e 64 65 78 20 24 61 72  rget [lindex $ar
0eb0: 67 73 20 31 5d 0a 09 7d 20 65 6c 73 65 20 7b 0a  gs 1]..} else {.
0ec0: 09 09 61 72 72 61 79 20 73 65 74 20 6d 6f 75 6e  ..array set moun
0ed0: 74 69 6e 66 6f 20 5b 3a 3a 74 75 61 70 69 3a 3a  tinfo [::tuapi::
0ee0: 68 65 6c 70 65 72 3a 3a 66 69 6e 64 5f 6d 6f 75  helper::find_mou
0ef0: 6e 74 70 6f 69 6e 74 20 24 73 6f 75 72 63 65 5d  ntpoint $source]
0f00: 0a 09 09 73 65 74 20 73 6f 75 72 63 65 20 24 6d  ...set source $m
0f10: 6f 75 6e 74 69 6e 66 6f 28 73 6f 75 72 63 65 29  ountinfo(source)
0f20: 0a 09 09 73 65 74 20 74 61 72 67 65 74 20 24 6d  ...set target $m
0f30: 6f 75 6e 74 69 6e 66 6f 28 74 61 72 67 65 74 29  ountinfo(target)
0f40: 0a 0a 09 09 69 66 20 7b 21 5b 69 6e 66 6f 20 65  ....if {![info e
0f50: 78 69 73 74 73 20 66 73 74 79 70 65 5d 7d 20 7b  xists fstype]} {
0f60: 0a 09 09 09 73 65 74 20 66 73 74 79 70 65 20 24  ....set fstype $
0f70: 6d 6f 75 6e 74 69 6e 66 6f 28 66 73 74 79 70 65  mountinfo(fstype
0f80: 29 0a 09 09 7d 0a 0a 09 09 69 66 20 7b 21 5b 69  )...}....if {![i
0f90: 6e 66 6f 20 65 78 69 73 74 73 20 6f 70 74 69 6f  nfo exists optio
0fa0: 6e 73 5d 7d 20 7b 0a 09 09 09 73 65 74 20 6f 70  ns]} {....set op
0fb0: 74 69 6f 6e 73 20 24 6d 6f 75 6e 74 69 6e 66 6f  tions $mountinfo
0fc0: 28 6f 70 74 69 6f 6e 73 29 0a 09 09 7d 0a 09 7d  (options)...}..}
0fd0: 0a 0a 09 23 20 45 6e 73 75 72 65 20 61 6c 6c 20  ...# Ensure all 
0fe0: 6d 6f 75 6e 74 2d 72 65 6c 61 74 65 64 20 70 61  mount-related pa
0ff0: 72 61 6d 65 74 65 72 73 20 68 61 76 65 20 62 65  rameters have be
1000: 65 6e 20 63 6f 6d 70 75 74 65 64 0a 09 69 66 20  en computed..if 
1010: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 66  {![info exists f
1020: 73 74 79 70 65 5d 7d 20 7b 0a 09 09 73 65 74 20  stype]} {...set 
1030: 66 73 74 79 70 65 20 22 61 75 74 6f 22 0a 09 7d  fstype "auto"..}
1040: 0a 0a 09 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78  ...if {![info ex
1050: 69 73 74 73 20 6f 70 74 69 6f 6e 73 5d 7d 20 7b  ists options]} {
1060: 0a 09 09 73 65 74 20 6f 70 74 69 6f 6e 73 20 5b  ...set options [
1070: 6c 69 73 74 5d 0a 09 7d 0a 0a 09 23 20 50 72 6f  list]..}...# Pro
1080: 63 65 73 73 20 6f 70 74 69 6f 6e 73 0a 09 66 6f  cess options..fo
1090: 72 65 61 63 68 20 6f 70 74 69 6f 6e 20 24 6f 70  reach option $op
10a0: 74 69 6f 6e 73 20 7b 0a 09 09 73 65 74 20 6f 70  tions {...set op
10b0: 74 69 6f 6e 5f 6c 63 20 5b 73 74 72 69 6e 67 20  tion_lc [string 
10c0: 74 6f 6c 6f 77 65 72 20 24 6f 70 74 69 6f 6e 5d  tolower $option]
10d0: 0a 0a 09 09 23 20 53 70 65 63 69 61 6c 20 6f 70  ....# Special op
10e0: 74 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 0a 09 09  tion handling...
10f0: 73 77 69 74 63 68 20 2d 2d 20 24 6f 70 74 69 6f  switch -- $optio
1100: 6e 5f 6c 63 20 7b 0a 09 09 09 22 64 65 66 61 75  n_lc {...."defau
1110: 6c 74 73 22 20 7b 0a 09 09 09 09 73 65 74 20 6f  lts" {.....set o
1120: 70 74 69 6f 6e 73 5f 6c 69 73 74 20 5b 6c 69 73  ptions_list [lis
1130: 74 5d 0a 09 09 09 09 75 6e 73 65 74 20 2d 6e 6f  t].....unset -no
1140: 63 6f 6d 70 6c 61 69 6e 20 75 6e 6b 6e 6f 77 6e  complain unknown
1150: 5f 6f 70 74 69 6f 6e 73 0a 0a 09 09 09 09 63 6f  _options......co
1160: 6e 74 69 6e 75 65 0a 09 09 09 7d 0a 09 09 09 22  ntinue....}...."
1170: 72 77 22 20 7b 0a 09 09 09 09 73 65 74 20 6f 70  rw" {.....set op
1180: 74 69 6f 6e 5f 6c 63 20 22 6e 6f 72 6f 22 0a 09  tion_lc "noro"..
1190: 09 09 7d 0a 09 09 09 22 6e 6f 72 77 22 20 7b 0a  ..}...."norw" {.
11a0: 09 09 09 09 73 65 74 20 6f 70 74 69 6f 6e 5f 6c  ....set option_l
11b0: 63 20 22 72 6f 22 0a 09 09 09 7d 0a 09 09 7d 0a  c "ro"....}...}.
11c0: 0a 09 09 23 20 45 78 61 6d 70 6c 65 3a 20 6e 6f  ...# Example: no
11d0: 61 74 69 6d 65 0a 09 09 69 66 20 7b 5b 69 6e 66  atime...if {[inf
11e0: 6f 20 65 78 69 73 74 73 20 3a 3a 74 75 61 70 69  o exists ::tuapi
11f0: 3a 3a 5f 6d 6f 75 6e 74 5f 66 6c 61 67 73 28 24  ::_mount_flags($
1200: 6f 70 74 69 6f 6e 5f 6c 63 29 5d 7d 20 7b 0a 09  option_lc)]} {..
1210: 09 09 6c 61 70 70 65 6e 64 20 6f 70 74 69 6f 6e  ..lappend option
1220: 73 5f 6c 69 73 74 20 24 3a 3a 74 75 61 70 69 3a  s_list $::tuapi:
1230: 3a 5f 6d 6f 75 6e 74 5f 66 6c 61 67 73 28 24 6f  :_mount_flags($o
1240: 70 74 69 6f 6e 5f 6c 63 29 0a 0a 09 09 09 63 6f  ption_lc).....co
1250: 6e 74 69 6e 75 65 0a 09 09 7d 0a 0a 09 09 23 20  ntinue...}....# 
1260: 45 78 61 6d 70 6c 65 3a 20 61 74 69 6d 65 0a 09  Example: atime..
1270: 09 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  .if {[info exist
1280: 73 20 3a 3a 74 75 61 70 69 3a 3a 5f 6d 6f 75 6e  s ::tuapi::_moun
1290: 74 5f 66 6c 61 67 73 28 6e 6f 24 6f 70 74 69 6f  t_flags(no$optio
12a0: 6e 5f 6c 63 29 5d 7d 20 7b 0a 09 09 09 73 65 74  n_lc)]} {....set
12b0: 20 69 64 78 20 5b 6c 73 65 61 72 63 68 20 2d 65   idx [lsearch -e
12c0: 78 61 63 74 20 24 6f 70 74 69 6f 6e 73 5f 6c 69  xact $options_li
12d0: 73 74 20 24 3a 3a 74 75 61 70 69 3a 3a 5f 6d 6f  st $::tuapi::_mo
12e0: 75 6e 74 5f 66 6c 61 67 73 28 6e 6f 24 6f 70 74  unt_flags(no$opt
12f0: 69 6f 6e 5f 6c 63 29 5d 0a 09 09 09 69 66 20 7b  ion_lc)]....if {
1300: 24 69 64 78 20 21 3d 20 2d 31 7d 20 7b 0a 09 09  $idx != -1} {...
1310: 09 09 73 65 74 20 6f 70 74 69 6f 6e 73 5f 6c 69  ..set options_li
1320: 73 74 20 5b 6c 72 65 70 6c 61 63 65 20 24 6f 70  st [lreplace $op
1330: 74 69 6f 6e 73 5f 6c 69 73 74 20 24 69 64 78 20  tions_list $idx 
1340: 24 69 64 78 5d 0a 09 09 09 7d 0a 0a 09 09 09 63  $idx]....}.....c
1350: 6f 6e 74 69 6e 75 65 0a 09 09 7d 0a 0a 09 09 23  ontinue...}....#
1360: 20 45 78 61 6d 70 6c 65 3a 20 6e 6f 72 65 6c 61   Example: norela
1370: 74 69 6d 65 0a 09 09 69 66 20 7b 5b 73 74 72 69  time...if {[stri
1380: 6e 67 20 6d 61 74 63 68 20 22 6e 6f 2a 22 20 24  ng match "no*" $
1390: 6f 70 74 69 6f 6e 5f 6c 63 5d 7d 20 7b 0a 09 09  option_lc]} {...
13a0: 09 73 65 74 20 6e 65 67 5f 6f 70 74 69 6f 6e 5f  .set neg_option_
13b0: 6c 63 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  lc [string range
13c0: 20 24 6f 70 74 69 6f 6e 5f 6c 63 20 32 20 65 6e   $option_lc 2 en
13d0: 64 5d 0a 0a 09 09 09 69 66 20 7b 5b 69 6e 66 6f  d].....if {[info
13e0: 20 65 78 69 73 74 73 20 3a 3a 74 75 61 70 69 3a   exists ::tuapi:
13f0: 3a 5f 6d 6f 75 6e 74 5f 66 6c 61 67 73 28 24 6e  :_mount_flags($n
1400: 65 67 5f 6f 70 74 69 6f 6e 5f 6c 63 29 5d 7d 20  eg_option_lc)]} 
1410: 7b 0a 09 09 09 09 73 65 74 20 69 64 78 20 5b 6c  {.....set idx [l
1420: 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 24 6f  search -exact $o
1430: 70 74 69 6f 6e 73 5f 6c 69 73 74 20 24 3a 3a 74  ptions_list $::t
1440: 75 61 70 69 3a 3a 5f 6d 6f 75 6e 74 5f 66 6c 61  uapi::_mount_fla
1450: 67 73 28 24 6e 65 67 5f 6f 70 74 69 6f 6e 5f 6c  gs($neg_option_l
1460: 63 29 5d 0a 09 09 09 09 69 66 20 7b 24 69 64 78  c)].....if {$idx
1470: 20 21 3d 20 2d 31 7d 20 7b 0a 09 09 09 09 09 73   != -1} {......s
1480: 65 74 20 6f 70 74 69 6f 6e 73 5f 6c 69 73 74 20  et options_list 
1490: 5b 6c 72 65 70 6c 61 63 65 20 24 6f 70 74 69 6f  [lreplace $optio
14a0: 6e 73 5f 6c 69 73 74 20 24 69 64 78 20 24 69 64  ns_list $idx $id
14b0: 78 5d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 6f  x].....}......co
14c0: 6e 74 69 6e 75 65 0a 09 09 09 7d 0a 09 09 7d 0a  ntinue....}...}.
14d0: 0a 09 09 23 20 41 63 63 75 6d 75 6c 61 74 65 20  ...# Accumulate 
14e0: 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 73 0a  unknown options.
14f0: 09 09 6c 61 70 70 65 6e 64 20 75 6e 6b 6e 6f 77  ..lappend unknow
1500: 6e 5f 6f 70 74 69 6f 6e 73 20 24 6f 70 74 69 6f  n_options $optio
1510: 6e 0a 09 7d 0a 0a 09 23 20 55 73 65 20 22 73 77  n..}...# Use "sw
1520: 61 70 6f 6e 22 20 69 66 20 74 68 69 73 20 69 73  apon" if this is
1530: 20 73 77 61 70 0a 09 69 66 20 7b 24 66 73 74 79   swap..if {$fsty
1540: 70 65 20 3d 3d 20 22 73 77 61 70 22 7d 20 7b 0a  pe == "swap"} {.
1550: 09 09 72 65 74 75 72 6e 20 5b 3a 3a 74 75 61 70  ..return [::tuap
1560: 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 73 77 61 70  i::syscall::swap
1570: 6f 6e 20 24 73 6f 75 72 63 65 5d 0a 09 7d 0a 0a  on $source]..}..
1580: 09 23 20 4f 74 68 65 72 77 69 73 65 2c 20 63 61  .# Otherwise, ca
1590: 6c 6c 20 22 6d 6f 75 6e 74 22 20 73 79 73 74 65  ll "mount" syste
15a0: 6d 20 63 61 6c 6c 0a 09 23 23 20 49 66 20 77 65  m call..## If we
15b0: 20 68 61 76 65 20 61 63 63 75 6d 75 6c 61 74 65   have accumulate
15c0: 64 20 61 6e 79 20 75 6e 6b 6e 6f 77 6e 20 6f 70  d any unknown op
15d0: 74 69 6f 6e 73 2c 20 70 61 73 73 20 74 68 65 6d  tions, pass them
15e0: 20 61 73 20 61 0a 09 23 23 20 63 6f 6d 6d 61 2d   as a..## comma-
15f0: 73 65 70 65 72 61 74 65 64 20 76 61 6c 75 65 20  seperated value 
1600: 73 74 72 69 6e 67 0a 09 69 66 20 7b 5b 69 6e 66  string..if {[inf
1610: 6f 20 65 78 69 73 74 73 20 75 6e 6b 6e 6f 77 6e  o exists unknown
1620: 5f 6f 70 74 69 6f 6e 73 5d 7d 20 7b 0a 09 09 73  _options]} {...s
1630: 65 74 20 64 61 74 61 20 5b 6a 6f 69 6e 20 24 75  et data [join $u
1640: 6e 6b 6e 6f 77 6e 5f 6f 70 74 69 6f 6e 73 20 22  nknown_options "
1650: 2c 22 5d 0a 0a 09 09 72 65 74 75 72 6e 20 5b 3a  ,"]....return [:
1660: 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a  :tuapi::syscall:
1670: 3a 6d 6f 75 6e 74 20 24 73 6f 75 72 63 65 20 24  :mount $source $
1680: 74 61 72 67 65 74 20 24 66 73 74 79 70 65 20 24  target $fstype $
1690: 6f 70 74 69 6f 6e 73 5f 6c 69 73 74 20 24 64 61  options_list $da
16a0: 74 61 5d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20  ta]..}...return 
16b0: 5b 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c  [::tuapi::syscal
16c0: 6c 3a 3a 6d 6f 75 6e 74 20 24 73 6f 75 72 63 65  l::mount $source
16d0: 20 24 74 61 72 67 65 74 20 24 66 73 74 79 70 65   $target $fstype
16e0: 20 24 6f 70 74 69 6f 6e 73 5f 6c 69 73 74 5d 0a   $options_list].
16f0: 7d 0a 0a 70 72 6f 63 20 3a 3a 74 75 61 70 69 3a  }..proc ::tuapi:
1700: 3a 75 6d 6f 75 6e 74 20 7b 64 69 72 20 7b 66 6c  :umount {dir {fl
1710: 61 67 73 20 22 22 7d 7d 20 7b 0a 09 72 65 74 75  ags ""}} {..retu
1720: 72 6e 20 5b 3a 3a 74 75 61 70 69 3a 3a 73 79 73  rn [::tuapi::sys
1730: 63 61 6c 6c 3a 3a 75 6d 6f 75 6e 74 20 24 64 69  call::umount $di
1740: 72 20 5b 73 74 72 69 6e 67 20 74 6f 75 70 70 65  r [string touppe
1750: 72 20 24 66 6c 61 67 73 5d 5d 0a 7d 0a 0a 70 72  r $flags]].}..pr
1760: 6f 63 20 3a 3a 74 75 61 70 69 3a 3a 6b 69 6c 6c  oc ::tuapi::kill
1770: 20 7b 70 69 64 20 73 69 67 7d 20 7b 0a 09 72 65   {pid sig} {..re
1780: 74 75 72 6e 20 5b 3a 3a 74 75 61 70 69 3a 3a 73  turn [::tuapi::s
1790: 79 73 63 61 6c 6c 3a 3a 6b 69 6c 6c 20 24 70 69  yscall::kill $pi
17a0: 64 20 5b 73 74 72 69 6e 67 20 74 6f 75 70 70 65  d [string touppe
17b0: 72 20 24 73 69 67 5d 5d 0a 7d 0a 0a 70 72 6f 63  r $sig]].}..proc
17c0: 20 3a 3a 74 75 61 70 69 3a 3a 6b 69 6c 6c 70 67   ::tuapi::killpg
17d0: 20 7b 70 67 72 6f 75 70 20 73 69 67 7d 20 7b 0a   {pgroup sig} {.
17e0: 09 69 66 20 7b 24 70 67 72 6f 75 70 20 3c 3d 20  .if {$pgroup <= 
17f0: 31 7d 20 7b 0a 09 09 72 65 74 75 72 6e 20 2d 63  1} {...return -c
1800: 6f 64 65 20 65 72 72 6f 72 20 22 69 6e 76 61 6c  ode error "inval
1810: 69 64 20 70 72 6f 63 65 73 73 20 67 72 6f 75 70  id process group
1820: 20 73 70 65 63 69 66 69 65 64 20 28 6d 75 73 74   specified (must
1830: 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
1840: 20 31 29 22 0a 09 7d 0a 0a 09 72 65 74 75 72 6e   1)"..}...return
1850: 20 5b 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61   [::tuapi::sysca
1860: 6c 6c 3a 3a 6b 69 6c 6c 20 2d 24 70 67 72 6f 75  ll::kill -$pgrou
1870: 70 20 5b 73 74 72 69 6e 67 20 74 6f 75 70 70 65  p [string touppe
1880: 72 20 24 73 69 67 5d 5d 0a 7d 0a 0a 70 72 6f 63  r $sig]].}..proc
1890: 20 3a 3a 74 75 61 70 69 3a 3a 69 66 63 6f 6e 66   ::tuapi::ifconf
18a0: 69 67 20 61 72 67 73 20 7b 0a 09 69 66 20 7b 5b  ig args {..if {[
18b0: 6c 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 20 3d  llength $args] =
18c0: 3d 20 30 7d 20 7b 0a 09 09 23 20 52 65 74 75 72  = 0} {...# Retur
18d0: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  n information on
18e0: 20 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 73 0a   all interfaces.
18f0: 09 09 73 65 74 20 72 65 74 6c 69 73 74 20 5b 6c  ..set retlist [l
1900: 69 73 74 5d 0a 09 09 66 6f 72 65 61 63 68 20 69  ist]...foreach i
1910: 6e 74 65 72 66 61 63 65 20 5b 3a 3a 74 75 61 70  nterface [::tuap
1920: 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 69 66 63 6f  i::syscall::ifco
1930: 6e 66 69 67 5d 20 7b 0a 09 09 09 6c 61 70 70 65  nfig] {....lappe
1940: 6e 64 20 72 65 74 6c 69 73 74 20 24 69 6e 74 65  nd retlist $inte
1950: 72 66 61 63 65 20 5b 3a 3a 74 75 61 70 69 3a 3a  rface [::tuapi::
1960: 73 79 73 63 61 6c 6c 3a 3a 69 66 63 6f 6e 66 69  syscall::ifconfi
1970: 67 20 24 69 6e 74 65 72 66 61 63 65 5d 0a 09 09  g $interface]...
1980: 7d 0a 0a 09 09 72 65 74 75 72 6e 20 24 72 65 74  }....return $ret
1990: 6c 69 73 74 0a 09 7d 0a 0a 09 73 65 74 20 69 6e  list..}...set in
19a0: 74 65 72 66 61 63 65 20 5b 6c 69 6e 64 65 78 20  terface [lindex 
19b0: 24 61 72 67 73 20 30 5d 0a 09 73 65 74 20 61 72  $args 0]..set ar
19c0: 67 73 20 5b 6c 72 61 6e 67 65 20 24 61 72 67 73  gs [lrange $args
19d0: 20 31 20 65 6e 64 5d 0a 0a 09 61 72 72 61 79 20   1 end]...array 
19e0: 73 65 74 20 69 66 61 63 65 69 6e 66 6f 20 5b 3a  set ifaceinfo [:
19f0: 3a 74 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a  :tuapi::syscall:
1a00: 3a 69 66 63 6f 6e 66 69 67 20 24 69 6e 74 65 72  :ifconfig $inter
1a10: 66 61 63 65 5d 0a 0a 09 69 66 20 7b 5b 6c 6c 65  face]...if {[lle
1a20: 6e 67 74 68 20 24 61 72 67 73 5d 20 3d 3d 20 30  ngth $args] == 0
1a30: 7d 20 7b 0a 09 09 72 65 74 75 72 6e 20 5b 61 72  } {...return [ar
1a40: 72 61 79 20 67 65 74 20 69 66 61 63 65 69 6e 66  ray get ifaceinf
1a50: 6f 5d 0a 09 7d 0a 0a 09 66 6f 72 20 7b 73 65 74  o]..}...for {set
1a60: 20 69 64 78 20 30 7d 20 7b 24 69 64 78 20 3c 20   idx 0} {$idx < 
1a70: 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 7d  [llength $args]}
1a80: 20 7b 69 6e 63 72 20 69 64 78 7d 20 7b 0a 09 09   {incr idx} {...
1a90: 73 65 74 20 6f 70 74 20 5b 6c 69 6e 64 65 78 20  set opt [lindex 
1aa0: 24 61 72 67 73 20 24 69 64 78 5d 0a 0a 09 09 73  $args $idx]....s
1ab0: 77 69 74 63 68 20 2d 2d 20 24 6f 70 74 20 7b 0a  witch -- $opt {.
1ac0: 09 09 09 22 75 70 22 20 7b 0a 09 09 09 09 69 66  ..."up" {.....if
1ad0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 69   {[info exists i
1ae0: 66 61 63 65 69 6e 66 6f 28 66 6c 61 67 73 29 5d  faceinfo(flags)]
1af0: 7d 20 7b 0a 09 09 09 09 09 73 65 74 20 66 6c 61  } {......set fla
1b00: 67 73 20 24 69 66 61 63 65 69 6e 66 6f 28 66 6c  gs $ifaceinfo(fl
1b10: 61 67 73 29 0a 09 09 09 09 7d 20 65 6c 73 65 20  ags).....} else 
1b20: 7b 0a 09 09 09 09 09 73 65 74 20 66 6c 61 67 73  {......set flags
1b30: 20 22 22 0a 09 09 09 09 7d 0a 0a 09 09 09 09 66   "".....}......f
1b40: 6f 72 65 61 63 68 20 6e 65 77 66 6c 61 67 20 5b  oreach newflag [
1b50: 6c 69 73 74 20 55 50 5d 20 7b 0a 09 09 09 09 09  list UP] {......
1b60: 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78  if {[lsearch -ex
1b70: 61 63 74 20 24 66 6c 61 67 73 20 24 6e 65 77 66  act $flags $newf
1b80: 6c 61 67 5d 20 3d 3d 20 2d 31 7d 20 7b 0a 09 09  lag] == -1} {...
1b90: 09 09 09 09 6c 61 70 70 65 6e 64 20 66 6c 61 67  ....lappend flag
1ba0: 73 20 24 6e 65 77 66 6c 61 67 0a 09 09 09 09 09  s $newflag......
1bb0: 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 3a 3a 74  }.....}......::t
1bc0: 75 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 69  uapi::syscall::i
1bd0: 66 63 6f 6e 66 69 67 20 24 69 6e 74 65 72 66 61  fconfig $interfa
1be0: 63 65 20 66 6c 61 67 73 20 24 66 6c 61 67 73 0a  ce flags $flags.
1bf0: 09 09 09 7d 0a 09 09 09 22 64 6f 77 6e 22 20 7b  ...}...."down" {
1c00: 0a 09 09 09 09 69 66 20 7b 5b 69 6e 66 6f 20 65  .....if {[info e
1c10: 78 69 73 74 73 20 69 66 61 63 65 69 6e 66 6f 28  xists ifaceinfo(
1c20: 66 6c 61 67 73 29 5d 7d 20 7b 0a 09 09 09 09 09  flags)]} {......
1c30: 73 65 74 20 66 6c 61 67 73 20 24 69 66 61 63 65  set flags $iface
1c40: 69 6e 66 6f 28 66 6c 61 67 73 29 0a 09 09 09 09  info(flags).....
1c50: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 73 65  } else {......se
1c60: 74 20 66 6c 61 67 73 20 22 22 0a 09 09 09 09 7d  t flags "".....}
1c70: 0a 0a 09 09 09 09 73 65 74 20 66 6c 61 67 69 64  ......set flagid
1c80: 78 20 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63  x [lsearch -exac
1c90: 74 20 24 66 6c 61 67 73 20 22 55 50 22 5d 0a 09  t $flags "UP"]..
1ca0: 09 09 09 69 66 20 7b 24 66 6c 61 67 69 64 78 20  ...if {$flagidx 
1cb0: 21 3d 20 2d 31 7d 20 7b 0a 09 09 09 09 09 73 65  != -1} {......se
1cc0: 74 20 66 6c 61 67 73 20 5b 6c 72 65 70 6c 61 63  t flags [lreplac
1cd0: 65 20 24 66 6c 61 67 73 20 24 66 6c 61 67 69 64  e $flags $flagid
1ce0: 78 20 24 66 6c 61 67 69 64 78 5d 0a 0a 09 09 09  x $flagidx].....
1cf0: 09 09 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61  ..::tuapi::sysca
1d00: 6c 6c 3a 3a 69 66 63 6f 6e 66 69 67 20 24 69 6e  ll::ifconfig $in
1d10: 74 65 72 66 61 63 65 20 66 6c 61 67 73 20 24 66  terface flags $f
1d20: 6c 61 67 73 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  lags.....}....}.
1d30: 09 09 09 64 65 66 61 75 6c 74 20 7b 0a 09 09 09  ...default {....
1d40: 09 69 6e 63 72 20 69 64 78 0a 09 09 09 09 73 65  .incr idx.....se
1d50: 74 20 6f 70 74 76 61 6c 20 5b 6c 69 6e 64 65 78  t optval [lindex
1d60: 20 24 61 72 67 73 20 24 69 64 78 5d 0a 0a 09 09   $args $idx]....
1d70: 09 09 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61  ..::tuapi::sysca
1d80: 6c 6c 3a 3a 69 66 63 6f 6e 66 69 67 20 24 69 6e  ll::ifconfig $in
1d90: 74 65 72 66 61 63 65 20 24 6f 70 74 20 24 6f 70  terface $opt $op
1da0: 74 76 61 6c 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  tval....}...}..}
1db0: 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 74 75 61 70 69  .}..proc ::tuapi
1dc0: 3a 3a 68 65 6c 70 65 72 3a 3a 66 6f 72 65 61 63  ::helper::foreac
1dd0: 68 5f 6c 69 6e 65 20 7b 66 64 20 73 65 70 20 63  h_line {fd sep c
1de0: 6f 64 65 7d 20 7b 0a 09 77 68 69 6c 65 20 7b 21  ode} {..while {!
1df0: 5b 65 6f 66 20 24 66 64 5d 7d 20 7b 0a 09 09 67  [eof $fd]} {...g
1e00: 65 74 73 20 24 66 64 20 6c 69 6e 65 0a 0a 09 09  ets $fd line....
1e10: 72 65 67 73 75 62 20 7b 20 2a 23 2e 2a 24 7d 20  regsub { *#.*$} 
1e20: 24 6c 69 6e 65 20 7b 7d 20 6c 69 6e 65 0a 0a 09  $line {} line...
1e30: 09 69 66 20 7b 24 6c 69 6e 65 20 3d 3d 20 22 22  .if {$line == ""
1e40: 7d 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 0a  } {....continue.
1e50: 09 09 7d 0a 0a 09 09 73 65 74 20 6c 69 6e 65 20  ..}....set line 
1e60: 5b 73 70 6c 69 74 20 24 6c 69 6e 65 20 24 73 65  [split $line $se
1e70: 70 5d 0a 0a 09 09 75 70 6c 65 76 65 6c 20 31 20  p]....uplevel 1 
1e80: 5b 6c 69 73 74 20 73 65 74 20 6c 69 6e 65 20 24  [list set line $
1e90: 6c 69 6e 65 5d 0a 09 09 75 70 6c 65 76 65 6c 20  line]...uplevel 
1ea0: 31 20 24 63 6f 64 65 0a 09 7d 0a 09 75 70 6c 65  1 $code..}..uple
1eb0: 76 65 6c 20 31 20 5b 6c 69 73 74 20 75 6e 73 65  vel 1 [list unse
1ec0: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 6c 69  t -nocomplain li
1ed0: 6e 65 5d 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 74 75  ne].}..proc ::tu
1ee0: 61 70 69 3a 3a 68 65 6c 70 65 72 3a 3a 72 65 63  api::helper::rec
1ef0: 75 72 73 69 76 65 5f 67 6c 6f 62 20 7b 70 61 74  ursive_glob {pat
1f00: 68 20 70 61 74 74 65 72 6e 20 63 6f 64 65 20 7b  h pattern code {
1f10: 64 65 70 74 68 20 31 7d 7d 20 7b 0a 09 66 6f 72  depth 1}} {..for
1f20: 65 61 63 68 20 66 69 6c 65 6e 61 6d 65 20 5b 67  each filename [g
1f30: 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  lob -nocomplain 
1f40: 2d 64 69 72 65 63 74 6f 72 79 20 24 70 61 74 68  -directory $path
1f50: 20 2d 74 79 70 65 20 66 20 24 70 61 74 74 65 72   -type f $patter
1f60: 6e 5d 20 7b 0a 09 09 75 70 6c 65 76 65 6c 20 24  n] {...uplevel $
1f70: 64 65 70 74 68 20 5b 6c 69 73 74 20 73 65 74 20  depth [list set 
1f80: 66 69 6c 65 6e 61 6d 65 20 24 66 69 6c 65 6e 61  filename $filena
1f90: 6d 65 5d 0a 09 09 75 70 6c 65 76 65 6c 20 24 64  me]...uplevel $d
1fa0: 65 70 74 68 20 24 63 6f 64 65 0a 09 7d 0a 0a 09  epth $code..}...
1fb0: 69 6e 63 72 20 64 65 70 74 68 0a 0a 09 66 6f 72  incr depth...for
1fc0: 65 61 63 68 20 64 69 72 6e 61 6d 65 20 5b 67 6c  each dirname [gl
1fd0: 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 2d  ob -nocomplain -
1fe0: 64 69 72 65 63 74 6f 72 79 20 24 70 61 74 68 20  directory $path 
1ff0: 2d 74 79 70 65 20 64 20 2a 5d 20 7b 0a 09 09 73  -type d *] {...s
2000: 65 74 20 64 69 72 69 6e 66 6f 28 74 79 70 65 29  et dirinfo(type)
2010: 20 75 6e 6b 6e 6f 77 6e 0a 09 09 63 61 74 63 68   unknown...catch
2020: 20 7b 0a 09 09 09 66 69 6c 65 20 6c 73 74 61 74   {....file lstat
2030: 20 24 64 69 72 6e 61 6d 65 20 64 69 72 69 6e 66   $dirname dirinf
2040: 6f 0a 09 09 7d 0a 0a 09 09 69 66 20 7b 24 64 69  o...}....if {$di
2050: 72 69 6e 66 6f 28 74 79 70 65 29 20 3d 3d 20 22  rinfo(type) == "
2060: 6c 69 6e 6b 22 7d 20 7b 0a 09 09 09 63 6f 6e 74  link"} {....cont
2070: 69 6e 75 65 0a 09 09 7d 0a 0a 09 09 3a 3a 74 75  inue...}....::tu
2080: 61 70 69 3a 3a 68 65 6c 70 65 72 3a 3a 72 65 63  api::helper::rec
2090: 75 72 73 69 76 65 5f 67 6c 6f 62 20 24 64 69 72  ursive_glob $dir
20a0: 6e 61 6d 65 20 24 70 61 74 74 65 72 6e 20 24 63  name $pattern $c
20b0: 6f 64 65 20 24 64 65 70 74 68 0a 09 7d 0a 7d 0a  ode $depth..}.}.
20c0: 0a 70 72 6f 63 20 3a 3a 74 75 61 70 69 3a 3a 6d  .proc ::tuapi::m
20d0: 6f 64 70 72 6f 62 65 20 61 72 67 73 20 7b 0a 09  odprobe args {..
20e0: 23 20 50 72 6f 63 65 73 73 20 61 72 67 75 6d 65  # Process argume
20f0: 6e 74 73 0a 09 73 65 74 20 6f 70 74 69 6f 6e 73  nts..set options
2100: 28 63 61 6c 6c 5f 69 6e 73 6d 6f 64 29 20 31 0a  (call_insmod) 1.
2110: 09 73 65 74 20 69 64 78 20 30 0a 09 73 65 74 20  .set idx 0..set 
2120: 6e 65 78 74 49 73 41 72 67 73 20 30 0a 09 66 6f  nextIsArgs 0..fo
2130: 72 65 61 63 68 20 61 72 67 20 24 61 72 67 73 20  reach arg $args 
2140: 7b 0a 09 09 69 66 20 7b 24 6e 65 78 74 49 73 41  {...if {$nextIsA
2150: 72 67 73 7d 20 7b 0a 09 09 09 73 65 74 20 6f 70  rgs} {....set op
2160: 74 69 6f 6e 73 28 61 72 67 73 29 20 24 61 72 67  tions(args) $arg
2170: 0a 0a 09 09 09 73 65 74 20 6e 65 78 74 49 73 41  .....set nextIsA
2180: 72 67 73 20 30 0a 0a 09 09 09 69 6e 63 72 20 69  rgs 0.....incr i
2190: 64 78 0a 09 09 09 63 6f 6e 74 69 6e 75 65 0a 09  dx....continue..
21a0: 09 7d 0a 0a 09 09 73 77 69 74 63 68 20 2d 2d 20  .}....switch -- 
21b0: 24 61 72 67 20 7b 0a 09 09 09 22 2d 64 6f 6e 74  $arg {...."-dont
21c0: 6c 6f 61 64 22 20 7b 0a 09 09 09 09 73 65 74 20  load" {.....set 
21d0: 6f 70 74 69 6f 6e 73 28 63 61 6c 6c 5f 69 6e 73  options(call_ins
21e0: 6d 6f 64 29 20 30 0a 09 09 09 7d 0a 09 09 09 22  mod) 0....}...."
21f0: 2d 61 72 67 73 22 20 7b 0a 09 09 09 09 73 65 74  -args" {.....set
2200: 20 6e 65 78 74 49 73 41 72 67 73 20 31 0a 09 09   nextIsArgs 1...
2210: 09 7d 0a 09 09 09 22 2d 2d 22 20 7b 0a 09 09 09  .}...."--" {....
2220: 09 69 6e 63 72 20 69 64 78 0a 09 09 09 09 62 72  .incr idx.....br
2230: 65 61 6b 0a 09 09 09 7d 0a 09 09 09 64 65 66 61  eak....}....defa
2240: 75 6c 74 20 7b 0a 09 09 09 09 62 72 65 61 6b 0a  ult {.....break.
2250: 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 6e 63 72  ...}...}....incr
2260: 20 69 64 78 0a 09 7d 0a 09 73 65 74 20 61 72 67   idx..}..set arg
2270: 73 20 5b 6c 72 61 6e 67 65 20 24 61 72 67 73 20  s [lrange $args 
2280: 24 69 64 78 20 65 6e 64 5d 0a 0a 09 23 20 53 65  $idx end]...# Se
2290: 74 20 69 6e 69 74 69 61 6c 20 72 65 74 76 61 6c  t initial retval
22a0: 0a 09 73 65 74 20 72 65 74 76 61 6c 20 5b 6c 69  ..set retval [li
22b0: 73 74 5d 0a 0a 09 23 20 53 65 74 20 6d 6f 64 75  st]...# Set modu
22c0: 6c 65 20 62 61 73 65 20 64 69 72 65 63 74 6f 72  le base director
22d0: 79 0a 09 73 65 74 20 6d 6f 64 75 6c 65 73 5f 64  y..set modules_d
22e0: 69 72 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 2f 6c  ir [file join /l
22f0: 69 62 2f 6d 6f 64 75 6c 65 73 20 24 3a 3a 74 63  ib/modules $::tc
2300: 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 56 65 72  l_platform(osVer
2310: 73 69 6f 6e 29 5d 0a 0a 09 23 20 4c 6f 61 64 20  sion)]...# Load 
2320: 64 65 76 69 63 65 20 6e 61 6d 65 73 0a 09 69 66  device names..if
2330: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
2340: 3a 3a 74 75 61 70 69 3a 3a 63 61 63 68 65 3a 3a  ::tuapi::cache::
2350: 61 6c 69 61 73 32 6d 6f 64 75 6c 65 5d 7d 20 7b  alias2module]} {
2360: 0a 09 09 73 65 74 20 64 65 76 6e 61 6d 65 73 5f  ...set devnames_
2370: 66 69 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  file [file join 
2380: 24 6d 6f 64 75 6c 65 73 5f 64 69 72 20 6d 6f 64  $modules_dir mod
2390: 75 6c 65 73 2e 64 65 76 6e 61 6d 65 5d 0a 09 09  ules.devname]...
23a0: 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 24 64 65  set fd [open $de
23b0: 76 6e 61 6d 65 73 5f 66 69 6c 65 5d 0a 09 09 3a  vnames_file]...:
23c0: 3a 74 75 61 70 69 3a 3a 68 65 6c 70 65 72 3a 3a  :tuapi::helper::
23d0: 66 6f 72 65 61 63 68 5f 6c 69 6e 65 20 24 66 64  foreach_line $fd
23e0: 20 22 20 22 20 7b 0a 09 09 09 73 65 74 20 6d 6f   " " {....set mo
23f0: 64 75 6c 65 20 5b 6c 69 6e 64 65 78 20 24 6c 69  dule [lindex $li
2400: 6e 65 20 30 5d 0a 09 09 09 73 65 74 20 64 65 76  ne 0]....set dev
2410: 69 63 65 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e  ice [lindex $lin
2420: 65 20 31 5d 0a 09 09 09 73 65 74 20 69 64 20 5b  e 1]....set id [
2430: 6c 69 6e 64 65 78 20 24 6c 69 6e 65 20 32 5d 0a  lindex $line 2].
2440: 0a 09 09 09 73 65 74 20 69 64 5f 74 79 70 65 20  ....set id_type 
2450: 5b 73 74 72 69 6e 67 20 69 6e 64 65 78 20 24 69  [string index $i
2460: 64 20 30 5d 0a 09 09 09 73 65 74 20 69 64 5f 74  d 0]....set id_t
2470: 79 70 65 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  ype [string map 
2480: 5b 6c 69 73 74 20 22 63 22 20 22 63 68 61 72 22  [list "c" "char"
2490: 20 22 62 22 20 22 62 6c 6f 63 6b 22 5d 20 24 69   "b" "block"] $i
24a0: 64 5f 74 79 70 65 5d 0a 09 09 09 73 65 74 20 69  d_type]....set i
24b0: 64 20 5b 73 70 6c 69 74 20 5b 73 74 72 69 6e 67  d [split [string
24c0: 20 72 61 6e 67 65 20 24 69 64 20 31 20 65 6e 64   range $id 1 end
24d0: 5d 20 3a 5d 0a 09 09 09 73 65 74 20 69 64 5f 61  ] :]....set id_a
24e0: 6c 69 61 73 20 22 24 7b 69 64 5f 74 79 70 65 7d  lias "${id_type}
24f0: 2d 6d 61 6a 6f 72 2d 5b 6c 69 6e 64 65 78 20 24  -major-[lindex $
2500: 69 64 20 30 5d 2d 5b 6c 69 6e 64 65 78 20 24 69  id 0]-[lindex $i
2510: 64 20 31 5d 22 0a 0a 09 09 09 73 65 74 20 22 61  d 1]".....set "a
2520: 6c 69 61 73 32 6d 6f 64 75 6c 65 28 2f 64 65 76  lias2module(/dev
2530: 2f 24 7b 64 65 76 69 63 65 7d 29 22 20 24 6d 6f  /${device})" $mo
2540: 64 75 6c 65 0a 09 09 09 73 65 74 20 61 6c 69 61  dule....set alia
2550: 73 32 6d 6f 64 75 6c 65 28 24 69 64 5f 61 6c 69  s2module($id_ali
2560: 61 73 29 20 24 6d 6f 64 75 6c 65 0a 09 09 7d 0a  as) $module...}.
2570: 09 09 63 6c 6f 73 65 20 24 66 64 0a 0a 09 09 23  ..close $fd....#
2580: 20 4c 6f 61 64 20 61 6c 69 61 73 65 73 0a 09 09   Load aliases...
2590: 73 65 74 20 61 6c 69 61 73 65 73 5f 66 69 6c 65  set aliases_file
25a0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 6d 6f 64   [file join $mod
25b0: 75 6c 65 73 5f 64 69 72 20 6d 6f 64 75 6c 65 73  ules_dir modules
25c0: 2e 61 6c 69 61 73 5d 0a 09 09 73 65 74 20 66 64  .alias]...set fd
25d0: 20 5b 6f 70 65 6e 20 24 61 6c 69 61 73 65 73 5f   [open $aliases_
25e0: 66 69 6c 65 5d 0a 09 09 3a 3a 74 75 61 70 69 3a  file]...::tuapi:
25f0: 3a 68 65 6c 70 65 72 3a 3a 66 6f 72 65 61 63 68  :helper::foreach
2600: 5f 6c 69 6e 65 20 24 66 64 20 22 20 22 20 7b 0a  _line $fd " " {.
2610: 09 09 09 73 65 74 20 61 6c 69 61 73 20 5b 6c 69  ...set alias [li
2620: 6e 64 65 78 20 24 6c 69 6e 65 20 31 5d 0a 09 09  ndex $line 1]...
2630: 09 73 65 74 20 6d 6f 64 75 6c 65 20 5b 6c 69 6e  .set module [lin
2640: 64 65 78 20 24 6c 69 6e 65 20 32 5d 0a 0a 09 09  dex $line 2]....
2650: 09 73 65 74 20 61 6c 69 61 73 32 6d 6f 64 75 6c  .set alias2modul
2660: 65 28 24 61 6c 69 61 73 29 20 24 6d 6f 64 75 6c  e($alias) $modul
2670: 65 0a 09 09 09 69 66 20 7b 5b 73 74 72 69 6e 67  e....if {[string
2680: 20 6d 61 74 63 68 20 7b 2a 5c 2a 2a 7d 20 24 61   match {*\**} $a
2690: 6c 69 61 73 5d 7d 20 7b 0a 09 09 09 09 73 65 74  lias]} {.....set
26a0: 20 61 6c 69 61 73 32 6d 6f 64 75 6c 65 5f 77 69   alias2module_wi
26b0: 6c 64 63 61 72 64 73 28 24 61 6c 69 61 73 29 20  ldcards($alias) 
26c0: 24 6d 6f 64 75 6c 65 0a 09 09 09 7d 0a 09 09 7d  $module....}...}
26d0: 0a 09 09 63 6c 6f 73 65 20 24 66 64 0a 0a 09 09  ...close $fd....
26e0: 23 20 4c 6f 61 64 20 64 65 70 65 6e 64 65 6e 63  # Load dependenc
26f0: 69 65 73 0a 09 09 73 65 74 20 64 65 70 73 5f 66  ies...set deps_f
2700: 69 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  ile [file join $
2710: 6d 6f 64 75 6c 65 73 5f 64 69 72 20 6d 6f 64 75  modules_dir modu
2720: 6c 65 73 2e 64 65 70 5d 0a 09 09 73 65 74 20 66  les.dep]...set f
2730: 64 20 5b 6f 70 65 6e 20 24 64 65 70 73 5f 66 69  d [open $deps_fi
2740: 6c 65 5d 0a 09 09 3a 3a 74 75 61 70 69 3a 3a 68  le]...::tuapi::h
2750: 65 6c 70 65 72 3a 3a 66 6f 72 65 61 63 68 5f 6c  elper::foreach_l
2760: 69 6e 65 20 24 66 64 20 22 3a 22 20 7b 0a 09 09  ine $fd ":" {...
2770: 09 73 65 74 20 6d 6f 64 75 6c 65 20 5b 73 74 72  .set module [str
2780: 69 6e 67 20 74 72 69 6d 20 5b 6c 69 6e 64 65 78  ing trim [lindex
2790: 20 24 6c 69 6e 65 20 30 5d 5d 0a 09 09 09 73 65   $line 0]]....se
27a0: 74 20 64 65 70 73 20 5b 6c 72 65 76 65 72 73 65  t deps [lreverse
27b0: 20 5b 73 70 6c 69 74 20 5b 73 74 72 69 6e 67 20   [split [string 
27c0: 74 72 69 6d 20 5b 6a 6f 69 6e 20 5b 6c 72 61 6e  trim [join [lran
27d0: 67 65 20 24 6c 69 6e 65 20 31 20 65 6e 64 5d 5d  ge $line 1 end]]
27e0: 5d 5d 5d 0a 0a 09 09 09 73 65 74 20 6d 6f 64 75  ]]].....set modu
27f0: 6c 65 5f 62 61 73 65 6e 61 6d 65 20 5b 66 69 6c  le_basename [fil
2800: 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65  e rootname [file
2810: 20 74 61 69 6c 20 24 6d 6f 64 75 6c 65 5d 5d 0a   tail $module]].
2820: 09 09 09 73 65 74 20 6d 6f 64 75 6c 65 5f 62 61  ...set module_ba
2830: 73 65 6e 61 6d 65 5f 61 6c 74 31 20 5b 73 74 72  sename_alt1 [str
2840: 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 22 5f  ing map [list "_
2850: 22 20 22 2d 22 5d 20 24 6d 6f 64 75 6c 65 5f 62  " "-"] $module_b
2860: 61 73 65 6e 61 6d 65 5d 0a 09 09 09 73 65 74 20  asename]....set 
2870: 6d 6f 64 75 6c 65 5f 62 61 73 65 6e 61 6d 65 5f  module_basename_
2880: 61 6c 74 32 20 5b 73 74 72 69 6e 67 20 6d 61 70  alt2 [string map
2890: 20 5b 6c 69 73 74 20 22 2d 22 20 22 5f 22 5d 20   [list "-" "_"] 
28a0: 24 6d 6f 64 75 6c 65 5f 62 61 73 65 6e 61 6d 65  $module_basename
28b0: 5d 0a 0a 09 09 09 73 65 74 20 61 6c 69 61 73 32  ].....set alias2
28c0: 6d 6f 64 75 6c 65 28 24 6d 6f 64 75 6c 65 5f 62  module($module_b
28d0: 61 73 65 6e 61 6d 65 29 20 24 6d 6f 64 75 6c 65  asename) $module
28e0: 0a 09 09 09 73 65 74 20 61 6c 69 61 73 32 6d 6f  ....set alias2mo
28f0: 64 75 6c 65 28 24 6d 6f 64 75 6c 65 5f 62 61 73  dule($module_bas
2900: 65 6e 61 6d 65 5f 61 6c 74 31 29 20 24 6d 6f 64  ename_alt1) $mod
2910: 75 6c 65 0a 09 09 09 73 65 74 20 61 6c 69 61 73  ule....set alias
2920: 32 6d 6f 64 75 6c 65 28 24 6d 6f 64 75 6c 65 5f  2module($module_
2930: 62 61 73 65 6e 61 6d 65 5f 61 6c 74 32 29 20 24  basename_alt2) $
2940: 6d 6f 64 75 6c 65 0a 0a 09 09 09 69 66 20 7b 5b  module.....if {[
2950: 6c 6c 65 6e 67 74 68 20 24 64 65 70 73 5d 20 21  llength $deps] !
2960: 3d 20 30 7d 20 7b 0a 09 09 09 09 73 65 74 20 6d  = 0} {.....set m
2970: 6f 64 75 6c 65 32 64 65 70 73 28 24 6d 6f 64 75  odule2deps($modu
2980: 6c 65 29 20 24 64 65 70 73 0a 09 09 09 7d 0a 09  le) $deps....}..
2990: 09 7d 0a 09 09 63 6c 6f 73 65 20 24 66 64 0a 0a  .}...close $fd..
29a0: 09 09 73 65 74 20 3a 3a 74 75 61 70 69 3a 3a 63  ..set ::tuapi::c
29b0: 61 63 68 65 3a 3a 61 6c 69 61 73 32 6d 6f 64 75  ache::alias2modu
29c0: 6c 65 20 5b 61 72 72 61 79 20 67 65 74 20 61 6c  le [array get al
29d0: 69 61 73 32 6d 6f 64 75 6c 65 5d 0a 09 09 73 65  ias2module]...se
29e0: 74 20 3a 3a 74 75 61 70 69 3a 3a 63 61 63 68 65  t ::tuapi::cache
29f0: 3a 3a 61 6c 69 61 73 32 6d 6f 64 75 6c 65 5f 77  ::alias2module_w
2a00: 69 6c 64 63 61 72 64 73 20 5b 61 72 72 61 79 20  ildcards [array 
2a10: 67 65 74 20 61 6c 69 61 73 32 6d 6f 64 75 6c 65  get alias2module
2a20: 5f 77 69 6c 64 63 61 72 64 73 5d 0a 09 09 73 65  _wildcards]...se
2a30: 74 20 3a 3a 74 75 61 70 69 3a 3a 63 61 63 68 65  t ::tuapi::cache
2a40: 3a 3a 6d 6f 64 75 6c 65 32 64 65 70 73 20 5b 61  ::module2deps [a
2a50: 72 72 61 79 20 67 65 74 20 6d 6f 64 75 6c 65 32  rray get module2
2a60: 64 65 70 73 5d 0a 09 7d 20 65 6c 73 65 20 7b 0a  deps]..} else {.
2a70: 09 09 61 72 72 61 79 20 73 65 74 20 61 6c 69 61  ..array set alia
2a80: 73 32 6d 6f 64 75 6c 65 20 24 3a 3a 74 75 61 70  s2module $::tuap
2a90: 69 3a 3a 63 61 63 68 65 3a 3a 61 6c 69 61 73 32  i::cache::alias2
2aa0: 6d 6f 64 75 6c 65 0a 09 09 61 72 72 61 79 20 73  module...array s
2ab0: 65 74 20 61 6c 69 61 73 32 6d 6f 64 75 6c 65 5f  et alias2module_
2ac0: 77 69 6c 64 63 61 72 64 73 20 24 3a 3a 74 75 61  wildcards $::tua
2ad0: 70 69 3a 3a 63 61 63 68 65 3a 3a 61 6c 69 61 73  pi::cache::alias
2ae0: 32 6d 6f 64 75 6c 65 5f 77 69 6c 64 63 61 72 64  2module_wildcard
2af0: 73 0a 09 09 61 72 72 61 79 20 73 65 74 20 6d 6f  s...array set mo
2b00: 64 75 6c 65 32 64 65 70 73 20 24 3a 3a 3a 3a 74  dule2deps $::::t
2b10: 75 61 70 69 3a 3a 63 61 63 68 65 3a 3a 6d 6f 64  uapi::cache::mod
2b20: 75 6c 65 32 64 65 70 73 0a 09 7d 0a 0a 09 23 20  ule2deps..}...# 
2b30: 44 65 74 65 72 6d 69 6e 65 20 6c 69 73 74 20 6f  Determine list o
2b40: 66 20 6d 6f 64 75 6c 65 73 0a 09 73 65 74 20 61  f modules..set a
2b50: 6c 6c 5f 6d 6f 64 75 6c 65 73 20 5b 6c 69 73 74  ll_modules [list
2b60: 5d 0a 09 66 6f 72 65 61 63 68 20 6d 6f 64 75 6c  ]..foreach modul
2b70: 65 73 20 24 61 72 67 73 20 7b 0a 09 09 66 6f 72  es $args {...for
2b80: 65 61 63 68 20 6d 6f 64 75 6c 65 20 24 6d 6f 64  each module $mod
2b90: 75 6c 65 73 20 7b 0a 09 09 09 6c 61 70 70 65 6e  ules {....lappen
2ba0: 64 20 61 6c 6c 5f 6d 6f 64 75 6c 65 73 20 24 6d  d all_modules $m
2bb0: 6f 64 75 6c 65 0a 09 09 7d 0a 09 7d 0a 0a 09 23  odule...}..}...#
2bc0: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 61 74 20   Determine what 
2bd0: 6d 6f 64 75 6c 65 73 20 74 6f 20 61 64 64 20 74  modules to add t
2be0: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  he arguments to.
2bf0: 09 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  .if {[info exist
2c00: 73 20 6f 70 74 69 6f 6e 73 28 61 72 67 73 29 5d  s options(args)]
2c10: 7d 20 7b 0a 09 09 66 6f 72 65 61 63 68 20 61 72  } {...foreach ar
2c20: 67 20 5b 73 70 6c 69 74 20 24 6f 70 74 69 6f 6e  g [split $option
2c30: 73 28 61 72 67 73 29 20 22 20 5c 6e 5c 74 22 5d  s(args) " \n\t"]
2c40: 20 7b 0a 09 09 09 73 65 74 20 61 72 67 20 5b 73   {....set arg [s
2c50: 74 72 69 6e 67 20 74 72 69 6d 20 24 61 72 67 5d  tring trim $arg]
2c60: 0a 09 09 09 69 66 20 7b 24 61 72 67 20 3d 3d 20  ....if {$arg == 
2c70: 22 22 7d 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e  ""} {.....contin
2c80: 75 65 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 7b  ue....}.....if {
2c90: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 22 2a  [string match "*
2ca0: 3d 2a 22 20 24 61 72 67 5d 7d 20 7b 0a 09 09 09  =*" $arg]} {....
2cb0: 09 73 65 74 20 77 6f 72 6b 20 5b 73 70 6c 69 74  .set work [split
2cc0: 20 24 61 72 67 20 3d 5d 0a 0a 09 09 09 09 73 65   $arg =]......se
2cd0: 74 20 6e 61 6d 65 20 5b 6c 69 6e 64 65 78 20 24  t name [lindex $
2ce0: 77 6f 72 6b 20 30 5d 0a 09 09 09 09 73 65 74 20  work 0].....set 
2cf0: 76 61 6c 75 65 20 5b 6a 6f 69 6e 20 5b 6c 72 61  value [join [lra
2d00: 6e 67 65 20 24 77 6f 72 6b 20 31 20 65 6e 64 5d  nge $work 1 end]
2d10: 20 3d 5d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a   =]....} else {.
2d20: 09 09 09 09 73 65 74 20 6e 61 6d 65 20 24 61 72  ....set name $ar
2d30: 67 0a 09 09 09 09 75 6e 73 65 74 20 2d 6e 6f 63  g.....unset -noc
2d40: 6f 6d 70 6c 61 69 6e 20 76 61 6c 75 65 0a 09 09  omplain value...
2d50: 09 7d 0a 0a 09 09 09 69 66 20 7b 5b 73 74 72 69  .}.....if {[stri
2d60: 6e 67 20 6d 61 74 63 68 20 22 2a 2e 2a 22 20 24  ng match "*.*" $
2d70: 6e 61 6d 65 5d 7d 20 7b 0a 09 09 09 09 73 65 74  name]} {.....set
2d80: 20 77 6f 72 6b 20 5b 73 70 6c 69 74 20 24 6e 61   work [split $na
2d90: 6d 65 20 2e 5d 0a 0a 09 09 09 09 73 65 74 20 6d  me .]......set m
2da0: 6f 64 75 6c 65 20 5b 6c 69 6e 64 65 78 20 24 77  odule [lindex $w
2db0: 6f 72 6b 20 30 5d 0a 09 09 09 09 69 66 20 7b 24  ork 0].....if {$
2dc0: 6d 6f 64 75 6c 65 20 3d 3d 20 22 22 7d 20 7b 0a  module == ""} {.
2dd0: 09 09 09 09 09 73 65 74 20 6d 6f 64 75 6c 65 73  .....set modules
2de0: 20 5b 6c 69 73 74 5d 0a 09 09 09 09 7d 20 65 6c   [list].....} el
2df0: 73 65 20 7b 0a 09 09 09 09 09 73 65 74 20 6d 6f  se {......set mo
2e00: 64 75 6c 65 73 20 5b 6c 69 73 74 20 24 6d 6f 64  dules [list $mod
2e10: 75 6c 65 5d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ule].....}......
2e20: 73 65 74 20 6e 61 6d 65 20 5b 6a 6f 69 6e 20 5b  set name [join [
2e30: 6c 72 61 6e 67 65 20 24 77 6f 72 6b 20 31 20 65  lrange $work 1 e
2e40: 6e 64 5d 20 2e 5d 0a 09 09 09 7d 20 65 6c 73 65  nd] .]....} else
2e50: 20 7b 0a 09 09 09 09 73 65 74 20 6d 6f 64 75 6c   {.....set modul
2e60: 65 73 20 5b 6c 69 73 74 5d 0a 09 09 09 7d 0a 0a  es [list]....}..
2e70: 09 09 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20  ...if {[llength 
2e80: 24 6d 6f 64 75 6c 65 73 5d 20 3d 3d 20 30 7d 20  $modules] == 0} 
2e90: 7b 0a 09 09 09 09 73 65 74 20 6d 6f 64 75 6c 65  {.....set module
2ea0: 73 20 24 61 6c 6c 5f 6d 6f 64 75 6c 65 73 0a 09  s $all_modules..
2eb0: 09 09 7d 0a 0a 09 09 09 66 6f 72 65 61 63 68 20  ..}.....foreach 
2ec0: 6d 6f 64 75 6c 65 20 24 6d 6f 64 75 6c 65 73 20  module $modules 
2ed0: 7b 0a 09 09 09 09 69 66 20 7b 5b 69 6e 66 6f 20  {.....if {[info 
2ee0: 65 78 69 73 74 73 20 76 61 6c 75 65 5d 7d 20 7b  exists value]} {
2ef0: 0a 09 09 09 09 09 61 70 70 65 6e 64 20 6d 6f 64  ......append mod
2f00: 75 6c 65 73 5f 61 72 67 73 28 24 6d 6f 64 75 6c  ules_args($modul
2f10: 65 29 20 22 24 6e 61 6d 65 3d 24 76 61 6c 75 65  e) "$name=$value
2f20: 20 22 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a   ".....} else {.
2f30: 09 09 09 09 09 61 70 70 65 6e 64 20 6d 6f 64 75  .....append modu
2f40: 6c 65 73 5f 61 72 67 73 28 24 6d 6f 64 75 6c 65  les_args($module
2f50: 29 20 22 24 6e 61 6d 65 20 22 0a 09 09 09 09 7d  ) "$name ".....}
2f60: 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 23  ....}...}..}...#
2f70: 20 4c 6f 61 64 20 6d 6f 64 75 6c 65 73 0a 09 66   Load modules..f
2f80: 6f 72 65 61 63 68 20 6d 6f 64 75 6c 65 20 24 61  oreach module $a
2f90: 6c 6c 5f 6d 6f 64 75 6c 65 73 20 7b 0a 09 09 23  ll_modules {...#
2fa0: 20 49 66 20 74 68 65 20 6d 6f 64 75 6c 65 20 69   If the module i
2fb0: 73 20 67 69 76 65 6e 20 61 73 20 61 6e 20 61 62  s given as an ab
2fc0: 73 6f 6c 75 74 65 20 70 61 74 68 2c 20 69 67 6e  solute path, ign
2fd0: 6f 72 65 20 74 68 65 20 70 61 74 68 0a 09 09 23  ore the path...#
2fe0: 20 61 6e 64 20 70 72 6f 63 65 73 73 20 6a 75 73   and process jus
2ff0: 74 20 61 73 20 77 65 20 77 6f 75 6c 64 20 69 66  t as we would if
3000: 20 74 68 65 20 6e 61 6d 65 20 77 65 72 65 20 67   the name were g
3010: 69 76 65 6e 20 61 6c 6f 6e 65 0a 09 09 23 20 54  iven alone...# T
3020: 68 69 73 20 6d 61 79 20 62 65 20 77 72 6f 6e 67  his may be wrong
3030: 2c 20 62 75 74 20 6f 74 68 65 72 77 69 73 65 20  , but otherwise 
3040: 64 65 70 65 6e 64 65 6e 63 79 20 6d 61 74 63 68  dependency match
3050: 69 6e 67 20 77 6f 75 6c 64 0a 09 09 23 20 62 65  ing would...# be
3060: 20 68 61 72 64 65 72 0a 09 09 69 66 20 7b 5b 73   harder...if {[s
3070: 74 72 69 6e 67 20 69 6e 64 65 78 20 24 6d 6f 64  tring index $mod
3080: 75 6c 65 20 30 5d 20 3d 3d 20 22 2f 22 20 26 26  ule 0] == "/" &&
3090: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 6d   [file exists $m
30a0: 6f 64 75 6c 65 5d 7d 20 7b 0a 09 09 09 73 65 74  odule]} {....set
30b0: 20 6d 6f 64 75 6c 65 20 5b 66 69 6c 65 20 72 6f   module [file ro
30c0: 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69  otname [file tai
30d0: 6c 20 24 6d 6f 64 75 6c 65 5d 5d 0a 09 09 7d 0a  l $module]]...}.
30e0: 0a 09 09 66 6f 72 20 7b 73 65 74 20 74 72 79 20  ...for {set try 
30f0: 30 7d 20 7b 24 74 72 79 20 3c 20 31 30 30 7d 20  0} {$try < 100} 
3100: 7b 69 6e 63 72 20 74 72 79 7d 20 7b 0a 09 09 09  {incr try} {....
3110: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
3120: 73 20 61 6c 69 61 73 32 6d 6f 64 75 6c 65 28 24  s alias2module($
3130: 6d 6f 64 75 6c 65 29 5d 7d 20 7b 0a 09 09 09 09  module)]} {.....
3140: 23 20 49 66 20 6e 6f 20 65 78 61 63 74 20 6d 61  # If no exact ma
3150: 74 63 68 20 66 6f 75 6e 64 2c 20 70 72 6f 63 65  tch found, proce
3160: 73 73 20 77 69 6c 64 63 61 72 64 20 65 6e 74 72  ss wildcard entr
3170: 69 65 73 0a 09 09 09 09 73 65 74 20 66 6f 75 6e  ies.....set foun
3180: 64 5f 77 69 6c 64 63 61 72 64 5f 6d 61 74 63 68  d_wildcard_match
3190: 20 30 0a 09 09 09 09 73 65 74 20 74 6d 70 5f 6d   0.....set tmp_m
31a0: 61 74 63 68 65 64 5f 6d 6f 64 75 6c 65 73 20 5b  atched_modules [
31b0: 6c 69 73 74 5d 0a 09 09 09 09 66 6f 72 65 61 63  list].....foreac
31c0: 68 20 61 6c 69 61 73 20 5b 61 72 72 61 79 20 6e  h alias [array n
31d0: 61 6d 65 20 61 6c 69 61 73 32 6d 6f 64 75 6c 65  ame alias2module
31e0: 5f 77 69 6c 64 63 61 72 64 73 5d 20 7b 0a 09 09  _wildcards] {...
31f0: 09 09 09 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d  ...if {[string m
3200: 61 74 63 68 20 24 61 6c 69 61 73 20 24 6d 6f 64  atch $alias $mod
3210: 75 6c 65 5d 7d 20 7b 0a 09 09 09 09 09 09 73 65  ule]} {.......se
3220: 74 20 6d 6f 64 75 6c 65 20 24 61 6c 69 61 73 32  t module $alias2
3230: 6d 6f 64 75 6c 65 5f 77 69 6c 64 63 61 72 64 73  module_wildcards
3240: 28 24 61 6c 69 61 73 29 0a 0a 09 09 09 09 09 09  ($alias)........
3250: 6c 61 70 70 65 6e 64 20 74 6d 70 5f 6d 61 74 63  lappend tmp_matc
3260: 68 65 64 5f 6d 6f 64 75 6c 65 73 20 24 6d 6f 64  hed_modules $mod
3270: 75 6c 65 0a 0a 09 09 09 09 09 09 69 6e 63 72 20  ule........incr 
3280: 66 6f 75 6e 64 5f 77 69 6c 64 63 61 72 64 5f 6d  found_wildcard_m
3290: 61 74 63 68 20 31 0a 09 09 09 09 09 7d 0a 09 09  atch 1......}...
32a0: 09 09 7d 0a 0a 09 09 09 09 69 66 20 7b 21 24 66  ..}......if {!$f
32b0: 6f 75 6e 64 5f 77 69 6c 64 63 61 72 64 5f 6d 61  ound_wildcard_ma
32c0: 74 63 68 7d 20 7b 0a 09 09 09 09 09 62 72 65 61  tch} {......brea
32d0: 6b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  k.....}......if 
32e0: 7b 24 66 6f 75 6e 64 5f 77 69 6c 64 63 61 72 64  {$found_wildcard
32f0: 5f 6d 61 74 63 68 20 3e 20 31 7d 20 7b 0a 09 09  _match > 1} {...
3300: 09 09 09 23 20 4d 75 6c 74 69 70 6c 65 20 6d 61  ...# Multiple ma
3310: 74 63 68 65 73 2c 20 74 72 79 20 74 6f 20 70 69  tches, try to pi
3320: 63 6b 20 74 68 65 20 62 65 73 74 20 6f 6e 65 0a  ck the best one.
3330: 09 09 09 09 09 66 6f 72 65 61 63 68 20 74 6d 70  .....foreach tmp
3340: 5f 6d 6f 64 75 6c 65 20 24 74 6d 70 5f 6d 61 74  _module $tmp_mat
3350: 63 68 65 64 5f 6d 6f 64 75 6c 65 73 20 7b 0a 09  ched_modules {..
3360: 09 09 09 09 09 23 20 46 69 72 73 74 2c 20 70 72  .....# First, pr
3370: 65 66 65 72 20 74 68 69 6e 67 73 20 74 68 61 74  efer things that
3380: 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20   do not contain 
3390: 67 65 6e 65 72 69 63 0a 09 09 09 09 09 09 69 66  generic.......if
33a0: 20 7b 21 5b 73 74 72 69 6e 67 20 6d 61 74 63 68   {![string match
33b0: 20 22 2a 67 65 6e 65 72 69 63 2a 22 20 24 74 6d   "*generic*" $tm
33c0: 70 5f 6d 6f 64 75 6c 65 5d 7d 20 7b 0a 09 09 09  p_module]} {....
33d0: 09 09 09 09 73 65 74 20 6d 6f 64 75 6c 65 20 24  ....set module $
33e0: 74 6d 70 5f 6d 6f 64 75 6c 65 0a 09 09 09 09 09  tmp_module......
33f0: 09 7d 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  .}......}.....}.
3400: 09 09 09 7d 0a 0a 09 09 09 73 65 74 20 6d 6f 64  ...}.....set mod
3410: 75 6c 65 20 24 61 6c 69 61 73 32 6d 6f 64 75 6c  ule $alias2modul
3420: 65 28 24 6d 6f 64 75 6c 65 29 0a 09 09 7d 0a 0a  e($module)...}..
3430: 09 09 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  ..if {[info exis
3440: 74 73 20 6d 6f 64 75 6c 65 32 64 65 70 73 28 24  ts module2deps($
3450: 6d 6f 64 75 6c 65 29 5d 7d 20 7b 0a 09 09 09 73  module)]} {....s
3460: 65 74 20 6c 6f 61 64 20 24 6d 6f 64 75 6c 65 32  et load $module2
3470: 64 65 70 73 28 24 6d 6f 64 75 6c 65 29 0a 09 09  deps($module)...
3480: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 73 65 74 20  } else {....set 
3490: 6c 6f 61 64 20 5b 6c 69 73 74 5d 0a 09 09 7d 0a  load [list]...}.
34a0: 0a 09 09 6c 61 70 70 65 6e 64 20 6c 6f 61 64 20  ...lappend load 
34b0: 24 6d 6f 64 75 6c 65 0a 0a 09 09 66 6f 72 65 61  $module....forea
34c0: 63 68 20 6d 6f 64 75 6c 65 20 24 6c 6f 61 64 20  ch module $load 
34d0: 7b 0a 09 09 09 69 66 20 7b 5b 73 74 72 69 6e 67  {....if {[string
34e0: 20 6d 61 74 63 68 20 22 2f 64 65 76 2f 2a 22 20   match "/dev/*" 
34f0: 24 6d 6f 64 75 6c 65 5d 7d 20 7b 0a 09 09 09 09  $module]} {.....
3500: 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72  return -code err
3510: 6f 72 20 22 55 6e 61 62 6c 65 20 74 6f 20 6c 6f  or "Unable to lo
3520: 6f 6b 75 70 20 64 65 76 69 63 65 20 6e 6f 64 65  okup device node
3530: 20 6d 6f 64 75 6c 65 20 66 6f 72 20 24 6d 6f 64   module for $mod
3540: 75 6c 65 22 0a 09 09 09 7d 0a 0a 09 09 09 73 65  ule"....}.....se
3550: 74 20 6d 6f 64 75 6c 65 20 5b 66 69 6c 65 20 6a  t module [file j
3560: 6f 69 6e 20 24 6d 6f 64 75 6c 65 73 5f 64 69 72  oin $modules_dir
3570: 20 24 6d 6f 64 75 6c 65 5d 0a 0a 09 09 09 75 6e   $module].....un
3580: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
3590: 6d 6f 64 75 6c 65 5f 61 72 67 73 0a 09 09 09 73  module_args....s
35a0: 65 74 20 6d 6f 64 75 6c 65 5f 73 68 6f 72 74 20  et module_short 
35b0: 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b  [file rootname [
35c0: 66 69 6c 65 20 74 61 69 6c 20 24 6d 6f 64 75 6c  file tail $modul
35d0: 65 5d 5d 0a 09 09 09 69 66 20 7b 5b 69 6e 66 6f  e]]....if {[info
35e0: 20 65 78 69 73 74 73 20 6d 6f 64 75 6c 65 73 5f   exists modules_
35f0: 61 72 67 73 28 24 6d 6f 64 75 6c 65 5f 73 68 6f  args($module_sho
3600: 72 74 29 5d 7d 20 7b 0a 09 09 09 09 73 65 74 20  rt)]} {.....set 
3610: 6d 6f 64 75 6c 65 5f 61 72 67 73 20 5b 73 74 72  module_args [str
3620: 69 6e 67 20 74 72 69 6d 20 24 6d 6f 64 75 6c 65  ing trim $module
3630: 73 5f 61 72 67 73 28 24 6d 6f 64 75 6c 65 5f 73  s_args($module_s
3640: 68 6f 72 74 29 5d 0a 09 09 09 7d 0a 0a 09 09 09  hort)]....}.....
3650: 69 66 20 7b 24 6f 70 74 69 6f 6e 73 28 63 61 6c  if {$options(cal
3660: 6c 5f 69 6e 73 6d 6f 64 29 7d 20 7b 0a 09 09 09  l_insmod)} {....
3670: 09 69 66 20 7b 5b 63 61 74 63 68 20 7b 0a 09 09  .if {[catch {...
3680: 09 09 09 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  ...if {[info exi
3690: 73 74 73 20 6d 6f 64 75 6c 65 5f 61 72 67 73 5d  sts module_args]
36a0: 7d 20 7b 0a 09 09 09 09 09 09 3a 3a 74 75 61 70  } {.......::tuap
36b0: 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 69 6e 73 6d  i::syscall::insm
36c0: 6f 64 20 24 6d 6f 64 75 6c 65 20 24 6d 6f 64 75  od $module $modu
36d0: 6c 65 5f 61 72 67 73 0a 09 09 09 09 09 7d 20 65  le_args......} e
36e0: 6c 73 65 20 7b 0a 09 09 09 09 09 09 3a 3a 74 75  lse {.......::tu
36f0: 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 69 6e  api::syscall::in
3700: 73 6d 6f 64 20 24 6d 6f 64 75 6c 65 0a 09 09 09  smod $module....
3710: 09 09 7d 0a 09 09 09 09 7d 5d 7d 20 7b 0a 09 09  ..}.....}]} {...
3720: 09 09 09 63 6f 6e 74 69 6e 75 65 0a 09 09 09 09  ...continue.....
3730: 7d 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 70 70 65  }....}.....lappe
3740: 6e 64 20 72 65 74 76 61 6c 20 24 6d 6f 64 75 6c  nd retval $modul
3750: 65 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72  e...}..}...retur
3760: 6e 20 24 72 65 74 76 61 6c 0a 7d 0a 0a 23 20 53  n $retval.}..# S
3770: 63 61 6e 20 74 68 65 20 76 61 72 69 6f 75 73 20  can the various 
3780: 62 75 73 65 73 20 61 74 74 61 63 68 65 64 20 74  buses attached t
3790: 6f 20 74 68 65 20 73 79 73 74 65 6d 20 61 6e 64  o the system and
37a0: 20 6c 6f 61 64 20 74 68 65 20 61 70 70 72 6f 70   load the approp
37b0: 72 69 61 74 65 0a 23 20 6b 65 72 6e 65 6c 20 6d  riate.# kernel m
37c0: 6f 64 75 6c 65 73 0a 70 72 6f 63 20 3a 3a 74 75  odules.proc ::tu
37d0: 61 70 69 3a 3a 73 63 61 6e 5f 61 6e 64 5f 6c 6f  api::scan_and_lo
37e0: 61 64 5f 6b 65 72 6e 65 6c 5f 6d 6f 64 75 6c 65  ad_kernel_module
37f0: 73 20 61 72 67 73 20 7b 0a 09 73 65 74 20 70 61  s args {..set pa
3800: 72 61 6d 65 74 65 72 73 20 5b 6c 69 73 74 20 22  rameters [list "
3810: 61 74 61 5f 67 65 6e 65 72 69 63 2e 61 6c 6c 5f  ata_generic.all_
3820: 67 65 6e 65 72 69 63 5f 69 64 65 3d 31 22 5d 0a  generic_ide=1"].
3830: 09 66 6f 72 65 61 63 68 20 61 72 67 20 24 61 72  .foreach arg $ar
3840: 67 73 20 7b 0a 09 09 69 66 20 7b 5b 69 6e 66 6f  gs {...if {[info
3850: 20 65 78 69 73 74 73 20 76 61 72 5f 74 6f 5f 73   exists var_to_s
3860: 65 74 5d 7d 20 7b 0a 09 09 09 73 65 74 20 24 76  et]} {....set $v
3870: 61 72 5f 74 6f 5f 73 65 74 20 24 61 72 67 0a 0a  ar_to_set $arg..
3880: 09 09 09 75 6e 73 65 74 20 76 61 72 5f 74 6f 5f  ...unset var_to_
3890: 73 65 74 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65  set.....continue
38a0: 0a 09 09 7d 0a 0a 09 09 69 66 20 7b 5b 69 6e 66  ...}....if {[inf
38b0: 6f 20 65 78 69 73 74 73 20 76 61 72 5f 74 6f 5f  o exists var_to_
38c0: 6c 61 70 70 65 6e 64 5d 7d 20 7b 0a 09 09 09 6c  lappend]} {....l
38d0: 61 70 70 65 6e 64 20 24 76 61 72 5f 74 6f 5f 6c  append $var_to_l
38e0: 61 70 70 65 6e 64 20 24 61 72 67 0a 0a 09 09 09  append $arg.....
38f0: 75 6e 73 65 74 20 76 61 72 5f 74 6f 5f 6c 61 70  unset var_to_lap
3900: 70 65 6e 64 0a 0a 09 09 09 63 6f 6e 74 69 6e 75  pend.....continu
3910: 65 0a 09 09 7d 0a 0a 09 09 73 77 69 74 63 68 20  e...}....switch 
3920: 2d 2d 20 24 61 72 67 20 7b 0a 09 09 09 22 2d 61  -- $arg {...."-a
3930: 72 67 22 20 7b 0a 09 09 09 09 73 65 74 20 76 61  rg" {.....set va
3940: 72 5f 74 6f 5f 6c 61 70 70 65 6e 64 20 70 61 72  r_to_lappend par
3950: 61 6d 65 74 65 72 73 0a 09 09 09 7d 0a 09 09 09  ameters....}....
3960: 22 2d 61 72 67 73 22 20 7b 0a 09 09 09 09 73 65  "-args" {.....se
3970: 74 20 76 61 72 5f 74 6f 5f 73 65 74 20 70 61 72  t var_to_set par
3980: 61 6d 65 74 65 72 73 0a 09 09 09 7d 0a 09 09 09  ameters....}....
3990: 64 65 66 61 75 6c 74 20 7b 0a 09 09 09 09 72 65  default {.....re
39a0: 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72  turn -code error
39b0: 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "Unknown option
39c0: 3a 20 24 61 72 67 22 0a 09 09 09 7d 0a 09 09 7d  : $arg"....}...}
39d0: 0a 09 7d 0a 0a 09 73 65 74 20 6d 6f 64 75 6c 65  ..}...set module
39e0: 73 20 5b 6c 69 73 74 5d 0a 0a 09 23 20 44 65 74  s [list]...# Det
39f0: 65 72 6d 69 6e 65 20 77 68 69 63 68 20 6d 6f 64  ermine which mod
3a00: 75 6c 65 73 20 61 72 65 20 61 6c 72 65 61 64 79  ules are already
3a10: 20 6c 6f 61 64 65 64 0a 09 66 6f 72 65 61 63 68   loaded..foreach
3a20: 20 6d 6f 64 75 6c 65 20 5b 67 6c 6f 62 20 2d 74   module [glob -t
3a30: 61 69 6c 73 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  ails -nocomplain
3a40: 20 2d 64 69 72 65 63 74 6f 72 79 20 2f 73 79 73   -directory /sys
3a50: 2f 6d 6f 64 75 6c 65 20 2d 74 79 70 65 20 64 20  /module -type d 
3a60: 2a 5d 20 7b 0a 09 09 73 65 74 20 61 6c 74 5f 6d  *] {...set alt_m
3a70: 6f 64 75 6c 65 31 20 5b 73 74 72 69 6e 67 20 6d  odule1 [string m
3a80: 61 70 20 5b 6c 69 73 74 20 22 5f 22 20 22 2d 22  ap [list "_" "-"
3a90: 5d 20 24 6d 6f 64 75 6c 65 5d 0a 09 09 73 65 74  ] $module]...set
3aa0: 20 61 6c 74 5f 6d 6f 64 75 6c 65 32 20 5b 73 74   alt_module2 [st
3ab0: 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 22  ring map [list "
3ac0: 2d 22 20 22 5f 22 5d 20 24 6d 6f 64 75 6c 65 5d  -" "_"] $module]
3ad0: 0a 0a 09 09 73 65 74 20 6c 6f 61 64 65 64 28 24  ....set loaded($
3ae0: 6d 6f 64 75 6c 65 29 20 31 0a 09 09 73 65 74 20  module) 1...set 
3af0: 6c 6f 61 64 65 64 28 24 61 6c 74 5f 6d 6f 64 75  loaded($alt_modu
3b00: 6c 65 31 29 20 31 0a 09 09 73 65 74 20 6c 6f 61  le1) 1...set loa
3b10: 64 65 64 28 24 61 6c 74 5f 6d 6f 64 75 6c 65 32  ded($alt_module2
3b20: 29 20 31 0a 09 7d 0a 0a 09 3a 3a 74 75 61 70 69  ) 1..}...::tuapi
3b30: 3a 3a 68 65 6c 70 65 72 3a 3a 72 65 63 75 72 73  ::helper::recurs
3b40: 69 76 65 5f 67 6c 6f 62 20 2f 73 79 73 2f 64 65  ive_glob /sys/de
3b50: 76 69 63 65 73 20 6d 6f 64 61 6c 69 61 73 20 7b  vices modalias {
3b60: 0a 09 09 73 65 74 20 66 64 20 5b 6f 70 65 6e 20  ...set fd [open 
3b70: 24 66 69 6c 65 6e 61 6d 65 20 72 5d 0a 09 09 3a  $filename r]...:
3b80: 3a 74 75 61 70 69 3a 3a 68 65 6c 70 65 72 3a 3a  :tuapi::helper::
3b90: 66 6f 72 65 61 63 68 5f 6c 69 6e 65 20 24 66 64  foreach_line $fd
3ba0: 20 22 5c 6e 22 20 7b 0a 09 09 09 66 6f 72 65 61   "\n" {....forea
3bb0: 63 68 20 6d 6f 64 75 6c 65 20 5b 3a 3a 74 75 61  ch module [::tua
3bc0: 70 69 3a 3a 6d 6f 64 70 72 6f 62 65 20 2d 64 6f  pi::modprobe -do
3bd0: 6e 74 6c 6f 61 64 20 2d 2d 20 24 6c 69 6e 65 5d  ntload -- $line]
3be0: 20 7b 0a 09 09 09 09 69 66 20 7b 5b 6c 73 65 61   {.....if {[lsea
3bf0: 72 63 68 20 2d 65 78 61 63 74 20 24 6d 6f 64 75  rch -exact $modu
3c00: 6c 65 73 20 24 6d 6f 64 75 6c 65 5d 20 21 3d 20  les $module] != 
3c10: 2d 31 7d 20 7b 0a 09 09 09 09 09 63 6f 6e 74 69  -1} {......conti
3c20: 6e 75 65 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  nue.....}......i
3c30: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
3c40: 20 24 6d 6f 64 75 6c 65 5d 7d 20 7b 0a 09 09 09   $module]} {....
3c50: 09 09 63 6f 6e 74 69 6e 75 65 0a 09 09 09 09 7d  ..continue.....}
3c60: 0a 0a 09 09 09 09 73 65 74 20 72 6f 6f 74 6e 61  ......set rootna
3c70: 6d 65 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d  me [file rootnam
3c80: 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 6d 6f  e [file tail $mo
3c90: 64 75 6c 65 5d 5d 0a 09 09 09 09 69 66 20 7b 5b  dule]].....if {[
3ca0: 69 6e 66 6f 20 65 78 69 73 74 73 20 6c 6f 61 64  info exists load
3cb0: 65 64 28 24 72 6f 6f 74 6e 61 6d 65 29 5d 7d 20  ed($rootname)]} 
3cc0: 7b 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 0a  {......continue.
3cd0: 09 09 09 09 7d 0a 0a 09 09 09 09 6c 61 70 70 65  ....}......lappe
3ce0: 6e 64 20 6d 6f 64 75 6c 65 73 20 24 6d 6f 64 75  nd modules $modu
3cf0: 6c 65 0a 09 09 09 7d 0a 09 09 7d 0a 09 09 63 6c  le....}...}...cl
3d00: 6f 73 65 20 24 66 64 0a 09 7d 0a 0a 09 73 65 74  ose $fd..}...set
3d10: 20 66 61 69 6c 65 64 5f 74 6f 5f 6c 6f 61 64 20   failed_to_load 
3d20: 5b 6c 69 73 74 5d 0a 09 73 65 74 20 61 62 6c 65  [list]..set able
3d30: 5f 74 6f 5f 6c 6f 61 64 20 5b 6c 69 73 74 5d 0a  _to_load [list].
3d40: 09 66 6f 72 65 61 63 68 20 6d 6f 64 75 6c 65 20  .foreach module 
3d50: 24 6d 6f 64 75 6c 65 73 20 7b 0a 09 09 69 66 20  $modules {...if 
3d60: 7b 5b 3a 3a 74 75 61 70 69 3a 3a 6d 6f 64 70 72  {[::tuapi::modpr
3d70: 6f 62 65 20 2d 61 72 67 73 20 24 70 61 72 61 6d  obe -args $param
3d80: 65 74 65 72 73 20 24 6d 6f 64 75 6c 65 5d 20 3d  eters $module] =
3d90: 3d 20 22 22 7d 20 7b 0a 09 09 09 6c 61 70 70 65  = ""} {....lappe
3da0: 6e 64 20 66 61 69 6c 65 64 5f 74 6f 5f 6c 6f 61  nd failed_to_loa
3db0: 64 20 24 6d 6f 64 75 6c 65 0a 09 09 7d 20 65 6c  d $module...} el
3dc0: 73 65 20 7b 0a 09 09 09 6c 61 70 70 65 6e 64 20  se {....lappend 
3dd0: 61 62 6c 65 5f 74 6f 5f 6c 6f 61 64 20 24 6d 6f  able_to_load $mo
3de0: 64 75 6c 65 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65  dule...}..}...re
3df0: 74 75 72 6e 20 5b 6c 69 73 74 20 2d 66 61 69 6c  turn [list -fail
3e00: 65 64 20 24 66 61 69 6c 65 64 5f 74 6f 5f 6c 6f  ed $failed_to_lo
3e10: 61 64 20 2d 6c 6f 61 64 65 64 20 24 61 62 6c 65  ad -loaded $able
3e20: 5f 74 6f 5f 6c 6f 61 64 5d 0a 7d 0a 0a 23 20 43  _to_load].}..# C
3e30: 72 65 61 74 65 20 55 4e 49 58 2d 6c 69 6b 65 20  reate UNIX-like 
3e40: 70 72 6f 63 73 20 6d 65 61 6e 74 20 74 6f 20 62  procs meant to b
3e50: 65 20 75 73 65 64 20 69 6e 74 65 72 61 63 74 69  e used interacti
3e60: 76 65 6c 79 0a 70 72 6f 63 20 3a 3a 74 75 61 70  vely.proc ::tuap
3e70: 69 3a 3a 63 72 65 61 74 65 5f 75 6e 69 78 5f 63  i::create_unix_c
3e80: 6f 6d 6d 61 6e 64 73 20 7b 7d 20 7b 0a 09 70 72  ommands {} {..pr
3e90: 6f 63 20 3a 3a 63 61 74 20 61 72 67 73 20 7b 0a  oc ::cat args {.
3ea0: 09 09 66 6f 72 65 61 63 68 20 66 69 6c 65 20 24  ..foreach file $
3eb0: 61 72 67 73 20 7b 0a 09 09 09 69 66 20 7b 5b 63  args {....if {[c
3ec0: 61 74 63 68 20 7b 0a 09 09 09 09 73 65 74 20 66  atch {.....set f
3ed0: 64 20 5b 6f 70 65 6e 20 24 66 69 6c 65 5d 0a 09  d [open $file]..
3ee0: 09 09 7d 20 65 72 72 5d 7d 20 7b 0a 09 09 09 09  ..} err]} {.....
3ef0: 70 75 74 73 20 73 74 64 65 72 72 20 22 55 6e 61  puts stderr "Una
3f00: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 5c 22 24 66  ble to open \"$f
3f10: 69 6c 65 5c 22 3a 20 24 65 72 72 22 0a 0a 09 09  ile\": $err"....
3f20: 09 09 63 6f 6e 74 69 6e 75 65 0a 09 09 09 7d 0a  ..continue....}.
3f30: 0a 09 09 09 66 63 6f 70 79 20 24 66 64 20 73 74  ....fcopy $fd st
3f40: 64 6f 75 74 0a 09 09 09 63 6c 6f 73 65 20 24 66  dout....close $f
3f50: 64 0a 09 09 7d 0a 09 7d 0a 0a 09 70 72 6f 63 20  d...}..}...proc 
3f60: 3a 3a 6c 73 20 61 72 67 73 20 7b 0a 09 09 73 65  ::ls args {...se
3f70: 74 20 6f 70 74 69 6f 6e 73 28 6c 6f 6e 67 29 20  t options(long) 
3f80: 30 0a 09 09 73 65 74 20 6f 70 74 69 6f 6e 73 28  0...set options(
3f90: 6f 6e 65 29 20 30 0a 09 09 73 65 74 20 6f 70 74  one) 0...set opt
3fa0: 69 6f 6e 73 28 73 6b 69 70 64 6f 74 29 20 31 0a  ions(skipdot) 1.
3fb0: 09 09 73 65 74 20 6f 70 74 69 6f 6e 73 28 6e 6f  ..set options(no
3fc0: 72 65 63 75 72 73 65 69 6e 74 6f 74 6f 70 6c 65  recurseintotople
3fd0: 76 65 6c 64 69 72 73 29 20 30 0a 0a 09 09 73 65  veldirs) 0....se
3fe0: 74 20 69 64 78 20 30 0a 09 09 66 6f 72 65 61 63  t idx 0...foreac
3ff0: 68 20 61 72 67 20 24 61 72 67 73 20 7b 0a 09 09  h arg $args {...
4000: 09 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74  .if {[string mat
4010: 63 68 20 22 2d 2a 22 20 24 61 72 67 5d 7d 20 7b  ch "-*" $arg]} {
4020: 0a 09 09 09 09 73 65 74 20 61 72 67 73 20 5b 6c  .....set args [l
4030: 72 65 70 6c 61 63 65 20 24 61 72 67 73 20 24 69  replace $args $i
4040: 64 78 20 24 69 64 78 5d 0a 09 09 09 09 69 66 20  dx $idx].....if 
4050: 7b 24 61 72 67 20 3d 3d 20 22 2d 2d 22 7d 20 7b  {$arg == "--"} {
4060: 0a 09 09 09 09 09 62 72 65 61 6b 0a 09 09 09 09  ......break.....
4070: 7d 0a 0a 09 09 09 09 69 66 20 7b 5b 73 74 72 69  }......if {[stri
4080: 6e 67 20 72 61 6e 67 65 20 24 61 72 67 20 30 20  ng range $arg 0 
4090: 31 5d 20 3d 3d 20 22 2d 2d 22 7d 20 7b 0a 09 09  1] == "--"} {...
40a0: 09 09 09 73 65 74 20 6f 70 74 73 20 5b 6c 69 73  ...set opts [lis
40b0: 74 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20  t [string range 
40c0: 24 61 72 67 20 32 20 65 6e 64 5d 5d 0a 09 09 09  $arg 2 end]]....
40d0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 73  .} else {......s
40e0: 65 74 20 6f 70 74 73 20 5b 73 70 6c 69 74 20 5b  et opts [split [
40f0: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 61 72  string range $ar
4100: 67 20 31 20 65 6e 64 5d 20 22 22 5d 0a 09 09 09  g 1 end] ""]....
4110: 09 7d 0a 0a 09 09 09 09 66 6f 72 65 61 63 68 20  .}......foreach 
4120: 6f 70 74 20 24 6f 70 74 73 20 7b 0a 09 09 09 09  opt $opts {.....
4130: 09 73 77 69 74 63 68 20 2d 2d 20 24 6f 70 74 20  .switch -- $opt 
4140: 7b 0a 09 09 09 09 09 09 22 6c 22 20 7b 0a 09 09  {......."l" {...
4150: 09 09 09 09 09 73 65 74 20 6f 70 74 69 6f 6e 73  .....set options
4160: 28 6c 6f 6e 67 29 20 31 0a 09 09 09 09 09 09 09  (long) 1........
4170: 73 65 74 20 6f 70 74 69 6f 6e 73 28 6f 6e 65 29  set options(one)
4180: 20 30 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09   0.......}......
4190: 09 22 31 22 20 7b 0a 09 09 09 09 09 09 09 73 65  ."1" {........se
41a0: 74 20 6f 70 74 69 6f 6e 73 28 6f 6e 65 29 20 31  t options(one) 1
41b0: 0a 09 09 09 09 09 09 09 73 65 74 20 6f 70 74 69  ........set opti
41c0: 6f 6e 73 28 6c 6f 6e 67 29 20 30 0a 09 09 09 09  ons(long) 0.....
41d0: 09 09 7d 0a 09 09 09 09 09 09 22 64 22 20 7b 0a  ..}......."d" {.
41e0: 09 09 09 09 09 09 09 73 65 74 20 6f 70 74 69 6f  .......set optio
41f0: 6e 73 28 6e 6f 72 65 63 75 72 73 65 69 6e 74 6f  ns(norecurseinto
4200: 74 6f 70 6c 65 76 65 6c 64 69 72 73 29 20 31 0a  topleveldirs) 1.
4210: 09 09 09 09 09 09 7d 0a 09 09 09 09 09 09 22 61  ......}......."a
4220: 22 20 7b 0a 09 09 09 09 09 09 09 73 65 74 20 6f  " {........set o
4230: 70 74 69 6f 6e 73 28 73 6b 69 70 64 6f 74 29 20  ptions(skipdot) 
4240: 30 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d  0.......}......}
4250: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 6f 6e 74  .....}......cont
4260: 69 6e 75 65 0a 09 09 09 7d 0a 0a 09 09 09 69 6e  inue....}.....in
4270: 63 72 20 69 64 78 0a 09 09 7d 0a 0a 09 09 69 66  cr idx...}....if
4280: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67 73   {[llength $args
4290: 5d 20 3d 3d 20 30 7d 20 7b 0a 09 09 09 73 65 74  ] == 0} {....set
42a0: 20 61 72 67 73 20 5b 6c 69 73 74 20 22 2e 22 5d   args [list "."]
42b0: 0a 09 09 7d 0a 0a 09 09 73 65 74 20 6e 6f 64 65  ...}....set node
42c0: 73 20 5b 6c 69 73 74 5d 0a 09 09 66 6f 72 65 61  s [list]...forea
42d0: 63 68 20 61 72 67 20 24 61 72 67 73 20 7b 0a 09  ch arg $args {..
42e0: 09 09 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c  ..unset -nocompl
42f0: 61 69 6e 20 66 69 6c 65 69 6e 66 6f 0a 09 09 09  ain fileinfo....
4300: 63 61 74 63 68 20 7b 0a 09 09 09 09 66 69 6c 65  catch {.....file
4310: 20 73 74 61 74 20 24 61 72 67 20 66 69 6c 65 69   stat $arg filei
4320: 6e 66 6f 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  nfo....}.....if 
4330: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 66  {![info exists f
4340: 69 6c 65 69 6e 66 6f 5d 7d 20 7b 0a 09 09 09 09  ileinfo]} {.....
4350: 70 75 74 73 20 73 74 64 65 72 72 20 22 4e 6f 20  puts stderr "No 
4360: 73 75 63 68 20 66 69 6c 65 20 6f 72 20 64 69 72  such file or dir
4370: 65 63 74 6f 72 79 3a 20 24 61 72 67 22 0a 0a 09  ectory: $arg"...
4380: 09 09 09 63 6f 6e 74 69 6e 75 65 0a 09 09 09 7d  ...continue....}
4390: 0a 0a 09 09 09 69 66 20 7b 24 66 69 6c 65 69 6e  .....if {$filein
43a0: 66 6f 28 74 79 70 65 29 20 3d 3d 20 22 64 69 72  fo(type) == "dir
43b0: 65 63 74 6f 72 79 22 7d 20 7b 0a 09 09 09 09 69  ectory"} {.....i
43c0: 66 20 7b 24 6f 70 74 69 6f 6e 73 28 6e 6f 72 65  f {$options(nore
43d0: 63 75 72 73 65 69 6e 74 6f 74 6f 70 6c 65 76 65  curseintotopleve
43e0: 6c 64 69 72 73 29 7d 20 7b 0a 09 09 09 09 09 6c  ldirs)} {......l
43f0: 61 70 70 65 6e 64 20 6e 6f 64 65 73 20 24 61 72  append nodes $ar
4400: 67 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  g.....} else {..
4410: 09 09 09 09 6c 61 70 70 65 6e 64 20 6e 6f 64 65  ....lappend node
4420: 73 20 7b 2a 7d 5b 67 6c 6f 62 20 2d 6e 6f 63 6f  s {*}[glob -noco
4430: 6d 70 6c 61 69 6e 20 2d 64 69 72 65 63 74 6f 72  mplain -director
4440: 79 20 24 61 72 67 20 2d 74 61 69 6c 73 20 2a 5d  y $arg -tails *]
4450: 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
4460: 20 7b 0a 09 09 09 09 6c 61 70 70 65 6e 64 20 6e   {.....lappend n
4470: 6f 64 65 73 20 24 61 72 67 0a 09 09 09 7d 0a 0a  odes $arg....}..
4480: 09 09 7d 0a 0a 09 09 73 65 74 20 6e 65 77 6c 69  ..}....set newli
4490: 6e 65 5f 72 65 71 75 69 72 65 64 20 30 0a 09 09  ne_required 0...
44a0: 66 6f 72 65 61 63 68 20 6e 6f 64 65 20 24 6e 6f  foreach node $no
44b0: 64 65 73 20 7b 0a 09 09 09 75 6e 73 65 74 20 2d  des {....unset -
44c0: 6e 6f 63 6f 6d 70 6c 61 69 6e 20 66 69 6c 65 69  nocomplain filei
44d0: 6e 66 6f 0a 0a 09 09 09 69 66 20 7b 24 6f 70 74  nfo.....if {$opt
44e0: 69 6f 6e 73 28 6f 6e 65 29 7d 20 7b 0a 09 09 09  ions(one)} {....
44f0: 09 70 75 74 73 20 24 6e 6f 64 65 0a 09 09 09 7d  .puts $node....}
4500: 20 65 6c 73 65 69 66 20 7b 24 6f 70 74 69 6f 6e   elseif {$option
4510: 73 28 6c 6f 6e 67 29 7d 20 7b 0a 09 09 09 09 63  s(long)} {.....c
4520: 61 74 63 68 20 7b 0a 09 09 09 09 09 66 69 6c 65  atch {......file
4530: 20 73 74 61 74 20 24 6e 6f 64 65 20 66 69 6c 65   stat $node file
4540: 69 6e 66 6f 0a 09 09 09 09 7d 0a 0a 09 09 09 09  info.....}......
4550: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
4560: 73 20 66 69 6c 65 69 6e 66 6f 5d 7d 20 7b 0a 09  s fileinfo]} {..
4570: 09 09 09 09 61 72 72 61 79 20 73 65 74 20 66 69  ....array set fi
4580: 6c 65 69 6e 66 6f 20 5b 6c 69 73 74 20 6d 6f 64  leinfo [list mod
4590: 65 20 30 20 6e 6c 69 6e 6b 20 30 20 75 69 64 20  e 0 nlink 0 uid 
45a0: 2d 31 20 67 69 64 20 2d 31 20 73 69 7a 65 20 30  -1 gid -1 size 0
45b0: 20 6d 74 69 6d 65 20 30 5d 0a 09 09 09 09 7d 0a   mtime 0].....}.
45c0: 0a 09 09 09 09 73 65 74 20 64 61 74 65 20 5b 63  .....set date [c
45d0: 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 24 66 69 6c  lock format $fil
45e0: 65 69 6e 66 6f 28 6d 74 69 6d 65 29 20 2d 66 6f  einfo(mtime) -fo
45f0: 72 6d 61 74 20 7b 25 62 20 25 65 20 25 48 3a 25  rmat {%b %e %H:%
4600: 4d 7d 5d 0a 0a 09 09 09 09 73 77 69 74 63 68 20  M}]......switch 
4610: 2d 2d 20 24 66 69 6c 65 69 6e 66 6f 28 74 79 70  -- $fileinfo(typ
4620: 65 29 20 7b 0a 09 09 09 09 09 22 64 69 72 65 63  e) {......"direc
4630: 74 6f 72 79 22 20 7b 0a 09 09 09 09 09 09 73 65  tory" {.......se
4640: 74 20 74 79 70 65 69 64 20 22 64 22 0a 09 09 09  t typeid "d"....
4650: 09 09 7d 0a 09 09 09 09 09 22 62 6c 6f 63 6b 53  ..}......"blockS
4660: 70 65 63 69 61 6c 22 20 7b 0a 09 09 09 09 09 09  pecial" {.......
4670: 73 65 74 20 74 79 70 65 69 64 20 22 62 22 0a 09  set typeid "b"..
4680: 09 09 09 09 7d 0a 09 09 09 09 09 22 63 68 61 72  ....}......"char
4690: 61 63 74 65 72 53 70 65 63 69 61 6c 22 20 7b 0a  acterSpecial" {.
46a0: 09 09 09 09 09 09 73 65 74 20 74 79 70 65 69 64  ......set typeid
46b0: 20 22 63 22 0a 09 09 09 09 09 7d 0a 09 09 09 09   "c"......}.....
46c0: 09 22 66 69 6c 65 22 20 7b 0a 09 09 09 09 09 09  ."file" {.......
46d0: 73 65 74 20 74 79 70 65 69 64 20 22 2d 22 0a 09  set typeid "-"..
46e0: 09 09 09 09 7d 0a 09 09 09 09 09 22 73 6f 63 6b  ....}......"sock
46f0: 65 74 22 20 7b 0a 09 09 09 09 09 09 73 65 74 20  et" {.......set 
4700: 74 79 70 65 69 64 20 22 73 22 0a 09 09 09 09 09  typeid "s"......
4710: 7d 0a 09 09 09 09 09 64 65 66 61 75 6c 74 20 7b  }......default {
4720: 0a 09 09 09 09 09 09 73 65 74 20 74 79 70 65 69  .......set typei
4730: 64 20 22 3f 22 0a 09 09 09 09 09 7d 0a 09 09 09  d "?"......}....
4740: 09 7d 0a 0a 09 09 09 09 70 75 74 73 20 5b 66 6f  .}......puts [fo
4750: 72 6d 61 74 20 7b 25 73 25 30 34 6f 20 25 35 73  rmat {%s%04o %5s
4760: 20 25 36 73 20 25 36 73 20 25 31 30 73 20 25 31   %6s %6s %10s %1
4770: 32 73 20 25 73 7d 20 24 74 79 70 65 69 64 20 5b  2s %s} $typeid [
4780: 65 78 70 72 20 7b 24 66 69 6c 65 69 6e 66 6f 28  expr {$fileinfo(
4790: 6d 6f 64 65 29 20 26 20 30 37 37 37 37 7d 5d 20  mode) & 07777}] 
47a0: 24 66 69 6c 65 69 6e 66 6f 28 6e 6c 69 6e 6b 29  $fileinfo(nlink)
47b0: 20 24 66 69 6c 65 69 6e 66 6f 28 75 69 64 29 20   $fileinfo(uid) 
47c0: 24 66 69 6c 65 69 6e 66 6f 28 67 69 64 29 20 24  $fileinfo(gid) $
47d0: 66 69 6c 65 69 6e 66 6f 28 73 69 7a 65 29 20 24  fileinfo(size) $
47e0: 64 61 74 65 20 24 6e 6f 64 65 5d 0a 0a 09 09 09  date $node].....
47f0: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 70 75 74  } else {.....put
4800: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22 24 6e  s -nonewline "$n
4810: 6f 64 65 20 22 0a 09 09 09 09 73 65 74 20 6e 65  ode ".....set ne
4820: 77 6c 69 6e 65 5f 72 65 71 75 69 72 65 64 20 31  wline_required 1
4830: 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20  ....}...}....if 
4840: 7b 24 6e 65 77 6c 69 6e 65 5f 72 65 71 75 69 72  {$newline_requir
4850: 65 64 7d 20 7b 0a 09 09 09 70 75 74 73 20 22 22  ed} {....puts ""
4860: 0a 09 09 7d 0a 09 7d 0a 0a 09 70 72 6f 63 20 3a  ...}..}...proc :
4870: 3a 6d 6f 64 70 72 6f 62 65 20 61 72 67 73 20 7b  :modprobe args {
4880: 0a 09 09 3a 3a 74 75 61 70 69 3a 3a 6d 6f 64 70  ...::tuapi::modp
4890: 72 6f 62 65 20 7b 2a 7d 24 61 72 67 73 0a 09 7d  robe {*}$args..}
48a0: 0a 0a 09 70 72 6f 63 20 3a 3a 70 73 20 7b 7d 20  ...proc ::ps {} 
48b0: 7b 0a 09 09 73 65 74 20 66 6f 72 6d 61 74 20 7b  {...set format {
48c0: 25 2d 36 73 20 25 35 73 20 25 35 73 20 25 33 73  %-6s %5s %5s %3s
48d0: 20 25 35 73 20 25 2d 36 73 20 25 38 73 20 25 73   %5s %-6s %8s %s
48e0: 7d 0a 09 09 70 75 74 73 20 5b 66 6f 72 6d 61 74  }...puts [format
48f0: 20 24 66 6f 72 6d 61 74 20 55 49 44 20 50 49 44   $format UID PID
4900: 20 50 50 49 44 20 43 20 53 54 49 4d 45 20 54 54   PPID C STIME TT
4910: 59 20 54 49 4d 45 20 43 4d 44 5d 0a 09 09 66 6f  Y TIME CMD]...fo
4920: 72 65 61 63 68 20 70 69 64 20 5b 6c 73 6f 72 74  reach pid [lsort
4930: 20 2d 64 69 63 74 69 6f 6e 61 72 79 20 5b 67 6c   -dictionary [gl
4940: 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 2d  ob -nocomplain -
4950: 64 69 72 65 63 74 6f 72 79 20 2f 70 72 6f 63 20  directory /proc 
4960: 2d 74 61 69 6c 73 20 7b 5b 30 2d 39 5d 2a 7d 5d  -tails {[0-9]*}]
4970: 5d 20 7b 0a 09 09 09 69 66 20 7b 21 5b 73 74 72  ] {....if {![str
4980: 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20 24  ing is integer $
4990: 70 69 64 5d 7d 20 7b 0a 09 09 09 09 63 6f 6e 74  pid]} {.....cont
49a0: 69 6e 75 65 0a 09 09 09 7d 0a 0a 09 09 09 73 65  inue....}.....se
49b0: 74 20 70 72 6f 63 66 69 6c 65 20 5b 66 69 6c 65  t procfile [file
49c0: 20 6a 6f 69 6e 20 2f 70 72 6f 63 20 24 70 69 64   join /proc $pid
49d0: 5d 0a 0a 09 09 09 75 6e 73 65 74 20 2d 6e 6f 63  ].....unset -noc
49e0: 6f 6d 70 6c 61 69 6e 20 70 69 64 69 6e 66 6f 0a  omplain pidinfo.
49f0: 09 09 09 63 61 74 63 68 20 7b 0a 09 09 09 09 66  ...catch {.....f
4a00: 69 6c 65 20 73 74 61 74 20 24 70 72 6f 63 66 69  ile stat $procfi
4a10: 6c 65 20 70 69 64 69 6e 66 6f 0a 09 09 09 7d 0a  le pidinfo....}.
4a20: 0a 09 09 09 69 66 20 7b 21 5b 69 6e 66 6f 20 65  ....if {![info e
4a30: 78 69 73 74 73 20 70 69 64 69 6e 66 6f 5d 7d 20  xists pidinfo]} 
4a40: 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 0a 09  {.....continue..
4a50: 09 09 7d 0a 0a 09 09 09 73 65 74 20 70 69 64 69  ..}.....set pidi
4a60: 6e 66 6f 28 70 69 64 29 20 24 70 69 64 0a 09 09  nfo(pid) $pid...
4a70: 09 73 65 74 20 70 69 64 69 6e 66 6f 28 70 70 69  .set pidinfo(ppi
4a80: 64 29 20 3f 0a 09 09 09 73 65 74 20 70 69 64 69  d) ?....set pidi
4a90: 6e 66 6f 28 63 70 75 75 74 69 6c 29 20 3f 0a 09  nfo(cpuutil) ?..
4aa0: 09 09 73 65 74 20 70 69 64 69 6e 66 6f 28 73 74  ..set pidinfo(st
4ab0: 61 72 74 74 69 6d 65 29 20 3f 0a 09 09 09 73 65  arttime) ?....se
4ac0: 74 20 70 69 64 69 6e 66 6f 28 74 74 79 29 20 3f  t pidinfo(tty) ?
4ad0: 0a 09 09 09 73 65 74 20 70 69 64 69 6e 66 6f 28  ....set pidinfo(
4ae0: 63 70 75 74 69 6d 65 29 20 3f 0a 09 09 09 73 65  cputime) ?....se
4af0: 74 20 70 69 64 69 6e 66 6f 28 63 6d 64 29 20 22  t pidinfo(cmd) "
4b00: 22 0a 0a 09 09 09 75 6e 73 65 74 20 2d 6e 6f 63  ".....unset -noc
4b10: 6f 6d 70 6c 61 69 6e 20 66 64 0a 09 09 09 63 61  omplain fd....ca
4b20: 74 63 68 20 7b 0a 09 09 09 09 73 65 74 20 66 64  tch {.....set fd
4b30: 20 5b 6f 70 65 6e 20 5b 66 69 6c 65 20 6a 6f 69   [open [file joi
4b40: 6e 20 24 70 72 6f 63 66 69 6c 65 20 63 6d 64 6c  n $procfile cmdl
4b50: 69 6e 65 5d 5d 0a 09 09 09 7d 0a 09 09 09 69 66  ine]]....}....if
4b60: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 66   {[info exists f
4b70: 64 5d 7d 20 7b 0a 09 09 09 09 73 65 74 20 70 69  d]} {.....set pi
4b80: 64 69 6e 66 6f 28 63 6d 64 29 20 5b 73 74 72 69  dinfo(cmd) [stri
4b90: 6e 67 20 74 72 69 6d 20 5b 6a 6f 69 6e 20 5b 73  ng trim [join [s
4ba0: 70 6c 69 74 20 5b 72 65 61 64 20 24 66 64 5d 20  plit [read $fd] 
4bb0: 22 5c 30 5c 6e 5c 72 22 5d 5d 5d 0a 09 09 09 09  "\0\n\r"]]].....
4bc0: 63 6c 6f 73 65 20 24 66 64 0a 09 09 09 09 75 6e  close $fd.....un
4bd0: 73 65 74 20 66 64 0a 09 09 09 7d 0a 09 09 09 69  set fd....}....i
4be0: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
4bf0: 20 70 69 64 69 6e 66 6f 28 63 6d 64 29 5d 20 7c   pidinfo(cmd)] |
4c00: 7c 20 24 70 69 64 69 6e 66 6f 28 63 6d 64 29 20  | $pidinfo(cmd) 
4c10: 3d 3d 20 22 22 7d 20 7b 0a 09 09 09 09 63 61 74  == ""} {.....cat
4c20: 63 68 20 7b 0a 09 09 09 09 09 73 65 74 20 66 64  ch {......set fd
4c30: 20 5b 6f 70 65 6e 20 5b 66 69 6c 65 20 6a 6f 69   [open [file joi
4c40: 6e 20 24 70 72 6f 63 66 69 6c 65 20 63 6f 6d 6d  n $procfile comm
4c50: 5d 5d 0a 09 09 09 09 7d 0a 09 09 09 09 69 66 20  ]].....}.....if 
4c60: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 66 64  {[info exists fd
4c70: 5d 7d 20 7b 0a 09 09 09 09 09 73 65 74 20 70 69  ]} {......set pi
4c80: 64 69 6e 66 6f 28 63 6d 64 29 20 22 5c 5b 5b 73  dinfo(cmd) "\[[s
4c90: 74 72 69 6e 67 20 74 72 69 6d 20 5b 6a 6f 69 6e  tring trim [join
4ca0: 20 5b 73 70 6c 69 74 20 5b 72 65 61 64 20 24 66   [split [read $f
4cb0: 64 5d 20 22 5c 30 5c 6e 5c 72 22 5d 5d 5d 5c 5d  d] "\0\n\r"]]]\]
4cc0: 22 0a 09 09 09 09 09 63 6c 6f 73 65 20 24 66 64  "......close $fd
4cd0: 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
4ce0: 70 75 74 73 20 5b 66 6f 72 6d 61 74 20 24 66 6f  puts [format $fo
4cf0: 72 6d 61 74 20 24 70 69 64 69 6e 66 6f 28 75 69  rmat $pidinfo(ui
4d00: 64 29 20 24 70 69 64 69 6e 66 6f 28 70 69 64 29  d) $pidinfo(pid)
4d10: 20 24 70 69 64 69 6e 66 6f 28 70 70 69 64 29 20   $pidinfo(ppid) 
4d20: 24 70 69 64 69 6e 66 6f 28 63 70 75 75 74 69 6c  $pidinfo(cpuutil
4d30: 29 20 24 70 69 64 69 6e 66 6f 28 73 74 61 72 74  ) $pidinfo(start
4d40: 74 69 6d 65 29 20 24 70 69 64 69 6e 66 6f 28 74  time) $pidinfo(t
4d50: 74 79 29 20 24 70 69 64 69 6e 66 6f 28 63 70 75  ty) $pidinfo(cpu
4d60: 74 69 6d 65 29 20 24 70 69 64 69 6e 66 6f 28 63  time) $pidinfo(c
4d70: 6d 64 29 5d 0a 09 09 7d 0a 09 7d 0a 0a 09 70 72  md)]...}..}...pr
4d80: 6f 63 20 3a 3a 64 6d 65 73 67 20 7b 7d 20 7b 0a  oc ::dmesg {} {.
4d90: 09 09 70 75 74 73 20 5b 3a 3a 74 75 61 70 69 3a  ..puts [::tuapi:
4da0: 3a 73 79 73 63 61 6c 6c 3a 3a 6b 6c 6f 67 63 74  :syscall::klogct
4db0: 6c 20 72 65 61 64 5d 0a 09 7d 0a 0a 09 70 72 6f  l read]..}...pro
4dc0: 63 20 3a 3a 75 6c 69 6d 69 74 20 7b 6c 69 6d 69  c ::ulimit {limi
4dd0: 74 20 7b 76 61 6c 20 22 22 7d 7d 20 7b 0a 09 09  t {val ""}} {...
4de0: 73 65 74 20 6d 61 70 70 69 6e 67 28 2d 63 29 20  set mapping(-c) 
4df0: 5b 6c 69 73 74 20 43 4f 52 45 5d 0a 09 09 73 65  [list CORE]...se
4e00: 74 20 6d 61 70 70 69 6e 67 28 2d 64 29 20 5b 6c  t mapping(-d) [l
4e10: 69 73 74 20 44 41 54 41 5d 0a 09 09 73 65 74 20  ist DATA]...set 
4e20: 6d 61 70 70 69 6e 67 28 2d 65 29 20 5b 6c 69 73  mapping(-e) [lis
4e30: 74 20 4e 49 43 45 5d 0a 09 09 73 65 74 20 6d 61  t NICE]...set ma
4e40: 70 70 69 6e 67 28 2d 66 29 20 5b 6c 69 73 74 20  pping(-f) [list 
4e50: 46 53 49 5a 45 5d 0a 09 09 73 65 74 20 6d 61 70  FSIZE]...set map
4e60: 70 69 6e 67 28 2d 69 29 20 5b 6c 69 73 74 20 53  ping(-i) [list S
4e70: 49 47 50 45 4e 44 49 4e 47 5d 0a 09 09 73 65 74  IGPENDING]...set
4e80: 20 6d 61 70 70 69 6e 67 28 2d 6c 29 20 5b 6c 69   mapping(-l) [li
4e90: 73 74 20 4d 45 4d 4c 4f 43 4b 5d 0a 09 09 73 65  st MEMLOCK]...se
4ea0: 74 20 6d 61 70 70 69 6e 67 28 2d 6d 29 20 5b 6c  t mapping(-m) [l
4eb0: 69 73 74 20 52 53 53 5d 0a 09 09 73 65 74 20 6d  ist RSS]...set m
4ec0: 61 70 70 69 6e 67 28 2d 6e 29 20 5b 6c 69 73 74  apping(-n) [list
4ed0: 20 4e 4f 46 49 4c 45 5d 0a 09 09 73 65 74 20 6d   NOFILE]...set m
4ee0: 61 70 70 69 6e 67 28 2d 71 29 20 5b 6c 69 73 74  apping(-q) [list
4ef0: 20 4d 53 47 51 55 45 55 45 5d 0a 09 09 73 65 74   MSGQUEUE]...set
4f00: 20 6d 61 70 70 69 6e 67 28 2d 72 29 20 5b 6c 69   mapping(-r) [li
4f10: 73 74 20 52 54 50 52 49 4f 5d 0a 09 09 73 65 74  st RTPRIO]...set
4f20: 20 6d 61 70 70 69 6e 67 28 2d 73 29 20 5b 6c 69   mapping(-s) [li
4f30: 73 74 20 53 54 41 43 4b 5d 0a 09 09 73 65 74 20  st STACK]...set 
4f40: 6d 61 70 70 69 6e 67 28 2d 74 29 20 5b 6c 69 73  mapping(-t) [lis
4f50: 74 20 43 50 55 5d 0a 09 09 73 65 74 20 6d 61 70  t CPU]...set map
4f60: 70 69 6e 67 28 2d 75 29 20 5b 6c 69 73 74 20 4e  ping(-u) [list N
4f70: 50 52 4f 43 5d 0a 09 09 73 65 74 20 6d 61 70 70  PROC]...set mapp
4f80: 69 6e 67 28 2d 76 29 20 5b 6c 69 73 74 20 41 53  ing(-v) [list AS
4f90: 5d 0a 09 09 73 65 74 20 6d 61 70 70 69 6e 67 28  ]...set mapping(
4fa0: 2d 78 29 20 5b 6c 69 73 74 20 4c 4f 43 4b 53 5d  -x) [list LOCKS]
4fb0: 0a 09 09 73 65 74 20 68 65 6c 70 28 43 4f 52 45  ...set help(CORE
4fc0: 29 20 7b 63 6f 72 65 20 66 69 6c 65 20 73 69 7a  ) {core file siz
4fd0: 65 20 20 20 20 20 20 20 20 20 20 28 62 6c 6f 63  e          (bloc
4fe0: 6b 73 2c 20 2d 63 29 7d 0a 09 09 73 65 74 20 68  ks, -c)}...set h
4ff0: 65 6c 70 28 44 41 54 41 29 20 7b 64 61 74 61 20  elp(DATA) {data 
5000: 73 65 67 20 73 69 7a 65 20 20 20 20 20 20 20 20  seg size        
5010: 20 20 20 28 6b 62 79 74 65 73 2c 20 2d 64 29 7d     (kbytes, -d)}
5020: 0a 09 09 73 65 74 20 68 65 6c 70 28 4e 49 43 45  ...set help(NICE
5030: 29 20 7b 73 63 68 65 64 75 6c 69 6e 67 20 70 72  ) {scheduling pr
5040: 69 6f 72 69 74 79 20 20 20 20 20 20 20 20 20 20  iority          
5050: 20 20 20 28 2d 65 29 7d 0a 09 09 73 65 74 20 68     (-e)}...set h
5060: 65 6c 70 28 46 53 49 5a 45 29 20 7b 66 69 6c 65  elp(FSIZE) {file
5070: 20 73 69 7a 65 20 20 20 20 20 20 20 20 20 20 20   size           
5080: 20 20 20 20 28 62 6c 6f 63 6b 73 2c 20 2d 66 29      (blocks, -f)
5090: 7d 0a 09 09 73 65 74 20 68 65 6c 70 28 53 49 47  }...set help(SIG
50a0: 50 45 4e 44 49 4e 47 29 20 7b 70 65 6e 64 69 6e  PENDING) {pendin
50b0: 67 20 73 69 67 6e 61 6c 73 20 20 20 20 20 20 20  g signals       
50c0: 20 20 20 20 20 20 20 20 20 20 28 2d 69 29 7d 0a            (-i)}.
50d0: 09 09 73 65 74 20 68 65 6c 70 28 4d 45 4d 4c 4f  ..set help(MEMLO
50e0: 43 4b 29 20 7b 6d 61 78 20 6c 6f 63 6b 65 64 20  CK) {max locked 
50f0: 6d 65 6d 6f 72 79 20 20 20 20 20 20 20 28 6b 62  memory       (kb
5100: 79 74 65 73 2c 20 2d 6c 29 7d 0a 09 09 73 65 74  ytes, -l)}...set
5110: 20 68 65 6c 70 28 52 53 53 29 20 7b 6d 61 78 20   help(RSS) {max 
5120: 6d 65 6d 6f 72 79 20 73 69 7a 65 20 20 20 20 20  memory size     
5130: 20 20 20 20 28 6b 62 79 74 65 73 2c 20 2d 6d 29      (kbytes, -m)
5140: 7d 0a 09 09 73 65 74 20 68 65 6c 70 28 4e 4f 46  }...set help(NOF
5150: 49 4c 45 29 20 7b 6f 70 65 6e 20 66 69 6c 65 73  ILE) {open files
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5170: 20 20 20 20 20 20 28 2d 6e 29 7d 0a 09 09 73 65        (-n)}...se
5180: 74 20 68 65 6c 70 28 2d 70 29 20 7b 70 69 70 65  t help(-p) {pipe
5190: 20 73 69 7a 65 20 20 20 20 20 20 20 20 20 20 20   size           
51a0: 20 28 35 31 32 20 62 79 74 65 73 2c 20 2d 70 29   (512 bytes, -p)
51b0: 7d 0a 09 09 73 65 74 20 68 65 6c 70 28 4d 53 47  }...set help(MSG
51c0: 51 55 45 55 45 29 20 7b 50 4f 53 49 58 20 6d 65  QUEUE) {POSIX me
51d0: 73 73 61 67 65 20 71 75 65 75 65 73 20 20 20 20  ssage queues    
51e0: 20 28 62 79 74 65 73 2c 20 2d 71 29 7d 0a 09 09   (bytes, -q)}...
51f0: 73 65 74 20 68 65 6c 70 28 52 54 50 52 49 4f 29  set help(RTPRIO)
5200: 20 7b 72 65 61 6c 2d 74 69 6d 65 20 70 72 69 6f   {real-time prio
5210: 72 69 74 79 20 20 20 20 20 20 20 20 20 20 20 20  rity            
5220: 20 20 28 2d 72 29 7d 0a 09 09 73 65 74 20 68 65    (-r)}...set he
5230: 6c 70 28 53 54 41 43 4b 29 20 7b 73 74 61 63 6b  lp(STACK) {stack
5240: 20 73 69 7a 65 20 20 20 20 20 20 20 20 20 20 20   size           
5250: 20 20 20 28 6b 62 79 74 65 73 2c 20 2d 73 29 7d     (kbytes, -s)}
5260: 0a 09 09 73 65 74 20 68 65 6c 70 28 43 50 55 29  ...set help(CPU)
5270: 20 7b 63 70 75 20 74 69 6d 65 20 20 20 20 20 20   {cpu time      
5280: 20 20 20 20 20 20 20 20 20 28 73 65 63 6f 6e 64           (second
5290: 73 2c 20 2d 74 29 7d 0a 09 09 73 65 74 20 68 65  s, -t)}...set he
52a0: 6c 70 28 4e 50 52 4f 43 29 20 7b 6d 61 78 20 75  lp(NPROC) {max u
52b0: 73 65 72 20 70 72 6f 63 65 73 73 65 73 20 20 20  ser processes   
52c0: 20 20 20 20 20 20 20 20 20 20 20 28 2d 75 29 7d             (-u)}
52d0: 0a 09 09 73 65 74 20 68 65 6c 70 28 41 53 29 20  ...set help(AS) 
52e0: 7b 76 69 72 74 75 61 6c 20 6d 65 6d 6f 72 79 20  {virtual memory 
52f0: 20 20 20 20 20 20 20 20 20 28 6b 62 79 74 65 73           (kbytes
5300: 2c 20 2d 76 29 7d 0a 09 09 73 65 74 20 68 65 6c  , -v)}...set hel
5310: 70 28 4c 4f 43 4b 53 29 20 7b 66 69 6c 65 20 6c  p(LOCKS) {file l
5320: 6f 63 6b 73 20 20 20 20 20 20 20 20 20 20 20 20  ocks            
5330: 20 20 20 20 20 20 20 20 20 20 28 2d 78 29 7d 0a            (-x)}.
5340: 0a 09 09 66 6f 72 65 61 63 68 20 7b 6c 69 6d 69  ...foreach {limi
5350: 74 6f 70 74 20 6c 69 6d 69 74 6f 70 74 76 61 6c  topt limitoptval
5360: 73 7d 20 5b 61 72 72 61 79 20 67 65 74 20 6d 61  s} [array get ma
5370: 70 70 69 6e 67 5d 20 7b 0a 09 09 09 66 6f 72 65  pping] {....fore
5380: 61 63 68 20 6c 69 6d 69 74 6f 70 74 76 61 6c 20  ach limitoptval 
5390: 24 6c 69 6d 69 74 6f 70 74 76 61 6c 73 20 7b 0a  $limitoptvals {.
53a0: 09 09 09 09 6c 61 70 70 65 6e 64 20 6d 61 70 70  ....lappend mapp
53b0: 69 6e 67 28 2d 61 29 20 24 6c 69 6d 69 74 6f 70  ing(-a) $limitop
53c0: 74 76 61 6c 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  tval....}...}...
53d0: 09 73 65 74 20 6f 70 74 73 20 24 6d 61 70 70 69  .set opts $mappi
53e0: 6e 67 28 24 6c 69 6d 69 74 29 0a 0a 09 09 69 66  ng($limit)....if
53f0: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6f 70 74 73   {[llength $opts
5400: 5d 20 21 3d 20 31 20 26 26 20 24 76 61 6c 20 21  ] != 1 && $val !
5410: 3d 20 22 22 7d 20 7b 0a 09 09 09 72 65 74 75 72  = ""} {....retur
5420: 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 55  n -code error "U
5430: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 6d 75 6c  nable to set mul
5440: 74 69 70 6c 65 20 6c 69 6d 69 74 73 22 0a 09 09  tiple limits"...
5450: 7d 0a 0a 09 09 66 6f 72 65 61 63 68 20 6f 70 74  }....foreach opt
5460: 20 24 6f 70 74 73 20 7b 0a 09 09 09 75 6e 73 65   $opts {....unse
5470: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 6f 70  t -nocomplain op
5480: 74 76 61 6c 0a 0a 09 09 09 69 66 20 7b 24 76 61  tval.....if {$va
5490: 6c 20 21 3d 20 22 22 7d 20 7b 0a 09 09 09 09 63  l != ""} {.....c
54a0: 61 74 63 68 20 7b 0a 09 09 09 09 09 3a 3a 74 75  atch {......::tu
54b0: 61 70 69 3a 3a 73 79 73 63 61 6c 6c 3a 3a 72 6c  api::syscall::rl
54c0: 69 6d 69 74 20 73 65 74 20 24 6f 70 74 20 24 76  imit set $opt $v
54d0: 61 6c 0a 09 09 09 09 7d 0a 09 09 09 09 73 65 74  al.....}.....set
54e0: 20 69 6e 63 6c 75 64 65 5f 68 65 6c 70 20 22 22   include_help ""
54f0: 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
5500: 09 73 65 74 20 69 6e 63 6c 75 64 65 5f 68 65 6c  .set include_hel
5510: 70 20 22 24 68 65 6c 70 28 24 6f 70 74 29 20 22  p "$help($opt) "
5520: 0a 09 09 09 7d 0a 0a 09 09 09 63 61 74 63 68 20  ....}.....catch 
5530: 7b 0a 09 09 09 09 73 65 74 20 6f 70 74 76 61 6c  {.....set optval
5540: 20 5b 3a 3a 74 75 61 70 69 3a 3a 73 79 73 63 61   [::tuapi::sysca
5550: 6c 6c 3a 3a 72 6c 69 6d 69 74 20 67 65 74 20 24  ll::rlimit get $
5560: 6f 70 74 5d 0a 09 09 09 7d 0a 0a 09 09 09 69 66  opt]....}.....if
5570: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
5580: 6f 70 74 76 61 6c 5d 7d 20 7b 0a 09 09 09 09 63  optval]} {.....c
5590: 6f 6e 74 69 6e 75 65 0a 09 09 09 7d 0a 0a 09 09  ontinue....}....
55a0: 09 70 75 74 73 20 22 24 7b 69 6e 63 6c 75 64 65  .puts "${include
55b0: 5f 68 65 6c 70 7d 24 6f 70 74 76 61 6c 22 0a 09  _help}$optval"..
55c0: 09 7d 0a 09 7d 0a 0a 09 70 72 6f 63 20 3a 3a 69  .}..}...proc ::i
55d0: 66 63 6f 6e 66 69 67 20 7b 7b 69 66 61 63 65 6c  fconfig {{ifacel
55e0: 69 73 74 20 22 22 7d 20 7b 63 6f 6e 66 69 67 20  ist ""} {config 
55f0: 22 22 7d 7d 20 7b 0a 09 09 69 66 20 7b 24 69 66  ""}} {...if {$if
5600: 61 63 65 6c 69 73 74 20 3d 3d 20 22 22 20 7c 7c  acelist == "" ||
5610: 20 24 69 66 61 63 65 6c 69 73 74 20 3d 3d 20 22   $ifacelist == "
5620: 2d 61 22 7d 20 7b 0a 09 09 09 73 65 74 20 69 66  -a"} {....set if
5630: 61 63 65 6c 69 73 74 20 5b 74 75 61 70 69 3a 3a  acelist [tuapi::
5640: 73 79 73 63 61 6c 6c 3a 3a 69 66 63 6f 6e 66 69  syscall::ifconfi
5650: 67 5d 0a 09 09 09 73 65 74 20 63 6f 6e 66 69 67  g]....set config
5660: 20 22 22 0a 09 09 7d 0a 0a 09 09 69 66 20 7b 24   ""...}....if {$
5670: 63 6f 6e 66 69 67 20 21 3d 20 22 22 7d 20 7b 0a  config != ""} {.
5680: 09 09 09 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d  ...if {[string m
5690: 61 74 63 68 20 22 2a 2e 2a 2e 2a 2e 2a 22 20 5b  atch "*.*.*.*" [
56a0: 6c 69 6e 64 65 78 20 24 63 6f 6e 66 69 67 20 30  lindex $config 0
56b0: 5d 5d 7d 20 7b 0a 09 09 09 09 73 65 74 20 63 6f  ]]} {.....set co
56c0: 6e 66 69 67 20 5b 6c 69 6e 73 65 72 74 20 24 63  nfig [linsert $c
56d0: 6f 6e 66 69 67 20 30 20 22 61 64 64 72 65 73 73  onfig 0 "address
56e0: 22 5d 0a 09 09 09 7d 0a 0a 09 09 09 70 75 74 73  "]....}.....puts
56f0: 20 5b 6c 69 73 74 20 3a 3a 74 75 61 70 69 3a 3a   [list ::tuapi::
5700: 69 66 63 6f 6e 66 69 67 20 5b 6c 69 6e 64 65 78  ifconfig [lindex
5710: 20 24 69 66 61 63 65 6c 69 73 74 20 30 5d 20 7b   $ifacelist 0] {
5720: 2a 7d 24 63 6f 6e 66 69 67 5d 0a 09 09 09 72 65  *}$config]....re
5730: 74 75 72 6e 20 5b 3a 3a 74 75 61 70 69 3a 3a 69  turn [::tuapi::i
5740: 66 63 6f 6e 66 69 67 20 5b 6c 69 6e 64 65 78 20  fconfig [lindex 
5750: 24 69 66 61 63 65 6c 69 73 74 20 30 5d 20 7b 2a  $ifacelist 0] {*
5760: 7d 24 63 6f 6e 66 69 67 5d 0a 09 09 7d 0a 0a 09  }$config]...}...
5770: 09 66 6f 72 65 61 63 68 20 69 66 61 63 65 20 24  .foreach iface $
5780: 69 66 61 63 65 6c 69 73 74 20 7b 0a 09 09 09 75  ifacelist {....u
5790: 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
57a0: 20 69 66 61 63 65 69 6e 66 6f 0a 09 09 09 61 72   ifaceinfo....ar
57b0: 72 61 79 20 73 65 74 20 69 66 61 63 65 69 6e 66  ray set ifaceinf
57c0: 6f 20 5b 74 75 61 70 69 3a 3a 73 79 73 63 61 6c  o [tuapi::syscal
57d0: 6c 3a 3a 69 66 63 6f 6e 66 69 67 20 24 69 66 61  l::ifconfig $ifa
57e0: 63 65 5d 0a 0a 09 09 09 73 65 74 20 73 65 63 6f  ce].....set seco
57f0: 6e 64 6c 69 6e 65 20 22 22 0a 09 09 09 66 6f 72  ndline ""....for
5800: 65 61 63 68 20 7b 6c 61 62 65 6c 20 65 6e 74 72  each {label entr
5810: 79 7d 20 5b 6c 69 73 74 20 69 6e 65 74 20 61 64  y} [list inet ad
5820: 64 72 65 73 73 20 6e 65 74 6d 61 73 6b 20 6e 65  dress netmask ne
5830: 74 6d 61 73 6b 20 62 72 6f 61 64 63 61 73 74 20  tmask broadcast 
5840: 62 72 6f 61 64 63 61 73 74 5d 20 7b 0a 09 09 09  broadcast] {....
5850: 09 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73  .if {![info exis
5860: 74 73 20 69 66 61 63 65 69 6e 66 6f 28 24 65 6e  ts ifaceinfo($en
5870: 74 72 79 29 5d 7d 20 7b 0a 09 09 09 09 09 63 6f  try)]} {......co
5880: 6e 74 69 6e 75 65 0a 09 09 09 09 7d 0a 0a 09 09  ntinue.....}....
5890: 09 09 61 70 70 65 6e 64 20 73 65 63 6f 6e 64 6c  ..append secondl
58a0: 69 6e 65 20 22 20 24 6c 61 62 65 6c 20 24 69 66  ine " $label $if
58b0: 61 63 65 69 6e 66 6f 28 24 65 6e 74 72 79 29 22  aceinfo($entry)"
58c0: 0a 09 09 09 7d 0a 0a 09 09 09 70 75 74 73 20 22  ....}.....puts "
58d0: 24 69 66 61 63 65 3a 20 66 6c 61 67 73 3d 3c 5b  $iface: flags=<[
58e0: 6a 6f 69 6e 20 24 69 66 61 63 65 69 6e 66 6f 28  join $ifaceinfo(
58f0: 66 6c 61 67 73 29 20 2c 5d 3e 20 6d 74 75 20 24  flags) ,]> mtu $
5900: 69 66 61 63 65 69 6e 66 6f 28 6d 74 75 29 20 69  ifaceinfo(mtu) i
5910: 6e 64 65 78 20 24 69 66 61 63 65 69 6e 66 6f 28  ndex $ifaceinfo(
5920: 69 6e 64 65 78 29 22 0a 09 09 09 70 75 74 73 20  index)"....puts 
5930: 22 5c 74 5b 73 74 72 69 6e 67 20 74 72 69 6d 20  "\t[string trim 
5940: 24 73 65 63 6f 6e 64 6c 69 6e 65 5d 22 0a 09 09  $secondline]"...
5950: 09 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  .if {[info exist
5960: 73 20 69 66 61 63 65 69 6e 66 6f 28 68 77 61 64  s ifaceinfo(hwad
5970: 64 72 29 5d 7d 20 7b 0a 09 09 09 09 70 75 74 73  dr)]} {.....puts
5980: 20 22 5c 74 65 74 68 65 72 20 24 69 66 61 63 65   "\tether $iface
5990: 69 6e 66 6f 28 68 77 61 64 64 72 29 22 0a 09 09  info(hwaddr)"...
59a0: 09 7d 0a 09 09 7d 0a 09 7d 0a 7d 0a              .}...}..}.}.