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