M7350/webserver/webserver.h
2024-09-09 08:52:07 +00:00

167 lines
6.0 KiB
C

/* Copyright (c) 2012, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of The Linux Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef WEBSERVER_H
#define WEBSERVER_H
/* standard includes */
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
#include <signal.h>
/* location where the configuration file is stored */
#define CONF_FILE "/etc/webserver.conf"
/* the default UID and GID to run the webserver as after
binding to the default listening port */
#define DEFAULT_SAFE_UID 1
#define DEFAULT_SAFE_GID 1
/* internally used return values */
#define FAIL -1
#define OK 0
/* max size to read for headers */
#define MAX_HEADER_SIZE 1024
/* max size of default type in conf file */
#define MAX_TYPE_LENGTH MAX_CONF_LINE_SIZE
/* size to allocate for date strings */
#define MAX_DATE_SIZE 128
#define HTTP_PORT "80"
#define LISTEN_BACKLOG 10 //max unaccepted connections that listen() will queue
/*HTTP Status Codes*/
#define HTTP_OK 200
#define HTTP_NOT_FOUND 404
#define HTTP_ACCESS_DENIED 403
#define HTTP_NOT_IMPLEMENTED 501
#define HTTP_SERVER_ERROR 500
#define HTTP_BAD_REQUEST 400
/*HTTP Status Reasons */
#define HTTP_OK_R "OK"
#define HTTP_NOT_FOUND_R "Not Found"
#define HTTP_ACCESS_DENIED_R "Forbidden"
#define HTTP_NOT_IMPLEMENTED_R "Not Implemented"
#define HTTP_SERVER_ERROR_R "Server Error"
#define HTTP_BAD_REQUEST_R "Bad Request"
/* default http type for responses (ie text/html) */
#define DEFAULT_TYPE "text/html"
/* Configuration File Options */
#define CONF_HOME "Home"
#define CONF_MAX_READ "MaxReadSize"
#define CONF_DEFAULT_TYPE "DefaultType"
#define CONF_DEFAULT_PAGE "DefaultPage"
#define CONF_UID "UID"
#define CONF_GID "GID"
#define CONF_COMMENT '#'
#define CONF_POST_OPTION " " //delimiter between above options and argument
/* max size of a single line in the conf file */
#define MAX_CONF_LINE_SIZE 512
/* largest URL, including parameters, to accept */
#define MAX_URL_SIZE 512
/* reads in configuration file */
int read_conf(void);
/* receives and responds to requests */
int request_handler(int);
/* reads request header */
char * read_headers(int,int *);
/* reads request body */
char * read_body(int,int *);
/* responds to get requests */
int serve_get_request(int,char *,char *,int,char *,int);
/* verifies that the server is allowed to serve the requested URL */
int check_access(char *);
/* sends an error header to the client */
void send_error(int,int);
/* builds a header section with the given response code and type */
char * generate_headers(int,char *, int, int *);
/* builds the body as specified by the request URL */
char * generate_body(char *, int *);
/* finds size of file */
off_t fsize(char *);
/* reads one line from a file */
int get_line(FILE *,char *);
/* puts formatted date in passed buffer */
int get_date(char *);
/* turns a URL into a local filename */
char * get_filename(char *);
/* reclaims exited child processes */
void wait_children(int);
/* global variables */
extern int max_header_size; //the max number of chars to read as part of header
extern char default_type[]; //default type to send files as
extern char home_dir[]; //directory to serve files out of
extern int safe_uid; //nonroot user to run as after binding to port
extern int safe_gid; //nonroot group to run as after binding to port
#define HELP_STRING "Usage: %s\nConfiguration file should be located at %s\n"
#define CONF_HELP_STRING "\nHELP:\nConfiguration file should be at %s\n" \
"Each line should be at most %d characters long.\n" \
"Comments must be at the beginning of a line and start with %c\n" \
"Valid options are:\n" \
"\t%s%s<path> - Sets directory that files are allowed to be served from.\n\t\t Must be set and an absolute path in order for server to work.\n" \
"\t%s%s<size> - Sets the largest allowed HTTP header size.\n\t\t Default is: %d\n" \
"\t%s%s<type> - Sets the HTTP type to be used for serving files.\n\t\t Default is: %s\n" \
"\t%s%s<filename> - File to serve if the \"/\" url is requested.\n\t\t If not specified, a simple diagnostic page will be returned.\n\t\t Can be absolute path or relative to Home.\n" \
"\n"
/* This macro allows debug output to be enabled and disabled throughout
* the entire program with one flag */
#ifdef DEBUG
#define debug_printf(args...) fprintf(stderr,"DEBUG: " args)
#else
#define debug_printf(args...) ;
#endif
#endif