#include #include #include #include #include #include #include #include /* Vorgaben, wenn unvollständiger Pfad angegeben */ #define USER "/~heha" #define HOME "h/heha" #define abs(x) ((x)>0?(x):-(x)) typedef struct _FL { struct _FL *next; char fn[1]; }FL; typedef struct { char *dir; int curfile; int slide, slidetime; } OPTIONS; OPTIONS o; char *mygetenv(char *name) { char *ret=getenv(name); return ret?ret:""; } void modifyserver(void) { char *sn=mygetenv("SERVER_NAME"); char *sp=mygetenv("SERVER_PORT"); char fn[128]; if (strcmp(sp, "80")) { sprintf(fn, "%s:%s", sn, sp); setenv("SERVER_NAME", fn, 1); } } int cmp(const void *a, const void *b) { return strcmp((*(FL**)a)->fn, (*(FL**)b)->fn); } int mkopt(void) { char *go=getenv("go"); char *sl=getenv("slide"); char *nr=getenv("Nr"); char *ti=getenv("Zeit"); char sn[128], *p; if (nr) sscanf(nr, "%d", &o.curfile); else o.curfile=1; if (ti) sscanf(ti, "%d", &o.slidetime); else o.slidetime=5; if (go) { if (!strncmp(go, "Zum A", 5)) o.curfile=1; else if (!strncmp(go, "Zur", 3)) o.curfile--; else if (!strncmp(go, "Vor", 3)) o.curfile++; else if (!strncmp(go, "Zum E", 5)) o.curfile=-1; else if (!strncmp(go, "Zu ", 3)) ; /*NOP*/ else return -1; } if (sl && strcmp(sl, "Slideshow anhalten")) o.slide=1; if (getenv("raus")) { strcpy(sn, mygetenv("SCRIPT_NAME")); p=strrchr(sn, '/'); if (p) strcpy(p+1, "showdir.cgi"); printf("Location: http://%s%s\n\n", mygetenv("SERVER_NAME"), mygetenv("PATH_INFO")); exit(0); } o.dir=getenv("PATH_INFO"); o.dir=o.dir?o.dir:""; return 0; } void parsequery(void) { char *p, *querystring, *p2, *pval, *ppvald, *ppvals; int c; p=getenv("QUERY_STRING"); if (!p) return; p=querystring=strdup(p); while (p) { p2=strchr(p, '&'); if (p2) *p2++='\0'; pval=strchr(p, '='); if (pval) { *pval='\0'; pval++; } else pval=p+strlen(p); for (ppvals=ppvald=pval; *ppvals; ppvals++, ppvald++) { switch (*ppvals) { case '+': { *ppvald=' '; }break; case '%': { sscanf(ppvals+1, "%2X", (unsigned int *)&c); *ppvald=(char)c; ppvals+=2; }break; default: { *ppvald=*ppvals; } } } setenv(p, pval, 0); p=p2; } free(querystring); } void redir(void) { char *pathinfo=getenv("PATH_INFO"); char *qs=getenv("QUERY_STRING"); if (!pathinfo || pathinfo[strlen(pathinfo)-1]!='/') { printf("Location: http://%s%s%s/%s%s\n\n", getenv("SERVER_NAME"), getenv("SCRIPT_NAME"), pathinfo?pathinfo:"", (qs && strlen(qs))?"?":"", qs); exit(0); } } int intresholds(int x, int l, int h) { if (xh) x=l; return x; } int main(void) { char lfsp[PATH_MAX], nfsp[PATH_MAX], *p; FL *anker=NULL, *neu, **field, **pfield; DIR *dir; struct dirent *d; struct stat statbuf; int cFiles=0, i, next, prev; char *pathinfo=getenv("PATH_INFO"); char *ext[]={"bmp", "gif", "ico", "jpg", "jpeg", "pbm", "pcx", "pgm", "png", "pnm", "tif", "tiff", ""}, **pext; modifyserver(); redir(); memset(&o, 0, sizeof(OPTIONS)); parsequery(); mkopt(); printf("Content-type: text/html\n\n"); /* printf("%s
", pathinfo);*/ /* strcpy(lfsp, getenv("SCRIPT_FILENAME"));*/ strcpy(lfsp, "/afs/tu-chemnitz.de/home/urz/"); if (pathinfo[1]!='~') strcat(lfsp, HOME); else { char hlp[4096], *p; strcpy(hlp, pathinfo+2); p=strstr(hlp, "/"); if (!p) return -1; *p='\0'; lfsp[strlen(lfsp)+1]='\0'; lfsp[strlen(lfsp)]=*hlp; strcat(lfsp, "/"); strcat(lfsp, hlp); } strcat(lfsp, "/public_html"); if (pathinfo[1]!='~') { strcpy(nfsp, USER); strcat(lfsp, pathinfo); strcat(nfsp, pathinfo); } else { *nfsp='\0'; strcat(nfsp, pathinfo); strcpy(pathinfo, strstr(pathinfo+1, "/")); strcat(lfsp, pathinfo); } /* p=strstr(lfsp, "/cgi-bin/"); if (!*p) return -1; *p='\0'; strcpy(nfsp, USER); strcat(lfsp, o.dir); strcat(nfsp, o.dir);*/ /* printf("%s
", lfsp); printf("%s
", nfsp); printf("%s
", pathinfo);*/ if (chdir(lfsp)) return -1; dir=opendir("."); if (!dir) return -1; while ((d=readdir(dir))) { if (!strncmp(d->d_name, "index.htm", 9)) { printf("", nfsp, d->d_name); closedir(dir); return 0; } if (stat(d->d_name, &statbuf)) continue; if (!S_ISREG(statbuf.st_mode)) continue; p=strrchr(d->d_name, '.'); if (!p) continue; p++; pext=ext; while (**pext) { if (!strcmp(p, *pext)) { neu=malloc(sizeof(FL)+strlen(d->d_name)); neu->next=anker; strcpy(neu->fn, d->d_name); anker=neu; cFiles++; break; } pext++; } } closedir(dir); if (!cFiles) { printf("Keine Bilder im Verzeichnis %s.", nfsp); return 0; } o.curfile=intresholds(o.curfile, 1, cFiles); field=malloc(cFiles*sizeof(FL*)); neu=anker; for (i=0, pfield=field, neu=anker; inext; } qsort(field, cFiles, sizeof(FL*), cmp); printf("\n" "\n"); if (o.slide) { o.curfile=intresholds(o.curfile+((o.slidetime<0)?-1:1), 1, cFiles); printf(" ", abs(o.slidetime), o.curfile, /*o.slidetime>0?"Vor":"Zur", */o.slidetime); } printf(" \n" " "); if (o.slide) printf("Slideshow - "); printf("%s (Bild %d/%d)\n" "\n" "\n" "
\n" "
\n" " \n" "    \n" " \n" " \n" " \n" " " "   \n", o.curfile==1?" disabled":"", field[0]->fn, prev, field[prev-1]->fn, next, field[next-1]->fn, o.curfile==cFiles?" disabled":"", cFiles, field[cFiles-1]->fn); printf( " \n" "    \n" " \n" "
\n" " " "
\n" "\n", o.slidetime, o.slide?" disabled":"", o.slide?"anhalten":"starten", abs(cFiles*o.slidetime), nfsp, field[o.curfile-1]->fn); return 0; } #undef abs