2 * settings.c: read and write saved sessions.
11 static void gpps(void *handle
, char *name
, char *def
, char *val
, int len
) {
12 if (!read_setting_s(handle
, name
, val
, len
)) {
13 strncpy(val
, def
, len
);
18 static void gppi(void *handle
, char *name
, int def
, int *i
) {
19 *i
= read_setting_i(handle
, name
, def
);
22 void save_settings (char *section
, int do_host
, Config
*cfg
) {
27 sesskey
= open_settings_w(section
);
31 write_setting_i (sesskey
, "Present", 1);
33 write_setting_s (sesskey
, "HostName", cfg
->host
);
34 write_setting_i (sesskey
, "PortNumber", cfg
->port
);
35 write_setting_s (sesskey
, "LogFileName", cfg
->logfilename
);
36 write_setting_i (sesskey
, "LogType", cfg
->logtype
);
38 for (i
= 0; backends
[i
].name
!= NULL
; i
++)
39 if (backends
[i
].protocol
== cfg
->protocol
) {
43 write_setting_s (sesskey
, "Protocol", p
);
45 write_setting_i (sesskey
, "CloseOnExit", !!cfg
->close_on_exit
);
46 write_setting_i (sesskey
, "WarnOnClose", !!cfg
->warn_on_close
);
47 write_setting_i (sesskey
, "PingInterval", cfg
->ping_interval
);
48 write_setting_s (sesskey
, "TerminalType", cfg
->termtype
);
49 write_setting_s (sesskey
, "TerminalSpeed", cfg
->termspeed
);
51 char buf
[2*sizeof(cfg
->environmt
)], *p
, *q
;
57 if (c
== '=' || c
== ',' || c
== '\\')
67 write_setting_s (sesskey
, "Environment", buf
);
69 write_setting_s (sesskey
, "UserName", cfg
->username
);
70 write_setting_i (sesskey
, "NoPTY", cfg
->nopty
);
71 write_setting_i (sesskey
, "Compression", cfg
->compression
);
72 write_setting_i (sesskey
, "AgentFwd", cfg
->agentfwd
);
73 write_setting_s (sesskey
, "RemoteCmd", cfg
->remote_cmd
);
74 write_setting_s (sesskey
, "Cipher", cfg
->cipher
== CIPHER_BLOWFISH ?
"blowfish" :
75 cfg
->cipher
== CIPHER_DES ?
"des" : "3des");
76 write_setting_i (sesskey
, "AuthTIS", cfg
->try_tis_auth
);
77 write_setting_i (sesskey
, "SshProt", cfg
->sshprot
);
78 write_setting_i (sesskey
, "BuggyMAC", cfg
->buggymac
);
79 write_setting_s (sesskey
, "PublicKeyFile", cfg
->keyfile
);
80 write_setting_s (sesskey
, "RemoteCommand", cfg
->remote_cmd
);
81 write_setting_i (sesskey
, "RFCEnviron", cfg
->rfc_environ
);
82 write_setting_i (sesskey
, "BackspaceIsDelete", cfg
->bksp_is_delete
);
83 write_setting_i (sesskey
, "RXVTHomeEnd", cfg
->rxvt_homeend
);
84 write_setting_i (sesskey
, "LinuxFunctionKeys", cfg
->funky_type
);
85 write_setting_i (sesskey
, "NoApplicationKeys", cfg
->no_applic_k
);
86 write_setting_i (sesskey
, "NoApplicationCursors", cfg
->no_applic_c
);
87 write_setting_i (sesskey
, "ApplicationCursorKeys", cfg
->app_cursor
);
88 write_setting_i (sesskey
, "ApplicationKeypad", cfg
->app_keypad
);
89 write_setting_i (sesskey
, "NetHackKeypad", cfg
->nethack_keypad
);
90 write_setting_i (sesskey
, "AltF4", cfg
->alt_f4
);
91 write_setting_i (sesskey
, "AltSpace", cfg
->alt_space
);
92 write_setting_i (sesskey
, "AltOnly", cfg
->alt_only
);
93 write_setting_i (sesskey
, "ComposeKey", cfg
->compose_key
);
94 write_setting_i (sesskey
, "LdiscTerm", cfg
->ldisc_term
);
95 write_setting_i (sesskey
, "AlwaysOnTop", cfg
->alwaysontop
);
96 write_setting_i (sesskey
, "BlinkCur", cfg
->blink_cur
);
97 write_setting_i (sesskey
, "Beep", cfg
->beep
);
98 write_setting_i (sesskey
, "ScrollbackLines", cfg
->savelines
);
99 write_setting_i (sesskey
, "DECOriginMode", cfg
->dec_om
);
100 write_setting_i (sesskey
, "AutoWrapMode", cfg
->wrap_mode
);
101 write_setting_i (sesskey
, "LFImpliesCR", cfg
->lfhascr
);
102 write_setting_i (sesskey
, "WinNameAlways", cfg
->win_name_always
);
103 write_setting_s (sesskey
, "WinTitle", cfg
->wintitle
);
104 write_setting_i (sesskey
, "TermWidth", cfg
->width
);
105 write_setting_i (sesskey
, "TermHeight", cfg
->height
);
106 write_setting_s (sesskey
, "Font", cfg
->font
);
107 write_setting_i (sesskey
, "FontIsBold", cfg
->fontisbold
);
108 write_setting_i (sesskey
, "FontCharSet", cfg
->fontcharset
);
109 write_setting_i (sesskey
, "FontHeight", cfg
->fontheight
);
110 write_setting_i (sesskey
, "FontVTMode", cfg
->vtmode
);
111 write_setting_i (sesskey
, "TryPalette", cfg
->try_palette
);
112 write_setting_i (sesskey
, "BoldAsColour", cfg
->bold_colour
);
113 for (i
=0; i
<22; i
++) {
114 char buf
[20], buf2
[30];
115 sprintf(buf
, "Colour%d", i
);
116 sprintf(buf2
, "%d,%d,%d", cfg
->colours
[i
][0],
117 cfg
->colours
[i
][1], cfg
->colours
[i
][2]);
118 write_setting_s (sesskey
, buf
, buf2
);
120 write_setting_i (sesskey
, "MouseIsXterm", cfg
->mouse_is_xterm
);
121 for (i
=0; i
<256; i
+=32) {
122 char buf
[20], buf2
[256];
124 sprintf(buf
, "Wordness%d", i
);
126 for (j
=i
; j
<i
+32; j
++) {
127 sprintf(buf2
+strlen(buf2
), "%s%d",
128 (*buf2 ?
"," : ""), cfg
->wordness
[j
]);
130 write_setting_s (sesskey
, buf
, buf2
);
132 write_setting_i (sesskey
, "KoiWinXlat", cfg
->xlat_enablekoiwin
);
133 write_setting_i (sesskey
, "88592Xlat", cfg
->xlat_88592w1250
);
134 write_setting_i (sesskey
, "88592-CP852", cfg
->xlat_88592cp852
);
135 write_setting_i (sesskey
, "CapsLockCyr", cfg
->xlat_capslockcyr
);
136 write_setting_i (sesskey
, "ScrollBar", cfg
->scrollbar
);
137 write_setting_i (sesskey
, "ScrollOnKey", cfg
->scroll_on_key
);
138 write_setting_i (sesskey
, "ScrollOnDisp", cfg
->scroll_on_disp
);
139 write_setting_i (sesskey
, "LockSize", cfg
->locksize
);
140 write_setting_i (sesskey
, "BCE", cfg
->bce
);
141 write_setting_i (sesskey
, "BlinkText", cfg
->blinktext
);
143 close_settings_w(sesskey
);
146 void load_settings (char *section
, int do_host
, Config
*cfg
) {
151 sesskey
= open_settings_r(section
);
153 gpps (sesskey
, "HostName", "", cfg
->host
, sizeof(cfg
->host
));
154 gppi (sesskey
, "PortNumber", default_port
, &cfg
->port
);
155 gpps (sesskey
, "LogFileName", "putty.log",
156 cfg
->logfilename
, sizeof(cfg
->logfilename
));
157 gppi (sesskey
, "LogType", 0, &cfg
->logtype
);
159 gpps (sesskey
, "Protocol", "default", prot
, 10);
160 cfg
->protocol
= default_protocol
;
161 for (i
= 0; backends
[i
].name
!= NULL
; i
++)
162 if (!strcmp(prot
, backends
[i
].name
)) {
163 cfg
->protocol
= backends
[i
].protocol
;
167 gppi (sesskey
, "CloseOnExit", 1, &cfg
->close_on_exit
);
168 gppi (sesskey
, "WarnOnClose", 1, &cfg
->warn_on_close
);
169 gppi (sesskey
, "PingInterval", 0, &cfg
->ping_interval
);
170 gpps (sesskey
, "TerminalType", "xterm", cfg
->termtype
,
171 sizeof(cfg
->termtype
));
172 gpps (sesskey
, "TerminalSpeed", "38400,38400", cfg
->termspeed
,
173 sizeof(cfg
->termspeed
));
175 char buf
[2*sizeof(cfg
->environmt
)], *p
, *q
;
176 gpps (sesskey
, "Environment", "", buf
, sizeof(buf
));
180 while (*p
&& *p
!= ',') {
193 gpps (sesskey
, "UserName", "", cfg
->username
, sizeof(cfg
->username
));
194 gppi (sesskey
, "NoPTY", 0, &cfg
->nopty
);
195 gppi (sesskey
, "Compression", 0, &cfg
->compression
);
196 gppi (sesskey
, "AgentFwd", 0, &cfg
->agentfwd
);
197 gpps (sesskey
, "RemoteCmd", "", cfg
->remote_cmd
, sizeof(cfg
->remote_cmd
));
200 gpps (sesskey
, "Cipher", "3des", cipher
, 10);
201 if (!strcmp(cipher
, "blowfish"))
202 cfg
->cipher
= CIPHER_BLOWFISH
;
203 else if (!strcmp(cipher
, "des"))
204 cfg
->cipher
= CIPHER_DES
;
206 cfg
->cipher
= CIPHER_3DES
;
208 gppi (sesskey
, "SshProt", 1, &cfg
->sshprot
);
209 gppi (sesskey
, "BuggyMAC", 0, &cfg
->buggymac
);
210 gppi (sesskey
, "AuthTIS", 0, &cfg
->try_tis_auth
);
211 gpps (sesskey
, "PublicKeyFile", "", cfg
->keyfile
, sizeof(cfg
->keyfile
));
212 gpps (sesskey
, "RemoteCommand", "", cfg
->remote_cmd
,
213 sizeof(cfg
->remote_cmd
));
214 gppi (sesskey
, "RFCEnviron", 0, &cfg
->rfc_environ
);
215 gppi (sesskey
, "BackspaceIsDelete", 1, &cfg
->bksp_is_delete
);
216 gppi (sesskey
, "RXVTHomeEnd", 0, &cfg
->rxvt_homeend
);
217 gppi (sesskey
, "LinuxFunctionKeys", 0, &cfg
->funky_type
);
218 gppi (sesskey
, "NoApplicationKeys", 0, &cfg
->no_applic_k
);
219 gppi (sesskey
, "NoApplicationCursors", 0, &cfg
->no_applic_c
);
220 gppi (sesskey
, "ApplicationCursorKeys", 0, &cfg
->app_cursor
);
221 gppi (sesskey
, "ApplicationKeypad", 0, &cfg
->app_keypad
);
222 gppi (sesskey
, "NetHackKeypad", 0, &cfg
->nethack_keypad
);
223 gppi (sesskey
, "AltF4", 1, &cfg
->alt_f4
);
224 gppi (sesskey
, "AltSpace", 0, &cfg
->alt_space
);
225 gppi (sesskey
, "AltOnly", 0, &cfg
->alt_only
);
226 gppi (sesskey
, "ComposeKey", 0, &cfg
->compose_key
);
227 gppi (sesskey
, "LdiscTerm", 0, &cfg
->ldisc_term
);
228 gppi (sesskey
, "AlwaysOnTop", 0, &cfg
->alwaysontop
);
229 gppi (sesskey
, "BlinkCur", 0, &cfg
->blink_cur
);
230 gppi (sesskey
, "Beep", 1, &cfg
->beep
);
231 gppi (sesskey
, "ScrollbackLines", 200, &cfg
->savelines
);
232 gppi (sesskey
, "DECOriginMode", 0, &cfg
->dec_om
);
233 gppi (sesskey
, "AutoWrapMode", 1, &cfg
->wrap_mode
);
234 gppi (sesskey
, "LFImpliesCR", 0, &cfg
->lfhascr
);
235 gppi (sesskey
, "WinNameAlways", 0, &cfg
->win_name_always
);
236 gpps (sesskey
, "WinTitle", "", cfg
->wintitle
, sizeof(cfg
->wintitle
));
237 gppi (sesskey
, "TermWidth", 80, &cfg
->width
);
238 gppi (sesskey
, "TermHeight", 24, &cfg
->height
);
239 gpps (sesskey
, "Font", "Courier", cfg
->font
, sizeof(cfg
->font
));
240 gppi (sesskey
, "FontIsBold", 0, &cfg
->fontisbold
);
241 gppi (sesskey
, "FontCharSet", ANSI_CHARSET
, &cfg
->fontcharset
);
242 gppi (sesskey
, "FontHeight", 10, &cfg
->fontheight
);
243 gppi (sesskey
, "FontVTMode", VT_OEMANSI
, (int *)&cfg
->vtmode
);
244 gppi (sesskey
, "TryPalette", 0, &cfg
->try_palette
);
245 gppi (sesskey
, "BoldAsColour", 1, &cfg
->bold_colour
);
246 for (i
=0; i
<22; i
++) {
247 static char *defaults
[] = {
248 "187,187,187", "255,255,255", "0,0,0", "85,85,85", "0,0,0",
249 "0,255,0", "0,0,0", "85,85,85", "187,0,0", "255,85,85",
250 "0,187,0", "85,255,85", "187,187,0", "255,255,85", "0,0,187",
251 "85,85,255", "187,0,187", "255,85,255", "0,187,187",
252 "85,255,255", "187,187,187", "255,255,255"
254 char buf
[20], buf2
[30];
256 sprintf(buf
, "Colour%d", i
);
257 gpps (sesskey
, buf
, defaults
[i
], buf2
, sizeof(buf2
));
258 if(sscanf(buf2
, "%d,%d,%d", &c0
, &c1
, &c2
) == 3) {
259 cfg
->colours
[i
][0] = c0
;
260 cfg
->colours
[i
][1] = c1
;
261 cfg
->colours
[i
][2] = c2
;
264 gppi (sesskey
, "MouseIsXterm", 0, &cfg
->mouse_is_xterm
);
265 for (i
=0; i
<256; i
+=32) {
266 static char *defaults
[] = {
267 "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0",
268 "0,1,2,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1",
269 "1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2",
270 "1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1",
271 "1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1",
272 "1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1",
273 "2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2",
274 "2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2"
276 char buf
[20], buf2
[256], *p
;
278 sprintf(buf
, "Wordness%d", i
);
279 gpps (sesskey
, buf
, defaults
[i
/32], buf2
, sizeof(buf2
));
281 for (j
=i
; j
<i
+32; j
++) {
283 while (*p
&& *p
!= ',') p
++;
284 if (*p
== ',') *p
++ = '\0';
285 cfg
->wordness
[j
] = atoi(q
);
288 gppi (sesskey
, "KoiWinXlat", 0, &cfg
->xlat_enablekoiwin
);
289 gppi (sesskey
, "88592Xlat", 0, &cfg
->xlat_88592w1250
);
290 gppi (sesskey
, "88592-CP852", 0, &cfg
->xlat_88592cp852
);
291 gppi (sesskey
, "CapsLockCyr", 0, &cfg
->xlat_capslockcyr
);
292 gppi (sesskey
, "ScrollBar", 1, &cfg
->scrollbar
);
293 gppi (sesskey
, "ScrollOnKey", 0, &cfg
->scroll_on_key
);
294 gppi (sesskey
, "ScrollOnDisp", 1, &cfg
->scroll_on_disp
);
295 gppi (sesskey
, "LockSize", 0, &cfg
->locksize
);
296 gppi (sesskey
, "BCE", 0, &cfg
->bce
);
297 gppi (sesskey
, "BlinkText", 0, &cfg
->blinktext
);
299 close_settings_r(sesskey
);
302 void do_defaults (char *session
, Config
*cfg
) {
304 load_settings (session
, TRUE
, cfg
);
306 load_settings ("Default Settings", FALSE
, cfg
);
309 static int sessioncmp(const void *av
, const void *bv
) {
310 const char *a
= *(const char *const *)av
;
311 const char *b
= *(const char *const *)bv
;
314 * Alphabetical order, except that "Default Settings" is a
315 * special case and comes first.
317 if (!strcmp(a
, "Default Settings"))
318 return -1; /* a comes first */
319 if (!strcmp(b
, "Default Settings"))
320 return +1; /* b comes first */
321 return strcmp(a
, b
); /* otherwise, compare normally */
324 void get_sesslist(int allocate
) {
325 static char otherbuf
[2048];
327 int buflen
, bufsize
, i
;
333 if ((handle
= enum_settings_start()) == NULL
)
336 buflen
= bufsize
= 0;
339 ret
= enum_settings_next(handle
, otherbuf
, sizeof(otherbuf
));
341 int len
= strlen(otherbuf
)+1;
342 if (bufsize
< buflen
+len
) {
343 bufsize
= buflen
+ len
+ 2048;
344 buffer
= srealloc(buffer
, bufsize
);
346 strcpy(buffer
+buflen
, otherbuf
);
347 buflen
+= strlen(buffer
+buflen
)+1;
350 enum_settings_finish(handle
);
351 buffer
= srealloc(buffer
, buflen
+1);
352 buffer
[buflen
] = '\0';
355 * Now set up the list of sessions. Note that "Default
356 * Settings" must always be claimed to exist, even if it
361 nsessions
= 1; /* "Default Settings" counts as one */
363 if (strcmp(p
, "Default Settings"))
369 sessions
= smalloc((nsessions
+1) * sizeof(char *));
370 sessions
[0] = "Default Settings";
374 if (strcmp(p
, "Default Settings"))
380 qsort(sessions
, i
, sizeof(char *), sessioncmp
);