mirror of
https://github.com/ksherlock/marignotti.git
synced 2024-12-11 17:51:04 +00:00
accept/listen support.
This commit is contained in:
parent
7bd4d900c7
commit
7d93e491c1
2
driver.c
2
driver.c
@ -69,6 +69,7 @@ int driver(
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PRU_ACCEPT:
|
case PRU_ACCEPT:
|
||||||
|
return maccept(e, p1, p2, p3, p4, p5);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PRU_ATTACH:
|
case PRU_ATTACH:
|
||||||
@ -112,6 +113,7 @@ int driver(
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PRU_LISTEN:
|
case PRU_LISTEN:
|
||||||
|
return mlisten(e, p1, p2, p3, p4, p5);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PRU_PEERADDR:
|
case PRU_PEERADDR:
|
||||||
|
122
maccept.c
Normal file
122
maccept.c
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
#include "marignotti.h"
|
||||||
|
#include <gno/kerntool.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "s16debug.h"
|
||||||
|
|
||||||
|
|
||||||
|
static int sock_accept(
|
||||||
|
Entry *e,
|
||||||
|
int *newfd,
|
||||||
|
selwakeupfx fx,
|
||||||
|
xsockaddr_in *addr,
|
||||||
|
int *addrlen)
|
||||||
|
{
|
||||||
|
int ipid;
|
||||||
|
Word t;
|
||||||
|
Entry *child;
|
||||||
|
|
||||||
|
IncBusy();
|
||||||
|
ipid = TCPIPAcceptTCP(e->ipid, 0);
|
||||||
|
t = _toolErr;
|
||||||
|
DecBusy();
|
||||||
|
|
||||||
|
if (t == terrNOINCOMING) return EAGAIN;
|
||||||
|
if (t == terrNOTSERVER) return EINVAL;
|
||||||
|
if (t) return ENETDOWN; // ?
|
||||||
|
|
||||||
|
child = create_entry(ipid);
|
||||||
|
if (!child)
|
||||||
|
{
|
||||||
|
TCPIPAbortTCP(ipid);
|
||||||
|
TCPIPLogout(ipid);
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set up child options.
|
||||||
|
child->_TYPE = SOCK_STREAM;
|
||||||
|
child->select_fx = fx;
|
||||||
|
|
||||||
|
// address...
|
||||||
|
if (addr && addrlen)
|
||||||
|
{
|
||||||
|
if (*addrlen >= 8)
|
||||||
|
{
|
||||||
|
destRec dr;
|
||||||
|
Word port;
|
||||||
|
|
||||||
|
IncBusy();
|
||||||
|
TCPIPGetDestination(ipid, &dr);
|
||||||
|
DecBusy();
|
||||||
|
|
||||||
|
port = dr.drDestPort;
|
||||||
|
|
||||||
|
asm {
|
||||||
|
lda <port
|
||||||
|
xba
|
||||||
|
sta <port
|
||||||
|
}
|
||||||
|
addr->sin_port = port;
|
||||||
|
addr->sin_addr = dr.drDestIP;
|
||||||
|
addr->sin_family = AF_INET;
|
||||||
|
|
||||||
|
*addrlen = 8;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*addrlen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
*newfd = ipid;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int maccept(Entry *e, void *p1, void *p2, void *p3, void *p4, void *p5)
|
||||||
|
{
|
||||||
|
int t;
|
||||||
|
Word ipid;
|
||||||
|
int xerrno;
|
||||||
|
|
||||||
|
int *newfd = (int *)p1;
|
||||||
|
selwakeupfx fx = (selwakeupfx)p2;
|
||||||
|
xsockaddr_in *addr = (xsockaddr_in *)p3;
|
||||||
|
int *addrlen = (int *)p4;
|
||||||
|
|
||||||
|
|
||||||
|
if (Debug > 0)
|
||||||
|
{
|
||||||
|
s16_debug_printf("accept");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (e->_TYPE != SOCK_STREAM) return EOPNOTSUPP;
|
||||||
|
|
||||||
|
|
||||||
|
xerrno = sock_accept(e, newfd, fx, addr, addrlen);
|
||||||
|
|
||||||
|
if (xerrno != EAGAIN || e->_NONBLOCK)
|
||||||
|
{
|
||||||
|
return xerrno;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
xerrno = queue_command(e, kCommandAccept, 0, 0);
|
||||||
|
if (xerrno == EINTR) return EINTR;
|
||||||
|
if (xerrno) return EIO;
|
||||||
|
|
||||||
|
if (e->command) continue; // reset to 0 if processed.
|
||||||
|
|
||||||
|
xerrno = sock_accept(e, newfd, fx, addr, addrlen);
|
||||||
|
|
||||||
|
if (xerrno != EAGAIN) return xerrno;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -2,7 +2,7 @@ CFLAGS += $(DEFINES) -v -w
|
|||||||
OBJS = main.o table.o driver.o s16debug.o \
|
OBJS = main.o table.o driver.o s16debug.o \
|
||||||
mattach.o mconnect.o mread.o mwrite.o mdetach.o \
|
mattach.o mconnect.o mread.o mwrite.o mdetach.o \
|
||||||
mioctl.o mshutdown.o mgetsockopt.o msetsockopt.o \
|
mioctl.o mshutdown.o mgetsockopt.o msetsockopt.o \
|
||||||
mgetsockname.o mselect.o
|
mgetsockname.o mselect.o maccept.o mlisten.o
|
||||||
|
|
||||||
TARGET = marignotti
|
TARGET = marignotti
|
||||||
|
|
||||||
@ -27,6 +27,8 @@ mshutdown.o: mshutdown.c marignotti.h
|
|||||||
mioctl.o: mioctl.c marignotti.h
|
mioctl.o: mioctl.c marignotti.h
|
||||||
mgetsockname.o: mgetsockname.c marignotti.h
|
mgetsockname.o: mgetsockname.c marignotti.h
|
||||||
mselect.o: mselect.c marignotti.h
|
mselect.o: mselect.c marignotti.h
|
||||||
|
mlisten.o: mlisten.c marignotti.h
|
||||||
|
maccept.o: maccept.c marignotti.h
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) *.o *.root
|
$(RM) *.o *.root
|
||||||
|
@ -7,9 +7,10 @@ enum {
|
|||||||
kCommandConnect,
|
kCommandConnect,
|
||||||
kCommandDisconnect,
|
kCommandDisconnect,
|
||||||
kCommandDisconnectAndLogout,
|
kCommandDisconnectAndLogout,
|
||||||
|
kCommandAbortAndLogout,
|
||||||
kCommandRead,
|
kCommandRead,
|
||||||
kCommandWrite,
|
kCommandWrite,
|
||||||
kCommandAbortAndLogout
|
kCommandAccept
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void (*selwakeupfx)(int collision, int pid);
|
typedef void (*selwakeupfx)(int collision, int pid);
|
||||||
@ -116,7 +117,6 @@ int mdisconnect(Entry *, void *p1, void *p2, void *p3, void *p4, void *p5);
|
|||||||
|
|
||||||
int mshutdown(Entry *, void *p1, void *p2, void *p3, void *p4, void *p5);
|
int mshutdown(Entry *, void *p1, void *p2, void *p3, void *p4, void *p5);
|
||||||
|
|
||||||
|
|
||||||
int mgetsockopt(Entry *, void *p1, void *p2, void *p3, void *p4, void *p5);
|
int mgetsockopt(Entry *, void *p1, void *p2, void *p3, void *p4, void *p5);
|
||||||
int msetsockopt(Entry *, void *p1, void *p2, void *p3, void *p4, void *p5);
|
int msetsockopt(Entry *, void *p1, void *p2, void *p3, void *p4, void *p5);
|
||||||
|
|
||||||
@ -124,6 +124,9 @@ int mioctl(Entry *, void *p1, void *p2, void *p3, void *p4, void *p5);
|
|||||||
int mgetsockname(Entry *, void *p1, void *p2, void *p3, void *p4, void *p5);
|
int mgetsockname(Entry *, void *p1, void *p2, void *p3, void *p4, void *p5);
|
||||||
int mselect(Entry *, void *p1, void *p2, void *p3, void *p4, void *p5);
|
int mselect(Entry *, void *p1, void *p2, void *p3, void *p4, void *p5);
|
||||||
|
|
||||||
|
int maccept(Entry *e, void *p1, void *p2, void *p3, void *p4, void *p5);
|
||||||
|
int mlisten(Entry *e, void *p1, void *p2, void *p3, void *p4, void *p5);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
43
mlisten.c
Normal file
43
mlisten.c
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#include "marignotti.h"
|
||||||
|
#include <gno/kerntool.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
#include "s16debug.h"
|
||||||
|
|
||||||
|
|
||||||
|
#pragma noroot
|
||||||
|
#pragma optimize 79
|
||||||
|
|
||||||
|
int mlisten(Entry *e, void *p1, void *p2, void *p3, void *p4, void *p5)
|
||||||
|
{
|
||||||
|
Word terr;
|
||||||
|
Word t;
|
||||||
|
|
||||||
|
int backlog = p1 ? *(int *)p1 : 0;
|
||||||
|
|
||||||
|
if (Debug > 0)
|
||||||
|
{
|
||||||
|
s16_debug_printf("listen backlog = %d", backlog);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (e->_TYPE != SOCK_STREAM)
|
||||||
|
return EOPNOTSUPP;
|
||||||
|
|
||||||
|
IncBusy();
|
||||||
|
terr = TCPIPListenTCP(e->ipid);
|
||||||
|
t = _toolErr;
|
||||||
|
if (t) terr = t;
|
||||||
|
DecBusy();
|
||||||
|
|
||||||
|
if (t) return ENETDOWN;
|
||||||
|
|
||||||
|
// not in TCPSCLOSED state.
|
||||||
|
if (terr = tcperrConExists) return EINVAL;
|
||||||
|
if (terr) return EINVAL; // other errors?
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user