Home | History | Annotate | Download | only in cgi
      1 /*
      2  * Copyright 2001-2004 Brandon Long
      3  * All Rights Reserved.
      4  *
      5  * ClearSilver Templating System
      6  *
      7  * This code is made available under the terms of the ClearSilver License.
      8  * http://www.clearsilver.net/license.hdf
      9  *
     10  */
     11 
     12 /* static.cgi
     13  * This is a really simple example of how you can map URL requests to a set of
     14  * hdf and cs files.
     15  */
     16 
     17 #include "ClearSilver.h"
     18 
     19 #include <unistd.h>
     20 #include <limits.h>
     21 #include <string.h>
     22 #include <stdio.h>
     23 #include <stdlib.h>
     24 
     25 int main(int argc, char **argv, char **envp)
     26 {
     27   NEOERR *err;
     28   CGI *cgi;
     29   char *cs_file;
     30   char hdf_file[_POSIX_PATH_MAX];
     31   char *p;
     32 
     33   /* CGI works by passing information from the server to the CGI program via
     34    * environment variables and stdin.  cgi_debug_init looks for a file as the
     35    * first argument, and loads it.  That file contains key=value pairs which
     36    * cgi_debug_init will load into the environment, allowing you to test your
     37    * program via the command line. */
     38   cgi_debug_init(argc, argv);
     39 
     40   /* The ClearSilver cgi toolkit accesses the CGI environment through a
     41    * wrapper.  This allows the program to be used in other environments and
     42    * fake the CGI environment, such as FastCGI, mod_python, PyApache, or even
     43    * just from Python to access the python objects instead of the libc API.
     44    * cgiwrap_init_std just sets up for the default CGI environment using the
     45    * libc api. */
     46   cgiwrap_init_std(argc, argv, envp);
     47 
     48   /* cgi_init creates a CGI struct, and parses the CGI environment variables.
     49    * It creates an HDF structure as well.  */
     50   err = cgi_init(&cgi, NULL);
     51   if (err != STATUS_OK)
     52   {
     53     /* cgi_neo_error renders a NEOERR as an error CGI result */
     54     cgi_neo_error(cgi, err);
     55     /* nerr_log_error logs the error to stderr and cleans up */
     56     nerr_log_error(err);
     57     return -1;
     58   }
     59 
     60   /* CGI.PathTranslated is a CGI env var which maps the URL with the
     61    * DocumentRoot to give you the location of the referenced file on disk */
     62   cs_file = hdf_get_value(cgi->hdf, "CGI.PathTranslated", NULL);
     63   if (cs_file == NULL)
     64   {
     65     /* cgi_error returns a simple error page */
     66     cgi_error(cgi, "No PATH_TRANSLATED var");
     67     return -1;
     68   }
     69 
     70   /* The hdf.loadpaths variables specify where HDF and ClearSilver look for
     71    * files on the file system.  We start setting that up here based on
     72    * the directory of the file referenced */
     73   p = strrchr (cs_file, '/');
     74   if (p)
     75   {
     76     *p = '\0';
     77     err = hdf_set_value(cgi->hdf, "hdf.loadpaths.0", cs_file);
     78     chdir(cs_file);
     79     *p = '/';
     80     if (err)
     81     {
     82       cgi_neo_error(cgi, err);
     83       nerr_log_error(err);
     84       return -1;
     85     }
     86   }
     87   /* Next, we look for a shared HDF static dataset in common.hdf */
     88   err = hdf_read_file(cgi->hdf, "common.hdf");
     89   if (err && !nerr_handle(&err, NERR_NOT_FOUND))
     90   {
     91     cgi_neo_error(cgi, err);
     92     nerr_log_error(err);
     93     return -1;
     94   }
     95   /* Next, we look for an HDF file for this specific page.  We first look
     96    * for passedfile.html.hdf, then we check for a file by removing an extension
     97    * from the file, so something like passedfile.html we'll look for
     98    * passedfile.hdf */
     99   snprintf (hdf_file, sizeof(hdf_file), "%s.hdf", cs_file);
    100   err = hdf_read_file (cgi->hdf, hdf_file);
    101   if (err && !nerr_handle(&err, NERR_NOT_FOUND))
    102   {
    103     cgi_neo_error(cgi, err);
    104     nerr_log_error(err);
    105     return -1;
    106   }
    107   p = strrchr (cs_file, '.');
    108   if (p)
    109   {
    110     *p = '\0';
    111     snprintf (hdf_file, sizeof(hdf_file), "%s.hdf", cs_file);
    112     *p = '.';
    113     err = hdf_read_file (cgi->hdf, hdf_file);
    114     if (err && !nerr_handle(&err, NERR_NOT_FOUND))
    115     {
    116       cgi_neo_error(cgi, err);
    117       nerr_log_error(err);
    118       return -1;
    119     }
    120   }
    121   /* Lastly, we need to render a template.  The template is either the
    122    * file that was passed to us, or its specificed by CGI.StaticContent
    123    * in one of the HDF files we loaded above. */
    124   cs_file = hdf_get_value (cgi->hdf, "CGI.StaticContent", cs_file);
    125   err = cgi_display (cgi, cs_file);
    126   if (err != STATUS_OK)
    127   {
    128     cgi_neo_error(cgi, err);
    129     nerr_log_error(err);
    130     return -1;
    131   }
    132   return 0;
    133 }
    134