/* * Set StartTime and clockTime to the current time. * These are used for computing what time it really is right now. * Note that clockTime is a unix wallclock time converted to minutes. */ static void set_time(int initialize) { #ifdef CRON_LOCALTIME struct tm tm; static int isdst; StartTime = time(NULL); /* We adjust the time to GMT so we can catch DST changes. */ tm = *localtime(&StartTime); if (initialize || tm.tm_isdst != isdst) { isdst = tm.tm_isdst; GMToff = get_gmtoff(&StartTime, &tm); Debug(DSCH, ("[%ld] GMToff=%ld\n", (long)getpid(), (long)GMToff)); } #else StartTime = time(NULL); #endif clockTime = (StartTime + GMToff) / (time_t)SECONDS_PER_MINUTE; }
static void PyInit_timezone(PyObject *m) { /* This code moved from PyInit_time wholesale to allow calling it from time_tzset. In the future, some parts of it can be moved back (for platforms that don't HAVE_WORKING_TZSET, when we know what they are), and the extraneous calls to tzset(3) should be removed. I haven't done this yet, as I don't want to change this code as little as possible when introducing the time.tzset and time.tzsetwall methods. This should simply be a method of doing the following once, at the top of this function and removing the call to tzset() from time_tzset(): #ifdef HAVE_TZSET tzset() #endif And I'm lazy and hate C so nyer. */ #if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__) PyObject *otz0, *otz1; tzset(); PyModule_AddIntConstant(m, "timezone", timezone); #ifdef HAVE_ALTZONE PyModule_AddIntConstant(m, "altzone", altzone); #else PyModule_AddIntConstant(m, "altzone", timezone-3600); #endif PyModule_AddIntConstant(m, "daylight", daylight); otz0 = PyUnicode_DecodeLocale(tzname[0], "surrogateescape"); otz1 = PyUnicode_DecodeLocale(tzname[1], "surrogateescape"); PyModule_AddObject(m, "tzname", Py_BuildValue("(NN)", otz0, otz1)); #else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/ { #define YEAR ((time_t)((365 * 24 + 6) * 3600)) time_t t; struct tm p; long janzone, julyzone; char janname[10], julyname[10]; t = (time((time_t *)0) / YEAR) * YEAR; _PyTime_localtime(t, &p); get_zone(janname, 9, &p); janzone = -get_gmtoff(t, &p); janname[9] = '\0'; t += YEAR/2; _PyTime_localtime(t, &p); get_zone(julyname, 9, &p); julyzone = -get_gmtoff(t, &p); julyname[9] = '\0'; if( janzone < julyzone ) { /* DST is reversed in the southern hemisphere */ PyModule_AddIntConstant(m, "timezone", julyzone); PyModule_AddIntConstant(m, "altzone", janzone); PyModule_AddIntConstant(m, "daylight", janzone != julyzone); PyModule_AddObject(m, "tzname", Py_BuildValue("(zz)", julyname, janname)); } else { PyModule_AddIntConstant(m, "timezone", janzone); PyModule_AddIntConstant(m, "altzone", julyzone); PyModule_AddIntConstant(m, "daylight", janzone != julyzone); PyModule_AddObject(m, "tzname", Py_BuildValue("(zz)", janname, julyname)); } } #ifdef __CYGWIN__ tzset(); PyModule_AddIntConstant(m, "timezone", _timezone); PyModule_AddIntConstant(m, "altzone", _timezone-3600); PyModule_AddIntConstant(m, "daylight", _daylight); PyModule_AddObject(m, "tzname", Py_BuildValue("(zz)", _tzname[0], _tzname[1])); #endif /* __CYGWIN__ */ #endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/ }
void log(int i, int coSe, int result) { unsigned char *reAddress; int bytesOutput; int bytesInput; /* Bit of borrowing from Apache logging module here, thanks folks */ int timz; struct tm *t; char tstr[1024]; char sign; if (!log) { return; } t = get_gmtoff(&timz); sign = (timz < 0 ? '-' : '+'); if (timz < 0) { timz = -timz; } strftime(tstr, sizeof(tstr), "%d/%b/%Y:%H:%M:%S ", t); if (i != -1) { reAddress = reAddresses + i * 4; bytesOutput = coBytesOutput[i]; bytesInput = coBytesInput[i]; } else { reAddress = nullAddress; bytesOutput = 0; bytesInput = 0; } if (logFile) { if (logFormatCommon) { /* Fake a common log format log file in a way that most web analyzers can do something interesting with. We lie and say the protocol is HTTP because we don't want the web analyzer to reject the line. We also lie and claim success (code 200) because we don't want the web analyzer to ignore the line as an error and not analyze the "URL." We put a result message into our "URL" instead. The last field is an extra, giving the number of input bytes, after several placeholders meant to fill the positions frequently occupied by user agent, referrer, and server name information. */ fprintf(logFile, "%d.%d.%d.%d - - " "[%s %c%.2d%.2d] " "\"GET /rinetd-services/%s/%d/%s/%d/%s HTTP/1.0\" " "200 %d - - - %d\n", reAddress[0], reAddress[1], reAddress[2], reAddress[3], tstr, sign, timz / 60, timz % 60, seFromHosts[coSe], seFromPorts[coSe], seToHosts[coSe], seToPorts[coSe], logMessages[result], bytesOutput, bytesInput); } else { /* Write an rinetd-specific log entry with a less goofy format. */ fprintf(logFile, "%s\t%d.%d.%d.%d\t%s\t%d\t%s\t%d\t%d" "\t%d\t%s\n", tstr, reAddress[0], reAddress[1], reAddress[2], reAddress[3], seFromHosts[coSe], seFromPorts[coSe], seToHosts[coSe], seToPorts[coSe], bytesInput, bytesOutput, logMessages[result]); } } }
static void logEvent(ConnectionInfo const *cnx, ServerInfo const *srv, int result) { /* Bit of borrowing from Apache logging module here, thanks folks */ int timz; char tstr[1024]; struct tm *t = get_gmtoff(&timz); char sign = (timz < 0 ? '-' : '+'); if (timz < 0) { timz = -timz; } strftime(tstr, sizeof(tstr), "%d/%b/%Y:%H:%M:%S ", t); char const *addressText = "?"; int bytesOutput = 0; int bytesInput = 0; if (cnx != NULL) { struct in_addr const *reAddress = &cnx->reAddresses; addressText = inet_ntoa(*reAddress); bytesOutput = cnx->remote.sentBytes; bytesInput = cnx->remote.recvBytes; } char const *fromHost = "?"; int fromPort = 0; char const *toHost = "?"; int toPort = 0; if (srv != NULL) { fromHost = srv->fromHost; fromPort = srv->fromPort; toHost = srv->toHost; toPort = srv->toPort; } if (result==logNotAllowed || result==logDenied) syslog(LOG_INFO, "%s %s" , addressText , logMessages[result]); if (logFile) { if (logFormatCommon) { /* Fake a common log format log file in a way that most web analyzers can do something interesting with. We lie and say the protocol is HTTP because we don't want the web analyzer to reject the line. We also lie and claim success (code 200) because we don't want the web analyzer to ignore the line as an error and not analyze the "URL." We put a result message into our "URL" instead. The last field is an extra, giving the number of input bytes, after several placeholders meant to fill the positions frequently occupied by user agent, referrer, and server name information. */ fprintf(logFile, "%s - - " "[%s %c%.2d%.2d] " "\"GET /rinetd-services/%s/%d/%s/%d/%s HTTP/1.0\" " "200 %d - - - %d\n", addressText, tstr, sign, timz / 60, timz % 60, fromHost, fromPort, toHost, toPort, logMessages[result], bytesOutput, bytesInput); } else { /* Write an rinetd-specific log entry with a less goofy format. */ fprintf(logFile, "%s\t%s\t%s\t%d\t%s\t%d\t%d" "\t%d\t%s\n", tstr, addressText, fromHost, fromPort, toHost, toPort, bytesInput, bytesOutput, logMessages[result]); } } }