summaryrefslogtreecommitdiff
path: root/mit-pthreads/machdep/engine-i386-sco-3.2v5.c
diff options
context:
space:
mode:
Diffstat (limited to 'mit-pthreads/machdep/engine-i386-sco-3.2v5.c')
-rwxr-xr-xmit-pthreads/machdep/engine-i386-sco-3.2v5.c1072
1 files changed, 1072 insertions, 0 deletions
diff --git a/mit-pthreads/machdep/engine-i386-sco-3.2v5.c b/mit-pthreads/machdep/engine-i386-sco-3.2v5.c
new file mode 100755
index 00000000000..95f0d757585
--- /dev/null
+++ b/mit-pthreads/machdep/engine-i386-sco-3.2v5.c
@@ -0,0 +1,1072 @@
+
+/* ==== machdep.c ============================================================
+ * Copyright (c) 1995 by Chris Provenzano, proven@mit.edu
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Chris Provenzano.
+ * 4. The name of Chris Provenzano may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY CHRIS PROVENZANO ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL CHRIS PROVENZANO BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Description : Machine dependent functions for SCO3.2v5 on i386
+ *
+ * 1.00 96/11/21 proven
+ * -Started coding this file.
+ */
+
+#ifndef lint
+static const char rcsid[] = "engine-i386-freebsd-2.0.c,v 1.1 1995/03/01 01:21:20 proven Exp";
+#endif
+
+#include <pthread.h>
+#include <sys/types.h>
+#include <sys/timeb.h>
+#include <sys/stat.h>
+#include <stropts.h>
+#include <sys/socket.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <errno.h>
+#include <sys/unistd.h>
+#include <sys/utsname.h>
+#include <sys/sysi86.h>
+
+void machdep_sys_abort(char*fname,int lineno)
+
+{
+ char buf[128];
+
+ sprintf(buf,"panic: %s => %d\n", fname, lineno);
+ machdep_sys_write(1, buf, strlen(buf));
+ abort();
+}
+
+#if 0
+int setitimer(int which, struct itimerval* value, struct itimerval* ovalue)
+
+{
+ register int ret;
+ if ((ret = machdep_sys_setitimer(which,value,ovalue))<0) {
+ errno = -ret;
+ return -1;
+ }
+ else {
+ return 0;
+ }
+}
+#endif
+
+/* ==========================================================================
+ * machdep_save_state()
+ */
+int machdep_save_state(void)
+{
+ return(setjmp(pthread_run->machdep_data.machdep_state));
+}
+
+/* ==========================================================================
+ * machdep_save_state()
+ */
+int machdep_save_float_state(struct pthread * pthread)
+{
+ char * fdata = (char *)pthread->machdep_data.machdep_float_state;
+ __asm__ ("fsave %0"::"m" (*fdata));
+}
+
+/* ==========================================================================
+ * machdep_restore_state()
+ */
+void machdep_restore_state(void)
+{
+ longjmp(pthread_run->machdep_data.machdep_state, 1);
+}
+
+/* ==========================================================================
+ * machdep_restore_float_state()
+ */
+int machdep_restore_float_state(void)
+{
+ char * fdata = (char *)pthread_run->machdep_data.machdep_float_state;
+ __asm__ ("frstor %0"::"m" (*fdata));
+}
+
+/* ==========================================================================
+ * machdep_set_thread_timer()
+ */
+void machdep_set_thread_timer(struct machdep_pthread *machdep_pthread)
+{
+ if (machdep_sys_setitimer(ITIMER_VIRTUAL, &(machdep_pthread->machdep_timer), NULL)) {
+ PANIC();
+ }
+}
+
+/* ==========================================================================
+ * machdep_unset_thread_timer()
+ */
+void machdep_unset_thread_timer(struct machdep_pthread *machdep_pthread)
+{
+ struct itimerval zeroval = { { 0, 0 }, { 0, 0 } };
+ int ret;
+
+ if (machdep_pthread) {
+ ret = machdep_sys_setitimer(ITIMER_VIRTUAL, &zeroval,
+ &(machdep_pthread->machdep_timer));
+ } else {
+ ret = machdep_sys_setitimer(ITIMER_VIRTUAL, &zeroval, NULL);
+ }
+
+ if (ret) {
+ PANIC();
+ }
+}
+
+/* ==========================================================================
+ * machdep_pthread_cleanup()
+ */
+void *machdep_pthread_cleanup(struct machdep_pthread *machdep_pthread)
+{
+ return(machdep_pthread->machdep_stack);
+}
+
+/* ==========================================================================
+ * machdep_pthread_start()
+ */
+void machdep_pthread_start(void)
+{
+ context_switch_done();
+ pthread_sched_resume();
+
+ /* Run current threads start routine with argument */
+ pthread_exit(pthread_run->machdep_data.start_routine
+ (pthread_run->machdep_data.start_argument));
+
+ /* should never reach here */
+ PANIC();
+}
+
+/* ==========================================================================
+ * __machdep_stack_free()
+ */
+void __machdep_stack_free(void * stack)
+{
+ free(stack);
+}
+
+/* ==========================================================================
+ * __machdep_stack_alloc()
+ */
+void * __machdep_stack_alloc(size_t size)
+{
+ void * stack;
+
+ return(malloc(size));
+}
+
+/* ==========================================================================
+ * __machdep_pthread_create()
+ */
+void __machdep_pthread_create(struct machdep_pthread *machdep_pthread,
+ void *(* start_routine)(), void *start_argument,
+ long stack_size, long nsec, long flags)
+{
+ machdep_pthread->start_routine = start_routine;
+ machdep_pthread->start_argument = start_argument;
+
+ machdep_pthread->machdep_timer.it_value.tv_sec = 0;
+ machdep_pthread->machdep_timer.it_interval.tv_sec = 0;
+ machdep_pthread->machdep_timer.it_interval.tv_usec = 0;
+ machdep_pthread->machdep_timer.it_value.tv_usec = nsec / 1000;
+
+ setjmp(machdep_pthread->machdep_state);
+ /*
+ * Set up new stact frame so that it looks like it
+ * returned from a longjmp() to the beginning of
+ * machdep_pthread_start().
+ */
+ machdep_pthread->machdep_state[JB_PC] = (int)machdep_pthread_start;
+
+ /* Stack starts high and builds down. */
+ machdep_pthread->machdep_state[JB_SP] =
+ (int)machdep_pthread->machdep_stack + stack_size;
+}
+
+/* ==========================================================================
+ * machdep_sys_wait3()
+ */
+machdep_sys_wait3(int * b, int c, int * d)
+{
+#if 0
+ return(machdep_sys_wait4(0, b, c, d));
+#else
+ return -ENOSYS;
+#endif
+}
+
+/* ==========================================================================
+ * machdep_sys_fstat()
+ */
+machdep_sys_fstat(int f, struct stat* b)
+{
+ return machdep_sys_fxstat(0x33, f, b);
+}
+
+/* ==========================================================================
+ * machdep_sys_dup2()
+ */
+machdep_sys_dup2(int a, int b)
+{
+ machdep_sys_close(b);
+ return machdep_sys_fcntl(a, F_DUPFD, b);
+}
+
+/* ==========================================================================
+ * machdep_sys_getdtablesize()
+ */
+machdep_sys_getdtablesize()
+
+{
+ register int ret;
+ if ((ret = machdep_sys_sysconf(_SC_OPEN_MAX))<0)
+ PANIC();
+ return ret;
+}
+
+/* ==========================================================================
+ * machdep_sys_fchown()
+ */
+machdep_sys_fchown(int fd,uid_t owner,gid_t group)
+
+{
+ return -ENOSYS;
+}
+
+/* ==========================================================================
+ * machdep_sys_fchmod()
+ */
+machdep_sys_fchmod(int fd,mode_t mode)
+
+{
+ return -ENOSYS;
+}
+
+/* ==========================================================================
+ * machdep_sys_getdirentries()
+ */
+int machdep_sys_getdirentries(int fd, char * buf, int len, int * seek)
+{
+ return(machdep_sys_getdents(fd, buf, len));
+}
+
+/* ==========================================================================
+ * SCO Socket calls are a bit different
+ * ==========================================================================
+ * machdep_sys_socket()
+ */
+int machdep_sys_socket(int domain, int type, int protocol)
+{
+ register int s, fd, ret;
+ struct socksysreq req;
+
+ if ((s = machdep_sys_open("/dev/socksys", 0))<0)
+ return s;
+
+ req.args[0] = SO_SOCKET;
+ req.args[1] = (int)domain;
+ req.args[2] = (int)type;
+ req.args[3] = (int)protocol;
+ if ((fd = machdep_sys_ioctl(s, SIOCSOCKSYS, &req))<0) {
+ machdep_sys_close(s);
+ return fd;
+ }
+
+ if ((ret=machdep_sys_dup2(fd, s))<0) {
+ machdep_sys_close(fd);
+ return ret;
+ }
+
+ machdep_sys_close(fd);
+ return s;
+
+}
+
+/* ==========================================================================
+ * machdep_sys_accept()
+ */
+int machdep_sys_accept(int s, struct sockaddr * b, int * c)
+{
+ struct socksysreq req;
+
+ req.args[0] = SO_ACCEPT;
+ req.args[1] = (int)s;
+ req.args[2] = (int)b;
+ req.args[3] = (int)c;
+
+ return(machdep_sys_ioctl(s, SIOCSOCKSYS, &req));
+}
+
+/* ==========================================================================
+ * machdep_sys_bind()
+ */
+int machdep_sys_bind(int s, const struct sockaddr * b, int c)
+{
+ struct socksysreq req;
+
+ req.args[0] = SO_BIND;
+ req.args[1] = (int)s;
+ req.args[2] = (int)b;
+ req.args[3] = (int)c;
+
+ return(machdep_sys_ioctl(s, SIOCSOCKSYS, &req));
+}
+
+/* ==========================================================================
+ * machdep_sys_connect()
+ */
+int machdep_sys_connect(int s, const struct sockaddr * b, int c)
+{
+ struct socksysreq req;
+
+ req.args[0] = SO_CONNECT;
+ req.args[1] = (int)s;
+ req.args[2] = (int)b;
+ req.args[3] = (int)c;
+
+ return(machdep_sys_ioctl(s, SIOCSOCKSYS, &req));
+}
+
+/* ==========================================================================
+ * machdep_sys_listen()
+ */
+int machdep_sys_listen(int s, int backlog)
+{
+ struct socksysreq req;
+
+ req.args[0] = SO_LISTEN;
+ req.args[1] = (int)s;
+ req.args[2] = (int)backlog;
+
+ return(machdep_sys_ioctl(s, SIOCSOCKSYS, &req));
+}
+
+/* ==========================================================================
+ * machdep_sys_shutdown()
+ */
+int machdep_sys_shutdown(int s, int b)
+{
+ struct socksysreq req;
+
+ req.args[0] = SO_SHUTDOWN;
+ req.args[1] = (int)s;
+ req.args[2] = (int)b;
+
+ return(machdep_sys_ioctl(s, SIOCSOCKSYS, &req));
+}
+
+/* ==========================================================================
+ * machdep_sys_getsockopt()
+ */
+int machdep_sys_getsockopt(int s, int b, int c, char *d, int *e)
+{
+ struct socksysreq req;
+
+ req.args[0] = SO_GETSOCKOPT;
+ req.args[1] = (int)s;
+ req.args[2] = (int)b;
+ req.args[3] = (int)c;
+ req.args[4] = (int)d;
+ req.args[5] = (int)e;
+
+ return(machdep_sys_ioctl(s, SIOCSOCKSYS, &req));
+}
+
+/* ==========================================================================
+ * machdep_sys_setsockopt()
+ */
+int machdep_sys_setsockopt(int s, int b, int c, char *d, int e)
+{
+ struct socksysreq req;
+
+ req.args[0] = SO_SETSOCKOPT;
+ req.args[1] = (int)s;
+ req.args[2] = (int)b;
+ req.args[3] = (int)c;
+ req.args[4] = (int)d;
+ req.args[5] = (int)e;
+
+ return(machdep_sys_ioctl(s, SIOCSOCKSYS, &req));
+}
+
+/* ==========================================================================
+ * machdep_sys_getpeername()
+ */
+int machdep_sys_getpeername(int s, struct sockaddr *b, int *c)
+{
+ struct socksysreq req;
+
+ req.args[0] = SO_GETPEERNAME;
+ req.args[1] = (int)s;
+ req.args[2] = (int)b;
+ req.args[3] = (int)c;
+
+ return(machdep_sys_ioctl(s, SIOCSOCKSYS, &req));
+}
+
+/* ==========================================================================
+ * machdep_sys_send()
+ */
+int machdep_sys_send(int s, char *b, int c, int d)
+{
+ struct socksysreq req;
+
+ req.args[0] = SO_SEND;
+ req.args[1] = (int)s;
+ req.args[2] = (int)b;
+ req.args[3] = (int)c;
+ req.args[4] = (int)d;
+
+ return(machdep_sys_ioctl(s, SIOCSOCKSYS, &req));
+}
+
+/* ==========================================================================
+ * machdep_sys_sendto()
+ */
+int machdep_sys_sendto(int s, char *b, int c, int d,
+ struct sockaddr *e, int f)
+{
+ struct socksysreq req;
+
+ req.args[0] = SO_SENDTO;
+ req.args[1] = (int)s;
+ req.args[2] = (int)b;
+ req.args[3] = (int)c;
+ req.args[4] = (int)d;
+ req.args[5] = (int)e;
+ req.args[6] = (int)f;
+
+ return(machdep_sys_ioctl(s, SIOCSOCKSYS, &req));
+}
+
+/* ==========================================================================
+ * machdep_sys_recv()
+ */
+int machdep_sys_recv(int s, char *b, int c, int d)
+{
+ struct socksysreq req;
+
+ req.args[0] = SO_RECV;
+ req.args[1] = (int)s;
+ req.args[2] = (int)b;
+ req.args[3] = (int)c;
+ req.args[4] = (int)d;
+
+ return(machdep_sys_ioctl(s, SIOCSOCKSYS, &req));
+}
+
+/* ==========================================================================
+ * machdep_sys_recvfrom()
+ */
+int machdep_sys_recvfrom(int s, char *buf, int len, int flags,
+ struct sockaddr *from, int *fromlen)
+{
+ struct socksysreq req;
+
+ req.args[0] = SO_RECVFROM;
+ req.args[1] = (int)s;
+ req.args[2] = (int)buf;
+ req.args[3] = (int)len;
+ req.args[4] = (int)flags;
+ req.args[5] = (int)from;
+ req.args[6] = (int)fromlen;
+
+ return(machdep_sys_ioctl(s, SIOCSOCKSYS, &req));
+}
+
+/* ==========================================================================
+ * machdep_sys_socketpair()
+ */
+int machdep_sys_socketpair(int d, int type, int protocol, int sv[2])
+
+{
+ register int s1, s2;
+ register int ret;
+ struct socksysreq req;
+
+ if (d != AF_UNIX)
+ return -EPROTONOSUPPORT;
+ if ((s1=machdep_sys_socket(d,type,protocol))<0) {
+ return s1;
+ }
+ if ((s2=machdep_sys_socket(d,type,protocol))<0) {
+ machdep_sys_close(s1);
+ return s2;
+ }
+ req.args[0] = SO_SOCKPAIR;
+ req.args[1] = s1;
+ req.args[2] = s2;
+ if ((ret=machdep_sys_ioctl(s1,SIOCSOCKSYS,&req))<0) {
+ machdep_sys_close(s1);
+ machdep_sys_close(s2);
+ return ret;
+ }
+ sv[0] = s1;
+ sv[1] = s2;
+ return 0;
+}
+
+/* ==========================================================================
+ * machdep_sys_getsockname()
+ */
+int machdep_sys_getsockname(int s, char * b, int * c)
+{
+ struct socksysreq req;
+
+ req.args[0] = SO_GETSOCKNAME;
+ req.args[1] = (int)s;
+ req.args[2] = (int)b;
+ req.args[3] = (int)c;
+
+ return(machdep_sys_ioctl(s, SIOCSOCKSYS, &req));
+}
+
+int machdep_sys_sendmsg(int s, const struct msghdr *msg, int flags)
+
+{
+ struct socksysreq req;
+
+ req.args[0] = SO_SENDMSG;
+ req.args[1] = (int)s;
+ req.args[2] = (int)msg;
+ req.args[3] = (int)flags;
+
+ return(machdep_sys_ioctl(s, SIOCSOCKSYS, &req));
+}
+
+int machdep_sys_recvmsg(int s, struct msghdr *msg, int flags)
+
+{
+ struct socksysreq req;
+
+ req.args[0] = SO_RECVMSG;
+ req.args[1] = (int)s;
+ req.args[2] = (int)msg;
+ req.args[3] = (int)flags;
+
+ return(machdep_sys_ioctl(s, SIOCSOCKSYS, &req));
+}
+
+u_short ntohs(u_short n)
+
+{
+ union {
+ unsigned char u_nc[4];
+ u_short u_ns;
+ } ns;
+ register unsigned char* p = &ns.u_nc[0];
+
+ ns.u_ns = n;
+ return (p[0]<<8)|p[1];
+}
+
+u_short htons(u_short h)
+
+{
+ union {
+ unsigned char u_nc[2];
+ u_short u_ns;
+ } ns;
+ register unsigned char* p = &ns.u_nc[0];
+ p[0] = (h>>8)&0xFF;
+ p[1] = (h&0xFF);
+ return ns.u_ns;
+}
+
+
+u_long ntohl(u_long n)
+
+{
+ union {
+ unsigned char u_nc[4];
+ u_long u_nl;
+ } nl;
+ register unsigned char* p = &nl.u_nc[0];
+
+ nl.u_nl = n;
+ return (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3];
+}
+
+u_long htonl(u_long h)
+
+{
+ union {
+ unsigned char u_nc[4];
+ u_long u_nl;
+ } nl;
+ register unsigned char* p = &nl.u_nc[0];
+ p[0] = (h>>24)&0xFF;
+ p[1] = (h>>16)&0xFF;
+ p[2] = (h>>8)&0xFF;
+ p[3] = (h&0xFF);
+ return nl.u_nl;
+}
+
+int getdomainname(char* domain,int len)
+
+{
+ /* edi = len */
+ struct socksysreq req;
+ register int ret, fd;
+ if (len>MAXHOSTNAMELEN)
+ len = MAXHOSTNAMELEN;
+
+ if ((fd = machdep_sys_open("/dev/socksys", 0)) < 0)
+ return fd;
+
+ req.args[0] = SO_GETIPDOMAIN;
+ req.args[1] = (int)domain;
+ req.args[2] = (int)len;
+ if((ret=machdep_sys_ioctl(fd, SIOCSOCKSYS, &req))<0) {
+ machdep_sys_close(fd);
+ return ret;
+ }
+
+ machdep_sys_close(fd);
+ domain[len-1] = '\0';
+ return 0;
+}
+
+int gethostname(char* name, int namelen)
+
+{
+ struct utsname uts;
+ register int ret, len;
+ char domain[MAXHOSTNAMELEN+1];
+
+ if (name==NULL)
+ return -EFAULT;
+ if ((ret=machdep_sys_uname(&uts))<0)
+ return ret;
+ if (namelen<(len=strlen(uts.nodename)))
+ return -EFAULT;
+ strncpy(name,uts.nodename,len);
+ if (namelen>len)
+ name[len] = '\0';
+ if ((ret=getdomainname(domain, namelen - len))<0)
+ return ret;
+ if (domain[0]=='\0')
+ return 0;
+ if (len + strlen(domain) + 2 > namelen)
+ return -EFAULT;
+ strcat(name, ".");
+ strcat(name, domain);
+ return 0;
+}
+
+int gettimeofday(struct timeval* tp, struct timezone* tz)
+
+{
+ register int ret;
+ if ((ret = machdep_sys_gettimeofday(tp, NULL))<0) {
+ errno = -ret;
+ return -1;
+ }
+ else {
+ return 0;
+ }
+}
+
+int kill(pid_t pid, int signo)
+
+{
+ register int ret;
+ if ((ret = machdep_sys_kill(pid,signo))<0) {
+ errno = -ret;
+ return -1;
+ }
+ else {
+ return 0;
+ }
+}
+
+typedef void (*signal_t(int signo, void (*func)(int)))(int);
+
+signal_t* _libc_signal = NULL;
+
+void (*signal(int signo, void (*func)(int)))(int)
+
+{
+ int ret;
+ void (*oldfunc)(int);
+ extern void (*machdep_sys_signal(int signo, void (*func)(int),int* r))(int);
+ if (_libc_signal!=NULL)
+ return (*_libc_signal)(signo, func);
+
+ oldfunc = machdep_sys_signal(signo, func, &ret);
+ if (ret!=0) {
+ errno = ret;
+ return SIG_ERR;
+ }
+ else {
+ return oldfunc;
+ }
+}
+
+int (*_libc_sigaction)(int ,const struct sigaction *, struct sigaction *) = NULL;
+int sigaction(int sig,const struct sigaction *act, struct sigaction *oact)
+
+{
+ register int ret;
+ if (_libc_sigaction!=NULL)
+ return (*_libc_sigaction)(sig,act,oact);
+ if ((ret = machdep_sys_sigaction(sig,act,oact))<0) {
+ errno = -ret;
+ return -1;
+ }
+ else {
+ return 0;
+ }
+}
+
+int (*_libc_sigprocmask)(int, const sigset_t *, sigset_t *) = NULL;
+
+int sigprocmask(int how, const sigset_t *set, sigset_t * oset)
+
+{
+ register int ret;
+ if (_libc_sigprocmask!=NULL)
+ return (*_libc_sigprocmask)(how,set,oset);
+ if ((ret = machdep_sys_sigprocmask(how,set,oset))<0) {
+ errno = -ret;
+ return -1;
+ }
+ else {
+ return 0;
+ }
+}
+
+int (*_libc_sigsuspend)(const sigset_t *) = NULL;
+
+int sigsuspend(const sigset_t *set)
+{
+ register int ret;
+ if (_libc_sigsuspend!=NULL)
+ return (*_libc_sigsuspend)(set);
+ if ((ret = machdep_sys_sigsuspend(set))<0) {
+ errno = -ret;
+ return -1;
+ }
+ else {
+ return 0;
+ }
+}
+
+int _sigrelse(sig)
+int sig;
+
+{
+ sigset_t mask;
+ sigemptyset(&mask);
+ sigaddset(&mask, sig);
+ return sigprocmask(SIG_UNBLOCK,&mask,NULL);
+}
+
+int _sighold(sig)
+int sig;
+
+{
+ sigset_t mask;
+ sigemptyset(&mask);
+ sigaddset(&mask, sig);
+ return sigprocmask(SIG_BLOCK,&mask,NULL);
+}
+
+void (*sigset(int sig, void (*func)(int)))(int)
+{
+ return signal(sig, func);
+}
+
+
+int (*_libc_getmsg)(int , struct strbuf *, struct strbuf *, int *) = NULL;
+
+int getmsg(int fd, struct strbuf * ctlptr, struct strbuf * dataptr,
+ int * flags)
+{
+ register int ret;
+ if (_libc_getmsg != NULL)
+ return (*_libc_getmsg)(fd,ctlptr,dataptr,flags);
+ else if ((ret=machdep_sys_getmsg(fd,ctlptr,dataptr,flags))<0) {
+ errno = -ret;
+ return -1;
+ }
+ else
+ return ret;
+}
+
+int (*_libc_putmsg)(int , const struct strbuf *, const struct strbuf *, int) = NULL;
+
+int putmsg(int fd, const struct strbuf * ctlptr, const struct strbuf * dataptr,
+ int flags)
+{
+ register int ret;
+ if (_libc_putmsg != NULL)
+ return (*_libc_putmsg)(fd,ctlptr,dataptr,flags);
+ else if ((ret=machdep_sys_putmsg(fd,ctlptr,dataptr,flags))<0) {
+ errno = -ret;
+ return -1;
+ }
+ else
+ return ret;
+}
+
+int ftime(struct timeb* tp)
+
+{
+ register int ret;
+ if ((ret=machdep_sys_ftime(tp))<0) {
+ errno = -ret;
+ return NOTOK;
+ }
+ return 0;
+}
+
+int getpagesize()
+
+{
+ register int ret;
+#if 0
+ if ((ret = machdep_sys_sysconf(_SC_PAGE_SIZE))<0) {
+ PANIC();
+ SET_ERRNO(-ret);
+ return -1;
+ }
+ else {
+ return 0;
+ }
+#else
+ return PAGESIZE;
+#endif
+}
+
+static pthread_mutex_t machdep_mutex =
+{ MUTEX_TYPE_COUNTING_FAST, PTHREAD_QUEUE_INITIALIZER, \
+ NULL, SEMAPHORE_CLEAR, { NULL }, MUTEX_FLAGS_INITED };
+
+static pthread_mutex_t malloc_mutex =
+{ MUTEX_TYPE_COUNTING_FAST, PTHREAD_QUEUE_INITIALIZER, \
+ NULL, SEMAPHORE_CLEAR, { NULL }, MUTEX_FLAGS_INITED };
+
+struct stdlock {
+ volatile long init;
+ pthread_mutex_t* mutex;
+};
+
+static void machdep_stdinitlock(struct stdlock* lock)
+
+{
+ if (lock==0) PANIC();
+ pthread_mutex_lock(&machdep_mutex);
+ if (!lock->init) {
+ register pthread_mutex_t* mutex;
+ pthread_mutexattr_t attr;
+
+ lock->init = 1;
+ lock->mutex = &machdep_mutex;
+ mutex = (pthread_mutex_t*) malloc(sizeof(pthread_mutex_t));
+ pthread_mutexattr_init (&attr);
+ pthread_mutexattr_settype (&attr, MUTEX_TYPE_COUNTING_FAST);
+ pthread_mutex_init(mutex, &attr);
+ lock->mutex = mutex;
+ }
+ pthread_mutex_unlock(&machdep_mutex);
+}
+
+void machdep_stdlock(struct stdlock* lock)
+
+{
+ if (lock==0) PANIC();
+ if (!lock->init)
+ machdep_stdinitlock(lock);
+ pthread_mutex_lock(lock->mutex);
+}
+
+void machdep_stdunlock(struct stdlock* lock)
+
+{
+ if (lock==0) PANIC();
+ if (!lock->init)
+ machdep_stdinitlock(lock);
+ pthread_mutex_unlock(lock->mutex);
+}
+
+int machdep_stdtrylock(struct stdlock* lock)
+
+{
+ if (lock==0) PANIC();
+ if (!lock->init)
+ machdep_stdinitlock(lock);
+ return pthread_mutex_trylock(lock->mutex);
+}
+
+int machdep_stdtryunlock(struct stdlock* lock)
+
+{
+ if (lock==0) PANIC();
+ if (!lock->init)
+ machdep_stdinitlock(lock);
+ if (pthread_mutex_trylock(lock->mutex))
+ return pthread_mutex_unlock(lock->mutex);
+ return 0;
+}
+
+extern void (*_libc_stdlock)(struct stdlock* lock);
+extern void (*_libc_stdunlock)(struct stdlock* lock);
+extern int (*_libc_stdtrylock)(struct stdlock* lock);
+extern int (*_libc_stdtryunlock)(struct stdlock* lock);
+
+int machdep_sys_init()
+
+{
+ typedef void (*voidfunc_t)();
+ extern voidfunc_t _libc_read;
+ extern voidfunc_t _libc_write;
+ extern voidfunc_t _libc_readv;
+ extern voidfunc_t _libc_writev;
+ extern voidfunc_t _libc_open;
+ extern voidfunc_t _libc_close;
+ extern voidfunc_t _libc_fork;
+ extern voidfunc_t _libc_fcntl;
+ extern voidfunc_t _libc_dup;
+ extern voidfunc_t _libc_pipe;
+ extern voidfunc_t _libc_select;
+ extern voidfunc_t _libc_malloc;
+ extern voidfunc_t _libc_realloc;
+ extern voidfunc_t _libc_free;
+ extern ssize_t pthread_read (int , char*, int );
+ extern ssize_t pthread_write (int , char*, int );
+ extern int pthread_close (int);
+ extern int pthread_dup (int);
+ extern int pthread_fork ();
+ extern int pthread_pipe (int*);
+ extern int pthread_fcntl(int, int, ...);
+ extern int pthread_open(const char *, int, ...);
+ extern ssize_t pthread_readv (int , const struct iovec *, int );
+ extern ssize_t pthread_writev (int , const struct iovec *, int );
+ extern int pthread_select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
+ extern int pthread_getmsg(int , struct strbuf *, struct strbuf *,int*);
+ extern int pthread_putmsg(int , const struct strbuf *, const struct strbuf *,int);
+ extern void (*pthread_signal(int , void (*)(int)))(int);
+ extern int pthread_sigaction(int,const struct sigaction *, struct sigaction *);
+ extern int pthread_sigprocmask(int, const sigset_t *, sigset_t *);
+ extern int pthread_sigsuspend(const sigset_t *);
+
+
+ static struct {
+ voidfunc_t *p;
+ voidfunc_t f;
+ } maptable[] = {
+ {(voidfunc_t*)&_libc_read, (voidfunc_t) pthread_read},
+ {(voidfunc_t*)&_libc_write, (voidfunc_t) pthread_write},
+ {(voidfunc_t*)&_libc_readv, (voidfunc_t) pthread_readv},
+ {(voidfunc_t*)&_libc_writev, (voidfunc_t) pthread_writev},
+ {(voidfunc_t*)&_libc_open, (voidfunc_t) pthread_open},
+ {(voidfunc_t*)&_libc_close, (voidfunc_t) pthread_close},
+ {(voidfunc_t*)&_libc_fork, (voidfunc_t) pthread_fork},
+ {(voidfunc_t*)&_libc_fcntl, (voidfunc_t) pthread_fcntl},
+ {(voidfunc_t*)&_libc_dup, (voidfunc_t) pthread_dup},
+ {(voidfunc_t*)&_libc_pipe, (voidfunc_t) pthread_pipe},
+ {(voidfunc_t*)&_libc_select, (voidfunc_t) pthread_select},
+ {(voidfunc_t*)&_libc_getmsg, (voidfunc_t) pthread_getmsg},
+ {(voidfunc_t*)&_libc_putmsg, (voidfunc_t) pthread_putmsg},
+ {(voidfunc_t*)&_libc_signal, (voidfunc_t) pthread_signal},
+ {(voidfunc_t*)&_libc_sigaction, (voidfunc_t) pthread_sigaction},
+ {(voidfunc_t*)&_libc_sigprocmask, (voidfunc_t) pthread_sigprocmask},
+ {(voidfunc_t*)&_libc_sigsuspend, (voidfunc_t) pthread_sigsuspend},
+ {(voidfunc_t*) 0, (voidfunc_t) 0}
+ };
+ register int i;
+
+ for (i=0; maptable[i].p; i++)
+ *maptable[i].p = maptable[i].f;
+
+ _libc_stdlock = machdep_stdlock;
+ _libc_stdunlock = machdep_stdunlock;
+ _libc_stdtrylock = machdep_stdtrylock;
+ _libc_stdtryunlock = machdep_stdtryunlock;
+ return 0;
+}
+
+#if 0
+extern end;
+char* nd = (char*) &end;
+char* brk(const char* endds)
+
+{
+ register int ret;
+
+ if ((ret = machdep_sys_brk((char*)endds))<0) {
+ SET_ERRNO(-ret);
+ return (char*) -1;
+ }
+ else {
+ nd = (char*) endds;
+ return 0;
+ }
+}
+
+char *sbrk(int incr)
+
+{
+ register char* ret;
+ if (incr!=0 && (ret=brk(nd + incr))!=0)
+ return ret;
+ else
+ return nd - incr;
+}
+#endif
+
+sigset_t sigmask(int sig)
+
+{
+ sigset_t oset;
+ sigemptyset(&oset);
+ sigaddset(&oset, sig);
+ return oset;
+}
+
+sigset_t sigsetmask(sigset_t set)
+
+{
+ sigset_t oset;
+ sigprocmask(SIG_SETMASK,&set,&oset);
+ return oset;
+}
+
+sigset_t sigblock(sigset_t set)
+
+{
+ sigset_t oset;
+ sigprocmask(SIG_BLOCK,&set,&oset);
+ return oset;
+}