int bc_DeleteDumpCmd(struct cmd_syndesc *as, void *arock) { /* parm 0 is vol set name * parm 1 is dump schedule name */ char *dname; int code; udbClientTextP ctPtr; /* lock schedules and check validity */ ctPtr = &bc_globalConfig->configText[TB_DUMPSCHEDULE]; code = bc_LockText(ctPtr); if (code) ERROR(code); code = bc_UpdateDumpSchedule(); if (code) { afs_com_err(whoami, code, "; Can't retrieve dump schedule"); return (code); } dname = as->parms[0].items->data; code = bc_DeleteDumpSchedule(bc_globalConfig, dname); if (code) { if (code == -1) afs_com_err(whoami, 0, "No such dump as %s", dname); else afs_com_err(whoami, code, "; Failed to delete dump schedule"); goto error_exit; } code = bc_SaveDumpSchedule(); if (code == 0) printf("backup: deleted dump schedule %s\n", dname); else { afs_com_err(whoami, code, "Cannot save dump schedule file"); afs_com_err(whoami, 0, "Deletion is temporary - for this session only"); } error_exit: if (ctPtr->lockHandle != 0) bc_UnlockText(ctPtr); return code; }
afs_int32 saveTextFile(afs_int32 taskId, afs_int32 textType, char *fileName) { udbClientTextP ctPtr = 0; afs_int32 code = 0; int tlock = 0; ctPtr = (udbClientTextP) malloc(sizeof(*ctPtr)); if (!ctPtr) ERROR_EXIT(TC_NOMEMORY); memset(ctPtr, 0, sizeof(*ctPtr)); ctPtr->textType = textType; /* lock the text in the database */ code = bc_LockText(ctPtr); if (code) { ErrorLog(0, taskId, code, 0, "Can't lock text file\n"); ERROR_EXIT(code); } tlock = 1; ctPtr->textStream = fopen(fileName, "r"); if (!ctPtr->textStream) { ErrorLog(0, taskId, errno, 0, "Can't open text file\n"); ERROR_EXIT(errno); } /* now send the text to the database */ code = bcdb_SaveTextFile(ctPtr); if (code) { ErrorLog(0, taskId, code, 0, "Can't save text file\n"); ERROR_EXIT(code); } error_exit: if (ctPtr) { if (ctPtr->textStream) fclose(ctPtr->textStream); if (tlock) bc_UnlockText(ctPtr); free(ctPtr); } return (code); }
int bc_AddDumpCmd(struct cmd_syndesc *as, void *arock) { register char *dname; /* dump schedule name */ register int code; afs_int32 expType, expDate; register struct cmd_item *ti; udbClientTextP ctPtr; /* if an expiration date has been specified */ if (as->parms[1].items) { code = bc_ParseExpiration(&as->parms[1], &expType, &expDate); if (code) { printf("Invalid expiration date syntax\n"); return (1); } } else { /* no expiration date specified */ expDate = 0; expType = BC_NO_EXPDATE; } /* lock schedules and check validity */ ctPtr = &bc_globalConfig->configText[TB_DUMPSCHEDULE]; code = bc_LockText(ctPtr); if (code) ERROR(code); code = bc_UpdateDumpSchedule(); if (code) { afs_com_err(whoami, code, "; Can't retrieve dump schedule"); return (code); } /* process each dump name using the expiration date computed above */ for (ti = as->parms[0].items; ti != 0; ti = ti->next) { /* get next dump name to process */ dname = ti->data; /* validate the name dump name length */ if (strlen(dname) >= BU_MAX_DUMP_PATH) { afs_com_err(whoami, 0, "Dump names must be < %d characters", BU_MAX_DUMP_PATH); afs_com_err(whoami, 0, "Dump %s not added", dname); code = -1; continue; } code = bc_CreateDumpSchedule(bc_globalConfig, dname, expDate, expType); if (code) { if (code == -1) afs_com_err(whoami, 0, "Dump already exists"); else if (code == -2) afs_com_err(whoami, 0, "Invalid path name '%s'", dname); else if (code == -3) afs_com_err(whoami, 0, "Name specification error"); else afs_com_err(whoami, code, "; Failed to create dump schedule"); continue; } /* save the new schedule item */ code = bc_SaveDumpSchedule(); if (code) { afs_com_err(whoami, code, "Cannot save dump schedule"); afs_com_err(whoami, 0, "Changes are temporary - for this session only"); break; } afs_com_err(whoami, 0, "Created new dump schedule %s", dname); } error_exit: if (ctPtr->lockHandle) bc_UnlockText(ctPtr); return (code); }
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); }
int bc_SetExpCmd(struct cmd_syndesc *as, void *arock) { register char *dname; /* dump schedule name */ register struct cmd_item *ti; struct bc_dumpSchedule *node, *parent; afs_int32 expType, expDate; udbClientTextP ctPtr; register int code; /* if an expiration date has been specified */ if (as->parms[1].items) { code = bc_ParseExpiration(&as->parms[1], &expType, &expDate); if (code) { printf("Invalid expiration date syntax\n"); return (1); } } else { /* no expiration date specified */ expDate = 0; expType = BC_NO_EXPDATE; } /* lock schedules and check validity */ ctPtr = &bc_globalConfig->configText[TB_DUMPSCHEDULE]; code = bc_LockText(ctPtr); if (code) ERROR(code); code = bc_UpdateDumpSchedule(); if (code) { afs_com_err(whoami, code, "; Can't retrieve dump schedule"); return (code); } /* process each dump name using the expiration date computed above */ for (ti = as->parms[0].items; ti != 0; ti = ti->next) { /* get next dump name to process */ dname = ti->data; /* validate the name dump name length */ if (strlen(dname) >= BU_MAX_DUMP_PATH) { code = -1; afs_com_err(whoami, 0, "Dump names must be < %d characters", BU_MAX_DUMP_PATH); afs_com_err(whoami, 0, "Dump %s not added", dname); continue; } code = FindDump(bc_globalConfig, dname, &parent, &node); if (code) { afs_com_err(whoami, 0, "Dump level %s not found", dname); continue; } node->expDate = expDate; node->expType = expType; } code = bc_SaveDumpSchedule(); if (code) { afs_com_err(whoami, code, "Cannot save dump schedule"); afs_com_err(whoami, 0, "Expiration changes effective for this session only"); } error_exit: if (ctPtr->lockHandle) bc_UnlockText(ctPtr); return (code); }