void checkOneDependency(struct joiner *joiner, struct joinerDependency *dep, struct sqlConnection *conn, char *dbName) /* Check out one dependency in one database. */ { char *tableToCheck = dep->table->table; if (sqlWildcardIn(tableToCheck)) { errAbort("Can't handle wildCards in dependency tables line %d of %s", dep->lineIx, joiner->fileName); } if (slNameInList(dep->table->dbList, dbName) && sqlTableExists(conn, tableToCheck)) { time_t tableTime = sqlTableUpdateTime(conn, tableToCheck); struct joinerTable *dependsOn; for (dependsOn = dep->dependsOnList; dependsOn != NULL; dependsOn = dependsOn->next) { if (slNameInList(dependsOn->dbList, dbName)) { if (!sqlTableExists(conn, dependsOn->table)) { warn("Error: %s.%s doesn't exist line %d of %s", dbName, dependsOn->table, dep->lineIx, joiner->fileName); } else { time_t depTime = sqlTableUpdateTime(conn, dependsOn->table); if (depTime > tableTime) { char *depStr = sqlUnixTimeToDate(&depTime, FALSE); char *tableStr = sqlUnixTimeToDate(&tableTime, FALSE); warn("Error: %s.%s updated after %s.%s line %d of %s", dbName, dependsOn->table, dbName, tableToCheck, dep->lineIx, joiner->fileName); warn("\t%s vs. %s", depStr, tableStr); freeMem(depStr); freeMem(tableStr); } } } } } }
static void phoneHome() { 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, cgiApoptosis); (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 */ expireSeconds = 0; /* no error message from this exit */ (void) signal(SIGALRM, cgiApoptosis); (void) alarm(6); /* timeout here in 6 seconds */ #include "versionInfo.h" char url[1024]; safef(url, sizeof(url), "%s%s%s%s%s%s", "http://", "genomewiki.", "ucsc.edu/", "cgi-bin/useCount?", "version=browser.v", 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, cgiApoptosis); (void) alarm(expireSeconds); /* CGI timeout */ } } /* an actual CGI binary */ } /* phoneHome() */