| 247 | } |
| 248 | |
| 249 | static void print_time(status_ctx *ctx, const char *label, apr_time_t t) |
| 250 | { |
| 251 | apr_bucket_brigade *bb = ctx->bb; |
| 252 | apr_time_t now; |
| 253 | const char *pre, *post, *sep; |
| 254 | char ts[APR_RFC822_DATE_LEN]; |
| 255 | char ts2[128]; |
| 256 | apr_time_exp_t texp; |
| 257 | apr_size_t len; |
| 258 | apr_interval_time_t delta; |
| 259 | |
| 260 | if (t == 0) { |
| 261 | /* timestamp is 0, we use that for "not set" */ |
| 262 | return; |
| 263 | } |
| 264 | apr_time_exp_gmt(&texp, t); |
| 265 | now = apr_time_now(); |
| 266 | pre = post = ""; |
| 267 | sep = (label && strlen(label))? " " : ""; |
| 268 | delta = 0; |
| 269 | if (HTML_STATUS(ctx)) { |
| 270 | apr_rfc822_date(ts, t); |
| 271 | if (t > now) { |
| 272 | delta = t - now; |
| 273 | pre = "in "; |
| 274 | } |
| 275 | else { |
| 276 | delta = now - t; |
| 277 | post = " ago"; |
| 278 | } |
| 279 | if (delta >= (4 * apr_time_from_sec(MD_SECS_PER_DAY))) { |
| 280 | apr_strftime(ts2, &len, sizeof(ts2)-1, "%Y-%m-%d", &texp); |
| 281 | ts2[len] = '\0'; |
| 282 | apr_brigade_printf(bb, NULL, NULL, "%s%s<span title='%s' " |
| 283 | "style='white-space: nowrap;'>%s</span>", |
| 284 | label, sep, ts, ts2); |
| 285 | } |
| 286 | else { |
| 287 | apr_brigade_printf(bb, NULL, NULL, "%s%s<span title='%s'>%s%s%s</span>", |
| 288 | label, sep, ts, pre, md_duration_roughly(bb->p, delta), post); |
| 289 | } |
| 290 | } |
| 291 | else { |
| 292 | delta = t - now; |
| 293 | apr_brigade_printf(bb, NULL, NULL, "%s%s: %" APR_TIME_T_FMT "\n", |
| 294 | ctx->prefix, label, apr_time_sec(delta)); |
| 295 | } |
| 296 | } |
| 297 | |
| 298 | static void si_val_valid_time(status_ctx *ctx, md_json_t *mdj, const status_info *info) |
| 299 | { |
no test coverage detected