fragattacks/wpa_supplicant/binder/binder_manager.cpp
Roshan Pius f1a5a34d8e binder: Implement interface add/remove methods
This commit implements the methods defined in Supplicant service:
1. CreateInterface
2. RemoveInterface
3. GetInterface

The binder service returns the corresponding iface binder object
references which can be used by clients to control a specific
interface.

Signed-off-by: Roshan Pius <rpius@google.com>
2016-04-02 17:35:28 +03:00

108 lines
2.4 KiB
C++

/*
* binder interface for wpa_supplicant daemon
* Copyright (c) 2004-2016, Jouni Malinen <j@w1.fi>
* Copyright (c) 2004-2016, Roshan Pius <rpius@google.com>
*
* This software may be distributed under the terms of the BSD license.
* See README for more details.
*/
#include <binder/IServiceManager.h>
#include "binder_manager.h"
extern "C" {
#include "utils/includes.h"
#include "utils/common.h"
}
namespace wpa_supplicant_binder {
const char BinderManager::kBinderServiceName[] = "fi.w1.wpa_supplicant";
BinderManager *BinderManager::instance_ = NULL;
BinderManager * BinderManager::getInstance()
{
if (!instance_)
instance_ = new BinderManager();
return instance_;
}
void BinderManager::destroyInstance()
{
if (instance_)
delete instance_;
instance_ = NULL;
}
int BinderManager::registerBinderService(struct wpa_global *global)
{
/* Create the main binder service object and register with
* system service manager. */
supplicant_object_ = new Supplicant(global);
android::String16 service_name(kBinderServiceName);
android::defaultServiceManager()->addService(
service_name,
android::IInterface::asBinder(supplicant_object_));
return 0;
}
int BinderManager::registerInterface(struct wpa_supplicant *wpa_s)
{
if (!wpa_s)
return 1;
/* Using the corresponding wpa_supplicant pointer as key to our
* object map. */
const void *iface_key = wpa_s;
/* Return failure if we already have an object for that iface_key. */
if (iface_object_map_.find(iface_key) != iface_object_map_.end())
return 1;
iface_object_map_[iface_key] = new Iface(wpa_s);
if (!iface_object_map_[iface_key].get())
return 1;
wpa_s->binder_object_key = iface_key;
return 0;
}
int BinderManager::unregisterInterface(struct wpa_supplicant *wpa_s)
{
if (!wpa_s || !wpa_s->binder_object_key)
return 1;
const void *iface_key = wpa_s;
if (iface_object_map_.find(iface_key) == iface_object_map_.end())
return 1;
/* Delete the corresponding iface object from our map. */
iface_object_map_.erase(iface_key);
wpa_s->binder_object_key = NULL;
return 0;
}
int BinderManager::getIfaceBinderObjectByKey(
const void *iface_object_key,
android::sp<fi::w1::wpa_supplicant::IIface> *iface_object)
{
if (!iface_object_key || !iface_object)
return 1;
if (iface_object_map_.find(iface_object_key) == iface_object_map_.end())
return 1;
*iface_object = iface_object_map_[iface_object_key];
return 0;
}
} /* namespace wpa_supplicant_binder */