00001 #include <stdio.h>
00002 #include <netdb.h>
00003 #include <sys/socket.h>
00004 #include <netinet/in.h>
00005 #include <unistd.h>
00006 #include <sys/types.h>
00007 #include <sys/stat.h>
00008 #include <fcntl.h>
00009 #include <stdarg.h>
00010 #include <arpa/inet.h>
00011 #include <string.h>
00012 #include <syslog.h>
00013 #include <stdlib.h>
00014 #include <time.h>
00015
00016 #ifdef __linux__
00017 #else
00018 #include <procfs.h>
00019 #endif
00020
00021
00022 #include <rtsLog.h>
00023
00024
00025 #ifdef __cplusplus
00026 extern "C" {
00027 #endif
00028
00029 volatile int tonkoLogLevel = 2 ;
00030
00031
00032 static char *getCmd(void) ;
00033 static int odesc = -1 ;
00034 static int handchange ;
00035 static FILE *fdesc = 0 ;
00036
00037
00038 #ifdef RTS_PROJECT_PP
00039 static char servER[80] = "130.199.20.88" ;
00040 #else
00041 static char servER[80] = RTS_LOG_HOST ;
00042 #endif
00043
00044 static int port = RTS_LOG_PORT ;
00045 static int output_flag = RTS_LOG_NET ;
00046 static char cmd[1024] ;
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 int rtsLogOutput(int flag)
00064 {
00065 output_flag = flag ;
00066 return flag ;
00067 }
00068
00069 void rtsLogAddCmd(const char *cmd_in)
00070 {
00071 strncpy(cmd,cmd_in,sizeof(cmd)-1) ;
00072 return ;
00073 }
00074
00075 int rtsLogAddDest(char *host, int newport)
00076 {
00077
00078 handchange = 1 ;
00079
00080
00081 strncpy(servER,host,sizeof(servER)-1) ;
00082 port = newport ;
00083
00084
00085 if(odesc >= 0) close(odesc) ;
00086 odesc = -1 ;
00087
00088
00089 return 0 ;
00090 }
00091
00092 int rtsLogAddFile(char *fname)
00093 {
00094 if(fdesc) fclose(fdesc) ;
00095 fdesc = 0 ;
00096
00097 if(fname) {
00098 fdesc = fopen(fname,"w") ;
00099 }
00100
00101 if(fdesc) return 0 ;
00102
00103 return -1 ;
00104
00105 }
00106
00107
00108 int rtsLogUnix_v(const char *str, ...)
00109 {
00110
00111 static int sockAddrSize ;
00112 static struct sockaddr_in serverAddr ;
00113 static char *cmd_l ;
00114
00115 int ret ;
00116 char buffer[10240] ;
00117 char *string = buffer ;
00118 unsigned int *cou = (unsigned int *)buffer ;
00119 int len ;
00120 int err = 0 ;
00121 va_list ap ;
00122 int colored ;
00123 int to_file = 0 ;
00124
00125 retry_connect: ;
00126
00127 if((output_flag & RTS_LOG_NET) && (odesc<0)) {
00128 char *rts_host ;
00129 int bufsize ;
00130
00131
00132
00133 if(!handchange && (rts_host=getenv("RTS_LOG_HOST"))) {
00134 strncpy(servER,rts_host,sizeof(servER)-1) ;
00135 }
00136
00137
00138 cmd_l = 0 ;
00139
00140 sockAddrSize = sizeof(struct sockaddr_in) ;
00141 memset((char *)&serverAddr,0,sockAddrSize) ;
00142 serverAddr.sin_family = AF_INET ;
00143 serverAddr.sin_port = htons(port) ;
00144
00145
00146 if((serverAddr.sin_addr.s_addr = inet_addr(servER)) == (unsigned int)-1) {
00147 perror(servER);
00148 return -1 ;
00149 }
00150
00151 odesc = socket(AF_INET, SOCK_DGRAM,0) ;
00152 if(odesc < 0) {
00153 perror("socket") ;
00154 return -1 ;
00155 }
00156
00157 bufsize = 8*1024*1024 ;
00158 for(;;) {
00159 ret = setsockopt(odesc,SOL_SOCKET,SO_SNDBUF,(char *)&bufsize,sizeof(bufsize)) ;
00160 if(ret == 0) break ;
00161 bufsize /= 2 ;
00162 }
00163
00164
00165 cmd_l = getCmd() ;
00166 }
00167
00168 len = 4 ;
00169
00170 colored = 0 ;
00171 if(strncmp(str,"COLOR",5)==0) {
00172
00173 str += 5 ;
00174
00175 if(strncmp(str,DBG,strlen(DBG))==0) {
00176 ;
00177 }
00178 else if(strncmp(str,NOTE,strlen(NOTE))==0) {
00179 ;
00180 }
00181 else if(strncmp(str,WARN,strlen(WARN))==0) {
00182 colored = 1 ;
00183 sprintf(string+len,"%s",ANSI_CYAN) ;
00184 len += strlen(string+len) ;
00185 }
00186 else if(strncmp(str,CRIT,strlen(CRIT))==0) {
00187 colored = 1 ;
00188 to_file = 1 ;
00189 sprintf(string+len,"%s%s%s",ANSI_RED,ANSI_BOLD,ANSI_REVERSE) ;
00190 len += strlen(string+len) ;
00191 }
00192 else if(strncmp(str,ERR,strlen(ERR))==0) {
00193 colored = 1 ;
00194 to_file = 1 ;
00195 sprintf(string+len,"%s",ANSI_RED) ;
00196 len += strlen(string+len) ;
00197 }
00198 else if(strncmp(str,CAUTION,strlen(CAUTION))==0) {
00199 colored = 1 ;
00200 to_file = 1 ;
00201 sprintf(string+len,"%s%s",ANSI_MAGENTA,ANSI_REVERSE) ;
00202 len += strlen(string+len) ;
00203 }
00204 else if(strncmp(str,TERR,strlen(TERR))==0) {
00205 colored = 1 ;
00206 to_file = 1 ;
00207 sprintf(string+len,"%s",ANSI_GREEN) ;
00208 len += strlen(string+len) ;
00209 }
00210 else if(strncmp(str,OPER,strlen(OPER))==0) {
00211 colored = 1 ;
00212 to_file = 1 ;
00213 sprintf(string+len,"%s%s",ANSI_BLUE,ANSI_REVERSE) ;
00214 len += strlen(string+len) ;
00215 }
00216 else {
00217 colored = 1 ;
00218 sprintf(string+len,"%s",ANSI_BLUE) ;
00219 len += strlen(string+len) ;
00220 }
00221
00222 }
00223
00224 if(cmd[0]) {
00225 sprintf(string+len,"(%s): ",cmd) ;
00226 len += strlen(string+len) ;
00227 }
00228 else if(cmd_l) {
00229 sprintf(string+len,"(%s): ",cmd_l) ;
00230 len += strlen(string+len) ;
00231 }
00232
00233
00234
00235
00236 va_start(ap, str) ;
00237 vsprintf(string+len,str,ap) ;
00238 len += strlen(string+len) ;
00239
00240 if(colored) {
00241 char *end ;
00242 int nl_cou = 0 ;
00243
00244 end = string + len ;
00245 while(*(end-1) == '\n') {
00246 nl_cou++ ;
00247 len-- ;
00248 *(end-1) = 0 ;
00249 end-- ;
00250 }
00251 sprintf(end,"%s",ANSI_RESET) ;
00252 len += strlen(end) ;
00253
00254 while(nl_cou) {
00255 strcat(string+len,"\n") ;
00256 len += strlen(string+len) ;
00257 nl_cou-- ;
00258 }
00259 }
00260
00261
00262
00263
00264 *cou = 0xFFFFFFFF ;
00265
00266
00267
00268 if((odesc >= 0) && (output_flag & RTS_LOG_NET)) {
00269 ret = sendto(odesc,(char *)buffer,len,0,
00270 (struct sockaddr *)&serverAddr,sockAddrSize) ;
00271
00272
00273 if(ret < 0) {
00274 syslog(LOG_USER|LOG_ERR,"LOG sendto returned %d [%m]\n",ret) ;
00275 close(odesc) ;
00276 odesc = -1 ;
00277 if(err == 0) {
00278 err = 1 ;
00279 goto retry_connect ;
00280 }
00281 }
00282 }
00283
00284
00285 if(output_flag & RTS_LOG_STDERR) {
00286 fprintf(stderr,"%s",(char *)buffer+4) ;
00287 }
00288
00289
00290 if(fdesc && to_file && (output_flag & RTS_LOG_FILE)) {
00291 time_t t = time(0) ;
00292 struct tm *tm = localtime(&t) ;
00293
00294 if(fdesc) fprintf(fdesc,"%02d:%02d:%02d: %s",tm->tm_hour,tm->tm_min,tm->tm_sec,(char*)buffer+4) ;
00295 }
00296
00297 return 0 ;
00298 }
00299
00300
00301
00302 static char *getCmd(void)
00303 {
00304
00305
00306 static char *str = "(no-name)" ;
00307 #ifdef __linux__
00308 FILE *file ;
00309 static char name[128] ;
00310 char *ptr ;
00311
00312 file = fopen("/proc/self/cmdline","r") ;
00313 if(file==NULL) return str ;
00314
00315 fscanf(file,"%120s",name) ;
00316 fclose(file) ;
00317
00318 if((ptr = strrchr(name,'/'))) {
00319 return ptr+1 ;
00320 }
00321 else {
00322 return name ;
00323 }
00324 #else // solaris
00325 int fd, ret ;
00326 static struct psinfo ps ;
00327
00328 fd = open("/proc/self/psinfo",O_RDONLY,0666) ;
00329 if(fd < 0) return str ;
00330
00331 ret = read(fd,(char *)&ps,sizeof(ps)) ;
00332 close(fd) ;
00333
00334 if(ret != sizeof(ps)) {
00335 return str ;
00336 }
00337
00338 return ps.pr_fname ;
00339 #endif
00340 }
00341
00342 #ifdef __cplusplus
00343 }
00344 #endif
00345