5 # Default images for various device types.
6 # First image in list - for mounted device, second - for empty
7 set stdImages(floppy) [list [image create photo -data {
8 R0lGODlhEAAQAMIAAAAAgAAAAP//AODg4P///8DAwP///////yH+Dk1hZGUgd2l0aCBHSU1Q
9 ACH5BAEKAAcALAAAAAAQABAAAAM7CBDcHgoCQasVUY3N+8gAIY4kAXooWK4n2qkrCSp0XUtK
10 oe/FXfcAno8GFNJwwdxumFPqbjje8vioPhIAOw==
11 }] [image create photo -data {
12 R0lGODlhEAAQAOMAAAAAgAAAAP//AODg4P///4CAgMDAwP8AAP//////////////////////
13 /////////yH+Dk1hZGUgd2l0aCBHSU1QACH5BAEKAAgALAAAAAAQABAAAARLEIBAqw0SA8G7
14 F5k0jGQ5hAChriyBFnAsx1hh3Hh+F0HR/gRYT6c7GIQ2nCyHPAorMecQx2LyZliaRmLg4iQo
18 set stdImages(cdrom) [list [image create photo -data {
19 R0lGODlhEAAQAMIAAICAgP//AMDAwAAAAAD//wD/AP///////yH+Dk1hZGUgd2l0aCBHSU1Q
20 ACH5BAEKAAcALAAAAAAQABAAAANReKrQvZCBEIQdIx5AaLUXBBRE91mGkDEFSYGpylhth4Iy
21 AJLAoOOZHy0zwOVwhh4HuIGhCgECaKWL0aLS1cZ6xWqbuBblK9kVMJpFA0NOuxUJADs=
22 }] [image create photo -data {
23 R0lGODlhEAAQAMIAAICAgP//AMDAwAAAAAD//wD/AP///////yH+Dk1hZGUgd2l0aCBHSU1Q
24 ACH5BAEKAAcALAAAAAAQABAAAANKeKrQvZCBEIQdIx5AaLUXBBRE91mGkElO624AKM/AABh4
25 ruONPdOCXgzUkgmDPYytgfSBdMaaa+pYbWaFAsW6YFqyGE23FhabNQkAOw==
28 set stdImages(zip) [list [image create photo -data {
29 R0lGODlhEAAQAMIAAAAAAAAAgMDAwJYNH////+Dg4P//AP///yH+Dk1hZGUgd2l0aCBHSU1Q
30 ACH5BAEKAAcALAAAAAAQABAAAANJCLrcGkHIOWF4kVJ7od4W4H0SJ3IoeqbsyqrQIA9EbRPQ
31 WexD0e+7HKRGs81wnYCP1/sNhIEikVB8JmdNn6wANXgN2C/U0YAkAAA7
32 }] [image create photo -data {
33 R0lGODlhEAAQAMIAAOgNDYCAgMDAwAAAAP////8AAP///////yH+Dk1hZGUgd2l0aCBHSU1Q
34 ACH5BAEKAAcALAAAAAAQABAAAAM9eLrc/g1IoChc9uKaJ8tHV43fFlZBqq6qEghwLMPBEBB4
35 ruOpPc8FQe8VW8mGwt5gqUr6YrpjjUVVDTSPBAA7
38 set stdImages(memoryCard) [list [image create photo -data {
39 R0lGODdhEAAQAMIAAAAAAPhAQIgAAOD8+Pj8+ODg4OD88Pj8ACwAAAAAEAAQAAADSAi63Bow
40 SvmmjeDqrC3vVCQI0DiGAZmuXjm8hEnMECcUxVDcOF6XhIEgFoT9ArubMIcbHAezGRQafL50
42 }] [image create photo -data {
43 R0lGODdhEAAQAMIAAOiouPj8+ICAgMDAwAAAAPgAAAAAAAAAACwAAAAAEAAQAAADMwi63P4w
44 ykkrCMFiJrr/niIMZGmSAiFgbMt26nkWAzyWn2nXMOF7vFippUuBjh6Ca7lMAAA7
48 variable mountedDevices
49 variable ejectableDevices
50 variable deviceWidgets
55 set f [open /etc/fstab]
56 foreach m [split [read $f] "\n"] {
57 if {![string length $m]||[regexp "^\[ \t\]*#" $m]} continue
58 set opts [split [lindex $m 3] ","]
59 set device [lindex $m 0]
60 if {[lsearch -exact $opts user]==-1||[regexp ":" $device]} continue
61 set mpoint [lindex $m 1]
63 switch -glob $device {
65 set deviceImage($mpoint) $stdImages(floppy)
67 /dev/[sh]d[a-z][0-9] { #partitioned drive
68 regexp {/dev/.d[a-z]} $device ejpath
69 if {[regexp zip $mpoint]} {
71 set ejectableDevices($mpoint) $ejpath
72 set deviceImage($mpoint) $stdImages(zip)
74 # USB flashcard or something
75 if {[regexp ejectable $m]} {
76 set ejectableDevices($mpoint) $ejpath
78 set deviceImage($mpoint) $stdImages(memoryCard)
81 default { # anything else should be CD-rom
82 set ejectableDevices($mpoint) $device
83 set deviceImage($mpoint) $stdImages(cdrom)
86 set deviceWidgets($mpoint) .mount.d$index
88 label $deviceWidgets($mpoint)
89 bind $deviceWidgets($mpoint) <1> [list ::mount::changeDeviceStatus $mpoint]
90 pack $deviceWidgets($mpoint) -side left
94 pack .mount -side right
97 proc scanMtab {args} {
98 variable deviceWidgets
100 set f [open /etc/mtab]
101 foreach m [split [read $f] "\n"] {
102 if {![llength $m]} continue
103 set mpoint [lindex $m 1]
104 if [info exists deviceWidgets([lindex $m 1])] {
105 set mounted($mpoint) 1
110 foreach {mpoint widget} [array get deviceWidgets] {
111 if [info exists mounted($mpoint)] {
112 $widget configure -image [lindex $deviceImage($mpoint) 0]
113 balloonhelp $widget "$mpoint (mounted)"
115 $widget configure -image [lindex $deviceImage($mpoint) 1]
116 balloonhelp $widget "$mpoint"
122 proc changeDeviceStatus {mpoint} {
123 variable deviceWidgets
125 if {[$deviceWidgets($mpoint) cget -image]=="[lindex $deviceImage($mpoint)\
134 proc mount {mpoint} {
136 if [catch {exec mount $mpoint} msg] {
137 # mount returns non-zero
138 if {$errorCode!="NONE"} {
139 tk_messageBox -title "Mount failed" -message $msg -icon error\
143 # No error, but there is warning. Mounted read only
144 if [string length $msg] {
145 tk_messageBox -title "Warning" -message $msg -icon warning \
152 proc unmount {mpoint} {
153 global eject ejectableDevices
154 if [catch {exec umount $mpoint} msg] {
155 tk_messageBox -title "Umount failed" -message $msg -icon error\
159 if {[info exists ejectableDevices($mpoint)]} {
160 if [catch {exec eject $ejectableDevices($mpoint) 2>/dev/null} msg] {
162 tk_messageBox -title "Eject failed" -message "Device is unmounted\
163 but cannot be ejected:\n$msg" -icon error\
170 notifier ::mount::scanMtab