/* * Copyright (c) 2004 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set * forth in the LICENSE file which can be found at the top level of * the sendmail distribution. */ #include "sm/generic.h" SM_RCSID("@(#)$Id: t-restart.c,v 1.2 2007/09/29 02:15:44 ca Exp $") #include "sm/ctype.h" #include "sm/sysexits.h" #include "sm/error.h" #include "sm/signal.h" #include #define PIDFN "t-restart.pid" #define SLEEPT 60 static int Verbose = 0; #include "rdwrcounter.c" static void usage(char *prg) { fprintf(stderr, "usage: %s [options] -f filename\n" "options:\n" "-n n: use n as limit [0]\n" "-p pidfile: use pidfile for writing pid [%s]\n" "-r n: use exit code n [0]\n" "-s n: sleep n seconds [%d]\n" "-V: increase verbosity\n\n" "%s reads a counter from filename and writes back counter + 1\n" "if counter is less then the limit then the program exits " "immediately\notherwise it will sleep for a while\n" , prg, PIDFN, SLEEPT, prg); exit(EX_USAGE); } int main(int argc, char *argv[]) { int c, cnt, cur, sleept, rc, rconce; pid_t pid; char *cntfn, *pidfn, *prg; FILE *pidfp; prg = argv[0]; cntfn = NULL; pidfn = PIDFN; pidfp = NULL; pid = getpid(); sleept = SLEEPT; rc = cnt = 0; rconce = 0; while ((c = getopt(argc, argv, "Af:n:p:Rr:s:V")) != -1) { switch (c) { case 'A': rc = EX_RESTARTALL; rconce = 1; break; case 'f': cntfn = optarg; break; case 'n': cnt = atoi(optarg); break; case 'p': pidfn = optarg; break; case 'R': rc = EX_RESTARTDEP; rconce = 1; break; case 'r': rc = atoi(optarg); break; case 's': sleept = atoi(optarg); break; case 'V': ++Verbose; break; case 'h': case '?': default: usage(prg); break; } } if (Verbose > 0) fprintf(stderr, "%s: pid=%ld\n", prg, (long) pid); /* get current invocation counter */ if (cntfn == NULL) { fprintf(stderr, "%s: missing -f filename\n", prg); return EX_USAGE; } c = rdwrcounter(prg, cntfn, &cur); if (c != 0) return c; if (Verbose > 0) fprintf(stderr, "%s: pid=%ld, cur=%d\n" , prg, (long) pid, cur); /* ugly hack: reset to "default" values after first invocation */ if (rc != 0 && cur > 0 && rconce) { rc = 0; sleept = SLEEPT; } /* write pid */ pidfp = fopen(pidfn, "w"); if (pidfp == NULL) { fprintf(stderr, "%s: can't open \"%s\"\n", prg, pidfn); exit(EX_OSERR); } fprintf(pidfp, "%ld\n", (long) pid); fclose(pidfp); pidfp = NULL; if (Verbose > 0) fprintf(stderr, "%s: pid=%ld, cur=%d, n=%d\n", prg, (long) pid, cur, cnt); if (cur >= cnt) return 0; sleep(sleept); if (Verbose > 0) fprintf(stderr, "%s: pid=%ld, done=%d\n", prg, (long) pid, rc); return rc; }