Esempio n. 1
0
File: imc.c Progetto: bkero/Smaug
/*  try to read a line from the input buffer, NULL if none ready
 *  all lines are \n\r terminated in theory, but take other combinations
 */
static const char *get_one_line(char *buffer)
{
  int i;
  char *buf=imc_getsbuf(IMC_PACKET_LENGTH);

  /* copy until \n, \r, end of buffer, or out of space */
  for (i=0; buffer[i] && buffer[i] != '\n' && buffer[i] != '\r' &&
       i+1 < IMC_PACKET_LENGTH; i++)
    buf[i] = buffer[i];

  /* end of buffer and we haven't hit the maximum line length */
  if (!buffer[i] && i+1 < IMC_PACKET_LENGTH)
  {
    buf[0]=0;
    imc_shrinksbuf(buf);
    return NULL;		/* so no line available */
  }

  /* terminate return string */
  buf[i]=0;

  /* strip off extra control codes */
  while (buffer[i] && (buffer[i] == '\n' || buffer[i] == '\r'))
    i++;

  /* remove the line from the input buffer */
//  memmove(buffer, buffer+i, strlen(buffer+i) + 1);
  strcpy(buffer,buffer+i);

  imc_shrinksbuf(buf);
  return buf;
}
Esempio n. 2
0
void imc_whoreply_end(void)
{
  imc_send_whoreply(wr_to, wr_buf, -(wr_sequence+1));
  imc_strfree(wr_to);
  wr_buf[0]=0;
  imc_shrinksbuf(wr_buf);
}
Esempio n. 3
0
static const char *generate2(const imc_packet * p)
{
  char *temp;
  char newpath[IMC_PATH_LENGTH];

  if (!p->type[0] || !p->i.from[0] || !p->i.to[0])
  {
    imc_logerror("BUG: generate2: bad packet!");
    imc_logerror("type: %s from: %s to: %s",p->type,p->i.from,p->i.to);
    imc_logerror("path: %s data:",p->i.path,printkeys(&p->data));
    return NULL;		/* catch bad packets here */
  }

  if (!p->i.path[0])
    strcpy(newpath, imc_name);
  else
    sprintf(newpath, "%s!%s", p->i.path, imc_name);

  temp=imc_getsbuf(IMC_PACKET_LENGTH);
  sprintf(temp, "%s %lu %s %s %s %s",
	  p->i.from, p->i.sequence, newpath, p->type, p->i.to,
	  printkeys(&p->data));
  imc_shrinksbuf(temp);
  return temp;
}
Esempio n. 4
0
/* printkeys: print key-value pairs, escaping values */
static const char *printkeys(const imc_data * data) {
    char *buf = imc_getsbuf(IMC_DATA_LENGTH);
    char temp[IMC_DATA_LENGTH];
    int len = 0;
    int i;
    buf[0] = 0;
    for(i = 0; i < IMC_MAX_KEYS; i++) {
        if(!data->key[i]) {
            continue;
        }
        imc_sncpy(buf + len, data->key[i], IMC_DATA_LENGTH - len - 1);
        strcat(buf, "=");
        len = strlen(buf);
        if(!strchr(data->value[i], ' ')) {
            imc_sncpy(temp, escape2(data->value[i]), IMC_DATA_LENGTH - 1);
        } else {
            temp[0] = '"';
            imc_sncpy(temp + 1, escape2(data->value[i]), IMC_DATA_LENGTH - 3);
            strcat(temp, "\"");
        }
        strcat(temp, " ");
        imc_sncpy(buf + len, temp, IMC_DATA_LENGTH - len);
        len = strlen(buf);
    }
    imc_shrinksbuf(buf);
    return buf;
}
Esempio n. 5
0
/* generate_mailid: generate a new mailid (string) */
static char *generate_mailid(void)
{
  char *buffer=imc_getsbuf(200);

  sprintf(buffer, "%d-%ld@%s", rand(), imc_sequencenumber++, imc_name);
  imc_shrinksbuf(buffer);
  return buffer;
}
Esempio n. 6
0
/* datestring: generate a date string for the current time */
static char *datestring(void)
{
  char *buf=imc_getsbuf(100);

  strcpy(buf, ctime(&imc_now));
  buf[strlen(buf)-1]=0;

  imc_shrinksbuf(buf);
  return buf;
}
Esempio n. 7
0
/* imc_mail_showqueue: returns the current mail queue
 * buffer handling here is pretty ugly, oh well
 */
char *imc_mail_showqueue(void)
{
  char *buf=imc_getsbuf(IMC_DATA_LENGTH);
  char temp[100];
  imc_qnode *p;
  int left = IMC_DATA_LENGTH;

  sprintf(buf, "%-15s %-45s %-10s %s\n\r", "From", "To", "Via", "Time");

  for (p=imc_mq_head->next; p && left > 160; p = p->next)
  {
    int m, s;

    m=imc_next_event(ev_qnode_send, p);
    if (m<0)
      sprintf(temp, "%-15.15s %-45.45s %-10.10s --:--\n\r",
	      p->data->from,
	      p->data->to,
	      p->tomud);
    else      
    {
      s=m%60;
      m/=60;
      sprintf(temp, "%-15.15s %-45.45s %-10.10s %2d:%02d\n\r",
	      p->data->from,
	      p->data->to,
	      p->tomud,
	      m, s);
    }
	      
    left -= strlen(temp);
    strcat(buf, temp);
  }

  if (p)
  {
    int count;

    for (count=0; p; p=p->next, count++)
      ;

    sprintf(temp, "[%d further entries omitted]\n\r", count);
    strcat(buf, temp);
  }

  imc_shrinksbuf(buf);
  return buf;
}
Esempio n. 8
0
static const char *escape2(const char *data) {
    char *buf = imc_getsbuf(IMC_DATA_LENGTH);
    char *p;
    for(p = buf; *data && (p - buf < IMC_DATA_LENGTH - 1); data++, p++) {
        if(*data == '\n') {
            *p++ = '\\';
            *p = 'n';
        } else if(*data == '\r') {
            *p++ = '\\';
            *p = 'r';
        } else if(*data == '\\') {
            *p++ = '\\';
            *p = '\\';
        } else if(*data == '"') {
            *p++ = '\\';
            *p = '"';
        } else {
            *p = *data;
        }
    }
    *p = 0;
    imc_shrinksbuf(buf);
    return buf;
}
Esempio n. 9
0
/* unescape: reverse escape */
static const char *unescape(const char *data)
{
  char *buf=imc_getsbuf(IMC_DATA_LENGTH);
  char *p;
  char ch;

  for (p=buf; *data && (p-buf < IMC_DATA_LENGTH-1); data++, p++)
  {
    if (*data == '\\')
    {
      ch = *(++data);
      switch (ch)
      {
      case 'n':
	*p='\n';
	break;
      case 'r':
	*p='\r';
	break;
      case '\\':
	*p='\\';
	break;
      default:
	*p=ch;
	break;
      }
    }
    else
      *p=*data;
  }

  *p=0;

  imc_shrinksbuf(buf);
  return buf;
}