/* * Copyright (c) 1983, 1995-1997 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. 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. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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. */ #ifndef lint static char sccsid[] = "@(#)convtime.c 8.9 (Berkeley) 2/1/97"; #endif /* not lint */ # include "sendmail.h" /* ** CONVTIME -- convert time ** ** Takes a time as an ascii string with a trailing character ** giving units: ** s -- seconds ** m -- minutes ** h -- hours ** d -- days (default) ** w -- weeks ** For example, "3d12h" is three and a half days. ** ** Parameters: ** p -- pointer to ascii time. ** units -- default units if none specified. ** ** Returns: ** time in seconds. ** ** Side Effects: ** none. */ time_t convtime(p, units) char *p; char units; { register time_t t, r; register char c; r = 0; while (*p != '\0') { t = 0; while ((c = *p++) != '\0' && isascii(c) && isdigit(c)) t = t * 10 + (c - '0'); if (c == '\0') { c = units; p--; } else if (strchr("wdhms", c) == NULL) { usrerr("Invalid time unit `%c'", c); c = units; } switch (c) { case 'w': /* weeks */ t *= 7; case 'd': /* days */ default: t *= 24; case 'h': /* hours */ t *= 60; case 'm': /* minutes */ t *= 60; case 's': /* seconds */ break; } r += t; } return (r); } /* ** PINTVL -- produce printable version of a time interval ** ** Parameters: ** intvl -- the interval to be converted ** brief -- if TRUE, print this in an extremely compact form ** (basically used for logging). ** ** Returns: ** A pointer to a string version of intvl suitable for ** printing or framing. ** ** Side Effects: ** none. ** ** Warning: ** The string returned is in a static buffer. */ # define PLURAL(n) ((n) == 1 ? "" : "s") char * pintvl(intvl, brief) time_t intvl; bool brief; { static char buf[256]; register char *p; int wk, dy, hr, mi, se; if (intvl == 0 && !brief) return ("zero seconds"); /* decode the interval into weeks, days, hours, minutes, seconds */ se = intvl % 60; intvl /= 60; mi = intvl % 60; intvl /= 60; hr = intvl % 24; intvl /= 24; if (brief) { dy = intvl; wk = 0; } else { dy = intvl % 7; intvl /= 7; wk = intvl; } /* now turn it into a sexy form */ p = buf; if (brief) { if (dy > 0) { (void) snprintf(p, SPACELEFT(buf, p), "%d+", dy); p += strlen(p); } (void) snprintf(p, SPACELEFT(buf, p), "%02d:%02d:%02d", hr, mi, se); return (buf); } /* use the verbose form */ if (wk > 0) { (void) snprintf(p, SPACELEFT(buf, p), ", %d week%s", wk, PLURAL(wk)); p += strlen(p); } if (dy > 0) { (void) snprintf(p, SPACELEFT(buf, p), ", %d day%s", dy, PLURAL(dy)); p += strlen(p); } if (hr > 0) { (void) snprintf(p, SPACELEFT(buf, p), ", %d hour%s", hr, PLURAL(hr)); p += strlen(p); } if (mi > 0) { (void) snprintf(p, SPACELEFT(buf, p), ", %d minute%s", mi, PLURAL(mi)); p += strlen(p); } if (se > 0) { (void) snprintf(p, SPACELEFT(buf, p), ", %d second%s", se, PLURAL(se)); p += strlen(p); } return (buf + 2); }