Merge "rild: Destroy the minijail struct after dropping privs."
diff --git a/include/telephony/ril.h b/include/telephony/ril.h
index 59a7fe2..90db696 100644
--- a/include/telephony/ril.h
+++ b/include/telephony/ril.h
@@ -66,6 +66,11 @@
*
* RIL_VERSION = 13 : This version includes new wakelock semantics and as the first
* strongly versioned version it enforces structure use.
+ * RIL_VERSION = 14 : New data structures are added, namely RIL_CarrierMatchType,
+ * RIL_Carrier, RIL_CarrierRestrictions and RIL_PCO_Data.
+ * New commands added: RIL_REQUEST_SET_CARRIER_RESTRICTIONS,
+ * RIL_REQUEST_SET_CARRIER_RESTRICTIONS and
+ * RIL_UNSOL_PCO_DATA
*/
#define RIL_VERSION 12
#define LAST_IMPRECISE_RIL_VERSION 12 // Better self-documented name
@@ -241,7 +246,8 @@
RADIO_TECH_HSPAP = 15, // HSPA+
RADIO_TECH_GSM = 16, // Only supports voice
RADIO_TECH_TD_SCDMA = 17,
- RADIO_TECH_IWLAN = 18
+ RADIO_TECH_IWLAN = 18,
+ RADIO_TECH_LTE_CA = 19
} RIL_RadioTechnology;
typedef enum {
@@ -263,6 +269,7 @@
RAF_HSPAP = (1 << RADIO_TECH_HSPAP),
RAF_GSM = (1 << RADIO_TECH_GSM),
RAF_TD_SCDMA = (1 << RADIO_TECH_TD_SCDMA),
+ RAF_LTE_CA = (1 << RADIO_TECH_LTE_CA)
} RIL_RadioAccessFamily;
typedef enum {
@@ -337,7 +344,17 @@
PREF_NET_TYPE_LTE_GSM_WCDMA = 9, /* LTE, GSM/WCDMA */
PREF_NET_TYPE_LTE_CMDA_EVDO_GSM_WCDMA = 10, /* LTE, CDMA, EvDo, GSM/WCDMA */
PREF_NET_TYPE_LTE_ONLY = 11, /* LTE only */
- PREF_NET_TYPE_LTE_WCDMA = 12 /* LTE/WCDMA */
+ PREF_NET_TYPE_LTE_WCDMA = 12, /* LTE/WCDMA */
+ PREF_NET_TYPE_TD_SCDMA_ONLY = 13, /* TD-SCDMA only */
+ PREF_NET_TYPE_TD_SCDMA_WCDMA = 14, /* TD-SCDMA and WCDMA */
+ PREF_NET_TYPE_TD_SCDMA_LTE = 15, /* TD-SCDMA and LTE */
+ PREF_NET_TYPE_TD_SCDMA_GSM = 16, /* TD-SCDMA and GSM */
+ PREF_NET_TYPE_TD_SCDMA_GSM_LTE = 17, /* TD-SCDMA,GSM and LTE */
+ PREF_NET_TYPE_TD_SCDMA_GSM_WCDMA = 18, /* TD-SCDMA, GSM/WCDMA */
+ PREF_NET_TYPE_TD_SCDMA_WCDMA_LTE = 19, /* TD-SCDMA, WCDMA and LTE */
+ PREF_NET_TYPE_TD_SCDMA_GSM_WCDMA_LTE = 20, /* TD-SCDMA, GSM/WCDMA and LTE */
+ PREF_NET_TYPE_TD_SCDMA_GSM_WCDMA_CDMA_EVDO_AUTO = 21, /* TD-SCDMA, GSM/WCDMA, CDMA and EvDo */
+ PREF_NET_TYPE_TD_SCDMA_LTE_CDMA_EVDO_GSM_WCDMA = 22 /* TD-SCDMA, LTE, CDMA, EvDo GSM/WCDMA */
} RIL_PreferredNetworkType;
/* Source for cdma subscription */
@@ -687,6 +704,36 @@
*/
} RIL_LceDataInfo;
+typedef enum {
+ RIL_MATCH_ALL = 0, /* Apply to all carriers with the same mcc/mnc */
+ RIL_MATCH_SPN = 1, /* Use SPN and mcc/mnc to identify the carrier */
+ RIL_MATCH_IMSI_PREFIX = 2, /* Use IMSI prefix and mcc/mnc to identify the carrier */
+ RIL_MATCH_GID1 = 3, /* Use GID1 and mcc/mnc to identify the carrier */
+ RIL_MATCH_GID2 = 4, /* Use GID2 and mcc/mnc to identify the carrier */
+} RIL_CarrierMatchType;
+
+typedef struct {
+ const char * mcc;
+ const char * mnc;
+ RIL_CarrierMatchType match_type; /* Specify match type for the carrier.
+ * If it’s RIL_MATCH_ALL, match_data is null;
+ * otherwise, match_data is the value for the match type.
+ */
+ const char * match_data;
+} RIL_Carrier;
+
+typedef struct {
+ int32_t len_allowed_carriers; /* length of array allowed_carriers */
+ int32_t len_excluded_carriers; /* length of array excluded_carriers */
+ RIL_Carrier * allowed_carriers; /* whitelist for allowed carriers */
+ RIL_Carrier * excluded_carriers; /* blacklist for explicitly excluded carriers
+ * which match allowed_carriers. Eg. allowed_carriers match
+ * mcc/mnc, excluded_carriers has same mcc/mnc and gid1
+ * is ABCD. It means except the carrier whose gid1 is ABCD,
+ * all carriers with the same mcc/mnc are allowed.
+ */
+} RIL_CarrierRestrictions;
+
/* See RIL_REQUEST_LAST_CALL_FAIL_CAUSE */
typedef enum {
CALL_FAIL_UNOBTAINABLE_NUMBER = 1,
@@ -894,9 +941,10 @@
#define RIL_CARD_MAX_APPS 8
typedef enum {
- RIL_CARDSTATE_ABSENT = 0,
- RIL_CARDSTATE_PRESENT = 1,
- RIL_CARDSTATE_ERROR = 2
+ RIL_CARDSTATE_ABSENT = 0,
+ RIL_CARDSTATE_PRESENT = 1,
+ RIL_CARDSTATE_ERROR = 2,
+ RIL_CARDSTATE_RESTRICTED = 3 /* card is present but not usable due to carrier restrictions.*/
} RIL_CardState;
typedef enum {
@@ -1228,7 +1276,7 @@
int lac; /* 16-bit Location Area Code, 0..65535, INT_MAX if unknown */
int cid; /* 16-bit GSM Cell Identity described in TS 27.007, 0..65535, INT_MAX if unknown */
int arfcn; /* 16-bit GSM Absolute RF channel number, INT_MAX if unknown */
- uint8_t bsic;/* 6-bit Base Station Identity Code */
+ uint8_t bsic;/* 6-bit Base Station Identity Code, 0xFF if unknown */
} RIL_CellIdentityGsm_v12;
typedef struct {
@@ -4562,7 +4610,7 @@
* RIL_REQUEST_VOICE_RADIO_TECH
*
* Query the radio technology type (3GPP/3GPP2) used for voice. Query is valid only
- * when radio state is RADIO_STATE_ON
+ * when radio state is not RADIO_STATE_UNAVAILABLE
*
* "data" is NULL
* "response" is int *
@@ -5077,6 +5125,45 @@
*/
#define RIL_REQUEST_GET_ACTIVITY_INFO 135
+/**
+ * RIL_REQUEST_SET_CARRIER_RESTRICTIONS
+ *
+ * Set carrier restrictions for this sim slot
+ *
+ * "data" is const RIL_CarrierRestrictions *
+ * A list of allowed carriers and possibly a list of excluded carriers.
+ * If data is NULL, means to clear previous carrier restrictions and allow all carriers
+ *
+ * "response" is int *
+ * ((int *)data)[0] contains the number of allowed carriers which have been set correctly.
+ * On success, it should match the length of list data->allowed_carriers.
+ * If data is NULL, the value must be 0.
+ *
+ * Valid errors:
+ * RIL_E_SUCCESS
+ * RIL_E_INVALID_ARGUMENTS
+ * RIL_E_RADIO_NOT_AVAILABLE
+ * RIL_E_REQUEST_NOT_SUPPORTED
+ */
+#define RIL_REQUEST_SET_CARRIER_RESTRICTIONS 136
+
+/**
+ * RIL_REQUEST_GET_CARRIER_RESTRICTIONS
+ *
+ * Get carrier restrictions for this sim slot
+ *
+ * "data" is NULL
+ *
+ * "response" is const RIL_CarrierRestrictions *.
+ * If response is NULL, it means all carriers are allowed.
+ *
+ * Valid errors:
+ * RIL_E_SUCCESS
+ * RIL_E_RADIO_NOT_AVAILABLE
+ * RIL_E_REQUEST_NOT_SUPPORTED
+ */
+#define RIL_REQUEST_GET_CARRIER_RESTRICTIONS 137
+
/***********************************************************************/
/**
@@ -5692,6 +5779,19 @@
*/
#define RIL_UNSOL_LCEDATA_RECV 1045
+ /**
+ * RIL_UNSOL_PCO_DATA
+ *
+ * Called when there is new Carrier PCO data received for a data call. Ideally
+ * only new data will be forwarded, though this is not required. Multiple
+ * boxes of carrier PCO data for a given call should result in a series of
+ * RIL_UNSOL_PCO_DATA calls.
+ *
+ * "data" is the RIL_PCO_Data structure.
+ *
+ */
+#define RIL_UNSOL_PCO_DATA 1046
+
/***********************************************************************/
@@ -5802,6 +5902,19 @@
NULL if no value. */
} RIL_SimAuthentication;
+typedef struct {
+ int cid; /* Context ID, uniquely identifies this call */
+ char *bearer_proto; /* One of the PDP_type values in TS 27.007 section 10.1.1.
+ For example, "IP", "IPV6", "IPV4V6" */
+ int pco_id; /* The protocol ID for this box. Note that only IDs from
+ FF00H - FFFFH are accepted. If more than one is included
+ from the network, multiple calls should be made to send all
+ of them. */
+ int contents_length; /* The number of octets in the contents. */
+ char *contents; /* Carrier-defined content. It is binary, opaque and
+ loosely defined in LTE Layer 3 spec 24.008 */
+} RIL_PCO_Data;
+
#ifdef RIL_SHLIB
struct RIL_Env {
/**
@@ -5957,7 +6070,6 @@
void RIL_requestTimedCallback (RIL_TimedCallback callback,
void *param, const struct timeval *relativeTime);
-
#endif /* RIL_SHLIB */
#ifdef __cplusplus
diff --git a/libril/Android.mk b/libril/Android.mk
index 5984d9b..f23bfec 100644
--- a/libril/Android.mk
+++ b/libril/Android.mk
@@ -21,6 +21,7 @@
libprotobuf-c-nano-enable_malloc \
#LOCAL_CFLAGS := -DANDROID_MULTI_SIM -DDSDA_RILD1
+LOCAL_CFLAGS += -Wno-unused-parameter
ifeq ($(SIM_COUNT), 2)
LOCAL_CFLAGS += -DANDROID_SIM_COUNT_2
@@ -51,7 +52,7 @@
librilutils_static \
libprotobuf-c-nano-enable_malloc
-LOCAL_CFLAGS :=
+LOCAL_CFLAGS += -Wno-unused-parameter
LOCAL_MODULE:= libril_static
diff --git a/libril/RilSapSocket.cpp b/libril/RilSapSocket.cpp
index 19457f4..92b5e67 100644
--- a/libril/RilSapSocket.cpp
+++ b/libril/RilSapSocket.cpp
@@ -21,6 +21,7 @@
#include "RilSapSocket.h"
#include "pb_decode.h"
#include "pb_encode.h"
+#undef LOG_TAG
#define LOG_TAG "RIL_UIM_SOCKET"
#include <utils/Log.h>
#include <arpa/inet.h>
@@ -85,7 +86,9 @@
const void *data,
size_t datalen) {
RilSapSocket *sap_socket = getSocketById(RIL_SOCKET_1);
- sap_socket->onUnsolicitedResponse(unsolResponse, (void *)data, datalen);
+ if(sap_socket){
+ sap_socket->onUnsolicitedResponse(unsolResponse, (void *)data, datalen);
+ }
}
#endif
@@ -224,18 +227,18 @@
#define BYTES_PER_LINE 16
#define NIBBLE_TO_HEX(n) ({ \
- uint8_t __n = (uint8_t) n & 0x0f; \
+ uint8_t __n = (uint8_t) (n) & 0x0f; \
__nibble >= 10 ? 'A' + __n - 10: '0' + __n; \
})
#define HEX_HIGH(b) ({ \
- uint8_t __b = (uint8_t) b; \
+ uint8_t __b = (uint8_t) (b); \
uint8_t __nibble = (__b >> 4) & 0x0f; \
NIBBLE_TO_HEX(__nibble); \
})
#define HEX_LOW(b) ({ \
- uint8_t __b = (uint8_t) b; \
+ uint8_t __b = (uint8_t) (b); \
uint8_t __nibble = __b & 0x0f; \
NIBBLE_TO_HEX(__nibble); \
})
@@ -248,7 +251,7 @@
int per_line = 0;
do {
- dest += sprintf(out, "%8.8s [%8.8x] ", who, source);
+ dest += snprintf(out, sizeof(out), "%8.8s [%8.8x] ", who, source);
for(; source < length && dest_len - dest > 3 && per_line < BYTES_PER_LINE; source++,
per_line ++) {
out[dest++] = HEX_HIGH(buffer[source]);
@@ -351,8 +354,8 @@
success = pb_encode(&ostream, MsgHeader_fields, hdr);
if (success) {
- RLOGD("Size: %d (0x%x) Size as written: 0x%x", encoded_size, encoded_size,
- written_size);
+ RLOGD("Size: %zu (0x%zx) Size as written: 0x%x", encoded_size,
+ encoded_size, written_size);
log_hex("onRequestComplete", &buffer[sizeof(written_size)], encoded_size);
RLOGI("[%d] < SAP RESPONSE type: %d. id: %d. error: %d",
hdr->token, hdr->type, hdr->id,hdr->error );
@@ -363,12 +366,12 @@
RLOGD("Write successful");
}
} else {
- RLOGE("Error while encoding response of type %d id %d buffer_size: %d: %s.",
- hdr->type, hdr->id, buffer_size, PB_GET_ERROR(&ostream));
+ RLOGE("Error while encoding response of type %d id %d buffer_size: %zu: %s.",
+ hdr->type, hdr->id, buffer_size, PB_GET_ERROR(&ostream));
}
} else {
- RLOGE("Not sending response type %d: encoded_size: %u. commandFd: %d. encoded size result: %d",
- hdr->type, encoded_size, commandFd, success);
+ RLOGE("Not sending response type %d: encoded_size: %zu. commandFd: %d. encoded size result:\
+ %d", hdr->type, encoded_size, commandFd, success);
}
pthread_mutex_unlock(&write_lock);
diff --git a/libril/ril.cpp b/libril/ril.cpp
old mode 100755
new mode 100644
index 94af22c..345d275
--- a/libril/ril.cpp
+++ b/libril/ril.cpp
@@ -92,8 +92,8 @@
#define RESPONSE_UNSOLICITED_ACK_EXP 4
/* Negative values for private RIL errno's */
-#define RIL_ERRNO_INVALID_RESPONSE -1
-#define RIL_ERRNO_NO_MEMORY -12
+#define RIL_ERRNO_INVALID_RESPONSE (-1)
+#define RIL_ERRNO_NO_MEMORY (-12)
// request, response, and unsolicited msg print macro
#define PRINTBUF_SIZE 8096
@@ -282,6 +282,7 @@
static void dispatchSimAuthentication(Parcel &p, RequestInfo *pRI);
static void dispatchDataProfile(Parcel &p, RequestInfo *pRI);
static void dispatchRadioCapability(Parcel &p, RequestInfo *pRI);
+static void dispatchCarrierRestrictions(Parcel &p, RequestInfo *pRI);
static int responseInts(Parcel &p, void *response, size_t responselen);
static int responseFailCause(Parcel &p, void *response, size_t responselen);
static int responseStrings(Parcel &p, void *response, size_t responselen);
@@ -314,6 +315,8 @@
static int responseLceStatus(Parcel &p, void *response, size_t responselen);
static int responseLceData(Parcel &p, void *response, size_t responselen);
static int responseActivityData(Parcel &p, void *response, size_t responselen);
+static int responseCarrierRestrictions(Parcel &p, void *response, size_t responselen);
+static int responsePcoData(Parcel &p, void *response, size_t responselen);
static int decodeVoiceRadioTechnology (RIL_RadioState radioState);
static int decodeCdmaSubscriptionSource (RIL_RadioState radioState);
@@ -533,6 +536,13 @@
return 0;
}
+ // Received an Ack for the previous result sent to RIL.java,
+ // so release wakelock and exit
+ if (request == RIL_RESPONSE_ACKNOWLEDGEMENT) {
+ releaseWakeLock();
+ return 0;
+ }
+
if (request < 1 || request >= (int32_t)NUM_ELEMS(s_commands)) {
Parcel pErr;
RLOGE("unsupported request code %d token %d", request, token);
@@ -545,14 +555,6 @@
return 0;
}
- // Received an Ack for the previous result sent to RIL.java,
- // so release wakelock and exit
- if (request == RIL_RESPONSE_ACKNOWLEDGEMENT) {
- releaseWakeLock();
- return 0;
- }
-
-
pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
if (pRI == NULL) {
RLOGE("Memory allocation failed for request %s", requestToString(request));
@@ -1330,7 +1332,7 @@
pStrings = NULL;
datalen = 0;
} else {
- if (countStrings > (INT_MAX/sizeof(char *))) {
+ if ((size_t)countStrings > (INT_MAX/sizeof(char *))) {
RLOGE("Invalid value of countStrings: \n");
closeRequest;
return;
@@ -1719,12 +1721,12 @@
static void dispatchVoiceRadioTech(Parcel& p, RequestInfo *pRI) {
RIL_RadioState state = CALL_ONSTATEREQUEST((RIL_SOCKET_ID)pRI->socket_id);
- if ((RADIO_STATE_UNAVAILABLE == state) || (RADIO_STATE_OFF == state)) {
+ if (RADIO_STATE_UNAVAILABLE == state) {
RIL_onRequestComplete(pRI, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0);
}
- // RILs that support RADIO_STATE_ON should support this request.
- if (RADIO_STATE_ON == state) {
+ // If radio is available then RIL should support this request.
+ if ((RADIO_STATE_ON == state) || (RADIO_STATE_OFF == state)){
dispatchVoid(p, pRI);
return;
}
@@ -2136,6 +2138,105 @@
return;
}
+/**
+ * Callee expects const RIL_CarrierRestrictions *
+ */
+static void dispatchCarrierRestrictions(Parcel &p, RequestInfo *pRI) {
+ RIL_CarrierRestrictions cr;
+ RIL_Carrier * allowed_carriers = NULL;
+ RIL_Carrier * excluded_carriers = NULL;
+ int32_t t;
+ status_t status;
+
+ memset(&cr, 0, sizeof(RIL_CarrierRestrictions));
+
+ if (s_callbacks.version < 14) {
+ RLOGE("Unsuppoted RIL version %d, min version expected %d",
+ s_callbacks.version, 14);
+ RIL_onRequestComplete(pRI, RIL_E_REQUEST_NOT_SUPPORTED, NULL, 0);
+ return;
+ }
+
+ status = p.readInt32(&t);
+ if (status != NO_ERROR) {
+ goto invalid;
+ }
+ allowed_carriers = (RIL_Carrier *)calloc(t, sizeof(RIL_Carrier));
+ if (allowed_carriers == NULL) {
+ RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
+ goto exit;
+ }
+ cr.len_allowed_carriers = t;
+ cr.allowed_carriers = allowed_carriers;
+
+ status = p.readInt32(&t);
+ if (status != NO_ERROR) {
+ goto invalid;
+ }
+ excluded_carriers = (RIL_Carrier *)calloc(t, sizeof(RIL_Carrier));
+ if (excluded_carriers == NULL) {
+ RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
+ goto exit;
+ }
+ cr.len_excluded_carriers = t;
+ cr.excluded_carriers = excluded_carriers;
+
+ startRequest;
+ appendPrintBuf("%s len_allowed_carriers:%d, len_excluded_carriers:%d,",
+ printBuf, cr.len_allowed_carriers, cr.len_excluded_carriers);
+
+ appendPrintBuf("%s allowed_carriers:", printBuf);
+ for (int32_t i = 0; i < cr.len_allowed_carriers; i++) {
+ RIL_Carrier *p_cr = allowed_carriers + i;
+ p_cr->mcc = strdupReadString(p);
+ p_cr->mnc = strdupReadString(p);
+ status = p.readInt32(&t);
+ p_cr->match_type = static_cast<RIL_CarrierMatchType>(t);
+ if (status != NO_ERROR) {
+ goto invalid;
+ }
+ p_cr->match_data = strdupReadString(p);
+ appendPrintBuf("%s [%d mcc:%s, mnc:%s, match_type:%d, match_data:%s],",
+ printBuf, i, p_cr->mcc, p_cr->mnc, p_cr->match_type, p_cr->match_data);
+ }
+
+ for (int32_t i = 0; i < cr.len_excluded_carriers; i++) {
+ RIL_Carrier *p_cr = excluded_carriers + i;
+ p_cr->mcc = strdupReadString(p);
+ p_cr->mnc = strdupReadString(p);
+ status = p.readInt32(&t);
+ p_cr->match_type = static_cast<RIL_CarrierMatchType>(t);
+ if (status != NO_ERROR) {
+ goto invalid;
+ }
+ p_cr->match_data = strdupReadString(p);
+ appendPrintBuf("%s [%d mcc:%s, mnc:%s, match_type:%d, match_data:%s],",
+ printBuf, i, p_cr->mcc, p_cr->mnc, p_cr->match_type, p_cr->match_data);
+ }
+
+ closeRequest;
+ printRequest(pRI->token, pRI->pCI->requestNumber);
+
+ CALL_ONREQUEST(pRI->pCI->requestNumber,
+ &cr,
+ sizeof(RIL_CarrierRestrictions),
+ pRI, pRI->socket_id);
+
+ goto exit;
+
+invalid:
+ invalidCommandBlock(pRI);
+ RIL_onRequestComplete(pRI, RIL_E_INVALID_ARGUMENTS, NULL, 0);
+exit:
+ if (allowed_carriers != NULL) {
+ free(allowed_carriers);
+ }
+ if (excluded_carriers != NULL) {
+ free(excluded_carriers);
+ }
+ return;
+}
+
static int
blockingWrite(int fd, const void *buffer, size_t len) {
size_t writeOffset = 0;
@@ -3070,9 +3171,10 @@
return RIL_ERRNO_INVALID_RESPONSE;
}
+ RIL_SignalStrength_v10 *p_cur;
if (s_callbacks.version <= LAST_IMPRECISE_RIL_VERSION) {
if (responselen >= sizeof (RIL_SignalStrength_v5)) {
- RIL_SignalStrength_v10 *p_cur = ((RIL_SignalStrength_v10 *) response);
+ p_cur = ((RIL_SignalStrength_v10 *) response);
responseRilSignalStrengthV5(p, p_cur);
@@ -3104,7 +3206,7 @@
assert(0);
}
}
- RIL_SignalStrength_v10 *p_cur = ((RIL_SignalStrength_v10 *) response);
+ p_cur = ((RIL_SignalStrength_v10 *) response);
responseRilSignalStrengthV10(p, p_cur);
}
startResponse;
@@ -3883,8 +3985,8 @@
RLOGE("invalid response: NULL");
}
else {
- RLOGE("responseLceStatus: invalid response length %d expecting len: d%",
- sizeof(RIL_LceStatusInfo), responselen);
+ RLOGE("responseLceStatus: invalid response length %u expecting len: %u",
+ (unsigned)sizeof(RIL_LceStatusInfo), (unsigned)responselen);
}
return RIL_ERRNO_INVALID_RESPONSE;
}
@@ -3907,8 +4009,8 @@
RLOGE("invalid response: NULL");
}
else {
- RLOGE("responseLceData: invalid response length %d expecting len: d%",
- sizeof(RIL_LceDataInfo), responselen);
+ RLOGE("responseLceData: invalid response length %u expecting len: %u",
+ (unsigned)sizeof(RIL_LceDataInfo), (unsigned)responselen);
}
return RIL_ERRNO_INVALID_RESPONSE;
}
@@ -3936,8 +4038,8 @@
RLOGE("invalid response: NULL");
}
else {
- RLOGE("responseActivityData: invalid response length %d expecting len: d%",
- sizeof(RIL_ActivityStatsInfo), responselen);
+ RLOGE("responseActivityData: invalid response length %u expecting len: %u",
+ (unsigned)sizeof(RIL_ActivityStatsInfo), (unsigned)responselen);
}
return RIL_ERRNO_INVALID_RESPONSE;
}
@@ -3961,6 +4063,78 @@
return 0;
}
+static int responseCarrierRestrictions(Parcel &p, void *response, size_t responselen) {
+ if (response == NULL) {
+ RLOGE("invalid response: NULL");
+ return RIL_ERRNO_INVALID_RESPONSE;
+ }
+ if (responselen != sizeof(RIL_CarrierRestrictions)) {
+ RLOGE("responseCarrierRestrictions: invalid response length %u expecting len: %u",
+ (unsigned)responselen, (unsigned)sizeof(RIL_CarrierRestrictions));
+ return RIL_ERRNO_INVALID_RESPONSE;
+ }
+
+ RIL_CarrierRestrictions *p_cr = (RIL_CarrierRestrictions *)response;
+ startResponse;
+
+ p.writeInt32(p_cr->len_allowed_carriers);
+ p.writeInt32(p_cr->len_excluded_carriers);
+ appendPrintBuf(" %s len_allowed_carriers: %d, len_excluded_carriers: %d,", printBuf,
+ p_cr->len_allowed_carriers,p_cr->len_excluded_carriers);
+
+ appendPrintBuf(" %s allowed_carriers:", printBuf);
+ for(int32_t i = 0; i < p_cr->len_allowed_carriers; i++) {
+ RIL_Carrier *carrier = p_cr->allowed_carriers + i;
+ writeStringToParcel(p, carrier->mcc);
+ writeStringToParcel(p, carrier->mnc);
+ p.writeInt32(carrier->match_type);
+ writeStringToParcel(p, carrier->match_data);
+ appendPrintBuf(" %s [%d mcc: %s, mnc: %s, match_type: %d, match_data: %s],", printBuf,
+ i, carrier->mcc, carrier->mnc, carrier->match_type, carrier->match_data);
+ }
+
+ appendPrintBuf(" %s excluded_carriers:", printBuf);
+ for(int32_t i = 0; i < p_cr->len_excluded_carriers; i++) {
+ RIL_Carrier *carrier = p_cr->excluded_carriers + i;
+ writeStringToParcel(p, carrier->mcc);
+ writeStringToParcel(p, carrier->mnc);
+ p.writeInt32(carrier->match_type);
+ writeStringToParcel(p, carrier->match_data);
+ appendPrintBuf(" %s [%d mcc: %s, mnc: %s, match_type: %d, match_data: %s],", printBuf,
+ i, carrier->mcc, carrier->mnc, carrier->match_type, carrier->match_data);
+ }
+
+ closeResponse;
+
+ return 0;
+}
+
+static int responsePcoData(Parcel &p, void *response, size_t responselen) {
+ if (response == NULL) {
+ RLOGE("responsePcoData: invalid NULL response");
+ return RIL_ERRNO_INVALID_RESPONSE;
+ }
+ if (responselen != sizeof(RIL_PCO_Data)) {
+ RLOGE("responsePcoData: invalid response length %u, expecting %u",
+ (unsigned)responselen, (unsigned)sizeof(RIL_PCO_Data));
+ return RIL_ERRNO_INVALID_RESPONSE;
+ }
+
+ RIL_PCO_Data *p_cur = (RIL_PCO_Data *)response;
+ p.writeInt32(p_cur->cid);
+ writeStringToParcel(p, p_cur->bearer_proto);
+ p.writeInt32(p_cur->pco_id);
+ p.writeInt32(p_cur->contents_length);
+ p.write(p_cur->contents, p_cur->contents_length);
+
+ startResponse;
+ appendPrintBuf("PCO data received: cid %d, id %d, length %d",
+ p_cur->cid, p_cur->pco_id, p_cur->contents_length);
+ closeResponse;
+
+ return 0;
+}
+
/**
* A write on the wakeup fd is done just to pop us out of select()
* We empty the buffer here and then ril_event will reset the timers on the
@@ -4107,7 +4281,7 @@
int err;
int is_phone_socket;
int fdCommand = -1;
- char* processName;
+ const char* processName;
RecordStream *p_rs;
MySocketListenParam* listenParam;
RilSocket *sapSocket = NULL;
@@ -4609,7 +4783,8 @@
&s_commands_event, /* commands_event */
&s_listen_event, /* listen_event */
processCommandsCallback, /* processCommandsCallback */
- NULL /* p_rs */
+ NULL, /* p_rs */
+ RIL_TELEPHONY_SOCKET /* type */
};
#if (SIM_COUNT >= 2)
@@ -4621,7 +4796,8 @@
&s_commands_event_socket2, /* commands_event */
&s_listen_event_socket2, /* listen_event */
processCommandsCallback, /* processCommandsCallback */
- NULL /* p_rs */
+ NULL, /* p_rs */
+ RIL_TELEPHONY_SOCKET /* type */
};
#endif
@@ -4634,7 +4810,8 @@
&s_commands_event_socket3, /* commands_event */
&s_listen_event_socket3, /* listen_event */
processCommandsCallback, /* processCommandsCallback */
- NULL /* p_rs */
+ NULL, /* p_rs */
+ RIL_TELEPHONY_SOCKET /* type */
};
#endif
@@ -4647,7 +4824,8 @@
&s_commands_event_socket4, /* commands_event */
&s_listen_event_socket4, /* listen_event */
processCommandsCallback, /* processCommandsCallback */
- NULL /* p_rs */
+ NULL, /* p_rs */
+ RIL_TELEPHONY_SOCKET /* type */
};
#endif
@@ -4750,6 +4928,8 @@
#if (SIM_COUNT >= 4)
RilSapSocket::initSapSocket("sap_uim_socket4", UimFuncs);
#endif
+ break;
+ default:;
}
}
}
@@ -5525,6 +5705,7 @@
case RIL_REQUEST_QUERY_CLIP: return "QUERY_CLIP";
case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: return "LAST_DATA_CALL_FAIL_CAUSE";
case RIL_REQUEST_DATA_CALL_LIST: return "DATA_CALL_LIST";
+ case RIL_REQUEST_NV_RESET_CONFIG: return "NV_RESET_CONFIG";
case RIL_REQUEST_RESET_RADIO: return "RESET_RADIO";
case RIL_REQUEST_OEM_HOOK_RAW: return "OEM_HOOK_RAW";
case RIL_REQUEST_OEM_HOOK_STRINGS: return "OEM_HOOK_STRINGS";
@@ -5588,6 +5769,8 @@
case RIL_REQUEST_GET_DC_RT_INFO: return "GET_DC_RT_INFO";
case RIL_REQUEST_SET_DC_RT_INFO_RATE: return "SET_DC_RT_INFO_RATE";
case RIL_REQUEST_SET_DATA_PROFILE: return "SET_DATA_PROFILE";
+ case RIL_REQUEST_SET_CARRIER_RESTRICTIONS: return "SET_CARRIER_RESTRICTIONS";
+ case RIL_REQUEST_GET_CARRIER_RESTRICTIONS: return "GET_CARRIER_RESTRICTIONS";
case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
@@ -5633,6 +5816,7 @@
case RIL_REQUEST_SHUTDOWN: return "SHUTDOWN";
case RIL_UNSOL_RADIO_CAPABILITY: return "RIL_UNSOL_RADIO_CAPABILITY";
case RIL_RESPONSE_ACKNOWLEDGEMENT: return "RIL_RESPONSE_ACKNOWLEDGEMENT";
+ case RIL_UNSOL_PCO_DATA: return "RIL_UNSOL_PCO_DATA";
default: return "<unknown request>";
}
}
diff --git a/libril/ril_commands.h b/libril/ril_commands.h
index 163aa46..8d02c39 100644
--- a/libril/ril_commands.h
+++ b/libril/ril_commands.h
@@ -150,3 +150,5 @@
{RIL_REQUEST_STOP_LCE, dispatchVoid, responseLceStatus},
{RIL_REQUEST_PULL_LCEDATA, dispatchVoid, responseLceData},
{RIL_REQUEST_GET_ACTIVITY_INFO, dispatchVoid, responseActivityData},
+ {RIL_REQUEST_SET_CARRIER_RESTRICTIONS, dispatchCarrierRestrictions, responseInts},
+ {RIL_REQUEST_GET_CARRIER_RESTRICTIONS, dispatchVoid, responseCarrierRestrictions},
diff --git a/libril/ril_unsol_commands.h b/libril/ril_unsol_commands.h
index eb9e12d..11ae050 100755
--- a/libril/ril_unsol_commands.h
+++ b/libril/ril_unsol_commands.h
@@ -60,3 +60,4 @@
{RIL_UNSOL_ON_SS, responseSSData, WAKE_PARTIAL},
{RIL_UNSOL_STK_CC_ALPHA_NOTIFY, responseString, WAKE_PARTIAL},
{RIL_UNSOL_LCEDATA_RECV, responseLceData, WAKE_PARTIAL},
+ {RIL_UNSOL_PCO_DATA, responsePcoData, WAKE_PARTIAL},
diff --git a/reference-ril/atchannel.c b/reference-ril/atchannel.c
index 6124d88..5dc3e3c 100644
--- a/reference-ril/atchannel.c
+++ b/reference-ril/atchannel.c
@@ -36,7 +36,7 @@
#include "misc.h"
-#define NUM_ELEMS(x) (sizeof(x)/sizeof(x[0]))
+#define NUM_ELEMS(x) (sizeof(x)/sizeof((x)[0]))
#define MAX_AT_RESPONSE (8 * 1024)
#define HANDSHAKE_RETRY_COUNT 8
@@ -422,7 +422,7 @@
}
-static void *readerLoop(void *arg)
+static void *readerLoop(void *arg __unused)
{
for (;;) {
const char * line;
diff --git a/reference-ril/atchannel.h b/reference-ril/atchannel.h
index cfd49d5..9282915 100644
--- a/reference-ril/atchannel.h
+++ b/reference-ril/atchannel.h
@@ -31,16 +31,16 @@
#define AT_DUMP(prefix,buff,len) do{}while(0)
#endif
-#define AT_ERROR_GENERIC -1
-#define AT_ERROR_COMMAND_PENDING -2
-#define AT_ERROR_CHANNEL_CLOSED -3
-#define AT_ERROR_TIMEOUT -4
-#define AT_ERROR_INVALID_THREAD -5 /* AT commands may not be issued from
- reader thread (or unsolicited response
- callback */
-#define AT_ERROR_INVALID_RESPONSE -6 /* eg an at_send_command_singleline that
- did not get back an intermediate
- response */
+#define AT_ERROR_GENERIC (-1)
+#define AT_ERROR_COMMAND_PENDING (-2)
+#define AT_ERROR_CHANNEL_CLOSED (-3)
+#define AT_ERROR_TIMEOUT (-4)
+#define AT_ERROR_INVALID_THREAD (-5) /* AT commands may not be issued from
+ reader thread (or unsolicited response
+ callback */
+#define AT_ERROR_INVALID_RESPONSE (-6) /* eg an at_send_command_singleline that
+ did not get back an intermediate
+ response */
typedef enum {
diff --git a/reference-ril/reference-ril.c b/reference-ril/reference-ril.c
index b9baef1..a2525bc 100644
--- a/reference-ril/reference-ril.c
+++ b/reference-ril/reference-ril.c
@@ -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>
@@ -36,9 +37,9 @@
#include <cutils/sockets.h>
#include <termios.h>
#include <sys/system_properties.h>
+#include <system/qemu_pipe.h>
#include "ril.h"
-#include "hardware/qemu_pipe.h"
#define LOG_TAG "RIL"
#include <utils/Log.h>
@@ -239,6 +240,16 @@
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;
@@ -364,7 +375,7 @@
at_send_command("AT+CNMI=1,2,2,1,1", NULL);
}
-static void requestRadioPower(void *data, size_t datalen, RIL_Token t)
+static void requestRadioPower(void *data, size_t datalen __unused, RIL_Token t)
{
int onOff;
@@ -532,70 +543,72 @@
err = at_tok_nextstr(&line, &out);
if (err < 0)
goto error;
- responses[i].type = alloca(strlen(out) + 1);
- strcpy(responses[i].type, out);
+
+ int type_size = strlen(out) + 1;
+ responses[i].type = alloca(type_size);
+ strlcpy(responses[i].type, out, type_size);
// APN ignored for v5
err = at_tok_nextstr(&line, &out);
if (err < 0)
goto error;
- responses[i].ifname = alloca(strlen(PPP_TTY_PATH) + 1);
- strcpy(responses[i].ifname, PPP_TTY_PATH);
+ int ifname_size = strlen(PPP_TTY_PATH) + 1;
+ responses[i].ifname = alloca(ifname_size);
+ strlcpy(responses[i].ifname, PPP_TTY_PATH, ifname_size);
err = at_tok_nextstr(&line, &out);
if (err < 0)
goto error;
- responses[i].addresses = alloca(strlen(out) + 1);
- strcpy(responses[i].addresses, out);
+ int addresses_size = strlen(out) + 1;
+ responses[i].addresses = alloca(addresses_size);
+ strlcpy(responses[i].addresses, out, addresses_size);
- {
- char propValue[PROP_VALUE_MAX];
+ 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;
- 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];
+ char propValue[PROP_VALUE_MAX];
- 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);
+ 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 = " ";
+ /* 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;
+ /* Append the DNS IP address */
+ strlcat(dnslist, separator, dnslist_sz);
+ strlcat(dnslist, propValue, dnslist_sz);
+ separator = " ";
}
- 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 = "";
- }
+ 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 = "";
}
}
@@ -1932,6 +1945,7 @@
{ // ci[0]
1, // cellInfoType
1, // registered
+ RIL_TIMESTAMP_TYPE_MODEM,
curTime - 1000, // Fake some time in the past
{ // union CellInfo
{ // RIL_CellInfoGsm gsm
@@ -1940,7 +1954,6 @@
s_mnc, // mnc
s_lac, // lac
s_cid, // cid
- 0 // psc
},
{ // gsm.signalStrengthGsm
10, // signalStrength
@@ -1955,7 +1968,7 @@
}
-static void requestSetCellInfoListRate(void *data, size_t datalen, RIL_Token t)
+static void requestSetCellInfoListRate(void *data, size_t datalen __unused, RIL_Token t)
{
// For now we'll save the rate but no RIL_UNSOL_CELL_INFO_LIST messages
// will be sent.
@@ -3273,7 +3286,7 @@
RIL_onUnsolicitedResponse(RIL_UNSOL_HARDWARE_CONFIG_CHANGED, cfg, num*sizeof(*cfg));
}
-static void usage(char *s)
+static void usage(char *s __unused)
{
#ifdef RIL_SHLIB
fprintf(stderr, "reference-ril requires: -p <tcp port> or -d /dev/tty_device\n");
@@ -3296,37 +3309,14 @@
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("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 +3399,7 @@
}
}
- if (s_port < 0 && s_device_path == NULL) {
+ if (s_port < 0 && s_device_path == NULL && !isInEmulator()) {
usage(argv[0]);
return NULL;
}
@@ -3458,7 +3448,7 @@
}
}
- if (s_port < 0 && s_device_path == NULL) {
+ if (s_port < 0 && s_device_path == NULL && !isInEmulator()) {
usage(argv[0]);
}
diff --git a/rild/rild.c b/rild/rild.c
index a55d69b..dec950e 100644
--- a/rild/rild.c
+++ b/rild/rild.c
@@ -37,7 +37,6 @@
#include <libril/ril_ex.h>
#include <private/android_filesystem_config.h>
-#include "hardware/qemu_pipe.h"
#define LIB_PATH_PROPERTY "rild.libpath"
#define LIB_ARGS_PROPERTY "rild.libargs"
@@ -128,7 +127,7 @@
char **rilArgv;
void *dlHandle;
const RIL_RadioFunctions *(*rilInit)(const struct RIL_Env *, int, char **);
- const RIL_RadioFunctions *(*rilUimInit)(const struct RIL_Env *, int, char **);
+ RIL_RadioFunctions *(*rilUimInit)(const struct RIL_Env *, int, char **);
const char *err_str = NULL;
const RIL_RadioFunctions *funcs;
@@ -178,113 +177,6 @@
}
}
- /* 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] = {'\0'}, *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("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);
@@ -307,7 +199,7 @@
dlerror(); // Clear any previous dlerror
rilUimInit =
- (const RIL_RadioFunctions *(*)(const struct RIL_Env *, int, char **))
+ (RIL_RadioFunctions *(*)(const struct RIL_Env *, int, char **))
dlsym(dlHandle, "RIL_SAP_Init");
err_str = dlerror();
if (err_str) {