mirror of
https://github.com/ksherlock/marignotti.git
synced 2024-12-12 10:30:13 +00:00
new code.
This commit is contained in:
parent
94c54160d8
commit
c58d6d456d
165
driver.c
Normal file
165
driver.c
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
#include "marignotti.h"
|
||||||
|
#include <gno/kerntool.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include "net.h"
|
||||||
|
|
||||||
|
#pragma noroot
|
||||||
|
#pragma optimize 79
|
||||||
|
|
||||||
|
int block(int sem)
|
||||||
|
{
|
||||||
|
int xerrno = 0;
|
||||||
|
Kswait(sem, &xerrno);
|
||||||
|
return xerrno;
|
||||||
|
}
|
||||||
|
|
||||||
|
int queue_command(Entry *e, word command, LongWord cookie, LongWord timeout)
|
||||||
|
{
|
||||||
|
int xerrno;
|
||||||
|
|
||||||
|
SEI();
|
||||||
|
e->command = kCommandRead;
|
||||||
|
e->cookie = cookie;
|
||||||
|
e->timeout = timeout;
|
||||||
|
CLI();
|
||||||
|
|
||||||
|
xerrno = 0;
|
||||||
|
Kswait(e->semaphore, &xerrno);
|
||||||
|
return xerrno;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#pragma databank 1
|
||||||
|
|
||||||
|
int driver(
|
||||||
|
int socknum, int req,
|
||||||
|
void *p1, void *p2,
|
||||||
|
void *p3, void *p4, void *p5)
|
||||||
|
{
|
||||||
|
int rv;
|
||||||
|
Entry *e;
|
||||||
|
|
||||||
|
if (req == PRU_ATTACH)
|
||||||
|
{
|
||||||
|
return mattach(socknum, p1, p2, p3, p4, p5);
|
||||||
|
}
|
||||||
|
|
||||||
|
e = find_entry(socknum);
|
||||||
|
if (!e)
|
||||||
|
{
|
||||||
|
if (req == PRU_RCVD || req == PRU_SEND)
|
||||||
|
*(LongWord *)p2 = 0;
|
||||||
|
|
||||||
|
return EBADF;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (req)
|
||||||
|
{
|
||||||
|
case PRU_ABORT:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_ACCEPT:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_ATTACH:
|
||||||
|
// KERNsocket(int domain, int type, int protocol, int *ERRNO);
|
||||||
|
// handled above.
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_BIND:
|
||||||
|
// KERNbind(int fd, struct sockaddr *my_addr, int addrlen, int *ERRNO)
|
||||||
|
//return do_bind(socknum, m, m_len, addr, addrlen, rights);
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_CONNECT:
|
||||||
|
// KERNconnect(int fd, struct sockaddr *serv_addr,
|
||||||
|
// int addrlen, int *ERRNO)
|
||||||
|
return mconnect(e, p1, p2, p3, p4, p5);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_CONNECT2:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_CONTROL:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_DETACH:
|
||||||
|
// called from GS/OS
|
||||||
|
// int SOCKclose(int sock) part 2
|
||||||
|
DecBusy();
|
||||||
|
rv = mdetach(e, p1, p2, p3, p4, p5);
|
||||||
|
IncBusy();
|
||||||
|
return rv;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_DISCONNECT:
|
||||||
|
// called from GS/OS
|
||||||
|
// int SOCKclose(int sock) part 1
|
||||||
|
//return do_disconnect(socknum, m, m_len, addr, addrlen, rights);
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_LISTEN:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_PEERADDR:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_RCVD:
|
||||||
|
// this may be called from GSOS (in which case IncBusy()
|
||||||
|
// is in effect
|
||||||
|
// or from KERNrecvfrom (in which case it isn't).
|
||||||
|
//
|
||||||
|
// may block, so be nice.
|
||||||
|
// SOCKrdwr(struct rwPBlock *pb, word cmd, int sock)
|
||||||
|
DecBusy();
|
||||||
|
rv = mread(e, p1, p2, p3, p4, p5);
|
||||||
|
IncBusy();
|
||||||
|
return rv;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_RCVOOB:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_SEND:
|
||||||
|
// SOCKrdwr(struct rwPBlock *pb, word cmd, int sock)
|
||||||
|
// same as above.
|
||||||
|
DecBusy();
|
||||||
|
rv = mwrite(e, p1, p2, p3, p4, p5);
|
||||||
|
IncBusy();
|
||||||
|
return rv;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_SENDOOB:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_SENSE:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_SHUTDOWN:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_SOCKADDR:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_CO_GETOPT:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_CO_SETOPT:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRU_SELECT:
|
||||||
|
// int SOCKselect(int pid, int fl, int sock)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma databank 0
|
150
main.c
Normal file
150
main.c
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
#include "marignotti.h"
|
||||||
|
|
||||||
|
#include <memory.h>
|
||||||
|
#include <texttool.h>
|
||||||
|
#include <misctool.h>
|
||||||
|
#include <locator.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
#include <gno/gno.h>
|
||||||
|
|
||||||
|
#pragma optimize 79
|
||||||
|
|
||||||
|
int semID = 0;
|
||||||
|
Word MyID;
|
||||||
|
Word QuitFlag;
|
||||||
|
|
||||||
|
#pragma databank 0
|
||||||
|
void signal_handler(int sig, int code)
|
||||||
|
{
|
||||||
|
WriteLine("\pWe got signal!");
|
||||||
|
QuitFlag = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisplayMessage(const char *string)
|
||||||
|
{
|
||||||
|
if (string) WriteLine(string);
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma databank 0
|
||||||
|
|
||||||
|
// startup/shutdown flags.
|
||||||
|
enum {
|
||||||
|
kLoaded = 1,
|
||||||
|
kStarted = 2,
|
||||||
|
kConnected = 4
|
||||||
|
};
|
||||||
|
|
||||||
|
Word StartUp(displayPtr fx)
|
||||||
|
{
|
||||||
|
word status;
|
||||||
|
word flags = 0;
|
||||||
|
|
||||||
|
// TCPIP is an init, not a tool, so it should always
|
||||||
|
// be loaded.
|
||||||
|
|
||||||
|
status = TCPIPStatus();
|
||||||
|
if (_toolErr)
|
||||||
|
{
|
||||||
|
LoadOneTool(54, 0x0300);
|
||||||
|
if (_toolErr) return -1;
|
||||||
|
|
||||||
|
status = 0;
|
||||||
|
flags |= kLoaded;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
// require 3.0b3
|
||||||
|
if (TCPIPLongVersion() < 0x03006003)
|
||||||
|
{
|
||||||
|
if (fx) fx("Marinetti 3.0b3 is required.");
|
||||||
|
if (flags & kLoaded)
|
||||||
|
UnloadOneTool(54);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!status)
|
||||||
|
{
|
||||||
|
TCPIPStartUp();
|
||||||
|
if (_toolErr) return -1;
|
||||||
|
flags |= kStarted;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = TCPIPGetConnectStatus();
|
||||||
|
if (!status)
|
||||||
|
{
|
||||||
|
TCPIPConnect(fx);
|
||||||
|
flags |= kConnected;
|
||||||
|
}
|
||||||
|
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShutDown(word flags, Boolean force, displayPtr fx)
|
||||||
|
{
|
||||||
|
if (flags & kConnected)
|
||||||
|
{
|
||||||
|
TCPIPDisconnect(force, fx);
|
||||||
|
if (_toolErr) return;
|
||||||
|
}
|
||||||
|
if (flags & kStarted)
|
||||||
|
{
|
||||||
|
TCPIPShutDown();
|
||||||
|
if (_toolErr) return;
|
||||||
|
}
|
||||||
|
if (flags & kLoaded)
|
||||||
|
{
|
||||||
|
UnloadOneTool(54);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
|
||||||
|
int flags;
|
||||||
|
|
||||||
|
MyID = MMStartUp();
|
||||||
|
|
||||||
|
flags = StartUp(DisplayMessage);
|
||||||
|
|
||||||
|
if (flags == -1) exit(1);
|
||||||
|
|
||||||
|
semID = screate(1);
|
||||||
|
|
||||||
|
InstallNetDriver(driver, 0);
|
||||||
|
|
||||||
|
QuitFlag = 0;
|
||||||
|
|
||||||
|
signal(SIGQUIT, signal_handler);
|
||||||
|
signal(SIGINT, signal_handler);
|
||||||
|
signal(SIGHUP, signal_handler);
|
||||||
|
|
||||||
|
// SIGUSR to dump table ala netstat?
|
||||||
|
while (!QuitFlag)
|
||||||
|
{
|
||||||
|
|
||||||
|
IncBusy();
|
||||||
|
|
||||||
|
TCPIPPoll();
|
||||||
|
|
||||||
|
DecBusy();
|
||||||
|
|
||||||
|
process_table();
|
||||||
|
|
||||||
|
asm { cop 0x7f }
|
||||||
|
}
|
||||||
|
|
||||||
|
InstallNetDriver(NULL, 0);
|
||||||
|
sdelete(semID);
|
||||||
|
|
||||||
|
destroy_table();
|
||||||
|
|
||||||
|
ShutDown(flags, 0, DisplayMessage);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
19
makefile.mk
19
makefile.mk
@ -1,14 +1,25 @@
|
|||||||
CFLAGS += $(DEFINES) -v -w
|
CFLAGS += $(DEFINES) -v -w
|
||||||
OBJS = marignotti.o
|
OBJS = main.o table.o driver.o s16debug.o mattach.o mconnect.o \
|
||||||
|
mread.o mwrite.o mdetach.o
|
||||||
|
|
||||||
TARGET = marignotti
|
TARGET = marignotti
|
||||||
|
|
||||||
$(TARGET): $(OBJS)
|
$(TARGET): $(OBJS)
|
||||||
$(CC) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $@
|
$(CC) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $@
|
||||||
|
|
||||||
marignotti.o: marignotti.c net.h
|
|
||||||
|
|
||||||
pull:
|
|
||||||
gopher gopher://192.168.1.117:7070/0/marignotti.c > marignotti.c
|
s16debug.o: s16debug.c s16debug.h
|
||||||
|
|
||||||
|
main.o: main.c marignotti.h
|
||||||
|
table.o: table.c marignotti.h
|
||||||
|
driver.o: driver.c marignotti.h net.h
|
||||||
|
mread.o: mread.c marignotti.h
|
||||||
|
mwrite.o: mwrite.c marignotti.h
|
||||||
|
mattach.o: mattach.c marignotti.h
|
||||||
|
mconnect.o: mconnect.c marignotti.h
|
||||||
|
mdetach.o: mdetach.c marignotti.h
|
||||||
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) *.o *.root
|
$(RM) *.o *.root
|
||||||
|
97
marignotti.h
Normal file
97
marignotti.h
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
#include <tcpip.h>
|
||||||
|
#include <gno/gno.h>
|
||||||
|
|
||||||
|
|
||||||
|
enum {
|
||||||
|
kCommandNone = 0,
|
||||||
|
kCommandConnect,
|
||||||
|
kCommandDisconnect,
|
||||||
|
kCommandDisconnectAndLogout,
|
||||||
|
kCommandRead,
|
||||||
|
kCommandWrite,
|
||||||
|
kCommandAbortAndLogout
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct Entry {
|
||||||
|
struct Entry *next;
|
||||||
|
|
||||||
|
Word ipid;
|
||||||
|
int semaphore;
|
||||||
|
|
||||||
|
srBuff sr;
|
||||||
|
Word terr;
|
||||||
|
|
||||||
|
Word command;
|
||||||
|
LongWord cookie;
|
||||||
|
LongWord timeout;
|
||||||
|
|
||||||
|
// shutdown(2)
|
||||||
|
unsigned _SHUT_RD:1;
|
||||||
|
unsigned _SHUT_WR:1;
|
||||||
|
|
||||||
|
// fcntl(2)
|
||||||
|
unsigned _NONBLOCK:1;
|
||||||
|
|
||||||
|
//setsockopt(2)
|
||||||
|
unsigned _OOBINLINE:1;
|
||||||
|
unsigned _LINGER:1;
|
||||||
|
unsigned _NOSIGPIPE:1;
|
||||||
|
|
||||||
|
LongWord _SNDLOWAT;
|
||||||
|
LongWord _RCVLOWAT;
|
||||||
|
Word _RCVTIMEO;
|
||||||
|
Word _LINGER_SEC;
|
||||||
|
|
||||||
|
|
||||||
|
} Entry;
|
||||||
|
|
||||||
|
extern Word MyID;
|
||||||
|
|
||||||
|
typedef struct xsockaddr_in {
|
||||||
|
short sin_family;
|
||||||
|
unsigned short sin_port;
|
||||||
|
unsigned long sin_addr;
|
||||||
|
char sin_zero[8];
|
||||||
|
} xsockaddr_in;
|
||||||
|
|
||||||
|
|
||||||
|
#define IncBusy() asm { jsl 0xE10064 }
|
||||||
|
#define DecBusy() asm { jsl 0xE10068 }
|
||||||
|
#define Resched() asm { cop 0x7f }
|
||||||
|
|
||||||
|
#define SEI() asm { sei }
|
||||||
|
#define CLI() asm { cli }
|
||||||
|
|
||||||
|
int block(int sem);
|
||||||
|
int queue_command(Entry *e, word command, LongWord cookie, LongWord timeout);
|
||||||
|
|
||||||
|
void init_table(void);
|
||||||
|
void destroy_table(void);
|
||||||
|
void process_table(void);
|
||||||
|
|
||||||
|
Entry *find_entry(Word ipid);
|
||||||
|
Entry *create_entry(Word ipid);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// driver stuff.
|
||||||
|
|
||||||
|
int driver(int, int, void *, void *, void *, void *, void *);
|
||||||
|
|
||||||
|
int mattach(int ipid, void *p1, void *p2, void *p3, void *p4, void *p5);
|
||||||
|
|
||||||
|
int mread(Entry *, void *p1, void *p2, void *p3, void *p4, void *p5);
|
||||||
|
int mwrite(Entry *, void *p1, void *p2, void *p3, void *p4, void *p5);
|
||||||
|
int mconnect(Entry *, void *p1, void *p2, void *p3, void *p4, void *p5);
|
||||||
|
int mbind(Entry *, void *p1, void *p2, void *p3, void *p4, void *p5);
|
||||||
|
int mdetach(Entry *, void *p1, void *p2, void *p3, void *p4, void *p5);
|
||||||
|
int mdisconnect(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 mioctl(Entry *, void *p1, void *p2, void *p3, void *p4, void *p5);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
40
mattach.c
Normal file
40
mattach.c
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#include "marignotti.h"
|
||||||
|
#include <gno/kerntool.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
|
||||||
|
#pragma noroot
|
||||||
|
#pragma optimize 79
|
||||||
|
|
||||||
|
// better known as socket(2)
|
||||||
|
int mattach(int type, void *p1, void *p2, void *p3, void *p4, void *p5)
|
||||||
|
{
|
||||||
|
Word t;
|
||||||
|
Word ipid;
|
||||||
|
Entry *e;
|
||||||
|
|
||||||
|
// p2 = selwakeup.
|
||||||
|
int protocol = *(int *)p3;
|
||||||
|
|
||||||
|
if (type != SOCK_STREAM) return ESOCKTNOSUPPORT;
|
||||||
|
if (protocol != 6) return EPROTONOSUPPORT;
|
||||||
|
// TODO -- check protocol? 6 = tcp, 1 = icmp, 17 = udp.
|
||||||
|
|
||||||
|
IncBusy();
|
||||||
|
ipid = TCPIPLogin(MyID, 0, 0, 0, 0x0040);
|
||||||
|
t = _toolErr;
|
||||||
|
DecBusy();
|
||||||
|
|
||||||
|
if (t) return ENETDOWN;
|
||||||
|
|
||||||
|
e = create_entry(ipid);
|
||||||
|
if (!e)
|
||||||
|
{
|
||||||
|
TCPIPLogout(ipid);
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
*(Word *)p1 = ipid;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
114
mconnect.c
Normal file
114
mconnect.c
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
#include "marignotti.h"
|
||||||
|
#include <gno/kerntool.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <misctool.h>
|
||||||
|
|
||||||
|
#pragma noroot
|
||||||
|
#pragma optimize 79
|
||||||
|
|
||||||
|
int mconnect(Entry *e, void *p1, void *p2, void *p3, void *p4, void *p5)
|
||||||
|
{
|
||||||
|
Word port;
|
||||||
|
Word t;
|
||||||
|
Word terr;
|
||||||
|
int xerrno;
|
||||||
|
LongWord timeout;
|
||||||
|
|
||||||
|
// todo -- if non-blocking,
|
||||||
|
// return EINPROGRESS
|
||||||
|
//
|
||||||
|
|
||||||
|
xsockaddr_in *sin = (xsockaddr_in *)p3;
|
||||||
|
int addrlen = *(int *)p4;
|
||||||
|
|
||||||
|
port = sin->sin_port;
|
||||||
|
asm {
|
||||||
|
lda <port
|
||||||
|
xba
|
||||||
|
sta <port
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if already connected.
|
||||||
|
IncBusy();
|
||||||
|
terr = TCPIPStatusTCP(e->ipid, &e->sr);
|
||||||
|
t = _toolErr;
|
||||||
|
if (t) terr = t;
|
||||||
|
DecBusy();
|
||||||
|
|
||||||
|
// todo -- if non-blocking,
|
||||||
|
// return EINPROGRESS first time,
|
||||||
|
// return EALREADY on subsequent calls.
|
||||||
|
|
||||||
|
if (e->sr.srState != TCPSCLOSED)
|
||||||
|
return EISCONN;
|
||||||
|
|
||||||
|
|
||||||
|
IncBusy();
|
||||||
|
TCPIPSetNewDestination(e->ipid, sin->sin_addr, port);
|
||||||
|
t = _toolErr;
|
||||||
|
DecBusy();
|
||||||
|
|
||||||
|
if (t)
|
||||||
|
{
|
||||||
|
return ENETDOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
IncBusy();
|
||||||
|
terr = TCPIPOpenTCP(e->ipid);
|
||||||
|
t = _toolErr;
|
||||||
|
if (t) terr = t;
|
||||||
|
DecBusy();
|
||||||
|
|
||||||
|
// todo -- better errors.
|
||||||
|
if (terr)
|
||||||
|
{
|
||||||
|
return ENETDOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
timeout = GetTick() + 60 * 30;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
|
||||||
|
int xerrno;
|
||||||
|
int state;
|
||||||
|
|
||||||
|
xerrno = queue_command(e, kCommandConnect, 0, timeout);
|
||||||
|
|
||||||
|
// hmmm .. should these abort?
|
||||||
|
if (xerrno == EINTR)
|
||||||
|
{
|
||||||
|
IncBusy();
|
||||||
|
e->command = kCommandNone;
|
||||||
|
TCPIPAbortTCP(e->ipid);
|
||||||
|
DecBusy();
|
||||||
|
|
||||||
|
return EINTR; // ?
|
||||||
|
}
|
||||||
|
if (xerrno) return EIO; // semaphore destroyed?
|
||||||
|
|
||||||
|
if (e->command) continue; // reset to 0 if processed.
|
||||||
|
|
||||||
|
state = e->sr.srState;
|
||||||
|
if (state == TCPSESTABLISHED)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (state == TCPSCLOSED)
|
||||||
|
// todo -- differentiate ECONNREFUSED vs EHOSTUNREACH
|
||||||
|
return ECONNREFUSED;
|
||||||
|
|
||||||
|
if (timeout && timeout > GetTick())
|
||||||
|
{
|
||||||
|
IncBusy();
|
||||||
|
TCPIPAbortTCP(e->ipid);
|
||||||
|
DecBusy();
|
||||||
|
|
||||||
|
return ETIMEDOUT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return 0; // should never hit.
|
||||||
|
|
||||||
|
}
|
22
mdetach.c
Normal file
22
mdetach.c
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#include "marignotti.h"
|
||||||
|
#include <gno/kerntool.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
|
||||||
|
#pragma noroot
|
||||||
|
#pragma optimize 79
|
||||||
|
|
||||||
|
//
|
||||||
|
int mdetach(Entry *e, void *p1, void *p2, void *p3, void *p4, void *p5)
|
||||||
|
{
|
||||||
|
|
||||||
|
// TODO -- SO_LINGER/SO_LINGER_SEC
|
||||||
|
|
||||||
|
SEI();
|
||||||
|
e->command = kCommandDisconnectAndLogout;
|
||||||
|
e->cookie = 0;
|
||||||
|
e->timeout = 0;
|
||||||
|
CLI();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
202
table.c
Normal file
202
table.c
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
#include "marignotti.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <misctool.h>
|
||||||
|
|
||||||
|
#pragma optimize 79
|
||||||
|
#pragma noroot
|
||||||
|
|
||||||
|
#define TABLE_SIZE 16
|
||||||
|
#define TABLE_MASK 15
|
||||||
|
static struct Entry *table[TABLE_SIZE];
|
||||||
|
|
||||||
|
void init_table(void)
|
||||||
|
{
|
||||||
|
memset(table, 0, sizeof(table));
|
||||||
|
}
|
||||||
|
|
||||||
|
void destroy_table(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
Entry *e;
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
for (i = 0; i < TABLE_SIZE; ++i)
|
||||||
|
{
|
||||||
|
SEI();
|
||||||
|
e = table[i];
|
||||||
|
table[i] = 0;
|
||||||
|
CLI();
|
||||||
|
|
||||||
|
while (e)
|
||||||
|
{
|
||||||
|
Entry *next;
|
||||||
|
|
||||||
|
IncBusy();
|
||||||
|
|
||||||
|
next = e->next;
|
||||||
|
|
||||||
|
TCPIPAbortTCP(e->ipid);
|
||||||
|
TCPIPLogout(e->ipid);
|
||||||
|
|
||||||
|
sdelete(e->semaphore);
|
||||||
|
free(e);
|
||||||
|
|
||||||
|
e = next;
|
||||||
|
|
||||||
|
DecBusy();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Entry *find_entry(Word ipid)
|
||||||
|
{
|
||||||
|
Entry *e;
|
||||||
|
|
||||||
|
IncBusy();
|
||||||
|
e = table[ipid & TABLE_MASK];
|
||||||
|
|
||||||
|
while (e)
|
||||||
|
{
|
||||||
|
if (e->ipid == ipid) break;
|
||||||
|
e = e->next;
|
||||||
|
}
|
||||||
|
DecBusy();
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
Entry *create_entry(Word ipid)
|
||||||
|
{
|
||||||
|
Entry *e;
|
||||||
|
e = NULL;
|
||||||
|
IncBusy();
|
||||||
|
e = calloc(sizeof(Entry), 1);
|
||||||
|
DecBusy();
|
||||||
|
|
||||||
|
if (!e) return NULL;
|
||||||
|
e->semaphore = screate(0);
|
||||||
|
if (e->semaphore < 0)
|
||||||
|
{
|
||||||
|
IncBusy();
|
||||||
|
free(e);
|
||||||
|
DecBusy();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
e->ipid = ipid;
|
||||||
|
e->_OOBINLINE = 1;
|
||||||
|
e->_SNDLOWAT = 1024;
|
||||||
|
e->_RCVLOWAT = 1;
|
||||||
|
|
||||||
|
SEI();
|
||||||
|
e->next = table[ipid & TABLE_MASK];
|
||||||
|
table[ipid & TABLE_MASK] = e;
|
||||||
|
CLI();
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
void process_table(void)
|
||||||
|
{
|
||||||
|
Word terr;
|
||||||
|
Word t;
|
||||||
|
LongWord tick;
|
||||||
|
|
||||||
|
unsigned i;
|
||||||
|
Entry *e;
|
||||||
|
Entry *next;
|
||||||
|
Entry *prev;
|
||||||
|
|
||||||
|
tick = GetTick();
|
||||||
|
|
||||||
|
for (i = 0; i < TABLE_SIZE; ++i)
|
||||||
|
{
|
||||||
|
prev = NULL;
|
||||||
|
e = table[i];
|
||||||
|
while (e)
|
||||||
|
{
|
||||||
|
next = e->next;
|
||||||
|
|
||||||
|
if (e->command)
|
||||||
|
{
|
||||||
|
Word expired = 0;
|
||||||
|
Word sig = 0;
|
||||||
|
Word state;
|
||||||
|
|
||||||
|
IncBusy();
|
||||||
|
|
||||||
|
|
||||||
|
if (e->timeout && tick > e->timeout)
|
||||||
|
expired = 1;
|
||||||
|
|
||||||
|
terr = TCPIPStatusTCP(e->ipid, &e->sr);
|
||||||
|
t = _toolErr;
|
||||||
|
if (t) terr = t;
|
||||||
|
e->terr = terr;
|
||||||
|
|
||||||
|
state = e->sr.srState;
|
||||||
|
|
||||||
|
switch(e->command)
|
||||||
|
{
|
||||||
|
case kCommandRead:
|
||||||
|
if (e->sr.srRcvQueued >= e->cookie
|
||||||
|
|| expired
|
||||||
|
|| terr)
|
||||||
|
{
|
||||||
|
sig = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kCommandConnect:
|
||||||
|
if (state >= TCPSESTABLISHED || state == TCPSCLOSED)
|
||||||
|
{
|
||||||
|
sig = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kCommandDisconnect:
|
||||||
|
if (state == TCPSCLOSED)
|
||||||
|
{
|
||||||
|
sig = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kCommandDisconnectAndLogout:
|
||||||
|
// logout and remove entry.
|
||||||
|
if (state == TCPSCLOSED)
|
||||||
|
{
|
||||||
|
TCPIPLogout(e->ipid);
|
||||||
|
sdelete(e->semaphore);
|
||||||
|
free(e);
|
||||||
|
e = NULL;
|
||||||
|
if (prev)
|
||||||
|
{
|
||||||
|
prev->next = next;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
table[i] = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sig)
|
||||||
|
{
|
||||||
|
e->command = kCommandNone;
|
||||||
|
ssignal(e->semaphore);
|
||||||
|
}
|
||||||
|
|
||||||
|
DecBusy();
|
||||||
|
} // e->command
|
||||||
|
|
||||||
|
e = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user