mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-09 17:38:00 +00:00
Finish creating the storage.h abstraction and winstore.c implementation
[originally from svn r640]
This commit is contained in:
parent
aad0a52dfb
commit
5b2b3de044
20
storage.h
20
storage.h
@ -25,7 +25,7 @@
|
||||
void *open_settings_w(char *sessionname);
|
||||
void write_setting_s(void *handle, char *key, char *value);
|
||||
void write_setting_i(void *handle, char *key, int value);
|
||||
void *close_settings_w(void *handle);
|
||||
void close_settings_w(void *handle);
|
||||
|
||||
/*
|
||||
* Read a saved session. The caller is expected to call
|
||||
@ -44,7 +44,19 @@ void *close_settings_w(void *handle);
|
||||
void *open_settings_r(char *sessionname);
|
||||
char *read_setting_s(void *handle, char *key, char *buffer, int buflen);
|
||||
int read_setting_i(void *handle, char *key, int defvalue);
|
||||
void *close_settings_r(void *handle);
|
||||
void close_settings_r(void *handle);
|
||||
|
||||
/*
|
||||
* Delete a whole saved session.
|
||||
*/
|
||||
void del_settings(char *sessionname);
|
||||
|
||||
/*
|
||||
* Enumerate all saved sessions.
|
||||
*/
|
||||
void *enum_settings_start(void);
|
||||
char *enum_settings_next(void *handle, char *buffer, int buflen);
|
||||
void enum_settings_finish(void *handle);
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
* Functions to access PuTTY's host key database.
|
||||
@ -67,7 +79,7 @@ void store_host_key(char *hostname, char *keytype, char *key);
|
||||
* Functions to access PuTTY's random number seed file.
|
||||
*/
|
||||
|
||||
typedef void (*noise_consumer_t)(void *data, size_t len);
|
||||
typedef void (*noise_consumer_t)(void *data, int len);
|
||||
|
||||
/*
|
||||
* Read PuTTY's random seed file and pass its contents to a noise
|
||||
@ -78,7 +90,7 @@ void read_random_seed(noise_consumer_t consumer);
|
||||
/*
|
||||
* Write PuTTY's random seed file from a given chunk of noise.
|
||||
*/
|
||||
void write_random_seed(void *data, size_t len);
|
||||
void write_random_seed(void *data, int len);
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
* Cleanup function: remove all of PuTTY's persistent state.
|
||||
|
261
windlg.c
261
windlg.c
@ -20,83 +20,20 @@
|
||||
#define MAIN_NPANELS 8
|
||||
#define RECONF_NPANELS 5
|
||||
|
||||
static const char *const puttystr = PUTTY_REG_POS "\\Sessions";
|
||||
|
||||
static char **events = NULL;
|
||||
static int nevents = 0, negsize = 0;
|
||||
|
||||
static HWND logbox = NULL, abtbox = NULL;
|
||||
|
||||
static char hex[16] = "0123456789ABCDEF";
|
||||
|
||||
static void mungestr(char *in, char *out) {
|
||||
int candot = 0;
|
||||
|
||||
while (*in) {
|
||||
if (*in == ' ' || *in == '\\' || *in == '*' || *in == '?' ||
|
||||
*in == '%' || *in < ' ' || *in > '~' || (*in == '.' && !candot)) {
|
||||
*out++ = '%';
|
||||
*out++ = hex[((unsigned char)*in) >> 4];
|
||||
*out++ = hex[((unsigned char)*in) & 15];
|
||||
} else
|
||||
*out++ = *in;
|
||||
in++;
|
||||
candot = 1;
|
||||
}
|
||||
*out = '\0';
|
||||
return;
|
||||
}
|
||||
|
||||
static void unmungestr(char *in, char *out) {
|
||||
while (*in) {
|
||||
if (*in == '%' && in[1] && in[2]) {
|
||||
int i, j;
|
||||
|
||||
i = in[1] - '0'; i -= (i > 9 ? 7 : 0);
|
||||
j = in[2] - '0'; j -= (j > 9 ? 7 : 0);
|
||||
|
||||
*out++ = (i<<4) + j;
|
||||
in += 3;
|
||||
} else
|
||||
*out++ = *in++;
|
||||
}
|
||||
*out = '\0';
|
||||
return;
|
||||
}
|
||||
|
||||
static void wpps(HKEY key, LPCTSTR name, LPCTSTR value) {
|
||||
RegSetValueEx(key, name, 0, REG_SZ, value, 1+strlen(value));
|
||||
}
|
||||
|
||||
static void wppi(HKEY key, LPCTSTR name, int value) {
|
||||
RegSetValueEx(key, name, 0, REG_DWORD,
|
||||
(CONST BYTE *)&value, sizeof(value));
|
||||
}
|
||||
|
||||
static void gpps(HKEY key, LPCTSTR name, LPCTSTR def,
|
||||
LPTSTR val, int len) {
|
||||
DWORD type, size;
|
||||
size = len;
|
||||
|
||||
if (key == NULL ||
|
||||
RegQueryValueEx(key, name, 0, &type, val, &size) != ERROR_SUCCESS ||
|
||||
type != REG_SZ) {
|
||||
static void gpps(void *handle, char *name, char *def, char *val, int len) {
|
||||
if (!read_setting_s(handle, name, val, len)) {
|
||||
strncpy(val, def, len);
|
||||
val[len-1] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
static void gppi(HKEY key, LPCTSTR name, int def, int *i) {
|
||||
DWORD type, val, size;
|
||||
size = sizeof(val);
|
||||
|
||||
if (key == NULL ||
|
||||
RegQueryValueEx(key, name, 0, &type,
|
||||
(BYTE *)&val, &size) != ERROR_SUCCESS ||
|
||||
size != sizeof(val) || type != REG_DWORD)
|
||||
*i = def;
|
||||
else
|
||||
*i = val;
|
||||
static void gppi(void *handle, char *name, int def, int *i) {
|
||||
*i = read_setting_i(handle, name, def);
|
||||
}
|
||||
|
||||
static HINSTANCE hinst;
|
||||
@ -105,36 +42,29 @@ static int readytogo;
|
||||
|
||||
static void save_settings (char *section, int do_host) {
|
||||
int i;
|
||||
HKEY subkey1, sesskey;
|
||||
char *p;
|
||||
void *sesskey;
|
||||
|
||||
p = malloc(3*strlen(section)+1);
|
||||
mungestr(section, p);
|
||||
|
||||
if (RegCreateKey(HKEY_CURRENT_USER, puttystr, &subkey1)!=ERROR_SUCCESS ||
|
||||
RegCreateKey(subkey1, p, &sesskey) != ERROR_SUCCESS) {
|
||||
sesskey = NULL;
|
||||
}
|
||||
sesskey = open_settings_w(section);
|
||||
if (!sesskey)
|
||||
return;
|
||||
|
||||
free(p);
|
||||
RegCloseKey(subkey1);
|
||||
|
||||
wppi (sesskey, "Present", 1);
|
||||
write_setting_i (sesskey, "Present", 1);
|
||||
if (do_host) {
|
||||
wpps (sesskey, "HostName", cfg.host);
|
||||
wppi (sesskey, "PortNumber", cfg.port);
|
||||
write_setting_s (sesskey, "HostName", cfg.host);
|
||||
write_setting_i (sesskey, "PortNumber", cfg.port);
|
||||
p = "raw";
|
||||
for (i = 0; backends[i].name != NULL; i++)
|
||||
if (backends[i].protocol == cfg.protocol) {
|
||||
p = backends[i].name;
|
||||
break;
|
||||
}
|
||||
wpps (sesskey, "Protocol", p);
|
||||
write_setting_s (sesskey, "Protocol", p);
|
||||
}
|
||||
wppi (sesskey, "CloseOnExit", !!cfg.close_on_exit);
|
||||
wppi (sesskey, "WarnOnClose", !!cfg.warn_on_close);
|
||||
wpps (sesskey, "TerminalType", cfg.termtype);
|
||||
wpps (sesskey, "TerminalSpeed", cfg.termspeed);
|
||||
write_setting_i (sesskey, "CloseOnExit", !!cfg.close_on_exit);
|
||||
write_setting_i (sesskey, "WarnOnClose", !!cfg.warn_on_close);
|
||||
write_setting_s (sesskey, "TerminalType", cfg.termtype);
|
||||
write_setting_s (sesskey, "TerminalSpeed", cfg.termspeed);
|
||||
{
|
||||
char buf[2*sizeof(cfg.environmt)], *p, *q;
|
||||
p = buf;
|
||||
@ -152,51 +82,51 @@ static void save_settings (char *section, int do_host) {
|
||||
q++;
|
||||
}
|
||||
*p = '\0';
|
||||
wpps (sesskey, "Environment", buf);
|
||||
write_setting_s (sesskey, "Environment", buf);
|
||||
}
|
||||
wpps (sesskey, "UserName", cfg.username);
|
||||
wppi (sesskey, "NoPTY", cfg.nopty);
|
||||
wppi (sesskey, "AgentFwd", cfg.agentfwd);
|
||||
wpps (sesskey, "RemoteCmd", cfg.remote_cmd);
|
||||
wpps (sesskey, "Cipher", cfg.cipher == CIPHER_BLOWFISH ? "blowfish" :
|
||||
write_setting_s (sesskey, "UserName", cfg.username);
|
||||
write_setting_i (sesskey, "NoPTY", cfg.nopty);
|
||||
write_setting_i (sesskey, "AgentFwd", cfg.agentfwd);
|
||||
write_setting_s (sesskey, "RemoteCmd", cfg.remote_cmd);
|
||||
write_setting_s (sesskey, "Cipher", cfg.cipher == CIPHER_BLOWFISH ? "blowfish" :
|
||||
cfg.cipher == CIPHER_DES ? "des" : "3des");
|
||||
wppi (sesskey, "AuthTIS", cfg.try_tis_auth);
|
||||
wppi (sesskey, "SshProt", cfg.sshprot);
|
||||
wpps (sesskey, "PublicKeyFile", cfg.keyfile);
|
||||
wppi (sesskey, "RFCEnviron", cfg.rfc_environ);
|
||||
wppi (sesskey, "BackspaceIsDelete", cfg.bksp_is_delete);
|
||||
wppi (sesskey, "RXVTHomeEnd", cfg.rxvt_homeend);
|
||||
wppi (sesskey, "LinuxFunctionKeys", cfg.funky_type);
|
||||
wppi (sesskey, "ApplicationCursorKeys", cfg.app_cursor);
|
||||
wppi (sesskey, "ApplicationKeypad", cfg.app_keypad);
|
||||
wppi (sesskey, "NetHackKeypad", cfg.nethack_keypad);
|
||||
wppi (sesskey, "AltF4", cfg.alt_f4);
|
||||
wppi (sesskey, "AltSpace", cfg.alt_space);
|
||||
wppi (sesskey, "LdiscTerm", cfg.ldisc_term);
|
||||
wppi (sesskey, "BlinkCur", cfg.blink_cur);
|
||||
wppi (sesskey, "Beep", cfg.beep);
|
||||
wppi (sesskey, "ScrollbackLines", cfg.savelines);
|
||||
wppi (sesskey, "DECOriginMode", cfg.dec_om);
|
||||
wppi (sesskey, "AutoWrapMode", cfg.wrap_mode);
|
||||
wppi (sesskey, "LFImpliesCR", cfg.lfhascr);
|
||||
wppi (sesskey, "WinNameAlways", cfg.win_name_always);
|
||||
wppi (sesskey, "TermWidth", cfg.width);
|
||||
wppi (sesskey, "TermHeight", cfg.height);
|
||||
wpps (sesskey, "Font", cfg.font);
|
||||
wppi (sesskey, "FontIsBold", cfg.fontisbold);
|
||||
wppi (sesskey, "FontCharSet", cfg.fontcharset);
|
||||
wppi (sesskey, "FontHeight", cfg.fontheight);
|
||||
wppi (sesskey, "FontVTMode", cfg.vtmode);
|
||||
wppi (sesskey, "TryPalette", cfg.try_palette);
|
||||
wppi (sesskey, "BoldAsColour", cfg.bold_colour);
|
||||
write_setting_i (sesskey, "AuthTIS", cfg.try_tis_auth);
|
||||
write_setting_i (sesskey, "SshProt", cfg.sshprot);
|
||||
write_setting_s (sesskey, "PublicKeyFile", cfg.keyfile);
|
||||
write_setting_i (sesskey, "RFCEnviron", cfg.rfc_environ);
|
||||
write_setting_i (sesskey, "BackspaceIsDelete", cfg.bksp_is_delete);
|
||||
write_setting_i (sesskey, "RXVTHomeEnd", cfg.rxvt_homeend);
|
||||
write_setting_i (sesskey, "LinuxFunctionKeys", cfg.funky_type);
|
||||
write_setting_i (sesskey, "ApplicationCursorKeys", cfg.app_cursor);
|
||||
write_setting_i (sesskey, "ApplicationKeypad", cfg.app_keypad);
|
||||
write_setting_i (sesskey, "NetHackKeypad", cfg.nethack_keypad);
|
||||
write_setting_i (sesskey, "AltF4", cfg.alt_f4);
|
||||
write_setting_i (sesskey, "AltSpace", cfg.alt_space);
|
||||
write_setting_i (sesskey, "LdiscTerm", cfg.ldisc_term);
|
||||
write_setting_i (sesskey, "BlinkCur", cfg.blink_cur);
|
||||
write_setting_i (sesskey, "Beep", cfg.beep);
|
||||
write_setting_i (sesskey, "ScrollbackLines", cfg.savelines);
|
||||
write_setting_i (sesskey, "DECOriginMode", cfg.dec_om);
|
||||
write_setting_i (sesskey, "AutoWrapMode", cfg.wrap_mode);
|
||||
write_setting_i (sesskey, "LFImpliesCR", cfg.lfhascr);
|
||||
write_setting_i (sesskey, "WinNameAlways", cfg.win_name_always);
|
||||
write_setting_i (sesskey, "TermWidth", cfg.width);
|
||||
write_setting_i (sesskey, "TermHeight", cfg.height);
|
||||
write_setting_s (sesskey, "Font", cfg.font);
|
||||
write_setting_i (sesskey, "FontIsBold", cfg.fontisbold);
|
||||
write_setting_i (sesskey, "FontCharSet", cfg.fontcharset);
|
||||
write_setting_i (sesskey, "FontHeight", cfg.fontheight);
|
||||
write_setting_i (sesskey, "FontVTMode", cfg.vtmode);
|
||||
write_setting_i (sesskey, "TryPalette", cfg.try_palette);
|
||||
write_setting_i (sesskey, "BoldAsColour", cfg.bold_colour);
|
||||
for (i=0; i<22; i++) {
|
||||
char buf[20], buf2[30];
|
||||
sprintf(buf, "Colour%d", i);
|
||||
sprintf(buf2, "%d,%d,%d", cfg.colours[i][0],
|
||||
cfg.colours[i][1], cfg.colours[i][2]);
|
||||
wpps (sesskey, buf, buf2);
|
||||
write_setting_s (sesskey, buf, buf2);
|
||||
}
|
||||
wppi (sesskey, "MouseIsXterm", cfg.mouse_is_xterm);
|
||||
write_setting_i (sesskey, "MouseIsXterm", cfg.mouse_is_xterm);
|
||||
for (i=0; i<256; i+=32) {
|
||||
char buf[20], buf2[256];
|
||||
int j;
|
||||
@ -206,54 +136,26 @@ static void save_settings (char *section, int do_host) {
|
||||
sprintf(buf2+strlen(buf2), "%s%d",
|
||||
(*buf2 ? "," : ""), cfg.wordness[j]);
|
||||
}
|
||||
wpps (sesskey, buf, buf2);
|
||||
write_setting_s (sesskey, buf, buf2);
|
||||
}
|
||||
wppi (sesskey, "KoiWinXlat", cfg.xlat_enablekoiwin);
|
||||
wppi (sesskey, "88592Xlat", cfg.xlat_88592w1250);
|
||||
wppi (sesskey, "CapsLockCyr", cfg.xlat_capslockcyr);
|
||||
wppi (sesskey, "ScrollBar", cfg.scrollbar);
|
||||
wppi (sesskey, "ScrollOnKey", cfg.scroll_on_key);
|
||||
wppi (sesskey, "LockSize", cfg.locksize);
|
||||
wppi (sesskey, "BCE", cfg.bce);
|
||||
wppi (sesskey, "BlinkText", cfg.blinktext);
|
||||
write_setting_i (sesskey, "KoiWinXlat", cfg.xlat_enablekoiwin);
|
||||
write_setting_i (sesskey, "88592Xlat", cfg.xlat_88592w1250);
|
||||
write_setting_i (sesskey, "CapsLockCyr", cfg.xlat_capslockcyr);
|
||||
write_setting_i (sesskey, "ScrollBar", cfg.scrollbar);
|
||||
write_setting_i (sesskey, "ScrollOnKey", cfg.scroll_on_key);
|
||||
write_setting_i (sesskey, "LockSize", cfg.locksize);
|
||||
write_setting_i (sesskey, "BCE", cfg.bce);
|
||||
write_setting_i (sesskey, "BlinkText", cfg.blinktext);
|
||||
|
||||
RegCloseKey(sesskey);
|
||||
}
|
||||
|
||||
static void del_session (char *section) {
|
||||
HKEY subkey1;
|
||||
char *p;
|
||||
|
||||
if (RegOpenKey(HKEY_CURRENT_USER, puttystr, &subkey1) != ERROR_SUCCESS)
|
||||
return;
|
||||
|
||||
p = malloc(3*strlen(section)+1);
|
||||
mungestr(section, p);
|
||||
RegDeleteKey(subkey1, p);
|
||||
free(p);
|
||||
|
||||
RegCloseKey(subkey1);
|
||||
close_settings_w(sesskey);
|
||||
}
|
||||
|
||||
static void load_settings (char *section, int do_host) {
|
||||
int i;
|
||||
HKEY subkey1, sesskey;
|
||||
char *p;
|
||||
char prot[10];
|
||||
void *sesskey;
|
||||
|
||||
p = malloc(3*strlen(section)+1);
|
||||
mungestr(section, p);
|
||||
|
||||
if (RegOpenKey(HKEY_CURRENT_USER, puttystr, &subkey1) != ERROR_SUCCESS) {
|
||||
sesskey = NULL;
|
||||
} else {
|
||||
if (RegOpenKey(subkey1, p, &sesskey) != ERROR_SUCCESS) {
|
||||
sesskey = NULL;
|
||||
}
|
||||
RegCloseKey(subkey1);
|
||||
}
|
||||
|
||||
free(p);
|
||||
sesskey = open_settings_r(section);
|
||||
|
||||
gpps (sesskey, "HostName", "", cfg.host, sizeof(cfg.host));
|
||||
gppi (sesskey, "PortNumber", default_port, &cfg.port);
|
||||
@ -385,7 +287,7 @@ static void load_settings (char *section, int do_host) {
|
||||
gppi (sesskey, "BCE", 0, &cfg.bce);
|
||||
gppi (sesskey, "BlinkText", 0, &cfg.blinktext);
|
||||
|
||||
RegCloseKey(sesskey);
|
||||
close_settings_r(sesskey);
|
||||
}
|
||||
|
||||
static void force_normal(HWND hwnd)
|
||||
@ -709,7 +611,7 @@ static int CALLBACK ConnectionProc (HWND hwnd, UINT msg,
|
||||
MessageBeep(0);
|
||||
break;
|
||||
}
|
||||
del_session(sessions[n]);
|
||||
del_settings(sessions[n]);
|
||||
get_sesslist (FALSE);
|
||||
get_sesslist (TRUE);
|
||||
SendDlgItemMessage (hwnd, IDC0_SESSLIST, LB_RESETCONTENT,
|
||||
@ -1529,29 +1431,32 @@ static int CALLBACK ReconfDlgProc (HWND hwnd, UINT msg,
|
||||
}
|
||||
|
||||
void get_sesslist(int allocate) {
|
||||
static char otherbuf[2048];
|
||||
static char *buffer;
|
||||
int buflen, bufsize, i, ret;
|
||||
char otherbuf[2048];
|
||||
char *p;
|
||||
HKEY subkey1;
|
||||
int buflen, bufsize, i;
|
||||
char *p, *ret;
|
||||
void *handle;
|
||||
|
||||
if (allocate) {
|
||||
if (RegCreateKey(HKEY_CURRENT_USER,
|
||||
puttystr, &subkey1) != ERROR_SUCCESS)
|
||||
|
||||
if ((handle = enum_settings_start()) == NULL)
|
||||
return;
|
||||
|
||||
buflen = bufsize = 0;
|
||||
buffer = NULL;
|
||||
i = 0;
|
||||
do {
|
||||
ret = RegEnumKey(subkey1, i++, otherbuf, sizeof(otherbuf));
|
||||
if (ret == ERROR_SUCCESS) {
|
||||
bufsize = buflen + 2048;
|
||||
buffer = srealloc(buffer, bufsize);
|
||||
unmungestr(otherbuf, buffer+buflen);
|
||||
ret = enum_settings_next(handle, otherbuf, sizeof(otherbuf));
|
||||
if (ret) {
|
||||
int len = strlen(otherbuf)+1;
|
||||
if (bufsize < buflen+len) {
|
||||
bufsize = buflen + len + 2048;
|
||||
buffer = srealloc(buffer, bufsize);
|
||||
}
|
||||
strcpy(buffer+buflen, otherbuf);
|
||||
buflen += strlen(buffer+buflen)+1;
|
||||
}
|
||||
} while (ret == ERROR_SUCCESS);
|
||||
} while (ret);
|
||||
enum_settings_finish(handle);
|
||||
buffer = srealloc(buffer, buflen+1);
|
||||
buffer[buflen] = '\0';
|
||||
|
||||
|
160
winstore.c
160
winstore.c
@ -8,6 +8,8 @@
|
||||
#include "putty.h"
|
||||
#include "storage.h"
|
||||
|
||||
static const char *const puttystr = PUTTY_REG_POS "\\Sessions";
|
||||
|
||||
static char seedpath[2*MAX_PATH+10] = "\0";
|
||||
|
||||
static char hex[16] = "0123456789ABCDEF";
|
||||
@ -30,7 +32,7 @@ static void mungestr(char *in, char *out) {
|
||||
return;
|
||||
}
|
||||
|
||||
static void unmungestr(char *in, char *out) {
|
||||
static void unmungestr(char *in, char *out, int outlen) {
|
||||
while (*in) {
|
||||
if (*in == '%' && in[1] && in[2]) {
|
||||
int i, j;
|
||||
@ -39,23 +41,118 @@ static void unmungestr(char *in, char *out) {
|
||||
j = in[2] - '0'; j -= (j > 9 ? 7 : 0);
|
||||
|
||||
*out++ = (i<<4) + j;
|
||||
if (!--outlen) return;
|
||||
in += 3;
|
||||
} else
|
||||
} else {
|
||||
*out++ = *in++;
|
||||
if (!--outlen) return;
|
||||
}
|
||||
}
|
||||
*out = '\0';
|
||||
return;
|
||||
}
|
||||
|
||||
void *open_settings_w(char *sessionname);
|
||||
void write_setting_s(void *handle, char *key, char *value);
|
||||
void write_setting_i(void *handle, char *key, int value);
|
||||
void *close_settings_w(void *handle);
|
||||
void *open_settings_w(char *sessionname) {
|
||||
HKEY subkey1, sesskey;
|
||||
int ret;
|
||||
char *p;
|
||||
|
||||
void *open_settings_r(char *sessionname);
|
||||
char *read_setting_s(void *handle, char *key, char *buffer, int buflen);
|
||||
int read_setting_i(void *handle, char *key, int defvalue);
|
||||
void *close_settings_r(void *handle);
|
||||
p = malloc(3*strlen(sessionname)+1);
|
||||
mungestr(sessionname, p);
|
||||
|
||||
ret = RegCreateKey(HKEY_CURRENT_USER, puttystr, &subkey1);
|
||||
if (ret != ERROR_SUCCESS) {
|
||||
free(p);
|
||||
return NULL;
|
||||
}
|
||||
ret = RegCreateKey(subkey1, p, &sesskey);
|
||||
free(p);
|
||||
RegCloseKey(subkey1);
|
||||
if (ret != ERROR_SUCCESS)
|
||||
return NULL;
|
||||
return (void *)sesskey;
|
||||
}
|
||||
|
||||
void write_setting_s(void *handle, char *key, char *value) {
|
||||
if (handle)
|
||||
RegSetValueEx((HKEY)handle, key, 0, REG_SZ, value, 1+strlen(value));
|
||||
}
|
||||
|
||||
void write_setting_i(void *handle, char *key, int value) {
|
||||
if (handle)
|
||||
RegSetValueEx((HKEY)handle, key, 0, REG_DWORD,
|
||||
(CONST BYTE *)&value, sizeof(value));
|
||||
}
|
||||
|
||||
void close_settings_w(void *handle) {
|
||||
RegCloseKey((HKEY)handle);
|
||||
}
|
||||
|
||||
void *open_settings_r(char *sessionname) {
|
||||
HKEY subkey1, sesskey;
|
||||
char *p;
|
||||
|
||||
p = malloc(3*strlen(sessionname)+1);
|
||||
mungestr(sessionname, p);
|
||||
|
||||
if (RegOpenKey(HKEY_CURRENT_USER, puttystr, &subkey1) != ERROR_SUCCESS) {
|
||||
sesskey = NULL;
|
||||
} else {
|
||||
if (RegOpenKey(subkey1, p, &sesskey) != ERROR_SUCCESS) {
|
||||
sesskey = NULL;
|
||||
}
|
||||
RegCloseKey(subkey1);
|
||||
}
|
||||
|
||||
free(p);
|
||||
|
||||
return (void *)sesskey;
|
||||
}
|
||||
|
||||
char *read_setting_s(void *handle, char *key, char *buffer, int buflen) {
|
||||
DWORD type, size;
|
||||
size = buflen;
|
||||
|
||||
if (!handle ||
|
||||
RegQueryValueEx((HKEY)handle, key, 0,
|
||||
&type, buffer, &size) != ERROR_SUCCESS ||
|
||||
type != REG_SZ)
|
||||
return NULL;
|
||||
else
|
||||
return buffer;
|
||||
}
|
||||
|
||||
int read_setting_i(void *handle, char *key, int defvalue) {
|
||||
DWORD type, val, size;
|
||||
size = sizeof(val);
|
||||
|
||||
if (!handle ||
|
||||
RegQueryValueEx((HKEY)handle, key, 0, &type,
|
||||
(BYTE *)&val, &size) != ERROR_SUCCESS ||
|
||||
size != sizeof(val) || type != REG_DWORD)
|
||||
return defvalue;
|
||||
else
|
||||
return val;
|
||||
}
|
||||
|
||||
void close_settings_r(void *handle) {
|
||||
RegCloseKey((HKEY)handle);
|
||||
}
|
||||
|
||||
void del_settings (char *sessionname) {
|
||||
HKEY subkey1;
|
||||
char *p;
|
||||
|
||||
if (RegOpenKey(HKEY_CURRENT_USER, puttystr, &subkey1) != ERROR_SUCCESS)
|
||||
return;
|
||||
|
||||
p = malloc(3*strlen(sessionname)+1);
|
||||
mungestr(sessionname, p);
|
||||
RegDeleteKey(subkey1, p);
|
||||
free(p);
|
||||
|
||||
RegCloseKey(subkey1);
|
||||
}
|
||||
|
||||
static void hostkey_regname(char *buffer, char *hostname, char *keytype) {
|
||||
strcpy(buffer, keytype);
|
||||
@ -63,6 +160,47 @@ static void hostkey_regname(char *buffer, char *hostname, char *keytype) {
|
||||
mungestr(hostname, buffer + strlen(buffer));
|
||||
}
|
||||
|
||||
struct enumsettings {
|
||||
HKEY key;
|
||||
int i;
|
||||
};
|
||||
|
||||
void *enum_settings_start(void) {
|
||||
struct enumsettings *ret;
|
||||
HKEY key;
|
||||
|
||||
if (RegCreateKey(HKEY_CURRENT_USER, puttystr, &key) != ERROR_SUCCESS)
|
||||
return NULL;
|
||||
|
||||
ret = malloc(sizeof(*ret));
|
||||
if (ret) {
|
||||
ret->key = key;
|
||||
ret->i = 0;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
char *enum_settings_next(void *handle, char *buffer, int buflen) {
|
||||
struct enumsettings *e = (struct enumsettings *)handle;
|
||||
char *otherbuf;
|
||||
otherbuf = malloc(3*buflen);
|
||||
if (otherbuf && RegEnumKey(e->key, e->i++, otherbuf,
|
||||
3*buflen) == ERROR_SUCCESS) {
|
||||
unmungestr(otherbuf, buffer, buflen);
|
||||
free(otherbuf);
|
||||
return buffer;
|
||||
} else
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
void enum_settings_finish(void *handle) {
|
||||
struct enumsettings *e = (struct enumsettings *)handle;
|
||||
RegCloseKey(e->key);
|
||||
free(e);
|
||||
}
|
||||
|
||||
int verify_host_key(char *hostname, char *keytype, char *key) {
|
||||
char *otherstr, *regname;
|
||||
int len;
|
||||
@ -243,7 +381,7 @@ void read_random_seed(noise_consumer_t consumer) {
|
||||
}
|
||||
}
|
||||
|
||||
void write_random_seed(void *data, size_t len) {
|
||||
void write_random_seed(void *data, int len) {
|
||||
HANDLE seedf;
|
||||
|
||||
if (!seedpath[0])
|
||||
|
Loading…
Reference in New Issue
Block a user