Mercurial > notdcc
diff dcclib/get_secs.c @ 0:c7f6b056b673
First import of vendor version
author | Peter Gervai <grin@grin.hu> |
---|---|
date | Tue, 10 Mar 2009 13:49:58 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dcclib/get_secs.c Tue Mar 10 13:49:58 2009 +0100 @@ -0,0 +1,207 @@ +/* Distributed Checksum Clearinghouse + * + * Copyright (c) 2008 by Rhyolite Software, LLC + * + * This agreement is not applicable to any entity which sells anti-spam + * solutions to others or provides an anti-spam solution as part of a + * security solution sold to other entities, or to a private network + * which employs the DCC or uses data provided by operation of the DCC + * but does not provide corresponding data to other users. + * + * Permission to use, copy, modify, and distribute this software without + * changes for any purpose with or without fee is hereby granted, provided + * that the above copyright notice and this permission notice appear in all + * copies and any distributed versions or copies are either unchanged + * or not called anything similar to "DCC" or "Distributed Checksum + * Clearinghouse". + * + * Parties not eligible to receive a license under this agreement can + * obtain a commercial license to use DCC by contacting Rhyolite Software + * at sales@rhyolite.com. + * + * A commercial license would be for Distributed Checksum and Reputation + * Clearinghouse software. That software includes additional features. This + * free license for Distributed ChecksumClearinghouse Software does not in any + * way grant permision to use Distributed Checksum and Reputation Clearinghouse + * software + * + * THE SOFTWARE IS PROVIDED "AS IS" AND RHYOLITE SOFTWARE, LLC DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RHYOLITE SOFTWARE, LLC + * BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Rhyolite Software DCC 1.3.103-1.24 $Revision$ + */ + +#include "dcc_defs.h" + + +/* because tv.tv_sec is not a time_t on all systems + * and to be thread safe on WIN32 */ +const struct tm * +dcc_localtime(time_t secs, struct tm *result) +{ +#ifdef HAVE_LOCALTIME_R + result = localtime_r(&secs, result); +#else + dcc_localtime_lock(); + result = localtime(&secs); + dcc_localtime_unlock(); +#endif + return result; +} + + + +const char * +dcc_time2str(char *buf, size_t buf_len, const char *pat, time_t secs) +{ + struct tm tm; + + if (0 >= strftime(buf, buf_len, pat, dcc_localtime(secs, &tm))) + STRLCPY(buf, "?", buf_len); + return buf; +} + + + +int +dcc_get_secs(const char *s, const char **end, int min, int max, int def) +{ + const char *cp; + char *p; + int secs; + + if (*s == '\0' || *s == ',') { + secs = def; + cp = s; + } else if (min > 0 + && !CLITCMP(s, "never")) { + cp = s+LITZ("never"); + secs = max; + } else if ((secs = strtoul(s, &p, 10)) >= DCC_MAX_SECS/60) { + return -1; + } else if (*(cp = p) == '\0' || *cp == ',') { + ; + } else if (!CLITCMP(cp, "seconds")) { + cp += LITZ("seconds"); + } else if (!CLITCMP(cp, "s")) { + cp += LITZ("s"); + + } else if (!CLITCMP(cp, "minutes")) { + cp += LITZ("minutes"); + secs *= 60; + } else if (!CLITCMP(cp, "minute")) { + cp += LITZ("minute"); + secs *= 60; + } else if (!CLITCMP(cp, "m")) { + cp += LITZ("m"); + secs *= 60; + + } else if (secs >= DCC_MAX_SECS/(60*60)) { + return -1; + } else if (!CLITCMP(cp, "hours")) { + cp += LITZ("hours"); + secs *= 60*60; + } else if (!CLITCMP(cp, "hour")) { + cp += LITZ("hour"); + secs *= 60*60; + } else if (!CLITCMP(cp, "h")) { + cp += LITZ("h"); + secs *= 60*60; + + } else if (secs >= DCC_MAX_SECS/(24*60*60)) { + return -1; + } else if (!CLITCMP(cp, "days")) { + cp += LITZ("days"); + secs *= 24*60*60; + } else if (!CLITCMP(cp, "day")) { + cp += LITZ("day"); + secs *= 24*60*60; + } else if (!CLITCMP(cp, "d")) { + cp += LITZ("d"); + secs *= 24*60*60; + + } else if (secs >= DCC_MAX_SECS/(7*24*60*60)) { + return -1; + } else if (!CLITCMP(cp, "weeks")) { + cp += LITZ("weeks"); + secs *= 7*24*60*60; + } else if (!CLITCMP(cp, "week")) { + cp += LITZ("week"); + secs *= 7*24*60*60; + } else if (!CLITCMP(cp, "w")) { + cp += LITZ("w"); + secs *= 7*24*60*60; + + } else { + return -1; + } + + if (secs > max) + return -1; + if (secs < min && secs != 0) + return -1; + + if (*cp != '\0') { + if (*cp != ',' || !end) + return -1; + ++cp; + } + if (end) + *end = cp; + return secs; +} + + + +time_t +tv_diff2us(const struct timeval *tv1, const struct timeval *tv2) +{ + time_t us; + + /* prevent overflow */ + us = tv1->tv_sec - tv2->tv_sec; + if (us <= -FOREVER_SECS) + return -FOREVER_US; + if (us >= FOREVER_SECS) + return FOREVER_US; + us = us*DCC_US + (tv1->tv_usec - tv2->tv_usec); + return us; +} + + + +void +tv_add(struct timeval *tgt, + const struct timeval *a, + const struct timeval *b) +{ + tgt->tv_sec = a->tv_sec + b->tv_sec; + tgt->tv_usec = a->tv_usec + b->tv_usec; + tgt->tv_sec += tgt->tv_usec / DCC_US; + tgt->tv_usec %= DCC_US; +} + + + +void +tv_add_us(struct timeval *tgt, + time_t us) +{ + time_t secs; + + us = tgt->tv_usec + us; + if (us >= 0) { + tgt->tv_sec += us / DCC_US; + tgt->tv_usec = us % DCC_US; + } else { + secs = (DCC_US - 1 - us) / DCC_US; + tgt->tv_sec -= secs; + tgt->tv_usec = (secs * DCC_US) + us; + } +}