char * get_network_setting(const char *config) { char * ret = 0; struct mode_list_elem *data; if(!strcmp(config, NETWORK_IP_KEY)) { ret = get_network_ip(); if(!ret) ret = strdup("192.168.2.15"); } else if(!strcmp(config, NETWORK_INTERFACE_KEY)) { data = get_usb_mode_data(); if(data) { if(data->network_interface) { ret = strdup(data->network_interface); goto end; } } ret = get_network_interface(); if(!ret) ret = strdup("usb0"); } else if(!strcmp(config, NETWORK_GATEWAY_KEY)) return(get_network_gateway()); else /* no matching keys, return error */ return(NULL); end: return(ret); }
/** * Activate the network interface * */ int usb_network_up(struct mode_list_elem *data) { const char *ip, *interface, *gateway; char command[128]; #if CONNMAN DBusConnection *dbus_conn_connman = NULL; DBusMessage *msg = NULL, *reply = NULL; DBusError error; dbus_error_init(&error); if( (dbus_conn_connman = dbus_bus_get(DBUS_BUS_SYSTEM, &error)) == 0 ) { log_err("Could not connect to dbus for connman\n"); } if ((msg = dbus_message_new_method_call("net.connman", "/", "net.connman.Service", connect)) != NULL) { if ((reply = dbus_connection_send_with_reply_and_block(dbus_conn_connman, msg, -1, NULL)) != NULL) { dbus_message_get_args(reply, NULL, DBUS_TYPE_INT32, &ret, DBUS_TYPE_INVALID); dbus_message_unref(reply); } dbus_message_unref(msg); } dbus_connection_unref(dbus_conn_connman); log_debug("connman state = %d\n", ret); return(ret); #else interface = get_interface(data); ip = get_network_ip(); gateway = get_network_gateway(); if(ip == NULL) { sprintf(command,"ifconfig %s 192.168.2.15", interface); system(command); goto clean; } else if(!strcmp(ip, "dhcp")) { sprintf(command, "dhclient -d %s\n", interface); system(command); } else { sprintf(command, "ifconfig %s %s\n", interface, ip); system(command); } /* TODO: Check first if there is a gateway set */ if(gateway) { sprintf(command, "route add default gw %s\n", gateway); system(command); } clean: free((char *)interface); free((char *)gateway); free((char *)ip); return(0); #endif /* CONNMAN */ }
/** * Activate the network interface * */ int usb_network_up(struct mode_list_elem *data) { char *ip = NULL, *gateway = NULL; int ret = -1; #if CONNMAN_WORKS_BETTER DBusConnection *dbus_conn_connman = NULL; DBusMessage *msg = NULL, *reply = NULL; DBusMessageIter iter, variant, dict; DBusMessageIter msg_iter; DBusMessageIter dict_entry; DBusError error; const char *service = NULL; /* make sure connman will recognize the gadget interface NEEDED? */ //system("/bin/dbus-send --print-reply --type=method_call --system --dest=net.connman /net/connman/technology/gadget net.connman.Technology.SetProperty string:Powered variant:boolean:true"); //system("/sbin/ifconfig rndis0 up"); log_debug("waiting for connman to pick up interface\n"); sleep(1); dbus_error_init(&error); if( (dbus_conn_connman = dbus_bus_get(DBUS_BUS_SYSTEM, &error)) == 0 ) { log_err("Could not connect to dbus for connman\n"); } /* get list of services so we can find out which one is the usb gadget */ if ((msg = dbus_message_new_method_call("net.connman", "/", "net.connman.Manager", "GetServices")) != NULL) { if ((reply = dbus_connection_send_with_reply_and_block(dbus_conn_connman, msg, -1, NULL)) != NULL) { service = connman_parse_manager_reply(reply, "gadget"); dbus_message_unref(reply); } dbus_message_unref(msg); } if(service == NULL) return(1); log_debug("gadget = %s\n", service); /* now we need to configure the connection */ if ((msg = dbus_message_new_method_call("net.connman", service, "net.connman.Service", "SetProperty")) != NULL) { log_debug("iter init\n"); dbus_message_iter_init_append(msg, &msg_iter); log_debug("iter append\n"); // TODO: crashes here, need to rework this whole bit, connman dbus is hell dbus_message_iter_append_basic(&msg_iter, DBUS_TYPE_STRING, "IPv4.Configuration"); log_debug("iter open container\n"); dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_VARIANT, DBUS_TYPE_ARRAY_AS_STRING DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &variant); log_debug("iter open container 2\n"); dbus_message_iter_open_container(&variant, DBUS_TYPE_ARRAY, DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict); log_debug("Set Method\n"); dbus_message_iter_open_container(&dict, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry); append_variant(&dict_entry, "Method", DBUS_TYPE_STRING, "manual"); dbus_message_iter_close_container(&dict, &dict_entry); log_debug("Set ip\n"); ip = get_network_ip(); if(ip == NULL) ip = strdup("192.168.2.15"); dbus_message_iter_open_container(&dict, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry); append_variant(&dict_entry, "Address", DBUS_TYPE_STRING, ip); dbus_message_iter_close_container(&dict, &dict_entry); log_debug("Set netmask\n"); dbus_message_iter_open_container(&dict, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry); append_variant(&dict_entry, "Netmask", DBUS_TYPE_STRING, "255.255.255.0"); dbus_message_iter_close_container(&dict, &dict_entry); log_debug("set gateway\n"); gateway = get_network_gateway(); if(gateway) { dbus_message_iter_open_container(&dict, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry); append_variant(&dict_entry, "Gateway", DBUS_TYPE_STRING, gateway); dbus_message_iter_close_container(&dict, &dict_entry); } dbus_message_iter_close_container(&variant, &dict); dbus_message_iter_close_container(&msg_iter, &variant); } log_debug("Connect gadget\n"); /* Finally we can bring it up */ if ((msg = dbus_message_new_method_call("net.connman", service, "net.connman.Service", "Connect")) != NULL) { /* we don't care for the reply, which is empty anyway if all goes well */ ret = !dbus_connection_send(dbus_conn_connman, msg, NULL); /* make sure the message is sent before cleaning up and closing the connection */ dbus_connection_flush(dbus_conn_connman); dbus_message_unref(msg); } dbus_connection_unref(dbus_conn_connman); dbus_error_free(&error); free(service); if(ip) free(ip); if(gateway) free(gateway); return(ret); #else char command[128]; const char *interface; interface = get_interface(data); ip = get_network_ip(); gateway = get_network_gateway(); if(ip == NULL) { sprintf(command,"ifconfig %s 192.168.2.15", interface); system(command); goto clean; } else if(!strcmp(ip, "dhcp")) { sprintf(command, "dhclient -d %s\n", interface); ret = system(command); if(ret != 0) { sprintf(command, "udhcpc -i %s\n", interface); system(command); } } else { sprintf(command, "ifconfig %s %s\n", interface, ip); system(command); } /* TODO: Check first if there is a gateway set */ if(gateway) { sprintf(command, "route add default gw %s\n", gateway); system(command); } clean: free((char *)interface); free((char *)gateway); free((char *)ip); return(0); #endif /* CONNMAN */ }