/*   Touched: Sun Aug 06 21:44:24 2006 +0530 <enometh@net.meer>
 *   Time-stamp: <06/08/07 06:37:35 madhu>
 *   Bugs-To: enometh@net.meer
 *
 * (C) 2006 Madhu, All Rights Reserved
 *
 * debug logging client via sysv ipc (message queues)
 *
 */
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>

#include <stdio.h>
#include <time.h>
#include <stdarg.h>

#define	MKEY1	1234L

#define LINELEN 640 		/* 640 is enough for anything */
#define	MAXMESGDATA    80	/* 80 cols max */

struct msgbuffer {
  long int msgtype;
  char msgtext[MAXMESGDATA];
};

#define UNDEF -2		/* must be < -1 */
#define LOGMESG 1L		/* a message type */

static int id = UNDEF;		/* specifies message queue */
static struct msgbuffer msgbuf1;


int
logform(char * fmt_string, ...) {
  time_t t;
  char * localtime;

  int ret;			/* return value of vsprintf */

  va_list pvar;
  static char result[LINELEN+1];

  int i, len;

  if (time (&t) == ((time_t)-1)) {
    /*perror("time(2) failed"); exit(-666)*/
    exit(111);
  }

  if ((localtime = ctime(&t)) == (char *) NULL) {
    /*printf("ctime(3) failed.\n"); exit(-666)*/
    exit(111);
  }

  for (len = 0, result[len++] = '['; len < (LINELEN-2); ) {
    if ((result[len++] = *localtime++) == '\n') {
      result[len-1] = ']';
      result[len++] = ' ';
      break;
    } 
  }

  va_start (pvar, fmt_string);
  ret = vsnprintf (result+len, LINELEN-len,  fmt_string, pvar);
  va_end (pvar);

  if (ret < 0) {
    /*printf("vsnprintf failed"); exit(-666);*/
    exit(111);
  }

  if ((len + ret) < LINELEN) {
    len += ret;
  } else {
    /*printf("vsnprintf truncated"); exit(-666);*/
    result[len = LINELEN] = '\0';
  }
  
  if (id == UNDEF) {
    msgbuf1.msgtype = LOGMESG;
    if ((id = msgget(MKEY1, 0)) < 0) {
      /*perror("msgget failed");   exit(-666);*/
      exit(111);
    }
    /*printf("id=%dn", id);*/
  }

  for (i = 0; i < MAXMESGDATA; i++) {
    if (result[i] == '\0') break;
    msgbuf1.msgtext[i] = result[i];
  }

  if (msgsnd(id, (struct msgbuf *) &msgbuf1, i, 0) < 0) {
    /*perror("msgsnd failed");   exit(-667);*/
    exit(111);
  }
  return i;
}


/*
int
main(int argc, char **argv)
{
  while (--argc > 0) {
    logform("argc=%d, argv=%s", argc, *++argv);
  }
  return 1;
}

Eg: ./a.out 12345678a12345678b12345678c12345678d12345678e12345678f12345678g12345678h12345678i12345678j12345678k12345678l12345678m12345678n12345678o12345678p12345678q12345678r12345678s12345678t12345678u123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780123456780
*/

