OpenBSD support.

This commit is contained in:
rsc 2005-05-01 18:40:01 +00:00
parent cea10000c5
commit 52e6164443
7 changed files with 35 additions and 33 deletions

2
bin/9l
View file

@ -169,7 +169,7 @@ case "$tag" in
*OpenBSD*) *OpenBSD*)
ld=gcc ld=gcc
userpath=true userpath=true
extralibs="$extralibs -lutil -lpthread" extralibs="$extralibs -lutil"
;; ;;
*FreeBSD*) *FreeBSD*)
ld=gcc ld=gcc

View file

@ -638,7 +638,7 @@ extern void freenetconninfo(NetConnInfo*);
#define DMWRITE 0x2 /* mode bit for write permission */ #define DMWRITE 0x2 /* mode bit for write permission */
#define DMEXEC 0x1 /* mode bit for execute permission */ #define DMEXEC 0x1 /* mode bit for execute permission */
#if defined(__FreeBSD__) #ifdef RFMEM /* FreeBSD, OpenBSD */
#undef RFFDG #undef RFFDG
#undef RFNOTEG #undef RFNOTEG
#undef RFPROC #undef RFPROC
@ -832,6 +832,10 @@ extern int post9pservice(int, char*);
# endif # endif
#endif #endif
#ifdef __OpenBSD__
#define sched_yield() syscall(302) /* what is this? */
#endif
/* command line */ /* command line */
extern char *argv0; extern char *argv0;
extern void __fixargv0(void); extern void __fixargv0(void);

View file

@ -81,7 +81,10 @@ typedef long p9jmp_buf[sizeof(sigjmp_buf)/sizeof(long)];
# undef _NEEDUSHORT # undef _NEEDUSHORT
# undef _NEEDUINT # undef _NEEDUINT
# undef _NEEDULONG # undef _NEEDULONG
# undef PLAN9PORT_USING_PTHREADS #elif defined(__OpenBSD__)
# undef _NEEDUSHORT
# undef _NEEDUINT
# undef _NEEDULONG
#else #else
/* No idea what system this is -- try some defaults */ /* No idea what system this is -- try some defaults */
# include <pthread.h> # include <pthread.h>

View file

@ -1,6 +1,6 @@
../bin/mk: mkmk.sh ../bin/mk: mkmk.sh
SYSNAME=`uname` export SYSNAME; \ 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; \ PATH=`pwd`/../bin:$$PATH export PATH; \
PLAN9=`pwd`/.. export PLAN9; \ PLAN9=`pwd`/.. export PLAN9; \
sh -x mkmk.sh sh -x mkmk.sh

View file

@ -6,20 +6,15 @@
#include <unistd.h> #include <unistd.h>
#include <errno.h> #include <errno.h>
typedef struct Sendfd Sendfd;
struct Sendfd {
struct cmsghdr cmsg;
int fd;
};
int int
sendfd(int s, int fd) sendfd(int s, int fd)
{ {
char buf[1]; char buf[1];
struct iovec iov; struct iovec iov;
struct msghdr msg; struct msghdr msg;
struct cmsghdr *cmsg;
int n; int n;
Sendfd sfd; char cms[CMSG_SPACE(sizeof(int))];
buf[0] = 0; buf[0] = 0;
iov.iov_base = buf; iov.iov_base = buf;
@ -28,14 +23,14 @@ sendfd(int s, int fd)
memset(&msg, 0, sizeof msg); memset(&msg, 0, sizeof msg);
msg.msg_iov = &iov; msg.msg_iov = &iov;
msg.msg_iovlen = 1; msg.msg_iovlen = 1;
msg.msg_control = (caddr_t)cms;
msg.msg_controllen = CMSG_LEN(sizeof(int));
sfd.cmsg.cmsg_len = sizeof sfd; cmsg = CMSG_FIRSTHDR(&msg);
sfd.cmsg.cmsg_level = SOL_SOCKET; cmsg->cmsg_len = CMSG_LEN(sizeof(int));
sfd.cmsg.cmsg_type = SCM_RIGHTS; cmsg->cmsg_level = SOL_SOCKET;
sfd.fd = fd; cmsg->cmsg_type = SCM_RIGHTS;
*(int*)CMSG_DATA(cmsg) = fd;
msg.msg_control = (caddr_t)&sfd;
msg.msg_controllen = sizeof sfd;
if((n=sendmsg(s, &msg, 0)) != iov.iov_len) if((n=sendmsg(s, &msg, 0)) != iov.iov_len)
return -1; return -1;
@ -46,10 +41,12 @@ int
recvfd(int s) recvfd(int s)
{ {
int n; int n;
int fd;
char buf[1]; char buf[1];
struct iovec iov; struct iovec iov;
struct msghdr msg; struct msghdr msg;
Sendfd sfd; struct cmsghdr *cmsg;
char cms[CMSG_SPACE(sizeof(int))];
iov.iov_base = buf; iov.iov_base = buf;
iov.iov_len = 1; iov.iov_len = 1;
@ -60,20 +57,13 @@ recvfd(int s)
msg.msg_iov = &iov; msg.msg_iov = &iov;
msg.msg_iovlen = 1; msg.msg_iovlen = 1;
memset(&sfd, 0, sizeof sfd); msg.msg_control = (caddr_t)cms;
sfd.fd = -1; msg.msg_controllen = sizeof cms;
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;
if((n=recvmsg(s, &msg, 0)) < 0) if((n=recvmsg(s, &msg, 0)) < 0)
return -1; return -1;
if(n==0 && sfd.fd==-1){
werrstr("eof in recvfd"); cmsg = CMSG_FIRSTHDR(&msg);
return -1; fd = *(int*)CMSG_DATA(cmsg);
} return fd;
return sfd.fd;
} }

View file

@ -9,6 +9,10 @@
%.$O: %.s %.$O: %.s
$AS $AFLAGS $stem.s $AS $AFLAGS $stem.s
# OpenBSD needs this; sigh
%.$O: %.S
$CC $CFLAGS $stem.S
y.tab.h y.tab.c: $YFILES y.tab.h y.tab.c: $YFILES
$YACC $YFLAGS $prereq $YACC $YFLAGS $prereq

View file

@ -5,6 +5,7 @@ OBJTYPE=`uname -m | sed '
s;/.*;;; s;/.*;;;
s; ;;g; s; ;;g;
s;PowerMacintosh;power;g; s;PowerMacintosh;power;g;
s;macppc;power;g;
s;ppc64;power;g; s;ppc64;power;g;
s;ppc;power;g'` s;ppc;power;g'`