1*7917SReza.Sabdar@Sun.COM /*
2*7917SReza.Sabdar@Sun.COM * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
3*7917SReza.Sabdar@Sun.COM * Use is subject to license terms.
4*7917SReza.Sabdar@Sun.COM */
5*7917SReza.Sabdar@Sun.COM
6*7917SReza.Sabdar@Sun.COM /*
7*7917SReza.Sabdar@Sun.COM * BSD 3 Clause License
8*7917SReza.Sabdar@Sun.COM *
9*7917SReza.Sabdar@Sun.COM * Copyright (c) 2007, The Storage Networking Industry Association.
10*7917SReza.Sabdar@Sun.COM *
11*7917SReza.Sabdar@Sun.COM * Redistribution and use in source and binary forms, with or without
12*7917SReza.Sabdar@Sun.COM * modification, are permitted provided that the following conditions
13*7917SReza.Sabdar@Sun.COM * are met:
14*7917SReza.Sabdar@Sun.COM * - Redistributions of source code must retain the above copyright
15*7917SReza.Sabdar@Sun.COM * notice, this list of conditions and the following disclaimer.
16*7917SReza.Sabdar@Sun.COM *
17*7917SReza.Sabdar@Sun.COM * - Redistributions in binary form must reproduce the above copyright
18*7917SReza.Sabdar@Sun.COM * notice, this list of conditions and the following disclaimer in
19*7917SReza.Sabdar@Sun.COM * the documentation and/or other materials provided with the
20*7917SReza.Sabdar@Sun.COM * distribution.
21*7917SReza.Sabdar@Sun.COM *
22*7917SReza.Sabdar@Sun.COM * - Neither the name of The Storage Networking Industry Association (SNIA)
23*7917SReza.Sabdar@Sun.COM * nor the names of its contributors may be used to endorse or promote
24*7917SReza.Sabdar@Sun.COM * products derived from this software without specific prior written
25*7917SReza.Sabdar@Sun.COM * permission.
26*7917SReza.Sabdar@Sun.COM *
27*7917SReza.Sabdar@Sun.COM * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
28*7917SReza.Sabdar@Sun.COM * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29*7917SReza.Sabdar@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30*7917SReza.Sabdar@Sun.COM * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
31*7917SReza.Sabdar@Sun.COM * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32*7917SReza.Sabdar@Sun.COM * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33*7917SReza.Sabdar@Sun.COM * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34*7917SReza.Sabdar@Sun.COM * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35*7917SReza.Sabdar@Sun.COM * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36*7917SReza.Sabdar@Sun.COM * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37*7917SReza.Sabdar@Sun.COM * POSSIBILITY OF SUCH DAMAGE.
38*7917SReza.Sabdar@Sun.COM */
39*7917SReza.Sabdar@Sun.COM #include <stdlib.h>
40*7917SReza.Sabdar@Sun.COM #include "tlm.h"
41*7917SReza.Sabdar@Sun.COM #include "tlm_proto.h"
42*7917SReza.Sabdar@Sun.COM #include <sys/errno.h>
43*7917SReza.Sabdar@Sun.COM
44*7917SReza.Sabdar@Sun.COM
45*7917SReza.Sabdar@Sun.COM extern tlm_chain_link_t *tlm_un_ref(tlm_chain_link_t *old_top,
46*7917SReza.Sabdar@Sun.COM tlm_chain_link_t *link);
47*7917SReza.Sabdar@Sun.COM
48*7917SReza.Sabdar@Sun.COM static tlm_info_t tlm_info;
49*7917SReza.Sabdar@Sun.COM
50*7917SReza.Sabdar@Sun.COM /*
51*7917SReza.Sabdar@Sun.COM * Mutex for concurrent access to job_stats
52*7917SReza.Sabdar@Sun.COM */
53*7917SReza.Sabdar@Sun.COM mutex_t jstat_mtx;
54*7917SReza.Sabdar@Sun.COM
55*7917SReza.Sabdar@Sun.COM
56*7917SReza.Sabdar@Sun.COM /*
57*7917SReza.Sabdar@Sun.COM * get the number of libraries
58*7917SReza.Sabdar@Sun.COM */
59*7917SReza.Sabdar@Sun.COM int
tlm_library_count(void)60*7917SReza.Sabdar@Sun.COM tlm_library_count(void)
61*7917SReza.Sabdar@Sun.COM {
62*7917SReza.Sabdar@Sun.COM int lib;
63*7917SReza.Sabdar@Sun.COM tlm_library_t *library;
64*7917SReza.Sabdar@Sun.COM
65*7917SReza.Sabdar@Sun.COM for (lib = 1; lib <= tlm_info.ti_library_count; lib++) {
66*7917SReza.Sabdar@Sun.COM library = tlm_library(lib);
67*7917SReza.Sabdar@Sun.COM if (library != NULL &&
68*7917SReza.Sabdar@Sun.COM library->tl_drive_count == 0) {
69*7917SReza.Sabdar@Sun.COM return (0);
70*7917SReza.Sabdar@Sun.COM }
71*7917SReza.Sabdar@Sun.COM }
72*7917SReza.Sabdar@Sun.COM return (tlm_info.ti_library_count);
73*7917SReza.Sabdar@Sun.COM }
74*7917SReza.Sabdar@Sun.COM
75*7917SReza.Sabdar@Sun.COM /*
76*7917SReza.Sabdar@Sun.COM * get the library whose number matches
77*7917SReza.Sabdar@Sun.COM */
78*7917SReza.Sabdar@Sun.COM tlm_library_t *
tlm_library(int lib)79*7917SReza.Sabdar@Sun.COM tlm_library(int lib)
80*7917SReza.Sabdar@Sun.COM {
81*7917SReza.Sabdar@Sun.COM tlm_library_t *library = tlm_info.ti_library;
82*7917SReza.Sabdar@Sun.COM while (library != NULL) {
83*7917SReza.Sabdar@Sun.COM if (library->tl_number == lib) {
84*7917SReza.Sabdar@Sun.COM return (library);
85*7917SReza.Sabdar@Sun.COM }
86*7917SReza.Sabdar@Sun.COM library = library->tl_next;
87*7917SReza.Sabdar@Sun.COM }
88*7917SReza.Sabdar@Sun.COM errno = TLM_ERROR_RANGE;
89*7917SReza.Sabdar@Sun.COM return (NULL);
90*7917SReza.Sabdar@Sun.COM }
91*7917SReza.Sabdar@Sun.COM
92*7917SReza.Sabdar@Sun.COM /*
93*7917SReza.Sabdar@Sun.COM * get the info about this drive
94*7917SReza.Sabdar@Sun.COM */
95*7917SReza.Sabdar@Sun.COM tlm_drive_t *
tlm_drive(int lib,int drv)96*7917SReza.Sabdar@Sun.COM tlm_drive(int lib, int drv)
97*7917SReza.Sabdar@Sun.COM {
98*7917SReza.Sabdar@Sun.COM tlm_drive_t *drive;
99*7917SReza.Sabdar@Sun.COM tlm_library_t *library = tlm_library(lib);
100*7917SReza.Sabdar@Sun.COM
101*7917SReza.Sabdar@Sun.COM if (library == NULL) {
102*7917SReza.Sabdar@Sun.COM return (NULL);
103*7917SReza.Sabdar@Sun.COM }
104*7917SReza.Sabdar@Sun.COM drive = library->tl_drive;
105*7917SReza.Sabdar@Sun.COM while (drive != NULL) {
106*7917SReza.Sabdar@Sun.COM if (drv == drive->td_number) {
107*7917SReza.Sabdar@Sun.COM return (drive);
108*7917SReza.Sabdar@Sun.COM }
109*7917SReza.Sabdar@Sun.COM drive = drive->td_next;
110*7917SReza.Sabdar@Sun.COM }
111*7917SReza.Sabdar@Sun.COM return (NULL);
112*7917SReza.Sabdar@Sun.COM }
113*7917SReza.Sabdar@Sun.COM
114*7917SReza.Sabdar@Sun.COM /*
115*7917SReza.Sabdar@Sun.COM * get the info about this slot
116*7917SReza.Sabdar@Sun.COM */
117*7917SReza.Sabdar@Sun.COM tlm_slot_t *
tlm_slot(int lib,int slt)118*7917SReza.Sabdar@Sun.COM tlm_slot(int lib, int slt)
119*7917SReza.Sabdar@Sun.COM {
120*7917SReza.Sabdar@Sun.COM tlm_slot_t *slot = NULL;
121*7917SReza.Sabdar@Sun.COM tlm_library_t *library = tlm_library(lib);
122*7917SReza.Sabdar@Sun.COM
123*7917SReza.Sabdar@Sun.COM if (library != NULL)
124*7917SReza.Sabdar@Sun.COM slot = library->tl_slot;
125*7917SReza.Sabdar@Sun.COM while (slot != NULL) {
126*7917SReza.Sabdar@Sun.COM if (slt == slot->ts_number) {
127*7917SReza.Sabdar@Sun.COM return (slot);
128*7917SReza.Sabdar@Sun.COM }
129*7917SReza.Sabdar@Sun.COM slot = slot->ts_next;
130*7917SReza.Sabdar@Sun.COM }
131*7917SReza.Sabdar@Sun.COM return (NULL);
132*7917SReza.Sabdar@Sun.COM }
133*7917SReza.Sabdar@Sun.COM
134*7917SReza.Sabdar@Sun.COM /*
135*7917SReza.Sabdar@Sun.COM * add a link to the INFO chain
136*7917SReza.Sabdar@Sun.COM */
137*7917SReza.Sabdar@Sun.COM tlm_job_stats_t *
tlm_new_job_stats(char * name)138*7917SReza.Sabdar@Sun.COM tlm_new_job_stats(char *name)
139*7917SReza.Sabdar@Sun.COM {
140*7917SReza.Sabdar@Sun.COM tlm_chain_link_t *new_link;
141*7917SReza.Sabdar@Sun.COM tlm_job_stats_t *job_stats;
142*7917SReza.Sabdar@Sun.COM
143*7917SReza.Sabdar@Sun.COM new_link = ndmp_malloc(sizeof (tlm_chain_link_t));
144*7917SReza.Sabdar@Sun.COM if (new_link == 0)
145*7917SReza.Sabdar@Sun.COM return (0);
146*7917SReza.Sabdar@Sun.COM
147*7917SReza.Sabdar@Sun.COM job_stats = ndmp_malloc(sizeof (tlm_job_stats_t));
148*7917SReza.Sabdar@Sun.COM if (job_stats == 0) {
149*7917SReza.Sabdar@Sun.COM free(new_link);
150*7917SReza.Sabdar@Sun.COM return (0);
151*7917SReza.Sabdar@Sun.COM }
152*7917SReza.Sabdar@Sun.COM
153*7917SReza.Sabdar@Sun.COM new_link->tc_ref_count = 1;
154*7917SReza.Sabdar@Sun.COM new_link->tc_data = (void *)job_stats;
155*7917SReza.Sabdar@Sun.COM (void) strlcpy(job_stats->js_job_name, name, TLM_MAX_BACKUP_JOB_NAME);
156*7917SReza.Sabdar@Sun.COM
157*7917SReza.Sabdar@Sun.COM (void) mutex_lock(&jstat_mtx);
158*7917SReza.Sabdar@Sun.COM if (tlm_info.ti_job_stats == 0) {
159*7917SReza.Sabdar@Sun.COM new_link->tc_next = new_link;
160*7917SReza.Sabdar@Sun.COM new_link->tc_prev = new_link;
161*7917SReza.Sabdar@Sun.COM } else {
162*7917SReza.Sabdar@Sun.COM tlm_chain_link_t *next_link = tlm_info.ti_job_stats;
163*7917SReza.Sabdar@Sun.COM tlm_chain_link_t *prev_link = next_link->tc_prev;
164*7917SReza.Sabdar@Sun.COM
165*7917SReza.Sabdar@Sun.COM new_link->tc_next = next_link;
166*7917SReza.Sabdar@Sun.COM new_link->tc_prev = prev_link;
167*7917SReza.Sabdar@Sun.COM prev_link->tc_next = new_link;
168*7917SReza.Sabdar@Sun.COM next_link->tc_prev = new_link;
169*7917SReza.Sabdar@Sun.COM }
170*7917SReza.Sabdar@Sun.COM tlm_info.ti_job_stats = new_link;
171*7917SReza.Sabdar@Sun.COM (void) mutex_unlock(&jstat_mtx);
172*7917SReza.Sabdar@Sun.COM
173*7917SReza.Sabdar@Sun.COM return (job_stats);
174*7917SReza.Sabdar@Sun.COM }
175*7917SReza.Sabdar@Sun.COM
176*7917SReza.Sabdar@Sun.COM /*
177*7917SReza.Sabdar@Sun.COM * make sure this Job Stats buffer is not deleted while we use it
178*7917SReza.Sabdar@Sun.COM */
179*7917SReza.Sabdar@Sun.COM tlm_job_stats_t *
tlm_ref_job_stats(char * name)180*7917SReza.Sabdar@Sun.COM tlm_ref_job_stats(char *name)
181*7917SReza.Sabdar@Sun.COM {
182*7917SReza.Sabdar@Sun.COM static tlm_job_stats_t fake_job_stats;
183*7917SReza.Sabdar@Sun.COM tlm_chain_link_t *link;
184*7917SReza.Sabdar@Sun.COM
185*7917SReza.Sabdar@Sun.COM (void) mutex_lock(&jstat_mtx);
186*7917SReza.Sabdar@Sun.COM link = tlm_info.ti_job_stats;
187*7917SReza.Sabdar@Sun.COM if (link == 0) {
188*7917SReza.Sabdar@Sun.COM /*
189*7917SReza.Sabdar@Sun.COM * our tables are empty
190*7917SReza.Sabdar@Sun.COM */
191*7917SReza.Sabdar@Sun.COM (void) mutex_unlock(&jstat_mtx);
192*7917SReza.Sabdar@Sun.COM return (&fake_job_stats);
193*7917SReza.Sabdar@Sun.COM }
194*7917SReza.Sabdar@Sun.COM
195*7917SReza.Sabdar@Sun.COM do {
196*7917SReza.Sabdar@Sun.COM tlm_job_stats_t *job_stats;
197*7917SReza.Sabdar@Sun.COM job_stats = (tlm_job_stats_t *)link->tc_data;
198*7917SReza.Sabdar@Sun.COM
199*7917SReza.Sabdar@Sun.COM if (strcmp(job_stats->js_job_name, name) == 0) {
200*7917SReza.Sabdar@Sun.COM link->tc_ref_count++;
201*7917SReza.Sabdar@Sun.COM (void) mutex_unlock(&jstat_mtx);
202*7917SReza.Sabdar@Sun.COM return (job_stats);
203*7917SReza.Sabdar@Sun.COM }
204*7917SReza.Sabdar@Sun.COM link = link->tc_next;
205*7917SReza.Sabdar@Sun.COM } while (link != tlm_info.ti_job_stats);
206*7917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG,
207*7917SReza.Sabdar@Sun.COM "TAPE BACKUP> Ref for job [%s] was not found", name);
208*7917SReza.Sabdar@Sun.COM (void) mutex_unlock(&jstat_mtx);
209*7917SReza.Sabdar@Sun.COM
210*7917SReza.Sabdar@Sun.COM return (&fake_job_stats);
211*7917SReza.Sabdar@Sun.COM }
212*7917SReza.Sabdar@Sun.COM
213*7917SReza.Sabdar@Sun.COM /*
214*7917SReza.Sabdar@Sun.COM * remove a link to the INFO chain
215*7917SReza.Sabdar@Sun.COM */
216*7917SReza.Sabdar@Sun.COM void
tlm_un_ref_job_stats(char * name)217*7917SReza.Sabdar@Sun.COM tlm_un_ref_job_stats(char *name)
218*7917SReza.Sabdar@Sun.COM {
219*7917SReza.Sabdar@Sun.COM tlm_chain_link_t *link;
220*7917SReza.Sabdar@Sun.COM
221*7917SReza.Sabdar@Sun.COM (void) mutex_lock(&jstat_mtx);
222*7917SReza.Sabdar@Sun.COM link = tlm_info.ti_job_stats;
223*7917SReza.Sabdar@Sun.COM if (link == 0) {
224*7917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "TAPE BACKUP>"
225*7917SReza.Sabdar@Sun.COM " Internal error for job [%s], could not delete", name);
226*7917SReza.Sabdar@Sun.COM return;
227*7917SReza.Sabdar@Sun.COM }
228*7917SReza.Sabdar@Sun.COM do {
229*7917SReza.Sabdar@Sun.COM tlm_job_stats_t *job_stats;
230*7917SReza.Sabdar@Sun.COM job_stats = (tlm_job_stats_t *)link->tc_data;
231*7917SReza.Sabdar@Sun.COM
232*7917SReza.Sabdar@Sun.COM if (strcmp(job_stats->js_job_name, name) == 0) {
233*7917SReza.Sabdar@Sun.COM tlm_info.ti_job_stats =
234*7917SReza.Sabdar@Sun.COM tlm_un_ref(tlm_info.ti_job_stats, link);
235*7917SReza.Sabdar@Sun.COM (void) mutex_unlock(&jstat_mtx);
236*7917SReza.Sabdar@Sun.COM return;
237*7917SReza.Sabdar@Sun.COM }
238*7917SReza.Sabdar@Sun.COM link = link->tc_next;
239*7917SReza.Sabdar@Sun.COM } while (link != tlm_info.ti_job_stats);
240*7917SReza.Sabdar@Sun.COM (void) mutex_unlock(&jstat_mtx);
241*7917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG,
242*7917SReza.Sabdar@Sun.COM "TAPE BACKUP> Delete for job [%s] was not found", name);
243*7917SReza.Sabdar@Sun.COM }
244*7917SReza.Sabdar@Sun.COM
245*7917SReza.Sabdar@Sun.COM /*
246*7917SReza.Sabdar@Sun.COM * one party does not care about this blob, can we let it go?
247*7917SReza.Sabdar@Sun.COM */
248*7917SReza.Sabdar@Sun.COM tlm_chain_link_t *
tlm_un_ref(tlm_chain_link_t * old_top,tlm_chain_link_t * link)249*7917SReza.Sabdar@Sun.COM tlm_un_ref(tlm_chain_link_t *old_top, tlm_chain_link_t *link)
250*7917SReza.Sabdar@Sun.COM {
251*7917SReza.Sabdar@Sun.COM tlm_chain_link_t *chain_link = old_top;
252*7917SReza.Sabdar@Sun.COM tlm_chain_link_t *new_top;
253*7917SReza.Sabdar@Sun.COM
254*7917SReza.Sabdar@Sun.COM /*
255*7917SReza.Sabdar@Sun.COM * count down the number of
256*7917SReza.Sabdar@Sun.COM * interested parties for this blob
257*7917SReza.Sabdar@Sun.COM */
258*7917SReza.Sabdar@Sun.COM link->tc_ref_count--;
259*7917SReza.Sabdar@Sun.COM if (link->tc_ref_count > 0) {
260*7917SReza.Sabdar@Sun.COM /*
261*7917SReza.Sabdar@Sun.COM * there is still interest in this blob,
262*7917SReza.Sabdar@Sun.COM * no change yet
263*7917SReza.Sabdar@Sun.COM *
264*7917SReza.Sabdar@Sun.COM * returning "old_top" means there is no change in the links
265*7917SReza.Sabdar@Sun.COM */
266*7917SReza.Sabdar@Sun.COM return (old_top);
267*7917SReza.Sabdar@Sun.COM }
268*7917SReza.Sabdar@Sun.COM
269*7917SReza.Sabdar@Sun.COM /*
270*7917SReza.Sabdar@Sun.COM * no one cares about this data anymore
271*7917SReza.Sabdar@Sun.COM * find out how to delete it
272*7917SReza.Sabdar@Sun.COM */
273*7917SReza.Sabdar@Sun.COM do {
274*7917SReza.Sabdar@Sun.COM if (chain_link == link) {
275*7917SReza.Sabdar@Sun.COM tlm_chain_link_t *next;
276*7917SReza.Sabdar@Sun.COM tlm_chain_link_t *prev;
277*7917SReza.Sabdar@Sun.COM
278*7917SReza.Sabdar@Sun.COM /*
279*7917SReza.Sabdar@Sun.COM * If there are one or two elements in the list, then
280*7917SReza.Sabdar@Sun.COM * the prev and next pointers point to one element in
281*7917SReza.Sabdar@Sun.COM * the list, the element itself and the other element
282*7917SReza.Sabdar@Sun.COM * correspondingly. So we must distinguish if there
283*7917SReza.Sabdar@Sun.COM * are only one or two elements in the list. If
284*7917SReza.Sabdar@Sun.COM * either of the 'prev' or 'next' pointers point to
285*7917SReza.Sabdar@Sun.COM * the link itself, then we have only one element in
286*7917SReza.Sabdar@Sun.COM * the list.
287*7917SReza.Sabdar@Sun.COM */
288*7917SReza.Sabdar@Sun.COM if (link->tc_next == link->tc_prev &&
289*7917SReza.Sabdar@Sun.COM link->tc_next == link) {
290*7917SReza.Sabdar@Sun.COM /*
291*7917SReza.Sabdar@Sun.COM * there is only this one link in the chain
292*7917SReza.Sabdar@Sun.COM * delete this and the chain is empty
293*7917SReza.Sabdar@Sun.COM */
294*7917SReza.Sabdar@Sun.COM new_top = 0;
295*7917SReza.Sabdar@Sun.COM } else {
296*7917SReza.Sabdar@Sun.COM new_top = link->tc_next;
297*7917SReza.Sabdar@Sun.COM }
298*7917SReza.Sabdar@Sun.COM next = link->tc_next;
299*7917SReza.Sabdar@Sun.COM prev = link->tc_prev;
300*7917SReza.Sabdar@Sun.COM prev->tc_next = next;
301*7917SReza.Sabdar@Sun.COM next->tc_prev = prev;
302*7917SReza.Sabdar@Sun.COM free(link->tc_data);
303*7917SReza.Sabdar@Sun.COM free(link);
304*7917SReza.Sabdar@Sun.COM return (new_top);
305*7917SReza.Sabdar@Sun.COM }
306*7917SReza.Sabdar@Sun.COM chain_link = chain_link->tc_next;
307*7917SReza.Sabdar@Sun.COM } while (chain_link != old_top);
308*7917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "TAPE BACKUP> un_ref target not found.");
309*7917SReza.Sabdar@Sun.COM return (old_top);
310*7917SReza.Sabdar@Sun.COM }
311*7917SReza.Sabdar@Sun.COM
312*7917SReza.Sabdar@Sun.COM /*
313*7917SReza.Sabdar@Sun.COM * the following section is global, but not really part of the
314*7917SReza.Sabdar@Sun.COM * public interface. Use of this outside of the tlm_*.c files
315*7917SReza.Sabdar@Sun.COM * is for special cases only.
316*7917SReza.Sabdar@Sun.COM */
317*7917SReza.Sabdar@Sun.COM
318*7917SReza.Sabdar@Sun.COM /*
319*7917SReza.Sabdar@Sun.COM * add a new tape library data blob to the list of libraries
320*7917SReza.Sabdar@Sun.COM * returns the new tape library data blob just created
321*7917SReza.Sabdar@Sun.COM */
322*7917SReza.Sabdar@Sun.COM int
tlm_insert_new_library(scsi_link_t * slink)323*7917SReza.Sabdar@Sun.COM tlm_insert_new_library(scsi_link_t *slink)
324*7917SReza.Sabdar@Sun.COM {
325*7917SReza.Sabdar@Sun.COM tlm_library_t **p_library = &tlm_info.ti_library;
326*7917SReza.Sabdar@Sun.COM tlm_library_t *library = ndmp_malloc(sizeof (tlm_library_t));
327*7917SReza.Sabdar@Sun.COM
328*7917SReza.Sabdar@Sun.COM while (*p_library != NULL) {
329*7917SReza.Sabdar@Sun.COM p_library = &(*p_library)->tl_next;
330*7917SReza.Sabdar@Sun.COM }
331*7917SReza.Sabdar@Sun.COM tlm_info.ti_library_count++;
332*7917SReza.Sabdar@Sun.COM library->tl_number = tlm_info.ti_library_count;
333*7917SReza.Sabdar@Sun.COM library->tl_slink = slink;
334*7917SReza.Sabdar@Sun.COM library->tl_capability_robot = TRUE;
335*7917SReza.Sabdar@Sun.COM *p_library = library;
336*7917SReza.Sabdar@Sun.COM return (library->tl_number);
337*7917SReza.Sabdar@Sun.COM }
338*7917SReza.Sabdar@Sun.COM
339*7917SReza.Sabdar@Sun.COM /*
340*7917SReza.Sabdar@Sun.COM * add a new tape drive data blob to the list of drives in a library
341*7917SReza.Sabdar@Sun.COM * returns the new tape drive data blob just created
342*7917SReza.Sabdar@Sun.COM */
343*7917SReza.Sabdar@Sun.COM int
tlm_insert_new_drive(int lib)344*7917SReza.Sabdar@Sun.COM tlm_insert_new_drive(int lib)
345*7917SReza.Sabdar@Sun.COM {
346*7917SReza.Sabdar@Sun.COM tlm_library_t *library = tlm_library(lib);
347*7917SReza.Sabdar@Sun.COM tlm_drive_t *drive = ndmp_malloc(sizeof (tlm_drive_t));
348*7917SReza.Sabdar@Sun.COM tlm_drive_t **p_drive = &library->tl_drive;
349*7917SReza.Sabdar@Sun.COM
350*7917SReza.Sabdar@Sun.COM while (*p_drive != NULL) {
351*7917SReza.Sabdar@Sun.COM p_drive = &(*p_drive)->td_next;
352*7917SReza.Sabdar@Sun.COM }
353*7917SReza.Sabdar@Sun.COM library->tl_drive_count++;
354*7917SReza.Sabdar@Sun.COM library->tl_capability_drives = TRUE;
355*7917SReza.Sabdar@Sun.COM
356*7917SReza.Sabdar@Sun.COM drive->td_library = library;
357*7917SReza.Sabdar@Sun.COM drive->td_number = library->tl_drive_count;
358*7917SReza.Sabdar@Sun.COM *p_drive = drive;
359*7917SReza.Sabdar@Sun.COM return (drive->td_number);
360*7917SReza.Sabdar@Sun.COM }
361*7917SReza.Sabdar@Sun.COM
362*7917SReza.Sabdar@Sun.COM /*
363*7917SReza.Sabdar@Sun.COM * add a new tape slot data blob to the list of slots in a library
364*7917SReza.Sabdar@Sun.COM * returns the new tape slot data blob just created
365*7917SReza.Sabdar@Sun.COM */
366*7917SReza.Sabdar@Sun.COM int
tlm_insert_new_slot(int lib)367*7917SReza.Sabdar@Sun.COM tlm_insert_new_slot(int lib)
368*7917SReza.Sabdar@Sun.COM {
369*7917SReza.Sabdar@Sun.COM tlm_library_t *library = tlm_library(lib);
370*7917SReza.Sabdar@Sun.COM tlm_slot_t *slot = ndmp_malloc(sizeof (tlm_slot_t));
371*7917SReza.Sabdar@Sun.COM tlm_slot_t **p_slot = &library->tl_slot;
372*7917SReza.Sabdar@Sun.COM
373*7917SReza.Sabdar@Sun.COM while (*p_slot != NULL) {
374*7917SReza.Sabdar@Sun.COM p_slot = &(*p_slot)->ts_next;
375*7917SReza.Sabdar@Sun.COM }
376*7917SReza.Sabdar@Sun.COM library->tl_slot_count++;
377*7917SReza.Sabdar@Sun.COM library->tl_capability_slots = TRUE;
378*7917SReza.Sabdar@Sun.COM
379*7917SReza.Sabdar@Sun.COM slot->ts_library = library;
380*7917SReza.Sabdar@Sun.COM slot->ts_number = library->tl_slot_count;
381*7917SReza.Sabdar@Sun.COM *p_slot = slot;
382*7917SReza.Sabdar@Sun.COM return (slot->ts_number);
383*7917SReza.Sabdar@Sun.COM }
384