/* -*-c-*-
*
- * $Id$
- *
* Lock a file, run a program
*
* (c) 2003 Mark Wooding
*/
-/*----- Licensing notice --------------------------------------------------*
+/*----- Licensing notice --------------------------------------------------*
*
* This file is part of the Toys utilties collection.
*
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* Toys is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with Toys; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
}
static void version(FILE *fp)
-{
- pquis(fp, "$ (version " VERSION ")\n");
-}
+ { pquis(fp, "$ (version " VERSION ")\n"); }
static void help(FILE *fp)
{
unsigned int ot = 0;
time_t nt;
pid_t kid;
- int st;
+ int rc;
#define f_bogus 1u
#define f_wait 2u
int i = mdwopt(argc, argv, "-hvuw+f+c+x+p:t:", opts,
0, 0, OPTF_NEGATION);
- if (i < 0)
- break;
+ if (i < 0) break;
switch (i) {
- case 'h':
- help(stdout);
- exit(0);
- case 'v':
- version(stdout);
- exit(0);
- case 'u':
- usage(stdout);
- exit(0);
- case 'w':
- f |= f_wait;
- break;
- case 'w' | OPTF_NEGATED:
- f &= ~f_wait;
- break;
- case 'f':
- f |= f_fail;
- break;
- case 'f' | OPTF_NEGATED:
- f &= ~f_fail;
- break;
- case 'c':
- f |= f_create;
- break;
- case 'c' | OPTF_NEGATED:
- f &= ~f_create;
- break;
- case 'x':
- f |= f_excl;
- break;
- case 'x' | OPTF_NEGATED:
- f &= ~f_excl;
- break;
+ case 'h': help(stdout); exit(0);
+ case 'v': version(stdout); exit(0);
+ case 'u': usage(stdout); exit(0);
+ case 'w': f |= f_wait; break;
+ case 'w' | OPTF_NEGATED: f &= ~f_wait; break;
+ case 'f': f |= f_fail; break;
+ case 'f' | OPTF_NEGATED: f &= ~f_fail; break;
+ case 'c': f |= f_create; break;
+ case 'c' | OPTF_NEGATED: f &= ~f_create; break;
+ case 'x': f |= f_excl; break;
+ case 'x' | OPTF_NEGATED: f &= ~f_excl; break;
case 't':
errno = 0;
t = strtol(optarg, &p, 0);
case 0: break;
default: die(111, "unknown time unit `%c'", *p);
}
- if (*p || t < 0 || errno)
- die(111, "bad time value `%s'", optarg);
+ if (*p || t < 0 || errno) die(111, "bad time value `%s'", optarg);
f |= f_wait;
break;
- case 'p':
- prog = optarg;
- break;
+ case 'p': prog = optarg; break;
case 0:
- if (file) {
- optind--;
- goto doneopts;
- }
+ if (file) { optind--; goto doneopts; }
file = optarg;
break;
- default:
- f |= f_bogus;
- break;
+ default: f |= f_bogus; break;
}
}
}
av = &argv[optind];
- if (!prog)
- prog = av[0];
+ if (!prog) prog = av[0];
if ((fd = open(file,
((f & f_create ? O_CREAT : 0) |
(f & f_excl ? O_RDWR : O_RDONLY)), 0666)) < 0)
} else {
ot = alarm(0);
oalrm = signal(SIGALRM, alrm);
- if (t >= 0)
- alarm(t);
- if (fcntl(fd, f & f_wait ? F_SETLKW : F_SETLK, &l) >= 0)
- errno = 0;
+ if (t >= 0) alarm(t);
+ if (fcntl(fd, f & f_wait ? F_SETLKW : F_SETLK, &l) >= 0) errno = 0;
}
signal(SIGALRM, oalrm);
- if (ot) {
+ if (!ot)
+ alarm(0);
+ else {
nt = time(0) - nt;
- if (nt > ot)
- raise(SIGALRM);
- else
- alarm(ot - nt);
+ if (nt > ot) raise(SIGALRM);
+ else alarm(ot - nt);
}
if (errno &&
((errno != EAGAIN && errno != EWOULDBLOCK && errno != EACCES) ||
(f & f_fail)))
die(111, "error locking `%s': %s", file, strerror(errno));
- if (errno)
- exit(0);
+ if (errno) exit(0);
- if ((kid = fork()) < 0)
- die(111, "error from fork: %s", strerror(errno));
+ if ((kid = fork()) < 0) die(111, "error from fork: %s", strerror(errno));
if (!kid) {
close(fd);
execvp(prog, av);
die(111, "couldn't exec `%s': %s", prog, strerror(errno));
}
- if (waitpid(kid, &st, 0) < 0)
+ if (waitpid(kid, &rc, 0) < 0)
die(EXIT_FAILURE, "error from wait: %s", strerror(errno));
l.l_type = F_UNLCK;
l.l_whence = SEEK_SET;
l.l_len = 0;
fcntl(fd, F_SETLK, &l);
close(fd);
- if (WIFEXITED(st))
- exit(WEXITSTATUS(st));
- else
- exit(255);
+ if (WIFEXITED(rc)) exit(WEXITSTATUS(rc));
+ else exit(255);
}
/*----- That's all, folks -------------------------------------------------*/