1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-03-22 14:39:24 -05:00

Finish creating the storage.h abstraction and winstore.c implementation

[originally from svn r640]
This commit is contained in:
Simon Tatham 2000-09-27 16:21:52 +00:00
parent aad0a52dfb
commit 5b2b3de044
3 changed files with 248 additions and 193 deletions

View File

@ -25,7 +25,7 @@
void *open_settings_w(char *sessionname); void *open_settings_w(char *sessionname);
void write_setting_s(void *handle, char *key, char *value); void write_setting_s(void *handle, char *key, char *value);
void write_setting_i(void *handle, char *key, int 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 * 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); void *open_settings_r(char *sessionname);
char *read_setting_s(void *handle, char *key, char *buffer, int buflen); char *read_setting_s(void *handle, char *key, char *buffer, int buflen);
int read_setting_i(void *handle, char *key, int defvalue); 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. * 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. * 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 * 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. * 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. * Cleanup function: remove all of PuTTY's persistent state.

259
windlg.c
View File

@ -20,83 +20,20 @@
#define MAIN_NPANELS 8 #define MAIN_NPANELS 8
#define RECONF_NPANELS 5 #define RECONF_NPANELS 5
static const char *const puttystr = PUTTY_REG_POS "\\Sessions";
static char **events = NULL; static char **events = NULL;
static int nevents = 0, negsize = 0; static int nevents = 0, negsize = 0;
static HWND logbox = NULL, abtbox = NULL; static HWND logbox = NULL, abtbox = NULL;
static char hex[16] = "0123456789ABCDEF"; static void gpps(void *handle, char *name, char *def, char *val, int len) {
if (!read_setting_s(handle, name, val, len)) {
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) {
strncpy(val, def, len); strncpy(val, def, len);
val[len-1] = '\0'; val[len-1] = '\0';
} }
} }
static void gppi(HKEY key, LPCTSTR name, int def, int *i) { static void gppi(void *handle, char *name, int def, int *i) {
DWORD type, val, size; *i = read_setting_i(handle, name, def);
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 HINSTANCE hinst; static HINSTANCE hinst;
@ -105,36 +42,29 @@ static int readytogo;
static void save_settings (char *section, int do_host) { static void save_settings (char *section, int do_host) {
int i; int i;
HKEY subkey1, sesskey;
char *p; char *p;
void *sesskey;
p = malloc(3*strlen(section)+1); sesskey = open_settings_w(section);
mungestr(section, p); if (!sesskey)
return;
if (RegCreateKey(HKEY_CURRENT_USER, puttystr, &subkey1)!=ERROR_SUCCESS || write_setting_i (sesskey, "Present", 1);
RegCreateKey(subkey1, p, &sesskey) != ERROR_SUCCESS) {
sesskey = NULL;
}
free(p);
RegCloseKey(subkey1);
wppi (sesskey, "Present", 1);
if (do_host) { if (do_host) {
wpps (sesskey, "HostName", cfg.host); write_setting_s (sesskey, "HostName", cfg.host);
wppi (sesskey, "PortNumber", cfg.port); write_setting_i (sesskey, "PortNumber", cfg.port);
p = "raw"; p = "raw";
for (i = 0; backends[i].name != NULL; i++) for (i = 0; backends[i].name != NULL; i++)
if (backends[i].protocol == cfg.protocol) { if (backends[i].protocol == cfg.protocol) {
p = backends[i].name; p = backends[i].name;
break; break;
} }
wpps (sesskey, "Protocol", p); write_setting_s (sesskey, "Protocol", p);
} }
wppi (sesskey, "CloseOnExit", !!cfg.close_on_exit); write_setting_i (sesskey, "CloseOnExit", !!cfg.close_on_exit);
wppi (sesskey, "WarnOnClose", !!cfg.warn_on_close); write_setting_i (sesskey, "WarnOnClose", !!cfg.warn_on_close);
wpps (sesskey, "TerminalType", cfg.termtype); write_setting_s (sesskey, "TerminalType", cfg.termtype);
wpps (sesskey, "TerminalSpeed", cfg.termspeed); write_setting_s (sesskey, "TerminalSpeed", cfg.termspeed);
{ {
char buf[2*sizeof(cfg.environmt)], *p, *q; char buf[2*sizeof(cfg.environmt)], *p, *q;
p = buf; p = buf;
@ -152,51 +82,51 @@ static void save_settings (char *section, int do_host) {
q++; q++;
} }
*p = '\0'; *p = '\0';
wpps (sesskey, "Environment", buf); write_setting_s (sesskey, "Environment", buf);
} }
wpps (sesskey, "UserName", cfg.username); write_setting_s (sesskey, "UserName", cfg.username);
wppi (sesskey, "NoPTY", cfg.nopty); write_setting_i (sesskey, "NoPTY", cfg.nopty);
wppi (sesskey, "AgentFwd", cfg.agentfwd); write_setting_i (sesskey, "AgentFwd", cfg.agentfwd);
wpps (sesskey, "RemoteCmd", cfg.remote_cmd); write_setting_s (sesskey, "RemoteCmd", cfg.remote_cmd);
wpps (sesskey, "Cipher", cfg.cipher == CIPHER_BLOWFISH ? "blowfish" : write_setting_s (sesskey, "Cipher", cfg.cipher == CIPHER_BLOWFISH ? "blowfish" :
cfg.cipher == CIPHER_DES ? "des" : "3des"); cfg.cipher == CIPHER_DES ? "des" : "3des");
wppi (sesskey, "AuthTIS", cfg.try_tis_auth); write_setting_i (sesskey, "AuthTIS", cfg.try_tis_auth);
wppi (sesskey, "SshProt", cfg.sshprot); write_setting_i (sesskey, "SshProt", cfg.sshprot);
wpps (sesskey, "PublicKeyFile", cfg.keyfile); write_setting_s (sesskey, "PublicKeyFile", cfg.keyfile);
wppi (sesskey, "RFCEnviron", cfg.rfc_environ); write_setting_i (sesskey, "RFCEnviron", cfg.rfc_environ);
wppi (sesskey, "BackspaceIsDelete", cfg.bksp_is_delete); write_setting_i (sesskey, "BackspaceIsDelete", cfg.bksp_is_delete);
wppi (sesskey, "RXVTHomeEnd", cfg.rxvt_homeend); write_setting_i (sesskey, "RXVTHomeEnd", cfg.rxvt_homeend);
wppi (sesskey, "LinuxFunctionKeys", cfg.funky_type); write_setting_i (sesskey, "LinuxFunctionKeys", cfg.funky_type);
wppi (sesskey, "ApplicationCursorKeys", cfg.app_cursor); write_setting_i (sesskey, "ApplicationCursorKeys", cfg.app_cursor);
wppi (sesskey, "ApplicationKeypad", cfg.app_keypad); write_setting_i (sesskey, "ApplicationKeypad", cfg.app_keypad);
wppi (sesskey, "NetHackKeypad", cfg.nethack_keypad); write_setting_i (sesskey, "NetHackKeypad", cfg.nethack_keypad);
wppi (sesskey, "AltF4", cfg.alt_f4); write_setting_i (sesskey, "AltF4", cfg.alt_f4);
wppi (sesskey, "AltSpace", cfg.alt_space); write_setting_i (sesskey, "AltSpace", cfg.alt_space);
wppi (sesskey, "LdiscTerm", cfg.ldisc_term); write_setting_i (sesskey, "LdiscTerm", cfg.ldisc_term);
wppi (sesskey, "BlinkCur", cfg.blink_cur); write_setting_i (sesskey, "BlinkCur", cfg.blink_cur);
wppi (sesskey, "Beep", cfg.beep); write_setting_i (sesskey, "Beep", cfg.beep);
wppi (sesskey, "ScrollbackLines", cfg.savelines); write_setting_i (sesskey, "ScrollbackLines", cfg.savelines);
wppi (sesskey, "DECOriginMode", cfg.dec_om); write_setting_i (sesskey, "DECOriginMode", cfg.dec_om);
wppi (sesskey, "AutoWrapMode", cfg.wrap_mode); write_setting_i (sesskey, "AutoWrapMode", cfg.wrap_mode);
wppi (sesskey, "LFImpliesCR", cfg.lfhascr); write_setting_i (sesskey, "LFImpliesCR", cfg.lfhascr);
wppi (sesskey, "WinNameAlways", cfg.win_name_always); write_setting_i (sesskey, "WinNameAlways", cfg.win_name_always);
wppi (sesskey, "TermWidth", cfg.width); write_setting_i (sesskey, "TermWidth", cfg.width);
wppi (sesskey, "TermHeight", cfg.height); write_setting_i (sesskey, "TermHeight", cfg.height);
wpps (sesskey, "Font", cfg.font); write_setting_s (sesskey, "Font", cfg.font);
wppi (sesskey, "FontIsBold", cfg.fontisbold); write_setting_i (sesskey, "FontIsBold", cfg.fontisbold);
wppi (sesskey, "FontCharSet", cfg.fontcharset); write_setting_i (sesskey, "FontCharSet", cfg.fontcharset);
wppi (sesskey, "FontHeight", cfg.fontheight); write_setting_i (sesskey, "FontHeight", cfg.fontheight);
wppi (sesskey, "FontVTMode", cfg.vtmode); write_setting_i (sesskey, "FontVTMode", cfg.vtmode);
wppi (sesskey, "TryPalette", cfg.try_palette); write_setting_i (sesskey, "TryPalette", cfg.try_palette);
wppi (sesskey, "BoldAsColour", cfg.bold_colour); write_setting_i (sesskey, "BoldAsColour", cfg.bold_colour);
for (i=0; i<22; i++) { for (i=0; i<22; i++) {
char buf[20], buf2[30]; char buf[20], buf2[30];
sprintf(buf, "Colour%d", i); sprintf(buf, "Colour%d", i);
sprintf(buf2, "%d,%d,%d", cfg.colours[i][0], sprintf(buf2, "%d,%d,%d", cfg.colours[i][0],
cfg.colours[i][1], cfg.colours[i][2]); 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) { for (i=0; i<256; i+=32) {
char buf[20], buf2[256]; char buf[20], buf2[256];
int j; int j;
@ -206,54 +136,26 @@ static void save_settings (char *section, int do_host) {
sprintf(buf2+strlen(buf2), "%s%d", sprintf(buf2+strlen(buf2), "%s%d",
(*buf2 ? "," : ""), cfg.wordness[j]); (*buf2 ? "," : ""), cfg.wordness[j]);
} }
wpps (sesskey, buf, buf2); write_setting_s (sesskey, buf, buf2);
} }
wppi (sesskey, "KoiWinXlat", cfg.xlat_enablekoiwin); write_setting_i (sesskey, "KoiWinXlat", cfg.xlat_enablekoiwin);
wppi (sesskey, "88592Xlat", cfg.xlat_88592w1250); write_setting_i (sesskey, "88592Xlat", cfg.xlat_88592w1250);
wppi (sesskey, "CapsLockCyr", cfg.xlat_capslockcyr); write_setting_i (sesskey, "CapsLockCyr", cfg.xlat_capslockcyr);
wppi (sesskey, "ScrollBar", cfg.scrollbar); write_setting_i (sesskey, "ScrollBar", cfg.scrollbar);
wppi (sesskey, "ScrollOnKey", cfg.scroll_on_key); write_setting_i (sesskey, "ScrollOnKey", cfg.scroll_on_key);
wppi (sesskey, "LockSize", cfg.locksize); write_setting_i (sesskey, "LockSize", cfg.locksize);
wppi (sesskey, "BCE", cfg.bce); write_setting_i (sesskey, "BCE", cfg.bce);
wppi (sesskey, "BlinkText", cfg.blinktext); write_setting_i (sesskey, "BlinkText", cfg.blinktext);
RegCloseKey(sesskey); close_settings_w(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);
} }
static void load_settings (char *section, int do_host) { static void load_settings (char *section, int do_host) {
int i; int i;
HKEY subkey1, sesskey;
char *p;
char prot[10]; char prot[10];
void *sesskey;
p = malloc(3*strlen(section)+1); sesskey = open_settings_r(section);
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);
gpps (sesskey, "HostName", "", cfg.host, sizeof(cfg.host)); gpps (sesskey, "HostName", "", cfg.host, sizeof(cfg.host));
gppi (sesskey, "PortNumber", default_port, &cfg.port); 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, "BCE", 0, &cfg.bce);
gppi (sesskey, "BlinkText", 0, &cfg.blinktext); gppi (sesskey, "BlinkText", 0, &cfg.blinktext);
RegCloseKey(sesskey); close_settings_r(sesskey);
} }
static void force_normal(HWND hwnd) static void force_normal(HWND hwnd)
@ -709,7 +611,7 @@ static int CALLBACK ConnectionProc (HWND hwnd, UINT msg,
MessageBeep(0); MessageBeep(0);
break; break;
} }
del_session(sessions[n]); del_settings(sessions[n]);
get_sesslist (FALSE); get_sesslist (FALSE);
get_sesslist (TRUE); get_sesslist (TRUE);
SendDlgItemMessage (hwnd, IDC0_SESSLIST, LB_RESETCONTENT, SendDlgItemMessage (hwnd, IDC0_SESSLIST, LB_RESETCONTENT,
@ -1529,29 +1431,32 @@ static int CALLBACK ReconfDlgProc (HWND hwnd, UINT msg,
} }
void get_sesslist(int allocate) { void get_sesslist(int allocate) {
static char otherbuf[2048];
static char *buffer; static char *buffer;
int buflen, bufsize, i, ret; int buflen, bufsize, i;
char otherbuf[2048]; char *p, *ret;
char *p; void *handle;
HKEY subkey1;
if (allocate) { if (allocate) {
if (RegCreateKey(HKEY_CURRENT_USER,
puttystr, &subkey1) != ERROR_SUCCESS) if ((handle = enum_settings_start()) == NULL)
return; return;
buflen = bufsize = 0; buflen = bufsize = 0;
buffer = NULL; buffer = NULL;
i = 0;
do { do {
ret = RegEnumKey(subkey1, i++, otherbuf, sizeof(otherbuf)); ret = enum_settings_next(handle, otherbuf, sizeof(otherbuf));
if (ret == ERROR_SUCCESS) { if (ret) {
bufsize = buflen + 2048; int len = strlen(otherbuf)+1;
if (bufsize < buflen+len) {
bufsize = buflen + len + 2048;
buffer = srealloc(buffer, bufsize); buffer = srealloc(buffer, bufsize);
unmungestr(otherbuf, buffer+buflen); }
strcpy(buffer+buflen, otherbuf);
buflen += strlen(buffer+buflen)+1; buflen += strlen(buffer+buflen)+1;
} }
} while (ret == ERROR_SUCCESS); } while (ret);
enum_settings_finish(handle);
buffer = srealloc(buffer, buflen+1); buffer = srealloc(buffer, buflen+1);
buffer[buflen] = '\0'; buffer[buflen] = '\0';

View File

@ -8,6 +8,8 @@
#include "putty.h" #include "putty.h"
#include "storage.h" #include "storage.h"
static const char *const puttystr = PUTTY_REG_POS "\\Sessions";
static char seedpath[2*MAX_PATH+10] = "\0"; static char seedpath[2*MAX_PATH+10] = "\0";
static char hex[16] = "0123456789ABCDEF"; static char hex[16] = "0123456789ABCDEF";
@ -30,7 +32,7 @@ static void mungestr(char *in, char *out) {
return; return;
} }
static void unmungestr(char *in, char *out) { static void unmungestr(char *in, char *out, int outlen) {
while (*in) { while (*in) {
if (*in == '%' && in[1] && in[2]) { if (*in == '%' && in[1] && in[2]) {
int i, j; int i, j;
@ -39,23 +41,118 @@ static void unmungestr(char *in, char *out) {
j = in[2] - '0'; j -= (j > 9 ? 7 : 0); j = in[2] - '0'; j -= (j > 9 ? 7 : 0);
*out++ = (i<<4) + j; *out++ = (i<<4) + j;
if (!--outlen) return;
in += 3; in += 3;
} else } else {
*out++ = *in++; *out++ = *in++;
if (!--outlen) return;
}
} }
*out = '\0'; *out = '\0';
return; return;
} }
void *open_settings_w(char *sessionname); void *open_settings_w(char *sessionname) {
void write_setting_s(void *handle, char *key, char *value); HKEY subkey1, sesskey;
void write_setting_i(void *handle, char *key, int value); int ret;
void *close_settings_w(void *handle); char *p;
void *open_settings_r(char *sessionname); p = malloc(3*strlen(sessionname)+1);
char *read_setting_s(void *handle, char *key, char *buffer, int buflen); mungestr(sessionname, p);
int read_setting_i(void *handle, char *key, int defvalue);
void *close_settings_r(void *handle); 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) { static void hostkey_regname(char *buffer, char *hostname, char *keytype) {
strcpy(buffer, keytype); strcpy(buffer, keytype);
@ -63,6 +160,47 @@ static void hostkey_regname(char *buffer, char *hostname, char *keytype) {
mungestr(hostname, buffer + strlen(buffer)); 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) { int verify_host_key(char *hostname, char *keytype, char *key) {
char *otherstr, *regname; char *otherstr, *regname;
int len; 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; HANDLE seedf;
if (!seedpath[0]) if (!seedpath[0])