blob: 0f3db559fc2221e40082abd7b9616af3ace90398 (
plain)
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
|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#ifndef __INFO_H_
#define __INFO_H_
#include "error_codes.h"
#include "header.h"
// bundle::info supports:
// * API for identification of a single-file app bundle, and
// * Minimal probing and mapping functionality only for the app.runtimeconfig.json and app.deps.json files.
// bundle::info is used by HostFxr to read the above config files.
namespace bundle
{
struct info_t
{
struct config_t
{
config_t()
: m_location(nullptr) {}
config_t(const config_t& config)
{
m_path = config.m_path;
m_location = config.m_location;
}
config_t(const pal::string_t& path, const location_t *location=nullptr)
{
m_path = path;
m_location = location;
}
bool matches(const pal::string_t& path) const
{
return m_location->is_valid() && path.compare(m_path) == 0;
}
static bool probe(const pal::string_t& path)
{
return is_single_file_bundle() &&
(the_app->m_deps_json.matches(path) || the_app->m_runtimeconfig_json.matches(path));
}
void set_location(const location_t* location)
{
m_location = location;
}
static char* map(const pal::string_t& path, const location_t* &location);
static void unmap(const char* addr, const location_t* location);
private:
pal::string_t m_path;
const location_t *m_location;
};
static StatusCode process_bundle(const pal::char_t* bundle_path, const pal::char_t *app_path, int64_t header_offset);
static bool is_single_file_bundle() { return the_app != nullptr; }
bool is_netcoreapp3_compat_mode() const { return m_header.is_netcoreapp3_compat_mode(); }
const pal::string_t& base_path() const { return m_base_path; }
int64_t header_offset() const { return m_header_offset; }
// Global single-file info object
static const info_t* the_app;
protected:
info_t(const pal::char_t* bundle_path,
const pal::char_t* app_path,
int64_t header_offset);
const char* map_bundle();
void unmap_bundle(const char* addr) const;
pal::string_t m_bundle_path;
pal::string_t m_base_path;
size_t m_bundle_size;
int64_t m_header_offset;
header_t m_header;
config_t m_deps_json;
config_t m_runtimeconfig_json;
private:
StatusCode process_header();
};
}
#endif // __INFO_H_
|