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; }
/* 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; }
/* 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; }
/* 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; }
/* 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; }
/* 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; }
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; }
/* 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; }
void imc_whoreply_start(const char *to) { wr_sequence=0; wr_to=imc_strdup(to); wr_buf=imc_getsbuf(IMC_DATA_LENGTH); }