int debugging = 0; /* debug info printing option: default is no debug */
/* Subroutines declaration */
+struct code_page {
+ char * code;
+ char * name;
+ char * body;
+};
+
void usage(void);
void ServPage(int sockfd);
void PrintErr(char * error);
-void print_headers(FILE *file);
-void print_err404(FILE *file, char *filename);
-void print_err400(FILE *file, char *string);
-void print_err500(FILE *file, char *string);
+void print_headers(FILE *file, struct code_page code);
+void print_error(FILE *file, struct code_page page, char * string);
/* Program beginning */
int main(int argc, char *argv[])
*/
int i;
opterr = 0; /* don't want writing to stderr */
- while ( (i = getopt(argc, argv, "hdicw:r:")) != -1) {
+ while ( (i = getopt(argc, argv, "hdicr:")) != -1) {
switch (i) {
/*
* Handling options
printf(" -d write debug info\n");
printf(" -i use interactively\n");
printf(" -c disable BSD semantics\n");
- printf(" -w N wait N sec. before calling accept\n");
+ printf(" -r /path chroot on /path\n");
exit(1);
}
/*
char outbuf[1024];
FILE *sock, *file;
char *line, *copy, *method, *ptr, *filename, *version;
- char *methods[] = { "GET", "PUT", NULL };
- char *codes[] = {
- "200 OK",
- "400 Bad Request",
- "404 Not Found",
- "500 Internal Server Error",
- NULL
+ char *methods[] = { "GET", "HEAD", NULL };
+ struct code_page codes[] = {
+ { "200", "OK", "%s"},
+ { "400", "Bad Request",
+ "Your browser sent a request that this server could not understand."
+ "<P>The request line<P>%s<P> is invalid following the protocol<P>"},
+ { "404", "Not Found",
+ "The requested URL %s was not found on this server.<P>"},
+ { "500", "Internal Server Error",
+ "We got an error processing your request.<P>Error is: %s<P>"},
+ { "405", "Method Not Allowed", "Method %s not allowed.<P>"},
+ { "403", "Forbidden", "You cannot access %s.<P>"}
};
int nleft;
- int i, j;
+ int i;
sock = fdopen(sockfd, "w+");
/* main loop, reading 0 char means client close connection */
/* parsing first line, getting method and filename */
copy = strndupa(line, MAXLINE);
if ((method = strtok_r(copy, " ", &ptr)) == NULL) {
- fprintf(sock, "HTTP/1.0 %s\n", codes[2]);
- print_headers(sock);
- print_err400(sock, line);
+ print_headers(sock, codes[1]);
+ print_error(sock, codes[1], line);
return;
}
if ((filename = strtok_r(NULL, " ", &ptr)) == NULL) {
- fprintf(sock, "HTTP/1.0 %s\n", codes[2]);
- print_headers(sock);
- print_err400(sock, line);
+ print_headers(sock, codes[1]);
+ print_error(sock, codes[1], line);
return;
}
if ((version = strtok_r(NULL, " ", &ptr)) == NULL) {
- fprintf(sock, "HTTP/1.0 %s\n", codes[2]);
- print_headers(sock);
- print_err400(sock, line);
+ print_headers(sock, codes[1]);
+ print_error(sock, codes[1], line);
return;
}
i = 0;
i++;
}
if (i>=2) {
- fprintf(sock, "HTTP/1.0 %s\n", codes[2]);
- print_headers(sock);
- print_err400(sock, line);
+ print_headers(sock, codes[4]);
+ print_error(sock, codes[4], method);
return;
}
}
if ( (file = fopen(filename, "r")) == NULL) {
- fprintf(sock, "HTTP/1.0 %s\n", codes[2]);
- print_headers(sock);
- print_err404(sock, filename);
+ if ( (errno == EACCES)||(errno == EPERM) ) {
+ print_headers(sock, codes[5]);
+ print_error(sock, codes[5], filename);
+ } else {
+ print_headers(sock, codes[2]);
+ print_error(sock, codes[2], filename);
+ }
return;
}
- fprintf(sock, "HTTP/1.0 %s\n", codes[0]);
- print_headers(sock);
-
- j = 0;
+ print_headers(sock, codes[0]);
while (!feof(file)) {
if ( (nleft = full_fread(file, outbuf, 1024)) != 0) {
if (ferror(file)) {
- fprintf(sock, "HTTP/1.0 %s\n", codes[3]);
- print_headers(sock);
- snprintf(buffer, MAXLINE, "reading %s", filename);
- print_err500(sock, buffer);
+ strncpy(buffer, strerror(errno), MAXLINE);
+ print_headers(sock, codes[3]);
+ print_error(sock, codes[3], buffer);
return;
}
}
if (full_fwrite(sock, outbuf, 1024-nleft) != 0) {
if (ferror(file)) {
- fprintf(sock, "HTTP/1.0 %s\n", codes[3]);
- print_headers(sock);
- snprintf(buffer, MAXLINE, "writing");
- print_err500(sock, buffer);
+ strncpy(buffer, strerror(errno), MAXLINE);
+ print_headers(sock, codes[3]);
+ print_error(sock, codes[3], buffer);
return;
}
}
return;
}
-void print_headers(FILE *file)
+void print_headers(FILE *file, struct code_page code)
{
time_t tempo;
+ fprintf(file, "HTTP/1.0 %s %s \n", code.code, code.name);
time(&tempo);
fprintf(file, "Date: %s", ctime(&tempo));
fprintf(file, "Server: WWWd test server\n");
return;
}
-void print_err404(FILE *file, char *filename)
-{
- fprintf(file, "<HTML><HEAD><TITLE>404 Not Found</TITLE></HEAD>\n");
- fprintf(file, "<BODY><H1>Not Found</H1>\nThe requested ");
- fprintf(file, "URL %s was not found on this server.<P><HR>", filename);
- fprintf(file, "<ADDRESS>WWWd by Simone Piccardi</ADDRESS></BODY></HTML>");
- return;
-}
-
-void print_err400(FILE *file, char *string)
+void print_error(FILE *file, struct code_page page, char * string)
{
- fprintf(file, "<HTML><HEAD><TITLE>404 Bad Request</TITLE></HEAD>\n");
- fprintf(file, "<BODY><H1>Bad Request</H1>\n ");
- fprintf(file, "Your browser sent a request that this server could not ");
- fprintf(file, "understand.<P>The request line<P> %s <P>", string);
- fprintf(file, "is invalid following the protocol<p><HR>");
- fprintf(file, "<ADDRESS>WWWd by Simone Piccardi </ADDRESS></BODY></HTML>");
+ fprintf(file, "<HTML><HEAD><TITLE>%s %s</TITLE></HEAD>\n",
+ page.code, page.name);
+ fprintf(file, "<BODY><H1>%s</H1>\n", page.name);
+ fprintf(file, page.body, string);
+ fprintf(file, "<HR><ADDRESS>WWWd by S. Piccardi</ADDRESS></BODY></HTML>");
return;
}
-
-void print_err500(FILE *file, char *string)
-{
- fprintf(file, "<HTML><HEAD><TITLE>500 Internal Server Error</TITLE>\n");
- fprintf(file, "</HEAD><BODY><H1>Internal Server Error</H1>\n ");
- fprintf(file, "We got an error processing your request.<P>");
- fprintf(file, "Error is: %s <P><HR>\n", string);
- fprintf(file, "<ADDRESS>WWWd by Simone Piccardi </ADDRESS></BODY></HTML>");
- return;
-}