   see also http://hplyot.obspm.fr/~dl/wwwtools.html

diff -urN httpd_1.4.1/README.more_log httpd_1.4.1_dl/README.more_log
--- httpd_1.4.1/README.more_log	Thu Jan  1 01:00:00 1970
+++ httpd_1.4.1_dl/README.more_log	Mon May 29 03:40:20 1995
@@ -0,0 +1,25 @@
+
+ Hi, This patch originally allowed to add to the NCSA httpd 1.3 log file 
+ the "Referer" and/or "User-Agent" fields. (This allow you to track
+ down user agent statistics and where your pages are refered (and to
+ send correction in case of errors,...)).
+
+ These features have been added to regular 1.4, but using separate
+ unsynched files, so i ported my previous 1.3 patch to keep the same
+ features for 1.4
+
+ This patches now applies to v1.4.1 (apache version might come
+ if ppl are interested). Latest version and infos on
+ http://hplyot.obspm.fr/~dl/wwwtools.html
+
+ Regards,
+ May 29th 1995 - dl
+
+ Note : using -DLOG_USER_AGENT and -DLOG_REFERER *replace* the ncsa 1.4
+ logging by mine. (ie no more separate log files)
+
+ Ps : mail me (dl@hplyot.obspm.fr) for comments, suggestions,... 
+ also If you make scripts to exploit these new data.
+
+--
+ <A HREF="http://hplyot.obspm.fr/~dl/">Laurent Demailly</A>
diff -urN httpd_1.4.1/cgi-bin/test-cgi.tcl httpd_1.4.1_dl/cgi-bin/test-cgi.tcl
--- httpd_1.4.1/cgi-bin/test-cgi.tcl	Thu May 18 06:00:14 1995
+++ httpd_1.4.1_dl/cgi-bin/test-cgi.tcl	Mon May 29 03:25:15 1995
@@ -3,7 +3,9 @@
 # robert.bagwill@nist.gov, no warranty, no rights reserved
 # print out command line args, stdin, and environment variables
 #
-# some fixes by dl@hplyot.obspm.fr - v1.1 - Apr 11 1995
+# some fixes by dl@hplyot.obspm.fr - v1.2 - May 20 1995
+#
+# better get test-cgi2.tcl from http://hplyot.obspm.fr/~dl/wwwtools.html
 #
 set envvars {SERVER_SOFTWARE SERVER_NAME GATEWAY_INTERFACE SERVER_PROTOCOL SERVER_PORT REQUEST_METHOD PATH_INFO PATH_TRANSLATED SCRIPT_NAME QUERY_STRING REMOTE_HOST REMOTE_ADDR REMOTE_USER AUTH_TYPE CONTENT_TYPE CONTENT_LENGTH HTTP_ACCEPT HTTP_REFERER HTTP_USER_AGENT}
 
@@ -42,7 +44,6 @@
 foreach var $envvars {
 	if {[info exists env($var)]} {
 		puts "<DT>$var<DD>$env($var)"
-		}
 	}
 }
 puts "</DL>"
diff -urN httpd_1.4.1/src/Makefile httpd_1.4.1_dl/src/Makefile
--- httpd_1.4.1/src/Makefile	Thu May 18 06:31:59 1995
+++ httpd_1.4.1_dl/src/Makefile	Mon May 29 03:54:13 1995
@@ -19,7 +19,13 @@
 # If you want to ensure that CGI scripts can't mess with the log files,
 # use -DSECURE_LOGS
 #
-CFLAGS= -O2  -g -DNO_PASS
+
+# To add referer and/or user_agent infos to the main log, use :
+# -DLOG_REFERER -DLOG_USER_AGENT
+# ( instead of separated log file -- dl@hplyot.obspm.fr )
+CFLAGS= -O2 -DLOG_REFERER -DLOG_USER_AGENT
+
+#CFLAGS= -O2  -g -DNO_PASS
 #CFLAGS= -g -Wall -ansi -pedantic
 
 # Place here any extra libraries you may need to link to. You
@@ -44,9 +50,9 @@
 # AUX_CFLAGS= -DIRIX
 # EXTRA_LIBS= -lsun
 # For HP-UX
-# AUX_CFLAGS= -DHPUX
+AUX_CFLAGS= -DHPUX
 # For AIX
- AUX_CFLAGS= -DAIX -U__STR__
+# AUX_CFLAGS= -DAIX -U__STR__
 # For Ultrix
 # AUX_CFLAGS= -DULTRIX
 # For DEC OSF/1
diff -urN httpd_1.4.1/src/http_config.c httpd_1.4.1_dl/src/http_config.c
--- httpd_1.4.1/src/http_config.c	Thu May 18 06:11:34 1995
+++ httpd_1.4.1_dl/src/http_config.c	Sun May 28 23:34:22 1995
@@ -30,8 +30,12 @@
 char server_root[MAX_STRING_LEN];
 char error_fname[MAX_STRING_LEN];
 char xfer_fname[MAX_STRING_LEN];
+#ifndef LOG_USER_AGENT
 char agent_fname[MAX_STRING_LEN];
+#endif
+#ifndef LOG_REFERER
 char referer_fname[MAX_STRING_LEN];
+#endif
 char referer_ignore[MAX_STRING_LEN];
 char pid_fname[MAX_STRING_LEN];
 char server_admin[MAX_STRING_LEN];
@@ -68,8 +72,12 @@
     /* ServerRoot set in httpd.c */
     make_full_path(server_root,DEFAULT_ERRORLOG,error_fname);
     make_full_path(server_root,DEFAULT_XFERLOG,xfer_fname);
+#ifndef LOG_USER_AGENT
     make_full_path(server_root,DEFAULT_AGENTLOG,agent_fname);
+#endif
+#ifndef LOG_REFERER
     make_full_path(server_root,DEFAULT_REFERERLOG,referer_fname);
+#endif
     make_full_path(server_root,DEFAULT_PIDLOG,pid_fname);
     strcpy(referer_ignore,DEFAULT_REFERERIGNORE);
     strcpy(server_admin,DEFAULT_ADMIN);
@@ -143,8 +151,12 @@
                 strcpy(server_root,w);
 	      make_full_path(server_root,DEFAULT_ERRORLOG,error_fname);
 	      make_full_path(server_root,DEFAULT_XFERLOG,xfer_fname);
+#ifndef LOG_USER_AGENT
 	      make_full_path(server_root,DEFAULT_AGENTLOG,agent_fname);
+#endif
+#ifndef LOG_REFERER
 	      make_full_path(server_root,DEFAULT_REFERERLOG,referer_fname);
+#endif
 	      make_full_path(server_root,DEFAULT_PIDLOG,pid_fname);
 	      make_full_path(server_root,RESOURCE_CONFIG_FILE,srm_confname);
 	      make_full_path(server_root,ACCESS_CONFIG_FILE,access_confname);
@@ -165,15 +177,19 @@
             }
             else if(!strcasecmp(w,"AgentLog")) {
                 cfg_getword(w,l);
+#ifndef LOG_USER_AGENT
                 if(w[0] != '/')
                     make_full_path(server_root,w,agent_fname);
                 else strcpy(agent_fname,w);
+#endif
             }
             else if(!strcasecmp(w,"RefererLog")) {
                 cfg_getword(w,l);
+#ifndef LOG_REFERER
                 if(w[0] != '/')
                     make_full_path(server_root,w,referer_fname);
                 else strcpy(referer_fname,w);
+#endif
             }
             else if(!strcasecmp(w,"RefererIgnore")) {
                 cfg_getword(w,l);
diff -urN httpd_1.4.1/src/http_log.c httpd_1.4.1_dl/src/http_log.c
--- httpd_1.4.1/src/http_log.c	Thu May 18 06:00:22 1995
+++ httpd_1.4.1_dl/src/http_log.c	Sun May 28 23:34:22 1995
@@ -51,13 +51,18 @@
 static int xfer_log;
 static int xfer_flags = ( O_WRONLY | O_APPEND | O_CREAT );
 static mode_t xfer_mode = ( S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH );
+#ifndef LOG_USER_AGENT
 FILE *agent_log;
+#endif
+#ifdef LOG_REFERER
+extern char referer_ignore[MAX_STRING_LEN];
+#else
 FILE *referer_log;
+#endif
 int ErrorStat=0;
 ErrorMessage Errors[NUM_ERRORS];
 int numErrorsDefined=0;
 extern int servernum;
-extern char referer[];
 extern char *save_name;
 
 void open_logs() {
@@ -74,41 +79,50 @@
         perror("open");
         exit(1);
     }
+#ifndef LOG_USER_AGENT
     if(!(agent_log = fopen(agent_fname,"a"))) {
         fprintf(stderr,"httpd: could not open agent log file %s.\n",
                 agent_fname);
         perror("fopen");
         exit(1);
     }
+#endif
+#ifndef LOG_REFERER
     if(!(referer_log = fopen(referer_fname,"a"))) {
         fprintf(stderr,"httpd: could not open referer log file %s.\n",
                 referer_fname);
         perror("fopen");
         exit(1);
     }
+#endif
    
 #ifdef SECURE_LOGS
     /* set close-on-exec flag so CGI's cannot get to logs */
     flags = fcntl(xfer_log, F_GETFD);
     flags |= FD_CLOEXEC;
     fcntl(xfer_log, F_SETFD, flags);
+#ifndef LOG_USER_AGENT
     flags = fcntl(fileno(agent_log), F_GETFD);
     flags |= FD_CLOEXEC;
     fcntl(fileno(agent_log), F_SETFD, flags);
+#endif
+#ifndef LOG_REFERER
     flags = fcntl(fileno(referer_log), F_GETFD);
     flags |= FD_CLOEXEC;
     fcntl(fileno(referer_log), F_SETFD, flags);
+#endif
 #endif /* SECURE_LOGS */
 }
 
 void close_logs() {
-    fflush(error_log);
-    fflush(agent_log);
-    fflush(referer_log);
     close(xfer_log);
     fclose(error_log);
+#ifndef LOG_USER_AGENT
     fclose(agent_log);
+#endif
+#ifndef LOG_REFERER
     fclose(referer_log);
+#endif
 }
 
 void error_log2stderr() {
@@ -162,9 +176,31 @@
         strcat(str,"- ");
 
     if(bytes_sent != -1)
-        sprintf(str,"%s%d\n",str,bytes_sent);
+        sprintf(str,"%s%d",str,bytes_sent);
     else
-        strcat(str,"-\n");
+        strcat(str,"-");
+
+/* Add referer and/or user_agent infos to the main log   -- dl */
+#ifdef LOG_REFERER
+    if (referer[0] && 
+	  ( (referer_ignore[0]=='\0') || (!strstr(referer,referer_ignore)) ) ) 
+      sprintf(str,"%s \"%s\"",str,referer);
+    else
+      strcat(str," \"\"");
+#endif
+
+#ifdef LOG_USER_AGENT
+#ifndef LOG_REFERER
+    strcat(str," \"\"");  /* user_agent is always +2 (+1 for referer) */
+#endif
+    if (user_agent[0]) 
+      sprintf(str,"%s \"%s\"\n",str,user_agent);
+    else
+      strcat(str," \"\"\n");
+#else
+    strcat(str,"\n");
+#endif
+
 /*    sprintf(str,"%s SN:%d",str,servernum);
     fprintf(xfer_log,"%s\n",str);
     fflush(xfer_log); */
diff -urN httpd_1.4.1/src/http_mime.c httpd_1.4.1_dl/src/http_mime.c
--- httpd_1.4.1/src/http_mime.c	Thu May 18 06:00:23 1995
+++ httpd_1.4.1_dl/src/http_mime.c	Sun May 28 23:34:23 1995
@@ -53,10 +53,21 @@
 char *status_line = NULL;
 char ims[MAX_STRING_LEN]; /* If-modified-since */
 
+#ifndef LOG_USER_AGENT
 extern FILE *agent_log;
+#endif
+#ifndef LOG_REFERER
 extern FILE *referer_log;
+#endif
 extern char referer_ignore[MAX_STRING_LEN];
-char referer[HUGE_STRING_LEN];
+
+/* MAX_ is enough for Referer */
+char referer[MAX_STRING_LEN];
+/* if we use my logging method :  -- dl */
+#ifdef LOG_USER_AGENT
+char user_agent[MAX_STRING_LEN];
+#endif
+
 
 void hash_insert(struct mime_ext *me) {
     register int i = hash(me->ext[0]);
@@ -407,6 +418,10 @@
 
 void init_header_vars() 
 {
+/* To add user_agent infos to the log, we need :    -- dl */
+#ifdef LOG_USER_AGENT
+    user_agent[0] = '\0' ;
+#endif
     referer[0] = '\0';
     content_type[0] = '\0';
     last_modified[0] = '\0';
@@ -483,15 +498,26 @@
             continue;
         }
         if(!strcasecmp(w,"User-agent")) {
-            fprintf(agent_log, "%s\n", l);
-	    fflush(agent_log);
+#ifdef LOG_USER_AGENT
+	/* lets copy the user-agent (my method) */
+	  strcpy(user_agent,l);
+#else
+	/* NCSA's method : */
+	  fprintf(agent_log, "%s\n", l);
+	  fflush(agent_log);
+#endif
         }
         if(!strcasecmp(w,"Referer")) {
-	    strcpy(referer,l);
-	    if ((!strlen(referer_ignore)) || (!strstr(l,referer_ignore))){
-		fprintf(referer_log, "%s -> %s\n", l, url);
-		fflush(referer_log);
-	    }
+	  strcpy(referer,l);
+/* if not dl's method : */
+#ifndef LOG_REFERER
+	  /* NCSA's method : */
+/* in my method :(the referer_ignore test is done when logging (http_log.c)*/
+	  if ((!strlen(referer_ignore)) || (!strstr(l,referer_ignore))){
+	    fprintf(referer_log, "%s -> %s\n", l, url);
+	    fflush(referer_log);
+	  }
+#endif
         }
         if(!strcasecmp(w,"If-modified-since"))
             strcpy(ims,l);
diff -urN httpd_1.4.1/src/http_request.c httpd_1.4.1_dl/src/http_request.c
--- httpd_1.4.1/src/http_request.c	Thu May 18 06:12:08 1995
+++ httpd_1.4.1_dl/src/http_request.c	Mon May 29 04:23:35 1995
@@ -65,7 +65,7 @@
 /*      if (remote_ip) free(remote_ip); */
       if (remote_name) {
 	free(remote_name);
-	remote_host = NULL;
+	remote_name = NULL; /* fix From: Eric Mumpower (nocturne@mit.edu)  */
       }
 #if defined(NeXT) || defined(__mc68000__)
       longjmp(jmpbuffer,1);
diff -urN httpd_1.4.1/src/httpd.h httpd_1.4.1_dl/src/httpd.h
--- httpd_1.4.1/src/httpd.h	Thu May 18 06:55:31 1995
+++ httpd_1.4.1_dl/src/httpd.h	Mon May 29 03:32:02 1995
@@ -425,7 +425,7 @@
 
 /* ------------------------------ error types ------------------------------ */
 
-#define SERVER_VERSION "NCSA/1.4.1"
+#define SERVER_VERSION "NCSA/1.4.1+dl"
 #define SERVER_PROTOCOL "HTTP/1.0"
 #define SERVER_SUPPORT "httpd@void.ncsa.uiuc.edu"
 
@@ -566,8 +566,12 @@
 extern char annotation_server[MAX_STRING_LEN];  /* SSG 4/4/95 */
 extern char error_fname[MAX_STRING_LEN];
 extern char xfer_fname[MAX_STRING_LEN];
+#ifndef LOG_USER_AGENT
 extern char agent_fname[MAX_STRING_LEN];
+#endif
+#ifndef LOG_REFERER
 extern char referer_fname[MAX_STRING_LEN];
+#endif
 extern char pid_fname[MAX_STRING_LEN];
 extern char server_admin[MAX_STRING_LEN];
 extern char *server_hostname;
@@ -619,6 +623,11 @@
 
 /* MIME */
 extern char auth_line[MAX_STRING_LEN];
+/* To add referer and/or user_agent infos to the log, we need :    -- dl */
+extern char referer[MAX_STRING_LEN];
+#ifdef LOG_USER_AGENT
+extern char user_agent[MAX_STRING_LEN];
+#endif
 extern int content_length;
 extern char content_type[MAX_STRING_LEN];
 extern char content_encoding[MAX_STRING_LEN];
