tOpenBSD support. - plan9port - [fork] Plan 9 from user space | |
git clone git://src.adamsgaard.dk/plan9port | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 52e6164443782187e17e22f7ccddd0d9a25006e4 | |
parent cea10000c59882b43525e4fd4fb17a55b7dba1c1 | |
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(-) | |
--- | |
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 | |
diff --git a/include/libc.h b/include/libc.h | |
t@@ -638,7 +638,7 @@ extern void freenetconninfo(NetConnI… | |
#define DMWRITE 0x2 /* mode bit for write permis… | |
#define DMEXEC 0x1 /* mode bit for execute permi… | |
-#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); | |
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> | |
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… | |
+ OBJTYPE=`uname -m | sed 's;i.86;386;; s;amd64;x86_64;; s;/.*;;; s; ;;g… | |
PATH=`pwd`/../bin:$$PATH export PATH; \ | |
PLAN9=`pwd`/.. export PLAN9; \ | |
sh -x mkmk.sh | |
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; | |
} | |
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 | |
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'` | |