File: load_modules.cpp

package info (click to toggle)
uhd 4.8.0.0%2Bds1-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 183,172 kB
  • sloc: cpp: 279,415; python: 109,850; ansic: 103,348; vhdl: 57,230; tcl: 20,007; xml: 8,581; makefile: 2,863; sh: 2,797; pascal: 230; javascript: 120; csh: 94; asm: 20; perl: 11
file content (132 lines) | stat: -rw-r--r-- 3,639 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//
// Copyright 2010-2011 Ettus Research LLC
// Copyright 2018 Ettus Research, a National Instruments Company
//
// SPDX-License-Identifier: GPL-3.0-or-later
//

#include <uhd/exception.hpp>
#include <uhd/utils/paths.hpp>
#include <uhd/utils/static.hpp>
#include <uhdlib/utils/paths.hpp>
#include <boost/filesystem.hpp>
#include <boost/format.hpp>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>

namespace fs = boost::filesystem;

/***********************************************************************
 * Module Load Function
 **********************************************************************/
#ifdef HAVE_DLOPEN
#    include <dlfcn.h>
static void load_module(const std::string& file_name)
{
    if (dlopen(file_name.c_str(), RTLD_LAZY) == NULL) {
        throw uhd::os_error(
            str(boost::format("dlopen failed to load \"%s\"") % file_name));
    }
}
#endif /* HAVE_DLOPEN */


#ifdef HAVE_LOAD_LIBRARY
#    include <windows.h>
static void load_module(const std::string& file_name)
{
    if (LoadLibrary(file_name.c_str()) == NULL) {
        throw uhd::os_error(
            str(boost::format("LoadLibrary failed to load \"%s\"") % file_name));
    }
}
#endif /* HAVE_LOAD_LIBRARY */


#ifdef HAVE_LOAD_MODULES_DUMMY
static void load_module(const std::string& file_name)
{
    throw uhd::not_implemented_error(str(
        boost::format("Module loading not supported: Cannot load \"%s\"") % file_name));
}
#endif /* HAVE_LOAD_MODULES_DUMMY */

/***********************************************************************
 * Load Modules
 **********************************************************************/
/*!
 * Load all modules in a given path.
 * This will recurse into sub-directories.
 * Does not throw, prints to std error.
 * \param path the filesystem path
 */
static void load_module_path(const fs::path& path)
{
    if (not fs::exists(path)) {
        // std::cerr << boost::format("Module path \"%s\" not found.") % path.string() <<
        // std::endl;
        return;
    }

    // try to load the files in this path
    if (fs::is_directory(path)) {
        for (fs::directory_iterator dir_itr(path); dir_itr != fs::directory_iterator();
             ++dir_itr) {
            load_module_path(dir_itr->path());
        }
        return;
    }

    // its not a directory, try to load it
    try {
        load_module(path.string());
    } catch (const std::exception& err) {
        std::cerr << boost::format("Error: %s") % err.what() << std::endl;
    }
}

namespace {

// Load all modules listed in a given directory.
//
// This will:
// - Open each file in the directory
// - Read each line from the file
// - Load the module named by each line
void load_module_d_path(const fs::path& path)
{
    for (fs::directory_iterator dir_itr(path); dir_itr != fs::directory_iterator();
         ++dir_itr) {
        if (fs::is_regular_file(dir_itr->path())) {
            // read file into lines
            std::ifstream file(dir_itr->path().string().c_str());
            std::string line;
            while (std::getline(file, line)) {
                if (line.empty() or line[0] == '#') {
                    continue;
                }
                load_module(line);
            }
        }
    }
}

} /* anonymous namespace */


/*!
 * Load all the modules given in the module paths.
 */
UHD_STATIC_BLOCK(load_modules)
{
    for (const fs::path& path : uhd::get_module_paths()) {
        load_module_path(path);
    }
    for (const fs::path& path : uhd::get_module_d_paths()) {
        if (fs::is_directory(path)) {
            load_module_d_path(path);
        }
    }
}