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