/* +----------------------------------------------------------------------+ | Zend OPcache | +----------------------------------------------------------------------+ | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ | This source file is subject to the Modified BSD License that is | | bundled with this package in the file LICENSE, and is available | | through the World Wide Web at . | | | | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | | Stanislav Malyshev | | Dmitry Stogov | +----------------------------------------------------------------------+ */ #include #include #include #include #ifdef ZEND_WIN32 # include #endif #include "ZendAccelerator.h" static void zend_accel_error_va_args(int type, const char *format, va_list args) { time_t timestamp; char *time_string; FILE * fLog = NULL; if (type <= ZCG(accel_directives).log_verbosity_level) { timestamp = time(NULL); time_string = asctime(localtime(×tamp)); time_string[24] = 0; if (!ZCG(accel_directives).error_log || !*ZCG(accel_directives).error_log || strcmp(ZCG(accel_directives).error_log, "stderr") == 0) { fLog = stderr; } else { fLog = fopen(ZCG(accel_directives).error_log, "a"); if (!fLog) { fLog = stderr; } } #ifdef ZTS fprintf(fLog, "%s (" ZEND_ULONG_FMT "): ", time_string, (zend_ulong)tsrm_thread_id()); #else fprintf(fLog, "%s (%d): ", time_string, getpid()); #endif switch (type) { case ACCEL_LOG_FATAL: fprintf(fLog, "Fatal Error "); break; case ACCEL_LOG_ERROR: fprintf(fLog, "Error "); break; case ACCEL_LOG_WARNING: fprintf(fLog, "Warning "); break; case ACCEL_LOG_INFO: fprintf(fLog, "Message "); break; case ACCEL_LOG_DEBUG: fprintf(fLog, "Debug "); break; } vfprintf(fLog, format, args); fprintf(fLog, "\n"); fflush(fLog); if (fLog != stderr) { fclose(fLog); } } /* perform error handling even without logging the error */ switch (type) { case ACCEL_LOG_ERROR: zend_bailout(); break; case ACCEL_LOG_FATAL: exit(-2); break; } } void zend_accel_error(int type, const char *format, ...) { va_list args; va_start(args, format); zend_accel_error_va_args(type, format, args); va_end(args); } ZEND_NORETURN void zend_accel_error_noreturn(int type, const char *format, ...) { va_list args; va_start(args, format); ZEND_ASSERT(type == ACCEL_LOG_FATAL || type == ACCEL_LOG_ERROR); zend_accel_error_va_args(type, format, args); va_end(args); /* Should never reach this. */ abort(); }