X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=util.c;h=094870ff213cbc41c9f011aa1b316f646ee30992;hb=5d8fc5c038cb1e4a213e5d0283ebfc5c853ac04f;hp=24dd9a33ebfb375ea3047425e83b8c8bc6b376c2;hpb=779837e133a4740798015a1d7de6fbf6b4b1720f;p=secnet.git diff --git a/util.c b/util.c index 24dd9a3..094870f 100644 --- a/util.c +++ b/util.c @@ -247,14 +247,14 @@ void buffer_assert_used(struct buffer_if *buffer, cstring_t file, void buffer_init(struct buffer_if *buffer, int32_t max_start_pad) { - assert(max_start_pad<=buffer->len); + assert(max_start_pad<=buffer->alloclen); buffer->start=buffer->base+max_start_pad; buffer->size=0; } void *buf_append(struct buffer_if *buf, int32_t amount) { void *p; - assert(buf->size <= buf->len - amount); + assert(amount <= buf_remaining_space(buf)); p=buf->start + buf->size; buf->size+=amount; return p; @@ -300,7 +300,7 @@ void buffer_new(struct buffer_if *buf, int32_t len) buf->loc.file=NULL; buf->loc.line=0; buf->size=0; - buf->len=len; + buf->alloclen=len; buf->start=NULL; buf->base=safe_malloc(len,"buffer_new"); } @@ -312,7 +312,7 @@ void buffer_readonly_view(struct buffer_if *buf, const void *data, int32_t len) buf->flags=0; buf->loc.file=NULL; buf->loc.line=0; - buf->size=buf->len=len; + buf->size=buf->alloclen=len; buf->base=buf->start=(uint8_t*)data; } @@ -323,10 +323,10 @@ void buffer_readonly_clone(struct buffer_if *out, const struct buffer_if *in) void buffer_copy(struct buffer_if *dst, const struct buffer_if *src) { - if (dst->len < src->len) { - dst->base=realloc(dst->base,src->len); + if (dst->alloclen < src->alloclen) { + dst->base=realloc(dst->base,src->alloclen); if (!dst->base) fatal_perror("buffer_copy"); - dst->len = src->len; + dst->alloclen = src->alloclen; } dst->start = dst->base + (src->start - src->base); dst->size = src->size; @@ -387,14 +387,14 @@ void send_nak(const struct comm_addr *dest, uint32_t our_index, uint32_t their_index, uint32_t msgtype, struct buffer_if *buf, const char *logwhy) { - buffer_init(buf,dest->comm->min_start_pad); + buffer_init(buf,calculate_max_start_pad()); buf_append_uint32(buf,their_index); buf_append_uint32(buf,our_index); buf_append_uint32(buf,LABEL_NAK); if (logwhy) Message(M_INFO,"%s: %08"PRIx32"<-%08"PRIx32": %08"PRIx32":" " %s; sending NAK\n", - dest->comm->addr_to_string(dest->comm->st,dest), + comm_addr_to_string(dest), our_index, their_index, msgtype, logwhy); dest->comm->sendmsg(dest->comm->st, buf, dest); } @@ -419,3 +419,46 @@ void util_module(dict_t *dict) { add_closure(dict,"sysbuffer",buffer_apply); } + +void update_max_start_pad(int32_t *our_module_global, int32_t our_instance) +{ + if (*our_module_global < our_instance) + *our_module_global=our_instance; +} + +int32_t transform_max_start_pad, comm_max_start_pad; + +int32_t calculate_max_start_pad(void) +{ + return + site_max_start_pad + + transform_max_start_pad + + comm_max_start_pad; +} + +void vslilog_part(struct log_if *lf, int priority, const char *message, va_list ap) +{ + char *buff=lf->buff; + size_t bp; + char *nlp; + + bp=strlen(buff); + assert(bp < LOG_MESSAGE_BUFLEN); + vsnprintf(buff+bp,LOG_MESSAGE_BUFLEN-bp,message,ap); + buff[LOG_MESSAGE_BUFLEN-1] = '\n'; + buff[LOG_MESSAGE_BUFLEN] = '\0'; + /* Each line is sent separately */ + while ((nlp=strchr(buff,'\n'))) { + *nlp=0; + slilog(lf,priority,"%s",buff); + memmove(buff,nlp+1,strlen(nlp+1)+1); + } +} + +extern void slilog_part(struct log_if *lf, int priority, const char *message, ...) +{ + va_list ap; + va_start(ap,message); + vslilog_part(lf,priority,message,ap); + va_end(ap); +}