mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
1072 lines
25 KiB
C
Executable file
1072 lines
25 KiB
C
Executable file
|
|
/* ==== 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;
|
|
}
|