1 /*
2 BAREOS® - Backup Archiving REcovery Open Sourced
3
4 Copyright (C) 2018-2019 Bareos GmbH & Co. KG
5
6 This program is Free Software; you can redistribute it and/or
7 modify it under the terms of version three of the GNU Affero General Public
8 License as published by the Free Software Foundation and included
9 in the file LICENSE.
10
11 This program is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Affero General Public License for more details.
15
16 You should have received a copy of the GNU Affero General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301, USA.
20 */
21 #include "include/bareos.h"
22 #include "dird/dird.h"
23 #include "ndmp/smc.h"
24
25 namespace directordaemon {
26 /**
27 * calculate the element address for given slotnumber and slot_type
28 */
29 /* clang-format off */
GetElementAddressByBareosSlotNumber(smc_element_address_assignment * smc_elem_aa,slot_type_t slot_type,slot_number_t slotnumber)30 slot_number_t GetElementAddressByBareosSlotNumber(
31 smc_element_address_assignment* smc_elem_aa,
32 slot_type_t slot_type,
33 slot_number_t slotnumber)
34 {
35 slot_number_t calculated_slot;
36
37 switch (slot_type) {
38 case slot_type_t::kSlotTypeStorage:
39 if ((slotnumber > smc_elem_aa->se_count) ||
40 !IsSlotNumberValid(slotnumber)) {
41 calculated_slot = kInvalidSlotNumber;
42 } else {
43 calculated_slot = slotnumber
44 + smc_elem_aa->se_addr
45 - 1; // normal slots count start from 1
46 }
47 break;
48 case slot_type_t::kSlotTypeImport:
49 if ((slotnumber < (smc_elem_aa->se_count + 1)) ||
50 (slotnumber > (smc_elem_aa->se_count + smc_elem_aa->iee_count + 1))) {
51 calculated_slot = kInvalidSlotNumber;
52 } else {
53 calculated_slot = slotnumber
54 - smc_elem_aa->se_count // i/e slots follow after normal slots
55 + smc_elem_aa->iee_addr
56 - 1; // normal slots count start from 1
57 }
58 break;
59 case slot_type_t::kSlotTypePicker:
60 if ((slotnumber == kInvalidSlotNumber) ||
61 slotnumber > (smc_elem_aa->mte_count - 1)) {
62 calculated_slot = kInvalidSlotNumber;
63 } else {
64 calculated_slot = slotnumber
65 + smc_elem_aa->mte_addr;
66 }
67 break;
68 case slot_type_t::kSlotTypeDrive:
69 if ((slotnumber > (smc_elem_aa->dte_count) - 1) ||
70 (slotnumber == kInvalidSlotNumber)) {
71 calculated_slot = kInvalidSlotNumber;
72 } else {
73 calculated_slot = slotnumber
74 + smc_elem_aa->dte_addr;
75 }
76 break;
77 default:
78 case slot_type_t::kSlotTypeUnknown:
79 calculated_slot = kInvalidSlotNumber;
80 break;
81 }
82 return calculated_slot;
83 }
84
85 /**
86 * calculate the slotnumber for element address and slot_type
87 */
GetBareosSlotNumberByElementAddress(smc_element_address_assignment * smc_elem_aa,slot_type_t slot_type,slot_number_t element_addr)88 slot_number_t GetBareosSlotNumberByElementAddress(
89 smc_element_address_assignment* smc_elem_aa,
90 slot_type_t slot_type,
91 slot_number_t element_addr)
92 {
93 slot_number_t calculated_slot;
94
95 switch (slot_type) {
96 case slot_type_t::kSlotTypeStorage:
97 if (element_addr < smc_elem_aa->se_addr ||
98 (element_addr > smc_elem_aa->se_addr + smc_elem_aa->se_count - 1)) {
99 calculated_slot = kInvalidSlotNumber;
100 } else {
101 calculated_slot = element_addr
102 - smc_elem_aa->se_addr
103 + 1; // slots count start from 1
104 }
105 break;
106 case slot_type_t::kSlotTypeImport:
107 if ((element_addr < smc_elem_aa->iee_addr) ||
108 (element_addr > smc_elem_aa->iee_addr + smc_elem_aa->iee_count - 1)) {
109 calculated_slot = kInvalidSlotNumber;
110 } else {
111 calculated_slot = element_addr
112 + smc_elem_aa->se_count // i/e slots follow after normal slots
113 - smc_elem_aa->iee_addr
114 + 1; // slots count start from 1
115 }
116 break;
117 case slot_type_t::kSlotTypeDrive:
118 if ((element_addr < smc_elem_aa->dte_addr) ||
119 (element_addr > smc_elem_aa->dte_addr + smc_elem_aa->dte_count - 1)) {
120 calculated_slot = kInvalidSlotNumber;
121 } else {
122 calculated_slot = element_addr
123 - smc_elem_aa->dte_addr;
124 }
125 break;
126 case slot_type_t::kSlotTypePicker:
127 calculated_slot = element_addr
128 - smc_elem_aa->mte_addr;
129 break;
130 default:
131 case slot_type_t::kSlotTypeUnknown:
132 calculated_slot = kInvalidSlotNumber;
133 break;
134 }
135 return calculated_slot;
136 }
137 /* clang-format on */
138
139 } /* namespace directordaemon */
140