home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ST-Computer Leser-CD 2000 January
/
LCD_01_2000.iso
/
pd
/
308
/
mgw_021b
/
main.c
< prev
next >
Wrap
Text File
|
1999-08-23
|
4KB
|
198 lines
/*
* Filename:
* Version:
* Author: Frank Naumann
* Started: 1999-05
* Last Updated: 1999-08-22
* Target O/S: MiNT
* Description:
*
* Note: Please send suggestions, patches or bug reports to me
* or the MiNT mailing list <mint@fishpool.com>.
*
* Copying: Copyright 1999 Frank Naumann <fnaumann@cs.uni-magdeburg.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
# include <signal.h>
# include <osbind.h>
# include <mintbind.h>
# include <mint/ssystem.h>
# include "global.h"
# include "mgw.h"
/*
* version
*/
# define VER_MAJOR 0
# define VER_MINOR 21
# define VER_STATUS b
/*
* messages
*/
# define MSG_VERSION str (VER_MAJOR) "." str (VER_MINOR) str (VER_STATUS)
# define MSG_BUILDDATE __DATE__
# define MSG_BOOT \
"\033p Draconis to MiNT-Net gateway " MSG_VERSION " \033q\r\n" \
"Redirect Daemon\r\n"
# define MSG_GREET \
"╜ 1999 Jens Heitmann.\r\n" \
"╜ " MSG_BUILDDATE " Frank Naumann.\r\n\r\n"
# define MSG_MINT \
"\7This program requires FreeMiNT!\r\n"
# define MSG_ALREADY \
"\7There is a active Draconis TCP/IP Cookie!\r\n"
# define MSG_FAILURE \
"\7Sorry, driver NOT installed - initialization failed!\r\n\r\n"
/* ------------------
| Install cookie |
------------------ */
static int
install_cookie (void)
{
long dummy;
if (Ssystem (-1, 0, 0) == -32)
{
Cconws (MSG_MINT);
return 1;
}
if (Ssystem (S_GETCOOKIE, TCPCOOKIE, &dummy) == 0)
{
Cconws (MSG_ALREADY);
return 1;
}
if (Ssystem (S_SETCOOKIE, TCPCOOKIE, tcp_cookie) != 0)
{
return 1;
}
return 0;
}
/* ------------------
| Remove cookie |
------------------ */
static void
uninstall_cookie (void)
{
long old_stk = Super (0L);
long *jar;
jar = *(long **) JAR;
if (jar)
{
while (*jar)
{
if (*jar == TCPCOOKIE)
{
*jar++ = FREECOOKIE;
*jar++ = 0L;
}
jar += 2;
}
}
Super ((void *) old_stk);
}
static void
nothing (long sig)
{
;
}
static void
end (long sig)
{
Psigreturn ();
uninstall_cookie ();
exit (0);
}
int
main (void)
{
(void) Dsetdrv ('U'-'A');
if (fork () == 0)
{
Cconws (MSG_BOOT);
Cconws (MSG_GREET);
if (install_cookie ())
{
Cconws (MSG_FAILURE);
exit (1);
}
Psignal (SIGALRM, nothing);
Psignal (SIGTERM, end);
Psignal (SIGQUIT, end);
Psignal (SIGHUP, nothing);
Psignal (SIGTSTP, nothing);
Psignal (SIGINT, nothing);
Psignal (SIGABRT, nothing);
Psignal (SIGUSR1, nothing);
Psignal (SIGUSR2, nothing);
for (;;)
{
PMSG pmsg;
long r;
r = Pmsg (0, MGW_GETHOSTBYNAME, &pmsg);
if (r)
{
/* printf ("Pmsg wait fail!\n"); */
break;
}
if ((pmsg.msg2 != 0) && (pmsg.msg1 == 0))
break;
pmsg.msg2 = (long) gethostbyname ((char *) pmsg.msg1);
r = Pmsg (1, 0xffff0000L | pmsg.pid, &pmsg);
if (r)
{
/* printf ("Pmsg back fail!\n"); */
}
}
uninstall_cookie ();
}
return 0;
}