tftpd: small trivial shrink
[oweals/busybox.git] / runit / runit_lib.c
index ee69429b22164c13250fee23639ef9c667e6d21f..f33619d28fc22dc62c8c67095a4c53b7ba3a988d 100644 (file)
@@ -25,7 +25,7 @@ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-/* Busyboxed by Denis Vlasenko <vda.linux@googlemail.com> */
+/* 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 */
 
@@ -34,207 +34,6 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include "libbb.h"
 #include "runit_lib.h"
 
-/*** buffer.c ***/
-
-void buffer_init(buffer *s,int (*op)(int fd,char *buf,unsigned len),int fd,char *buf,unsigned len)
-{
-       s->x = buf;
-       s->fd = fd;
-       s->op = op;
-       s->p = 0;
-       s->n = len;
-}
-
-
-/*** buffer_get.c ***/
-
-static int oneread(int (*op)(int fd,char *buf,unsigned len),int fd,char *buf,unsigned len)
-{
-       int r;
-
-       for (;;) {
-               r = op(fd,buf,len);
-               if (r == -1 && errno == EINTR)
-                       continue;
-               return r;
-       }
-}
-
-static int getthis(buffer *s,char *buf,unsigned len)
-{
-       if (len > s->p) len = s->p;
-       s->p -= len;
-       memcpy(buf,s->x + s->n,len);
-       s->n += len;
-       return len;
-}
-
-int buffer_feed(buffer *s)
-{
-       int r;
-
-       if (s->p)
-               return s->p;
-       r = oneread(s->op,s->fd,s->x,s->n);
-       if (r <= 0)
-               return r;
-       s->p = r;
-       s->n -= r;
-       if (s->n > 0)
-               memmove(s->x + s->n,s->x,r);
-       return r;
-}
-
-int buffer_bget(buffer *s,char *buf,unsigned len)
-{
-       int r;
-
-       if (s->p > 0)
-               return getthis(s,buf,len);
-       if (s->n <= len)
-               return oneread(s->op,s->fd,buf,s->n);
-       r = buffer_feed(s);
-       if (r <= 0)
-               return r;
-       return getthis(s,buf,len);
-}
-
-int buffer_get(buffer *s,char *buf,unsigned len)
-{
-       int r;
-
-       if (s->p > 0)
-               return getthis(s,buf,len);
-       if (s->n <= len)
-               return oneread(s->op,s->fd,buf,len);
-       r = buffer_feed(s);
-       if (r <= 0)
-               return r;
-       return getthis(s,buf,len);
-}
-
-char *buffer_peek(buffer *s)
-{
-       return s->x + s->n;
-}
-
-void buffer_seek(buffer *s,unsigned len)
-{
-       s->n += len;
-       s->p -= len;
-}
-
-
-/*** buffer_put.c ***/
-
-static int allwrite(int (*op)(int fd,char *buf,unsigned len),int fd,const char *buf,unsigned len)
-{
-       int w;
-
-       while (len) {
-               w = op(fd,(char*)buf,len);
-               if (w == -1) {
-                       if (errno == EINTR)
-                               continue;
-                       return -1; /* note that some data may have been written */
-               }
-               /* if (w == 0) ;  luser's fault */
-               buf += w;
-               len -= w;
-       }
-       return 0;
-}
-
-int buffer_flush(buffer *s)
-{
-       int p;
-
-       p = s->p;
-       if (!p) return 0;
-       s->p = 0;
-       return allwrite(s->op,s->fd,s->x,p);
-}
-
-int buffer_putalign(buffer *s,const char *buf,unsigned len)
-{
-       unsigned n;
-
-       while (len > (n = s->n - s->p)) {
-               memcpy(s->x + s->p,buf,n);
-               s->p += n;
-               buf += n;
-               len -= n;
-               if (buffer_flush(s) == -1) return -1;
-       }
-       /* now len <= s->n - s->p */
-       memcpy(s->x + s->p,buf,len);
-       s->p += len;
-       return 0;
-}
-
-int buffer_put(buffer *s,const char *buf,unsigned len)
-{
-       unsigned n;
-
-       n = s->n;
-       if (len > n - s->p) {
-               if (buffer_flush(s) == -1) return -1;
-               /* now s->p == 0 */
-               if (n < BUFFER_OUTSIZE) n = BUFFER_OUTSIZE;
-               while (len > s->n) {
-                       if (n > len) n = len;
-                       if (allwrite(s->op,s->fd,buf,n) == -1) return -1;
-                       buf += n;
-                       len -= n;
-               }
-       }
-       /* now len <= s->n - s->p */
-       memcpy(s->x + s->p,buf,len);
-       s->p += len;
-       return 0;
-}
-
-int buffer_putflush(buffer *s,const char *buf,unsigned len)
-{
-       if (buffer_flush(s) == -1)
-               return -1;
-       return allwrite(s->op,s->fd,buf,len);
-}
-
-int buffer_putsalign(buffer *s,const char *buf)
-{
-       return buffer_putalign(s,buf,strlen(buf));
-}
-
-int buffer_puts(buffer *s,const char *buf)
-{
-       return buffer_put(s,buf,strlen(buf));
-}
-
-int buffer_putsflush(buffer *s,const char *buf)
-{
-       return buffer_putflush(s,buf,strlen(buf));
-}
-
-
-/*** buffer_read.c ***/
-
-int buffer_unixread(int fd,char *buf,unsigned len)
-{
-       return read(fd,buf,len);
-}
-
-
-/*** buffer_write.c ***/
-
-int buffer_unixwrite(int fd,char *buf,unsigned len)
-{
-       return write(fd,buf,len);
-}
-
-
-/*** byte_chr.c ***/
-
 unsigned byte_chr(char *s,unsigned n,int c)
 {
        char ch;
@@ -251,153 +50,9 @@ unsigned byte_chr(char *s,unsigned n,int c)
        return t - s;
 }
 
-
-/*** coe.c ***/
-
-int coe(int fd)
-{
-       return fcntl(fd,F_SETFD,FD_CLOEXEC);
-}
-
-
-/*** fd_copy.c ***/
-
-int fd_copy(int to,int from)
-{
-       if (to == from)
-               return 0;
-       if (fcntl(from,F_GETFL,0) == -1)
-               return -1;
-       close(to);
-       if (fcntl(from,F_DUPFD,to) == -1)
-               return -1;
-       return 0;
-}
-
-
-/*** fd_move.c ***/
-
-int fd_move(int to,int from)
-{
-       if (to == from)
-               return 0;
-       if (fd_copy(to,from) == -1)
-               return -1;
-       close(from);
-       return 0;
-}
-
-
-/*** fifo.c ***/
-
-int fifo_make(const char *fn,int mode)
-{
-       return mkfifo(fn,mode);
-}
-
-
-/*** fmt_ptime.c ***/
-
-void fmt_ptime30nul(char *s, struct taia *ta) {
-       struct tm *t;
-       unsigned long u;
-
-       if (ta->sec.x < 4611686018427387914ULL)
-               return; /* impossible? */
-       u = ta->sec.x -4611686018427387914ULL;
-       t = gmtime((time_t*)&u);
-       if (!t)
-               return; /* huh? */
-       //fmt_ulong(s, 1900 + t->tm_year);
-       //s[4] = '-'; fmt_uint0(&s[5], t->tm_mon+1, 2);
-       //s[7] = '-'; fmt_uint0(&s[8], t->tm_mday, 2);
-       //s[10] = '_'; fmt_uint0(&s[11], t->tm_hour, 2);
-       //s[13] = ':'; fmt_uint0(&s[14], t->tm_min, 2);
-       //s[16] = ':'; fmt_uint0(&s[17], t->tm_sec, 2);
-       //s[19] = '.'; fmt_uint0(&s[20], ta->nano, 9);
-       sprintf(s, "%04u-%02u-%02u_%02u:%02u:%02u.%09u",
-               (unsigned)(1900 + t->tm_year),
-               (unsigned)(t->tm_mon+1),
-               (unsigned)(t->tm_mday),
-               (unsigned)(t->tm_hour),
-               (unsigned)(t->tm_min),
-               (unsigned)(t->tm_sec),
-               (unsigned)(ta->nano)
-       );
-       /* 4+1 + 2+1 + 2+1 + 2+1 + 2+1 + 2+1 + 9 = */
-       /* 5   + 3   + 3   + 3   + 3   + 3   + 9 = */
-       /* 20 (up to '.' inclusive) + 9 (not including '\0') */
-       return;
-}
-
-unsigned fmt_taia25(char *s, struct taia *t) {
-       static char pack[TAIA_PACK];
-
-       taia_pack(pack, t);
-       *s++ = '@';
-       bin2hex(s, pack, 12);
-       return 25;
-}
-
-
-#ifdef UNUSED
-/*** fmt_uint.c ***/
-
-unsigned fmt_uint(char *s,unsigned u)
-{
-       return fmt_ulong(s,u);
-}
-
-
-/*** fmt_uint0.c ***/
-
-unsigned fmt_uint0(char *s,unsigned u,unsigned n)
-{
-       unsigned len;
-       len = fmt_uint(FMT_LEN, u);
-       while (len < n) {
-               if (s)
-                       *s++ = '0';
-               ++len;
-       }
-       if (s)
-               fmt_uint(s, u);
-       return len;
-}
-#endif
-
-
-#ifdef UNUSED
-/*** fmt_ulong.c ***/
-
-unsigned fmt_ulong(char *s,unsigned long u)
-{
-       unsigned len; unsigned long q;
-       len = 1; q = u;
-       while (q > 9) { ++len; q /= 10; }
-       if (s) {
-               s += len;
-               do { *--s = '0' + (u % 10); u /= 10; } while (u); /* handles u == 0 */
-       }
-       return len;
-}
-#endif
-
-
 #ifdef UNUSED
-/*** tai_now.c ***/
-
-void tai_now(struct tai *t)
-{
-       tai_unix(t, time(NULL));
-}
-#endif
-
-
-/*** tai_pack.c ***/
-
 static /* as it isn't used anywhere else */
-void tai_pack(char *s,const struct tai *t)
+void tai_pack(char *s, const struct tai *t)
 {
        uint64_t x;
 
@@ -412,19 +67,6 @@ void tai_pack(char *s,const struct tai *t)
        s[0] = x;
 }
 
-
-#ifdef UNUSED
-/*** tai_sub.c ***/
-
-void tai_sub(struct tai *t, const struct tai *u, const struct tai *v)
-{
-       t->x = u->x - v->x;
-}
-#endif
-
-
-/*** tai_unpack.c ***/
-
 void tai_unpack(const char *s,struct tai *t)
 {
        uint64_t x;
@@ -441,10 +83,6 @@ void tai_unpack(const char *s,struct tai *t)
 }
 
 
-/*** taia_add.c ***/
-
-/* XXX: breaks tai encapsulation */
-
 void taia_add(struct taia *t,const struct taia *u,const struct taia *v)
 {
        t->sec.x = u->sec.x + v->sec.x;
@@ -460,36 +98,7 @@ void taia_add(struct taia *t,const struct taia *u,const struct taia *v)
        }
 }
 
-
-#ifdef UNUSED
-/*** taia_frac.c ***/
-
-double taia_frac(const struct taia *t)
-{
-       return (t->atto * 0.000000001 + t->nano) * 0.000000001;
-}
-
-
-/*** taia_approx.c ***/
-
-double taia_approx(const struct taia *t)
-{
-       return t->sec->x + taia_frac(t);
-}
-#endif
-
-static
-uint64_t taia2millisec(const struct taia *t)
-{
-       return (t->sec.x * 1000) + (t->nano / 1000000);
-}
-
-
-/*** taia_less.c ***/
-
-/* XXX: breaks tai encapsulation */
-
-int taia_less(const struct taia *t,const struct taia *u)
+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;
@@ -498,9 +107,6 @@ int taia_less(const struct taia *t,const struct taia *u)
        return t->atto < u->atto;
 }
 
-
-/*** taia_now.c ***/
-
 void taia_now(struct taia *t)
 {
        struct timeval now;
@@ -510,9 +116,7 @@ void taia_now(struct taia *t)
        t->atto = 0;
 }
 
-
-/*** taia_pack.c ***/
-
+/* UNUSED
 void taia_pack(char *s, const struct taia *t)
 {
        unsigned long x;
@@ -531,13 +135,9 @@ void taia_pack(char *s, const struct taia *t)
        s[1] = x & 255; x >>= 8;
        s[0] = x;
 }
+*/
 
-
-/*** taia_sub.c ***/
-
-/* XXX: breaks tai encapsulation */
-
-void taia_sub(struct taia *t,const struct taia *u,const struct taia *v)
+void taia_sub(struct taia *t, const struct taia *u, const struct taia *v)
 {
        unsigned long unano = u->nano;
        unsigned long uatto = u->atto;
@@ -555,89 +155,26 @@ void taia_sub(struct taia *t,const struct taia *u,const struct taia *v)
        }
 }
 
-
-/*** taia_uint.c ***/
-
 /* XXX: breaks tai encapsulation */
-
-void taia_uint(struct taia *t,unsigned s)
+void taia_uint(struct taia *t, unsigned s)
 {
        t->sec.x = s;
        t->nano = 0;
        t->atto = 0;
 }
 
-
-/*** stralloc_cat.c ***/
-#if 0
-
-int stralloc_cat(stralloc *sato,const stralloc *safrom)
-{
-       return stralloc_catb(sato,safrom->s,safrom->len);
-}
-
-
-/*** stralloc_catb.c ***/
-
-int stralloc_catb(stralloc *sa,const char *s,unsigned n)
-{
-       if (!sa->s) return stralloc_copyb(sa,s,n);
-       if (!stralloc_readyplus(sa,n + 1)) return 0;
-       memcpy(sa->s + sa->len,s,n);
-       sa->len += n;
-       sa->s[sa->len] = 'Z'; /* ``offensive programming'' */
-       return 1;
-}
-
-
-/*** stralloc_cats.c ***/
-
-int stralloc_cats(stralloc *sa,const char *s)
-{
-       return stralloc_catb(sa,s,strlen(s));
-}
-
-
-/*** stralloc_eady.c ***/
-
-GEN_ALLOC_ready(stralloc,char,s,len,a,i,n,x,30,stralloc_ready)
-GEN_ALLOC_readyplus(stralloc,char,s,len,a,i,n,x,30,stralloc_readyplus)
-
-
-/*** stralloc_opyb.c ***/
-
-int stralloc_copyb(stralloc *sa,const char *s,unsigned n)
-{
-       if (!stralloc_ready(sa,n + 1)) return 0;
-       memcpy(sa->s,s,n);
-       sa->len = n;
-       sa->s[n] = 'Z'; /* ``offensive programming'' */
-       return 1;
-}
-
-
-/*** stralloc_opys.c ***/
-
-int stralloc_copys(stralloc *sa,const char *s)
+static
+uint64_t taia2millisec(const struct taia *t)
 {
-       return stralloc_copyb(sa,s,strlen(s));
+       return (t->sec.x * 1000) + (t->nano / 1000000);
 }
 
-
-/*** stralloc_pend.c ***/
-
-GEN_ALLOC_append(stralloc,char,s,len,a,i,n,x,30,stralloc_readyplus,stralloc_append)
-
-#endif /* stralloc */
-
-/*** iopause.c ***/
-
-void iopause(iopause_fd *x,unsigned len,struct taia *deadline,struct taia *stamp)
+void iopause(iopause_fd *x, unsigned len, struct taia *deadline, struct taia *stamp)
 {
        int millisecs;
        int i;
 
-       if (taia_less(deadline,stamp))
+       if (taia_less(deadline, stamp))
                millisecs = 0;
        else {
                uint64_t m;
@@ -657,201 +194,62 @@ void iopause(iopause_fd *x,unsigned len,struct taia *deadline,struct taia *stamp
        /* XXX: how to handle EAGAIN? are kernels really this dumb? */
        /* XXX: how to handle EINVAL? when exactly can this happen? */
 }
-
-
-/*** lock_ex.c ***/
+#endif
 
 int lock_ex(int fd)
 {
        return flock(fd,LOCK_EX);
 }
 
-
-/*** lock_exnb.c ***/
-
 int lock_exnb(int fd)
 {
        return flock(fd,LOCK_EX | LOCK_NB);
 }
 
-
-/*** open_append.c ***/
-
 int open_append(const char *fn)
 {
        return open(fn, O_WRONLY|O_NDELAY|O_APPEND|O_CREAT, 0600);
 }
 
-
-/*** open_read.c ***/
-
 int open_read(const char *fn)
 {
        return open(fn, O_RDONLY|O_NDELAY);
 }
 
-
-/*** open_trunc.c ***/
-
 int open_trunc(const char *fn)
 {
        return open(fn,O_WRONLY | O_NDELAY | O_TRUNC | O_CREAT,0644);
 }
 
-
-/*** open_write.c ***/
-
 int open_write(const char *fn)
 {
        return open(fn, O_WRONLY|O_NDELAY);
 }
 
-
-/*** openreadclose.c ***/
-#if 0
-int openreadclose(const char *fn,stralloc *sa,unsigned bufsize)
-{
-       int fd;
-       fd = open_read(fn);
-       if (fd == -1) {
-               if (errno == ENOENT) return 0;
-               return -1;
-       }
-       if (readclose(fd,sa,bufsize) == -1) return -1;
-       return 1;
-}
-#endif
-
-
-/*** pathexec_env.c ***/
-#if 0
-static stralloc plus;
-static stralloc tmp;
-
-int pathexec_env(const char *s,const char *t)
-{
-       if (!s) return 1;
-       if (!stralloc_copys(&tmp,s)) return 0;
-       if (t) {
-               if (!stralloc_cats(&tmp,"=")) return 0;
-               if (!stralloc_cats(&tmp,t)) return 0;
-       }
-       if (!stralloc_0(&tmp)) return 0;
-       return stralloc_cat(&plus,&tmp);
-}
-
-void pathexec(char **argv)
-{
-       char **e;
-       unsigned elen;
-       unsigned i;
-       unsigned j;
-       unsigned split;
-       unsigned t;
-
-       if (!stralloc_cats(&plus,"")) return;
-
-       elen = 0;
-       for (i = 0;environ[i];++i)
-               ++elen;
-       for (i = 0;i < plus.len;++i)
-               if (!plus.s[i])
-                       ++elen;
-
-       e = malloc((elen + 1) * sizeof(char *));
-       if (!e) return;
-
-       elen = 0;
-       for (i = 0;environ[i];++i)
-               e[elen++] = environ[i];
-
-       j = 0;
-       for (i = 0;i < plus.len;++i)
-               if (!plus.s[i]) {
-                       split = str_chr(plus.s + j,'=');
-                       for (t = 0;t < elen;++t)
-                               if (memcmp(plus.s + j,e[t],split) == 0)
-                                       if (e[t][split] == '=') {
-                                               --elen;
-                                               e[t] = e[elen];
-                                               break;
-                                       }
-                       if (plus.s[j + split])
-                               e[elen++] = plus.s + j;
-                       j = i + 1;
-               }
-       e[elen] = 0;
-
-       pathexec_run(*argv,argv,e);
-       free(e);
-}
-#endif
-
-/*** pathexec_run.c ***/
-#if 0
-static stralloc tmp;
-
-void pathexec_run(const char *file,char *const *argv,char *const *envp)
+unsigned pmatch(const char *p, const char *s, unsigned len)
 {
-       const char *path;
-       unsigned split;
-       int savederrno;
-
-       if (file[str_chr(file,'/')]) {
-               execve(file,argv,envp);
-               return;
-       }
-
-       path = getenv("PATH");
-       if (!path) path = "/bin:/usr/bin";
-
-       savederrno = 0;
-       for (;;) {
-               split = str_chr(path,':');
-               if (!stralloc_copyb(&tmp,path,split)) return;
-               if (!split)
-                       if (!stralloc_cats(&tmp,".")) return;
-               if (!stralloc_cats(&tmp,"/"))  return;
-               if (!stralloc_cats(&tmp,file)) return;
-               if (!stralloc_0(&tmp)) return;
-
-               execve(tmp.s,argv,envp);
-               if (errno != ENOENT) {
-                       savederrno = errno;
-                       if ((errno != EACCES) && (errno != EPERM) && (errno != EISDIR)) return;
-               }
-
-               if (!path[split]) {
-                       if (savederrno) errno = savederrno;
-                       return;
-               }
-               path += split;
-               path += 1;
-       }
-}
-#endif
-
-/*** pmatch.c ***/
-
-unsigned pmatch(const char *p, const char *s, unsigned len) {
        for (;;) {
                char c = *p++;
                if (!c) return !len;
                switch (c) {
                case '*':
-                       if (!(c = *p)) return 1;
+                       c = *p;
+                       if (!c) return 1;
                        for (;;) {
                                if (!len) return 0;
                                if (*s == c) break;
-                               ++s; --len;
+                               ++s;
+                               --len;
                        }
                        continue;
                case '+':
-                       if ((c = *p++) != *s) return 0;
+                       c = *p++;
+                       if (c != *s) return 0;
                        for (;;) {
                                if (!len) return 1;
                                if (*s != c) break;
-                               ++s; --len;
+                               ++s;
+                               --len;
                        }
                        continue;
                        /*
@@ -866,172 +264,10 @@ unsigned pmatch(const char *p, const char *s, unsigned len) {
                default:
                        if (!len) return 0;
                        if (*s != c) return 0;
-                       ++s; --len;
+                       ++s;
+                       --len;
                        continue;
                }
        }
        return 0;
 }
-
-
-/*** prot.c ***/
-
-int prot_gid(int gid)
-{
-       gid_t x = gid;
-       if (setgroups(1,&x) == -1) return -1;
-       return setgid(gid); /* _should_ be redundant, but on some systems it isn't */
-}
-
-int prot_uid(int uid)
-{
-       return setuid(uid);
-}
-
-
-/*** readclose.c ***/
-#if 0
-int readclose_append(int fd,stralloc *sa,unsigned bufsize)
-{
-       int r;
-       for (;;) {
-               if (!stralloc_readyplus(sa,bufsize)) { close(fd); return -1; }
-               r = read(fd,sa->s + sa->len,bufsize);
-               if (r == -1) if (errno == EINTR) continue;
-               if (r <= 0) { close(fd); return r; }
-               sa->len += r;
-       }
-}
-
-int readclose(int fd,stralloc *sa,unsigned bufsize)
-{
-       if (!stralloc_copys(sa,"")) { close(fd); return -1; }
-       return readclose_append(fd,sa,bufsize);
-}
-#endif
-
-/*** scan_ulong.c ***/
-
-unsigned scan_ulong(const char *s,unsigned long *u)
-{
-       unsigned pos = 0;
-       unsigned long result = 0;
-       unsigned long c;
-       while ((c = (unsigned long) (unsigned char) (s[pos] - '0')) < 10) {
-               result = result * 10 + c;
-               ++pos;
-       }
-       *u = result;
-       return pos;
-}
-
-
-#ifdef UNUSED
-/*** seek_set.c ***/
-
-int seek_set(int fd,seek_pos pos)
-{
-       if (lseek(fd,(off_t) pos,SEEK_SET) == -1) return -1; return 0;
-}
-#endif
-
-
-/*** sig.c ***/
-
-//int sig_alarm = SIGALRM;
-//int sig_child = SIGCHLD;
-//int sig_cont = SIGCONT;
-//int sig_hangup = SIGHUP;
-//int sig_int = SIGINT;
-//int sig_pipe = SIGPIPE;
-//int sig_term = SIGTERM;
-
-//void (*sig_defaulthandler)(int) = SIG_DFL;
-//void (*sig_ignorehandler)(int) = SIG_IGN;
-
-
-/*** sig_block.c ***/
-
-void sig_block(int sig)
-{
-       sigset_t ss;
-       sigemptyset(&ss);
-       sigaddset(&ss,sig);
-       sigprocmask(SIG_BLOCK,&ss,(sigset_t *) 0);
-}
-
-void sig_unblock(int sig)
-{
-       sigset_t ss;
-       sigemptyset(&ss);
-       sigaddset(&ss,sig);
-       sigprocmask(SIG_UNBLOCK,&ss,(sigset_t *) 0);
-}
-
-void sig_blocknone(void)
-{
-       sigset_t ss;
-       sigemptyset(&ss);
-       sigprocmask(SIG_SETMASK,&ss,(sigset_t *) 0);
-}
-
-
-/*** sig_catch.c ***/
-
-void sig_catch(int sig,void (*f)(int))
-{
-       struct sigaction sa;
-       sa.sa_handler = f;
-       sa.sa_flags = 0;
-       sigemptyset(&sa.sa_mask);
-       sigaction(sig,&sa,(struct sigaction *) 0);
-}
-
-
-/*** sig_pause.c ***/
-
-void sig_pause(void)
-{
-       sigset_t ss;
-       sigemptyset(&ss);
-       sigsuspend(&ss);
-}
-
-
-/*** str_chr.c ***/
-
-unsigned str_chr(const char *s,int c)
-{
-       char ch;
-       const char *t;
-
-       ch = c;
-       t = s;
-       for (;;) {
-               if (!*t) break;
-               if (*t == ch) break;
-               ++t;
-       }
-       return t - s;
-}
-
-
-/*** wait_nohang.c ***/
-
-int wait_nohang(int *wstat)
-{
-       return waitpid(-1, wstat, WNOHANG);
-}
-
-
-/*** wait_pid.c ***/
-
-int wait_pid(int *wstat, int pid)
-{
-       int r;
-
-       do
-               r = waitpid(pid, wstat, 0);
-       while ((r == -1) && (errno == EINTR));
-       return r;
-}