summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/minilibc.c
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1/minilibc.c')
-rw-r--r--mdk-stage1/minilibc.c89
1 files changed, 85 insertions, 4 deletions
diff --git a/mdk-stage1/minilibc.c b/mdk-stage1/minilibc.c
index 73d7deae5..0a9bc9156 100644
--- a/mdk-stage1/minilibc.c
+++ b/mdk-stage1/minilibc.c
@@ -60,34 +60,115 @@ void _fini (int __status __attribute__ ((unused)))
{
}
-inline int socket(int a, int b, int c)
+#ifdef __x86_64__
+
+#define _NSIG 64
+#define _NSIG_BPW 64
+#define _NSIG_WORDS (_NSIG / _NSIG_BPW)
+
+typedef struct {
+ unsigned long sig[_NSIG_WORDS];
+} libc_sigset_t;
+
+struct sigaction {
+ union {
+ __sighandler_t _sa_handler;
+ void (*_sa_sigaction)(int, void*, void*);
+ } _u;
+ unsigned long sa_flags;
+ void (*sa_restorer)(void);
+ libc_sigset_t sa_mask;
+};
+
+#define sa_handler _u._sa_handler
+#define sa_sigaction _u._sa_sigaction
+
+static inline int sigemptyset(libc_sigset_t *set) {
+ set->sig[0]=0;
+ if (_NSIG_WORDS>1) set->sig[1]=0;
+ if (_NSIG_WORDS>2) {
+ set->sig[2]=0;
+ set->sig[3]=0;
+ }
+ return 0;
+}
+
+#define __sigmask(sig) ( ((unsigned long)1) << (((sig)-1) % (8*sizeof(unsigned long))) )
+#define __sigword(sig) ( ((sig)-1) / (8*sizeof(unsigned long)) )
+
+#define EINVAL 22
+
+int sigaddset(libc_sigset_t *set, int signo) {
+ if ((signo<1)||(signo>SIGRTMAX)) {
+ errno = EINVAL;
+ return -1;
+ } else {
+ unsigned long __mask = __sigmask (signo);
+ unsigned long __word = __sigword (signo);
+ set->sig[__word]|=__mask;
+ return 0;
+ }
+}
+
+#define __NR___rt_sigaction __NR_rt_sigaction
+static inline _syscall3(int,__rt_sigaction,int,signum,const void *,act,void *,oldact)
+
+int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) {
+ return __rt_sigaction(signum, act, oldact);
+}
+
+__sighandler_t signal(int signum, __sighandler_t action) {
+ struct sigaction sa,oa;
+ sa.sa_handler=action;
+ sigemptyset(&sa.sa_mask);
+ sigaddset(&sa.sa_mask,signum);
+ sa.sa_flags=SA_RESTART;
+ if (sigaction(signum,&sa,&oa))
+ return SIG_ERR;
+ return oa.sa_handler;
+}
+
+#endif
+
+#ifdef __NR_socketcall
+
+int socket(int a, int b, int c)
{
unsigned long args[] = { a, b, c };
return socketcall(SYS_SOCKET, args);
}
-inline int bind(int a, void * b, int c)
+int bind(int a, void * b, int c)
{
unsigned long args[] = { a, (long) b, c };
return socketcall(SYS_BIND, args);
}
-inline int listen(int a, int b)
+int listen(int a, int b)
{
unsigned long args[] = { a, b, 0 };
return socketcall(SYS_LISTEN, args);
}
-inline int accept(int a, void * addr, void * addr2)
+int accept(int a, void * addr, void * addr2)
{
unsigned long args[] = { a, (long) addr, (long) addr2 };
return socketcall(SYS_ACCEPT, args);
}
+#else
+
+_syscall3(int,socket,int,domain,int,type,int,protocol)
+_syscall3(int,bind,int,sockfd,void *,my_addr,int,addrlen)
+_syscall2(int,listen,int,s,int,backlog)
+_syscall3(int,accept,int,s,void *,addr,void *,addrlen)
+
+#endif
+
void sleep(int secs)
{