From 19dd2531cafe84927c845e548ec68587007f3ab2 Mon Sep 17 00:00:00 2001 Message-Id: <19dd2531cafe84927c845e548ec68587007f3ab2.1715049214.git.mdw@distorted.org.uk> From: Mark Wooding Date: Sun, 7 Jan 2007 19:02:15 +0000 Subject: [PATCH] Useful functions (u_daemon and versioncmp) moved to mLib. Organization: Straylight/Edgeware From: Mark Wooding Remove the code here, and use the mLib versions. --- client/tripectl.c | 6 +- common/util.c | 53 ---------------- server/admin.c | 2 +- server/servutil.c | 153 ---------------------------------------------- server/tripe.c | 2 +- server/tripe.h | 35 +---------- 6 files changed, 8 insertions(+), 243 deletions(-) diff --git a/client/tripectl.c b/client/tripectl.c index 5bdc5025..b27d3fdc 100644 --- a/client/tripectl.c +++ b/client/tripectl.c @@ -51,6 +51,7 @@ #include #include +#include #include #include #include @@ -60,6 +61,7 @@ #include #include #include +#include #include "util.h" @@ -481,7 +483,7 @@ int main(int argc, char *argv[]) fclose(pidfp); closelog(); if (f & f_daemon) - u_detach(); + detachtty(); execvp(DA(&spawnopts)[0], DA(&spawnopts)); die(127, "couldn't exec `%s': %s", spawnpath, strerror(errno)); } @@ -506,7 +508,7 @@ int main(int argc, char *argv[]) } if (f & f_daemon) { - if (u_daemon()) + if (daemonize()) die(EXIT_FAILURE, "error becoming daemon: %s", strerror(errno)); } if (pidfp) { diff --git a/common/util.c b/common/util.c index 4b32985c..17456551 100644 --- a/common/util.c +++ b/common/util.c @@ -33,16 +33,10 @@ #include #include -#include -#include -#include - #include #include "util.h" -#include - /*----- Main code ---------------------------------------------------------*/ /* --- @u_quotify@ --- * @@ -73,51 +67,4 @@ void u_quotify(dstr *d, const char *p) } } -/* --- @u_detach@ --- * - * - * Arguments: --- - * - * Returns: --- - * - * Use: Detaches from the current terminal and ensures it can never - * acquire a new one. Calls @fork@. - */ - -void u_detach(void) -{ -#ifdef TIOCNOTTY - { - int fd; - if ((fd = open("/dev/tty", O_RDONLY)) >= 0) { - ioctl(fd, TIOCNOTTY); - close(fd); - } - } -#endif - setsid(); - if (fork() > 0) - _exit(0); -} - -/* --- @u_daemon@ --- * - * - * Arguments: --- - * - * Returns: Zero if OK, nonzero on failure. - * - * Use: Becomes a daemon. - */ - -int u_daemon(void) -{ - pid_t kid; - - if ((kid = fork()) < 0) - return (-1); - if (kid) - _exit(0); - u_detach(); - return (0); -} - /*----- That's all, folks -------------------------------------------------*/ diff --git a/server/admin.c b/server/admin.c index d9a75ec2..d98283bc 100644 --- a/server/admin.c +++ b/server/admin.c @@ -1609,7 +1609,7 @@ static void acmd_daemon(admin *a, unsigned ac, char *av[]) a_notify("DAEMON", A_END); if (a_stdin) a_destroy(a_stdin); - if (u_daemon()) + if (daemonize()) a_fail(a, "daemon-error", "?ERRNO", A_END); else { flags |= F_DAEMON; diff --git a/server/servutil.c b/server/servutil.c index 77cfd2c6..92a5f775 100644 --- a/server/servutil.c +++ b/server/servutil.c @@ -140,157 +140,4 @@ int seq_check(seqwin *s, uint32 q, const char *service) return (0); } -/* --- @versioncmp@ --- * - * - * Arguments: @const char *va, *vb@ = two version strings - * - * Returns: Less than, equal to, or greater than zero, according to - * whether @va@ is less than, equal to, or greater than @vb@. - * - * Use: Compares version number strings. - * - * The algorithm is an extension of the Debian version - * comparison algorithm. A version number consists of three - * components: - * - * [EPOCH :] MAIN [- SUB] - * - * The MAIN part may contain colons or hyphens if there is an - * EPOCH or SUB, respectively. Version strings are compared - * componentwise: first epochs, then main parts, and finally - * subparts. - * - * The component comparison is done as follows. First, the - * initial subsequence of nondigit characters is extracted from - * each string, and these are compared lexicographically, using - * ASCII ordering, except that letters precede non-letters. If - * both are the same, an initial sequence of digits is extracted - * from the remaining parts of the version strings, and these - * are compared numerically (an empty sequence being considered - * to have the value zero). This process is repeated until we - * have a winner or until both strings are exhausted. - */ - -struct vinfo { - const char *e, *el; - const char *m, *ml; - const char *s, *sl; -}; - -static int vint(const char **vv, const char *vl) -{ - int n = 0; - const char *v = *vv; - int ch; - - while (v < vl) { - ch = *v; - if (!isdigit((unsigned char)ch)) - break; - v++; - n = n * 10 + (ch - '0'); - } - *vv = v; - return (n); -} - -static const char *vchr(const char **vv, const char *vl) -{ - const char *v = *vv; - const char *b = v; - int ch; - - while (v < vl) { - ch = *v; - if (isdigit((unsigned char)ch)) - break; - v++; - } - *vv = v; - return (b); -} - -#define CMP(x, y) ((x) < (y) ? -1 : +1) - -static int vcmp(const char *va, const char *val, - const char *vb, const char *vbl) -{ - const char *pa, *pb; - int ia, ib; - - for (;;) { - - /* --- See if we're done --- */ - - if (va == val && vb == vbl) - return (0); - - /* --- Compare nondigit portions --- */ - - pa = vchr(&va, val); pb = vchr(&vb, vbl); - for (;;) { - if (pa == va && pb == vb) - break; - else if (pa == va) - return (-1); - else if (pb == vb) - return (+1); - else if (*pa == *pb) { - pa++; pb++; - continue; - } else if (isalpha((unsigned char)*pa) == isalpha((unsigned char)*pb)) - return (CMP(*pa, *pb)); - else if (isalpha((unsigned char)*pa)) - return (-1); - else - return (+1); - } - - /* --- Compare digit portions --- */ - - ia = vint(&va, val); ib = vint(&vb, vbl); - if (ia != ib) - return (CMP(ia, ib)); - } -} - -static void vsplit(const char *v, struct vinfo *vi) -{ - const char *p; - size_t n; - - if ((p = strchr(v, ':')) == 0) - vi->e = vi->el = 0; - else { - vi->e = v; - vi->el = p; - v = p + 1; - } - - n = strlen(v); - if ((p = strrchr(v, '-')) == 0) - vi->s = vi->sl = 0; - else { - vi->s = p + 1; - vi->sl = v + n; - n = p - v; - } - - vi->m = v; - vi->ml = v + n; -} - -int versioncmp(const char *va, const char *vb) -{ - struct vinfo via, vib; - int rc; - - vsplit(va, &via); vsplit(vb, &vib); - if ((rc = vcmp(via.e, via.el, vib.e, vib.el)) != 0 || - (rc = vcmp(via.m, via.ml, vib.m, vib.ml)) != 0 || - (rc = vcmp(via.s, via.sl, vib.s, vib.sl)) != 0) - return (rc); - return (0); -} - /*----- That's all, folks -------------------------------------------------*/ diff --git a/server/tripe.c b/server/tripe.c index d98a2af4..f9cf0e86 100644 --- a/server/tripe.c +++ b/server/tripe.c @@ -330,7 +330,7 @@ int main(int argc, char *argv[]) km_init(kr_priv, kr_pub, tag_priv); a_init(csock); if (f & f_daemon) { - if (u_daemon()) + if (daemonize()) die(EXIT_FAILURE, "couldn't become a daemon: %s", strerror(errno)); a_daemon(); } diff --git a/server/tripe.h b/server/tripe.h index 1d13f32d..66fb091d 100644 --- a/server/tripe.h +++ b/server/tripe.h @@ -68,6 +68,7 @@ #include #include #include +#include #include #include #include @@ -82,6 +83,7 @@ #include #include #include +#include #include @@ -1177,39 +1179,6 @@ extern void seq_reset(seqwin */*s*/); extern int seq_check(seqwin */*s*/, uint32 /*q*/, const char */*service*/); -/* --- @versioncmp@ --- * - * - * Arguments: @const char *va, *vb@ = two version strings - * - * Returns: Less than, equal to, or greater than zero, according to - * whether @va@ is less than, equal to, or greater than @vb@. - * - * Use: Compares version number strings. - * - * The algorithm is an extension of the Debian version - * comparison algorithm. A version number consists of three - * components: - * - * [EPOCH :] MAIN [- SUB] - * - * The MAIN part may contain colons or hyphens if there is an - * EPOCH or SUB, respectively. Version strings are compared - * componentwise: first epochs, then main parts, and finally - * subparts. - * - * The component comparison is done as follows. First, the - * initial subsequence of nondigit characters is extracted from - * each string, and these are compared lexicographically, using - * ASCII ordering, except that letters precede non-letters. If - * both are the same, an initial sequence of digits is extracted - * from the remaining parts of the version strings, and these - * are compared numerically (an empty sequence being considered - * to have the value zero). This process is repeated until we - * have a winner or until both strings are exhausted. - */ - -extern int versioncmp(const char */*va*/, const char */*vb*/); - /*----- That's all, folks -------------------------------------------------*/ #ifdef __cplusplus -- [mdw]