int bc_CreateDumpSchedule(struct bc_config *aconfig, char *adumpName, afs_int32 expDate, afs_int32 expType) { struct bc_dumpSchedule *tdump; struct bc_dumpSchedule *parent, *node; afs_int32 code; if (strcmp(adumpName, "none") == 0) return -2; /* invalid name */ code = FindDump(aconfig, adumpName, &parent, &node); if (code == 0) return -1; /* node already exists */ else if (code != -1) return -2; /* name specification error */ tdump = (struct bc_dumpSchedule *)malloc(sizeof(struct bc_dumpSchedule)); memset(tdump, 0, sizeof(*tdump)); /* prepend this node to the dump schedule list */ tdump->next = aconfig->dsched; aconfig->dsched = tdump; /* save the name of this dump node */ tdump->name = (char *)malloc(strlen(adumpName) + 1); strcpy(tdump->name, adumpName); /* expiration information */ tdump->expDate = expDate; tdump->expType = expType; bc_ProcessDumpSchedule(aconfig); /* redo tree */ return 0; }
int bc_DeleteDumpSchedule(struct bc_config *aconfig, char *adumpName) { struct bc_dumpSchedule *tdump; /* does a linear search of the dump schedules in order to find * the one to delete */ for (tdump = aconfig->dsched; tdump; tdump = tdump->next) { if (strcmp(tdump->name, adumpName) == 0) { /* found it, we can zap recursively */ bc_DeleteDumpScheduleAddr(aconfig, tdump); /* tree's been pruned, but we have to recompute the internal pointers * from first principles, since we didn't bother to maintain * the sibling and children pointers during the call to delete * the nodes */ bc_ProcessDumpSchedule(aconfig); return 0; } } /* if we make it here, there's no such dump schedule entry */ return -1; }
afs_int32 bc_UpdateDumpSchedule(void) { struct bc_dumpSchedule *dumpPtr, *nextDumpPtr; struct udbHandleS *uhptr = &udbHandle; udbClientTextP ctPtr; afs_int32 code; int lock = 0; /* lock schedules and check validity */ ctPtr = &bc_globalConfig->configText[TB_DUMPSCHEDULE]; code = bc_CheckTextVersion(ctPtr); if (code != BC_VERSIONMISMATCH) { ERROR(code); /* Version matches or some other error */ } /* Must update the dump schedules */ /* If we are not already locked, then lock it now */ if (!ctPtr->lockHandle) { code = bc_LockText(ctPtr); if (code) ERROR(code); lock = 1; } if (ctPtr->textVersion != -1) { printf("backup: obsolete dump schedule - updating\n"); /* clear all old schedule information */ dumpPtr = bc_globalConfig->dsched; while (dumpPtr) { nextDumpPtr = dumpPtr->next; free(dumpPtr); dumpPtr = nextDumpPtr; } bc_globalConfig->dsched = 0;; } /* open a temp file to store the config text received from buserver * * The open file stream is stored in ctPtr->textStream */ code = bc_openTextFile(ctPtr, &bc_globalConfig-> tmpTextFileNames[TB_DUMPSCHEDULE][0]); if (code) ERROR(code); /* now get a fresh set of information from the database */ code = bcdb_GetTextFile(ctPtr); if (code) ERROR(code); /* fetch the version number */ code = ubik_BUDB_GetTextVersion(uhptr->uh_client, 0, ctPtr->textType, &ctPtr->textVersion); if (code) ERROR(code); /* parse the file */ code = bc_ParseDumpSchedule(); if (code) ERROR(code); /* rebuild the tree */ code = bc_ProcessDumpSchedule(bc_globalConfig); if (code) ERROR(code); error_exit: if (lock && ctPtr->lockHandle) bc_UnlockText(ctPtr); return (code); }