1c2aa98e2SPeter Wemm /* 206f25ae9SGregory Neil Shapiro * Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers. 306f25ae9SGregory Neil Shapiro * All rights reserved. 4c2aa98e2SPeter Wemm * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. 5c2aa98e2SPeter Wemm * Copyright (c) 1988, 1993 6c2aa98e2SPeter Wemm * The Regents of the University of California. All rights reserved. 7c2aa98e2SPeter Wemm * 8c2aa98e2SPeter Wemm * By using this file, you agree to the terms and conditions set 9c2aa98e2SPeter Wemm * forth in the LICENSE file which can be found at the top level of 10c2aa98e2SPeter Wemm * the sendmail distribution. 11c2aa98e2SPeter Wemm * 12c2aa98e2SPeter Wemm */ 13c2aa98e2SPeter Wemm 14c2aa98e2SPeter Wemm #ifndef lint 1506f25ae9SGregory Neil Shapiro static char id[] = "@(#)$Id: convtime.c,v 8.25 1999/06/16 21:11:26 ca Exp $"; 1606f25ae9SGregory Neil Shapiro #endif /* ! lint */ 17c2aa98e2SPeter Wemm 1806f25ae9SGregory Neil Shapiro #include <sendmail.h> 19c2aa98e2SPeter Wemm 20c2aa98e2SPeter Wemm /* 21c2aa98e2SPeter Wemm ** CONVTIME -- convert time 22c2aa98e2SPeter Wemm ** 23c2aa98e2SPeter Wemm ** Takes a time as an ascii string with a trailing character 24c2aa98e2SPeter Wemm ** giving units: 25c2aa98e2SPeter Wemm ** s -- seconds 26c2aa98e2SPeter Wemm ** m -- minutes 27c2aa98e2SPeter Wemm ** h -- hours 28c2aa98e2SPeter Wemm ** d -- days (default) 29c2aa98e2SPeter Wemm ** w -- weeks 30c2aa98e2SPeter Wemm ** For example, "3d12h" is three and a half days. 31c2aa98e2SPeter Wemm ** 32c2aa98e2SPeter Wemm ** Parameters: 33c2aa98e2SPeter Wemm ** p -- pointer to ascii time. 34c2aa98e2SPeter Wemm ** units -- default units if none specified. 35c2aa98e2SPeter Wemm ** 36c2aa98e2SPeter Wemm ** Returns: 37c2aa98e2SPeter Wemm ** time in seconds. 38c2aa98e2SPeter Wemm ** 39c2aa98e2SPeter Wemm ** Side Effects: 40c2aa98e2SPeter Wemm ** none. 41c2aa98e2SPeter Wemm */ 42c2aa98e2SPeter Wemm 43c2aa98e2SPeter Wemm time_t 44c2aa98e2SPeter Wemm convtime(p, units) 45c2aa98e2SPeter Wemm char *p; 4606f25ae9SGregory Neil Shapiro int units; 47c2aa98e2SPeter Wemm { 48c2aa98e2SPeter Wemm register time_t t, r; 49c2aa98e2SPeter Wemm register char c; 50c2aa98e2SPeter Wemm 51c2aa98e2SPeter Wemm r = 0; 5206f25ae9SGregory Neil Shapiro if (strcasecmp(p, "now") == 0) 5306f25ae9SGregory Neil Shapiro return NOW; 54c2aa98e2SPeter Wemm while (*p != '\0') 55c2aa98e2SPeter Wemm { 56c2aa98e2SPeter Wemm t = 0; 57c2aa98e2SPeter Wemm while ((c = *p++) != '\0' && isascii(c) && isdigit(c)) 58c2aa98e2SPeter Wemm t = t * 10 + (c - '0'); 59c2aa98e2SPeter Wemm if (c == '\0') 60c2aa98e2SPeter Wemm { 61c2aa98e2SPeter Wemm c = units; 62c2aa98e2SPeter Wemm p--; 63c2aa98e2SPeter Wemm } 64c2aa98e2SPeter Wemm else if (strchr("wdhms", c) == NULL) 65c2aa98e2SPeter Wemm { 66c2aa98e2SPeter Wemm usrerr("Invalid time unit `%c'", c); 67c2aa98e2SPeter Wemm c = units; 68c2aa98e2SPeter Wemm } 69c2aa98e2SPeter Wemm switch (c) 70c2aa98e2SPeter Wemm { 71c2aa98e2SPeter Wemm case 'w': /* weeks */ 72c2aa98e2SPeter Wemm t *= 7; 7306f25ae9SGregory Neil Shapiro /* FALLTHROUGH */ 74c2aa98e2SPeter Wemm 75c2aa98e2SPeter Wemm case 'd': /* days */ 7606f25ae9SGregory Neil Shapiro /* FALLTHROUGH */ 77c2aa98e2SPeter Wemm default: 78c2aa98e2SPeter Wemm t *= 24; 7906f25ae9SGregory Neil Shapiro /* FALLTHROUGH */ 80c2aa98e2SPeter Wemm 81c2aa98e2SPeter Wemm case 'h': /* hours */ 82c2aa98e2SPeter Wemm t *= 60; 8306f25ae9SGregory Neil Shapiro /* FALLTHROUGH */ 84c2aa98e2SPeter Wemm 85c2aa98e2SPeter Wemm case 'm': /* minutes */ 86c2aa98e2SPeter Wemm t *= 60; 8706f25ae9SGregory Neil Shapiro /* FALLTHROUGH */ 88c2aa98e2SPeter Wemm 89c2aa98e2SPeter Wemm case 's': /* seconds */ 90c2aa98e2SPeter Wemm break; 91c2aa98e2SPeter Wemm } 92c2aa98e2SPeter Wemm r += t; 93c2aa98e2SPeter Wemm } 94c2aa98e2SPeter Wemm 9506f25ae9SGregory Neil Shapiro return r; 96c2aa98e2SPeter Wemm } 97c2aa98e2SPeter Wemm /* 98c2aa98e2SPeter Wemm ** PINTVL -- produce printable version of a time interval 99c2aa98e2SPeter Wemm ** 100c2aa98e2SPeter Wemm ** Parameters: 101c2aa98e2SPeter Wemm ** intvl -- the interval to be converted 102c2aa98e2SPeter Wemm ** brief -- if TRUE, print this in an extremely compact form 103c2aa98e2SPeter Wemm ** (basically used for logging). 104c2aa98e2SPeter Wemm ** 105c2aa98e2SPeter Wemm ** Returns: 106c2aa98e2SPeter Wemm ** A pointer to a string version of intvl suitable for 107c2aa98e2SPeter Wemm ** printing or framing. 108c2aa98e2SPeter Wemm ** 109c2aa98e2SPeter Wemm ** Side Effects: 110c2aa98e2SPeter Wemm ** none. 111c2aa98e2SPeter Wemm ** 112c2aa98e2SPeter Wemm ** Warning: 113c2aa98e2SPeter Wemm ** The string returned is in a static buffer. 114c2aa98e2SPeter Wemm */ 115c2aa98e2SPeter Wemm 116c2aa98e2SPeter Wemm #define PLURAL(n) ((n) == 1 ? "" : "s") 117c2aa98e2SPeter Wemm 118c2aa98e2SPeter Wemm char * 119c2aa98e2SPeter Wemm pintvl(intvl, brief) 120c2aa98e2SPeter Wemm time_t intvl; 121c2aa98e2SPeter Wemm bool brief; 122c2aa98e2SPeter Wemm { 123c2aa98e2SPeter Wemm static char buf[256]; 124c2aa98e2SPeter Wemm register char *p; 125c2aa98e2SPeter Wemm int wk, dy, hr, mi, se; 126c2aa98e2SPeter Wemm 127c2aa98e2SPeter Wemm if (intvl == 0 && !brief) 12806f25ae9SGregory Neil Shapiro return "zero seconds"; 12906f25ae9SGregory Neil Shapiro if (intvl == NOW) 13006f25ae9SGregory Neil Shapiro return "too long"; 131c2aa98e2SPeter Wemm 132c2aa98e2SPeter Wemm /* decode the interval into weeks, days, hours, minutes, seconds */ 133c2aa98e2SPeter Wemm se = intvl % 60; 134c2aa98e2SPeter Wemm intvl /= 60; 135c2aa98e2SPeter Wemm mi = intvl % 60; 136c2aa98e2SPeter Wemm intvl /= 60; 137c2aa98e2SPeter Wemm hr = intvl % 24; 138c2aa98e2SPeter Wemm intvl /= 24; 139c2aa98e2SPeter Wemm if (brief) 140c2aa98e2SPeter Wemm { 141c2aa98e2SPeter Wemm dy = intvl; 142c2aa98e2SPeter Wemm wk = 0; 143c2aa98e2SPeter Wemm } 144c2aa98e2SPeter Wemm else 145c2aa98e2SPeter Wemm { 146c2aa98e2SPeter Wemm dy = intvl % 7; 147c2aa98e2SPeter Wemm intvl /= 7; 148c2aa98e2SPeter Wemm wk = intvl; 149c2aa98e2SPeter Wemm } 150c2aa98e2SPeter Wemm 151c2aa98e2SPeter Wemm /* now turn it into a sexy form */ 152c2aa98e2SPeter Wemm p = buf; 153c2aa98e2SPeter Wemm if (brief) 154c2aa98e2SPeter Wemm { 155c2aa98e2SPeter Wemm if (dy > 0) 156c2aa98e2SPeter Wemm { 157c2aa98e2SPeter Wemm (void) snprintf(p, SPACELEFT(buf, p), "%d+", dy); 158c2aa98e2SPeter Wemm p += strlen(p); 159c2aa98e2SPeter Wemm } 160c2aa98e2SPeter Wemm (void) snprintf(p, SPACELEFT(buf, p), "%02d:%02d:%02d", 161c2aa98e2SPeter Wemm hr, mi, se); 16206f25ae9SGregory Neil Shapiro return buf; 163c2aa98e2SPeter Wemm } 164c2aa98e2SPeter Wemm 165c2aa98e2SPeter Wemm /* use the verbose form */ 166c2aa98e2SPeter Wemm if (wk > 0) 167c2aa98e2SPeter Wemm { 168c2aa98e2SPeter Wemm (void) snprintf(p, SPACELEFT(buf, p), ", %d week%s", wk, PLURAL(wk)); 169c2aa98e2SPeter Wemm p += strlen(p); 170c2aa98e2SPeter Wemm } 171c2aa98e2SPeter Wemm if (dy > 0) 172c2aa98e2SPeter Wemm { 173c2aa98e2SPeter Wemm (void) snprintf(p, SPACELEFT(buf, p), ", %d day%s", dy, PLURAL(dy)); 174c2aa98e2SPeter Wemm p += strlen(p); 175c2aa98e2SPeter Wemm } 176c2aa98e2SPeter Wemm if (hr > 0) 177c2aa98e2SPeter Wemm { 178c2aa98e2SPeter Wemm (void) snprintf(p, SPACELEFT(buf, p), ", %d hour%s", hr, PLURAL(hr)); 179c2aa98e2SPeter Wemm p += strlen(p); 180c2aa98e2SPeter Wemm } 181c2aa98e2SPeter Wemm if (mi > 0) 182c2aa98e2SPeter Wemm { 183c2aa98e2SPeter Wemm (void) snprintf(p, SPACELEFT(buf, p), ", %d minute%s", mi, PLURAL(mi)); 184c2aa98e2SPeter Wemm p += strlen(p); 185c2aa98e2SPeter Wemm } 186c2aa98e2SPeter Wemm if (se > 0) 187c2aa98e2SPeter Wemm { 188c2aa98e2SPeter Wemm (void) snprintf(p, SPACELEFT(buf, p), ", %d second%s", se, PLURAL(se)); 189c2aa98e2SPeter Wemm p += strlen(p); 190c2aa98e2SPeter Wemm } 191c2aa98e2SPeter Wemm 192c2aa98e2SPeter Wemm return (buf + 2); 193c2aa98e2SPeter Wemm } 194