#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define WEBROOT "/usr/local/apache2/htdocs/www.gtoal.com"
#define BINDIR "/usr/local/bin/"
#define TRUE (0==0)
#define FALSE (0!=0)
/* test url: http://www.gtoal.com/cgi-bin/image/athome/edinburgh/scans/skimp_ii/split/skimp047-left.png */
static char *pnmto[] = { /* name of conversion program and output mime type */
"jpg/jpeg", "jpeg/jpeg", "gif/gif", "tiff/tiff", "png/png",
NULL
};
static char *topnm[] = { /* acceptible extensions for files on disk */
"djvu", "png", "jpg", "jpeg", "gif", "tiff", "pnm",
NULL /* they are listed in preferred order of size in case > 1 on disk */
};
void nonmac_htmlassert(int test, char *desc) {
if (test) return;
fprintf(stdout, "Content-Type: text/html; charset=ISO-8859-1\r\n\r\n");
fprintf(stdout, "<HTML>\n");
fprintf(stdout, "<BODY>\n");
fprintf(stdout, "Assertion failed: %s\n", desc);
fprintf(stdout, "</BODY>\n");
fprintf(stdout, "</HTML>\n");
fflush(stdout);
exit(0);
}
#define htmlassert(s) nonmac_htmlassert(s, #s)
int main(int argc, char **argv)
{
int i;
FILE *f;
char *orig_path, *s, *ext, *basename, *command, *diskfile, *diskext, *mime;
/* Extract URL from environment, find base file, convert on the fly */
s = getenv("PATH_INFO");
orig_path = strdup(s);
htmlassert(orig_path != NULL);
ext = strrchr(s, '.');
if (ext == NULL || strchr(ext, '/') != NULL) {
/* any error punts to the non-filtered URL which should then
generate the appropriate error message */
fprintf(stdout, "%s%s\r\n\r\n","Refresh: 0;url=", orig_path);exit(0);
}
basename = malloc((ext-s)+32);
command = malloc((ext-s)+512);
diskfile = malloc((ext-s)+512);
htmlassert(basename != NULL && command != NULL && diskfile != NULL);
strncpy(basename, s, ext-s); basename[ext-s] = '\0';
ext += 1; /* drop the "." */
s = basename;
strsep(&s, "\\'\"`$.<>&;%~- "); /* eliminate obvious shell escapes. */
if (s != NULL) { /* (did I miss any?) */
fprintf(stdout, "%s%s\r\n\r\n","Refresh: 0;url=", orig_path);exit(0);
}
i = 0;
while ((s = topnm[i++]) != NULL) {
sprintf(diskfile, "%s%s.%s", WEBROOT, basename, s);
if ((f=fopen(diskfile, "r")) != NULL) {fclose(f); break;}
*diskfile = '\0';
}
if (*diskfile == '\0') {
fprintf(stdout, "%s%s\r\n\r\n","Refresh: 0;url=", orig_path);exit(0);
}
i = 0;
while ((s = pnmto[i++]) != NULL) {
mime = strchr(s, '/');
htmlassert(mime != NULL);
*mime++ = '\0'; /* writable strings */
diskext = strrchr(diskfile, '.')+1;
if (strcmp(ext, s) == 0) {
fprintf(stdout,
"Content-Type: image/%s\r\n\r\n", mime);
fflush(stdout);
sprintf(command,
"/bin/sh -c \"%s%stopnm < %s 2> /dev/null|%spnmto%s 2>/dev/null\"",
BINDIR,diskext, diskfile, BINDIR,ext);
system(command); fflush(stdout);
exit(0);
}
}
fprintf(stdout, "%s%s\r\n\r\n","Refresh: 0;url=", orig_path);
exit(0);
}