#include #include #include #include #include #include #include /* Vorgabe-Verzeichnisse */ #define USER "/~heha" #define HOME "h/heha" #define ICON USER"/icons/16" #define THUM USER"/icons/48" typedef struct _FL { struct _FL *next; int mode; unsigned long fs; char fn[1]; }FL; typedef struct { const char *ext, *ico, *desc; }EXT; int cmp(const void *a, const void *b) { return strcmp((*(FL**)a)->fn, (*(FL**)b)->fn); } int main(void) { DIR *dir; FL *anker=NULL, *neu, **field, **pfield; struct dirent *d; char *pathinfo=getenv("PATH_INFO"), lfsp[PATH_MAX], nfsp[PATH_MAX]; char *requesturi=getenv("REQUEST_URI"), fn[PATH_MAX], mqs[128], scr[128]; char *scriptname=getenv("SCRIPT_NAME"); char *querystring=getenv("QUERY_STRING"); struct stat statbuf; int icons=0, symbolview=1, perline=5, curpos=0, line=0, cFiles=0, i, image; char *istr, *dstr; char *p; char *color[]={"e0e0e0", "f0f0f0"}; EXT *pext, ext[]={ {"ace", "tgz.gif", "ACE-Archiv"}, {"arj", "tgz.gif", "ARJ-Archiv"}, {"asf", "video.gif", "Videodatei"}, {"avi", "video.gif", "Videodatei"}, {"bmp", "image.gif", "Grafikdatei"}, {"c", "source.gif", "Quelltextdatei"}, {"cpp", "source.gif", "Quelltextdatei"}, {"doc", "document2.gif", "Word Dokument"}, {"eps", "vectorgfx.gif", "Postscriptdatei"}, {"exe", "binary.gif", "DOS/Windows ausführbare Datei"}, {"gif", "image.gif", "Grafikdatei"}, {"gz", "tgz.gif", "Komprimierte Datei"}, {"h", "source.gif", "Quelltextdatei"}, {"html", "html.gif", "Internetseite"}, {"ico", "image.gif", "Grafikdatei"}, {"jpg", "image.gif", "Grafikdatei"}, {"jpeg", "image.gif", "Grafikdatei"}, {"mp3", "sound.gif", "Audiodatei"}, {"mpeg", "video.gif", "Videodatei"}, {"mpg", "video.gif", "Videodatei"}, {"pas", "source.gif", "Quelltextdatei"}, {"pbm", "image.gif", "Grafikdatei"}, {"pcx", "image.gif", "Grafikdatei"}, {"pdf", "vectorgfx.gif", "PDF-Datei"}, {"pgm", "image.gif", "Grafikdatei"}, {"php", "html.gif", "PHP-Internetquelltextdatei"}, {"png", "image.gif", "Grafikdatei"}, {"pnm", "image.gif", "Grafikdatei"}, {"ppa", "document2.gif", "Powerpoint-Datei"}, {"pps", "document2.gif", "Powerpoint Präsentation"}, {"ps", "vectorgfx.gif", "Postscriptdatei"}, {"rar", "tgz.gif", "RAR-Archiv"}, {"shtml", "html.gif", "Internetseite mit SSI"}, {"tgz", "tgz.gif", "Komprimiertes TAR-Ball"}, {"tif", "image.gif", "Grafikdatei"}, {"tiff", "image.gif", "Grafikdatei"}, {"txt", "txt.gif", "Textdatei"}, {"wav", "sound.gif", "Audiodatei"}, {"xls", "document2.gif", "Excel Dokument"}, {"zip", "tgz.gif", "ZIP-Archiv"}, {"", NULL, "NULL"}}; /* char *icon[]={"applix.gif", "binary.gif", "document2.gif", "folder.gif", "html.gif", "image.gif", "mime_empty.gif", "sound.gif", "source.gif", "source_c.gif", "txt.gif", "tgz.gif", "unknown.gif", "vectorgfx.gif", "video.gif"},*/ strcpy(lfsp, requesturi); p=strrchr(lfsp, '?'); if (!p) p=lfsp+strlen(lfsp); if (p[-1]!='/') { *p='\0'; printf("Location: http://%s:%s%s/\n\n", getenv("SERVER_NAME"), getenv("SERVER_PORT"), lfsp); return 0; } printf("Content-type: text/html\n\n"); if (!pathinfo || !requesturi) { pathinfo=""; requesturi=""; } /* 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"); /* printf("%s
\n", lfsp);*/ /* p=strstr(lfsp, "/cgi-bin/"); if (!*p) return -1; *p='\0';*/ if (pathinfo[1]!='~') { strcpy(nfsp, USER); } else { *nfsp='\0'; strcpy(pathinfo, strstr(pathinfo+1, "/")); } strcat(lfsp, pathinfo); strcat(nfsp, pathinfo); if (pathinfo[strlen(pathinfo)-1]!='/') strcat(pathinfo, "/"); #if 0 printf("Content-type: text/html\n\n
"); fflush(stdout); printf("%s
\n", lfsp); printf("%s
\n", nfsp); printf("%s
\n", pathinfo); printf("%s
\n", requesturi); printf("%s
\n", getenv("SERVER_NAME")); printf("%d %s
\n", strlen(querystring), querystring); return 0; #endif if (!strcmp(querystring, "noicons")) symbolview=0; if (chdir(lfsp)) return -1; dir=opendir("."); if (!dir) return -1; istr=NULL; while ((d=readdir(dir))) { if (!strncmp(d->d_name, "index.htm", 9)) { printf("", nfsp, d->d_name); closedir(dir); return 0; } else if (!strcmp(d->d_name, ".icons")) { if (stat(d->d_name, &statbuf)) continue; if (S_ISDIR(statbuf.st_mode)) icons=1; } else if (d->d_name[0]=='.' && (d->d_name[1]!='.')) continue; else { if (stat(d->d_name, &statbuf)) continue; neu=malloc(sizeof(FL)+strlen(d->d_name)+(S_ISDIR(statbuf.st_mode)?1:0)); neu->next=anker; strcpy(neu->fn, d->d_name); if (S_ISDIR(statbuf.st_mode)) strcat(neu->fn, "/"); neu->mode=statbuf.st_mode; neu->fs=statbuf.st_size; anker=neu; cFiles++; } } closedir(dir); if (!cFiles) { printf("Keine Bilder im Verzeichnis %s.", nfsp); return 0; } field=malloc(cFiles*sizeof(FL*)); neu=anker; for (i=0, pfield=field, neu=anker; inext; } qsort(field, cFiles, sizeof(FL*), cmp); printf("\n" "\n" " \n" " Inhalt des Verzeichnisses \"%s\"\n" "\n" "\n" "

Inhalt des Verzeichnisses \"%s\"

\n" "
\n" " Darstellung mit Voransicht\n" "
\n", nfsp, nfsp, symbolview?"checked ":"", symbolview?"?noicons":".", symbolview?"?noicons":"."); if (!symbolview) { printf("\n" "\n" " \n" " \n" " \n" " \n" ""); } else { printf("
\n" "
 NameGrößeKommentar
\n"); } for (i=0, pfield=field, image=0; imode)) { istr="folder.gif"; dstr="Verzeichnis"; } else { p=strrchr((*pfield)->fn, '.'); if (p) { p++; pext=ext; while (pext->ico) { if (!strcasecmp(pext->ext, p)) { istr=(char*)pext->ico; dstr=(char*)pext->desc; image++; break; } pext++; } } } if (symbolview && icons && S_ISREG((*pfield)->mode)) { sprintf(fn, "%s.icons/%s", lfsp, (*pfield)->fn); if (!stat(fn, &statbuf)) { sprintf(fn, "%s.icons/%s", nfsp, (*pfield)->fn); istr=fn; dstr="Grafik"; } else if (istr) { sprintf(fn, USER"/cgi-bin/mkicon.cgi%s%s", requesturi, (*pfield)->fn); istr=fn; } } if (!istr) istr="unknown.gif"; if (!dstr) dstr="Unbekannter Typ"; if (S_ISDIR((*pfield)->mode)) sprintf(mqs, "%s%s", *querystring?"?":"", querystring); else if (!strncmp(dstr, "Grafik", 6)) sprintf(mqs, "?Nr=%d", image); else strcpy(mqs, (*pfield)->fn); if (S_ISDIR((*pfield)->mode)) strcpy(scr, scriptname); else if (!strncmp(dstr, "Grafik", 6)) strcpy(scr, USER"/cgi-bin/slide.cgi"); else strcpy(scr, USER); if (!symbolview) { printf("\n", color[line%2]); printf(" \n", #if 0 S_ISDIR((*pfield)->mode)?scriptname:USER"/cgi-bin/slide.cgi", #endif scr, pathinfo, S_ISDIR((*pfield)->mode)?(*pfield)->fn:"", mqs, istr, dstr); printf(" \n", scr, pathinfo, S_ISDIR((*pfield)->mode)?(*pfield)->fn:"", mqs, (*pfield)->fn); printf(" \n", (*pfield)->fs); printf(" \n", dstr); printf("\n"); line++; } else { #if 0 printf("%s %s %s %s %s
\n", (*pfield)->fn, istr, dstr, scr, requesturi); #endif if (!(curpos%perline)) printf("\n"); printf(" \n", 100/perline, scr, requesturi, S_ISDIR((*pfield)->mode)?(*pfield)->fn:"", mqs, *istr=='/'?"":THUM"/", istr, dstr, (*pfield)->fn); if (curpos%perline==4) printf("\n"); curpos++; } } if (symbolview) { while (curpos++%5) { printf(" \n", 160); } printf("\n"); } printf("
" "\"%s\"%s%lu%s
" "\"%s\"
%s
%c
\n"); closedir(dir); return 0; }