bozo: bosserver -pidfiles option
[openafs.git] / src / bozo / ezbnodeops.c
index 4921b25..9094895 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright 2000, International Business Machines Corporation and others.
  * All Rights Reserved.
- * 
+ *
  * This software has been released under the terms of the IBM Public
  * License.  For details, see the LICENSE file in the top-level source
  * directory or online at http://www.openafs.org/dl/license10.html
 #include <afsconfig.h>
 #include <afs/param.h>
 
-RCSID("$Header$");
+#include <afs/procmgmt.h>
+#include <roken.h>
 
-#include <sys/types.h>
-#include <errno.h>
-#include <sys/stat.h>
 #include <lwp.h>
+#include <rx/rx.h>
 #ifdef AFS_NT40_ENV
 #include <io.h>
 #endif
 
-#ifdef HAVE_STRING_H
-#include <string.h>
-#else
-#ifdef HAVE_STRINGS_H
-#include <strings.h>
-#endif
-#endif
-#include <stdlib.h>
-
 #include <afs/afsutil.h>
-#include <afs/procmgmt.h>  /* signal(), kill(), wait(), etc. */
 #include "bnode.h"
+#include "bosprototypes.h"
 
-static int ez_timeout(), ez_getstat(), ez_setstat(), ez_delete();
-static int ez_procexit(), ez_getstring(), ez_getparm(), ez_restartp();
-static int ez_hascore();
-struct bnode *ez_create();
+extern char *DoPidFiles;
 
-#define        SDTIME          60          /* time in seconds given to a process to evaporate */
+struct bnode *ez_create(char *, char *, char *, char *, char *, char *);
+static int ez_hascore(struct bnode *bnode);
+static int ez_restartp(struct bnode *bnode);
+static int ez_delete(struct bnode *bnode);
+static int ez_timeout(struct bnode *bnode);
+static int ez_getstat(struct bnode *bnode, afs_int32 *status);
+static int ez_setstat(struct bnode *bnode, afs_int32 status);
+static int ez_procexit(struct bnode *bnode, struct bnode_proc *proc);
+static int ez_getstring(struct bnode *bnode, char *abuffer, afs_int32 alen);
+static int ez_getparm(struct bnode *bnode, afs_int32, char *, afs_int32);
+static int ez_procstarted(struct bnode *bnode, struct bnode_proc *proc);
+
+#define        SDTIME          60      /* time in seconds given to a process to evaporate */
 
 struct bnode_ops ezbnode_ops = {
     ez_create,
@@ -51,45 +50,60 @@ struct bnode_ops ezbnode_ops = {
     ez_getparm,
     ez_restartp,
     ez_hascore,
+    ez_procstarted
 };
 
-static int ez_hascore(register struct ezbnode *abnode)
+static int
+ez_hascore(struct bnode *abnode)
 {
     char tbuffer[256];
 
     bnode_CoreName(abnode, NULL, tbuffer);
-    if (access(tbuffer, 0) == 0) return 1;
-    else return 0;
+    if (access(tbuffer, 0) == 0)
+       return 1;
+    else
+       return 0;
 }
 
-static int ez_restartp (register struct ezbnode *abnode)
+static int
+ez_restartp(struct bnode *bn)
 {
+    struct ezbnode *abnode = (struct ezbnode *)bn;
     struct bnode_token *tt;
-    register afs_int32 code;
+    afs_int32 code;
     struct stat tstat;
-    
+
     code = bnode_ParseLine(abnode->command, &tt);
-    if (code) return 0;
-    if (!tt) return 0;
+    if (code)
+       return 0;
+    if (!tt)
+       return 0;
     code = stat(tt->key, &tstat);
     if (code) {
        bnode_FreeTokens(tt);
        return 0;
     }
-    if (tstat.st_ctime > abnode->lastStart) code = 1;
-    else code = 0;
+    if (tstat.st_ctime > abnode->lastStart)
+       code = 1;
+    else
+       code = 0;
     bnode_FreeTokens(tt);
     return code;
 }
 
-static int ez_delete(struct ezbnode *abnode)
+static int
+ez_delete(struct bnode *bn)
 {
+    struct ezbnode *abnode = (struct ezbnode *)bn;
+
     free(abnode->command);
     free(abnode);
     return 0;
 }
 
-struct bnode *ez_create(char *ainstance, char *acommand)
+struct bnode *
+ez_create(char *ainstance, char *acommand, char *unused1, char *unused2,
+         char *unused3, char *unused4)
 {
     struct ezbnode *te;
     char *cmdpath;
@@ -99,86 +113,124 @@ struct bnode *ez_create(char *ainstance, char *acommand)
        return NULL;
     }
 
-    te = (struct ezbnode *) malloc(sizeof(struct ezbnode));
+    te = (struct ezbnode *)malloc(sizeof(struct ezbnode));
     memset(te, 0, sizeof(struct ezbnode));
-    if (bnode_InitBnode(te, &ezbnode_ops, ainstance) != 0) {
+    if (bnode_InitBnode((struct bnode *)te, &ezbnode_ops, ainstance) != 0) {
        free(te);
        return NULL;
     }
     te->command = cmdpath;
-    return (struct bnode *) te;
+    return (struct bnode *)te;
 }
 
 /* called to SIGKILL a process if it doesn't terminate normally */
-static int ez_timeout(struct ezbnode *abnode)
+static int
+ez_timeout(struct bnode *bn)
 {
-    if (!abnode->waitingForShutdown) return 0; /* spurious */
+    struct ezbnode *abnode = (struct ezbnode *)bn;
+
+    if (!abnode->waitingForShutdown)
+       return 0;               /* spurious */
     /* send kill and turn off timer */
     bnode_StopProc(abnode->proc, SIGKILL);
     abnode->killSent = 1;
-    bnode_SetTimeout(abnode, 0);
+    bnode_SetTimeout((struct bnode *)abnode, 0);
     return 0;
 }
 
-static int ez_getstat(struct ezbnode *abnode, afs_int32 *astatus)
+static int
+ez_getstat(struct bnode *bn, afs_int32 * astatus)
 {
-    register afs_int32 temp;
-    if (abnode->waitingForShutdown) temp = BSTAT_SHUTTINGDOWN;
-    else if (abnode->running) temp = BSTAT_NORMAL;
-    else temp = BSTAT_SHUTDOWN;
+    struct ezbnode *abnode = (struct ezbnode *)bn;
+
+    afs_int32 temp;
+    if (abnode->waitingForShutdown)
+       temp = BSTAT_SHUTTINGDOWN;
+    else if (abnode->running)
+       temp = BSTAT_NORMAL;
+    else
+       temp = BSTAT_SHUTDOWN;
     *astatus = temp;
     return 0;
 }
 
-static int ez_setstat(register struct ezbnode *abnode, afs_int32 astatus)
+static int
+ez_setstat(struct bnode *bn, afs_int32 astatus)
 {
+    struct ezbnode *abnode = (struct ezbnode *)bn;
+
     struct bnode_proc *tp;
-    register afs_int32 code;
+    afs_int32 code;
 
-    if (abnode->waitingForShutdown) return BZBUSY;
+    if (abnode->waitingForShutdown)
+       return BZBUSY;
     if (astatus == BSTAT_NORMAL && !abnode->running) {
        /* start up */
        abnode->lastStart = FT_ApproxTime();
-       code = bnode_NewProc(abnode, abnode->command, NULL, &tp);
-       if (code) return code;
+       code = bnode_NewProc((struct bnode *)abnode, abnode->command, NULL, &tp);
+       if (code)
+           return code;
        abnode->running = 1;
        abnode->proc = tp;
        return 0;
-    }
-    else if (astatus == BSTAT_SHUTDOWN && abnode->running) {
+    } else if (astatus == BSTAT_SHUTDOWN && abnode->running) {
        /* start shutdown */
        bnode_StopProc(abnode->proc, SIGTERM);
        abnode->waitingForShutdown = 1;
-       bnode_SetTimeout(abnode, SDTIME);
+       bnode_SetTimeout((struct bnode *)abnode, SDTIME);
        return 0;
     }
     return 0;
 }
 
-static int ez_procexit(struct ezbnode *abnode, struct bnode_proc *aproc)
+static int
+ez_procstarted(struct bnode *bn, struct bnode_proc *aproc)
+{
+    int code = 0;
+
+    if (DoPidFiles) {
+       code = bozo_CreatePidFile(bn->name, NULL, aproc->pid);
+    }
+    return code;;
+}
+
+static int
+ez_procexit(struct bnode *bn, struct bnode_proc *aproc)
 {
+    struct ezbnode *abnode = (struct ezbnode *)bn;
+
     /* process has exited */
-    register afs_int32 code;
+    afs_int32 code;
+
+    if (DoPidFiles) {
+       bozo_DeletePidFile(bn->name, NULL);
+    }
 
     abnode->waitingForShutdown = 0;
     abnode->running = 0;
     abnode->killSent = 0;
-    abnode->proc = (struct bnode_proc *) 0;
-    bnode_SetTimeout(abnode, 0);       /* clear timer */
+    abnode->proc = NULL;
+    bnode_SetTimeout((struct bnode *) abnode, 0);      /* clear timer */
     if (abnode->b.goal)
-       code = ez_setstat(abnode, BSTAT_NORMAL);
-    else code = 0;
+       code = ez_setstat((struct bnode *) abnode, BSTAT_NORMAL);
+    else
+       code = 0;
     return code;
 }
 
-static int ez_getstring(struct ezbnode *abnode, char *abuffer, afs_int32 alen)
+static int
+ez_getstring(struct bnode *abnode, char *abuffer, afs_int32 alen)
 {
-    return -1;     /* don't have much to add */
+    return -1;                 /* don't have much to add */
 }
 
-static ez_getparm(struct ezbnode *abnode, afs_int32 aindex, char *abuffer, afs_int32 alen)
+static int
+ez_getparm(struct bnode *bn, afs_int32 aindex, char *abuffer,
+          afs_int32 alen)
 {
-    if (aindex > 0) return BZDOM;
+    struct ezbnode *abnode = (struct ezbnode *) bn;
+    if (aindex > 0)
+       return BZDOM;
     strcpy(abuffer, abnode->command);
     return 0;
 }