X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=secnet.git;a=blobdiff_plain;f=util.c;h=94f9e35679acf34c7d500fade5e25919087cd9cc;hp=de182a431445abdf34abc8b3f7dbf57f17ee919e;hb=c7396710e7bf07f947ec6e8623144acff130d920;hpb=927950400bd569326c3babf4e29038523fa464a6 diff --git a/util.c b/util.c index de182a4..94f9e35 100644 --- a/util.c +++ b/util.c @@ -162,6 +162,20 @@ int32_t write_mpbin(MP_INT *a, uint8_t *buffer, int32_t buflen) return i; } +void setcloexec(int fd) { + int r=fcntl(fd, F_GETFD); + if (r<0) fatal_perror("fcntl(,F_GETFD) failed"); + r=fcntl(fd, F_SETFD, r|FD_CLOEXEC); + if (r<0) fatal_perror("fcntl(,F_SETFD,|FD_CLOEXEC) failed"); +} + +void pipe_cloexec(int fd[2]) { + int r=pipe(fd); + if (r) fatal_perror("pipe"); + setcloexec(fd[0]); + setcloexec(fd[1]); +} + static const char *phases[NR_PHASES]={ "PHASE_INIT", "PHASE_GETOPTS", @@ -247,7 +261,7 @@ 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; } @@ -289,7 +303,7 @@ void buf_append_string(struct buffer_if *buf, cstring_t s) len=strlen(s); /* fixme: if string is longer than 65535, result is a corrupted packet */ buf_append_uint16(buf,len); - memcpy(buf_append(buf,len),s,len); + BUF_ADD_BYTES(append,buf,s,len); } void buffer_new(struct buffer_if *buf, int32_t len) @@ -300,7 +314,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 +326,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 +337,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;