--- uae/src/bsdsocket.c 2018/04/24 16:44:45 1.1 +++ uae/src/bsdsocket.c 2018/04/24 17:18:21 1.1.1.5 @@ -14,17 +14,20 @@ #include #include -#include "config.h" #include "options.h" #include "memory.h" #include "custom.h" -#include "readcpu.h" #include "newcpu.h" #include "autoconf.h" +#include "traps.h" +#include "threaddep/thread.h" #include "bsdsocket.h" -#include "osdep/exectasks.h" -#ifdef BSDSOCKET_SUPPORTED +#ifdef BSDSOCKET + +#ifdef WIN32 +# include +#endif static uae_u32 SockLibBase; @@ -38,63 +41,20 @@ uae_u32 sockpoolflags[SOCKPOOLSIZE]; long curruniqid = 65536; -/* Memory-related helper functions */ -static void memcpyha (uae_u32 dst, char *src, int size) -{ - while (size--) - put_byte (dst++, *src++); -} - -char *strncpyah (char *dst, uae_u32 src, int size) -{ - char *res = dst; - while (size-- && (*dst++ = get_byte (src++))); - return res; -} - -char *strcpyah (char *dst, uae_u32 src) -{ - char *res = dst; - while ((*dst++ = get_byte (src++)) != 0); - return res; -} - -uae_u32 strcpyha (uae_u32 dst, char *src) -{ - uae_u32 res = dst; - - do { - put_byte (dst++, *src); - } while (*src++); - - return res; -} - -uae_u32 strncpyha (uae_u32 dst, char *src, int size) -{ - uae_u32 res = dst; - while (size--) { - put_byte (dst++, *src); - if (!*src++) - return res; - } - return res; -} - -uae_u32 addstr (uae_u32 * dst, char *src) +uae_u32 addstr (uae_u32 *dst, const char *src) { uae_u32 res = *dst; int len; len = strlen (src) + 1; - strcpyha (*dst, src); + strcpyha_safe (*dst, src); (*dst) += len; return res; } -uae_u32 addmem (uae_u32 * dst, char *src, int len) +uae_u32 addmem (uae_u32 *dst, const char *src, int len) { uae_u32 res = *dst; @@ -108,12 +68,12 @@ uae_u32 addmem (uae_u32 * dst, char *src } /* Get current task */ -static uae_u32 gettask (void) +static uae_u32 gettask (TrapContext *context) { uae_u32 currtask, a1 = m68k_areg (regs, 1); m68k_areg (regs, 1) = 0; - currtask = CallLib (get_long (4), -0x126); /* FindTask */ + currtask = CallLib (context, get_long (4), -0x126); /* FindTask */ m68k_areg (regs, 1) = a1; @@ -122,10 +82,13 @@ static uae_u32 gettask (void) } /* errno/herrno setting */ -void seterrno (SB, int sb_errno) +void bsdsocklib_seterrno (SB, int sb_errno) { sb->sb_errno = sb_errno; + if (sb->sb_errno >= 1001 && sb->sb_errno <= 1005) + bsdsocklib_setherrno (sb, sb->sb_errno - 1000); + if (sb->errnoptr) { switch (sb->errnosize) { case 1: @@ -140,7 +103,7 @@ void seterrno (SB, int sb_errno) } } -void setherrno (SB, int sb_herrno) +void bsdsocklib_setherrno (SB, int sb_herrno) { sb->sb_herrno = sb_herrno; @@ -158,6 +121,35 @@ void setherrno (SB, int sb_herrno) } } +BOOL checksd (SB, int sd) +{ + int iCounter; + SOCKET s; + + s = getsock (sb, sd); + if (s != INVALID_SOCKET) { + for (iCounter = 1; iCounter <= sb->dtablesize; iCounter++) { + if (iCounter != sd) { + if (getsock (sb, iCounter) == s) { + releasesock (sb, sd); + return 1; + } + } + } + for (iCounter = 0; iCounter < SOCKPOOLSIZE; iCounter++) { + if (s == sockpoolsocks[iCounter]) + return 1; + } + } + TRACE (("checksd FALSE s 0x%x sd %d\n", s, sd)); + return 0; +} + +void setsd (SB, int sd, int s) +{ + sb->dtable[sd - 1] = s; +} + /* Socket descriptor/opaque socket handle management */ int getsd (SB, int s) { @@ -174,10 +166,10 @@ int getsd (SB, int s) if (dt[i] == -1) { dt[i] = s; sb->ftable[i] = SF_BLOCKING; - return i + 1; + return i + 1; } /* descriptor table full. */ - seterrno (sb, 24); /* EMFILE */ + bsdsocklib_seterrno (sb, 24); /* EMFILE */ return -1; } @@ -185,8 +177,8 @@ int getsd (SB, int s) int getsock (SB, int sd) { if ((unsigned int) (sd - 1) >= (unsigned int) sb->dtablesize) { - TRACE (("Invalid Socket Descriptor (%d)\n", sd)); - seterrno (sb, 38); /* ENOTSOCK */ + TRACE (("Invalid Socket Descriptor (%d, %d)\n", sd - 1, sb->dtablesize)); + bsdsocklib_seterrno (sb, 38); /* ENOTSOCK */ return -1; } @@ -223,19 +215,19 @@ void addtosigqueue (SB, int events) INTREQ (0xA000); } -static uae_u32 bsdsock_int_handler (void) +static uae_u32 bsdsock_int_handler (TrapContext *context) { SB; + locksigqueue (); if (sbsigqueue != NULL) { - locksigqueue (); - for (sb = sbsigqueue; sb; sb = sb->nextsig) { if (sb->dosignal == 1) { struct regstruct sbved_regs = regs; + m68k_areg (regs, 1) = sb->ownertask; m68k_dreg (regs, 0) = sb->sigstosend; - CallLib (get_long (4), -0x144); /* Signal() */ + CallLib (context, get_long (4), -0x144); /* Signal() */ regs = sbved_regs; @@ -245,24 +237,32 @@ static uae_u32 bsdsock_int_handler (void } sbsigqueue = NULL; - unlocksigqueue (); } + unlocksigqueue (); + return 0; } -void waitsig (SB) +void waitsig (TrapContext *context, SB) { + long sigs; m68k_dreg (regs, 0) = (((uae_u32) 1) << sb->signal) | sb->eintrsigs; - if (CallLib (get_long (4), -0x13e) & sb->eintrsigs) { + + if ((sigs = CallLib (context, get_long (4), -0x13e)) & sb->eintrsigs) { sockabort (sb); - seterrno (sb, 4); /* EINTR */ + bsdsocklib_seterrno (sb, 4); /* EINTR */ + + // Set signal + m68k_dreg (regs, 0) = sigs; + m68k_dreg (regs, 1) = sb->eintrsigs; + sigs = CallLib (context, get_long (4), -0x132); /* SetSignal() */ sb->eintr = 1; } else sb->eintr = 0; } -void cancelsig (SB) +void cancelsig (TrapContext *context, SB) { locksigqueue (); if (sb->dosignal) @@ -271,21 +271,21 @@ void cancelsig (SB) m68k_dreg (regs, 0) = 0; m68k_dreg (regs, 1) = ((uae_u32) 1) << sb->signal; - CallLib (get_long (4), -0x132); /* SetSignal() */ + CallLib (context, get_long (4), -0x132); /* SetSignal() */ } /* Allocate and initialize per-task state structure */ -static struct socketbase *alloc_socketbase (void) +static struct socketbase *alloc_socketbase (TrapContext *context) { - SB; + struct socketbase *sb; int i; if ((sb = calloc (sizeof (struct socketbase), 1)) != NULL) { - sb->ownertask = gettask (); + sb->ownertask = gettask (context); m68k_dreg (regs, 0) = -1; - sb->signal = CallLib (get_long (4), -0x14A); + sb->signal = CallLib (context, get_long (4), -0x14A); if (sb->signal == -1) { write_log ("bsdsocket: ERROR: Couldn't allocate signal for task 0x%lx.\n", sb->ownertask); @@ -296,7 +296,7 @@ static struct socketbase *alloc_socketba m68k_dreg (regs, 1) = 0; sb->dtablesize = DEFAULT_DTABLE_SIZE; - /* @@@ check malloc() result */ + /* @@@ check malloc () result */ sb->dtable = malloc (sb->dtablesize * sizeof (*sb->dtable)); sb->ftable = malloc (sb->dtablesize * sizeof (*sb->ftable)); @@ -305,51 +305,54 @@ static struct socketbase *alloc_socketba sb->eintrsigs = 0x1000; /* SIGBREAKF_CTRL_C */ - if (!host_sbinit (sb)) { + if (!host_sbinit (context, sb)) { /* @@@ free everything */ } + + locksigqueue (); + if (socketbases) sb->next = socketbases; socketbases = sb; + unlocksigqueue (); + return sb; } return NULL; } -struct socketbase *get_socketbase (void) +STATIC_INLINE struct socketbase *get_socketbase (TrapContext *context) { - /* @@@ make portable for sizeof(void *) != sizeof(uae_u32) */ - return (struct socketbase *) get_long (m68k_areg (regs, 6) + offsetof (struct UAEBSDBase, sb)); + return get_pointer (m68k_areg (regs, 6) + offsetof (struct UAEBSDBase, sb)); } -static void free_socketbase (void) +static void free_socketbase (TrapContext *context) { struct socketbase *sb, *nsb; - int i; - if ((sb = get_socketbase ()) != NULL) { + if ((sb = get_socketbase (context)) != NULL) { m68k_dreg (regs, 0) = sb->signal; - CallLib (get_long (4), -0x150); /* FreeSignal */ + CallLib (context, get_long (4), -0x150); /* FreeSignal */ if (sb->hostent) { m68k_areg (regs, 1) = sb->hostent; m68k_dreg (regs, 0) = sb->hostentsize; - CallLib (get_long (4), -0xD2); /* FreeMem */ - + CallLib (context, get_long (4), -0xD2); /* FreeMem */ } + if (sb->protoent) { m68k_areg (regs, 1) = sb->protoent; m68k_dreg (regs, 0) = sb->protoentsize; - CallLib (get_long (4), -0xD2); /* FreeMem */ - + CallLib (context, get_long (4), -0xD2); /* FreeMem */ } + if (sb->servent) { m68k_areg (regs, 1) = sb->servent; m68k_dreg (regs, 0) = sb->serventsize; - CallLib (get_long (4), -0xD2); /* FreeMem */ - + CallLib (context, get_long (4), -0xD2); /* FreeMem */ } + host_sbcleanup (sb); free (sb->dtable); @@ -385,7 +388,7 @@ static void free_socketbase (void) } } -static uae_u32 bsdsocklib_Expunge (void) +static uae_u32 bsdsocklib_Expunge (TrapContext *context) { TRACE (("Expunge() -> [ignored]\n")); return 0; @@ -393,19 +396,18 @@ static uae_u32 bsdsocklib_Expunge (void) static uae_u32 functable, datatable, inittable; -#define SOCKETBASE get_socketbase() -static uae_u32 bsdsocklib_Open (void) +static uae_u32 bsdsocklib_Open (TrapContext *context) { uae_u32 result = 0; int opencount; - SB; - - locksigqueue (); + unsigned int i; + struct socketbase *sb; + uae_u32 p[sizeof (void*) / 4]; TRACE (("OpenLibrary() -> ")); - if ((sb = alloc_socketbase ()) != NULL) { + if ((sb = alloc_socketbase (context)) != NULL) { put_word (SockLibBase + 32, opencount = get_word (SockLibBase + 32) + 1); m68k_areg (regs, 0) = functable; @@ -413,34 +415,32 @@ static uae_u32 bsdsocklib_Open (void) m68k_areg (regs, 2) = 0; m68k_dreg (regs, 0) = sizeof (struct UAEBSDBase); m68k_dreg (regs, 1) = 0; - result = CallLib (get_long (4), -0x54); + result = CallLib (context, get_long (4), -0x54); - /* @@@ make portable for sizeof(void *) != sizeof(uae_u32) */ - put_long (result + offsetof (struct UAEBSDBase, sb), (uae_u32) sb); + put_pointer (result + offsetof (struct UAEBSDBase, sb), sb); TRACE (("%0lx [%d]\n", result, opencount)); - } else + } else { TRACE (("failed (out of memory)\n")); - - unlocksigqueue (); + } return result; } -static uae_u32 bsdsocklib_Close (void) +static uae_u32 bsdsocklib_Close (TrapContext *context) { int opencount; uae_u32 base = m68k_areg (regs, 6); uae_u32 negsize = get_word (base + 16); - free_socketbase (); + free_socketbase (context); put_word (SockLibBase + 32, opencount = get_word (SockLibBase + 32) - 1); m68k_areg (regs, 1) = base - negsize; m68k_dreg (regs, 0) = negsize + get_word (base + 18); - CallLib (get_long (4), -0xD2); /* FreeMem */ + CallLib (context, get_long (4), -0xD2); /* FreeMem */ TRACE (("CloseLibrary() -> [%d]\n", opencount)); @@ -448,138 +448,147 @@ static uae_u32 bsdsocklib_Close (void) } /* socket(domain, type, protocol)(d0/d1/d2) */ -static uae_u32 bsdsocklib_socket (void) +static uae_u32 bsdsocklib_socket (TrapContext *context) { - return host_socket (SOCKETBASE, m68k_dreg (regs, 0), m68k_dreg (regs, 1), + struct socketbase *sb = get_socketbase (context); + return host_socket (sb, m68k_dreg (regs, 0), m68k_dreg (regs, 1), m68k_dreg (regs, 2)); } /* bind(s, name, namelen)(d0/a0/d1) */ -static uae_u32 bsdsocklib_bind (void) +static uae_u32 bsdsocklib_bind (TrapContext *context) { - return host_bind (SOCKETBASE, m68k_dreg (regs, 0), m68k_areg (regs, 0), + struct socketbase *sb = get_socketbase (context); + return host_bind (sb, m68k_dreg (regs, 0), m68k_areg (regs, 0), m68k_dreg (regs, 1)); } /* listen(s, backlog)(d0/d1) */ -static uae_u32 bsdsocklib_listen (void) +static uae_u32 bsdsocklib_listen (TrapContext *context) { - return host_listen (SOCKETBASE, m68k_dreg (regs, 0), m68k_dreg (regs, 1)); + struct socketbase *sb = get_socketbase (context); + return host_listen (sb, m68k_dreg (regs, 0), m68k_dreg (regs, 1)); } /* accept(s, addr, addrlen)(d0/a0/a1) */ -static uae_u32 bsdsocklib_accept (void) +static uae_u32 bsdsocklib_accept (TrapContext *context) { - SB = get_socketbase (); - host_accept (sb, m68k_dreg (regs, 0), m68k_areg (regs, 0), m68k_areg (regs, 1)); + struct socketbase *sb = get_socketbase (context); + host_accept (context, sb, m68k_dreg (regs, 0), m68k_areg (regs, 0), m68k_areg (regs, 1)); return sb->resultval; } /* connect(s, name, namelen)(d0/a0/d1) */ -static uae_u32 bsdsocklib_connect (void) +static uae_u32 bsdsocklib_connect (TrapContext *context) { - SB = get_socketbase (); - host_connect (sb, m68k_dreg (regs, 0), m68k_areg (regs, 0), m68k_dreg (regs, 1)); + struct socketbase *sb = get_socketbase (context); + host_connect (context, sb, m68k_dreg (regs, 0), m68k_areg (regs, 0), m68k_dreg (regs, 1)); return sb->sb_errno ? -1 : 0; } /* sendto(s, msg, len, flags, to, tolen)(d0/a0/d1/d2/a1/d3) */ -static uae_u32 bsdsocklib_sendto (void) +static uae_u32 bsdsocklib_sendto (TrapContext *context) { - SB = get_socketbase (); - host_sendto (sb, m68k_dreg (regs, 0), m68k_areg (regs, 0), m68k_dreg (regs, 1), + struct socketbase *sb = get_socketbase (context); + host_sendto (context, sb, m68k_dreg (regs, 0), m68k_areg (regs, 0), m68k_dreg (regs, 1), m68k_dreg (regs, 2), m68k_areg (regs, 1), m68k_dreg (regs, 3)); return sb->resultval; } /* send(s, msg, len, flags)(d0/a0/d1/d2) */ -static uae_u32 bsdsocklib_send (void) +static uae_u32 bsdsocklib_send (TrapContext *context) { - SB = get_socketbase (); - host_sendto (sb, m68k_dreg (regs, 0), m68k_areg (regs, 0), m68k_dreg (regs, 1), + struct socketbase *sb = get_socketbase (context); + host_sendto (context, sb, m68k_dreg (regs, 0), m68k_areg (regs, 0), m68k_dreg (regs, 1), m68k_dreg (regs, 2), 0, 0); return sb->resultval; } /* recvfrom(s, buf, len, flags, from, fromlen)(d0/a0/d1/d2/a1/a2) */ -static uae_u32 bsdsocklib_recvfrom (void) +static uae_u32 bsdsocklib_recvfrom (TrapContext *context) { - SB = get_socketbase (); - host_recvfrom (sb, m68k_dreg (regs, 0), m68k_areg (regs, 0), m68k_dreg (regs, 1), + struct socketbase *sb = get_socketbase (context); + host_recvfrom (context, sb, m68k_dreg (regs, 0), m68k_areg (regs, 0), m68k_dreg (regs, 1), m68k_dreg (regs, 2), m68k_areg (regs, 1), m68k_areg (regs, 2)); return sb->resultval; } /* recv(s, buf, len, flags)(d0/a0/d1/d2) */ -static uae_u32 bsdsocklib_recv (void) +static uae_u32 bsdsocklib_recv (TrapContext *context) { - SB = get_socketbase (); - host_recvfrom (sb, m68k_dreg (regs, 0), m68k_areg (regs, 0), m68k_dreg (regs, 1), + struct socketbase *sb = get_socketbase (context); + host_recvfrom (context, sb, m68k_dreg (regs, 0), m68k_areg (regs, 0), m68k_dreg (regs, 1), m68k_dreg (regs, 2), 0, 0); return sb->resultval; } /* shutdown(s, how)(d0/d1) */ -static uae_u32 bsdsocklib_shutdown (void) +static uae_u32 bsdsocklib_shutdown (TrapContext *context) { - return host_shutdown (SOCKETBASE, m68k_dreg (regs, 0), m68k_dreg (regs, 1)); + struct socketbase *sb = get_socketbase (context); + return host_shutdown (sb, m68k_dreg (regs, 0), m68k_dreg (regs, 1)); } /* setsockopt(s, level, optname, optval, optlen)(d0/d1/d2/a0/d3) */ -static uae_u32 bsdsocklib_setsockopt (void) +static uae_u32 bsdsocklib_setsockopt (TrapContext *context) { - SB = get_socketbase (); + struct socketbase *sb = get_socketbase (context); host_setsockopt (sb, m68k_dreg (regs, 0), m68k_dreg (regs, 1), m68k_dreg (regs, 2), m68k_areg (regs, 0), m68k_dreg (regs, 3)); return sb->resultval; } /* getsockopt(s, level, optname, optval, optlen)(d0/d1/d2/a0/a1) */ -static uae_u32 bsdsocklib_getsockopt (void) +static uae_u32 bsdsocklib_getsockopt (TrapContext *context) { - return host_getsockopt (SOCKETBASE, m68k_dreg (regs, 0), m68k_dreg (regs, 1), m68k_dreg (regs, 2), + struct socketbase *sb = get_socketbase (context); + return host_getsockopt (sb, m68k_dreg (regs, 0), m68k_dreg (regs, 1), m68k_dreg (regs, 2), m68k_areg (regs, 0), m68k_areg (regs, 1)); } /* getsockname(s, hostname, namelen)(d0/a0/a1) */ -static uae_u32 bsdsocklib_getsockname (void) +static uae_u32 bsdsocklib_getsockname (TrapContext *context) { - return host_getsockname (SOCKETBASE, m68k_dreg (regs, 0), m68k_areg (regs, 0), m68k_areg (regs, 1)); + struct socketbase *sb = get_socketbase (context); + return host_getsockname (sb, m68k_dreg (regs, 0), m68k_areg (regs, 0), m68k_areg (regs, 1)); } /* getpeername(s, hostname, namelen)(d0/a0/a1) */ -static uae_u32 bsdsocklib_getpeername (void) +static uae_u32 bsdsocklib_getpeername (TrapContext *context) { - return host_getpeername (SOCKETBASE, m68k_dreg (regs, 0), m68k_areg (regs, 0), m68k_areg (regs, 1)); + struct socketbase *sb = get_socketbase (context); + return host_getpeername (sb, m68k_dreg (regs, 0), m68k_areg (regs, 0), m68k_areg (regs, 1)); } /* *------ generic system calls related to sockets */ /* IoctlSocket(d, request, argp)(d0/d1/a0) */ -static uae_u32 bsdsocklib_IoctlSocket (void) +static uae_u32 bsdsocklib_IoctlSocket (TrapContext *context) { - return host_IoctlSocket (SOCKETBASE, m68k_dreg (regs, 0), m68k_dreg (regs, 1), m68k_areg (regs, 0)); + struct socketbase *sb = get_socketbase (context); + return host_IoctlSocket (sb, m68k_dreg (regs, 0), m68k_dreg (regs, 1), m68k_areg (regs, 0)); } /* *------ AmiTCP/IP specific stuff */ /* CloseSocket(d)(d0) */ -static uae_u32 bsdsocklib_CloseSocket (void) +static uae_u32 bsdsocklib_CloseSocket (TrapContext *context) { - return host_CloseSocket (SOCKETBASE, m68k_dreg (regs, 0)); + struct socketbase *sb = get_socketbase (context); + return host_CloseSocket (sb, m68k_dreg (regs, 0)); } /* WaitSelect(nfds, readfds, writefds, execptfds, timeout, maskp)(d0/a0/a1/a2/a3/d1) */ -static uae_u32 bsdsocklib_WaitSelect (void) +static uae_u32 bsdsocklib_WaitSelect (TrapContext *context) { - SB = get_socketbase (); - host_WaitSelect (sb, m68k_dreg (regs, 0), m68k_areg (regs, 0), m68k_areg (regs, 1), + struct socketbase *sb = get_socketbase (context); + host_WaitSelect (context, sb, m68k_dreg (regs, 0), m68k_areg (regs, 0), m68k_areg (regs, 1), m68k_areg (regs, 2), m68k_areg (regs, 3), m68k_dreg (regs, 1)); return sb->resultval; } /* SetSocketSignals(SIGINTR, SIGIO, SIGURG)(d0/d1/d2) */ -static uae_u32 bsdsocklib_SetSocketSignals (void) +static uae_u32 bsdsocklib_SetSocketSignals (TrapContext *context) { - SB = get_socketbase (); + struct socketbase *sb = get_socketbase (context); TRACE (("SetSocketSignals(0x%08lx,0x%08lx,0x%08lx) -> ", m68k_dreg (regs, 0), m68k_dreg (regs, 1), m68k_dreg (regs, 2))); sb->eintrsigs = m68k_dreg (regs, 0); @@ -589,9 +598,37 @@ static uae_u32 bsdsocklib_SetSocketSigna } /* SetDTableSize(size)(d0) */ -static uae_u32 bsdsocklib_SetDTableSize (void) +static uae_u32 bsdsocklib_SetDTableSize (SB, int newSize) { - write_log ("bsdsocket: UNSUPPORTED: SetDTableSize()\n"); + int *newdtable; + int *newftable; + int i; + + if (newSize < sb->dtablesize) { + /* I don't support lowering the size */ + return 0; + } + + newdtable = (int *)malloc (newSize * sizeof(*sb->dtable)); + newftable = (int *)malloc (newSize * sizeof(*sb->ftable)); + + if (newdtable == NULL || newftable == NULL) { + sb->resultval = -1; + bsdsocklib_seterrno(sb, ENOMEM); + return -1; + } + + memcpy (newdtable, sb->dtable, sb->dtablesize * sizeof(*sb->dtable)); + memcpy (newftable, sb->ftable, sb->dtablesize * sizeof(*sb->ftable)); + for (i = sb->dtablesize + 1; i < newSize; i++) + newdtable[i] = -1; + + sb->dtablesize = newSize; + free (sb->dtable); + free (sb->ftable); + sb->dtable = newdtable; + sb->ftable = newftable; + sb->resultval = 0; return 0; } @@ -607,9 +644,9 @@ static int sockpoolindex (long id) } /* ObtainSocket(id, domain, type, protocol)(d0/d1/d2/d3) */ -static uae_u32 bsdsocklib_ObtainSocket (void) +static uae_u32 bsdsocklib_ObtainSocket (TrapContext *context) { - SB = SOCKETBASE; + struct socketbase *sb = get_socketbase (context); int sd; long id; int s; @@ -617,7 +654,7 @@ static uae_u32 bsdsocklib_ObtainSocket ( id = m68k_dreg (regs, 0); - TRACE (("ReleaseSocket(%d,%d,%d,%d) -> ", id, m68k_dreg (regs, 1), m68k_dreg (regs, 2), m68k_dreg (regs, 3))); + TRACE (("ObtainSocket(%d,%d,%d,%d) -> ", id, m68k_dreg (regs, 1), m68k_dreg (regs, 2), m68k_dreg (regs, 3))); i = sockpoolindex (id); @@ -628,19 +665,22 @@ static uae_u32 bsdsocklib_ObtainSocket ( s = sockpoolsocks[i]; sd = getsd (sb, s); - sb->ftable[sd - 1] = sockpoolflags[i]; - TRACE (("%d\n", sd)); + TRACE (("%d, %d\n", s, sd)); - sockpoolids[i] = UNIQUE_ID; + if (sd != -1) { + sb->ftable[sd - 1] = sockpoolflags[i]; + sockpoolids[i] = UNIQUE_ID; + return sd-1; + } - return sd; + return -1; } /* ReleaseSocket(fd, id)(d0/d1) */ -static uae_u32 bsdsocklib_ReleaseSocket (void) +static uae_u32 bsdsocklib_ReleaseSocket (TrapContext *context) { - SB = SOCKETBASE; + struct socketbase *sb = get_socketbase (context); int sd; long id; int s; @@ -650,6 +690,7 @@ static uae_u32 bsdsocklib_ReleaseSocket sd = m68k_dreg (regs, 0); id = m68k_dreg (regs, 1); + sd++; TRACE (("ReleaseSocket(%d,%d) -> ", sd, id)); s = getsock (sb, sd); @@ -690,7 +731,7 @@ static uae_u32 bsdsocklib_ReleaseSocket sockpoolsocks[i] = s; sockpoolflags[i] = flags; - TRACE (("%d\n", id)); + TRACE (("id %d s %d\n", id,s)); } else { TRACE (("[invalid socket descriptor]\n")); return -1; @@ -700,24 +741,24 @@ static uae_u32 bsdsocklib_ReleaseSocket } /* ReleaseCopyOfSocket(fd, id)(d0/d1) */ -static uae_u32 bsdsocklib_ReleaseCopyOfSocket (void) +static uae_u32 bsdsocklib_ReleaseCopyOfSocket (TrapContext *context) { write_log ("bsdsocket: UNSUPPORTED: ReleaseCopyOfSocket()\n"); return 0; } /* Errno()() */ -static uae_u32 bsdsocklib_Errno (void) +static uae_u32 bsdsocklib_Errno (TrapContext *context) { - SB = get_socketbase (); + struct socketbase *sb = get_socketbase (context); TRACE (("Errno() -> %d\n", sb->sb_errno)); return sb->sb_errno; } /* SetErrnoPtr(errno_p, size)(a0/d0) */ -static uae_u32 bsdsocklib_SetErrnoPtr (void) +static uae_u32 bsdsocklib_SetErrnoPtr (TrapContext *context) { - SB = get_socketbase (); + struct socketbase *sb = get_socketbase (context); uae_u32 errnoptr = m68k_areg (regs, 0), size = m68k_dreg (regs, 0); TRACE (("SetErrnoPtr(0x%lx,%d) -> ", errnoptr, size)); @@ -728,116 +769,118 @@ static uae_u32 bsdsocklib_SetErrnoPtr (v TRACE (("OK\n")); return 0; } - seterrno (sb, 22); /* EINVAL */ + bsdsocklib_seterrno (sb, 22); /* EINVAL */ return -1; } /* *------ inet library calls related to inet address manipulation */ /* Inet_NtoA(in)(d0) */ -static uae_u32 bsdsocklib_Inet_NtoA (void) +static uae_u32 bsdsocklib_Inet_NtoA (TrapContext *context) { - return host_Inet_NtoA (SOCKETBASE, m68k_dreg (regs, 0)); + struct socketbase *sb = get_socketbase (context); + return host_Inet_NtoA (context, sb, m68k_dreg (regs, 0)); } /* inet_addr(cp)(a0) */ -static uae_u32 bsdsocklib_inet_addr (void) +static uae_u32 bsdsocklib_inet_addr (TrapContext *context) { return host_inet_addr (m68k_areg (regs, 0)); } /* Inet_LnaOf(in)(d0) */ -static uae_u32 bsdsocklib_Inet_LnaOf (void) +static uae_u32 bsdsocklib_Inet_LnaOf (TrapContext *context) { write_log ("bsdsocket: UNSUPPORTED: Inet_LnaOf()\n"); return 0; } /* Inet_NetOf(in)(d0) */ -static uae_u32 bsdsocklib_Inet_NetOf (void) +static uae_u32 bsdsocklib_Inet_NetOf (TrapContext *context) { write_log ("bsdsocket: UNSUPPORTED: Inet_NetOf()\n"); return 0; } /* Inet_MakeAddr(net, host)(d0/d1) */ -static uae_u32 bsdsocklib_Inet_MakeAddr (void) +static uae_u32 bsdsocklib_Inet_MakeAddr (TrapContext *context) { write_log ("bsdsocket: UNSUPPORTED: Inet_MakeAddr()\n"); return 0; } /* inet_network(cp)(a0) */ -static uae_u32 bsdsocklib_inet_network (void) +static uae_u32 bsdsocklib_inet_network (TrapContext *context) { return host_inet_addr (m68k_areg (regs, 0)); } /* *------ gethostbyname etc */ /* gethostbyname(name)(a0) */ -static uae_u32 bsdsocklib_gethostbyname (void) +static uae_u32 bsdsocklib_gethostbyname (TrapContext *context) { - SB = get_socketbase (); - host_gethostbynameaddr (sb, m68k_areg (regs, 0), 0, -1); - return sb->sb_errno ? 0 : sb->hostent; + struct socketbase *sb = get_socketbase (context); + host_gethostbynameaddr (context, sb, m68k_areg (regs, 0), 0, -1); + return sb->sb_herrno ? 0 : sb->hostent; } /* gethostbyaddr(addr, len, type)(a0/d0/d1) */ -static uae_u32 bsdsocklib_gethostbyaddr (void) +static uae_u32 bsdsocklib_gethostbyaddr (TrapContext *context) { - SB = get_socketbase (); - host_gethostbynameaddr (sb, m68k_areg (regs, 0), m68k_dreg (regs, 0), m68k_dreg (regs, 1)); - return sb->sb_errno ? 0 : sb->hostent; + struct socketbase *sb = get_socketbase (context); + host_gethostbynameaddr (context, sb, m68k_areg (regs, 0), m68k_dreg (regs, 0), m68k_dreg (regs, 1)); + return sb->sb_herrno ? 0 : sb->hostent; } /* getnetbyname(name)(a0) */ -static uae_u32 bsdsocklib_getnetbyname (void) +static uae_u32 bsdsocklib_getnetbyname (TrapContext *context) { write_log ("bsdsocket: UNSUPPORTED: getnetbyname()\n"); return 0; } /* getnetbyaddr(net, type)(d0/d1) */ -static uae_u32 bsdsocklib_getnetbyaddr (void) +static uae_u32 bsdsocklib_getnetbyaddr (TrapContext *context) { write_log ("bsdsocket: UNSUPPORTED: getnetbyaddr()\n"); return 0; } /* getservbyname(name, proto)(a0/a1) */ -static uae_u32 bsdsocklib_getservbyname (void) +static uae_u32 bsdsocklib_getservbyname (TrapContext *context) { - SB = get_socketbase (); - host_getservbynameport (sb, m68k_areg (regs, 0), m68k_areg (regs, 1), 0); + struct socketbase *sb = get_socketbase (context); + host_getservbynameport (context, sb, m68k_areg (regs, 0), m68k_areg (regs, 1), 0); return sb->sb_errno ? 0 : sb->servent; } /* getservbyport(port, proto)(d0/a0) */ -static uae_u32 bsdsocklib_getservbyport (void) +static uae_u32 bsdsocklib_getservbyport (TrapContext *context) { - SB = get_socketbase (); - host_getservbynameport (sb, m68k_dreg (regs, 0), m68k_areg (regs, 0), 1); + struct socketbase *sb = get_socketbase (context); + host_getservbynameport (context, sb, m68k_dreg (regs, 0), m68k_areg (regs, 0), 1); return sb->sb_errno ? 0 : sb->servent; } /* getprotobyname(name)(a0) */ -static uae_u32 bsdsocklib_getprotobyname (void) +static uae_u32 bsdsocklib_getprotobyname (TrapContext *context) { - SB = get_socketbase (); - host_getprotobyname (sb, m68k_areg (regs, 0)); + struct socketbase *sb = get_socketbase (context); + host_getprotobyname (context, sb, m68k_areg (regs, 0)); return sb->sb_errno ? 0 : sb->protoent; } /* getprotobynumber(proto)(d0) */ -static uae_u32 bsdsocklib_getprotobynumber (void) +static uae_u32 bsdsocklib_getprotobynumber (TrapContext *context) { - write_log ("bsdsocket: UNSUPPORTED: getprotobynumber()\n"); - return 0; + struct socketbase *sb = get_socketbase (context); + host_getprotobynumber (context, sb, m68k_dreg (regs, 0)); + return sb->sb_errno ? 0 : sb->protoent; } /* *------ syslog functions */ /* Syslog(level, format, ap)(d0/a0/a1) */ -static uae_u32 bsdsocklib_vsyslog (void) +static uae_u32 bsdsocklib_vsyslog (TrapContext *context) { write_log ("bsdsocket: UNSUPPORTED: vsyslog()\n"); return 0; @@ -845,36 +888,36 @@ static uae_u32 bsdsocklib_vsyslog (void) /* *------ AmiTCP/IP 1.1 extensions */ /* Dup2Socket(fd1, fd2)(d0/d1) */ -static uae_u32 bsdsocklib_Dup2Socket (void) +static uae_u32 bsdsocklib_Dup2Socket (TrapContext *context) { - write_log ("bsdsocket: UNSUPPORTED: Dup2Socket()\n"); - return 0; + struct socketbase *sb = get_socketbase (context); + return host_dup2socket (sb, m68k_dreg (regs, 0), m68k_dreg (regs, 1)); } -static uae_u32 bsdsocklib_sendmsg (void) +static uae_u32 bsdsocklib_sendmsg (TrapContext *context) { write_log ("bsdsocket: UNSUPPORTED: sendmsg()\n"); return 0; } -static uae_u32 bsdsocklib_recvmsg (void) +static uae_u32 bsdsocklib_recvmsg (TrapContext *context) { write_log ("bsdsocket: UNSUPPORTED: recvmsg()\n"); return 0; } -static uae_u32 bsdsocklib_gethostname (void) +static uae_u32 bsdsocklib_gethostname (TrapContext *context) { return host_gethostname (m68k_areg (regs, 0), m68k_dreg (regs, 0)); } -static uae_u32 bsdsocklib_gethostid (void) +static uae_u32 bsdsocklib_gethostid (TrapContext *context) { - write_log ("bsdsocket: WARNING: Process '%s' calls deprecated function gethostid() - returning 127.0.0.1\n", get_real_address (get_long (gettask () + 10))); + write_log ("bsdsocket: WARNING: Process '%s' calls deprecated function gethostid() - returning 127.0.0.1\n", get_real_address (get_long (gettask (context) + 10))); return 0x7f000001; } -char *errortexts[] = +const char * const errortexts[] = {"No error", "Operation not permitted", "No such file or directory", "No such process", "Interrupted system call", "Input/output error", "Device not configured", "Argument list too long", "Exec format error", "Bad file descriptor", "No child processes", @@ -886,7 +929,7 @@ char *errortexts[] = "Read-only file system", "Too many links", "Broken pipe", "Numerical argument out of domain", "Result too large", "Resource temporarily unavailable", "Operation now in progress", "Operation already in progress", "Socket operation on non-socket", "Destination address required", - "Messbge too long", "Protocol wrong type for socket", "Protocol not available", + "Message too long", "Protocol wrong type for socket", "Protocol not available", "Protocol not supported", "Socket type not supported", "Operation not supported", "Protocol family not supported", "Address family not supported by protocol family", "Address already in use", "Can't assign requested address", "Network is down", @@ -898,11 +941,22 @@ char *errortexts[] = "Too many processes", "Too many users", "Disc quota exceeded", "Stale NFS file handle", "Too many levels of remote in path", "RPC struct is bad", "RPC version wrong", "RPC prog. not avail", "Program version wrong", "Bad procedure for program", "No locks available", - "Function not implemented", "Inappropriate file type or format", "PError 0", - "No error", "Unknown host", "Host name lookup failure", "Unknown server error", - "No address associated with name"}; + "Function not implemented", "Inappropriate file type or format", "PError 0"}; uae_u32 errnotextptrs[sizeof (errortexts) / sizeof (*errortexts)]; +uae_u32 number_sys_error = sizeof (errortexts) / sizeof (*errortexts); + + +const char * const herrortexts[] = + {"No error", "Unknown host", "Host name lookup failure", "Unknown server error", + "No address associated with name"}; + +uae_u32 herrnotextptrs[sizeof (herrortexts) / sizeof (*herrortexts)]; +uae_u32 number_host_error = sizeof (herrortexts) / sizeof (*herrortexts); + +static const char * const strErr = "Errlist lookup error"; +uae_u32 strErrptr; + #define TAG_DONE (0L) /* terminates array of TagItems. ti_Data unused */ #define TAG_IGNORE (1L) /* ignore this item, not end of array */ @@ -939,8 +993,8 @@ uae_u32 errnotextptrs[sizeof (errortexts #define SBTC_ERRNOSTRPTR 14 /* */ #define SBTC_HERRNOSTRPTR 15 /* */ #define SBTC_IOERRNOSTRPTR 16 /* */ -#define SBTC_S2ERRNOSTRPTR 17 /* */ -#define SBTC_S2WERRNOSTRPTR 18 /* */ +#define SBTC_S2ERRNOSTRPTR 17 /* */ +#define SBTC_S2WERRNOSTRPTR 18 /* */ #define SBTC_ERRNOBYTEPTR 21 #define SBTC_ERRNOWORDPTR 22 #define SBTC_ERRNOLONGPTR 24 @@ -968,9 +1022,9 @@ static void tagcopy (uae_u32 currtag, ua } } -static uae_u32 bsdsocklib_SocketBaseTagList (void) +static uae_u32 bsdsocklib_SocketBaseTagList (TrapContext *context) { - SB = SOCKETBASE; + struct socketbase *sb = get_socketbase (context); uae_u32 tagptr = m68k_areg (regs, 0); uae_u32 tagsprocessed = 1; uae_u32 currtag; @@ -1015,28 +1069,60 @@ static uae_u32 bsdsocklib_SocketBaseTagL TRACE (("SBTC_SIGEVENTMASK),0x%lx", currval)); tagcopy (currtag, currval, tagptr, &sb->eventsigs); break; + case SBTC_SIGIOMASK: + TRACE (("SBTC_SIGEVENTMASK),0x%lx", currval)); + tagcopy (currtag, currval, tagptr, &sb->eventsigs); + break; case SBTC_ERRNO: TRACE (("SBTC_ERRNO),%d", currval)); - tagcopy (currtag, currval, tagptr, &sb->sb_errno); + tagcopy (currtag, currval, tagptr, (uae_u32 *)&sb->sb_errno); break; case SBTC_HERRNO: TRACE (("SBTC_HERRNO),%d", currval)); - tagcopy (currtag, currval, tagptr, &sb->sb_herrno); + tagcopy (currtag, currval, tagptr, (uae_u32 *)&sb->sb_herrno); + break; + case SBTC_DTABLESIZE: + TRACE (("SBTC_DTABLESIZE),0x%lx", currval)); + if (currtag & 1) { + bsdsocklib_SetDTableSize(sb, currval); + } else { + put_long (tagptr + 4, sb->dtablesize); + } break; case SBTC_ERRNOSTRPTR: if (currtag & 1) { TRACE (("ERRNOSTRPTR),invalid")); } else { - TRACE (("ERRNOSTRPTR),%d", currval)); - put_long (tagptr + 4, errnotextptrs[currval]); + unsigned long ulTmp; + if (currtag & 0x8000) /* SBTM_GETREF */ + ulTmp = get_long (currval); + else /* SBTM_GETVAL */ + ulTmp = currval; + + TRACE (("ERRNOSTRPTR),%d", ulTmp)); + + if (ulTmp < number_sys_error) + tagcopy (currtag, currval, tagptr, &errnotextptrs[ulTmp]); + else + tagcopy (currtag, currval, tagptr, &strErrptr); } break; case SBTC_HERRNOSTRPTR: if (currtag & 1) { TRACE (("HERRNOSTRPTR),invalid")); } else { - TRACE (("HERRNOSTRPTR),%d", currval)); - put_long (tagptr + 4, errnotextptrs[currval + sizeof (errortexts) / sizeof (*errortexts) - 6]); + unsigned long ulTmp; + if (currtag & 0x8000) /* SBTM_GETREF */ + ulTmp = get_long (currval); + else /* SBTM_GETVAL */ + ulTmp = currval; + + TRACE (("HERRNOSTRPTR),%d", ulTmp)); + + if (ulTmp < number_host_error) + tagcopy (currtag, currval, tagptr, &herrnotextptrs[ulTmp]); + else + tagcopy (currtag, currval, tagptr, &strErrptr); } break; case SBTC_ERRNOBYTEPTR: @@ -1077,9 +1163,10 @@ static uae_u32 bsdsocklib_SocketBaseTagL return tagsprocessed; } -static uae_u32 bsdsocklib_GetSocketEvents (void) +static uae_u32 bsdsocklib_GetSocketEvents (TrapContext *context) { - SB = SOCKETBASE; +#ifdef _WIN32 + struct socketbase *sb = get_socketbase (context); int i; int flags; uae_u32 ptr = m68k_areg (regs, 0); @@ -1092,33 +1179,30 @@ static uae_u32 bsdsocklib_GetSocketEvent if (sb->mtable[sb->eventindex]) { flags = sb->ftable[sb->eventindex] & SET_ALL; - if (flags) { sb->ftable[sb->eventindex] &= ~SET_ALL; put_long (m68k_areg (regs, 0), flags >> 8); TRACE (("%d (0x%x)\n", sb->eventindex + 1, flags >> 8)); - return sb->eventindex + 1; + return sb->eventindex; // xxx } } } - +#endif TRACE (("-1\n")); return -1; } -static uae_u32 bsdsocklib_getdtablesize (void) +static uae_u32 bsdsocklib_getdtablesize (TrapContext *context) { - return get_socketbase ()->dtablesize; + return get_socketbase (context)->dtablesize; } -static uae_u32 bsdsocklib_null (void) +static uae_u32 bsdsocklib_null (TrapContext *context) { return 0; } -extern uae_u32 sockfuncvecs[]; - -static uae_u32 bsdsocklib_init (void) +static uae_u32 bsdsocklib_init (TrapContext *context) { uae_u32 tmp1; int i; @@ -1131,40 +1215,52 @@ static uae_u32 bsdsocklib_init (void) m68k_areg (regs, 2) = 0; m68k_dreg (regs, 0) = LIBRARY_SIZEOF; m68k_dreg (regs, 1) = 0; - tmp1 = CallLib (m68k_areg (regs, 6), -0x54); + tmp1 = CallLib (context, m68k_areg (regs, 6), -0x54); if (!tmp1) { write_log ("bsdoscket: FATAL: Cannot create bsdsocket.library!\n"); return 0; } m68k_areg (regs, 1) = tmp1; - CallLib (m68k_areg (regs, 6), -0x18c); + CallLib (context, m68k_areg (regs, 6), -0x18c); SockLibBase = tmp1; #if 0 m68k_areg (regs, 1) = ds ("dos.library"); m68k_dreg (regs, 0) = 0; - dosbase = CallLib (m68k_areg (regs, 6), -552); + dosbase = CallLib (context, m68k_areg (regs, 6), -552); printf ("%08lx\n", dosbase); #endif /* Install error strings in Amiga memory */ - for (tmp1 = i = sizeof (errortexts) / sizeof (*errortexts); i--;) - tmp1 += strlen (errortexts[i]); + tmp1 = 0; + + for (i = number_sys_error; i--;) + tmp1 += strlen (errortexts[i]) + 1; + + for (i = number_host_error; i--;) + tmp1 += strlen (herrortexts[i]) + 1; + + tmp1 += strlen(strErr) + 1; m68k_dreg (regs, 0) = tmp1; m68k_dreg (regs, 1) = 0; - tmp1 = CallLib (get_long (4), -0xC6); + tmp1 = CallLib (context, get_long (4), -0xC6); if (!tmp1) { write_log ("bsdsocket: FATAL: Ran out of memory while creating bsdsocket.library!\n"); return 0; } - for (i = 0; i < (int) (sizeof (errortexts) / sizeof (*errortexts)); i++) + for (i = 0; i < (int) (number_sys_error); i++) errnotextptrs[i] = addstr (&tmp1, errortexts[i]); + for (i = 0; i < (int) (number_host_error); i++) + herrnotextptrs[i] = addstr (&tmp1, herrortexts[i]); + + strErrptr = addstr (&tmp1, strErr); + /* @@@ someone please implement a proper interrupt handler setup here :) */ tmp1 = here (); - calltrap (deftrap2 (bsdsock_int_handler, TRAPFLAG_EXTRA_STACK | TRAPFLAG_NO_RETVAL, "")); + calltrap (deftrap2 (bsdsock_int_handler, TRAPFLAG_EXTRA_STACK | TRAPFLAG_NO_RETVAL, "bsdsock_int_handler")); dw (0x4ef9); dl (get_long (regs.vbr + 0x78)); put_long (regs.vbr + 0x78, tmp1); @@ -1178,6 +1274,9 @@ void bsdlib_reset (void) SB, *nsb; int i; + if (currprefs.socket_emu == 0) + return; + SockLibBase = 0; for (sb = socketbases; sb; sb = nsb) { @@ -1204,13 +1303,13 @@ void bsdlib_reset (void) host_sbreset (); } -uae_u32 (*sockfuncs[])(void) = { +static const TrapHandler sockfuncs[] = { bsdsocklib_init, bsdsocklib_Open, bsdsocklib_Close, bsdsocklib_Expunge, bsdsocklib_socket, bsdsocklib_bind, bsdsocklib_listen, bsdsocklib_accept, bsdsocklib_connect, bsdsocklib_sendto, bsdsocklib_send, bsdsocklib_recvfrom, bsdsocklib_recv, bsdsocklib_shutdown, bsdsocklib_setsockopt, bsdsocklib_getsockopt, bsdsocklib_getsockname, bsdsocklib_getpeername, bsdsocklib_IoctlSocket, bsdsocklib_CloseSocket, bsdsocklib_WaitSelect, - bsdsocklib_SetSocketSignals, bsdsocklib_SetDTableSize, bsdsocklib_ObtainSocket, bsdsocklib_ReleaseSocket, + bsdsocklib_SetSocketSignals, bsdsocklib_getdtablesize, bsdsocklib_ObtainSocket, bsdsocklib_ReleaseSocket, bsdsocklib_ReleaseCopyOfSocket, bsdsocklib_Errno, bsdsocklib_SetErrnoPtr, bsdsocklib_Inet_NtoA, bsdsocklib_inet_addr, bsdsocklib_Inet_LnaOf, bsdsocklib_Inet_NetOf, bsdsocklib_Inet_MakeAddr, bsdsocklib_inet_network, bsdsocklib_gethostbyname, bsdsocklib_gethostbyaddr, bsdsocklib_getnetbyname, @@ -1220,15 +1319,34 @@ uae_u32 (*sockfuncs[])(void) = { bsdsocklib_GetSocketEvents }; -uae_u32 sockfuncvecs[sizeof (sockfuncs) / sizeof (*sockfuncs)]; +static const char * const funcnames[] = { + "bsdsocklib_init", "bsdsocklib_Open", "bsdsocklib_Close", "bsdsocklib_Expunge", + "bsdsocklib_socket", "bsdsocklib_bind", "bsdsocklib_listen", "bsdsocklib_accept", + "bsdsocklib_connect", "bsdsocklib_sendto", "bsdsocklib_send", "bsdsocklib_recvfrom", "bsdsocklib_recv", + "bsdsocklib_shutdown", "bsdsocklib_setsockopt", "bsdsocklib_getsockopt", "bsdsocklib_getsockname", + "bsdsocklib_getpeername", "bsdsocklib_IoctlSocket", "bsdsocklib_CloseSocket", "bsdsocklib_WaitSelect", + "bsdsocklib_SetSocketSignals", "bsdsocklib_getdtablesize", "bsdsocklib_ObtainSocket", "bsdsocklib_ReleaseSocket", + "bsdsocklib_ReleaseCopyOfSocket", "bsdsocklib_Errno", "bsdsocklib_SetErrnoPtr", "bsdsocklib_Inet_NtoA", + "bsdsocklib_inet_addr", "bsdsocklib_Inet_LnaOf", "bsdsocklib_Inet_NetOf", "bsdsocklib_Inet_MakeAddr", + "bsdsocklib_inet_network", "bsdsocklib_gethostbyname", "bsdsocklib_gethostbyaddr", "bsdsocklib_getnetbyname", + "bsdsocklib_getnetbyaddr", "bsdsocklib_getservbyname", "bsdsocklib_getservbyport", "bsdsocklib_getprotobyname", + "bsdsocklib_getprotobynumber", "bsdsocklib_vsyslog", "bsdsocklib_Dup2Socket", "bsdsocklib_sendmsg", + "bsdsocklib_recvmsg", "bsdsocklib_gethostname", "bsdsocklib_gethostid", "bsdsocklib_SocketBaseTagList", + "bsdsocklib_GetSocketEvents" +}; + +static uae_u32 sockfuncvecs[sizeof (sockfuncs) / sizeof (*sockfuncs)]; void bsdlib_install (void) { uae_u32 resname, resid; - uae_u32 begin, end, inittable; + uae_u32 begin, end; uae_u32 func_place, data_place, init_place; int i; + if (currprefs.socket_emu == 0) + return; + if (!init_socket_layer ()) return; @@ -1256,7 +1374,7 @@ void bsdlib_install (void) for (i = 0; i < (int) (sizeof (sockfuncs) / sizeof (sockfuncs[0])); i++) { sockfuncvecs[i] = here (); - calltrap (deftrap2 (sockfuncs[i], TRAPFLAG_EXTRA_STACK, "")); + calltrap (deftrap2 (sockfuncs[i], TRAPFLAG_EXTRA_STACK, funcnames[i])); dw (RTS); } @@ -1308,10 +1426,16 @@ void bsdlib_install (void) org (end); } -#else /* ! BSDSOCKET_SUPPORTED */ +#else /* ! BSDSOCKET */ + +void bsdlib_install (void) +{ + return; +} void bsdlib_reset (void) { + return; } -#endif /* ! BSDSOCKET_SUPPORTED */ +#endif