From 6a7b8e56d1648bd398750b0e28343286307f8b65 Mon Sep 17 00:00:00 2001 From: Kim Uk Date: Tue, 19 Jul 2011 12:57:26 -0700 Subject: audio: check for ril presence before calling into it This prevents a seg fault if no ril is present. Change-Id: I5f9443e31bdcab07df21d9f12ed2dd92807300f8 --- audio/ril_interface.c | 111 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 75 insertions(+), 36 deletions(-) (limited to 'audio/ril_interface.c') diff --git a/audio/ril_interface.c b/audio/ril_interface.c index b20d42b..6bc0127 100644 --- a/audio/ril_interface.c +++ b/audio/ril_interface.c @@ -14,73 +14,112 @@ * limitations under the License. */ +#define LOG_TAG "audio_hw_primary" +/*#define LOG_NDEBUG 0*/ + #include #include #include "ril_interface.h" -int ril_open(void **ril_handle, void **ril_client) +/* Function pointers */ +void *(*_ril_open_client)(void); +int (*_ril_close_client)(void *); +int (*_ril_connect)(void *); +int (*_ril_is_connected)(void *); +int (*_ril_disconnect)(void *); +int (*_ril_set_call_volume)(void *, enum ril_sound_type, int); +int (*_ril_set_call_audio_path)(void *, enum ril_audio_path); +int (*_ril_set_call_clock_sync)(void *, enum ril_clock_state); + +static int ril_connect_if_required(struct ril_handle *ril) +{ + if (_ril_is_connected(ril->client)) + return 0; + + if (_ril_connect(ril->client) != RIL_CLIENT_ERR_SUCCESS) { + LOGE("ril_connect() failed"); + return -1; + } + return 0; +} + +int ril_open(struct ril_handle *ril) { - void *handle; - void *client; + if (!ril) + return -1; - handle = dlopen(RIL_CLIENT_LIBPATH, RTLD_NOW); + ril->handle = dlopen(RIL_CLIENT_LIBPATH, RTLD_NOW); - if (!handle) { + if (!ril->handle) { LOGE("Cannot open '%s'", RIL_CLIENT_LIBPATH); return -1; } - ril_open_client = dlsym(handle, "OpenClient_RILD"); - ril_close_client = dlsym(handle, "CloseClient_RILD"); - ril_connect = dlsym(handle, "Connect_RILD"); - ril_is_connected = dlsym(handle, "isConnected_RILD"); - ril_disconnect = dlsym(handle, "Disconnect_RILD"); - ril_set_call_volume = dlsym(handle, "SetCallVolume"); - ril_set_call_audio_path = dlsym(handle, "SetCallAudioPath"); - ril_set_call_clock_sync = dlsym(handle, "SetCallClockSync"); - - if (!ril_open_client || !ril_close_client || !ril_connect || - !ril_is_connected || !ril_disconnect || !ril_set_call_volume || - !ril_set_call_audio_path || !ril_set_call_clock_sync) { + _ril_open_client = dlsym(ril->handle, "OpenClient_RILD"); + _ril_close_client = dlsym(ril->handle, "CloseClient_RILD"); + _ril_connect = dlsym(ril->handle, "Connect_RILD"); + _ril_is_connected = dlsym(ril->handle, "isConnected_RILD"); + _ril_disconnect = dlsym(ril->handle, "Disconnect_RILD"); + _ril_set_call_volume = dlsym(ril->handle, "SetCallVolume"); + _ril_set_call_audio_path = dlsym(ril->handle, "SetCallAudioPath"); + _ril_set_call_clock_sync = dlsym(ril->handle, "SetCallClockSync"); + + if (!_ril_open_client || !_ril_close_client || !_ril_connect || + !_ril_is_connected || !_ril_disconnect || !_ril_set_call_volume || + !_ril_set_call_audio_path || !_ril_set_call_clock_sync) { LOGE("Cannot get symbols from '%s'", RIL_CLIENT_LIBPATH); - dlclose(handle); + dlclose(ril->handle); return -1; } - client = ril_open_client(); - if (!client) { + ril->client = _ril_open_client(); + if (!ril->client) { LOGE("ril_open_client() failed"); - dlclose(handle); + dlclose(ril->handle); return -1; } - if (ril_connect(client) != RIL_CLIENT_ERR_SUCCESS || - !ril_is_connected(client)) { - LOGE("ril_connect() failed"); - ril_close_client(client); - dlclose(handle); - return -1; - } - - *ril_handle = handle; - *ril_client = client; return 0; } -int ril_close(void *ril_handle, void *ril_client) +int ril_close(struct ril_handle *ril) { - if (!ril_handle) + if (!ril || !ril->handle || !ril->client) return -1; - if ((ril_disconnect(ril_client) != RIL_CLIENT_ERR_SUCCESS) || - (ril_close_client(ril_client) != RIL_CLIENT_ERR_SUCCESS)) { + if ((_ril_disconnect(ril->client) != RIL_CLIENT_ERR_SUCCESS) || + (_ril_close_client(ril->client) != RIL_CLIENT_ERR_SUCCESS)) { LOGE("ril_disconnect() or ril_close_client() failed"); return -1; } - dlclose(ril_handle); + dlclose(ril->handle); return 0; } +int ril_set_call_volume(struct ril_handle *ril, enum ril_sound_type sound_type, + int volume) +{ + if (ril_connect_if_required(ril)) + return 0; + + return _ril_set_call_volume(ril->client, sound_type, volume); +} + +int ril_set_call_audio_path(struct ril_handle *ril, enum ril_audio_path path) +{ + if (ril_connect_if_required(ril)) + return 0; + + return _ril_set_call_audio_path(ril->client, path); +} + +int ril_set_call_clock_sync(struct ril_handle *ril, enum ril_clock_state state) +{ + if (ril_connect_if_required(ril)) + return 0; + + return _ril_set_call_clock_sync(ril->client, state); +} -- cgit v1.1