tOpenBSD support. - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 52e6164443782187e17e22f7ccddd0d9a25006e4
 (DIR) parent cea10000c59882b43525e4fd4fb17a55b7dba1c1
 (HTM) Author: rsc <devnull@localhost>
       Date:   Sun,  1 May 2005 18:40:01 +0000
       
       OpenBSD support.
       
       Diffstat:
         M bin/9l                              |       2 +-
         M include/libc.h                      |       6 +++++-
         M include/u.h                         |       5 ++++-
         M src/Makefile                        |       2 +-
         M src/lib9/sendfd.c                   |      48 ++++++++++++-------------------
         M src/mkcommon                        |       4 ++++
         M src/mkhdr                           |       1 +
       
       7 files changed, 35 insertions(+), 33 deletions(-)
       ---
 (DIR) diff --git a/bin/9l b/bin/9l
       t@@ -169,7 +169,7 @@ case "$tag" in
        *OpenBSD*)
                ld=gcc
                userpath=true
       -        extralibs="$extralibs -lutil -lpthread"
       +        extralibs="$extralibs -lutil"
                ;;
        *FreeBSD*)
                ld=gcc
 (DIR) diff --git a/include/libc.h b/include/libc.h
       t@@ -638,7 +638,7 @@ extern        void                freenetconninfo(NetConnInfo*);
        #define DMWRITE                0x2                /* mode bit for write permission */
        #define DMEXEC                0x1                /* mode bit for execute permission */
        
       -#if defined(__FreeBSD__)
       +#ifdef RFMEM        /* FreeBSD, OpenBSD */
        #undef RFFDG
        #undef RFNOTEG
        #undef RFPROC
       t@@ -832,6 +832,10 @@ extern        int        post9pservice(int, char*);
        #        endif
        #endif
        
       +#ifdef __OpenBSD__
       +#define sched_yield()        syscall(302)        /* what is this? */
       +#endif
       +
        /* command line */
        extern char        *argv0;
        extern void __fixargv0(void);
 (DIR) diff --git a/include/u.h b/include/u.h
       t@@ -81,7 +81,10 @@ typedef long p9jmp_buf[sizeof(sigjmp_buf)/sizeof(long)];
        #        undef _NEEDUSHORT
        #        undef _NEEDUINT
        #        undef _NEEDULONG
       -#        undef PLAN9PORT_USING_PTHREADS
       +#elif defined(__OpenBSD__)
       +#        undef _NEEDUSHORT
       +#        undef _NEEDUINT
       +#        undef _NEEDULONG
        #else
                /* No idea what system this is -- try some defaults */
        #        include <pthread.h>
 (DIR) diff --git a/src/Makefile b/src/Makefile
       t@@ -1,6 +1,6 @@
        ../bin/mk: mkmk.sh
                SYSNAME=`uname` export SYSNAME; \
       -        OBJTYPE=`uname -m | sed 's;i.86;386;; s;amd64;x86_64;; s;/.*;;; s; ;;g; s/PowerMacintosh/power/; s/ppc64/power/g; s/ppc/power/g'` export OBJTYPE; \
       +        OBJTYPE=`uname -m | sed 's;i.86;386;; s;amd64;x86_64;; s;/.*;;; s; ;;g; s/PowerMacintosh/power/; s/macppc/power/g; s/ppc64/power/g; s/ppc/power/g'` export OBJTYPE; \
                PATH=`pwd`/../bin:$$PATH export PATH; \
                PLAN9=`pwd`/.. export PLAN9; \
                sh -x mkmk.sh
 (DIR) diff --git a/src/lib9/sendfd.c b/src/lib9/sendfd.c
       t@@ -6,21 +6,16 @@
        #include <unistd.h>
        #include <errno.h>
        
       -typedef struct Sendfd Sendfd;
       -struct Sendfd {
       -        struct cmsghdr cmsg;
       -        int fd;
       -};
       -
        int
        sendfd(int s, int fd)
        {
                char buf[1];
                struct iovec iov;
                struct msghdr msg;
       +        struct cmsghdr *cmsg;
                int n;
       -        Sendfd sfd;
       -
       +        char cms[CMSG_SPACE(sizeof(int))];
       +        
                buf[0] = 0;
                iov.iov_base = buf;
                iov.iov_len = 1;
       t@@ -28,14 +23,14 @@ sendfd(int s, int fd)
                memset(&msg, 0, sizeof msg);
                msg.msg_iov = &iov;
                msg.msg_iovlen = 1;
       +        msg.msg_control = (caddr_t)cms;
       +        msg.msg_controllen = CMSG_LEN(sizeof(int));
        
       -        sfd.cmsg.cmsg_len = sizeof sfd;
       -        sfd.cmsg.cmsg_level = SOL_SOCKET;
       -        sfd.cmsg.cmsg_type = SCM_RIGHTS;
       -        sfd.fd = fd;
       -
       -        msg.msg_control = (caddr_t)&sfd;
       -        msg.msg_controllen = sizeof sfd;
       +        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) = fd;
        
                if((n=sendmsg(s, &msg, 0)) != iov.iov_len)
                        return -1;
       t@@ -46,10 +41,12 @@ int
        recvfd(int s)
        {
                int n;
       +        int fd;
                char buf[1];
                struct iovec iov;
                struct msghdr msg;
       -        Sendfd sfd;
       +        struct cmsghdr *cmsg;
       +        char cms[CMSG_SPACE(sizeof(int))];
        
                iov.iov_base = buf;
                iov.iov_len = 1;
       t@@ -60,20 +57,13 @@ recvfd(int s)
                msg.msg_iov = &iov;
                msg.msg_iovlen = 1;
        
       -        memset(&sfd, 0, sizeof sfd);
       -        sfd.fd = -1;
       -        sfd.cmsg.cmsg_len = sizeof sfd;
       -        sfd.cmsg.cmsg_level = SOL_SOCKET;
       -        sfd.cmsg.cmsg_type = SCM_RIGHTS;
       -
       -        msg.msg_control = (caddr_t)&sfd;
       -        msg.msg_controllen = sizeof sfd;
       +        msg.msg_control = (caddr_t)cms;
       +        msg.msg_controllen = sizeof cms;
        
                if((n=recvmsg(s, &msg, 0)) < 0)
                        return -1;
       -        if(n==0 && sfd.fd==-1){
       -                werrstr("eof in recvfd");
       -                return -1;
       -        }
       -        return sfd.fd;
       +
       +        cmsg = CMSG_FIRSTHDR(&msg);
       +        fd = *(int*)CMSG_DATA(cmsg);
       +        return fd;
        }
 (DIR) diff --git a/src/mkcommon b/src/mkcommon
       t@@ -9,6 +9,10 @@
        %.$O:        %.s
                $AS $AFLAGS $stem.s
        
       +# OpenBSD needs this; sigh
       +%.$O:        %.S
       +        $CC $CFLAGS $stem.S
       +        
        y.tab.h y.tab.c:        $YFILES
                $YACC $YFLAGS $prereq
        
 (DIR) diff --git a/src/mkhdr b/src/mkhdr
       t@@ -5,6 +5,7 @@ OBJTYPE=`uname -m | sed '
                s;/.*;;;
                s; ;;g;
                s;PowerMacintosh;power;g;
       +        s;macppc;power;g;
                s;ppc64;power;g;
                s;ppc;power;g'`