mirror of
https://github.com/solemnwarning/ipxwrapper
synced 2024-12-30 16:45:37 +01:00
Implemented registry writing functions.
Implemented random (locally-administered) MAC address generator. Added config options for single interface mode.
This commit is contained in:
parent
46b62c450c
commit
39c6e18b46
58
src/addr.c
58
src/addr.c
@ -95,12 +95,25 @@ bool addr32_from_string(addr32_t *dest, const char *src)
|
|||||||
*/
|
*/
|
||||||
addr32_t reg_get_addr32(HKEY key, const char *name, addr32_t default_value)
|
addr32_t reg_get_addr32(HKEY key, const char *name, addr32_t default_value)
|
||||||
{
|
{
|
||||||
unsigned char buf[4];
|
unsigned char buf[4], default_buf[4];
|
||||||
reg_get_bin(key, name, buf, 4, &default_value);
|
|
||||||
|
addr48_out(default_buf, default_value);
|
||||||
|
reg_get_bin(key, name, buf, 4, default_buf);
|
||||||
|
|
||||||
return addr32_in(buf);
|
return addr32_in(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Store a 32-bit network address in the registry.
|
||||||
|
* Returns true on success, false on failure.
|
||||||
|
*/
|
||||||
|
bool reg_set_addr32(HKEY key, const char *name, addr32_t value)
|
||||||
|
{
|
||||||
|
unsigned char buf[4];
|
||||||
|
addr32_out(buf, value);
|
||||||
|
|
||||||
|
return reg_set_bin(key, name, buf, sizeof(buf));
|
||||||
|
}
|
||||||
|
|
||||||
addr48_t addr48_in(const void *src)
|
addr48_t addr48_in(const void *src)
|
||||||
{
|
{
|
||||||
addr48_t buf = 0;
|
addr48_t buf = 0;
|
||||||
@ -150,12 +163,25 @@ bool addr48_from_string(addr48_t *dest, const char *src)
|
|||||||
*/
|
*/
|
||||||
addr48_t reg_get_addr48(HKEY key, const char *name, addr48_t default_value)
|
addr48_t reg_get_addr48(HKEY key, const char *name, addr48_t default_value)
|
||||||
{
|
{
|
||||||
unsigned char buf[6];
|
unsigned char buf[6], default_buf[6];
|
||||||
reg_get_bin(key, name, buf, 6, &default_value);
|
|
||||||
|
addr48_out(default_buf, default_value);
|
||||||
|
reg_get_bin(key, name, buf, 6, default_buf);
|
||||||
|
|
||||||
return addr48_in(buf);
|
return addr48_in(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Store a 48-bit network address in the registry.
|
||||||
|
* Returns true on success, false on failure.
|
||||||
|
*/
|
||||||
|
bool reg_set_addr48(HKEY key, const char *name, addr48_t value)
|
||||||
|
{
|
||||||
|
unsigned char buf[6];
|
||||||
|
addr48_out(buf, value);
|
||||||
|
|
||||||
|
return reg_set_bin(key, name, buf, sizeof(buf));
|
||||||
|
}
|
||||||
|
|
||||||
/* Format an IPX address as a string.
|
/* Format an IPX address as a string.
|
||||||
*
|
*
|
||||||
* The socket number should be in network byte order and the supplied buffer
|
* The socket number should be in network byte order and the supplied buffer
|
||||||
@ -171,3 +197,27 @@ void ipx_to_string(char *buf, addr32_t net, addr48_t node, uint16_t sock)
|
|||||||
|
|
||||||
sprintf(buf + 30, "%hu", ntohs(sock));
|
sprintf(buf + 30, "%hu", ntohs(sock));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Generate a (probably) unique locally-administered MAC address. */
|
||||||
|
addr48_t gen_random_mac()
|
||||||
|
{
|
||||||
|
static bool seeded = false;
|
||||||
|
|
||||||
|
if(!seeded)
|
||||||
|
{
|
||||||
|
srand(GetTickCount());
|
||||||
|
seeded = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char addr[6];
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for(i = 0; i < 6; i++)
|
||||||
|
{
|
||||||
|
addr[i] = (rand() % 0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
addr[0] |= 0x02;
|
||||||
|
|
||||||
|
return addr48_in(addr);
|
||||||
|
}
|
||||||
|
@ -37,6 +37,7 @@ char *addr32_string(char *buf, addr32_t addr);
|
|||||||
bool addr32_from_string(addr32_t *dest, const char *src);
|
bool addr32_from_string(addr32_t *dest, const char *src);
|
||||||
|
|
||||||
addr32_t reg_get_addr32(HKEY key, const char *name, addr32_t default_value);
|
addr32_t reg_get_addr32(HKEY key, const char *name, addr32_t default_value);
|
||||||
|
bool reg_set_addr32(HKEY key, const char *name, addr32_t value);
|
||||||
|
|
||||||
#define ADDR48_STRING_SIZE 18
|
#define ADDR48_STRING_SIZE 18
|
||||||
|
|
||||||
@ -47,6 +48,7 @@ char *addr48_string(char *buf, addr48_t addr);
|
|||||||
bool addr48_from_string(addr48_t *dest, const char *src);
|
bool addr48_from_string(addr48_t *dest, const char *src);
|
||||||
|
|
||||||
addr48_t reg_get_addr48(HKEY key, const char *name, addr48_t default_value);
|
addr48_t reg_get_addr48(HKEY key, const char *name, addr48_t default_value);
|
||||||
|
bool reg_set_addr48(HKEY key, const char *name, addr48_t value);
|
||||||
|
|
||||||
#define IPX_SADDR_SIZE 36
|
#define IPX_SADDR_SIZE 36
|
||||||
|
|
||||||
@ -56,6 +58,8 @@ addr48_t reg_get_addr48(HKEY key, const char *name, addr48_t default_value);
|
|||||||
|
|
||||||
void ipx_to_string(char *buf, addr32_t net, addr48_t node, uint16_t sock);
|
void ipx_to_string(char *buf, addr32_t net, addr48_t node, uint16_t sock);
|
||||||
|
|
||||||
|
addr48_t gen_random_mac();
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
36
src/common.c
36
src/common.c
@ -114,6 +114,24 @@ bool reg_get_bin(HKEY key, const char *name, void *buf, size_t size, const void
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool reg_set_bin(HKEY key, const char *name, void *buf, size_t size)
|
||||||
|
{
|
||||||
|
if(key != NULL)
|
||||||
|
{
|
||||||
|
int err = RegSetValueEx(key, name, 0, REG_BINARY, (BYTE*)buf, size);
|
||||||
|
|
||||||
|
if(err == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
log_printf(LOG_ERROR, "Error writing registry value: %s", w32_error(err));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
DWORD reg_get_dword(HKEY key, const char *name, DWORD default_value)
|
DWORD reg_get_dword(HKEY key, const char *name, DWORD default_value)
|
||||||
{
|
{
|
||||||
DWORD buf;
|
DWORD buf;
|
||||||
@ -122,6 +140,24 @@ DWORD reg_get_dword(HKEY key, const char *name, DWORD default_value)
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool reg_set_dword(HKEY key, const char *name, DWORD value)
|
||||||
|
{
|
||||||
|
if(key != NULL)
|
||||||
|
{
|
||||||
|
int err = RegSetValueEx(key, name, 0, REG_DWORD, (BYTE*)&value, sizeof(value));
|
||||||
|
|
||||||
|
if(err == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
log_printf(LOG_ERROR, "Error writing registry value: %s", w32_error(err));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void load_dll(unsigned int dllnum) {
|
void load_dll(unsigned int dllnum) {
|
||||||
char path[512];
|
char path[512];
|
||||||
|
|
||||||
|
@ -42,7 +42,10 @@ HKEY reg_open_subkey(HKEY parent, const char *path, bool readwrite);
|
|||||||
void reg_close(HKEY key);
|
void reg_close(HKEY key);
|
||||||
|
|
||||||
bool reg_get_bin(HKEY key, const char *name, void *buf, size_t size, const void *default_value);
|
bool reg_get_bin(HKEY key, const char *name, void *buf, size_t size, const void *default_value);
|
||||||
|
bool reg_set_bin(HKEY key, const char *name, void *buf, size_t size);
|
||||||
|
|
||||||
DWORD reg_get_dword(HKEY key, const char *name, DWORD default_value);
|
DWORD reg_get_dword(HKEY key, const char *name, DWORD default_value);
|
||||||
|
bool reg_set_dword(HKEY key, const char *name, DWORD value);
|
||||||
|
|
||||||
void load_dll(unsigned int dllnum);
|
void load_dll(unsigned int dllnum);
|
||||||
void unload_dlls(void);
|
void unload_dlls(void);
|
||||||
|
21
src/config.c
21
src/config.c
@ -37,6 +37,25 @@ main_config_t get_main_config(void)
|
|||||||
HKEY reg = reg_open_main(false);
|
HKEY reg = reg_open_main(false);
|
||||||
DWORD version = reg_get_dword(reg, "config_version", 1);
|
DWORD version = reg_get_dword(reg, "config_version", 1);
|
||||||
|
|
||||||
|
config.single_iface = reg_get_dword(reg, "single_iface", true);
|
||||||
|
config.single_netnum = reg_get_addr32(reg, "single_netnum", addr32_in((unsigned char[]){0x00, 0x00, 0x00, 0x01}));
|
||||||
|
config.single_nodenum = reg_get_addr48(reg, "single_nodenum", 0);
|
||||||
|
|
||||||
|
if(config.single_nodenum == 0)
|
||||||
|
{
|
||||||
|
/* Generate a random node number and store it in the registry
|
||||||
|
* for persistence.
|
||||||
|
*/
|
||||||
|
|
||||||
|
config.single_nodenum = gen_random_mac();
|
||||||
|
|
||||||
|
HKEY wreg = reg_open_main(true);
|
||||||
|
|
||||||
|
reg_set_addr48(wreg, "single_nodenum", config.single_nodenum);
|
||||||
|
|
||||||
|
reg_close(wreg);
|
||||||
|
}
|
||||||
|
|
||||||
if(version == 1)
|
if(version == 1)
|
||||||
{
|
{
|
||||||
struct v1_global_config reg_config;
|
struct v1_global_config reg_config;
|
||||||
@ -48,6 +67,8 @@ main_config_t get_main_config(void)
|
|||||||
config.bcast_all = reg_config.bcast_all;
|
config.bcast_all = reg_config.bcast_all;
|
||||||
config.src_filter = reg_config.filter;
|
config.src_filter = reg_config.filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
config.router_port = reg_get_dword(reg, "control_port", config.router_port);
|
||||||
}
|
}
|
||||||
else if(version == 2)
|
else if(version == 2)
|
||||||
{
|
{
|
||||||
|
@ -33,6 +33,10 @@ typedef struct main_config {
|
|||||||
|
|
||||||
unsigned int addr_cache_ttl;
|
unsigned int addr_cache_ttl;
|
||||||
unsigned int iface_ttl;
|
unsigned int iface_ttl;
|
||||||
|
|
||||||
|
bool single_iface;
|
||||||
|
addr32_t single_netnum;
|
||||||
|
addr48_t single_nodenum;
|
||||||
} main_config_t;
|
} main_config_t;
|
||||||
|
|
||||||
struct v1_global_config {
|
struct v1_global_config {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user