remove runit/runit_lib.c
function old new delta runsv_main 1770 1786 +16 svstatus_get 176 188 +12 sv_main 1180 1186 +6 runsvdir_main 683 689 +6 processorstart 385 391 +6 control 126 132 +6 logdir_open 1184 1187 +3 lock_exnb 14 - -14 lock_ex 14 - -14 open_write 17 - -17 open_read 17 - -17 ------------------------------------------------------------------------------ (add/remove: 0/5 grow/shrink: 7/0 up/down: 55/-62) Total: -7 bytes Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
This commit is contained in:
parent
b1db09be5a
commit
05e8605ab8
@ -8,10 +8,10 @@ lib-y:=
|
|||||||
|
|
||||||
INSERT
|
INSERT
|
||||||
|
|
||||||
lib-$(CONFIG_RUNSV) += runsv.o runit_lib.o
|
lib-$(CONFIG_RUNSV) += runsv.o
|
||||||
lib-$(CONFIG_RUNSVDIR) += runsvdir.o runit_lib.o
|
lib-$(CONFIG_RUNSVDIR) += runsvdir.o
|
||||||
lib-$(CONFIG_SV) += sv.o runit_lib.o
|
lib-$(CONFIG_SV) += sv.o
|
||||||
lib-$(CONFIG_SVLOGD) += svlogd.o runit_lib.o
|
lib-$(CONFIG_SVLOGD) += svlogd.o
|
||||||
lib-$(CONFIG_CHPST) += chpst.o
|
lib-$(CONFIG_CHPST) += chpst.o
|
||||||
|
|
||||||
lib-$(CONFIG_ENVDIR) += chpst.o
|
lib-$(CONFIG_ENVDIR) += chpst.o
|
||||||
|
@ -1,275 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2001-2006, Gerrit Pape
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer.
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
3. The name of the author may not be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
||||||
EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
||||||
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
||||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Busyboxed by Denys Vlasenko <vda.linux@googlemail.com> */
|
|
||||||
/* Collected into one file from runit's many tiny files */
|
|
||||||
/* TODO: review, eliminate unneeded stuff, move good stuff to libbb */
|
|
||||||
|
|
||||||
#include <sys/poll.h>
|
|
||||||
#include <sys/file.h>
|
|
||||||
#include "libbb.h"
|
|
||||||
#include "runit_lib.h"
|
|
||||||
|
|
||||||
#ifdef UNUSED
|
|
||||||
unsigned byte_chr(char *s,unsigned n,int c)
|
|
||||||
{
|
|
||||||
char ch;
|
|
||||||
char *t;
|
|
||||||
|
|
||||||
ch = c;
|
|
||||||
t = s;
|
|
||||||
for (;;) {
|
|
||||||
if (!n) break;
|
|
||||||
if (*t == ch) break;
|
|
||||||
++t;
|
|
||||||
--n;
|
|
||||||
}
|
|
||||||
return t - s;
|
|
||||||
}
|
|
||||||
|
|
||||||
static /* as it isn't used anywhere else */
|
|
||||||
void tai_pack(char *s, const struct tai *t)
|
|
||||||
{
|
|
||||||
uint64_t x;
|
|
||||||
|
|
||||||
x = t->x;
|
|
||||||
s[7] = x & 255; x >>= 8;
|
|
||||||
s[6] = x & 255; x >>= 8;
|
|
||||||
s[5] = x & 255; x >>= 8;
|
|
||||||
s[4] = x & 255; x >>= 8;
|
|
||||||
s[3] = x & 255; x >>= 8;
|
|
||||||
s[2] = x & 255; x >>= 8;
|
|
||||||
s[1] = x & 255; x >>= 8;
|
|
||||||
s[0] = x;
|
|
||||||
}
|
|
||||||
|
|
||||||
void tai_unpack(const char *s,struct tai *t)
|
|
||||||
{
|
|
||||||
uint64_t x;
|
|
||||||
|
|
||||||
x = (unsigned char) s[0];
|
|
||||||
x <<= 8; x += (unsigned char) s[1];
|
|
||||||
x <<= 8; x += (unsigned char) s[2];
|
|
||||||
x <<= 8; x += (unsigned char) s[3];
|
|
||||||
x <<= 8; x += (unsigned char) s[4];
|
|
||||||
x <<= 8; x += (unsigned char) s[5];
|
|
||||||
x <<= 8; x += (unsigned char) s[6];
|
|
||||||
x <<= 8; x += (unsigned char) s[7];
|
|
||||||
t->x = x;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void taia_add(struct taia *t,const struct taia *u,const struct taia *v)
|
|
||||||
{
|
|
||||||
t->sec.x = u->sec.x + v->sec.x;
|
|
||||||
t->nano = u->nano + v->nano;
|
|
||||||
t->atto = u->atto + v->atto;
|
|
||||||
if (t->atto > 999999999UL) {
|
|
||||||
t->atto -= 1000000000UL;
|
|
||||||
++t->nano;
|
|
||||||
}
|
|
||||||
if (t->nano > 999999999UL) {
|
|
||||||
t->nano -= 1000000000UL;
|
|
||||||
++t->sec.x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int taia_less(const struct taia *t, const struct taia *u)
|
|
||||||
{
|
|
||||||
if (t->sec.x < u->sec.x) return 1;
|
|
||||||
if (t->sec.x > u->sec.x) return 0;
|
|
||||||
if (t->nano < u->nano) return 1;
|
|
||||||
if (t->nano > u->nano) return 0;
|
|
||||||
return t->atto < u->atto;
|
|
||||||
}
|
|
||||||
|
|
||||||
void taia_now(struct taia *t)
|
|
||||||
{
|
|
||||||
struct timeval now;
|
|
||||||
gettimeofday(&now, NULL);
|
|
||||||
tai_unix(&t->sec, now.tv_sec);
|
|
||||||
t->nano = 1000 * now.tv_usec + 500;
|
|
||||||
t->atto = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* UNUSED
|
|
||||||
void taia_pack(char *s, const struct taia *t)
|
|
||||||
{
|
|
||||||
unsigned long x;
|
|
||||||
|
|
||||||
tai_pack(s, &t->sec);
|
|
||||||
s += 8;
|
|
||||||
|
|
||||||
x = t->atto;
|
|
||||||
s[7] = x & 255; x >>= 8;
|
|
||||||
s[6] = x & 255; x >>= 8;
|
|
||||||
s[5] = x & 255; x >>= 8;
|
|
||||||
s[4] = x;
|
|
||||||
x = t->nano;
|
|
||||||
s[3] = x & 255; x >>= 8;
|
|
||||||
s[2] = x & 255; x >>= 8;
|
|
||||||
s[1] = x & 255; x >>= 8;
|
|
||||||
s[0] = x;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
void taia_sub(struct taia *t, const struct taia *u, const struct taia *v)
|
|
||||||
{
|
|
||||||
unsigned long unano = u->nano;
|
|
||||||
unsigned long uatto = u->atto;
|
|
||||||
|
|
||||||
t->sec.x = u->sec.x - v->sec.x;
|
|
||||||
t->nano = unano - v->nano;
|
|
||||||
t->atto = uatto - v->atto;
|
|
||||||
if (t->atto > uatto) {
|
|
||||||
t->atto += 1000000000UL;
|
|
||||||
--t->nano;
|
|
||||||
}
|
|
||||||
if (t->nano > unano) {
|
|
||||||
t->nano += 1000000000UL;
|
|
||||||
--t->sec.x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* XXX: breaks tai encapsulation */
|
|
||||||
void taia_uint(struct taia *t, unsigned s)
|
|
||||||
{
|
|
||||||
t->sec.x = s;
|
|
||||||
t->nano = 0;
|
|
||||||
t->atto = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static
|
|
||||||
uint64_t taia2millisec(const struct taia *t)
|
|
||||||
{
|
|
||||||
return (t->sec.x * 1000) + (t->nano / 1000000);
|
|
||||||
}
|
|
||||||
|
|
||||||
void iopause(iopause_fd *x, unsigned len, struct taia *deadline, struct taia *stamp)
|
|
||||||
{
|
|
||||||
int millisecs;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (taia_less(deadline, stamp))
|
|
||||||
millisecs = 0;
|
|
||||||
else {
|
|
||||||
uint64_t m;
|
|
||||||
struct taia t;
|
|
||||||
t = *stamp;
|
|
||||||
taia_sub(&t, deadline, &t);
|
|
||||||
millisecs = m = taia2millisec(&t);
|
|
||||||
if (m > 1000) millisecs = 1000;
|
|
||||||
millisecs += 20;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < len; ++i)
|
|
||||||
x[i].revents = 0;
|
|
||||||
|
|
||||||
poll(x, len, millisecs);
|
|
||||||
/* XXX: some kernels apparently need x[0] even if len is 0 */
|
|
||||||
/* XXX: how to handle EAGAIN? are kernels really this dumb? */
|
|
||||||
/* XXX: how to handle EINVAL? when exactly can this happen? */
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int lock_ex(int fd)
|
|
||||||
{
|
|
||||||
return flock(fd, LOCK_EX);
|
|
||||||
}
|
|
||||||
|
|
||||||
int lock_exnb(int fd)
|
|
||||||
{
|
|
||||||
return flock(fd, LOCK_EX | LOCK_NB);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef UNUSED
|
|
||||||
int open_append(const char *fn)
|
|
||||||
{
|
|
||||||
return open(fn, O_WRONLY | O_NDELAY | O_APPEND | O_CREAT, 0600);
|
|
||||||
}
|
|
||||||
|
|
||||||
int open_trunc(const char *fn)
|
|
||||||
{
|
|
||||||
return open(fn, O_WRONLY | O_NDELAY | O_TRUNC | O_CREAT, 0644);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int open_read(const char *fn)
|
|
||||||
{
|
|
||||||
return open(fn, O_RDONLY|O_NDELAY);
|
|
||||||
}
|
|
||||||
|
|
||||||
int open_write(const char *fn)
|
|
||||||
{
|
|
||||||
return open(fn, O_WRONLY|O_NDELAY);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned FAST_FUNC pmatch(const char *p, const char *s, unsigned len)
|
|
||||||
{
|
|
||||||
for (;;) {
|
|
||||||
char c = *p++;
|
|
||||||
if (!c) return !len;
|
|
||||||
switch (c) {
|
|
||||||
case '*':
|
|
||||||
c = *p;
|
|
||||||
if (!c) return 1;
|
|
||||||
for (;;) {
|
|
||||||
if (!len) return 0;
|
|
||||||
if (*s == c) break;
|
|
||||||
++s;
|
|
||||||
--len;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
case '+':
|
|
||||||
c = *p++;
|
|
||||||
if (c != *s) return 0;
|
|
||||||
for (;;) {
|
|
||||||
if (!len) return 1;
|
|
||||||
if (*s != c) break;
|
|
||||||
++s;
|
|
||||||
--len;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
/*
|
|
||||||
case '?':
|
|
||||||
if (*p == '?') {
|
|
||||||
if (*s != '?') return 0;
|
|
||||||
++p;
|
|
||||||
}
|
|
||||||
++s; --len;
|
|
||||||
continue;
|
|
||||||
*/
|
|
||||||
default:
|
|
||||||
if (!len) return 0;
|
|
||||||
if (*s != c) return 0;
|
|
||||||
++s;
|
|
||||||
--len;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -27,59 +27,6 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
|
PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
|
||||||
|
|
||||||
//extern unsigned byte_chr(char *s,unsigned n,int c);
|
|
||||||
//
|
|
||||||
//struct tai {
|
|
||||||
// uint64_t x;
|
|
||||||
//};
|
|
||||||
//
|
|
||||||
//#define tai_unix(t,u) ((void) ((t)->x = 0x400000000000000aULL + (uint64_t) (u)))
|
|
||||||
//
|
|
||||||
//#define TAI_PACK 8
|
|
||||||
//extern void tai_unpack(const char *,struct tai *);
|
|
||||||
//
|
|
||||||
//extern void tai_uint(struct tai *,unsigned);
|
|
||||||
//
|
|
||||||
//struct taia {
|
|
||||||
// struct tai sec;
|
|
||||||
// unsigned long nano; /* 0...999999999 */
|
|
||||||
// unsigned long atto; /* 0...999999999 */
|
|
||||||
//};
|
|
||||||
//
|
|
||||||
//extern void taia_now(struct taia *);
|
|
||||||
//
|
|
||||||
//extern void taia_add(struct taia *,const struct taia *,const struct taia *);
|
|
||||||
//extern void taia_addsec(struct taia *,const struct taia *,int);
|
|
||||||
//extern void taia_sub(struct taia *,const struct taia *,const struct taia *);
|
|
||||||
//extern void taia_half(struct taia *,const struct taia *);
|
|
||||||
//extern int taia_less(const struct taia *,const struct taia *);
|
|
||||||
//
|
|
||||||
//#define TAIA_PACK 16
|
|
||||||
//extern void taia_pack(char *,const struct taia *);
|
|
||||||
//
|
|
||||||
//extern void taia_uint(struct taia *,unsigned);
|
|
||||||
//
|
|
||||||
//typedef struct pollfd iopause_fd;
|
|
||||||
//#define IOPAUSE_READ POLLIN
|
|
||||||
//#define IOPAUSE_WRITE POLLOUT
|
|
||||||
//
|
|
||||||
//extern void iopause(iopause_fd *,unsigned,struct taia *,struct taia *);
|
|
||||||
|
|
||||||
extern int lock_ex(int);
|
|
||||||
//extern int lock_un(int);
|
|
||||||
extern int lock_exnb(int);
|
|
||||||
|
|
||||||
extern int open_read(const char *);
|
|
||||||
extern int open_write(const char *);
|
|
||||||
//extern int open_excl(const char *);
|
|
||||||
//extern int open_append(const char *);
|
|
||||||
//extern int open_trunc(const char *);
|
|
||||||
|
|
||||||
extern unsigned FAST_FUNC pmatch(const char *, const char *, unsigned);
|
|
||||||
|
|
||||||
//#define str_diff(s,t) strcmp((s), (t))
|
|
||||||
#define str_equal(s,t) (!strcmp((s), (t)))
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* runsv / supervise / sv stuff
|
* runsv / supervise / sv stuff
|
||||||
*/
|
*/
|
||||||
|
@ -524,7 +524,7 @@ int runsv_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
}
|
}
|
||||||
svd[0].fdlock = xopen3("log/supervise/lock"+4,
|
svd[0].fdlock = xopen3("log/supervise/lock"+4,
|
||||||
O_WRONLY|O_NDELAY|O_APPEND|O_CREAT, 0600);
|
O_WRONLY|O_NDELAY|O_APPEND|O_CREAT, 0600);
|
||||||
if (lock_exnb(svd[0].fdlock) == -1)
|
if (flock(svd[0].fdlock, LOCK_EX | LOCK_NB) == -1)
|
||||||
fatal_cannot("lock supervise/lock");
|
fatal_cannot("lock supervise/lock");
|
||||||
close_on_exec_on(svd[0].fdlock);
|
close_on_exec_on(svd[0].fdlock);
|
||||||
if (haslog) {
|
if (haslog) {
|
||||||
@ -548,7 +548,7 @@ int runsv_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
}
|
}
|
||||||
svd[1].fdlock = xopen3("log/supervise/lock",
|
svd[1].fdlock = xopen3("log/supervise/lock",
|
||||||
O_WRONLY|O_NDELAY|O_APPEND|O_CREAT, 0600);
|
O_WRONLY|O_NDELAY|O_APPEND|O_CREAT, 0600);
|
||||||
if (lock_ex(svd[1].fdlock) == -1)
|
if (flock(svd[1].fdlock, LOCK_EX) == -1)
|
||||||
fatal_cannot("lock log/supervise/lock");
|
fatal_cannot("lock log/supervise/lock");
|
||||||
close_on_exec_on(svd[1].fdlock);
|
close_on_exec_on(svd[1].fdlock);
|
||||||
}
|
}
|
||||||
@ -618,7 +618,7 @@ int runsv_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
pidchanged = 1;
|
pidchanged = 1;
|
||||||
svd[0].ctrl &= ~C_TERM;
|
svd[0].ctrl &= ~C_TERM;
|
||||||
if (svd[0].state != S_FINISH) {
|
if (svd[0].state != S_FINISH) {
|
||||||
fd = open_read("finish");
|
fd = open("finish", O_RDONLY|O_NDELAY);
|
||||||
if (fd != -1) {
|
if (fd != -1) {
|
||||||
close(fd);
|
close(fd);
|
||||||
svd[0].state = S_FINISH;
|
svd[0].state = S_FINISH;
|
||||||
|
@ -276,7 +276,7 @@ int runsvdir_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
}
|
}
|
||||||
run:
|
run:
|
||||||
#endif
|
#endif
|
||||||
curdir = open_read(".");
|
curdir = open(".", O_RDONLY|O_NDELAY);
|
||||||
if (curdir == -1)
|
if (curdir == -1)
|
||||||
fatal2_cannot("open current directory", "");
|
fatal2_cannot("open current directory", "");
|
||||||
close_on_exec_on(curdir);
|
close_on_exec_on(curdir);
|
||||||
|
11
runit/sv.c
11
runit/sv.c
@ -176,6 +176,9 @@ struct globals {
|
|||||||
#define INIT_G() do { } while (0)
|
#define INIT_G() do { } while (0)
|
||||||
|
|
||||||
|
|
||||||
|
#define str_equal(s,t) (!strcmp((s), (t)))
|
||||||
|
|
||||||
|
|
||||||
static void fatal_cannot(const char *m1) NORETURN;
|
static void fatal_cannot(const char *m1) NORETURN;
|
||||||
static void fatal_cannot(const char *m1)
|
static void fatal_cannot(const char *m1)
|
||||||
{
|
{
|
||||||
@ -221,7 +224,7 @@ static int svstatus_get(void)
|
|||||||
{
|
{
|
||||||
int fd, r;
|
int fd, r;
|
||||||
|
|
||||||
fd = open_write("supervise/ok");
|
fd = open("supervise/ok", O_WRONLY|O_NDELAY);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
if (errno == ENODEV) {
|
if (errno == ENODEV) {
|
||||||
*acts == 'x' ? ok("runsv not running")
|
*acts == 'x' ? ok("runsv not running")
|
||||||
@ -232,7 +235,7 @@ static int svstatus_get(void)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
close(fd);
|
close(fd);
|
||||||
fd = open_read("supervise/status");
|
fd = open("supervise/status", O_RDONLY|O_NDELAY);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
warn("can't open supervise/status");
|
warn("can't open supervise/status");
|
||||||
return -1;
|
return -1;
|
||||||
@ -397,7 +400,7 @@ static int control(const char *a)
|
|||||||
if (svstatus.want == *a)
|
if (svstatus.want == *a)
|
||||||
return 0;
|
return 0;
|
||||||
*/
|
*/
|
||||||
fd = open_write("supervise/control");
|
fd = open("supervise/control", O_WRONLY|O_NDELAY);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
if (errno != ENODEV)
|
if (errno != ENODEV)
|
||||||
warn("can't open supervise/control");
|
warn("can't open supervise/control");
|
||||||
@ -446,7 +449,7 @@ int sv_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
|
|
||||||
tnow = time(NULL) + 0x400000000000000aULL;
|
tnow = time(NULL) + 0x400000000000000aULL;
|
||||||
tstart = tnow;
|
tstart = tnow;
|
||||||
curdir = open_read(".");
|
curdir = open(".", O_RDONLY|O_NDELAY);
|
||||||
if (curdir == -1)
|
if (curdir == -1)
|
||||||
fatal_cannot("open current directory");
|
fatal_cannot("open current directory");
|
||||||
|
|
||||||
|
@ -261,6 +261,52 @@ static char* wstrdup(const char *str)
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned pmatch(const char *p, const char *s, unsigned len)
|
||||||
|
{
|
||||||
|
for (;;) {
|
||||||
|
char c = *p++;
|
||||||
|
if (!c) return !len;
|
||||||
|
switch (c) {
|
||||||
|
case '*':
|
||||||
|
c = *p;
|
||||||
|
if (!c) return 1;
|
||||||
|
for (;;) {
|
||||||
|
if (!len) return 0;
|
||||||
|
if (*s == c) break;
|
||||||
|
++s;
|
||||||
|
--len;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
case '+':
|
||||||
|
c = *p++;
|
||||||
|
if (c != *s) return 0;
|
||||||
|
for (;;) {
|
||||||
|
if (!len) return 1;
|
||||||
|
if (*s != c) break;
|
||||||
|
++s;
|
||||||
|
--len;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
/*
|
||||||
|
case '?':
|
||||||
|
if (*p == '?') {
|
||||||
|
if (*s != '?') return 0;
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
++s; --len;
|
||||||
|
continue;
|
||||||
|
*/
|
||||||
|
default:
|
||||||
|
if (!len) return 0;
|
||||||
|
if (*s != c) return 0;
|
||||||
|
++s;
|
||||||
|
--len;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*** ex fmt_ptime.[ch] ***/
|
/*** ex fmt_ptime.[ch] ***/
|
||||||
|
|
||||||
/* NUL terminated */
|
/* NUL terminated */
|
||||||
@ -342,7 +388,7 @@ static void processorstart(struct logdir *ld)
|
|||||||
ld->fnsave[26] = 't'; /* <- that's why we need sv_ch! */
|
ld->fnsave[26] = 't'; /* <- that's why we need sv_ch! */
|
||||||
fd = xopen(ld->fnsave, O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT);
|
fd = xopen(ld->fnsave, O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT);
|
||||||
xmove_fd(fd, 1);
|
xmove_fd(fd, 1);
|
||||||
fd = open_read("state");
|
fd = open("state", O_RDONLY|O_NDELAY);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
if (errno != ENOENT)
|
if (errno != ENOENT)
|
||||||
bb_perror_msg_and_die(FATAL"can't %s processor %s", "open state for", ld->name);
|
bb_perror_msg_and_die(FATAL"can't %s processor %s", "open state for", ld->name);
|
||||||
@ -626,7 +672,7 @@ static NOINLINE unsigned logdir_open(struct logdir *ld, const char *fn)
|
|||||||
}
|
}
|
||||||
ld->fdlock = open("lock", O_WRONLY|O_NDELAY|O_APPEND|O_CREAT, 0600);
|
ld->fdlock = open("lock", O_WRONLY|O_NDELAY|O_APPEND|O_CREAT, 0600);
|
||||||
if ((ld->fdlock == -1)
|
if ((ld->fdlock == -1)
|
||||||
|| (lock_exnb(ld->fdlock) == -1)
|
|| (flock(ld->fdlock, LOCK_EX | LOCK_NB) == -1)
|
||||||
) {
|
) {
|
||||||
logdir_close(ld);
|
logdir_close(ld);
|
||||||
warn2("can't lock directory", (char*)fn);
|
warn2("can't lock directory", (char*)fn);
|
||||||
|
Loading…
Reference in New Issue
Block a user