xprint.c
69d91074
 /*
  * xprint.c
83cbbef8
  * Copyright (C) 2008-2012 KLab Inc.
69d91074
  */
 #include "makuosan.h"
 
 char *opcodestrlist[]={"PING ",
                        "EXIT ",
                        "SEND ",
                        "MD5  ",
                        "DSYNC",
                        "DEL  ",
                        "UNKNOWN"};
 
 uint8_t opcodenumlist[]={MAKUO_OP_PING,
                          MAKUO_OP_EXIT,
                          MAKUO_OP_SEND,
                          MAKUO_OP_MD5,
                          MAKUO_OP_DSYNC,
                          MAKUO_OP_DEL,
                          MAKUO_OPCODE_MAX};
 
 char *sstatestrlist[]={"SEND_STAT   ",
                        "SEND_OPEN   ",
                        "SEND_DATA   ",
                        "SEND_MARK   ",
                        "SEND_CLOSE  ",
                        "SEND_LAST   ",
                        "SEND_ERROR  ",
                        "SEND_BREAK  ",
eeef442d
                        "SEND_WAIT   ",
69d91074
                        "SEND_UNKNOWN"};
 
 uint8_t sstatenumlist[]={MAKUO_SENDSTATE_STAT,
                          MAKUO_SENDSTATE_OPEN,
                          MAKUO_SENDSTATE_DATA,
                          MAKUO_SENDSTATE_MARK,
                          MAKUO_SENDSTATE_CLOSE,
                          MAKUO_SENDSTATE_LAST,
                          MAKUO_SENDSTATE_ERROR,
                          MAKUO_SENDSTATE_BREAK,
eeef442d
                          MAKUO_SENDSTATE_WAIT,
69d91074
                          MAKUO_STATE_MAX};
 
 char *rstatestrlist[] = {"RECV_NONE    ",
                          "RECV_UPDATE  ",
                          "RECV_SKIP    ",
                          "RECV_OPEN    ",
                          "RECV_MARK    ",
                          "RECV_CLOSE   ",
                          "RECV_IGNORE  ",
                          "RECV_READONLY",
                          "RECV_BREAK   ",
                          "RECV_LAST    ",
                          "RECV_MD5OK   ",
                          "RECV_MD5NG   ",
                          "RECV_DELETEOK",
                          "RECV_DELETENG",
                          "RECV_OPENERR ",
                          "RECV_READERR ", 
                          "RECV_WRITEERR", 
                          "RECV_CLOSEERR", 
                          "RECV_UNKNOWN"};
 
 uint8_t rstatenumlist[]={MAKUO_RECVSTATE_NONE,
                          MAKUO_RECVSTATE_UPDATE,
                          MAKUO_RECVSTATE_SKIP,
                          MAKUO_RECVSTATE_OPEN,
                          MAKUO_RECVSTATE_MARK,
                          MAKUO_RECVSTATE_CLOSE,
                          MAKUO_RECVSTATE_IGNORE,
                          MAKUO_RECVSTATE_READONLY,
                          MAKUO_RECVSTATE_BREAK,
                          MAKUO_RECVSTATE_LAST,
                          MAKUO_RECVSTATE_MD5OK,
                          MAKUO_RECVSTATE_MD5NG,
                          MAKUO_RECVSTATE_DELETEOK,
                          MAKUO_RECVSTATE_DELETENG,
                          MAKUO_RECVSTATE_OPENERROR,
                          MAKUO_RECVSTATE_READERROR,
                          MAKUO_RECVSTATE_WRITEERROR,
                          MAKUO_RECVSTATE_CLOSEERROR,
                          MAKUO_STATE_MAX};
 
 char *strsstate(uint8_t n)
 {
   int i;
   for(i=0;sstatenumlist[i] != MAKUO_STATE_MAX;i++){
     if(sstatenumlist[i] == n){
       break;
     }
   }
   return(sstatestrlist[i]);
 }
 
 char *strrstate(uint8_t n)
 {
   int i;
   for(i=0;rstatenumlist[i] != MAKUO_STATE_MAX;i++){
     if(rstatenumlist[i] == n){
       break;
     }
   }
   return(rstatestrlist[i]);
 }
 
 char *strmstate(mdata *data)
 {
   if(data->head.flags & MAKUO_FLAG_ACK){
     return(strrstate(data->head.nstate));
   }
   return(strsstate(data->head.nstate));
 }
 
 char *stropcode(mdata *data)
 {
   int i;
   for(i=0;opcodenumlist[i] != MAKUO_STATE_MAX;i++){
     if(opcodenumlist[i] == data->head.opcode){
       break;
     }
   }
   return(opcodestrlist[i]);
 }
 
 char *strackreq(mdata *data)
 {
   char *ack = "ack";
   char *req = "req";
   if(data->head.flags & MAKUO_FLAG_ACK){
     return(ack);
   }
   return(req);
 }
 
 void fdprintf(int s, char *fmt, ...)
 {
   char m[2048];
   va_list arg;
   if(s != -1){
     va_start(arg, fmt);
     vsnprintf(m, sizeof(m), fmt, arg);
     va_end(arg);
     m[sizeof(m) - 1] = 0;
     write(s, m, strlen(m));
   }
 }
 
 void lprintf(int l, char *fmt, ...)
 {
   va_list arg;
38605fc1
   char b[1024];
   char d[2048];
   static char m[2048];
1162859f
 #ifdef MAKUO_DEBUG
   struct timeval tv;
 #endif
38605fc1
   if(moption.loglevel < l){
     return;
   }
   strcpy(d, m);
   va_start(arg, fmt);
   vsnprintf(b, sizeof(b), fmt, arg);
   va_end(arg);
   b[sizeof(b) - 1] = 0;
   snprintf(m, sizeof(m), "%s%s", d, b);
   m[sizeof(m) - 1] = 0;
   m[sizeof(m) - 2] = '\n';
   if(!strchr(m, '\n')){
     return;
   }
69d91074
 #ifdef MAKUO_DEBUG
38605fc1
   gettimeofday(&tv, NULL);
   fprintf(stderr, "%02d.%06d %s", tv.tv_sec % 60, tv.tv_usec, m);
69d91074
 #else
38605fc1
   fprintf(stderr, "%s", m);
69d91074
 #endif
38605fc1
   syslog(LOG_ERR, "%s: %s", moption.user_name, m);
   m[0] = 0;
69d91074
 }
 
f73d92fa
 int cprintf(int l, mcomm *c, char *fmt, ...)
69d91074
 {
25108556
   int i;
076535d8
   int n;
69d91074
   char m[2048];
   va_list arg;
076535d8
   if(!c){
f73d92fa
     return(0);
076535d8
   }
   if(c->fd[0] == -1){
f73d92fa
     return(0);
076535d8
   }
   if(c->loglevel < l){
f73d92fa
     return(0);
076535d8
   }
   va_start(arg, fmt);
   vsnprintf(m, sizeof(m), fmt, arg);
   va_end(arg);
83082c34
   m[sizeof(m) - 2] = '\n';
076535d8
   m[sizeof(m) - 1] = 0;
f73d92fa
   n = strlen(m);
   if(write(c->fd[0], m, n) == n){
     fsync(c->fd[0]);
83082c34
     c->logfail = 0;
6ef73c3e
     return(0); /* success */
   }
 
   /*----- error -----*/
   for(i=0;i<sizeof(m);i++){
     if(m[i] == 0){
       break;
     }
     if(m[i] == '\n'){
       m[i] = ' ';
25108556
     }
69d91074
   }
6ef73c3e
   c->logover++;
   c->logfail = 1;
   lprintf(0, "[error] %s: can't write console: %s\n", __func__, m);
   return(-1);
69d91074
 }
 
eeef442d
 void mprintf(int l, const char *func, mfile *m)
69d91074
 {
   if(!m)
     return;
d38d0833
   lprintf(l, "%s: rc=%d id=%d init=%d wait=%d flag=%d %s %s %s %s\n",
69d91074
     func, 
     m->retrycnt,
     m->mdata.head.reqid, 
     m->initstate, 
     m->sendwait, 
d38d0833
     m->mdata.head.flags,
69d91074
     inet_ntoa(m->addr.sin_addr), 
     stropcode(&(m->mdata)),
     strmstate(&(m->mdata)),
     m->fn);
 }