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",
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;
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)
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");
}
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;
}
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;
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);
}
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);
+}
+
+const char *iaddr_to_string(const union iaddr *ia)
+{
+ static char bufs[2][100];
+ static int b;
+
+ b ^= 1;
+
+ assert(ia->sa.sa_family == AF_INET);
+
+ snprintf(bufs[b], sizeof(bufs[b]), "[%s]:%d",
+ inet_ntoa(ia->sin.sin_addr),
+ ntohs(ia->sin.sin_port));
+ return bufs[b];
+}
+
+bool_t iaddr_equal(const union iaddr *ia, const union iaddr *ib)
+{
+ if (ia->sa.sa_family != ib->sa.sa_family)
+ return 0;
+ switch (ia->sa.sa_family) {
+ case AF_INET:
+ return ia->sin.sin_addr.s_addr == ib->sin.sin_addr.s_addr
+ && ia->sin.sin_port == ib->sin.sin_port;
+ default:
+ abort();
+ }
+}
+
+int iaddr_socklen(const union iaddr *ia)
+{
+ switch (ia->sa.sa_family) {
+ case AF_INET: return sizeof(ia->sin);
+ default: abort();
+ }
+}