Click here to Skip to main content
15,891,253 members
Articles / Programming Languages / C++

Webio - An embedded web server

Rate me:
Please Sign up or sign in to vote.
4.88/5 (33 votes)
20 Jul 2008BSD3 min read 197.2K   3.8K   108  
A C-language web server with embedded files and CGI.
/* webfs.h
 *
 * Part of the Webio Open Source lightweight web server.
 *
 * Copyright (c) 2007 by John Bartas
 * All rights reserved.
 *
 * Use license: Modified from standard BSD license.
 * 
 * Redistribution and use in source and binary forms are permitted
 * provided that the above copyright notice and this paragraph are
 * duplicated in all such forms and that any documentation, advertising 
 * materials, Web server pages, and other materials related to such
 * distribution and use acknowledge that the software was developed
 * by John Bartas. The name "John Bartas" may not be used to 
 * endorse or promote products derived from this software without 
 * specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 *
 */

#ifndef _WEBFS_H_
#define _WEBFS_H_    1

#define WI_FIOSIZE   4096

/* wi_file_s - wrapper for a lower layer FILE descriptor. One of these 
 * is maintained by the server for each open file.
 */
typedef struct wi_file_s
{
   struct wi_file_s *      wf_next;       /* list link */
   void *                  wf_fd;         /* lower layer descriptor */
   struct wi_filesys_s *   wf_routines;   /* routines to use */
   struct wi_sess_s *      wf_sess;       /* session for this file */
   char     wf_data[WI_FIOSIZE];    /* data buffer for reading file */
   int      wf_inbuf;               /* number of bytes in wf_data */
   int      wf_nextbuf;             /* next byte to process in wf_data */
} wi_file;

extern   wi_file * wi_allfiles;

#define  WI_FILE   wi_file

typedef struct wi_filesys_s
{
   WI_FILE *   (*wfs_fopen) (char * name, char * mode);
   int         (*wfs_fread) (char * buf, unsigned size1, unsigned size2, void * fd);
   int         (*wfs_fwrite)(char * buf, unsigned size1, unsigned size2, void * fd);
   int         (*wfs_fclose)(void * fd);
   int         (*wfs_fseek) (void * fd, long offset, int mode);
   int         (*wfs_ftell) (void * fd);
   int         (*wfs_fauth) (void * fd, char * name, char * pw);  /* Optional, for authentication */
   int         (*wfs_push) (void * fd, wi_sess * sess);  /* Optional, server push */
} wi_filesys;


extern   wi_filesys *   wi_filesystems[];

extern   wi_file *      wi_files;   /* list of open files */

/* Top level file access routines. These just map to lower routines */
extern   int      wi_fopen(wi_sess * sess, char * name, char * mode);
extern   int      wi_fread(char * buf, unsigned size1, unsigned size2, void * fd);
extern   int      wi_fwrite(char * buf, unsigned size1, unsigned size2, void * fd);
extern   int      wi_fclose(WI_FILE * fd);
extern   int      wi_fseek(WI_FILE * fd, long offset, int mode);
extern   int      wi_ftell(WI_FILE * fd);

/* Misc. wi_file utility routines */
extern   wi_file *   wi_newfile(wi_filesys * fsys, wi_sess * sess, void * fd);
extern   int         wi_delfile(wi_file * delfile);
extern   int         wi_movebinary(wi_sess * sess, wi_file * fi);


/***************** Optional embedded FS starts here *****************/
#ifdef USE_EMFILES

#define EM_FILENAMELEN  32

typedef struct em_file_s  /* embedded file */
{
   struct   em_file_s * em_next;       /* emfiles list link */
   char     em_name[EM_FILENAMELEN];   /* name of file */
   u_char * em_data;                   /* Actual data, if any */
   int      em_size;                   /* length of em_data in bytes */
   void *   em_routine;                /* SSI or CGI routine */
   int      em_flags;                  /* bitmask of the EMF_ flags */
} em_file;

extern   em_file * emfiles;            /* master list of embedded files */

#define     EMF_SSI     0x0001         /* SSI code-generated file */
#define     EMF_FORM    0x0002         /* Form handler */
#define     EMF_HTML    0x0004         /* HTML file which may have SSIs */
#define     EMF_DATA    0x0008         /* Raw data file (no SSIs) */
#define     EMF_PUSH    0x0010         /* Server side push routine */
#define     EMF_AUTH    0x0020         /* Accessing file requires auth. */
#define     EMF_CEXP    0x0040         /* file just prints C expression. */

extern   WI_FILE *   em_fopen(char * name, char * mode);
extern   int         em_fread(char * buf, unsigned size1, unsigned size2, void * fd);
extern   int         em_fwrite(char * buf, unsigned size1, unsigned size2, void * fd);
extern   int         em_fclose(void * fd);
extern   int         em_fseek(void * fd, long offset, int mode);
extern   int         em_ftell(void * fd);

extern   wi_filesys emfs;

typedef struct em_open_s
{
   struct em_open_s * eo_next;
   em_file *   eo_emfile;     /* Pointer to actual file */
   u_long      eo_position;   /* file position pointer */
   wi_sess *   eo_sess;       /* session (for pass to code) */
} EOFILE;

extern   EOFILE * em_openlist;

#ifndef DDB_SIZE
#define DDB_SIZE 1000         /* allocation for dynamic data (SSI) buffers */
#endif

#ifndef SEEK_SET
#define SEEK_SET        0               /* seek to an absolute position */
#define SEEK_CUR        1               /* seek relative to current position */
#define SEEK_END        2               /* seek relative to end of file */
#endif  /* ifndef SEEK_SET */

typedef int (SSI_ROUTINE)(wi_sess *, EOFILE*);
typedef int (CGI_ROUTINE)(wi_sess *, EOFILE*, wi_form*);
typedef int (PUSH_ROUTINE)(wi_sess *, EOFILE*);


#endif  /* USE_EMFILES */


#endif /* _WEBFS_H_ */

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The BSD License


Written By
Chief Technology Officer praemio.com
United States United States
See my bio here:

http://www.bartas.net/resume.htm

Comments and Discussions