home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
200-299
/
ff294.lzh
/
DNet
/
amiga
/
dnet
/
ipc.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-12-11
|
4KB
|
275 lines
/*
* IPC.C
*
* Handle IPC messages
*
* NOTE: Only an explicit disconnect command will drop DTR, or when
* the serial.device is closed.
*/
static int dummy;
#ifdef NOTDEF
#include "dnet.h"
#include <local/ipc.h>
#define IPCMDS struct _IPCMDS
void do_online(), do_offline(), do_stat(), do_quit(), do_disconnect();
void do_state();
void do_recvon(), do_recvoff(), do_serialon(), do_serialoff();
void do_baud();
void do_getidle(), do_getconnect(), do_setidlealert(), do_setconnectalert();
void do_lessconnect(), do_resetconnect(), do_resetidle();
IPCMDS {
short args;
char *name;
void (*func)();
};
IPCMDS IPCmds[] = {
0, "online" , do_online,
0, "offline", do_offline,
0, "stat", do_stat,
0, "quit", do_quit,
0, "disconnect", do_disconnect,
0, "state", do_state,
0, "recvon", do_recvon,
0, "recvoff", do_recvoff,
0, "serialon", do_serialon,
0, "serialoff", do_serialoff,
1, "baud", do_baud,
0, "getidle", do_getidle,
0, "getconn", do_getconnect,
2, "setidlealert", do_setidlealert,
2, "setconnalert", do_setconnectalert,
1, "lessconn", do_lessconnect,
0, "resetconn", do_resetconnect,
0, "resetidle", do_resetidle
};
handle_ipc()
{
IPCMSG *msg;
char *ptr;
while (msg = GetMsg(IPCPort)) {
long error = IF_ERROR;
char **av = NULL;
short ac = 0;
short i;
char *buf = NULL;
long len = 0;
if (ptr = (char *)msg->TBuf) {
short networknum = atoi(ptr);
if (networknum == NetworkNum) {
while (*ptr++);
ac = ParseCmd(ptr, &av, NULL, NULL, &error, NULL);
} else {
error = IF_NOTFND;
}
}
for (i = 0; i < ac;) {
IPCMDS *cmds;
for (cmds = IPCmds; cmds != ARYEND(IPCmds); ++cmds) {
if (strcmp(av[i], cmds->name) == 0)
break;
}
if (cmds == ARYEND(IPCmds)) {
error = IF_ERROR;
break;
}
if (i + cmds->args >= ac) {
error = IF_ERROR;
break;
}
error = 0;
(*cmds->func)(av + i, &buf, &len);
i += cmds->args + 1;
}
if (av)
FreeParseCmd(av);
ReplyIPC(msg, buf, len, error);
}
}
void
do_online()
{
OnLine = 1;
}
void
do_offline()
{
OnLine = 0; /* Take DNet off line */
}
void
do_disconnect()
{
OnLine = 0; /* Take DNet off line */
DropDTR(); /* and (temp) drop DTR */
}
void
do_quit()
{
Quit = 1; /* Quit out of dnet */
}
void
do_stat(av, pbuf, plen)
char **pbuf;
long *plen;
{
char buf[256];
char *ptr = buf;
sprintf(ptr, " Bytes Packets Errors\n");
ptr += strlen(ptr);
sprintf(ptr, "OUT: %8ld %8ld %8ld\n", BytesOut, PacketsOut, PacketsResent);
ptr += strlen(ptr);
sprintf(ptr, "IN : %8ld %8ld %8ld\n", BytesIn, PacketsIn, PacketsNakd);
ptr += strlen(ptr);
sprintf(ptr, "Garbage Bytes In: %ld\n", GarbageIn);
ptr += strlen(ptr);
if (ptr - buf > sizeof(buf))
dneterror("do_stat: buffer overrun");
AllocAppend(pbuf, plen, buf, strlen(buf)+1);
}
/*
* Return machine state (ascii)
*
* s iiii:ii oooo:oo (s = 0/1 1=protrunning
* i = idle time hrs:min
* o = online time hrs:min
*/
void
do_state()
{
}
AllocAppend(pbuf, plen, buf, len)
char **pbuf;
long *plen;
char *buf;
long len;
{
char *new;
if (*pbuf) {
new = malloc(*plen + len);
BMov(*pbuf, new, *plen);
free(*pbuf);
*pbuf = new;
new += *plen;
} else {
*pbuf = new = malloc(len);
}
BMov(buf, new, len);
*plen += len;
}
void
do_recvon()
{
NetRecvOn();
}
void
do_recvoff()
{
NetRecvOff();
}
void
do_serialon()
{
NetSerialOn();
}
void
do_serialoff()
{
NetSerialOff();
}
void
do_baud(av)
char **av;
{
long baud = atoi(av[1]);
if (baud) {
Baud = baud;
SetBaudRate(baud);
}
}
void
do_getidle(av, pbuf, plen)
char **av;
char **pbuf;
long *plen;
{
char buf[32];
sprintf(buf, "%ld", GetIdle());
AllocAppend(pbuf, plen, buf, strlen(buf)+1);
}
void
do_getconnect(av, pbuf, plen)
char **av;
char **pbuf;
long *plen;
{
char buf[32];
sprintf(buf, "%ld", GetConnect());
AllocAppend(pbuf, plen, buf, strlen(buf)+1);
}
void
do_setidlealert(av)
char **av;
{
SetIdleAlert(atoi(av[1]), av[2]);
}
void
do_setconnectalert(av)
char **av;
{
SetConnectAlert(atoi(av[1]), av[2]);
}
void
do_lessconnect(av)
char **av;
{
LessConnect(atoi(av[1]));
}
void
do_resetconnect()
{
ResetConnect();
}
void
do_resetidle()
{
ResetIdle();
}
#endif