1 /*
2 * Copyright (c) 2017, The Linux Foundation. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above
10 * copyright notice, this list of conditions and the following
11 * disclaimer in the documentation and/or other materials provided
12 * with the distribution.
13 * * Neither the name of The Linux Foundation nor the names of its
14 * contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30 #include <dlfcn.h>
31
32 #include "drm_lib_loader.h"
33
34 #define __CLASS__ "DRMLibLoader"
35
36 using std::mutex;
37 using std::lock_guard;
38
39 namespace drm_utils {
40
41 DRMLibLoader *DRMLibLoader::s_instance = nullptr;
42 mutex DRMLibLoader::s_lock;
43
GetInstance()44 DRMLibLoader *DRMLibLoader::GetInstance() {
45 lock_guard<mutex> obj(s_lock);
46
47 if (!s_instance) {
48 s_instance = new DRMLibLoader();
49 }
50
51 return s_instance;
52 }
53
Destroy()54 void DRMLibLoader::Destroy() {
55 lock_guard<mutex> obj(s_lock);
56 if (s_instance) {
57 delete s_instance;
58 s_instance = nullptr;
59 }
60 }
61
DRMLibLoader()62 DRMLibLoader::DRMLibLoader() {
63 if (Open("libsdedrm.so")) {
64 if (Sym("GetDRMManager", reinterpret_cast<void **>(&func_get_drm_manager_)) &&
65 Sym("DestroyDRMManager", reinterpret_cast<void **>(&func_destroy_drm_manager_))) {
66 is_loaded_ = true;
67 }
68 }
69 }
70
~DRMLibLoader()71 DRMLibLoader::~DRMLibLoader() {
72 if (lib_) {
73 ::dlclose(lib_);
74 lib_ = nullptr;
75 }
76 }
77
Open(const char * lib_name)78 bool DRMLibLoader::Open(const char *lib_name) {
79 lib_ = ::dlopen(lib_name, RTLD_NOW);
80
81 return (lib_ != nullptr);
82 }
83
Sym(const char * func_name,void ** func_ptr)84 bool DRMLibLoader::Sym(const char *func_name, void **func_ptr) {
85 if (lib_) {
86 *func_ptr = ::dlsym(lib_, func_name);
87 }
88
89 return (*func_ptr != nullptr);
90 }
91
92 } // namespace drm_utils
93