struct vmbuf *http_server_end_cookie(time_t expires, const char *domain, const char *path) { struct vmbuf *buf = &http_server_get_context()->header; struct tm tm; gmtime_r(&expires, &tm); vmbuf_sprintf(buf, "\";Path=%s;Domain=%s;Expires=", path, domain); vmbuf_strftime(buf, "%a, %d-%b-%Y %H:%M:%S %Z", &tm); return buf; }
static void begin_log_line(const char *msg_class) { struct tm tm, *tmp; struct timeval tv; gettimeofday(&tv, NULL); tmp = localtime_r(&tv.tv_sec, &tm); vmbuf_init(&log_buf, 4096); vmbuf_strftime(&log_buf, "%Y-%m-%d %H:%M:%S", tmp); vmbuf_sprintf(&log_buf, ".%03d.%03d %d %s ", tv.tv_usec / 1000, tv.tv_usec % 1000, getpid(), msg_class); }
int http_server_generate_dir_list(const char *URI) { struct http_server_context *ctx = http_server_get_context(); struct vmbuf *payload = &ctx->payload; const char *dir = URI; if (*dir == '/') ++dir; if (0 == *dir) dir = "."; vmbuf_sprintf(payload, "<html><head><title>Index of %s</title></head>", dir); vmbuf_strcpy(payload, "<body>"); vmbuf_sprintf(payload, "<h1>Index of %s</h1><hr>", dir); vmbuf_sprintf(payload, "<a href=\"..\">../</a><br><br>"); vmbuf_sprintf(payload, "<table width=\"100%%\" border=\"0\">"); DIR *d = opendir(dir); int error = 0; if (d) { struct dirent de, *dep; while (0 == readdir_r(d, &de, &dep) && dep) { if (de.d_name[0] == '.') continue; struct stat st; if (0 > fstatat(dirfd(d), de.d_name, &st, 0)) { vmbuf_sprintf(payload, "<tr><td>ERROR: %s</td><td>N/A</td></tr>", de.d_name); continue; } const char *slash = (S_ISDIR(st.st_mode) ? "/" : ""); struct tm t_res, *t; t = localtime_r(&st.st_mtime, &t_res); vmbuf_strcpy(payload, "<tr>"); vmbuf_sprintf(payload, "<td><a href=\"%s%s\">%s%s</a></td>", de.d_name, slash, de.d_name, slash); vmbuf_strcpy(payload, "<td>"); if (t) vmbuf_strftime(payload, "%F %T", t); vmbuf_strcpy(payload, "</td>"); vmbuf_sprintf(payload, "<td>%lu</td>", st.st_size); vmbuf_strcpy(payload, "</tr>"); } closedir(d); } vmbuf_strcpy(payload, "<tr><td colspan=3><hr></td></tr></table>"); vmbuf_sprintf(payload, "<address>RIBS 2.0 Port %hu</address></body>", ctx->server->port); vmbuf_strcpy(payload, "</html>"); return error; }