Files
recnet-plugin/src/core/config.c
T
2026-08-05 12:48:09 -04:00

447 lines
6.8 KiB
C

#include "common.h"
#include "config.h"
#include "logger.h"
char redirect_ip[16] = DEFAULT_IP;
int redirect_port = DEFAULT_PORT;
char *redirect_domains[MAX_REDIRECTS];
int redirect_count_config = 0;
char *rewrite_from[MAX_REWRITES];
char *rewrite_to[MAX_REWRITES];
int rewrite_count = 0;
void LoadConfig()
{
HANDLE hFile =
CreateFileA(
CONFIG_FILE,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if(hFile == INVALID_HANDLE_VALUE)
{
Log(
"[CONFIG] No config found, using defaults %s:%d",
redirect_ip,
redirect_port
);
return;
}
DWORD size =
GetFileSize(
hFile,
NULL
);
if(size == INVALID_FILE_SIZE)
{
CloseHandle(hFile);
Log(
"[CONFIG] Failed reading file size"
);
return;
}
char *buffer =
calloc(
1,
size + 1
);
if(!buffer)
{
CloseHandle(hFile);
Log(
"[CONFIG] Memory allocation failed"
);
return;
}
DWORD read = 0;
ReadFile(
hFile,
buffer,
size,
&read,
NULL
);
CloseHandle(hFile);
//
// IP
//
char *ip =
strstr(
buffer,
"\"ip\""
);
if(ip)
{
char *colon =
strchr(
ip,
':'
);
if(colon)
{
char *start =
strchr(
colon,
'"'
);
if(start)
{
start++;
char *end =
strchr(
start,
'"'
);
if(end)
{
size_t len =
end - start;
if(len < sizeof(redirect_ip))
{
memcpy(
redirect_ip,
start,
len
);
redirect_ip[len] = 0;
}
}
}
}
}
//
// Port
//
char *port =
strstr(
buffer,
"\"port\""
);
if(port)
{
char *colon =
strchr(
port,
':'
);
if(colon)
{
int p =
atoi(
colon + 1
);
if(
p > 0 &&
p < 65536
)
{
redirect_port = p;
}
}
}
//
// Redirect domains
//
char *redirect =
strstr(
buffer,
"\"redirect\""
);
if(redirect)
{
char *array =
strchr(
redirect,
'['
);
if(array)
{
char *current =
array;
while(
redirect_count_config < MAX_REDIRECTS
)
{
char *q1 =
strchr(
current,
'"'
);
if(!q1)
break;
q1++;
char *q2 =
strchr(
q1,
'"'
);
if(!q2)
break;
size_t len =
q2 - q1;
redirect_domains[
redirect_count_config
] =
calloc(
1,
len + 1
);
if(
redirect_domains[
redirect_count_config
]
)
{
memcpy(
redirect_domains[
redirect_count_config
],
q1,
len
);
redirect_count_config++;
}
current =
q2 + 1;
}
}
}
//
// Host rewrite pairs: "rewrite": [ { "from": "rec.net", "to": "recflare.net" }, ... ]
// Scanned sequentially -- within each object "from" precedes "to".
//
char *rw =
strstr(
buffer,
"\"rewrite\""
);
if(rw)
{
char *current = rw;
while(rewrite_count < MAX_REWRITES)
{
//
// "from" value
//
char *fk =
strstr(current, "\"from\"");
if(!fk)
break;
char *fv1 = strchr(fk + 6, '"');
if(!fv1) break;
fv1++;
char *fv2 = strchr(fv1, '"');
if(!fv2) break;
//
// "to" value (must follow this object's "from")
//
char *tk =
strstr(fv2, "\"to\"");
if(!tk)
break;
char *tv1 = strchr(tk + 4, '"');
if(!tv1) break;
tv1++;
char *tv2 = strchr(tv1, '"');
if(!tv2) break;
size_t flen = fv2 - fv1;
size_t tlen = tv2 - tv1;
char *fbuf = calloc(1, flen + 1);
char *tbuf = calloc(1, tlen + 1);
if(fbuf && tbuf)
{
memcpy(fbuf, fv1, flen);
memcpy(tbuf, tv1, tlen);
rewrite_from[rewrite_count] = fbuf;
rewrite_to[rewrite_count] = tbuf;
rewrite_count++;
}
else
{
free(fbuf);
free(tbuf);
}
current = tv2 + 1;
}
}
free(buffer);
Log(
"[CONFIG] Loaded %d redirects",
redirect_count_config
);
Log(
"[CONFIG] Loaded %d host rewrites",
rewrite_count
);
for(
int i = 0;
i < rewrite_count;
i++
)
{
Log(
"[CONFIG] rewrite %s -> %s",
rewrite_from[i],
rewrite_to[i]
);
}
Log(
"[CONFIG] Redirect IP %s:%d",
redirect_ip,
redirect_port
);
for(
int i = 0;
i < redirect_count_config;
i++
)
{
Log(
"[CONFIG] %s",
redirect_domains[i]
);
}
}