struct bnode * cron_create(char *ainstance, char *acommand, char *awhen) { struct cronbnode *te; afs_int32 code; char *cmdpath; extern char *copystr(); /* construct local path from canonical (wire-format) path */ if (ConstructLocalBinPath(acommand, &cmdpath)) { bozo_Log("BNODE: command path invalid '%s'\n", acommand); return NULL; } te = (struct cronbnode *)malloc(sizeof(struct cronbnode)); memset(te, 0, sizeof(struct cronbnode)); code = ktime_ParsePeriodic(awhen, &te->whenToRun); if ((code < 0) || (bnode_InitBnode(te, &cronbnode_ops, ainstance) != 0)) { free(te); free(cmdpath); return NULL; } te->when = ktime_next(&te->whenToRun, 0); te->command = cmdpath; te->whenString = copystr(awhen); return (struct bnode *)te; }
afs_int32 SBOZO_GetDates(struct rx_call *acall, char *aname, afs_int32 *atime, afs_int32 *abakTime, afs_int32 *aoldTime) { struct stat tstat; char *strp; char tbuffer[AFSDIR_PATH_MAX]; *atime = *abakTime = *aoldTime = 0; /* construct local path from canonical (wire-format) path */ if (ConstructLocalBinPath(aname, &strp)) { return 0; } strcpy(tbuffer, strp); free(strp); strp = tbuffer + strlen(tbuffer); if (!stat(tbuffer, &tstat)) { *atime = tstat.st_mtime; } strcpy(strp, ".BAK"); if (!stat(tbuffer, &tstat)) { *abakTime = tstat.st_mtime; } strcpy(strp, ".OLD"); if (!stat(tbuffer, &tstat)) { *aoldTime = tstat.st_mtime; } 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_UnInstall(struct rx_call *acall, char *aname) { char *filepath; char fpOld[AFSDIR_PATH_MAX], fpBak[AFSDIR_PATH_MAX]; afs_int32 code; char caller[MAXKTCNAMELEN]; struct stat tstat; if (!afsconf_SuperUser(bozo_confdir, acall, caller)) { code = BZACCESS; osi_auditU(acall, BOS_UnInstallEvent, code, AUD_STR, aname, AUD_END); return code; } if (bozo_isrestricted) { code = BZACCESS; osi_auditU(acall, BOS_UnInstallEvent, code, AUD_STR, aname, AUD_END); return code; } /* construct local path from canonical (wire-format) path */ if (ConstructLocalBinPath(aname, &filepath)) { return BZNOENT; } if (DoLogging) bozo_Log("%s is executing UnInstall '%s'\n", caller, filepath); strcpy(fpBak, filepath); strcat(fpBak, ".BAK"); strcpy(fpOld, filepath); strcat(fpOld, ".OLD"); code = rk_rename(fpBak, filepath); if (code) { /* can't find .BAK, try .OLD */ code = rk_rename(fpOld, filepath); if (code && errno == ENOENT) /* If doesn't exist don't fail */ code = 0; } else { /* now rename .OLD to .BAK */ if (stat(fpOld, &tstat) == 0) code = rk_rename(fpOld, fpBak); } if (code) code = errno; osi_auditU(acall, BOS_UnInstallEvent, code, AUD_STR, filepath, AUD_END); free(filepath); return code; }
struct bnode * ez_create(char *ainstance, char *acommand, char *unused1, char *unused2, char *unused3, char *unused4) { struct ezbnode *te; char *cmdpath; if (ConstructLocalBinPath(acommand, &cmdpath)) { bozo_Log("BNODE: command path invalid '%s'\n", acommand); return NULL; } te = calloc(1, sizeof(struct ezbnode)); if (bnode_InitBnode((struct bnode *)te, &ezbnode_ops, ainstance) != 0) { free(te); return NULL; } te->command = cmdpath; return (struct bnode *)te; }
afs_int32 SBOZO_Install(struct rx_call *acall, char *aname, afs_int32 asize, afs_int32 mode, afs_int32 amtime) { afs_int32 code; int fd; afs_int32 len; afs_int32 total; #ifdef AFS_NT40_ENV struct _utimbuf utbuf; #else struct timeval tvb[2]; #endif char filepath[AFSDIR_PATH_MAX], tbuffer[AFSDIR_PATH_MAX], *fpp; char caller[MAXKTCNAMELEN]; if (!afsconf_SuperUser(bozo_confdir, acall, caller)) return BZACCESS; if (bozo_isrestricted) return BZACCESS; /* construct local path from canonical (wire-format) path */ if (ConstructLocalBinPath(aname, &fpp)) { return BZNOENT; } strcpy(filepath, fpp); free(fpp); if (DoLogging) bozo_Log("%s is executing Install '%s'\n", caller, filepath); /* open file */ fpp = filepath + strlen(filepath); strcpy(fpp, ".NEW"); /* append ".NEW" to end of filepath */ fd = open(filepath, O_CREAT | O_RDWR | O_TRUNC, 0777); if (fd < 0) return errno; total = 0; while (1) { len = rx_Read(acall, tbuffer, sizeof(tbuffer)); if (len < 0) { close(fd); unlink(filepath); return 102; } if (len == 0) break; /* no more input */ code = write(fd, tbuffer, len); if (code != len) { close(fd); unlink(filepath); return 100; } total += len; /* track total written for safety check at end */ } close(fd); if (asize != total) { unlink(filepath); return 101; /* wrong size */ } /* save old files */ *fpp = '\0'; /* remove ".NEW" from end of filepath */ SaveOldFiles(filepath); /* don't care if it works, still install */ /* all done, rename to final name */ strcpy(tbuffer, filepath); strcat(tbuffer, ".NEW"); code = (rk_rename(tbuffer, filepath) ? errno : 0); /* label file with same time for our sanity */ #ifdef AFS_NT40_ENV utbuf.actime = utbuf.modtime = amtime; _utime(filepath, &utbuf); #else tvb[0].tv_sec = tvb[1].tv_sec = amtime; tvb[0].tv_usec = tvb[1].tv_usec = 0; utimes(filepath, tvb); #endif /* AFS_NT40_ENV */ if (mode) chmod(filepath, mode); if (code < 0) { osi_auditU(acall, BOS_InstallEvent, code, AUD_STR, filepath, AUD_END); return errno; } else return 0; }