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