added error handling for empty command name
[dyninst.git] / paradyn / tcl / applic.tcl
1 #applic.tcl
2 # window to get application choices from user
3 # $Log: applic.tcl,v $
4 # Revision 1.17  1995/10/05 04:16:46  karavan
5 # added error handling for empty command name
6 #
7 # Revision 1.16  1995/09/26  20:31:08  naim
8 # Eliminating error message "eval [list uimpd showError 25 $result]". The idea
9 # here is to display a more precise error message if there is an error during
10 # process creation
11 #
12 # Revision 1.15  1995/09/18  22:39:49  mjrg
13 # added directory command.
14 #
15 # Revision 1.14  1995/07/19  23:01:16  tamches
16 # Commented out TAB-key bindings to move between entries on the
17 # start process dialog, because these bindings are provided
18 # automagically in tk4.0
19 #
20 # Revision 1.13  1995/07/03  03:26:53  karavan
21 # Changed default for user to blank, workaround for nonstandard rsh in use
22 # in the CS department.
23 #
24 # Revision 1.12  1994/11/11  23:00:49  rbi
25 # added documentation and allowed definition of default daemon
26 #
27 # Revision 1.11  1994/11/09  18:39:51  rbi
28 # the "Don't Blame Me" commit
29 #
30 # Revision 1.10  1994/11/04  16:30:00  rbi
31 # Auto placement of process defn dialog, and radio buttons for daemons.
32 #
33 # Revision 1.9  1994/11/03  20:23:17  karavan
34 # Changes to overall look to fit into paradyn UI.
35 #
36 # Revision 1.8  1994/11/03  17:59:38  rbi
37 # Added a little bit of error handling.
38 #
39 # Revision 1.7  1994/11/03  16:10:42  rbi
40 # New process definition interface.
41 #
42 # Revision 1.6  1994/08/23  18:01:11  karavan
43 # fixed argument parsing to paradyn process command.
44 #
45 # Revision 1.5  1994/07/21  17:47:43  rbi
46 # No more jumpy resizes.
47 #
48 # Revision 1.4  1994/07/21  01:53:30  rbi
49 # YANS -- Yet another new style
50 #
51 # Revision 1.3  1994/06/18  20:31:10  hollings
52 # Changed default host to empty string since the environment variable host is
53 # not guarnteed to be defined.
54 #
55 # Revision 1.2  1994/05/26  21:23:10  karavan
56 # changed parent window name.
57 #
58 # Revision 1.1  1994/05/23  01:56:22  karavan
59 # initial version.
60 #
61
62 #
63 #  Process definitions depend on several global variables.
64 #
65 #  applicDaemon  -- name of the paradyn daemon
66 #  applicUser    -- user name
67 #  applicMachine -- machine to use
68 #  applicCmd     -- command to run (including arguments)
69 #  applicDir     -- directory to chdir
70 #
71 #  It would be nice if there were a better way to specify defaults
72 #  such as these.
73 #
74
75 #
76 # this is a strange way to say "if default daemon name
77 # is not set then set it to defd"
78 #
79 if {[catch {set applicDaemon}]} {
80   set applicDaemon defd
81 }
82
83 #
84 #  display a dialog box that prompts for daemon, 
85 #  user name, machine name, command and arguments
86 #
87 #  the user finishes selection, the dialog disappears, and 
88 #  the new process is started
89 #
90 #  TODO -- use the dialog creation routine in uimpd file
91 #
92 proc DefineProcess {} {
93   global env applicDaemon applicUser applicMachine applicCmd applicDir 
94
95   set W .pDefn
96   catch {destroy $W}
97   toplevel $W
98   wm title $W "Process Defn"
99   wm iconname $W "Process Defn"
100
101 # force the window to a happy location
102   set baseGeom [wm geometry .]
103   set Xbase 0
104   set Ybase 0
105   set Xoffset 30
106   set Yoffset 30
107   scan $baseGeom "%*dx%*d+%d+%d" Xbase Ybase
108   wm geometry .pDefn [format "+%d+%d" [expr $Xbase + $Xoffset] \
109                                       [expr $Ybase + $Yoffset]]
110  
111 # define all of the main frames
112   set T $W.title
113   label $T -text "Define A Process" \
114             -anchor center -relief raised \
115             -font "-Adobe-times-bold-r-normal--*-120*" 
116   set D $W.data
117   frame $D
118   set B $W.buttons
119   frame $B
120   pack $T $D $B -side top -expand yes -fill both
121
122 #
123 #  In the data area, each line contains a label and an entry
124 #  
125   frame $D.user -border 2
126   label $D.user.lbl -text "User: " -anchor e -width 12
127   entry $D.user.ent -width 50 -textvariable applicUser -relief sunken
128   bind $D.user.ent <Return> "$B.1 invoke"
129   pack $D.user -side top -expand yes -fill x
130   pack $D.user.lbl $D.user.ent -side left -expand yes -fill x
131
132   frame $D.machine -border 2
133   label $D.machine.lbl -text "Machine: " -anchor e -width 12
134   entry $D.machine.ent -width 50 -textvariable applicMachine -relief sunken
135   bind $D.machine.ent <Return> "$B.1 invoke"
136   pack $D.machine -side top -expand yes -fill x
137   pack $D.machine.lbl $D.machine.ent -side left -expand yes -fill x
138
139   frame $D.directory -border 2
140   label $D.directory.lbl -text "Directory: " -anchor e -width 12
141   entry $D.directory.ent -width 50 -textvariable applicDir -relief sunken
142   bind $D.directory.ent <Return> "$B.1 invoke"
143   pack $D.directory -side top -expand yes -fill x
144   pack $D.directory.lbl $D.directory.ent -side left -expand yes -fill x
145   
146   set daemons [paradyn daemons]
147   frame $D.daemon -border 2
148   label $D.daemon.lbl -text "Daemon: " -anchor e -width 12
149   pack $D.daemon -side top -expand yes -fill x
150   pack $D.daemon.lbl -side left -expand no -fill x
151   foreach d $daemons {
152     radiobutton $D.daemon.$d -text $d -variable applicDaemon -value $d \
153         -relief flat
154     pack $D.daemon.$d -side left -expand yes -fill x
155   }
156   $D.daemon.$applicDaemon invoke
157
158   frame $D.cmd -border 2
159   label $D.cmd.lbl -text "Command: " -anchor e -width 12
160   entry $D.cmd.ent -width 50 -textvariable applicCmd -relief sunken
161   bind $D.cmd.ent <Return> "$B.1 invoke"
162   pack $D.cmd -side top -expand yes -fill x
163   pack $D.cmd.lbl $D.cmd.ent -side left -expand yes -fill x
164
165   mkButtonBar $B {} retVal \
166   {{"ACCEPT" {AcceptNewApplicDefn $applicUser $applicMachine \
167           $applicDaemon $applicDir $applicCmd}} \
168   {"CANCEL" {destroy .pDefn}}}
169
170   focus $D.machine.ent
171 }
172
173 #
174 #  when the user has accepted a new application definition, 
175 #  we invoke this command to start the process.
176 #
177 #  <cmd> is passed directly to execv() with no
178 #  further parsing or substition
179 #
180 #  any errors in process startup are reported through error dialogs
181 #  (i.e. there is no useful return value from this proc)
182 #
183 #  TODO: we must have very specific reporting of process startup
184 #        failures.  the current error message is useless.
185 #
186 proc AcceptNewApplicDefn {user machine daemon directory cmd} {
187
188     if {[string length $cmd] == 0} {
189         puts "\a"
190         return
191     }
192   set pcmd [list paradyn process]
193
194   if {[string length $user] > 0} {
195     lappend pcmd "-user" $user
196   }
197
198   if {[string length $machine] > 0} {
199     lappend pcmd "-machine" $machine
200   }
201
202   if {[string length $directory] > 0} {
203     lappend pcmd "-dir" $directory
204   }
205
206   if {[string length $daemon] > 0} {
207     lappend pcmd "-daemon" $daemon
208   }
209
210   set pcmd [concat $pcmd $cmd]
211  
212   destroy .pDefn
213
214   set retval [catch $pcmd]
215
216   if {$retval == 1} {
217     set result "Illegal Process Definition"
218 #    eval [list uimpd showError 25 $result]
219 #    The idea here is to display a more precise error code.
220   }
221 }
222
223