2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
10 /* procedures invoked by the rpc stub */
12 #include <afsconfig.h>
13 #include <afs/param.h>
18 #include <sys/types.h>
24 #include <netinet/in.h>
28 #include <afs/afsint.h>
30 #include <afs/procmgmt.h>
31 #include <afs/assert.h>
32 #include <afs/prs_fs.h>
38 #include <afs/cellconfig.h>
41 #include <afs/tcdata.h>
42 #include "error_macros.h"
43 #include "butc_xbsa.h"
48 /* before this code can be used, the rx connection, on the bucoord side, must */
49 /* be changed so that it will set up for token passing instead of using a */
50 /* simple rx connection that, below, returns a value of 0 from rx_SecurityClassOf */
54 /* -------------------------
55 * butc - interface routines - alphabetic order
56 * -------------------------
60 STC_LabelTape(acid, label, taskId)
62 struct tc_tapeLabel *label;
65 #ifdef AFS_PTHREAD_ENV
72 struct labelTapeIf *ptr;
76 extern int Labeller();
77 extern statusP createStatusNode();
78 extern afs_int32 allocTaskId();
82 return (TC_BADTASK); /* LabelTape does not apply if XBSA */
85 if (callPermitted(acid) == 0)
86 return (TC_NOTPERMITTED);
88 ptr = (struct labelTapeIf *)malloc(sizeof(*ptr));
90 ERROR_EXIT(TC_NOMEMORY);
91 memcpy(&ptr->label, label, sizeof(ptr->label));
93 /* set up the status node */
94 *taskId = allocTaskId(); /* for bucoord */
95 ptr->taskId = *taskId;
97 statusPtr = createStatusNode();
99 ERROR_EXIT(TC_INTERNALERROR);
102 statusPtr->taskId = *taskId;
103 statusPtr->lastPolled = time(0);
104 statusPtr->flags &= ~STARTING; /* ok to examine */
105 strncpy(statusPtr->taskName, "Labeltape", sizeof(statusPtr->taskName));
108 /* create the LWP to do the real work behind the scenes */
109 #ifdef AFS_PTHREAD_ENV
110 code = pthread_attr_init(&tattr);
114 code = pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
119 code = pthread_create(&pid, &tattr, Labeller, ptr);
120 AFS_SIGSET_RESTORE();
123 LWP_CreateProcess(Labeller, 32768, 1, (void *)ptr, "labeller process",
130 deleteStatusNode(statusPtr);
139 * Tape coordinator server routine to do a dump
143 STC_PerformDump(rxCallId, tcdiPtr, tc_dumpArrayPtr, taskId)
144 struct rx_call *rxCallId;
145 struct tc_dumpInterface *tcdiPtr;
146 tc_dumpArray *tc_dumpArrayPtr;
149 struct dumpNode *newNode = 0;
150 statusP statusPtr = 0;
151 #ifdef AFS_PTHREAD_ENV
153 pthread_attr_t tattr;
160 extern statusP createStatusNode();
163 if (callPermitted(rxCallId) == 0)
164 return (TC_NOTPERMITTED);
166 /* should be verifying parameter validity */
169 /* this creates a node in list, alots an id for it and prepares it for locking */
170 CreateNode(&newNode);
172 /*set up the parameters in the node, to be used by LWP */
173 strcpy(newNode->dumpSetName, tcdiPtr->dumpName);
175 newNode->dumpName = (char *)malloc(strlen(tcdiPtr->dumpPath) + 1);
176 strcpy(newNode->dumpName, tcdiPtr->dumpPath);
178 newNode->volumeSetName =
179 (char *)malloc(strlen(tcdiPtr->volumeSetName) + 1);
180 strcpy(newNode->volumeSetName, tcdiPtr->volumeSetName);
182 CopyTapeSetDesc(&(newNode->tapeSetDesc), &tcdiPtr->tapeSet);
184 newNode->dumps = (struct tc_dumpDesc *)
185 malloc(sizeof(struct tc_dumpDesc) *
186 tc_dumpArrayPtr->tc_dumpArray_len);
187 newNode->arraySize = tc_dumpArrayPtr->tc_dumpArray_len;
188 CopyDumpDesc(newNode->dumps, tc_dumpArrayPtr);
190 newNode->parent = tcdiPtr->parentDumpId;
191 newNode->level = tcdiPtr->dumpLevel;
192 newNode->doAppend = tcdiPtr->doAppend;
195 newNode->doAppend = 0; /* Append flag is ignored if talking to XBSA */
198 /* create the status node */
199 statusPtr = createStatusNode();
201 ERROR_EXIT(TC_INTERNALERROR);
204 statusPtr->taskId = newNode->taskID;
205 statusPtr->lastPolled = time(0);
206 statusPtr->flags &= ~STARTING; /* ok to examine */
207 strncpy(statusPtr->taskName, "Dump", sizeof(statusPtr->taskName));
210 newNode->statusNodePtr = statusPtr;
212 /* create the LWP to do the real work behind the scenes */
213 #ifdef AFS_PTHREAD_ENV
214 code = pthread_attr_init(&tattr);
218 code = pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
223 code = pthread_create(&pid, &tattr, Dumper, newNode);
224 AFS_SIGSET_RESTORE();
227 LWP_CreateProcess(Dumper, 32768, 1, (void *)newNode, "dumper process",
233 *taskId = newNode->taskID;
238 deleteStatusNode(statusPtr);
239 FreeNode(newNode->taskID); /* failed to create LWP to do the dump. */
246 STC_PerformRestore(acid, dumpSetName, arestores, taskID)
247 struct rx_call *acid;
248 char *dumpSetName; /* not used */
249 tc_restoreArray *arestores;
252 struct dumpNode *newNode;
255 #ifdef AFS_PTHREAD_ENV
257 pthread_attr_t tattr;
263 extern int Restorer();
264 extern statusP createStatusNode();
266 if (callPermitted(acid) == 0)
267 return (TC_NOTPERMITTED);
269 /* should verify parameter validity */
271 /* this creates a node in list, alots an id for it and prepares it for locking */
272 CreateNode(&newNode);
274 newNode->restores = (struct tc_restoreDesc *)
275 malloc(sizeof(struct tc_restoreDesc) *
276 arestores->tc_restoreArray_len);
277 newNode->arraySize = arestores->tc_restoreArray_len;
278 CopyRestoreDesc(newNode->restores, arestores);
279 *taskID = newNode->taskID;
281 /* should log the intent */
283 /* create the status node */
284 statusPtr = createStatusNode();
286 ERROR_EXIT(TC_INTERNALERROR);
289 statusPtr->taskId = newNode->taskID;
290 statusPtr->flags &= ~STARTING; /* ok to examine */
291 statusPtr->lastPolled = time(0);
292 strncpy(statusPtr->taskName, "Restore", sizeof(statusPtr->taskName));
295 newNode->statusNodePtr = statusPtr;
297 /* create the LWP to do the real work behind the scenes */
298 #ifdef AFS_PTHREAD_ENV
299 code = pthread_attr_init(&tattr);
303 code = pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
308 code = pthread_create(&pid, &tattr, Restorer, newNode);
309 AFS_SIGSET_RESTORE();
312 LWP_CreateProcess(Restorer, 65368, 1, (void *)newNode,
313 "restorer process", &pid);
319 deleteStatusNode(statusPtr);
320 FreeNode(newNode->taskID); /* failed to create LWP to do the dump. */
327 STC_ReadLabel(acid, label, taskId)
328 struct rx_call *acid;
329 struct tc_tapeLabel *label;
334 extern int ReadLabel();
338 return (TC_BADTASK); /* ReadLabel does not apply if XBSA */
341 if (callPermitted(acid) == 0)
342 return (TC_NOTPERMITTED);
344 code = ReadLabel(label); /* Synchronous */
349 * restore the backup database from tape
353 STC_RestoreDb(rxCall, taskId)
354 struct rx_call *rxCall;
357 #ifdef AFS_PTHREAD_ENV
359 pthread_attr_t tattr;
367 extern afs_int32 restoreDbFromTape();
368 extern statusP createStatusNode();
369 extern afs_int32 allocTaskId();
373 return (TC_BADTASK); /* LabelTape does not apply if XBSA */
376 if (callPermitted(rxCall) == 0)
377 return (TC_NOTPERMITTED);
379 *taskId = allocTaskId();
381 /* create the status node */
382 statusPtr = createStatusNode();
384 ERROR_EXIT(TC_INTERNALERROR);
387 statusPtr->taskId = *taskId;
388 statusPtr->flags &= ~STARTING; /* ok to examine */
389 statusPtr->lastPolled = time(0);
390 strncpy(statusPtr->taskName, "RestoreDb", sizeof(statusPtr->taskName));
393 #ifdef AFS_PTHREAD_ENV
394 code = pthread_attr_init(&tattr);
398 code = pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
403 code = pthread_create(&pid, &tattr, restoreDbFromTape, (void *)*taskId);
404 AFS_SIGSET_RESTORE();
407 LWP_CreateProcess(restoreDbFromTape, 32768, 1, (void *)*taskId,
414 deleteStatusNode(statusPtr);
421 * restore the backup database from tape
425 STC_SaveDb(rxCall, archiveTime, taskId)
426 struct rx_call *rxCall;
430 #ifdef AFS_PTHREAD_ENV
432 pthread_attr_t tattr;
439 struct saveDbIf *ptr;
441 extern afs_int32 saveDbToTape();
442 extern statusP createStatusNode();
443 extern afs_int32 allocTaskId();
447 return (TC_BADTASK); /* LabelTape does not apply if XBSA */
450 if (callPermitted(rxCall) == 0)
451 return (TC_NOTPERMITTED);
453 *taskId = allocTaskId();
455 ptr = (struct saveDbIf *)malloc(sizeof(struct saveDbIf));
457 ERROR_EXIT(TC_NOMEMORY);
458 ptr->archiveTime = archiveTime;
459 ptr->taskId = *taskId;
461 /* create the status node */
462 statusPtr = createStatusNode();
464 ERROR_EXIT(TC_INTERNALERROR);
467 statusPtr->taskId = *taskId;
468 statusPtr->lastPolled = time(0);
469 statusPtr->flags &= ~STARTING; /* ok to examine */
470 strncpy(statusPtr->taskName, "SaveDb", sizeof(statusPtr->taskName));
473 ptr->statusPtr = statusPtr;
475 #ifdef AFS_PTHREAD_ENV
476 code = pthread_attr_init(&tattr);
480 code = pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
485 code = pthread_create(&pid, &tattr, saveDbToTape, ptr);
486 AFS_SIGSET_RESTORE();
488 code = LWP_CreateProcess(saveDbToTape, 32768, 1, ptr, "Db save", &pid);
494 deleteStatusNode(statusPtr);
504 * read a dump (maybe more than one tape), and print out a summary
505 * of its contents. If the flag is set, add to the database.
507 * addDbFlag - if set, the information will be added to the database
511 STC_ScanDumps(acid, addDbFlag, taskId)
512 struct rx_call *acid;
516 #ifdef AFS_PTHREAD_ENV
518 pthread_attr_t tattr;
523 struct scanTapeIf *ptr;
527 extern afs_int32 ScanDumps();
528 extern afs_int32 allocTaskId();
529 extern statusP createStatusNode();
533 return (TC_BADTASK); /* ScanDumps does not apply if XBSA */
536 if (callPermitted(acid) == 0)
537 return (TC_NOTPERMITTED);
539 *taskId = allocTaskId();
541 ptr = (struct scanTapeIf *)malloc(sizeof(*ptr));
543 ERROR_EXIT(TC_NOMEMORY);
544 ptr->addDbFlag = addDbFlag;
545 ptr->taskId = *taskId;
547 /* create the status node */
548 statusPtr = createStatusNode();
550 ERROR_EXIT(TC_INTERNALERROR);
553 statusPtr->taskId = *taskId;
554 statusPtr->lastPolled = time(0);
555 statusPtr->flags &= ~STARTING; /* ok to examine */
556 strncpy(statusPtr->taskName, "Scantape", sizeof(statusPtr->taskName));
559 #ifdef AFS_PTHREAD_ENV
560 code = pthread_attr_init(&tattr);
564 code = pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
569 code = pthread_create(&pid, &tattr, ScanDumps, ptr);
570 AFS_SIGSET_RESTORE();
573 LWP_CreateProcess(ScanDumps, 32768, 1, ptr, "scandump process", &pid);
579 deleteStatusNode(statusPtr);
588 * return information about the tape coordinator. Currently this
589 * is just the version number of the interface
593 STC_TCInfo(acid, tciptr)
594 struct rx_call *acid;
595 struct tc_tcInfo *tciptr;
597 if (callPermitted(acid) == 0)
598 return (TC_NOTPERMITTED);
600 tciptr->tcVersion = CUR_BUTC_VERSION;
607 STC_DeleteDump(acid, dumpID, taskId)
608 struct rx_call *acid;
612 struct deleteDumpIf *ptr = 0;
613 statusP statusPtr = 0;
614 afs_int32 code = TC_BADTASK; /* If not compiled -Dxbsa then fail */
616 #ifdef AFS_PTHREAD_ENV
618 pthread_attr_t tattr;
624 extern afs_int32 DeleteDump();
625 extern statusP createStatusNode();
626 extern afs_int32 allocTaskId();
630 return (TC_BADTASK); /* Only do if butc is started as XBSA */
634 if (callPermitted(acid) == 0)
635 return (TC_NOTPERMITTED);
637 ptr = (struct deleteDumpIf *)malloc(sizeof(*ptr));
639 ERROR_EXIT(TC_NOMEMORY);
641 *taskId = allocTaskId();
642 ptr->dumpID = dumpID;
643 ptr->taskId = *taskId;
645 statusPtr = createStatusNode();
647 ERROR_EXIT(TC_INTERNALERROR);
650 statusPtr->taskId = *taskId;
651 statusPtr->lastPolled = time(0);
652 statusPtr->flags &= ~STARTING;
653 strncpy(statusPtr->taskName, "DeleteDump", sizeof(statusPtr->taskName));
656 #ifdef AFS_PTHREAD_ENV
657 code = pthread_attr_init(&tattr);
661 code = pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
666 code = pthread_create(&pid, &tattr, DeleteDump, ptr);
667 AFS_SIGSET_RESTORE();
670 LWP_CreateProcess(DeleteDump, 32768, 1, ptr, "deletedump process",
677 deleteStatusNode(statusPtr);
686 /* -----------------------------
688 * -----------------------------
692 CopyDumpDesc(toDump, fromDump)
693 struct tc_dumpDesc *toDump;
694 tc_dumpArray *fromDump;
696 struct tc_dumpDesc *toPtr, *fromPtr;
700 fromPtr = fromDump->tc_dumpArray_val;
701 for (i = 0; i < fromDump->tc_dumpArray_len; i++) {
702 toPtr->vid = fromPtr->vid;
703 toPtr->vtype = fromPtr->vtype;
704 toPtr->partition = fromPtr->partition;
705 toPtr->date = fromPtr->date;
706 toPtr->cloneDate = fromPtr->cloneDate;
707 toPtr->hostAddr = fromPtr->hostAddr;
708 strcpy(toPtr->name, fromPtr->name);
717 CopyRestoreDesc(toRestore, fromRestore)
718 struct tc_restoreDesc *toRestore;
719 tc_restoreArray *fromRestore;
721 struct tc_restoreDesc *toPtr, *fromPtr;
725 fromPtr = fromRestore->tc_restoreArray_val;
726 for (i = 0; i < fromRestore->tc_restoreArray_len; i++) {
727 toPtr->flags = fromPtr->flags;
728 toPtr->position = fromPtr->position;
729 strcpy(toPtr->tapeName, fromPtr->tapeName);
730 toPtr->dbDumpId = fromPtr->dbDumpId;
731 toPtr->initialDumpId = fromPtr->initialDumpId;
732 toPtr->origVid = fromPtr->origVid;
733 toPtr->vid = fromPtr->vid;
734 toPtr->partition = fromPtr->partition;
735 toPtr->dumpLevel = fromPtr->dumpLevel;
736 toPtr->hostAddr = fromPtr->hostAddr;
737 strcpy(toPtr->newName, fromPtr->newName);
738 strcpy(toPtr->oldName, fromPtr->oldName);
747 CopyTapeSetDesc(toPtr, fromPtr)
748 struct tc_tapeSet *toPtr, *fromPtr;
751 toPtr->id = fromPtr->id;
752 toPtr->maxTapes = fromPtr->maxTapes;
753 toPtr->a = fromPtr->a;
754 toPtr->b = fromPtr->b;
755 strcpy(toPtr->tapeServer, fromPtr->tapeServer);
756 strcpy(toPtr->format, fromPtr->format);
758 toPtr->expDate = fromPtr->expDate;
759 toPtr->expType = fromPtr->expType;