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