e70152e44cc66cc599ff6b699eb8adc07f3e656a
kent
  Sat May 24 21:09:34 2014 -0700
Adding Copyright NNNN Regents of the University of California to all files I believe with reasonable certainty were developed under UCSC employ or as part of Genome Browser copyright assignment.
diff --git src/hg/lib/cgiApoptosis.c src/hg/lib/cgiApoptosis.c
index 0e6b203..0cdcf33 100644
--- src/hg/lib/cgiApoptosis.c
+++ src/hg/lib/cgiApoptosis.c
@@ -1,132 +1,135 @@
 /* functions to auto-kill CGIs after a certain amount of time has passed */
 
+/* Copyright (C) 2014 The Regents of the University of California 
+ * See README in this or parent directory for licensing information. */
+
 #include <utime.h>
 #include <signal.h>
 #include "htmlPage.h"
 #include "hgConfig.h"
 #include "sqlNum.h"
 #include "jksql.h"
 #include "hdb.h"
 #include "portable.h"
 #include "cheapcgi.h"
 
 static unsigned long expireSeconds = 0;
 static boolean lazarus = FALSE;
 
 void lazarusLives(unsigned long newExpireSeconds)
 /* Long running process requests more time */
 {
 lazarus = TRUE;
 expireSeconds = newExpireSeconds;
 }
 
 static void cgiApoptosisHandler(int status)
 /* signal handler for SIGALRM for CGI expiration */
 {
 (void)(status); // skip gcc warning "unused variable"
 if (lazarus)
     {
     (void) alarm(expireSeconds);    /* CGI timeout */
     lazarus = FALSE;
     return;
     }
 if (expireSeconds > 0)
     {
     /* want to see this error message in the apache error_log also */
     fprintf(stderr, "cgiApoptosis: %lu seconds\n", expireSeconds);
     /* most of our CGIs post a polite non-fatal message with this errAbort */
     errAbort("procedures have exceeded timeout: %lu seconds, function has ended.\n", expireSeconds);
     }
 exit(0);
 }
 
 void cgiApoptosisSetup()
 /* setting up cgi auto killing after x minutes. 
  * This must be called before any mysql connections have been setup, 
  * as otherwise the child thread will close all mysql connections for 
  * the parent. */
 {
 static boolean beenHere = FALSE;
 if (beenHere)  /* one at a time please */
     return;
 beenHere = TRUE;
 
 char *expireTime = cfgOptionDefault("browser.cgiExpireMinutes", "20");
 unsigned expireMinutes = sqlUnsigned(expireTime);
 expireSeconds = expireMinutes * 60;
 
 char trashFile[PATH_LEN];
 safef(trashFile, sizeof(trashFile), "%s/registration.txt", trashDir());
 
 /* trashFile does not exist during command line execution */
 if(fileExists(trashFile))	/* update access time for trashFile */
     {
     struct utimbuf ut;
     struct stat mystat;
     ZeroVar(&mystat);
     if (stat(trashFile,&mystat)==0)
 	{
 	ut.actime = clock1();
 	ut.modtime = mystat.st_mtime;
 	}
     else
 	{
 	ut.actime = ut.modtime = clock1();
 	}
     (void) utime(trashFile, &ut);
     if (expireSeconds > 0)
 	{
 	(void) signal(SIGALRM, cgiApoptosisHandler);
 	(void) alarm(expireSeconds);	/* CGI timeout */
 	}
     return;
     }
 
 char *scriptName = cgiScriptName();
 char *ip = getenv("SERVER_ADDR");
 if (scriptName && ip)  /* will not be true from command line execution */
     {
     FILE *f = fopen(trashFile, "w");
     if (f)		/* rigamarole only if we can get a trash file */
 	{
 	time_t now = time(NULL);
 	char *localTime;
 	extern char *tzname[2];
 	struct tm *tm = localtime(&now);
 	localTime = sqlUnixTimeToDate(&now,FALSE); /* FALSE == localtime */
 	fprintf(f, "%s, %s, %s %s, %s\n", scriptName, ip, localTime,
 	    tm->tm_isdst ? tzname[1] : tzname[0], trashFile);
 	fclose(f);
 
 	chmod(trashFile, 0666);
 	pid_t pid0 = fork();
 	if (0 == pid0)	/* in child */
 	    {
 	    close(STDOUT_FILENO); /* do not hang up Apache finish for parent, but apache will still wait */
 	    expireSeconds = 0;	/* no error message from this exit */
 	    (void) signal(SIGALRM, cgiApoptosisHandler);
 	    (void) alarm(6);	/* timeout here in 6 seconds */
 #include "versionInfo.h"
 	    char url[1024];
             char *browserName = "browser.v";
             if (hIsBrowserbox())
                 browserName = "browserbox.v";
 
 	    safef(url, sizeof(url), "%s%s%s%s%s%s%s", "http://",
 	"genomewiki.", "ucsc.edu/", "cgi-bin/useCount?", "version=", browserName,
 		CGI_VERSION);
 
 	    /* 6 second alarm will exit this page fetch if it does not work */
 	    (void) htmlPageGetWithCookies(url, NULL); /* ignore return */
 
             exit(0);
             }	/* child of fork has done exit(0) normally or via alarm */
 	}		/* trash file open OK */
     if (expireSeconds > 0)
 	{
 	(void) signal(SIGALRM, cgiApoptosisHandler);
 	(void) alarm(expireSeconds);	/* CGI timeout */
 	}
     }			/* an actual CGI binary */
 }			/* phoneHome()	*/