int bnode_Delete(struct bnode *abnode) { afs_int32 code; struct bnode **lb, *ub; afs_int32 temp; if (abnode->refCount != 0) { abnode->flags |= BNODE_DELETE; return 0; } /* make sure the bnode is idle before zapping */ bnode_Hold(abnode); code = BOP_GETSTAT(abnode, &temp); bnode_Release(abnode); if (code) return code; if (temp != BSTAT_SHUTDOWN) return BZBUSY; /* all clear to zap */ for (lb = &allBnodes, ub = *lb; ub; lb = &ub->next, ub = *lb) { if (ub == abnode) { /* unthread it from the list */ *lb = ub->next; break; } } free(abnode->name); /* do this first, since bnode fields may be bad after BOP_DELETE */ code = BOP_DELETE(abnode); /* don't play games like holding over this one */ WriteBozoFile(0); return code; }
int bnode_SetFileGoal(struct bnode *abnode, int agoal) { if (abnode->fileGoal == agoal) return 0; /* already done */ abnode->fileGoal = agoal; WriteBozoFile(0); return 0; }
afs_int32 bnode_Create(char *atype, char *ainstance, struct bnode ** abp, char *ap1, char *ap2, char *ap3, char *ap4, char *ap5, char *notifier, int fileGoal, int rewritefile) { struct bnode_type *type; struct bnode *tb; char *notifierpath = NULL; struct stat tstat; if (bnode_FindInstance(ainstance)) return BZEXISTS; type = FindType(atype); if (!type) return BZBADTYPE; if (notifier && strcmp(notifier, NONOTIFIER)) { /* construct local path from canonical (wire-format) path */ if (ConstructLocalBinPath(notifier, ¬ifierpath)) { bozo_Log("BNODE-Create: Notifier program path invalid '%s'\n", notifier); return BZNOCREATE; } if (stat(notifierpath, &tstat)) { bozo_Log("BNODE-Create: Notifier program '%s' not found\n", notifierpath); free(notifierpath); return BZNOCREATE; } } tb = (*type->ops->create) (ainstance, ap1, ap2, ap3, ap4, ap5); if (!tb) { free(notifierpath); return BZNOCREATE; } tb->notifier = notifierpath; *abp = tb; tb->type = type; /* The fs_create above calls bnode_InitBnode() which always sets the ** fileGoal to BSTAT_NORMAL .... overwrite it with whatever is passed into ** this function as a parameter... */ tb->fileGoal = fileGoal; bnode_SetStat(tb, tb->goal); /* nudge it once */ if (rewritefile != 0) WriteBozoFile(0); return 0; }
afs_int32 SBOZO_SetRestrictedMode(struct rx_call *acall, afs_int32 arestmode) { afs_int32 code; char caller[MAXKTCNAMELEN]; if (!afsconf_SuperUser(bozo_confdir, acall, caller)) { return BZACCESS; } if (bozo_isrestricted) { return BZACCESS; } if (arestmode != 0 && arestmode != 1) { return BZDOM; } bozo_isrestricted = arestmode; code = WriteBozoFile(0); return code; }
afs_int32 SBOZO_SetRestartTime(struct rx_call *acall, afs_int32 atype, struct bozo_netKTime *aktime) { afs_int32 code; char caller[MAXKTCNAMELEN]; /* check for proper permissions */ if (!afsconf_SuperUser(bozo_confdir, acall, caller)) { code = BZACCESS; goto fail; } if (DoLogging) bozo_Log("%s is executing SetRestartTime\n", caller); code = 0; /* assume success */ switch (atype) { case 1: memcpy(&bozo_nextRestartKT, aktime, sizeof(struct ktime)); break; case 2: memcpy(&bozo_nextDayKT, aktime, sizeof(struct ktime)); break; default: code = BZDOM; break; } if (code == 0) { /* try to update the bozo init file */ code = WriteBozoFile(0); bozo_newKTs = 1; } fail: osi_auditU(acall, BOS_SetRestartEvent, code, AUD_END); return code; }