| /* |
| * Copyright 2001-2004 Brandon Long |
| * All Rights Reserved. |
| * |
| * ClearSilver Templating System |
| * |
| * This code is made available under the terms of the ClearSilver License. |
| * http://www.clearsilver.net/license.hdf |
| * |
| */ |
| |
| /* static.cgi |
| * This is a really simple example of how you can map URL requests to a set of |
| * hdf and cs files. |
| */ |
| |
| #include "ClearSilver.h" |
| |
| #include <unistd.h> |
| #include <limits.h> |
| #include <string.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| int main(int argc, char **argv, char **envp) |
| { |
| NEOERR *err; |
| CGI *cgi; |
| char *cs_file; |
| char hdf_file[_POSIX_PATH_MAX]; |
| char *p; |
| |
| /* CGI works by passing information from the server to the CGI program via |
| * environment variables and stdin. cgi_debug_init looks for a file as the |
| * first argument, and loads it. That file contains key=value pairs which |
| * cgi_debug_init will load into the environment, allowing you to test your |
| * program via the command line. */ |
| cgi_debug_init(argc, argv); |
| |
| /* The ClearSilver cgi toolkit accesses the CGI environment through a |
| * wrapper. This allows the program to be used in other environments and |
| * fake the CGI environment, such as FastCGI, mod_python, PyApache, or even |
| * just from Python to access the python objects instead of the libc API. |
| * cgiwrap_init_std just sets up for the default CGI environment using the |
| * libc api. */ |
| cgiwrap_init_std(argc, argv, envp); |
| |
| /* cgi_init creates a CGI struct, and parses the CGI environment variables. |
| * It creates an HDF structure as well. */ |
| err = cgi_init(&cgi, NULL); |
| if (err != STATUS_OK) |
| { |
| /* cgi_neo_error renders a NEOERR as an error CGI result */ |
| cgi_neo_error(cgi, err); |
| /* nerr_log_error logs the error to stderr and cleans up */ |
| nerr_log_error(err); |
| return -1; |
| } |
| |
| /* CGI.PathTranslated is a CGI env var which maps the URL with the |
| * DocumentRoot to give you the location of the referenced file on disk */ |
| cs_file = hdf_get_value(cgi->hdf, "CGI.PathTranslated", NULL); |
| if (cs_file == NULL) |
| { |
| /* cgi_error returns a simple error page */ |
| cgi_error(cgi, "No PATH_TRANSLATED var"); |
| return -1; |
| } |
| |
| /* The hdf.loadpaths variables specify where HDF and ClearSilver look for |
| * files on the file system. We start setting that up here based on |
| * the directory of the file referenced */ |
| p = strrchr (cs_file, '/'); |
| if (p) |
| { |
| *p = '\0'; |
| err = hdf_set_value(cgi->hdf, "hdf.loadpaths.0", cs_file); |
| chdir(cs_file); |
| *p = '/'; |
| if (err) |
| { |
| cgi_neo_error(cgi, err); |
| nerr_log_error(err); |
| return -1; |
| } |
| } |
| /* Next, we look for a shared HDF static dataset in common.hdf */ |
| err = hdf_read_file(cgi->hdf, "common.hdf"); |
| if (err && !nerr_handle(&err, NERR_NOT_FOUND)) |
| { |
| cgi_neo_error(cgi, err); |
| nerr_log_error(err); |
| return -1; |
| } |
| /* Next, we look for an HDF file for this specific page. We first look |
| * for passedfile.html.hdf, then we check for a file by removing an extension |
| * from the file, so something like passedfile.html we'll look for |
| * passedfile.hdf */ |
| snprintf (hdf_file, sizeof(hdf_file), "%s.hdf", cs_file); |
| err = hdf_read_file (cgi->hdf, hdf_file); |
| if (err && !nerr_handle(&err, NERR_NOT_FOUND)) |
| { |
| cgi_neo_error(cgi, err); |
| nerr_log_error(err); |
| return -1; |
| } |
| p = strrchr (cs_file, '.'); |
| if (p) |
| { |
| *p = '\0'; |
| snprintf (hdf_file, sizeof(hdf_file), "%s.hdf", cs_file); |
| *p = '.'; |
| err = hdf_read_file (cgi->hdf, hdf_file); |
| if (err && !nerr_handle(&err, NERR_NOT_FOUND)) |
| { |
| cgi_neo_error(cgi, err); |
| nerr_log_error(err); |
| return -1; |
| } |
| } |
| /* Lastly, we need to render a template. The template is either the |
| * file that was passed to us, or its specificed by CGI.StaticContent |
| * in one of the HDF files we loaded above. */ |
| cs_file = hdf_get_value (cgi->hdf, "CGI.StaticContent", cs_file); |
| err = cgi_display (cgi, cs_file); |
| if (err != STATUS_OK) |
| { |
| cgi_neo_error(cgi, err); |
| nerr_log_error(err); |
| return -1; |
| } |
| return 0; |
| } |