38 Commits

Author SHA1 Message Date
KerwinKoo
c31106689a remove curl utils funcs
because of do not get ftp data port by http, remove dependence of Libcurl
2017-08-21 10:01:33 +08:00
KerwinKoo
ce522f5675 using ftp_cfg_proxy_name field name instead of ftp_ctl_proxy_name 2017-08-18 14:53:36 +08:00
KerwinKoo
6bd859747a complate ftp remote data port auto match func 2017-08-17 16:41:37 +08:00
KerwinKoo
7d5f53aebb fix BUG: unconnectted when server_addr is IP address 2017-08-17 15:49:26 +08:00
KerwinKoo
f28efdf2b1 add remote_data_port check from responsed message 2017-08-17 15:25:08 +08:00
KerwinKoo
a9a75c6554 fix npr_proxy_remote_port unmarshal bug 2017-08-17 14:37:51 +08:00
KerwinKoo
26f49d26db add new_proxy_response msg unmarshel 2017-08-17 12:06:21 +08:00
KerwinKoo
508ddd60e0 do not use HTTP mothod to init ftp remote data port 2017-08-17 12:05:46 +08:00
KerwinKoo
08b908273a remove unused semicolon 2017-08-17 11:14:37 +08:00
KerwinKoo
8402967a0e save client 2017-08-09 14:56:48 +08:00
KerwinKoo
a2e4264b01 devtmp 2017-08-09 14:42:43 +08:00
KerwinKoo
ce057a05a7 add url commit 2017-08-08 18:23:18 +08:00
KerwinKoo
7515c15123 add url func into utils 2017-08-08 18:19:40 +08:00
KerwinKoo
60871860ae don't check the remote_data_port
because of xfrps will distribute a ftp_data port for each client, no need direct it activity.
2017-08-08 16:51:56 +08:00
KerwinKoo
f8d065b09e add domain check for server_addr field 2017-07-25 17:54:38 +08:00
KerwinKoo
2f2e64ae31 modify domain check code 2017-07-25 17:44:31 +08:00
KerwinKoo
a4812dd596 trans custom_domains to lower 2017-07-25 17:30:42 +08:00
KerwinKoo
2e420e921c fix dns error bug 2017-07-25 16:25:46 +08:00
KerwinKoo
99972f257a delete DNS of server addr 2017-07-25 13:57:07 +08:00
KerwinKoo
8e4ca75d36 Merge pull request #8 from KunTengRom/libdns
debug
2017-07-25 13:42:21 +08:00
KerwinKoo
360019d1a4 debug 2017-07-25 13:41:13 +08:00
KerwinKoo
204c086a03 fix remote_port is -1 will not be set
Signed-off-by: KerwinKoo <gukaiqiang@gmail.com>
2017-07-25 11:25:26 +08:00
KerwinKoo
316834ffd0 don't show port 2017-07-21 16:14:43 +08:00
KerwinKoo
aefbd2e062 add -r to show run id and port 2017-07-21 14:41:45 +08:00
KerwinKoo
ff6f60f079 add Openwrt Router check 2017-07-19 18:24:47 +08:00
KerwinKoo
b2a34fa18f adjust version info 2017-07-19 17:23:29 +08:00
KerwinKoo
984192c200 using right DNS server IP 2017-07-19 16:26:28 +08:00
KerwinKoo
5747426565 adjust code of control 2017-07-19 13:34:25 +08:00
KerwinKoo
0f78a61082 add dns servers static 2017-07-18 17:18:36 +08:00
KerwinKoo
fa852f0b7d fix domain name analyse error 2017-07-18 17:01:23 +08:00
KerwinKoo
ff9ecd1b48 add some debug 2017-07-18 16:22:22 +08:00
KerwinKoo
620c05b6bc add get net mac declear 2017-07-18 16:03:42 +08:00
KerwinKoo
5fffc80367 add commit 2017-07-18 15:36:34 +08:00
KerwinKoo
52ce3d69b4 remove unused file and added into gitignore
remove file:
install_manifest.txt
2017-07-18 15:35:46 +08:00
KerwinKoo
259592e35c change run_id from passive to proactive mode. 2017-07-18 15:32:39 +08:00
KerwinKoo
8866fc3a3a only using 114 dns server ip 2017-07-18 14:53:51 +08:00
KerwinKoo
3dca97a235 get the right ifname 2017-07-18 14:26:55 +08:00
KerwinKoo
9511680227 add get_net_ifname func in utils 2017-07-18 14:16:59 +08:00
14 changed files with 466 additions and 68 deletions

1
.gitignore vendored
View File

@@ -37,6 +37,7 @@ CMakeFiles/
CMakeCache.txt
Makefile
cmake_install.cmake
install_manifest.txt
# bin generated
xfrpc

View File

@@ -54,14 +54,14 @@
#include "zip.h"
#include "common.h"
#include "proxy.h"
#include "utils.h"
#define MAX_OUTPUT (512*1024)
static void drained_writecb(struct bufferevent *bev, void *ctx);
static void xfrp_event_cb(struct bufferevent *bev, short what, void *ctx);
static void
xfrp_read_cb(struct bufferevent *bev, void *ctx)
static void xfrp_read_cb(struct bufferevent *bev, void *ctx)
{
struct proxy *p = (struct proxy *)ctx;
struct bufferevent *partner = p?p->bev:NULL;
@@ -89,8 +89,7 @@ xfrp_read_cb(struct bufferevent *bev, void *ctx)
}
}
static void
drained_writecb(struct bufferevent *bev, void *ctx)
static void drained_writecb(struct bufferevent *bev, void *ctx)
{
struct proxy *p = (struct proxy *)ctx;
struct bufferevent *partner = p?p->bev:NULL;
@@ -103,8 +102,7 @@ drained_writecb(struct bufferevent *bev, void *ctx)
bufferevent_enable(partner, EV_READ);
}
static void
close_on_finished_writecb(struct bufferevent *bev, void *ctx)
static void close_on_finished_writecb(struct bufferevent *bev, void *ctx)
{
struct evbuffer *b = bufferevent_get_output(bev);
@@ -113,8 +111,7 @@ close_on_finished_writecb(struct bufferevent *bev, void *ctx)
}
}
static void
xfrp_event_cb(struct bufferevent *bev, short what, void *ctx)
static void xfrp_event_cb(struct bufferevent *bev, short what, void *ctx)
{
struct proxy *p = (struct proxy *)ctx;
struct bufferevent *partner = p?p->bev:NULL;
@@ -145,6 +142,38 @@ xfrp_event_cb(struct bufferevent *bev, short what, void *ctx)
}
}
// return: 0: init succeed; 1: init failed
// static int init_ftp_data_port(struct proxy_service *ps)
// {
// struct mycurl_string ret_buf;
// if ( ! mycurl_string_init(&ret_buf)) {
// debug(LOG_ERR, "error: ftp data port buffer init failed!");
// return 1;
// }
// char url[1024] = {0};
// struct common_conf *c_conf = get_common_config();
// int state_code = 0;
// double down_size = 0;
// int ret = net_visit(url,
// &ret_buf,
// HTTP_GET,
// NULL,
// 60l,
// &state_code,
// &down_size);
// if (ret) {
// debug(LOG_ERR, "error: ftp remote data port init failed by HTTP GET");
// mycurl_string_free(&ret_buf);
// return 1;
// }
// return 0;
// }
int is_ftp_proxy(const struct proxy_service *ps)
{
if (! ps || ! ps->proxy_type)

View File

@@ -63,6 +63,7 @@ struct proxy_client {
struct proxy_service {
char *proxy_name;
char *proxy_type;
char *ftp_cfg_proxy_name;
int use_encryption;
int use_compression;

View File

@@ -39,6 +39,7 @@
#include "commandline.h"
#include "debug.h"
#include "version.h"
#include "utils.h"
typedef void signal_func (int);
@@ -122,6 +123,7 @@ usage(const char *appname)
fprintf(stdout, " -d <level> Debug level\n");
fprintf(stdout, " -h Print usage\n");
fprintf(stdout, " -v Print version information\n");
fprintf(stdout, " -r Print run id of client\n");
fprintf(stdout, "\n");
}
@@ -134,7 +136,7 @@ parse_commandline(int argc, char **argv)
int c;
int flag = 0;
while (-1 != (c = getopt(argc, argv, "c:hfd:sw:vx:i:a:"))) {
while (-1 != (c = getopt(argc, argv, "c:hfd:sw:vrx:i:a:"))) {
switch (c) {
@@ -165,10 +167,28 @@ parse_commandline(int argc, char **argv)
break;
case 'v':
fprintf(stdout, "This is %s version " VERSION "\n", argv[0]);
fprintf(stdout, "version: " VERSION "\n");
exit(1);
break;
case 'r':
{
char ifname[16] = {0};
if(get_net_ifname(ifname, 16)){
debug(LOG_ERR, "error: get device sign ifname failed!");
exit(0);
}
char if_mac[64] = {0};
if(get_net_mac(ifname, if_mac, sizeof(if_mac))) {
debug(LOG_ERR, "error: Hard ware MAC address of [%s] get failed!", ifname);
exit(0);
}
fprintf(stdout, "run ID:%s\n", if_mac);
exit(1);
break;
}
default:
usage(argv[0]);
exit(1);

View File

@@ -71,6 +71,8 @@ void set_common_server_ip(const char *ip)
struct common_conf *c_conf = get_common_config();
c_conf->server_ip = strdup(ip);
assert(c_conf->server_ip);
debug(LOG_DEBUG, "server IP address: [%s]", c_conf->server_ip);
}
void free_base_config(struct base_conf *bconf)
@@ -143,13 +145,6 @@ static void dump_proxy_service(const int index, struct proxy_service *ps)
ps->proxy_type = strdup("tcp");
assert(ps->proxy_type);
} else if (strcmp(ps->proxy_type, "ftp") == 0) {
if (ps->remote_data_port <= 0) {
debug(LOG_ERR,
"Proxy [%s] error: remote_data_port must be exist when type is ftp",
ps->proxy_name);
exit(0);
}
new_ftp_data_proxy_service(ps);
}
@@ -181,6 +176,7 @@ static struct proxy_service *new_proxy_service(const char *name)
assert(c_conf);
ps->proxy_name = strdup(name);
ps->ftp_cfg_proxy_name = NULL;
assert(ps->proxy_name);
ps->proxy_type = NULL;
@@ -215,6 +211,9 @@ static void new_ftp_data_proxy_service(struct proxy_service *ftp_ps)
"cannot create ftp data proxy service, it should not happenned!");
exit(0);
}
ps->ftp_cfg_proxy_name = strdup(ftp_ps->proxy_name);
assert(ps->ftp_cfg_proxy_name);
ps->proxy_type = strdup("tcp");
ps->remote_port = ftp_ps->remote_data_port;
@@ -309,8 +308,15 @@ static int common_handler(void *user, const char *section, const char *name, con
#define MATCH(s, n) strcmp(section, s) == 0 && strcmp(name, n) == 0
if (MATCH("common", "server_addr")) {
SAFE_FREE(config->server_addr);
config->server_addr = strdup(value);
int addr_len = strlen(value) + 1;
config->server_addr = (char *)calloc(1, addr_len);
assert(config->server_addr);
if(dns_unified(value, config->server_addr, addr_len)) {
debug(LOG_ERR, "error: server_addr [%s] is invalid!", value);
exit(0);
}
if (is_valid_ip_address(value))
set_common_server_ip(value);
} else if (MATCH("common", "server_port")) {
config->server_port = atoi(value);
} else if (MATCH("common", "http_proxy")) {
@@ -373,13 +379,14 @@ static void init_common_conf(struct common_conf *config)
config->tcp_mux = 0;
config->user = NULL;
config->server_ip = NULL;
config->is_router = 0;
}
// it should be free after using
// because of assert it will never return NULL
char *get_ftp_data_proxy_name(const char *ftp_proxy_name)
{
char *ftp_tail_data_name = FTP_DATA_PROXY_SUFFIX;
char *ftp_tail_data_name = FTP_RMT_CTL_PROXY_SUFFIX;
char *ftp_data_proxy_name = (char *)calloc(1,
strlen(ftp_proxy_name)+strlen(ftp_tail_data_name)+1);
assert(ftp_data_proxy_name);
@@ -423,3 +430,8 @@ void load_config(const char *confile)
dump_all_ps();
}
int is_running_in_router()
{
return c_conf->is_router;
}

View File

@@ -29,7 +29,7 @@
#include "client.h"
#include "common.h"
#define FTP_DATA_PROXY_SUFFIX "_ftp_data_proxy"
#define FTP_RMT_CTL_PROXY_SUFFIX "_ftp_remote_ctl_proxy"
struct base_conf{
char *name;
@@ -45,20 +45,23 @@ struct base_conf{
// common config
struct common_conf {
char *server_addr; /* default 0.0.0.0 */
char *server_addr; /* default 0.0.0.0 */
char *server_ip;
int server_port; /* default 7000 */
int server_port; /* default 7000 */
char *http_proxy;
char *log_file; /* default consol */
char *log_way; /* default console */
char *log_level; /* default info */
char *log_file; /* default consol */
char *log_way; /* default console */
char *log_level; /* default info */
int log_max_days; /* default 3 */
char *privilege_token;
char *auth_token;
int heartbeat_interval; /* default 10 */
int heartbeat_timeout; /* default 30 */
int tcp_mux; /* default 0 */
int tcp_mux; /* default 0 */
char *user;
/* private fields */
int is_router; // to sign router (Openwrt/LEDE) or not
};
struct common_conf *get_common_config();
@@ -73,5 +76,6 @@ struct proxy_client *get_all_pc();
void load_config(const char *confile);
char *get_ftp_data_proxy_name(const char *ftp_proxy_name);
void set_common_server_ip(const char *ip);
int is_running_in_router();
#endif //_CONFIG_H_

134
control.c
View File

@@ -122,7 +122,7 @@ static void new_client_connect()
struct proxy_client *client = new_proxy_client();
struct common_conf *c_conf = get_common_config();
assert(c_conf);
client->base = main_ctl->connect_base;;
client->base = main_ctl->connect_base;
struct bufferevent *bev = connect_server(client->base, c_conf->server_addr, c_conf->server_port);
if (!bev) {
debug(LOG_DEBUG, "Connect server [%s:%d] failed", c_conf->server_addr, c_conf->server_port);
@@ -317,11 +317,12 @@ static void sync_new_work_connection(struct bufferevent *bev)
SAFE_FREE(work_c);
}
struct bufferevent *connect_server(struct event_base *base, const char *name, const int port)
struct bufferevent *
connect_server(struct event_base *base, const char *name, const int port)
{
struct bufferevent *bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE);
assert(bev);
if (bufferevent_socket_connect_hostname(bev,
main_ctl->dnsbase,
AF_INET,
@@ -353,6 +354,50 @@ static void hb_sender_cb(evutil_socket_t fd, short event, void *arg)
set_ticker_ping_timer(main_ctl->ticker_ping);
}
// return: 0: raw succeed 1: raw failed
static int proxy_service_resp_raw(struct new_proxy_response *npr)
{
if (npr->error && strlen(npr->error) > 2) {
debug(LOG_ERR, "error: new proxy response error_field:%s", npr->error);
return 1;
}
if ((! npr->proxy_name) || (strlen(npr->proxy_name) <= 0)) {
debug(LOG_ERR, "error: new proxy response proxy name unmarshal failed!");
return 1;
}
struct proxy_service *ps = NULL;
ps = get_proxy_service(npr->proxy_name);
if (! ps) {
debug(LOG_ERR, "error: proxy_name responsed by TypeNewProxyResp not found!");
return 1;
}
if (! ps->proxy_type) {
debug(LOG_ERR, "error: proxy_type is NULL, it should be never happend!");
return 1;
}
if (ps->ftp_cfg_proxy_name) {
struct proxy_service *main_ps = get_proxy_service(ps->ftp_cfg_proxy_name);
if (main_ps) {
debug(LOG_DEBUG, "find main ftp proxy service name [%s]", main_ps->proxy_name);
} else {
debug(LOG_ERR, "error: cannot find main ftp proxy service!");
return 1;
}
if (npr->remote_port <= 0) {
debug(LOG_ERR, "error: ftp remote_data_port [%d] that request from server is invalid!", npr->remote_port);
return 1;
}
main_ps->remote_data_port = npr->remote_port;
}
return 0;
}
static void
raw_message(struct message *msg, struct bufferevent *bev, struct proxy_client *client)
{
@@ -405,7 +450,24 @@ raw_message(struct message *msg, struct bufferevent *bev, struct proxy_client *c
break;
case TypeNewProxyResp:
break;
{
if (msg->data_p == NULL) {
debug(LOG_ERR,
"recved TypeNewProxyResp but no data, it should be never happend!");
break;
}
struct new_proxy_response *npr = new_proxy_resp_unmarshal(msg->data_p);
if (npr == NULL) {
debug(LOG_ERR, "new proxy response buffer unmarshal faild!");
return;
}
proxy_service_resp_raw(npr);
SAFE_FREE(npr);
break;
}
case TypeStartWorkConn:
sr = start_work_conn_resp_unmarshal(msg->data_p);
@@ -800,7 +862,7 @@ static void keep_control_alive()
static void server_dns_cb(int event_code, struct evutil_addrinfo *addr, void *ctx)
{
if (event_code) {
set_common_server_ip(evutil_gai_strerror(event_code));
set_common_server_ip((const char *)evutil_gai_strerror(event_code));
} else {
struct evutil_addrinfo *ai;
if (addr->ai_canonname)
@@ -815,10 +877,10 @@ static void server_dns_cb(int event_code, struct evutil_addrinfo *addr, void *ct
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)ai->ai_addr;
s = evutil_inet_ntop(AF_INET6, &sin6->sin6_addr, buf, 128);
}
if (s)
set_common_server_ip(s);
if (s) set_common_server_ip(s);
}
evutil_freeaddrinfo(addr);
if (addr) evutil_freeaddrinfo(addr);
}
}
@@ -1011,33 +1073,7 @@ void init_main_control()
main_ctl = calloc(sizeof(struct control), 1);
assert(main_ctl);
struct event_base *base = NULL;
struct evdns_base *dnsbase = NULL;
base = event_base_new();
if (! base) {
debug(LOG_ERR, "error: event base init failed!");
exit(0);
}
dnsbase = evdns_base_new(base, 1);
if (! dnsbase) {
debug(LOG_ERR, "error: evdns base init failed!");
exit(0);
}
evdns_base_set_option(dnsbase, "timeout", "1.0");
// thanks to the following article
// http://www.wuqiong.info/archives/13/
evdns_base_set_option(dnsbase, "randomize-case:", "0"); //TurnOff DNS-0x20 encoding
evdns_base_nameserver_ip_add(dnsbase, "180.76.76.76"); //BaiduDNS
evdns_base_nameserver_ip_add(dnsbase, "223.5.5.5"); //AliDNS
evdns_base_nameserver_ip_add(dnsbase, "223.6.6.6"); //AliDNS
evdns_base_nameserver_ip_add(dnsbase, "114.114.114.114"); //114DNS
main_ctl->connect_base = base;
main_ctl->dnsbase = dnsbase;
struct common_conf *c_conf = get_common_config();
if (c_conf->tcp_mux) {
uint32_t *sid = init_sid_index();
@@ -1047,11 +1083,39 @@ void init_main_control()
debug(LOG_DEBUG, "Connect Frps with control session ID: %d", main_ctl->session_id);
}
struct event_base *base = NULL;
struct evdns_base *dnsbase = NULL;
base = event_base_new();
if (! base) {
debug(LOG_ERR, "error: event base init failed!");
exit(0);
}
main_ctl->connect_base = base;
dnsbase = evdns_base_new(base, 1);
if (! dnsbase) {
debug(LOG_ERR, "error: evdns base init failed!");
exit(0);
}
main_ctl->dnsbase = dnsbase;
evdns_base_set_option(dnsbase, "timeout", "1.0");
// thanks to the following article
// http://www.wuqiong.info/archives/13/
evdns_base_set_option(dnsbase, "randomize-case:", "0"); //TurnOff DNS-0x20 encoding
evdns_base_nameserver_ip_add(dnsbase, "180.76.76.76"); //BaiduDNS
evdns_base_nameserver_ip_add(dnsbase, "223.5.5.5"); //AliDNS
evdns_base_nameserver_ip_add(dnsbase, "223.6.6.6"); //AliDNS
evdns_base_nameserver_ip_add(dnsbase, "114.114.114.114"); //114DNS
// if server_addr is ip, done control init.
if (is_valid_ip_address((const char *)c_conf->server_addr))
return;
// if server_addr is domain, analyze it to ip for server_ip
debug(LOG_DEBUG, "Get ip address of [%s] from DNServer", c_conf->server_addr);
struct evutil_addrinfo hints;
struct evdns_getaddrinfo_request *dns_req;
memset(&hints, 0, sizeof(hints));
@@ -1067,7 +1131,7 @@ void init_main_control()
server_dns_cb,
NULL);
if (! dns_req) {
debug(LOG_ERR, "error: can not analyse the dns of %s", c_conf->server_addr);
debug(LOG_ERR, "error: can not analyse the dns of [%s]", c_conf->server_addr);
exit(0);
}
}

View File

@@ -1,2 +0,0 @@
/usr/bin/xfrpc
/usr/bin/xfrp_test_server

26
login.c
View File

@@ -15,6 +15,7 @@
#include "msg.h"
#include "version.h"
#include "login.h"
#include "utils.h"
static struct login *c_login;
@@ -37,12 +38,12 @@ void init_login()
{
if (! c_login)
c_login = calloc(sizeof(struct login), 1);
assert(c_login);
struct common_conf *c_conf = get_common_config();
assert(c_conf);
struct utsname uname_buf;
if (uname(&uname_buf)) {
return;
@@ -64,6 +65,27 @@ void init_login()
c_login->user = c_conf->user;
c_login->logged = 0;
/* start to init login->run_id */
char ifname[16] = {0};
if(get_net_ifname(ifname, 16)){
debug(LOG_ERR, "error: get device sign ifname failed!");
exit(0);
}
if (strcmp(ifname, "br-lan") == 0) {
c_conf->is_router = 1;
debug(LOG_DEBUG, "working in router");
}
char if_mac[64] = {0};
if(get_net_mac(ifname, if_mac, sizeof(if_mac))) {
debug(LOG_ERR, "error: Hard ware MAC address of [%s] get failed!", ifname);
exit(0);
}
c_login->run_id = strdup(if_mac);
assert(c_login->run_id);
}
int login_resp_check(struct login_resp *lr)

55
msg.c
View File

@@ -42,6 +42,7 @@
#include "common.h"
#include "login.h"
#include "client.h"
#include "utils.h"
#define JSON_MARSHAL_TYPE(jobj,key,jtype,item) \
json_object_object_add(jobj, key, json_object_new_##jtype((item)));
@@ -80,7 +81,14 @@ static void fill_custom_domains(struct json_object *j_ctl_req, const char *custo
char *tok = tmp, *end = tmp;
while (tok != NULL) {
strsep(&end, ",");
json_object_array_add(jarray_cdomains, json_object_new_string(tok));
int dname_len = strlen(tok) + 1;
char *dname_buf = (char *)calloc(1, dname_len);
assert(dname_buf);
dns_unified(tok, dname_buf, dname_len);
json_object_array_add(jarray_cdomains, json_object_new_string(dname_buf));
free(dname_buf);
tok = end;
}
SAFE_FREE(tmp);
@@ -172,7 +180,6 @@ int new_proxy_service_marshal(const struct proxy_service *np_req, char **msg)
JSON_MARSHAL_TYPE(j_np_req, "proxy_type", string, np_req->proxy_type);
JSON_MARSHAL_TYPE(j_np_req, "use_encryption", boolean, np_req->use_encryption);
JSON_MARSHAL_TYPE(j_np_req, "use_compression", boolean, np_req->use_compression);
JSON_MARSHAL_TYPE(j_np_req, "remote_port", int, np_req->remote_port);
if (is_ftp_proxy(np_req)) {
JSON_MARSHAL_TYPE(j_np_req, "remote_data_port", int, np_req->remote_data_port);
@@ -180,8 +187,14 @@ int new_proxy_service_marshal(const struct proxy_service *np_req, char **msg)
if (np_req->custom_domains) {
fill_custom_domains(j_np_req, np_req->custom_domains);
json_object_object_add(j_np_req, "remote_port", NULL);
} else {
json_object_object_add(j_np_req, "custom_domains", NULL);
if (np_req->remote_port != -1) {
JSON_MARSHAL_TYPE(j_np_req, "remote_port", int, np_req->remote_port);
} else {
json_object_object_add(j_np_req, "remote_port", NULL);
}
}
JSON_MARSHAL_TYPE(j_np_req, "subdomain", string, SAFE_JSON_STRING(np_req->subdomain));
@@ -229,6 +242,44 @@ int new_work_conn_marshal(const struct work_conn *work_c, char **msg)
return nret;
}
// result returned of this func need be free
struct new_proxy_response *new_proxy_resp_unmarshal(const char *jres)
{
struct json_object *j_np_res = json_tokener_parse(jres);
if (is_error(j_np_res))
return NULL;
struct new_proxy_response *npr = calloc(1, sizeof(struct new_proxy_response));
assert(npr);
struct json_object *npr_run_id = NULL;
if (! json_object_object_get_ex(j_np_res, "run_id", &npr_run_id))
goto END_ERROR;
npr->run_id = strdup(json_object_get_string(npr_run_id));
assert(npr->run_id);
struct json_object *npr_proxy_remote_port = NULL;
if (! json_object_object_get_ex(j_np_res, "remote_port", &npr_proxy_remote_port))
goto END_ERROR;
npr->remote_port = json_object_get_int(npr_proxy_remote_port);
struct json_object *npr_proxy_name = NULL;
if (! json_object_object_get_ex(j_np_res, "proxy_name", &npr_proxy_name))
goto END_ERROR;
npr->proxy_name = strdup(json_object_get_string(npr_proxy_name));
assert(npr->proxy_name);
struct json_object *npr_error = NULL;
if(! json_object_object_get_ex(j_np_res, "error", &npr_error))
goto END_ERROR;
npr->error = strdup(json_object_get_string(npr_error));
assert(npr->error);
END_ERROR:
json_object_put(j_np_res);
return npr;
}
// login_resp_unmarshal NEED FREE
struct login_resp *login_resp_unmarshal(const char *jres)
{

8
msg.h
View File

@@ -67,6 +67,13 @@ struct control_response {
char *msg;
};
struct new_proxy_response {
char *run_id;
char *proxy_name;
char *error;
int remote_port;
};
struct work_conn {
char *run_id;
};
@@ -91,6 +98,7 @@ size_t pack(struct message *req_msg, unsigned char **ret_buf);
struct message *unpack(unsigned char *recv_msg, const ushort len);
// tranlate control request to json string
struct new_proxy_response *new_proxy_resp_unmarshal(const char *jres);
struct login_resp *login_resp_unmarshal(const char *jres);
struct start_work_conn_resp *start_work_conn_resp_unmarshal(const char *resp_msg);

179
utils.c
View File

@@ -7,6 +7,15 @@
#include <sys/time.h>
#include <sys/stat.h>
#include <errno.h>
#include <ctype.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <linux/if_link.h>
#include "utils.h"
@@ -28,4 +37,174 @@ int is_valid_ip_address(const char *ip_address)
struct sockaddr_in sa;
int result = inet_pton(AF_INET, ip_address, &(sa.sin_addr));
return result;
}
// net_if_name: name of network interface, e.g. br-lan
// return: 1: error 0:get succeed
int get_net_mac(char *net_if_name, char *mac, int mac_len) {
int ret = 1;
int i = 0;
int sock = 0;
if (mac_len < 12 || net_if_name == NULL) {
return 1;
}
struct ifreq ifreq;
sock = socket(AF_INET, SOCK_STREAM, 0);
if( sock < 0 ) {
perror("error sock");
goto OUT;
}
strncpy(ifreq.ifr_name, net_if_name, IFNAMSIZ);
if( ioctl(sock, SIOCGIFHWADDR,&ifreq) < 0 ) {
perror("error ioctl");
goto OUT;
}
for( i = 0; i < 6; i++ ){
snprintf(mac+2*i, mac_len - 2*i, "%02X",
(unsigned char)ifreq.ifr_hwaddr.sa_data[i]);
}
mac[strlen(mac)] = 0;
ret = 0;
OUT:
close(sock);
return ret;
}
// return: -1: network interface check failed; other: ifname numbers
int show_net_ifname()
{
struct ifaddrs *ifaddr, *ifa;
int family, s, n;
char host[NI_MAXHOST];
if (getifaddrs(&ifaddr) == -1) {
perror("getifaddrs");
exit(EXIT_FAILURE);
}
/* Walk through linked list, maintaining head pointer so we
can free list later */
for (ifa = ifaddr, n = 0; ifa != NULL; ifa = ifa->ifa_next, n++) {
if (ifa->ifa_addr == NULL) continue;
family = ifa->ifa_addr->sa_family;
/* Display interface name and family (including symbolic
form of the latter for the common families) */
printf("%-8s %s (%d)\n",
ifa->ifa_name,
(family == AF_PACKET) ? "AF_PACKET" :
(family == AF_INET) ? "AF_INET" :
(family == AF_INET6) ? "AF_INET6" : "???",
family);
/* For an AF_INET* interface address, display the address */
if (family == AF_INET || family == AF_INET6) {
s = getnameinfo(ifa->ifa_addr,
(family == AF_INET) ? sizeof(struct sockaddr_in) :
sizeof(struct sockaddr_in6),
host, NI_MAXHOST,
NULL, 0, NI_NUMERICHOST);
if (s != 0) {
printf("getnameinfo() failed: %s\n", gai_strerror(s));
exit(EXIT_FAILURE);
}
printf("\t\taddress: <%s>\n", host);
} else if (family == AF_PACKET && ifa->ifa_data != NULL) {
struct rtnl_link_stats *stats = (struct rtnl_link_stats *)ifa->ifa_data;
printf("\t\ttx_packets = %10u; rx_packets = %10u\n"
"\t\ttx_bytes = %10u; rx_bytes = %10u\n",
stats->tx_packets, stats->rx_packets,
stats->tx_bytes, stats->rx_bytes);
}
}
freeifaddrs(ifaddr);
return 0;
}
// return: 0: network interface get succeed
int get_net_ifname(char *if_buf, int blen)
{
if (NULL == if_buf || blen < 8) return -1;
struct ifaddrs *ifaddr, *ifa;
int family, n;
int ret = 1;
if (getifaddrs(&ifaddr) == -1) {
perror("getifaddrs");
exit(EXIT_FAILURE);
}
int found = 0;
char tmp_if_buf[16];
memset(tmp_if_buf, 0, sizeof(tmp_if_buf));
/* Walk through linked list, maintaining head pointer so we
can free list later */
for (ifa = ifaddr, n = 0; ifa != NULL; ifa = ifa->ifa_next, n++) {
if (ifa->ifa_addr == NULL) continue;
family = ifa->ifa_addr->sa_family;
if (family == AF_INET) {
// for LEDE/OpenWRT embedded router os
if (strcmp(ifa->ifa_name, "br-lan") == 0) {
found = 1;
break;
}
} else if (family == AF_PACKET &&
ifa->ifa_data != NULL &&
strcmp(ifa->ifa_name, "lo") != 0) { // skip local loop interface
strncpy(tmp_if_buf, ifa->ifa_name, 16);
}
}
if (found) {
strncpy(if_buf, ifa->ifa_name, blen);
ret = 0;
} else if (tmp_if_buf[0] != 0) {
strncpy(if_buf, tmp_if_buf, blen);
ret = 0;
}
freeifaddrs(ifaddr);
return ret;
}
// e.g. wWw.Baidu.com/China will be trans into www.baidu.com/China
// return: 0:check and trant succeed, 1:failed or domain name is invalid
int dns_unified(const char *dname, char *udname_buf, int udname_buf_len)
{
if (! dname || ! udname_buf || udname_buf_len < strlen(dname)+1)
return 1;
int has_dot = 0;
int dlen = strlen(dname);
int i = 0;
for(i=0; i<dlen; i++) {
if(dname[i] == '/')
break;
if (dname[i] == '.' && i != dlen-1)
has_dot = 1;
udname_buf[i] = tolower(dname[i]);
}
if (! has_dot) //domain name should have 1 dot leastly
return 1;
return 0;
}

View File

@@ -1,10 +1,19 @@
#ifndef _UTILS_H_
#define _UTILS_H_
struct mycurl_string {
char *ptr;
size_t len;
};
void s_sleep(unsigned int s, unsigned int u);
// is_valid_ip_address:
// return 0:ipaddress unlegal
int is_valid_ip_address(const char *ip_address);
int show_net_ifname();
int get_net_ifname(char *if_buf, int blen);
int get_net_mac(char *net_if_name, char *mac, int mac_len);
int dns_unified(const char *dname, char *udname_buf, int udname_buf_len);
#endif //_UTILS_H_

View File

@@ -1,7 +1,7 @@
#ifndef _VERSION_H_
#define _VERSION_H_
#define VERSION "0.05."
#define VERSION "1.0.1"
#define PROTOCOL_VERESION "0.10.0"
#define CLIENT_V 1