Commit 834eca8d authored by David 'Digit' Turner's avatar David 'Digit' Turner
Browse files

Simplify emulator-specific logic.

Remove any qemu-specific code from rild.c, this now handled
by setting rild.libpath properly in the init.<board>.rc files
for emulator-specific build products.

Also, only the qemu pipe method is really supported since ICS
so remove obsolete schemes.

BUG=25875346

Change-Id: I82296c127b90c230ca1446ee2431f06e78def617
parent 47a81105
......@@ -17,6 +17,7 @@
#include <telephony/ril_cdma_sms.h>
#include <telephony/librilutils.h>
#include <stdbool.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>
......@@ -239,6 +240,16 @@ static int s_repollCallsCount = 0;
static int s_expectAnswer = 0;
#endif /* WORKAROUND_ERRONEOUS_ANSWER */
// Returns true iff running this process in an emulator VM
static bool isInEmulator(void) {
static int inQemu = -1;
if (inQemu < 0) {
char propValue[PROP_VALUE_MAX];
inQemu = (__system_property_get("ro.kernel.qemu", propValue) != 0);
}
return inQemu == 1;
}
static int s_cell_info_rate_ms = INT_MAX;
static int s_mcc = 0;
static int s_mnc = 0;
......@@ -550,52 +561,50 @@ static void requestOrSendDataCallList(RIL_Token *t)
responses[i].addresses = alloca(strlen(out) + 1);
strcpy(responses[i].addresses, out);
{
char propValue[PROP_VALUE_MAX];
if (__system_property_get("ro.kernel.qemu", propValue) != 0) {
/* We are in the emulator - the dns servers are listed
* by the following system properties, setup in
* /system/etc/init.goldfish.sh:
* - net.eth0.dns1
* - net.eth0.dns2
* - net.eth0.dns3
* - net.eth0.dns4
*/
const int dnslist_sz = 128;
char* dnslist = alloca(dnslist_sz);
const char* separator = "";
int nn;
dnslist[0] = 0;
for (nn = 1; nn <= 4; nn++) {
/* Probe net.eth0.dns<n> */
char propName[PROP_NAME_MAX];
snprintf(propName, sizeof propName, "net.eth0.dns%d", nn);
/* Ignore if undefined */
if (__system_property_get(propName, propValue) == 0) {
continue;
}
/* Append the DNS IP address */
strlcat(dnslist, separator, dnslist_sz);
strlcat(dnslist, propValue, dnslist_sz);
separator = " ";
if (isInEmulator()) {
/* We are in the emulator - the dns servers are listed
* by the following system properties, setup in
* /system/etc/init.goldfish.sh:
* - net.eth0.dns1
* - net.eth0.dns2
* - net.eth0.dns3
* - net.eth0.dns4
*/
const int dnslist_sz = 128;
char* dnslist = alloca(dnslist_sz);
const char* separator = "";
int nn;
dnslist[0] = 0;
for (nn = 1; nn <= 4; nn++) {
/* Probe net.eth0.dns<n> */
char propName[PROP_NAME_MAX];
char propValue[PROP_VALUE_MAX];
snprintf(propName, sizeof propName, "net.eth0.dns%d", nn);
/* Ignore if undefined */
if (__system_property_get(propName, propValue) == 0) {
continue;
}
responses[i].dnses = dnslist;
/* There is only on gateway in the emulator */
responses[i].gateways = "10.0.2.2";
responses[i].mtu = DEFAULT_MTU;
}
else {
/* I don't know where we are, so use the public Google DNS
* servers by default and no gateway.
*/
responses[i].dnses = "8.8.8.8 8.8.4.4";
responses[i].gateways = "";
/* Append the DNS IP address */
strlcat(dnslist, separator, dnslist_sz);
strlcat(dnslist, propValue, dnslist_sz);
separator = " ";
}
responses[i].dnses = dnslist;
/* There is only on gateway in the emulator */
responses[i].gateways = "10.0.2.2";
responses[i].mtu = DEFAULT_MTU;
}
else {
/* I don't know where we are, so use the public Google DNS
* servers by default and no gateway.
*/
responses[i].dnses = "8.8.8.8 8.8.4.4";
responses[i].gateways = "";
}
}
......@@ -3296,37 +3305,14 @@ mainLoop(void *param __unused)
for (;;) {
fd = -1;
while (fd < 0) {
if (s_port > 0) {
if (isInEmulator()) {
fd = qemu_pipe_open("pipe:qemud:gsm");
} else if (s_port > 0) {
fd = socket_loopback_client(s_port, SOCK_STREAM);
} else if (s_device_socket) {
if (!strcmp(s_device_path, "/dev/socket/qemud")) {
/* Before trying to connect to /dev/socket/qemud (which is
* now another "legacy" way of communicating with the
* emulator), we will try to connecto to gsm service via
* qemu pipe. */
fd = qemu_pipe_open("pipe:qemud:gsm");
if (fd < 0) {
/* Qemu-specific control socket */
fd = socket_local_client( "qemud",
ANDROID_SOCKET_NAMESPACE_RESERVED,
SOCK_STREAM );
if (fd >= 0 ) {
char answer[2];
if ( write(fd, "gsm", 3) != 3 ||
read(fd, answer, 2) != 2 ||
memcmp(answer, "OK", 2) != 0)
{
close(fd);
fd = -1;
}
}
}
}
else
fd = socket_local_client( s_device_path,
ANDROID_SOCKET_NAMESPACE_FILESYSTEM,
SOCK_STREAM );
fd = socket_local_client(s_device_path,
ANDROID_SOCKET_NAMESPACE_FILESYSTEM,
SOCK_STREAM);
} else if (s_device_path != NULL) {
fd = open (s_device_path, O_RDWR);
if ( fd >= 0 && !memcmp( s_device_path, "/dev/ttyS", 9 ) ) {
......@@ -3409,7 +3395,7 @@ const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **a
}
}
if (s_port < 0 && s_device_path == NULL) {
if (s_port < 0 && s_device_path == NULL && !isInEmulator()) {
usage(argv[0]);
return NULL;
}
......@@ -3458,7 +3444,7 @@ int main (int argc, char **argv)
}
}
if (s_port < 0 && s_device_path == NULL) {
if (s_port < 0 && s_device_path == NULL && !isInEmulator()) {
usage(argv[0]);
}
......
......@@ -36,7 +36,6 @@
#include <libril/ril_ex.h>
#include <private/android_filesystem_config.h>
#include <system/qemu_pipe.h>
#define LIB_PATH_PROPERTY "rild.libpath"
#define LIB_ARGS_PROPERTY "rild.libargs"
......@@ -142,7 +141,7 @@ int main(int argc, char **argv) {
void *dlHandle;
const RIL_RadioFunctions *(*rilInit)(const struct RIL_Env *, int, char **);
const RIL_RadioFunctions *(*rilUimInit)(const struct RIL_Env *, int, char **);
char *err_str = NULL;
const char *err_str = NULL;
const RIL_RadioFunctions *funcs;
char libPath[PROPERTY_VALUE_MAX];
......@@ -190,113 +189,6 @@ int main(int argc, char **argv) {
}
}
/* special override when in the emulator */
#if 1
{
static char* arg_overrides[5];
static char arg_device[32];
int done = 0;
#define REFERENCE_RIL_PATH "libreference-ril.so"
/* first, read /proc/cmdline into memory */
char buffer[1024], *p, *q;
int len;
int fd = open("/proc/cmdline",O_RDONLY);
if (fd < 0) {
RLOGD("could not open /proc/cmdline:%s", strerror(errno));
goto OpenLib;
}
do {
len = read(fd,buffer,sizeof(buffer)); }
while (len == -1 && errno == EINTR);
if (len < 0) {
RLOGD("could not read /proc/cmdline:%s", strerror(errno));
close(fd);
goto OpenLib;
}
close(fd);
if (strstr(buffer, "android.qemud=") != NULL)
{
/* the qemud daemon is launched after rild, so
* give it some time to create its GSM socket
*/
int tries = 5;
#define QEMUD_SOCKET_NAME "qemud"
while (1) {
int fd;
sleep(1);
fd = qemu_pipe_open("pipe:qemud:gsm");
if (fd < 0) {
fd = socket_local_client(
QEMUD_SOCKET_NAME,
ANDROID_SOCKET_NAMESPACE_RESERVED,
SOCK_STREAM );
}
if (fd >= 0) {
close(fd);
snprintf( arg_device, sizeof(arg_device), "%s/%s",
ANDROID_SOCKET_DIR, QEMUD_SOCKET_NAME );
arg_overrides[1] = "-s";
arg_overrides[2] = arg_device;
done = 1;
break;
}
RLOGD("could not connect to %s socket: %s",
QEMUD_SOCKET_NAME, strerror(errno));
if (--tries == 0)
break;
}
if (!done) {
RLOGE("could not connect to %s socket (giving up): %s",
QEMUD_SOCKET_NAME, strerror(errno));
while(1)
sleep(0x00ffffff);
}
}
/* otherwise, try to see if we passed a device name from the kernel */
if (!done) do {
#define KERNEL_OPTION "android.ril="
#define DEV_PREFIX "/dev/"
p = strstr( buffer, KERNEL_OPTION );
if (p == NULL)
break;
p += sizeof(KERNEL_OPTION)-1;
q = strpbrk( p, " \t\n\r" );
if (q != NULL)
*q = 0;
snprintf( arg_device, sizeof(arg_device), DEV_PREFIX "%s", p );
arg_device[sizeof(arg_device)-1] = 0;
arg_overrides[1] = "-d";
arg_overrides[2] = arg_device;
done = 1;
} while (0);
if (done) {
argv = arg_overrides;
argc = 3;
i = 1;
hasLibArgs = 1;
rilLibPath = REFERENCE_RIL_PATH;
RLOGD("overriding with %s %s", arg_overrides[1], arg_overrides[2]);
}
}
OpenLib:
#endif
switchUser();
dlHandle = dlopen(rilLibPath, RTLD_NOW);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment