More inttype tweaks.

This commit is contained in:
Emil Mikulic 2011-01-15 18:15:39 +11:00
parent bc692bb5f7
commit 8393796097

View File

@ -61,18 +61,30 @@ static const int debug = 1;
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
#ifndef min #ifdef __sun__
#define min(a,b) ( ((a)<(b)) ? (a) : (b) )
#endif
#ifndef INADDR_NONE #ifndef INADDR_NONE
#define INADDR_NONE -1 #define INADDR_NONE -1
#endif #endif
#endif
#ifndef min
#define min(a,b) ( ((a)<(b)) ? (a) : (b) )
#endif
#if defined(O_EXCL) && !defined(O_EXLOCK) #if defined(O_EXCL) && !defined(O_EXLOCK)
#define O_EXLOCK O_EXCL #define O_EXLOCK O_EXCL
#endif #endif
/* [->] borrowed from FreeBSD's src/sys/sys/systm.h,v 1.276.2.7.4.1 */
#ifndef CTASSERT /* Allow lint to override */
#define CTASSERT(x) _CTASSERT(x, __LINE__)
#define _CTASSERT(x, y) __CTASSERT(x, y)
#define __CTASSERT(x, y) typedef char __assert ## y[(x) ? 1 : -1]
#endif
/* [<-] */
CTASSERT(sizeof(unsigned long long) >= sizeof(off_t));
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__linux) #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__linux)
#include <err.h> #include <err.h>
#else #else
@ -210,15 +222,11 @@ struct connection
char *reply; char *reply;
int reply_dont_free; int reply_dont_free;
int reply_fd; int reply_fd;
off_t reply_start, reply_length, reply_sent; off_t reply_start, reply_length, reply_sent,
total_sent; /* header + body = total, for logging */
unsigned int total_sent; /* header + body = total, for logging */
}; };
struct mime_mapping {
struct mime_mapping
{
char *extension, *mimetype; char *extension, *mimetype;
}; };
@ -226,8 +234,6 @@ struct mime_mapping *mime_map = NULL;
size_t mime_map_size = 0; size_t mime_map_size = 0;
size_t longest_ext = 0; size_t longest_ext = 0;
/* If a connection is idle for idletime seconds or more, it gets closed and /* If a connection is idle for idletime seconds or more, it gets closed and
* removed from the connlist. Set to 0 to remove the timeout * removed from the connlist. Set to 0 to remove the timeout
* functionality. * functionality.
@ -1669,13 +1675,12 @@ static void cleanup_sorted_dirlist(struct dlent **list, const ssize_t size)
} }
} }
/* --------------------------------------------------------------------------- /* Should this character be urlencoded (according to RFC1738).
* Should this character be urlencoded (according to rfc1738) * Contirubted by nf.
*/ */
static int needs_urlencoding(char c) static int needs_urlencoding(char c) {
{
int i; int i;
const static char bad[] = "<>\"%{}|^~[]`\\;:/?@#=&"; static const char bad[] = "<>\"%{}|^~[]`\\;:/?@#=&";
for (i=0; i<sizeof(bad)-1; i++) for (i=0; i<sizeof(bad)-1; i++)
if (c == bad[i]) if (c == bad[i])
@ -1688,12 +1693,11 @@ static int needs_urlencoding(char c)
return 0; return 0;
} }
/* --------------------------------------------------------------------------- /* Encode filename to be an RFC1738-compliant URL part.
* Encode filename to be an rfc1738-compliant URL part * Contributed by nf
*/ */
static void urlencode_filename(char *name, char *safe_url) static void urlencode_filename(char *name, char *safe_url) {
{ static const char hex[] = "0123456789ABCDEF";
const static char hex[] = "0123456789ABCDEF";
int i, j; int i, j;
for (i = j = 0; name[i] != '\0'; i++) for (i = j = 0; name[i] != '\0'; i++)
@ -2044,8 +2048,7 @@ static void poll_recv_request(struct connection *conn)
recvd = recv(conn->socket, buf, BUFSIZE, 0); recvd = recv(conn->socket, buf, BUFSIZE, 0);
if (debug) printf("poll_recv_request(%d) got %d bytes\n", if (debug) printf("poll_recv_request(%d) got %d bytes\n",
conn->socket, (int)recvd); conn->socket, (int)recvd);
if (recvd <= 0) if (recvd < 1) {
{
if (recvd == -1) { if (recvd == -1) {
if (errno == EAGAIN) { if (errno == EAGAIN) {
if (debug) printf("poll_recv_request would have blocked\n"); if (debug) printf("poll_recv_request would have blocked\n");
@ -2062,11 +2065,13 @@ static void poll_recv_request(struct connection *conn)
#undef BUFSIZE #undef BUFSIZE
/* append to conn->request */ /* append to conn->request */
conn->request = xrealloc(conn->request, conn->request_length+recvd+1); assert(recvd > 0);
conn->request = xrealloc(conn->request,
conn->request_length + (size_t)recvd + 1);
memcpy(conn->request+conn->request_length, buf, (size_t)recvd); memcpy(conn->request+conn->request_length, buf, (size_t)recvd);
conn->request_length += recvd; conn->request_length += (size_t)recvd;
conn->request[conn->request_length] = 0; conn->request[conn->request_length] = 0;
total_in += recvd; total_in += (size_t)recvd;
/* process request if we have all of it */ /* process request if we have all of it */
if ((conn->request_length > 2) && if ((conn->request_length > 2) &&
@ -2110,8 +2115,7 @@ static void poll_send_header(struct connection *conn)
conn->socket, (int)sent); conn->socket, (int)sent);
/* handle any errors (-1) or closure (0) in send() */ /* handle any errors (-1) or closure (0) in send() */
if (sent < 1) if (sent < 1) {
{
if ((sent == -1) && (errno == EAGAIN)) { if ((sent == -1) && (errno == EAGAIN)) {
if (debug) printf("poll_send_header would have blocked\n"); if (debug) printf("poll_send_header would have blocked\n");
return; return;
@ -2122,9 +2126,10 @@ static void poll_send_header(struct connection *conn)
conn->state = DONE; conn->state = DONE;
return; return;
} }
conn->header_sent += sent; assert(sent > 0);
conn->total_sent += sent; conn->header_sent += (size_t)sent;
total_out += sent; conn->total_sent += (size_t)sent;
total_out += (size_t)sent;
/* check if we're done sending header */ /* check if we're done sending header */
if (conn->header_sent == conn->header_length) if (conn->header_sent == conn->header_length)
@ -2150,7 +2155,7 @@ static void poll_send_header(struct connection *conn)
* read error. * read error.
*/ */
static ssize_t send_from_file(const int s, const int fd, static ssize_t send_from_file(const int s, const int fd,
off_t ofs, off_t size) off_t ofs, size_t size)
{ {
#ifdef __FreeBSD__ #ifdef __FreeBSD__
off_t sent; off_t sent;
@ -2219,16 +2224,18 @@ static void poll_send_reply(struct connection *conn)
assert(!conn->header_only); assert(!conn->header_only);
if (conn->reply_type == REPLY_GENERATED) if (conn->reply_type == REPLY_GENERATED)
{ {
assert(conn->reply_length >= conn->reply_sent);
sent = send(conn->socket, sent = send(conn->socket,
conn->reply + conn->reply_start + conn->reply_sent, conn->reply + conn->reply_start + conn->reply_sent,
conn->reply_length - conn->reply_sent, 0); (size_t)(conn->reply_length - conn->reply_sent), 0);
} }
else else
{ {
errno = 0; errno = 0;
assert(conn->reply_length >= conn->reply_sent);
sent = send_from_file(conn->socket, conn->reply_fd, sent = send_from_file(conn->socket, conn->reply_fd,
conn->reply_start + conn->reply_sent, conn->reply_start + conn->reply_sent,
conn->reply_length - conn->reply_sent); (size_t)(conn->reply_length - conn->reply_sent));
if (debug && (sent < 1)) if (debug && (sent < 1))
printf("send_from_file returned %lld (errno=%d %s)\n", printf("send_from_file returned %lld (errno=%d %s)\n",
(long long)sent, errno, strerror(errno)); (long long)sent, errno, strerror(errno));
@ -2289,10 +2296,10 @@ static void log_connection(const struct connection *conn)
inaddr.s_addr = conn->client; inaddr.s_addr = conn->client;
fprintf(logfile, "%lu\t%s\t%s\t%s\t%d\t%u\t\"%s\"\t\"%s\"\n", fprintf(logfile, "%lu\t%s\t%s\t%s\t%d\t%llu\t\"%s\"\t\"%s\"\n",
(unsigned long int)now, inet_ntoa(inaddr), (unsigned long int)now, inet_ntoa(inaddr),
conn->method, conn->uri, conn->method, conn->uri,
conn->http_code, conn->total_sent, conn->http_code, (unsigned long long)conn->total_sent,
(conn->referer == NULL)?"":conn->referer, (conn->referer == NULL)?"":conn->referer,
(conn->user_agent == NULL)?"":conn->user_agent (conn->user_agent == NULL)?"":conn->user_agent
); );
@ -2445,7 +2452,8 @@ daemonize_start(void)
if (close(lifeline[1]) == -1) if (close(lifeline[1]) == -1)
warn("close lifeline in parent"); warn("close lifeline in parent");
read(lifeline[0], tmp, sizeof(tmp)); if (read(lifeline[0], tmp, sizeof(tmp)) == -1)
warn("read lifeline in parent");
w = waitpid(f, &status, WNOHANG); w = waitpid(f, &status, WNOHANG);
if (w == -1) if (w == -1)
err(1, "waitpid"); err(1, "waitpid");
@ -2674,7 +2682,7 @@ main(int argc, char **argv)
(unsigned int)r.ru_stime.tv_sec, (unsigned int)r.ru_stime.tv_sec,
(unsigned int)(r.ru_stime.tv_usec/10000) (unsigned int)(r.ru_stime.tv_usec/10000)
); );
printf("Requests: %u\n", num_requests); printf("Requests: %llu\n", num_requests);
printf("Bytes: %llu in, %llu out\n", total_in, total_out); printf("Bytes: %llu in, %llu out\n", total_in, total_out);
} }