Skip to content
Snippets Groups Projects
libmobile.c 6.46 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jakob Olsson's avatar
    Jakob Olsson committed
    #include "libmobile.h"
    
    struct string {
    	char *ptr;
    	size_t len;
    };
    
    
    int write_to_ubus(struct json_object *parsed_response, struct ubus_context *ctx, struct ubus_request_data *req)
    {
    	struct blob_buf bb;
    
    	memset(&bb, 0, sizeof(struct blob_buf));
    	blob_buf_init(&bb, 0);
    	bb = json_to_blob(parsed_response, bb);
    	ubus_send_reply(ctx, req, bb.head);
    	blob_buf_free(&bb);
    	json_object_put(parsed_response);
    	return 0;
    }
    
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    void curl_cleaner(CURLcode *curl)
    {
    	curl_easy_cleanup(curl);
    	curl_global_cleanup();
    }
    
    size_t write_func(void *buffer, size_t size, size_t nmemb, void *userp)
    {
    	struct string *str = (struct string *)userp;
    	size_t new_len = str->len + (size * nmemb);
    
    	str->ptr = realloc(str->ptr, new_len + 1);
    	if (str->ptr == NULL) {
    		printf("not enough ptr (realloc returned NULL)\n");
    		return 0;
    	}
    	memcpy(str->ptr + str->len, buffer, size * nmemb);
    	str->ptr[new_len] = '\0';
    	str->len = new_len;
    
    	return size * nmemb;
    }
    
    struct json_object *get_apn_profiles_json(void)
    {
    
    	char *values = "APN_config0,APN_config1,APN_config2,APN_config3,APN_config4,APN_config5,APN_config6,APN_config7,APN_config8,APN_config9,APN_config10,APN_config11,APN_config12,APN_config13,APN_config14,APN_config15,APN_config16,APN_config17,APN_config18,APN_config19";
    	const char *response = get_request(values);
    	struct json_object *apn_profiles = json_tokener_parse(response);
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    
    	return apn_profiles;
    }
    
    struct blob_buf json_to_blob(struct json_object *response, struct blob_buf bb)
    {
    	void *arr, *obj;
    	int i;
    
    	json_object_object_foreach(response, key, val) {
    		int val_type = json_object_get_type(val);
    
    		switch (val_type) {
    		case json_type_int:
    			blobmsg_add_u32(&bb, key, json_object_get_int(val));
    			break;
    		case json_type_double:
    			blobmsg_add_double(&bb, key, json_object_get_double(val));
    			break;
    		case json_type_string:
    			blobmsg_add_string(&bb, key, json_object_get_string(val));
    			break;
    		case json_type_array:
    			arr = blobmsg_open_array(&bb, key);
    			for (i = 0; i < json_object_array_length(val); i++)
    				bb = json_to_blob(json_object_array_get_idx(val, i), bb);
    			blobmsg_close_array(&bb, arr);
    			break;
    		case json_type_object:
    			obj = blobmsg_open_table(&bb, key);
    			bb = json_to_blob(val, bb);
    			blobmsg_close_array(&bb, obj);
    			break;
    		}
    	}
    
    	return bb;
    }
    
    int get_apn_profiles_len(void)
    {
    	struct json_object *apn_profiles = get_apn_profiles_json();
    	int len = 0;
    
    	json_object_object_foreach(apn_profiles, key, val) {
    		if (strlen(json_object_get_string(val)) > 0)
    			len++;
    		else
    			return len;
    	}
    
    	json_object_put(apn_profiles);
    	return -1;
    }
    
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    {
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    
    
    	query[0] = '\0';
    	strncpy(query, "isTest=false&apn_action=delete&apn_mode=manual&index=", 1023);
    	sprintf(query + strlen(query), "%d", idx);
    	strncat(query + strlen(query), "&goformId=APN_PROC_EX", 1023);
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    }
    
    int get_apn_profile_idx(struct json_object *apn_profiles, char *name)
    {
    	int idx = 0;
    
    	json_object_object_foreach(apn_profiles, key, val) {
    		char *apn_profile = json_object_get_string(val);
    		char *apn_name = strtok(apn_profile, "($)");
    
    		if (strncmp(apn_name, name, 1024) == 0)
    			return idx;
    		idx++;
    	}
    	return -1;
    }
    
    
    char *_create_apn_profile(char *apn)
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    {
    
    	char query[1024] = {0};
    
    	strncpy(query, "isTest=false&goformId=APN_PROC_EX&apn_action=save&apn_mode=manual&profile_name=", 1023);
    	strncat(query + strlen(query), apn, 1023);
    	strncat(query + strlen(query), "&wan_dial=*99%23&apn_select=manual&pdp_type=IP&pdp_select=auto&pdp_addr=&index=", 1023);
    	sprintf(query + strlen(query), "%d", get_apn_profiles_len());
    	strncat(query + strlen(query), "&wan_apn=", 1023);
    	strncat(query + strlen(query), apn, 1023);
    	strncat(query + strlen(query), "&ppp_auth_mode=none&ppp_username=&ppp_passwd=&dns_mode=auto&prefer_dns_manual=&standby_dns_manual=", 1023);
    	printf("query: %s\n", query);
    
    	return post_request(query);
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    }
    
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    {
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    
    
    	strncpy(query, "isTest=false&goformId=APN_PROC_EX&apn_mode=manual&apn_action=set_default&set_default_flag=1&pdp_type=IP&index=", 1023);
    	sprintf(query + strlen(query), "%d", idx);
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    
    
    char *_enable_pin(char *pin)
    {
    	char query[1024] = {0};
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    
    
    	strncpy(query, "goformId=ENABLE_PIN&OldPinNumber=", 1023);
    	strncat(query + strlen(query), pin, 1023);
    	strncat(query + strlen(query), "&pin_save_flag=0&isTest=false", 1023);
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    }
    
    
    char *_set_pin(char *current_pin, char *new_pin)
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    {
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    
    
    	strncpy(query, "goformId=ENABLE_PIN&OldPinNumber=", 1023);
    	strncat(query + strlen(query), current_pin, 1023);
    	strncat(query + strlen(query), "&NewPinNumber=", 1023);
    	strncat(query + strlen(query), new_pin, 1023);
    	strncat(query + strlen(query), "&pin_save_flag=0&isTest=false", 1023);
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    }
    
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    {
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    
    
    	strncpy(query, "goformId=DISABLE_PIN&OldPinNumber=", 1023);
    	strncat(query + strlen(query), pin, 1023);
    	strncat(query + strlen(query), "&pin_save_flag=0&isTest=false", 1023);
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    }
    
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    {
    	CURL *curl;
    	CURLcode res;
    	struct string str;
    
    	str.ptr = calloc(1, 1);
    	str.len = 0;
    	curl = curl_easy_init();
    
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    	if (curl) {
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    		curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.1/goform/goform_set_cmd_process");
    		curl_easy_setopt(curl, CURLOPT_REFERER, "http://192.168.0.1/index.html");
    
    		curl_easy_setopt(curl, CURLOPT_POSTFIELDS, query);
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    
    		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_func);
    		curl_easy_setopt(curl, CURLOPT_WRITEDATA, &str);
    		res = curl_easy_perform(curl);
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    		if (res) {
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    			printf("errored when performing curl, %s\n", curl_easy_strerror(res));
    			goto fail;
    		}
    	}
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    
    	curl_cleaner(curl);
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    	return str.ptr;
    fail:
    	return NULL;
    }
    
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    {
    	CURL *curl;
    	CURLcode res;
    	struct string str;
    
    	char query[1024] = {0};
    
    	strncpy(query, "http://192.168.0.1/goform/goform_get_cmd_process?isTest=false&cmd=", 1023);
    	strncat(query + strlen(query), vars, 1023);
    	strncat(query + strlen(query), "&multi_data=1", 1023);
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    
    	str.ptr = calloc(1, 1);
    	str.len = 0;
    	curl = curl_easy_init();
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    	if (curl) {
    
    		curl_easy_setopt(curl, CURLOPT_URL, query);
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    		curl_easy_setopt(curl, CURLOPT_REFERER, "http://192.168.0.1/index.html");
    		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_func);
    		curl_easy_setopt(curl, CURLOPT_WRITEDATA, &str);
    		res = curl_easy_perform(curl);
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    		if (res) {
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    			printf("errored when performing curl, %s\n", curl_easy_strerror(res));
    			goto fail;
    		}
    	}
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    
    	curl_cleaner(curl);
    
    Jakob Olsson's avatar
    Jakob Olsson committed
    	return str.ptr;
    fail:
    	return NULL;
    }