#include <lwp.h>
#include <rx/rx.h>
#include <afs/afsutil.h>
+#include <opr/queue.h>
#include "bnode.h"
+#include "bnode_internal.h"
#include "bosprototypes.h"
extern char *DoPidFiles;
static int NudgeProcs(struct fsbnode *);
#ifdef AFS_NT40_ENV
-static void AppendExecutableExtension(char *cmd);
+static char *AppendExecutableExtension(char *cmd);
#else
-#define AppendExecutableExtension(x)
+#define AppendExecutableExtension(x) strdup(x)
#endif
struct bnode_ops fsbnode_ops = {
static int
SetSalFlag(struct fsbnode *abnode, int aflag)
{
- char tbuffer[AFSDIR_PATH_MAX];
+ char *filepath;
int fd;
/* don't use the salvage flag for demand attach fs */
if (abnode->salsrvcmd == NULL) {
abnode->needsSalvage = aflag;
- strcompose(tbuffer, AFSDIR_PATH_MAX, AFSDIR_SERVER_LOCAL_DIRPATH, "/",
- SALFILE, abnode->b.name, NULL);
+ if (asprintf(&filepath, "%s/%s%s", AFSDIR_SERVER_LOCAL_DIRPATH,
+ SALFILE, abnode->b.name) < 0)
+ return ENOMEM;
if (aflag) {
- fd = open(tbuffer, O_CREAT | O_TRUNC | O_RDWR, 0666);
+ fd = open(filepath, O_CREAT | O_TRUNC | O_RDWR, 0666);
close(fd);
} else {
- unlink(tbuffer);
+ unlink(filepath);
}
+ free(filepath);
}
return 0;
}
static int
RestoreSalFlag(struct fsbnode *abnode)
{
- char tbuffer[AFSDIR_PATH_MAX];
+ char *filepath;
/* never set needs salvage flag for demand attach fs */
if (abnode->salsrvcmd != NULL) {
abnode->needsSalvage = 0;
} else {
- strcompose(tbuffer, AFSDIR_PATH_MAX, AFSDIR_SERVER_LOCAL_DIRPATH, "/",
- SALFILE, abnode->b.name, NULL);
- if (access(tbuffer, 0) == 0) {
+ if (asprintf(&filepath, "%s/%s%s", AFSDIR_SERVER_LOCAL_DIRPATH,
+ SALFILE, abnode->b.name) < 0)
+ return ENOMEM;
+ if (access(filepath, 0) == 0) {
/* file exists, so need to salvage */
abnode->needsSalvage = 1;
} else {
abnode->needsSalvage = 0;
}
+ free(filepath);
}
return 0;
}
#ifdef AFS_NT40_ENV
-static void
+static char *
AppendExecutableExtension(char *cmd)
{
char cmdext[_MAX_EXT];
+ char *cmdexe;
_splitpath(cmd, NULL, NULL, NULL, cmdext);
if (*cmdext == '\0') {
- /* no filename extension supplied for cmd; append .exe */
- strcat(cmd, ".exe");
+ if (asprintf(&cmdexe, "%s.exe", cmd) < 0)
+ return NULL;
+ return cmdexe;
}
+ return strdup(cmd);
}
#endif /* AFS_NT40_ENV */
{
struct stat tstat;
struct fsbnode *te;
- char cmdname[AFSDIR_PATH_MAX];
+ char *cmdname = NULL;
char *fileCmdpath, *volCmdpath, *salCmdpath, *scanCmdpath;
int bailout = 0;
}
if (!bailout) {
- sscanf(fileCmdpath, "%s", cmdname);
- AppendExecutableExtension(cmdname);
+ cmdname = AppendExecutableExtension(fileCmdpath);
+ if (cmdname == NULL) {
+ bozo_Log("Out of memory constructing binary filename\n");
+ bailout = 1;
+ goto done;
+ }
if (stat(cmdname, &tstat)) {
bozo_Log("BNODE: file server binary '%s' not found\n", cmdname);
bailout = 1;
goto done;
}
+ free(cmdname);
- sscanf(volCmdpath, "%s", cmdname);
- AppendExecutableExtension(cmdname);
+ cmdname = AppendExecutableExtension(volCmdpath);
+ if (cmdname == NULL) {
+ bozo_Log("Out of memory constructing binary filename\n");
+ bailout = 1;
+ goto done;
+ }
if (stat(cmdname, &tstat)) {
bozo_Log("BNODE: volume server binary '%s' not found\n", cmdname);
bailout = 1;
goto done;
}
+ free(cmdname);
- sscanf(salCmdpath, "%s", cmdname);
- AppendExecutableExtension(cmdname);
+ cmdname = AppendExecutableExtension(salCmdpath);
+ if (cmdname == NULL) {
+ bozo_Log("Out of memory constructing binary filename\n");
+ bailout = 1;
+ goto done;
+ }
if (stat(cmdname, &tstat)) {
bozo_Log("BNODE: salvager binary '%s' not found\n", cmdname);
bailout = 1;
}
if (ascancmd && strlen(ascancmd)) {
- sscanf(scanCmdpath, "%s", cmdname);
- AppendExecutableExtension(cmdname);
+ free(cmdname);
+ cmdname = AppendExecutableExtension(scanCmdpath);
+ if (cmdname == NULL) {
+ bozo_Log("Out of memory constructing binary filename\n");
+ bailout = 1;
+ goto done;
+ }
if (stat(cmdname, &tstat)) {
bozo_Log("BNODE: scanner binary '%s' not found\n", cmdname);
bailout = 1;
SetNeedsClock(te); /* compute needsClock field */
done:
+ free(cmdname);
if (bailout) {
if (te)
free(te);
{
struct stat tstat;
struct fsbnode *te;
- char cmdname[AFSDIR_PATH_MAX];
+ char *cmdname = NULL;
char *fileCmdpath, *volCmdpath, *salsrvCmdpath, *salCmdpath, *scanCmdpath;
int bailout = 0;
}
if (!bailout) {
- sscanf(fileCmdpath, "%s", cmdname);
- AppendExecutableExtension(cmdname);
+ cmdname = AppendExecutableExtension(fileCmdpath);
+ if (cmdname == NULL) {
+ bozo_Log("Out of memory constructing binary filename\n");
+ bailout = 1;
+ goto done;
+ }
if (stat(cmdname, &tstat)) {
bozo_Log("BNODE: file server binary '%s' not found\n", cmdname);
bailout = 1;
goto done;
}
+ free(cmdname);
- sscanf(volCmdpath, "%s", cmdname);
- AppendExecutableExtension(cmdname);
+ cmdname = AppendExecutableExtension(volCmdpath);
+ if (cmdname == NULL) {
+ bozo_Log("Out of memory constructing binary filename\n");
+ bailout = 1;
+ goto done;
+ }
if (stat(cmdname, &tstat)) {
bozo_Log("BNODE: volume server binary '%s' not found\n", cmdname);
bailout = 1;
goto done;
}
+ free(cmdname);
- sscanf(salsrvCmdpath, "%s", cmdname);
- AppendExecutableExtension(cmdname);
+ cmdname = AppendExecutableExtension(salsrvCmdpath);
+ if (cmdname == NULL) {
+ bozo_Log("Out of memory constructing binary filename\n");
+ bailout = 1;
+ goto done;
+ }
if (stat(cmdname, &tstat)) {
bozo_Log("BNODE: salvageserver binary '%s' not found\n", cmdname);
bailout = 1;
goto done;
}
+ free(cmdname);
- sscanf(salCmdpath, "%s", cmdname);
- AppendExecutableExtension(cmdname);
+ cmdname = AppendExecutableExtension(salCmdpath);
+ if (cmdname == NULL) {
+ bozo_Log("Out of memory constructing binary filename\n");
+ bailout = 1;
+ goto done;
+ }
if (stat(cmdname, &tstat)) {
bozo_Log("BNODE: salvager binary '%s' not found\n", cmdname);
bailout = 1;
}
if (ascancmd && strlen(ascancmd)) {
- sscanf(scanCmdpath, "%s", cmdname);
- AppendExecutableExtension(cmdname);
+ free(cmdname);
+ cmdname = AppendExecutableExtension(scanCmdpath);
+ if (cmdname == NULL) {
+ bozo_Log("Out of memory constructing binary filename\n");
+ bailout = 1;
+ goto done;
+ }
if (stat(cmdname, &tstat)) {
bozo_Log("BNODE: scanner binary '%s' not found\n", cmdname);
bailout = 1;
SetNeedsClock(te); /* compute needsClock field */
done:
+ free(cmdname);
if (bailout) {
if (te)
free(te);
{
afs_int32 timeout = POLLTIME;
- if (ab->b.goal == 1 && ab->fileRunning && ab->volRunning
+ if ((ab->fileSDW && !ab->fileKillSent) || (ab->volSDW && !ab->volKillSent)
+ || (ab->scanSDW && !ab->scanKillSent) || (ab->salSDW && !ab->salKillSent)
+ || (ab->salsrvSDW && !ab->salsrvKillSent)) {
+ /* SIGQUIT sent, will send SIGKILL if process does not exit */
+ ab->needsClock = 1;
+ } else if (ab->b.goal == 1 && ab->fileRunning && ab->volRunning
&& (!ab->scancmd || ab->scanRunning)
&& (!ab->salsrvcmd || ab->salsrvRunning)) {
if (ab->b.errorStopCount) {