Index: head/devel/got/Makefile =================================================================== --- head/devel/got/Makefile (revision 549939) +++ head/devel/got/Makefile (revision 549940) @@ -1,26 +1,31 @@ # $FreeBSD$ PORTNAME= got PORTVERSION= 0.40 CATEGORIES= devel MASTER_SITES= https://gameoftrees.org/releases/ MAINTAINER= naddy@FreeBSD.org COMMENT= Game of Trees version control system LICENSE= ISCL LICENSE_FILE= ${WRKSRC}/LICENCE USES= uidfix +n= ${.newline} post-extract: + @${FIND} ${WRKSRC} -name '*.[cy]' -exec \ + ${REINPLACE_CMD} '1,/^#include "/{ \ + /^#include "/i\$n#include "openbsd-compat.h"\$n$n}' \ + {} + ${CP} -R ${FILESDIR}/openbsd-compat ${WRKSRC} # The regression test suite requires: # installed got # installed git # ssh to 127.0.0.1 run-test: @(cd ${WRKSRC}/regress && ${SETENV} ${MAKE_ENV} ${MAKE_CMD} regress) .include Index: head/devel/got/files/openbsd-compat/stdlib.h =================================================================== --- head/devel/got/files/openbsd-compat/stdlib.h (revision 549939) +++ head/devel/got/files/openbsd-compat/stdlib.h (nonexistent) @@ -1,9 +0,0 @@ -#ifndef _OPENBSD_COMPAT_STDLIB_H_ -#define _OPENBSD_COMPAT_STDLIB_H_ - -#include_next - -void freezero(void *, size_t); -void *recallocarray(void *, size_t, size_t, size_t); - -#endif Property changes on: head/devel/got/files/openbsd-compat/stdlib.h ___________________________________________________________________ Deleted: fbsd:nokeywords ## -1 +0,0 ## -on \ No newline at end of property Deleted: svn:eol-style ## -1 +0,0 ## -native \ No newline at end of property Deleted: svn:mime-type ## -1 +0,0 ## -text/plain \ No newline at end of property Index: head/devel/got/files/openbsd-compat/unistd.h =================================================================== --- head/devel/got/files/openbsd-compat/unistd.h (revision 549939) +++ head/devel/got/files/openbsd-compat/unistd.h (nonexistent) @@ -1,14 +0,0 @@ -#ifndef _OPENBSD_COMPAT_UNISTD_H_ -#define _OPENBSD_COMPAT_UNISTD_H_ - -#include_next - -int getdtablecount(void); - -/* void -> int */ -#define closefrom(fd) (closefrom(fd), 0) - -#define pledge(promises, execpromises) 0 -#define unveil(path, permissions) 0 - -#endif Property changes on: head/devel/got/files/openbsd-compat/unistd.h ___________________________________________________________________ Deleted: fbsd:nokeywords ## -1 +0,0 ## -on \ No newline at end of property Deleted: svn:eol-style ## -1 +0,0 ## -native \ No newline at end of property Deleted: svn:mime-type ## -1 +0,0 ## -text/plain \ No newline at end of property Index: head/devel/got/files/openbsd-compat/libgen.h =================================================================== --- head/devel/got/files/openbsd-compat/libgen.h (revision 549939) +++ head/devel/got/files/openbsd-compat/libgen.h (nonexistent) @@ -1,10 +0,0 @@ -#ifndef _OPENBSD_COMPAT_LIBGEN_H_ -#define _OPENBSD_COMPAT_LIBGEN_H_ - -#define basename(path) basename_const(path) -#define dirname(path) dirname_const(path) - -char *basename(const char *); -char *dirname(const char *); - -#endif Property changes on: head/devel/got/files/openbsd-compat/libgen.h ___________________________________________________________________ Deleted: fbsd:nokeywords ## -1 +0,0 ## -on \ No newline at end of property Deleted: svn:eol-style ## -1 +0,0 ## -native \ No newline at end of property Deleted: svn:mime-type ## -1 +0,0 ## -text/plain \ No newline at end of property Index: head/devel/got/files/openbsd-compat/sys/cdefs.h =================================================================== --- head/devel/got/files/openbsd-compat/sys/cdefs.h (revision 549939) +++ head/devel/got/files/openbsd-compat/sys/cdefs.h (nonexistent) @@ -1,8 +0,0 @@ -#ifndef _OPENBSD_COMPAT_SYS_CDEFS_ -#define _OPENBSD_COMPAT_SYS_CDEFS_ - -#include_next - -#define __dead __dead2 - -#endif Property changes on: head/devel/got/files/openbsd-compat/sys/cdefs.h ___________________________________________________________________ Deleted: fbsd:nokeywords ## -1 +0,0 ## -on \ No newline at end of property Deleted: svn:eol-style ## -1 +0,0 ## -native \ No newline at end of property Deleted: svn:mime-type ## -1 +0,0 ## -text/plain \ No newline at end of property Index: head/devel/got/files/openbsd-compat/sys/queue.h =================================================================== --- head/devel/got/files/openbsd-compat/sys/queue.h (revision 549939) +++ head/devel/got/files/openbsd-compat/sys/queue.h (nonexistent) @@ -1,39 +0,0 @@ -#ifndef _OPENBSD_COMPAT_SYS_QUEUE_H_ -#define _OPENBSD_COMPAT_SYS_QUEUE_H_ - -#include_next - -#define SIMPLEQ_HEAD(name, type) \ - STAILQ_HEAD(name, type) -#define SIMPLEQ_HEAD_INITIALIZER(head) \ - STAILQ_HEAD_INITIALIZER(head) -#define SIMPLEQ_ENTRY(type) \ - STAILQ_ENTRY(type) -#define SIMPLEQ_FIRST(head) \ - STAILQ_FIRST(head) -#define SIMPLEQ_END(head) \ - NULL -#define SIMPLEQ_EMPTY(head) \ - STAILQ_EMPTY(head) -#define SIMPLEQ_NEXT(elm, field) \ - STAILQ_NEXT(elm, field) -#define SIMPLEQ_FOREACH(var, head, field) \ - STAILQ_FOREACH(var, head, field) -#define SIMPLEQ_FOREACH_SAFE(var, head, field, tvar) \ - STAILQ_FOREACH_SAFE(var, head, field, tvar) -#define SIMPLEQ_INIT(head) \ - STAILQ_INIT(head) -#define SIMPLEQ_INSERT_HEAD(head, elm, field) \ - STAILQ_INSERT_HEAD(head, elm, field) -#define SIMPLEQ_INSERT_TAIL(head, elm, field) \ - STAILQ_INSERT_TAIL(head, elm, field) -#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) \ - STAILQ_INSERT_AFTER(head, listelm, elm, field) -#define SIMPLEQ_REMOVE_HEAD(head, field) \ - STAILQ_REMOVE_HEAD(head, field) -#define SIMPLEQ_REMOVE_AFTER(head, elm, field) \ - STAILQ_REMOVE_AFTER(head, elm, field) -#define SIMPLEQ_CONCAT(head1, head2) \ - STAILQ_CONCAT(head1, head2) - -#endif Property changes on: head/devel/got/files/openbsd-compat/sys/queue.h ___________________________________________________________________ Deleted: fbsd:nokeywords ## -1 +0,0 ## -on \ No newline at end of property Deleted: svn:eol-style ## -1 +0,0 ## -native \ No newline at end of property Deleted: svn:mime-type ## -1 +0,0 ## -text/plain \ No newline at end of property Index: head/devel/got/files/openbsd-compat/basename.c =================================================================== --- head/devel/got/files/openbsd-compat/basename.c (revision 549939) +++ head/devel/got/files/openbsd-compat/basename.c (revision 549940) @@ -1,63 +1,65 @@ /* $OpenBSD: basename.c,v 1.16 2019/01/25 00:19:25 millert Exp $ */ /* * Copyright (c) 1997, 2004 Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include #include #include +#include + char * basename(const char *path) { static char bname[PATH_MAX]; size_t len; const char *endp, *startp; /* Empty or NULL string gets treated as "." */ if (path == NULL || *path == '\0') { bname[0] = '.'; bname[1] = '\0'; return (bname); } /* Strip any trailing slashes */ endp = path + strlen(path) - 1; while (endp > path && *endp == '/') endp--; /* All slashes becomes "/" */ if (endp == path && *endp == '/') { bname[0] = '/'; bname[1] = '\0'; return (bname); } /* Find the start of the base */ startp = endp; while (startp > path && *(startp - 1) != '/') startp--; len = endp - startp + 1; if (len >= sizeof(bname)) { errno = ENAMETOOLONG; return (NULL); } memcpy(bname, startp, len); bname[len] = '\0'; return (bname); } Index: head/devel/got/files/openbsd-compat/dirname.c =================================================================== --- head/devel/got/files/openbsd-compat/dirname.c (revision 549939) +++ head/devel/got/files/openbsd-compat/dirname.c (revision 549940) @@ -1,69 +1,71 @@ /* $OpenBSD: dirname.c,v 1.16 2019/01/25 00:19:25 millert Exp $ */ /* * Copyright (c) 1997, 2004 Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include #include #include +#include + /* A slightly modified copy of this file exists in libexec/ld.so */ char * dirname(const char *path) { static char dname[PATH_MAX]; size_t len; const char *endp; /* Empty or NULL string gets treated as "." */ if (path == NULL || *path == '\0') { dname[0] = '.'; dname[1] = '\0'; return (dname); } /* Strip any trailing slashes */ endp = path + strlen(path) - 1; while (endp > path && *endp == '/') endp--; /* Find the start of the dir */ while (endp > path && *endp != '/') endp--; /* Either the dir is "/" or there are no slashes */ if (endp == path) { dname[0] = *endp == '/' ? '/' : '.'; dname[1] = '\0'; return (dname); } else { /* Move forward past the separating slashes */ do { endp--; } while (endp > path && *endp == '/'); } len = endp - path + 1; if (len >= sizeof(dname)) { errno = ENAMETOOLONG; return (NULL); } memcpy(dname, path, len); dname[len] = '\0'; return (dname); } Index: head/devel/got/files/openbsd-compat/imsg-buffer.c =================================================================== --- head/devel/got/files/openbsd-compat/imsg-buffer.c (revision 549939) +++ head/devel/got/files/openbsd-compat/imsg-buffer.c (revision 549940) @@ -1,309 +1,311 @@ /* $OpenBSD: imsg-buffer.c,v 1.12 2019/01/20 02:50:03 bcook Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include #include #include #include #include #include #include #include +#include + #include "imsg.h" static int ibuf_realloc(struct ibuf *, size_t); static void ibuf_enqueue(struct msgbuf *, struct ibuf *); static void ibuf_dequeue(struct msgbuf *, struct ibuf *); struct ibuf * ibuf_open(size_t len) { struct ibuf *buf; if ((buf = calloc(1, sizeof(struct ibuf))) == NULL) return (NULL); if ((buf->buf = malloc(len)) == NULL) { free(buf); return (NULL); } buf->size = buf->max = len; buf->fd = -1; return (buf); } struct ibuf * ibuf_dynamic(size_t len, size_t max) { struct ibuf *buf; if (max < len) return (NULL); if ((buf = ibuf_open(len)) == NULL) return (NULL); if (max > 0) buf->max = max; return (buf); } static int ibuf_realloc(struct ibuf *buf, size_t len) { unsigned char *b; /* on static buffers max is eq size and so the following fails */ if (buf->wpos + len > buf->max) { errno = ERANGE; return (-1); } b = recallocarray(buf->buf, buf->size, buf->wpos + len, 1); if (b == NULL) return (-1); buf->buf = b; buf->size = buf->wpos + len; return (0); } int ibuf_add(struct ibuf *buf, const void *data, size_t len) { if (buf->wpos + len > buf->size) if (ibuf_realloc(buf, len) == -1) return (-1); memcpy(buf->buf + buf->wpos, data, len); buf->wpos += len; return (0); } void * ibuf_reserve(struct ibuf *buf, size_t len) { void *b; if (buf->wpos + len > buf->size) if (ibuf_realloc(buf, len) == -1) return (NULL); b = buf->buf + buf->wpos; buf->wpos += len; return (b); } void * ibuf_seek(struct ibuf *buf, size_t pos, size_t len) { /* only allowed to seek in already written parts */ if (pos + len > buf->wpos) return (NULL); return (buf->buf + pos); } size_t ibuf_size(struct ibuf *buf) { return (buf->wpos); } size_t ibuf_left(struct ibuf *buf) { return (buf->max - buf->wpos); } void ibuf_close(struct msgbuf *msgbuf, struct ibuf *buf) { ibuf_enqueue(msgbuf, buf); } int ibuf_write(struct msgbuf *msgbuf) { struct iovec iov[IOV_MAX]; struct ibuf *buf; unsigned int i = 0; ssize_t n; memset(&iov, 0, sizeof(iov)); TAILQ_FOREACH(buf, &msgbuf->bufs, entry) { if (i >= IOV_MAX) break; iov[i].iov_base = buf->buf + buf->rpos; iov[i].iov_len = buf->wpos - buf->rpos; i++; } again: if ((n = writev(msgbuf->fd, iov, i)) == -1) { if (errno == EINTR) goto again; if (errno == ENOBUFS) errno = EAGAIN; return (-1); } if (n == 0) { /* connection closed */ errno = 0; return (0); } msgbuf_drain(msgbuf, n); return (1); } void ibuf_free(struct ibuf *buf) { if (buf == NULL) return; freezero(buf->buf, buf->size); free(buf); } void msgbuf_init(struct msgbuf *msgbuf) { msgbuf->queued = 0; msgbuf->fd = -1; TAILQ_INIT(&msgbuf->bufs); } void msgbuf_drain(struct msgbuf *msgbuf, size_t n) { struct ibuf *buf, *next; for (buf = TAILQ_FIRST(&msgbuf->bufs); buf != NULL && n > 0; buf = next) { next = TAILQ_NEXT(buf, entry); if (buf->rpos + n >= buf->wpos) { n -= buf->wpos - buf->rpos; ibuf_dequeue(msgbuf, buf); } else { buf->rpos += n; n = 0; } } } void msgbuf_clear(struct msgbuf *msgbuf) { struct ibuf *buf; while ((buf = TAILQ_FIRST(&msgbuf->bufs)) != NULL) ibuf_dequeue(msgbuf, buf); } int msgbuf_write(struct msgbuf *msgbuf) { struct iovec iov[IOV_MAX]; struct ibuf *buf; unsigned int i = 0; ssize_t n; struct msghdr msg; struct cmsghdr *cmsg; union { struct cmsghdr hdr; char buf[CMSG_SPACE(sizeof(int))]; } cmsgbuf; memset(&iov, 0, sizeof(iov)); memset(&msg, 0, sizeof(msg)); memset(&cmsgbuf, 0, sizeof(cmsgbuf)); TAILQ_FOREACH(buf, &msgbuf->bufs, entry) { if (i >= IOV_MAX) break; iov[i].iov_base = buf->buf + buf->rpos; iov[i].iov_len = buf->wpos - buf->rpos; i++; if (buf->fd != -1) break; } msg.msg_iov = iov; msg.msg_iovlen = i; if (buf != NULL && buf->fd != -1) { msg.msg_control = (caddr_t)&cmsgbuf.buf; msg.msg_controllen = sizeof(cmsgbuf.buf); cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_len = CMSG_LEN(sizeof(int)); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; *(int *)CMSG_DATA(cmsg) = buf->fd; } again: if ((n = sendmsg(msgbuf->fd, &msg, 0)) == -1) { if (errno == EINTR) goto again; if (errno == ENOBUFS) errno = EAGAIN; return (-1); } if (n == 0) { /* connection closed */ errno = 0; return (0); } /* * assumption: fd got sent if sendmsg sent anything * this works because fds are passed one at a time */ if (buf != NULL && buf->fd != -1) { close(buf->fd); buf->fd = -1; } msgbuf_drain(msgbuf, n); return (1); } static void ibuf_enqueue(struct msgbuf *msgbuf, struct ibuf *buf) { TAILQ_INSERT_TAIL(&msgbuf->bufs, buf, entry); msgbuf->queued++; } static void ibuf_dequeue(struct msgbuf *msgbuf, struct ibuf *buf) { TAILQ_REMOVE(&msgbuf->bufs, buf, entry); if (buf->fd != -1) close(buf->fd); msgbuf->queued--; ibuf_free(buf); } Index: head/devel/got/files/openbsd-compat/imsg.c =================================================================== --- head/devel/got/files/openbsd-compat/imsg.c (revision 549939) +++ head/devel/got/files/openbsd-compat/imsg.c (revision 549940) @@ -1,302 +1,304 @@ /* $OpenBSD: imsg.c,v 1.16 2017/12/14 09:27:44 kettenis Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include #include #include #include #include #include #include +#include + #include "imsg.h" int imsg_fd_overhead = 0; static int imsg_get_fd(struct imsgbuf *); void imsg_init(struct imsgbuf *ibuf, int fd) { msgbuf_init(&ibuf->w); memset(&ibuf->r, 0, sizeof(ibuf->r)); ibuf->fd = fd; ibuf->w.fd = fd; ibuf->pid = getpid(); TAILQ_INIT(&ibuf->fds); } ssize_t imsg_read(struct imsgbuf *ibuf) { struct msghdr msg; struct cmsghdr *cmsg; union { struct cmsghdr hdr; char buf[CMSG_SPACE(sizeof(int) * 1)]; } cmsgbuf; struct iovec iov; ssize_t n = -1; int fd; struct imsg_fd *ifd; memset(&msg, 0, sizeof(msg)); memset(&cmsgbuf, 0, sizeof(cmsgbuf)); iov.iov_base = ibuf->r.buf + ibuf->r.wpos; iov.iov_len = sizeof(ibuf->r.buf) - ibuf->r.wpos; msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_control = &cmsgbuf.buf; msg.msg_controllen = sizeof(cmsgbuf.buf); if ((ifd = calloc(1, sizeof(struct imsg_fd))) == NULL) return (-1); again: if (getdtablecount() + imsg_fd_overhead + (int)((CMSG_SPACE(sizeof(int))-CMSG_SPACE(0))/sizeof(int)) >= getdtablesize()) { errno = EAGAIN; free(ifd); return (-1); } if ((n = recvmsg(ibuf->fd, &msg, 0)) == -1) { if (errno == EINTR) goto again; goto fail; } ibuf->r.wpos += n; for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg)) { if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) { int i; int j; /* * We only accept one file descriptor. Due to C * padding rules, our control buffer might contain * more than one fd, and we must close them. */ j = ((char *)cmsg + cmsg->cmsg_len - (char *)CMSG_DATA(cmsg)) / sizeof(int); for (i = 0; i < j; i++) { fd = ((int *)CMSG_DATA(cmsg))[i]; if (ifd != NULL) { ifd->fd = fd; TAILQ_INSERT_TAIL(&ibuf->fds, ifd, entry); ifd = NULL; } else close(fd); } } /* we do not handle other ctl data level */ } fail: free(ifd); return (n); } ssize_t imsg_get(struct imsgbuf *ibuf, struct imsg *imsg) { size_t av, left, datalen; av = ibuf->r.wpos; if (IMSG_HEADER_SIZE > av) return (0); memcpy(&imsg->hdr, ibuf->r.buf, sizeof(imsg->hdr)); if (imsg->hdr.len < IMSG_HEADER_SIZE || imsg->hdr.len > MAX_IMSGSIZE) { errno = ERANGE; return (-1); } if (imsg->hdr.len > av) return (0); datalen = imsg->hdr.len - IMSG_HEADER_SIZE; ibuf->r.rptr = ibuf->r.buf + IMSG_HEADER_SIZE; if (datalen == 0) imsg->data = NULL; else if ((imsg->data = malloc(datalen)) == NULL) return (-1); if (imsg->hdr.flags & IMSGF_HASFD) imsg->fd = imsg_get_fd(ibuf); else imsg->fd = -1; memcpy(imsg->data, ibuf->r.rptr, datalen); if (imsg->hdr.len < av) { left = av - imsg->hdr.len; memmove(&ibuf->r.buf, ibuf->r.buf + imsg->hdr.len, left); ibuf->r.wpos = left; } else ibuf->r.wpos = 0; return (datalen + IMSG_HEADER_SIZE); } int imsg_compose(struct imsgbuf *ibuf, uint32_t type, uint32_t peerid, pid_t pid, int fd, const void *data, uint16_t datalen) { struct ibuf *wbuf; if ((wbuf = imsg_create(ibuf, type, peerid, pid, datalen)) == NULL) return (-1); if (imsg_add(wbuf, data, datalen) == -1) return (-1); wbuf->fd = fd; imsg_close(ibuf, wbuf); return (1); } int imsg_composev(struct imsgbuf *ibuf, uint32_t type, uint32_t peerid, pid_t pid, int fd, const struct iovec *iov, int iovcnt) { struct ibuf *wbuf; int i, datalen = 0; for (i = 0; i < iovcnt; i++) datalen += iov[i].iov_len; if ((wbuf = imsg_create(ibuf, type, peerid, pid, datalen)) == NULL) return (-1); for (i = 0; i < iovcnt; i++) if (imsg_add(wbuf, iov[i].iov_base, iov[i].iov_len) == -1) return (-1); wbuf->fd = fd; imsg_close(ibuf, wbuf); return (1); } /* ARGSUSED */ struct ibuf * imsg_create(struct imsgbuf *ibuf, uint32_t type, uint32_t peerid, pid_t pid, uint16_t datalen) { struct ibuf *wbuf; struct imsg_hdr hdr; datalen += IMSG_HEADER_SIZE; if (datalen > MAX_IMSGSIZE) { errno = ERANGE; return (NULL); } hdr.type = type; hdr.flags = 0; hdr.peerid = peerid; if ((hdr.pid = pid) == 0) hdr.pid = ibuf->pid; if ((wbuf = ibuf_dynamic(datalen, MAX_IMSGSIZE)) == NULL) { return (NULL); } if (imsg_add(wbuf, &hdr, sizeof(hdr)) == -1) return (NULL); return (wbuf); } int imsg_add(struct ibuf *msg, const void *data, uint16_t datalen) { if (datalen) if (ibuf_add(msg, data, datalen) == -1) { ibuf_free(msg); return (-1); } return (datalen); } void imsg_close(struct imsgbuf *ibuf, struct ibuf *msg) { struct imsg_hdr *hdr; hdr = (struct imsg_hdr *)msg->buf; hdr->flags &= ~IMSGF_HASFD; if (msg->fd != -1) hdr->flags |= IMSGF_HASFD; hdr->len = (uint16_t)msg->wpos; ibuf_close(&ibuf->w, msg); } void imsg_free(struct imsg *imsg) { freezero(imsg->data, imsg->hdr.len - IMSG_HEADER_SIZE); } static int imsg_get_fd(struct imsgbuf *ibuf) { int fd; struct imsg_fd *ifd; if ((ifd = TAILQ_FIRST(&ibuf->fds)) == NULL) return (-1); fd = ifd->fd; TAILQ_REMOVE(&ibuf->fds, ifd, entry); free(ifd); return (fd); } int imsg_flush(struct imsgbuf *ibuf) { while (ibuf->w.queued) if (msgbuf_write(&ibuf->w) <= 0) return (-1); return (0); } void imsg_clear(struct imsgbuf *ibuf) { int fd; msgbuf_clear(&ibuf->w); while ((fd = imsg_get_fd(ibuf)) != -1) close(fd); } Index: head/devel/got/files/openbsd-compat/openbsd-compat.h =================================================================== --- head/devel/got/files/openbsd-compat/openbsd-compat.h (nonexistent) +++ head/devel/got/files/openbsd-compat/openbsd-compat.h (revision 549940) @@ -0,0 +1,78 @@ +/* + * Compatibility mappings for system headers and + * prototypes for functions in libopenbsd-compat. + */ + +#ifndef _OPENBSD_COMPAT_H_ +#define _OPENBSD_COMPAT_H_ + +/* + * + */ +#define __dead __dead2 + +/* + * + */ +#define SIMPLEQ_HEAD(name, type) \ + STAILQ_HEAD(name, type) +#define SIMPLEQ_HEAD_INITIALIZER(head) \ + STAILQ_HEAD_INITIALIZER(head) +#define SIMPLEQ_ENTRY(type) \ + STAILQ_ENTRY(type) +#define SIMPLEQ_FIRST(head) \ + STAILQ_FIRST(head) +#define SIMPLEQ_END(head) \ + NULL +#define SIMPLEQ_EMPTY(head) \ + STAILQ_EMPTY(head) +#define SIMPLEQ_NEXT(elm, field) \ + STAILQ_NEXT(elm, field) +#define SIMPLEQ_FOREACH(var, head, field) \ + STAILQ_FOREACH(var, head, field) +#define SIMPLEQ_FOREACH_SAFE(var, head, field, tvar) \ + STAILQ_FOREACH_SAFE(var, head, field, tvar) +#define SIMPLEQ_INIT(head) \ + STAILQ_INIT(head) +#define SIMPLEQ_INSERT_HEAD(head, elm, field) \ + STAILQ_INSERT_HEAD(head, elm, field) +#define SIMPLEQ_INSERT_TAIL(head, elm, field) \ + STAILQ_INSERT_TAIL(head, elm, field) +#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) \ + STAILQ_INSERT_AFTER(head, listelm, elm, field) +#define SIMPLEQ_REMOVE_HEAD(head, field) \ + STAILQ_REMOVE_HEAD(head, field) +#define SIMPLEQ_REMOVE_AFTER(head, elm, field) \ + STAILQ_REMOVE_AFTER(head, elm, field) +#define SIMPLEQ_CONCAT(head1, head2) \ + STAILQ_CONCAT(head1, head2) + +/* + * + */ +#undef basename +#undef dirname +#define basename(path) basename_const(path) +#define dirname(path) dirname_const(path) + +char *basename(const char *); +char *dirname(const char *); + +/* + * + */ +void freezero(void *, size_t); +void *recallocarray(void *, size_t, size_t, size_t); + +/* + * + */ +int getdtablecount(void); + +/* void -> int */ +#define closefrom(fd) (closefrom(fd), 0) + +#define pledge(promises, execpromises) 0 +#define unveil(path, permissions) 0 + +#endif /* _OPENBSD_COMPAT_H_ */ Property changes on: head/devel/got/files/openbsd-compat/openbsd-compat.h ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +on \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property