-/* log.c \r
- Logging facilities for displaying information on screen, as well as\r
- (optional) storing it to a file and transmitting it over the network.\r
-\r
- Part of the swftools package.\r
- \r
- Copyright (c) 2001 Matthias Kramm <kramm@quiss.org> \r
-\r
- This file is distributed under the GPL, see file COPYING for details */\r
-\r
-#ifdef __NT__\r
-#include "stdafx.h"\r
-#include <string.h>\r
-#include <winsock2.h>\r
-#include <stdlib.h>\r
-#include <malloc.h>\r
-#if _MSC_VER > 1000\r
-#pragma once\r
-#endif // _MSC_VER > 1000\r
-#else\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <stdarg.h>\r
-#include <string.h>\r
-#include <unistd.h>\r
-#endif\r
-\r
-#include "log.h"\r
-\r
-#define LOGLEVEL_FATAL 0\r
-#define LOGLEVEL_ERROR 1\r
-#define LOGLEVEL_WARNING 2\r
-#define LOGLEVEL_NOTICE 3\r
-#define LOGLEVEL_VERBOSE 4\r
-#define LOGLEVEL_DEBUG 5\r
-\r
-int screenloglevel;\r
-int fileloglevel;\r
-int socketloglevel;\r
-FILE *logFile = 0;\r
-#ifdef __NT__\r
-SOCKET logSocket;\r
-#else\r
-int logSocket = 0;\r
-#endif\r
-\r
-char bLogToSock = 0;\r
-\r
-void initlogSocket(char* servAddr, char* logPort);\r
-\r
-void initLog(char* pLogName, int fileloglevel, char* servAddr, char* logPort, int serverlevel, int screenlevel)\r
-{\r
- screenloglevel = screenlevel;\r
- fileloglevel = fileloglevel;\r
- socketloglevel = screenlevel;\r
- logFile = NULL;\r
- bLogToSock = 0;\r
-\r
- if (pLogName && fileloglevel>=0)\r
- logFile = fopen(pLogName, "a+");\r
- bLogToSock = (servAddr && logPort && (serverlevel>=0));\r
- if(bLogToSock)\r
- initlogSocket(servAddr, logPort);\r
-}\r
-\r
-void initlogSocket(char* servAddr, char* logPort)\r
-{\r
-#ifndef __NT__\r
- bLogToSock = 0;\r
-#else\r
- // init winsock\r
- // check and prepare WinSock DLL\r
- WORD wVersionRequested = MAKEWORD( 2, 2 );\r
- WSADATA wsaData;\r
- if ( WSAStartup(wVersionRequested, &wsaData) != 0 )\r
- {\r
- bLogToSock = false;\r
- return;\r
- }\r
- // Confirm that the WinSock DLL supports 2.2.\r
- // Note that if the DLL supports versions greater\r
- // than 2.2 in addition to 2.2, it will still return\r
- // 2.2 in wVersion since that is the version we\r
- // requested.\r
-\r
- if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 )\r
- {\r
- bLogToSock = false;\r
- return;\r
- }\r
-\r
- struct hostent *hp;\r
- hp = gethostbyname(servAddr);\r
- if (hp == NULL) // we don't know who this host is\r
- {\r
- bLogToSock = false;\r
- return;\r
- }\r
-\r
- // connect socket\r
- sockaddr_in SocketAddress;\r
-\r
- memset(&SocketAddress, 0, sizeof(SocketAddress));\r
- memcpy((char*)&SocketAddress.sin_addr, hp->h_addr, hp->h_length); // set address\r
- SocketAddress.sin_family = hp->h_addrtype;\r
- SocketAddress.sin_port = htons((u_short)atoi(logPort));\r
-\r
- logSocket = socket(hp->h_addrtype, SOCK_STREAM, 0);\r
- if (logSocket == INVALID_SOCKET)\r
- {\r
- bLogToSock = false;\r
- return;\r
- }\r
-\r
- // try to connect to the specified socket\r
- if ( connect(logSocket, (struct sockaddr*)&SocketAddress, sizeof (SocketAddress)) == SOCKET_ERROR) {\r
- bLogToSock = false;\r
- return;\r
- }\r
- bLogToSock = true;\r
-#endif\r
-}\r
-\r
-void exitLog()\r
-{\r
- // close socket communication\r
- if(bLogToSock)\r
-#ifndef __NT__\r
- close(logSocket);\r
-#else\r
- closesocket(logSocket);\r
-#endif\r
- // close file\r
- if(logFile != NULL)\r
- fclose(logFile);\r
-}\r
-\r
-\r
-static char * logimportance[]= {"Fatal","Error","Warning","Notice","Verbose","Debug"};\r
-static int loglevels=6;\r
-static char * logimportance2[]= {" ","FATAL ","ERROR ","WARNING","NOTICE ","VERBOSE","DEBUG "};\r
-void log(char* logString)\r
-{\r
- char timebuffer[32];\r
- char* logBuffer;\r
- char dbuffer[9];\r
- char tbuffer[9];\r
- int level;\r
- char*lt;\r
- char*gt;\r
- int l;\r
-\r
- logBuffer = (char*)malloc (strlen(logString) + 24 + 15);\r
-#ifndef __NT__\r
- {\r
- /*time_t t = time(0);\r
- tm*t2 = localtime(t);\r
- strftime(dbuffer, 8, "%m %d", t2);\r
- strftime(tbuffer, 8, "%m %d", t2);\r
- dbuffer[0]=0; //FIXME\r
- tbuffer[0]=0;*/\r
- time_t t = time(0);\r
- char* a = ctime(&t);\r
- int l = strlen(a);\r
- while(a[l-1] == 13 || a[l-1] == 10)\r
- l--;\r
- a[l]=0;\r
- sprintf(timebuffer, "%s", a);\r
- }\r
-#else\r
- _strdate( dbuffer );\r
- _strtime( tbuffer );\r
- sprintf(timebuffer, "%s - %s",dbuffer,tbuffer);\r
-#endif\r
-\r
- // search for <level> field\r
- level = -1;\r
- lt=strchr(logString, '<');\r
- gt=strchr(logString, '>');\r
- if(lt && gt && lt<gt)\r
- {\r
- int t;\r
- for(t=0;t<loglevels;t++)\r
- {\r
-#ifndef __NT__\r
- if(!strncasecmp(lt+1,logimportance[t],strlen(logimportance[t])))\r
-#else\r
- if(!strnicmp(lt+1,logimportance[t],strlen(logimportance[t])))\r
-#endif\r
- {\r
- logString = gt+1;\r
- while(logString[0]==' ') logString ++;\r
- level = t;\r
- break;\r
- }\r
- }\r
- }\r
- \r
-// sprintf(logBuffer, "%s: %s %s", timebuffer, logimportance2[level + 1],logString);\r
- sprintf(logBuffer, "%s %s", logimportance2[level + 1],logString);\r
-\r
- // we always do exactly one newline.\r
- \r
- l=strlen(logBuffer)-1;\r
- while((logBuffer[l]==13 || logBuffer[l]==10) && l>=0)\r
- {\r
- logBuffer[l]=0;\r
- l--;\r
- }\r
-\r
- if (level <= screenloglevel)\r
- {\r
- printf("%s\n", logBuffer); \r
- fflush(stdout);\r
- }\r
-\r
- if (level <= fileloglevel)\r
- {\r
- if (logFile != NULL)\r
- {\r
- fprintf(logFile, "%s\n", logBuffer); \r
- fflush(logFile);\r
- }\r
- }\r
-\r
- if (level <= socketloglevel)\r
- {\r
- if (bLogToSock)\r
- {\r
- // send data\r
-#ifndef __NT__\r
- write(logSocket, logBuffer, strlen(logBuffer));\r
-#else\r
- send(logSocket, logBuffer, strlen(logBuffer), 0);\r
-#endif\r
- }\r
- }\r
- free (logBuffer);\r
-}\r
-\r
-void logf(const char* pszFormat, ...)\r
-{\r
- char buf[1024];\r
- va_list arglist;\r
- va_start(arglist, pszFormat);\r
- buf[0] = 0;\r
- vsprintf(&buf[strlen(buf)], pszFormat, arglist);\r
- va_end(arglist);\r
- strcat(buf, "\n");\r
- log(buf);\r
-}\r
-\r
+/* log.c
+ Logging facilities for displaying information on screen, as well as
+ (optional) storing it to a file and transmitting it over the network.
+
+ Part of the swftools package.
+
+ Copyright (c) 2001 Matthias Kramm <kramm@quiss.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#ifdef __NT__
+#include "stdafx.h"
+#include <string.h>
+#include <stdlib.h>
+#include <malloc.h>
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+#else
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <unistd.h>
+#endif
+
+#include "log.h"
+
+int screenloglevel = 1;
+static int fileloglevel = -1;
+static int maxloglevel = 1;
+static FILE *logFile = 0;
+
+void initLog(char* pLogName, int fileloglevel, char* s00, char* s01, int s02, int screenlevel)
+{
+ screenloglevel = screenlevel;
+ fileloglevel = fileloglevel;
+
+ maxloglevel=screenloglevel;
+ if(fileloglevel>maxloglevel && pLogName)
+ maxloglevel=fileloglevel;
+
+ logFile = NULL;
+
+ if (pLogName && fileloglevel>=0)
+ logFile = fopen(pLogName, "a+");
+}
+
+void exitLog()
+{
+ // close file
+ if(logFile != NULL)
+ fclose(logFile);
+}
+
+static char * logimportance[]= {"Fatal","Error","Warning","Notice","Verbose","Debug","Trace"};
+static int loglevels=7;
+static char * logimportance2[]= {" ","FATAL ","ERROR ","WARNING","NOTICE ","VERBOSE","DEBUG ", "TRACE "};
+
+static inline void log(char* logString)
+{
+ char timebuffer[32];
+ char* logBuffer;
+ char dbuffer[9];
+ char tbuffer[9];
+ int level;
+ char*lt;
+ char*gt;
+ int l;
+
+ logBuffer = (char*)malloc (strlen(logString) + 24 + 15);
+#ifndef __NT__
+ {
+ /*time_t t = time(0);
+ tm*t2 = localtime(t);
+ strftime(dbuffer, 8, "%m %d", t2);
+ strftime(tbuffer, 8, "%m %d", t2);
+ dbuffer[0]=0; //FIXME
+ tbuffer[0]=0;*/
+ time_t t = time(0);
+ char* a = ctime(&t);
+ int l = strlen(a);
+ while(a[l-1] == 13 || a[l-1] == 10)
+ l--;
+ a[l]=0;
+ sprintf(timebuffer, "%s", a);
+ }
+#else
+ _strdate( dbuffer );
+ _strtime( tbuffer );
+ sprintf(timebuffer, "%s - %s",dbuffer,tbuffer);
+#endif
+
+ // search for <level> field
+ level = -1;
+ lt=strchr(logString, '<');
+ gt=strchr(logString, '>');
+ if(lt && gt && lt<gt)
+ {
+ int t;
+ for(t=0;t<loglevels;t++)
+ {
+#ifndef __NT__
+ if(!strncasecmp(lt+1,logimportance[t],strlen(logimportance[t])))
+#else
+ if(!strnicmp(lt+1,logimportance[t],strlen(logimportance[t])))
+#endif
+ {
+ logString = gt+1;
+ while(logString[0]==' ') logString ++;
+ level = t;
+ break;
+ }
+ }
+ }
+
+// sprintf(logBuffer, "%s: %s %s", timebuffer, logimportance2[level + 1],logString);
+ sprintf(logBuffer, "%s %s", logimportance2[level + 1],logString);
+
+ // we always do exactly one newline.
+
+ l=strlen(logBuffer)-1;
+ while((logBuffer[l]==13 || logBuffer[l]==10) && l>=0)
+ {
+ logBuffer[l]=0;
+ l--;
+ }
+
+ if (level <= screenloglevel)
+ {
+ printf("%s\n", logBuffer);
+ fflush(stdout);
+ }
+
+ if (level <= fileloglevel)
+ {
+ if (logFile != NULL)
+ {
+ fprintf(logFile, "%s\n", logBuffer);
+ fflush(logFile);
+ }
+ }
+
+ free (logBuffer);
+}
+
+void msg(const char* format, ...)
+{
+ char buf[1024];
+ va_list arglist;
+ va_start(arglist, format);
+
+ /* speed up hack */
+ if(format[0]=='<') {
+ char*z = "fewnvdt";
+ char*x = strchr(z,format[1]);
+ if(x && (x-z)>maxloglevel)
+ return;
+ }
+
+ vsprintf(buf, format, arglist);
+ va_end(arglist);
+ strcat(buf, "\n");
+ log(buf);
+}
+