#include <stdio.h>
#include <strings.h>
#include <stdlib.h>

/* Kompilieren:
   gcc  -Wall -pedantic -pipe -O5 -o err404 err404.c; strip err404
*/   

/* Hier Pfade anpassen: */
#define MAIL            "/path/to/sendmail"         
#define EDITORS         "/path/to/notfound.editors"
/* EMail des Webmasters: */
#define W3ADMIN         "www@heise.de"


#define ICON            "\"/icons/fratze.gif\""
#define HOMEBUTTON      "\"/icons/buttons/home.gif\""

int mail2admin(char* url, char* link)
{ FILE *pipe, *fp;  
  char *buff, *email;
  int found=0;  if (!url||!link ) return -1;
  buff =(char*)malloc(1024);
  email=(char*)malloc(1024);
  if (!!(fp=fopen(EDITORS,"r")))
  { for (;!found;)
    { if (!fgets(buff,1000,fp)) break;
      if (*buff=='#' ||!strchr(buff,'\t')) continue;
      strcpy(email,strrchr(buff,'\t')+1);
      *strchr(buff,'\t')='\0';;           
      if (strstr(url,buff)) found++; 
    } 
    fclose(fp); 
  }
  sprintf(buff,"%s -f %s %s",MAIL,W3ADMIN,found?email:W3ADMIN);
  pipe=popen(buff,"w");
  fprintf(pipe,"Subject: Missing link  ;-))\n");
  fprintf(pipe,"Reply-to: %s\n",W3ADMIN);
  fprintf(pipe,"Full-name: Web-Server\n\n");
  fprintf(pipe,"Moin,\n\nDer Host *%s* hat soeben die Seite\n%s	aufgerufen.\n\n"
          ,getenv("REMOTE_HOST")?getenv("REMOTE_HOST"):""
          ,url);
  fprintf(pipe,"Auf dieser ist ein Link oder Bild auf ");
  fprintf(pipe,"%s referenziert,\nden es nicht gibt.\n",link);
  fprintf(pipe,"\n\nMit freundlichen Gruessen\n\nDer Server.\n\n");
  if (getenv("HTTP_USER_AGENT"))
  { fprintf(pipe,"PS. Browser: %s",getenv("HTTP_USER_AGENT"));
  }
  pclose(pipe); 
  free(buff); 
  free(email); 
  return 0; 
}



int main(void)
{ char link[1024];
  puts("Content-type: text/html\n");
  puts("<HTML><HEAD><TITLE>Fehlermeldung</TITLE></HEAD>");
  printf("<BODY><IMG align=left %s><IMG align=right %s>",ICON,ICON);
  printf("<CENTER><H1 ALIGN=CENTER> Fehlermeldung</H1><HR><H2>");
  printf("Sie haben versucht, die Seite &#146;%s&#146; aufzurufen, die es auf diesem"
         ,getenv("PATH_INFO")?getenv("PATH_INFO"):"");
  printf(" <A HREF=\"/\">Server</A> nicht gibt.</H2><HR></CENTER>");
  if (getenv("HTTP_REFERER"))       /* gibt es eine Aufruferseite? */
  { strncpy(link,getenv("HTTP_REFERER"),1023);
    if (!link)               /* Bookmark oder Handeingabe */
    { puts("<H3>Bitte &uuml;berpr&uuml;fen Sie:</H3><H4><UL><LI>die Schreibweise des URL (Gro&szlig;/Kleinschreibung beachten!)\n<LI>Ihren Bookmark-File</UL>");
    }  
    else 
    { if (strstr(link,getenv("SERVER_NAME")))   /* eigener Fehler */
      { mail2admin(link,getenv("PATH_INFO"));
        puts("<H3>Sorry, ein Fehler auf unserem Server.");
        printf(" EMail an <A HREF=\"%s\">W3-Admin</A> abgeschickt.</H3>",W3ADMIN); 
      }
      else  
      { printf("Der falsche Link steht auf der Seite <A HREF=\"%s\">%s</A>",link,link);
      }
    }
  }
  printf("</H4><A HREF=\"/\"><IMG SRC=%s BORDER=0 ALT=Heise></A></BODY></HTML>",HOMEBUTTON); 
  return 0;
}
