afs_int32 STC_ScanDumps(struct rx_call *acid, afs_int32 addDbFlag, afs_uint32 *taskId) { #ifdef AFS_PTHREAD_ENV pthread_t pid; pthread_attr_t tattr; AFS_SIGSET_DECL; #else PROCESS pid; #endif struct scanTapeIf *ptr; statusP statusPtr = NULL; afs_int32 code = 0; #ifdef xbsa if (CONF_XBSA) return (TC_BADTASK); /* ScanDumps does not apply if XBSA */ #endif if (callPermitted(acid) == 0) return (TC_NOTPERMITTED); *taskId = allocTaskId(); ptr = (struct scanTapeIf *)malloc(sizeof(*ptr)); if (!ptr) ERROR_EXIT(TC_NOMEMORY); ptr->addDbFlag = addDbFlag; ptr->taskId = *taskId; /* create the status node */ statusPtr = createStatusNode(); if (!statusPtr) ERROR_EXIT(TC_INTERNALERROR); lock_Status(); statusPtr->taskId = *taskId; statusPtr->lastPolled = time(0); statusPtr->flags &= ~STARTING; /* ok to examine */ strncpy(statusPtr->taskName, "Scantape", sizeof(statusPtr->taskName)); unlock_Status(); #ifdef AFS_PTHREAD_ENV code = pthread_attr_init(&tattr); if (code) ERROR_EXIT(code); code = pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED); if (code) ERROR_EXIT(code); AFS_SIGSET_CLEAR(); code = pthread_create(&pid, &tattr, ScanDumps, ptr); AFS_SIGSET_RESTORE(); #else code = LWP_CreateProcess(ScanDumps, 32768, 1, ptr, "scandump process", &pid); #endif error_exit: if (code) { if (statusPtr) deleteStatusNode(statusPtr); if (ptr) free(ptr); } return code; }
afs_int32 STC_SaveDb(struct rx_call *rxCall, Date archiveTime, afs_uint32 *taskId) { #ifdef AFS_PTHREAD_ENV pthread_t pid; pthread_attr_t tattr; AFS_SIGSET_DECL; #else PROCESS pid; #endif statusP statusPtr = NULL; afs_int32 code = 0; struct saveDbIf *ptr; #ifdef xbsa if (CONF_XBSA) return (TC_BADTASK); /* LabelTape does not apply if XBSA */ #endif if (callPermitted(rxCall) == 0) return (TC_NOTPERMITTED); *taskId = allocTaskId(); ptr = (struct saveDbIf *)malloc(sizeof(struct saveDbIf)); if (!ptr) ERROR_EXIT(TC_NOMEMORY); ptr->archiveTime = archiveTime; ptr->taskId = *taskId; /* create the status node */ statusPtr = createStatusNode(); if (!statusPtr) ERROR_EXIT(TC_INTERNALERROR); lock_Status(); statusPtr->taskId = *taskId; statusPtr->lastPolled = time(0); statusPtr->flags &= ~STARTING; /* ok to examine */ strncpy(statusPtr->taskName, "SaveDb", sizeof(statusPtr->taskName)); unlock_Status(); ptr->statusPtr = statusPtr; #ifdef AFS_PTHREAD_ENV code = pthread_attr_init(&tattr); if (code) ERROR_EXIT(code); code = pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED); if (code) ERROR_EXIT(code); AFS_SIGSET_CLEAR(); code = pthread_create(&pid, &tattr, saveDbToTape, ptr); AFS_SIGSET_RESTORE(); #else code = LWP_CreateProcess(saveDbToTape, 32768, 1, ptr, "Db save", &pid); #endif error_exit: if (code) { if (statusPtr) deleteStatusNode(statusPtr); if (ptr) free(ptr); } return (code); }
afs_int32 STC_LabelTape(struct rx_call *acid, struct tc_tapeLabel *label, afs_uint32 *taskId) { #ifdef AFS_PTHREAD_ENV pthread_t pid; pthread_attr_t tattr; AFS_SIGSET_DECL; #else PROCESS pid; #endif struct labelTapeIf *ptr; statusP statusPtr = NULL; afs_int32 code; #ifdef xbsa if (CONF_XBSA) return (TC_BADTASK); /* LabelTape does not apply if XBSA */ #endif if (callPermitted(acid) == 0) return (TC_NOTPERMITTED); ptr = (struct labelTapeIf *)malloc(sizeof(*ptr)); if (!ptr) ERROR_EXIT(TC_NOMEMORY); memcpy(&ptr->label, label, sizeof(ptr->label)); /* set up the status node */ *taskId = allocTaskId(); /* for bucoord */ ptr->taskId = *taskId; statusPtr = createStatusNode(); if (!statusPtr) ERROR_EXIT(TC_INTERNALERROR); lock_Status(); statusPtr->taskId = *taskId; statusPtr->lastPolled = time(0); statusPtr->flags &= ~STARTING; /* ok to examine */ strncpy(statusPtr->taskName, "Labeltape", sizeof(statusPtr->taskName)); unlock_Status(); /* create the LWP to do the real work behind the scenes */ #ifdef AFS_PTHREAD_ENV code = pthread_attr_init(&tattr); if (code) ERROR_EXIT(code); code = pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED); if (code) ERROR_EXIT(code); AFS_SIGSET_CLEAR(); code = pthread_create(&pid, &tattr, Labeller, ptr); AFS_SIGSET_RESTORE(); #else code = LWP_CreateProcess(Labeller, 32768, 1, (void *)ptr, "labeller process", &pid); #endif error_exit: if (code) { if (statusPtr) deleteStatusNode(statusPtr); if (ptr) free(ptr); } return (code); }
afs_int32 STC_RestoreDb(struct rx_call *rxCall, afs_uint32 *taskId) { #ifdef AFS_PTHREAD_ENV pthread_t pid; pthread_attr_t tattr; AFS_SIGSET_DECL; #else PROCESS pid; #endif statusP statusPtr; afs_int32 code = 0; #ifdef xbsa if (CONF_XBSA) return (TC_BADTASK); /* LabelTape does not apply if XBSA */ #endif if (callPermitted(rxCall) == 0) return (TC_NOTPERMITTED); *taskId = allocTaskId(); /* create the status node */ statusPtr = createStatusNode(); if (!statusPtr) ERROR_EXIT(TC_INTERNALERROR); lock_Status(); statusPtr->taskId = *taskId; statusPtr->flags &= ~STARTING; /* ok to examine */ statusPtr->lastPolled = time(0); strncpy(statusPtr->taskName, "RestoreDb", sizeof(statusPtr->taskName)); unlock_Status(); #ifdef AFS_PTHREAD_ENV code = pthread_attr_init(&tattr); if (code) ERROR_EXIT(code); code = pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED); if (code) ERROR_EXIT(code); AFS_SIGSET_CLEAR(); code = pthread_create(&pid, &tattr, restoreDbFromTape, (void *)(intptr_t)*taskId); AFS_SIGSET_RESTORE(); #else code = LWP_CreateProcess(restoreDbFromTape, 32768, 1, (void *)(intptr_t)*taskId, "Db restore", &pid); #endif error_exit: if (code) { if (statusPtr) deleteStatusNode(statusPtr); } return (code); }
/* STC_DeleteDump */ afs_int32 STC_DeleteDump(struct rx_call *acid, afs_uint32 dumpID, afs_uint32 *taskId) { afs_int32 code = TC_BADTASK; /* If not compiled -Dxbsa then fail */ #ifdef xbsa struct deleteDumpIf *ptr = 0; statusP statusPtr = 0; #ifdef AFS_PTHREAD_ENV pthread_t pid; pthread_attr_t tattr; AFS_SIGSET_DECL; #else PROCESS pid; #endif #endif *taskId = 0; if (!CONF_XBSA) return (TC_BADTASK); /* Only do if butc is started as XBSA */ #ifdef xbsa code = 0; if (callPermitted(acid) == 0) return (TC_NOTPERMITTED); ptr = (struct deleteDumpIf *)malloc(sizeof(*ptr)); if (!ptr) ERROR_EXIT(TC_NOMEMORY); *taskId = allocTaskId(); ptr->dumpID = dumpID; ptr->taskId = *taskId; statusPtr = createStatusNode(); if (!statusPtr) ERROR_EXIT(TC_INTERNALERROR); lock_Status(); statusPtr->taskId = *taskId; statusPtr->lastPolled = time(0); statusPtr->flags &= ~STARTING; strncpy(statusPtr->taskName, "DeleteDump", sizeof(statusPtr->taskName)); unlock_Status(); #ifdef AFS_PTHREAD_ENV code = pthread_attr_init(&tattr); if (code) ERROR_EXIT(code); code = pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED); if (code) ERROR_EXIT(code); AFS_SIGSET_CLEAR(); code = pthread_create(&pid, &tattr, DeleteDump, ptr); AFS_SIGSET_RESTORE(); #else code = LWP_CreateProcess(DeleteDump, 32768, 1, ptr, "deletedump process", &pid); #endif error_exit: if (code) { if (statusPtr) deleteStatusNode(statusPtr); if (ptr) free(ptr); } #endif /* xbsa */ return (code); }