1
0
mirror of https://github.com/solemnwarning/ipxwrapper synced 2024-12-30 16:45:37 +01:00

Added option to change router control port.

This commit is contained in:
Daniel Collins 2011-09-19 00:43:16 +00:00
parent c5a3429d9a
commit a8a700b6f2
5 changed files with 51 additions and 10 deletions

View File

@ -98,6 +98,11 @@ DWORD reg_get_bin(const char *val_name, void *buf, DWORD size) {
return size;
}
DWORD reg_get_dword(const char *val_name, DWORD default_val) {
DWORD buf;
return reg_get_bin(val_name, &buf, sizeof(buf)) == sizeof(buf) ? buf : default_val;
}
void load_dll(unsigned int dllnum) {
char path[512];

View File

@ -55,6 +55,7 @@ void reg_close(void);
char reg_get_char(const char *val_name, char default_val);
DWORD reg_get_bin(const char *val_name, void *buf, DWORD size);
DWORD reg_get_dword(const char *val_name, DWORD default_val);
void load_dll(unsigned int dllnum);
void unload_dlls(void);

View File

@ -19,6 +19,7 @@
#define IPX_CONFIG_H
#define DEFAULT_PORT 54792
#define DEFAULT_CONTROL_PORT 54793
#define TTL 60
struct reg_value {

View File

@ -39,6 +39,7 @@
#define ID_OPT_BCAST 23
#define ID_OPT_FILTER 24
#define ID_OPT_LOG 25
#define ID_OPT_CPORT 26
#define ID_OK 31
#define ID_CANCEL 32
@ -61,7 +62,7 @@ struct iface {
typedef std::vector<iface> iface_list;
static void get_nics();
static bool reg_write(const char *name, void *value, size_t size);
static bool reg_write(const char *name, void *value, size_t size, DWORD type = REG_BINARY);
static size_t reg_read(const char *name, void *buf, size_t max_size);
static bool save_config();
static bool store_nic();
@ -110,6 +111,8 @@ static struct {
HWND opt_log;
HWND opt_port_lbl;
HWND opt_port;
HWND opt_cport_lbl;
HWND opt_cport;
HWND ok_btn;
HWND can_btn;
@ -221,10 +224,10 @@ static LRESULT CALLBACK main_wproc(HWND window, UINT msg, WPARAM wp, LPARAM lp)
/* Options groupbox */
int lbl_w = get_text_width(windows.nic_net_lbl, "UDP port number");
int lbl_w = get_text_width(windows.nic_net_lbl, "Control port number");
int edit_w = get_text_width(windows.nic_node, "000000");
int opt_h = 5 * text_h + edit_h + 18;
int opt_h = 5 * text_h + 2 * edit_h + 18;
MoveWindow(windows.opt_group, 0, height - opt_h - btn_h - 12, width, opt_h, TRUE);
@ -233,6 +236,11 @@ static LRESULT CALLBACK main_wproc(HWND window, UINT msg, WPARAM wp, LPARAM lp)
MoveWindow(windows.opt_port_lbl, 10, y + edge, lbl_w, text_h, TRUE);
MoveWindow(windows.opt_port, 15 + lbl_w, y, edit_w, edit_h, TRUE);
y += edit_h + 2;
MoveWindow(windows.opt_cport_lbl, 10, y + edge, lbl_w, text_h, TRUE);
MoveWindow(windows.opt_cport, 15 + lbl_w, y, edit_w, edit_h, TRUE);
MoveWindow(windows.opt_filter, 10, y += edit_h + 2, width - 20, text_h, TRUE);
MoveWindow(windows.opt_bcast, 10, y += text_h + 2, width - 20, text_h, TRUE);
MoveWindow(windows.opt_w95, 10, y += text_h + 2, width - 20, text_h, TRUE);
@ -394,7 +402,7 @@ static void get_nics() {
delete buf;
}
static bool reg_write(const char *name, void *value, size_t size) {
static bool reg_write(const char *name, void *value, size_t size, DWORD type) {
if(!regkey) {
int err = RegCreateKeyEx(
HKEY_CURRENT_USER,
@ -418,7 +426,7 @@ static bool reg_write(const char *name, void *value, size_t size) {
}
}
int err = RegSetValueEx(regkey, name, 0, REG_BINARY, (BYTE*)value, size);
int err = RegSetValueEx(regkey, name, 0, type, (BYTE*)value, size);
if(err != ERROR_SUCCESS) {
std::string msg = "Error writing value to registry: " + w32_errmsg(err);
MessageBox(NULL, msg.c_str(), "Error", MB_OK | MB_TASKMODAL | MB_ICONERROR);
@ -455,8 +463,8 @@ static bool save_config() {
}
char port_s[32], *endptr;
GetWindowText(windows.opt_port, port_s, 32);
GetWindowText(windows.opt_port, port_s, 32);
int port = strtol(port_s, &endptr, 10);
if(port < 1 || port > 65535 || *endptr) {
@ -468,6 +476,18 @@ static bool save_config() {
return false;
}
GetWindowText(windows.opt_cport, port_s, 32);
int control_port = strtol(port_s, &endptr, 10);
if(port < 1 || port > 65535 || *endptr) {
MessageBox(windows.main, "Invalid port number.\nPort number must be an integer in the range 1 - 65535", "Error", MB_OK);
SetFocus(windows.opt_cport);
Edit_SetSel(windows.opt_cport, 0, Edit_GetTextLength(windows.opt_cport));
return false;
}
global_conf.udp_port = port;
global_conf.w95_bug = Button_GetCheck(windows.opt_w95) == BST_CHECKED;
global_conf.bcast_all = Button_GetCheck(windows.opt_bcast) == BST_CHECKED;
@ -491,6 +511,10 @@ static bool save_config() {
return false;
}
if(!reg_write("control_port", &control_port, sizeof(control_port), REG_DWORD)) {
return false;
}
return true;
}
@ -657,11 +681,22 @@ static void init_windows() {
windows.opt_port_lbl = create_child(windows.opt_group, 0, 0, 0, 0, "STATIC", "UDP port number", SS_RIGHT);
windows.opt_port = create_child(windows.opt_group, 0, 0, 0, 0, "EDIT", "", WS_TABSTOP, WS_EX_CLIENTEDGE, ID_OPT_PORT);
char port_s[8];
sprintf(port_s, "%hu", global_conf.udp_port);
windows.opt_cport_lbl = create_child(windows.opt_group, 0, 0, 0, 0, "STATIC", "Control port number", SS_RIGHT);
windows.opt_cport = create_child(windows.opt_group, 0, 0, 0, 0, "EDIT", "", WS_TABSTOP, WS_EX_CLIENTEDGE, ID_OPT_CPORT);
char port_s[8];
sprintf(port_s, "%hu", global_conf.udp_port);
SetWindowText(windows.opt_port, port_s);
DWORD port_buf;
if(reg_read("control_port", &port_buf, sizeof(DWORD)) != sizeof(DWORD) || port_buf > 65535) {
port_buf = DEFAULT_CONTROL_PORT;
}
sprintf(port_s, "%hu", (uint16_t)port_buf);
SetWindowText(windows.opt_cport, port_s);
windows.opt_w95 = create_child(windows.opt_group, 0, 0, 0, 0, "BUTTON", "Enable Windows 95 SO_BROADCAST bug", BS_AUTOCHECKBOX | WS_TABSTOP, 0, ID_OPT_W95);
windows.opt_bcast = create_child(windows.opt_group, 0, 0, 0, 0, "BUTTON", "Send broadcast packets to all subnets", BS_AUTOCHECKBOX | WS_TABSTOP, 0, ID_OPT_BCAST);
windows.opt_filter = create_child(windows.opt_group, 0, 0, 0, 0, "BUTTON", "Filter receieved packets by subnet", BS_AUTOCHECKBOX | WS_TABSTOP, 0, ID_OPT_FILTER);

View File

@ -113,9 +113,8 @@ struct router_vars *router_init(BOOL global) {
return NULL;
}
/* TODO: Use different port number for control socket? */
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
addr.sin_port = htons(reg_get_dword("control_port", DEFAULT_CONTROL_PORT));
if(bind(router->listener, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
log_printf("Failed to bind TCP socket: %s", w32_error(WSAGetLastError()));