mars_nwe-0.96.pl06
This commit is contained in:
parent
42aa23ed0b
commit
164365d514
8
CHANGES
8
CHANGES
@ -52,4 +52,10 @@ Erste 'oeffentliche' Version
|
||||
geschrieben.
|
||||
- SAP Responses gehen nun immer ueber den SAP Socket.
|
||||
- Routing Bereich (SAP's) erweitert.
|
||||
|
||||
- SAP Broadcasts haben nun Packettyp '4'.
|
||||
- Volume Info's (Volume Size usw.) korrigiert.
|
||||
- Nun auch neue Konstante MAX_NW_SERVERS in config.h
|
||||
- Routing and Server Tabelle (Info) kann nun in Datei ausgegeben werden.
|
||||
- Es kann nun gesteuert werden (nw.ini:310), dass wdogs zu einer
|
||||
connection nur gesendet werden, falls der client ueber eine device
|
||||
net < angebbarer anzahl tics ist. (z.B. fuer IPX ueber ISDN)
|
||||
|
40
connect.c
40
connect.c
@ -1,4 +1,4 @@
|
||||
/* connect.c 02-Jan-96 */
|
||||
/* connect.c 13-Jan-96 */
|
||||
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@ -698,7 +698,7 @@ static int build_verz_name(NW_PATH *nwpath, /* gets complete path */
|
||||
while (*xp++ == '.' && completition > -1) {
|
||||
p1--; /* steht nun auf letztem Zeichen '/' od. ':' */
|
||||
if (p1 < panf) completition = -0x9c ;
|
||||
/* Falscher Pfad, denn weiter zurueck gehts nicht */
|
||||
/* wrong path, don't can go back any more */
|
||||
else {
|
||||
while (p1 > panf && *(--p1) != '/');;
|
||||
if (p1 == panf) *p1='\0';
|
||||
@ -1081,7 +1081,7 @@ int nw_server_copy(int qfhandle, uint32 qoffset,
|
||||
return(retsize);
|
||||
}
|
||||
}
|
||||
return(- 0x88); /* Falscher Filehandle */
|
||||
return(- 0x88); /* wrong filehandle */
|
||||
}
|
||||
|
||||
|
||||
@ -1374,7 +1374,7 @@ int nw_search(uint8 *info,
|
||||
}
|
||||
return(searchsequence);
|
||||
} else return(-0xff); /* not found */
|
||||
} else return(completition); /* Falscher Pfad */
|
||||
} else return(completition); /* wrong path */
|
||||
}
|
||||
|
||||
int nw_dir_search(uint8 *info,
|
||||
@ -1468,7 +1468,7 @@ int nw_free_dir_handle(int dir_handle)
|
||||
{
|
||||
if (dir_handle && --dir_handle < (int)used_dirs) {
|
||||
NW_DIR *d=&(dirs[dir_handle]);
|
||||
if (!d->inode) return(-0x9b); /* Falscher Handle */
|
||||
if (!d->inode) return(-0x9b); /* wrong handle */
|
||||
else {
|
||||
d->inode = 0;
|
||||
xfree(d->path);
|
||||
@ -1500,7 +1500,7 @@ int nw_get_directory_path(int dir_handle, uint8 *name)
|
||||
name[0] = '\0';
|
||||
if (dir_handle > 0 && --dir_handle < (int)used_dirs) {
|
||||
int volume = dirs[dir_handle].volume;
|
||||
if (volume < used_vols){
|
||||
if (volume > -1 && volume < used_vols){
|
||||
result=sprintf((char*)name, "%s:%s", vols[volume].sysname, dirs[dir_handle].path);
|
||||
if (name[result-1] == '/') name[--result] = '\0';
|
||||
} else result = -0x98;
|
||||
@ -1512,10 +1512,10 @@ int nw_get_directory_path(int dir_handle, uint8 *name)
|
||||
int nw_get_vol_number(int dir_handle)
|
||||
/* Get Volume Nummmer with Handle */
|
||||
{
|
||||
int result = -0x9b; /* Falsches Handle */
|
||||
int result = -0x9b; /* wrong handle */
|
||||
if (dir_handle > 0 && --dir_handle < (int)used_dirs) {
|
||||
result = dirs[dir_handle].volume;
|
||||
if (result >= used_vols) result = -0x98; /* Falsches Volume */
|
||||
if (result < 0 || result >= used_vols) result = -0x98; /* wrong volume */
|
||||
}
|
||||
XDPRINTF((5,0,"nw_get_vol_number:0x%x: von Handle=%d", result, dir_handle+1));
|
||||
return(result);
|
||||
@ -1543,12 +1543,24 @@ int nw_get_volume_number(uint8 *volname, int namelen)
|
||||
int nw_get_volume_name(int volnr, uint8 *volname)
|
||||
/* returns < 0 if error, else len of volname */
|
||||
{
|
||||
int result = -0x98; /* Volume not exist */;
|
||||
int result = -0x98; /* Volume not exist */;
|
||||
if (volnr < used_vols) {
|
||||
strcpy(volname, vols[volnr].sysname);
|
||||
result = strlen(volname);
|
||||
} else volname[0] = '\0';
|
||||
XDPRINTF((5,0,"GET_VOLUME_NAME von:%d = %s: ,result=0x%x", volnr, volname, result));
|
||||
if (volname != NULL) {
|
||||
strcpy(volname, vols[volnr].sysname);
|
||||
result = strlen(volname);
|
||||
} else result= strlen(vols[volnr].sysname);
|
||||
} else {
|
||||
if (NULL != volname) *volname = '\0';
|
||||
if (volnr < MAX_NW_VOLS) result=0;
|
||||
}
|
||||
if (nw_debug > 4) {
|
||||
char xvolname[10];
|
||||
if (!volname) {
|
||||
volname = xvolname;
|
||||
*volname = '\0';
|
||||
}
|
||||
XDPRINTF((5,0,"GET_VOLUME_NAME von:%d = %s: ,result=0x%x", volnr, volname, result));
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
|
||||
@ -1675,7 +1687,7 @@ int nw_get_vol_info(int volnr)
|
||||
/* returns >= 0 if OK, else errocode < 0 */
|
||||
{
|
||||
int result = -0x98; /* Volume not exist */;
|
||||
if (volnr < used_vols) {
|
||||
if (volnr > -1 && volnr < used_vols) {
|
||||
result =0;
|
||||
}
|
||||
XDPRINTF((5,0,"NW_GET_VOL_INFO von VOLNR:%d, result=0x%x", volnr, result));
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* config.h: 03-Jan-96 */
|
||||
/* config.h: 14-Jan-96 */
|
||||
/* some of this config is needed by make, others by cc */
|
||||
#define FILENAME_NW_INI "/etc/nwserv.conf" /* full name of ini (conf) file */
|
||||
#define PATHNAME_PROGS "/sbin" /* path location of progs */
|
||||
@ -13,5 +13,4 @@
|
||||
#define IPX_DATA_GR_546 1 /* allow ipx packets > 546+30 Byte */
|
||||
|
||||
#define MAX_NW_ROUTES 50 /* max. networks (internal + external) */
|
||||
|
||||
|
||||
#define MAX_NW_SERVERS 40 /* max. count of servers */
|
||||
|
@ -1,5 +1,5 @@
|
||||
# (C)opyright 1993, 1995, Martin Stover, Softwareentwicklung, Marburg
|
||||
# last change: 20-Dec-95
|
||||
# last change: 14-Jan-96
|
||||
# MAR.S NW-Server Emulator
|
||||
# Einfache Konfiguration, alles ab # ist Kommentar.
|
||||
# Jeder Eintrag beginnt mit einer Zahl und dann folgt der Inhalt.
|
||||
@ -86,5 +86,13 @@
|
||||
#############################
|
||||
210 10 # 1 .. 600 (default 10) seconds after server really goes down
|
||||
# # after a down command
|
||||
#############################
|
||||
300 0 # > 0 print routing info to file every x broadcasts. ( minuts )
|
||||
301 /tmp/nw.routes # filename.
|
||||
302 1 # creat new filename=1, append to file=0
|
||||
#############################
|
||||
310 7 # send wdog's only to device net < x tics.
|
||||
# 0 = allways send wdogs. < 0 = never send wdogs
|
||||
|
||||
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
# makefile.unx 09-Jan-96
|
||||
# makefile.unx 12-Jan-96
|
||||
VPATH=..
|
||||
O=.o
|
||||
C=.c
|
||||
@ -6,7 +6,7 @@ C=.c
|
||||
DEBUG=-DDB
|
||||
V_H=0
|
||||
V_L=96
|
||||
P_L=5
|
||||
P_L=6
|
||||
#define D_P_L 1
|
||||
DISTRIB=mars_nwe
|
||||
#if D_P_L
|
||||
|
@ -1,7 +1,7 @@
|
||||
Begin3
|
||||
Title: mars_nwe
|
||||
Version: 0.96pl4
|
||||
Entered-date: 09-Jan-96
|
||||
Version: 0.96pl6
|
||||
Entered-date: 14-Jan-96
|
||||
Description: full novell-server-emulator (src),beta
|
||||
file-services, bindery-services, printing-services
|
||||
needs no kernelchanges, usefull for testing ipx
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* ncpserv.c */
|
||||
#define REVISION_DATE "09-Jan-96"
|
||||
#define REVISION_DATE "14-Jan-96"
|
||||
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
10
net.h
10
net.h
@ -61,13 +61,17 @@
|
||||
*( (uint8*) (b) ) = *( ((uint8*) (&a)) +1); \
|
||||
*( ((uint8*) (b)) +1) = *( (uint8*) (&a)); }
|
||||
|
||||
|
||||
#define U32_TO_BE32(u, ar) { uint32 a= (u); uint8 *b= ((uint8*)(ar))+3; \
|
||||
*b-- = (uint8)a; a >>= 8; \
|
||||
*b-- = (uint8)a; a >>= 8; \
|
||||
*b-- = (uint8)a; a >>= 8; \
|
||||
*b = (uint8)a; }
|
||||
|
||||
#define GET_BE16(b) ( (int) *(((uint8*)(b))+1) \
|
||||
#define U16_TO_16(u, b) { uint16 a=(u); memcpy(b, &a, 2); }
|
||||
#define U32_TO_32(u, b) { uint32 a=(u); memcpy(b, &a, 4); }
|
||||
|
||||
#define GET_BE16(b) ( (int) *(((uint8*)(b))+1) \
|
||||
| ( ( (int) *( (uint8*)(b) ) << 8) ) )
|
||||
|
||||
#define GET_BE32(b) ( (uint32) *(((uint8*)(b))+3) \
|
||||
@ -112,6 +116,10 @@
|
||||
# define MAX_NW_ROUTES 50
|
||||
#endif
|
||||
|
||||
#ifndef MAX_NW_SERVERS
|
||||
# define MAX_NW_SERVERS MAX_NW_ROUTES
|
||||
#endif
|
||||
|
||||
#if IPX_DATA_GR_546
|
||||
# define IPX_MAX_DATA 1058
|
||||
#else
|
||||
|
16
net1.c
16
net1.c
@ -1,4 +1,4 @@
|
||||
/* net1.c, 09-Jan-96 */
|
||||
/* net1.c, 14-Jan-96 */
|
||||
|
||||
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
|
||||
*
|
||||
@ -39,17 +39,23 @@ void print_t_info(struct t_info *t)
|
||||
}
|
||||
#endif
|
||||
|
||||
char *visable_ipx_adr(ipxAddr_t *p)
|
||||
char *xvisable_ipx_adr(ipxAddr_t *p, int modus)
|
||||
{
|
||||
static char str[200];
|
||||
if (p)
|
||||
if (p) {
|
||||
if (!modus) {
|
||||
sprintf(str,"net=%x:%x:%x:%x, node=%x:%x:%x:%x:%x:%x, sock=%02x:%02x",
|
||||
(int)p->net[0], (int)p->net[1], (int)p->net[2], (int)p->net[3],
|
||||
(int)p->node[0], (int)p->node[1], (int)p->node[2], (int)p->node[3],
|
||||
(int)p->node[4], (int)p->node[5], (int)p->sock[0], (int)p->sock[1]);
|
||||
else
|
||||
} else if (modus== 1) {
|
||||
sprintf(str,"%02X:%02X:%02X:%02X,%02x:%02x:%02x:%02x:%02x:%02x,%02x:%02x",
|
||||
(int)p->net[0], (int)p->net[1], (int)p->net[2], (int)p->net[3],
|
||||
(int)p->node[0], (int)p->node[1], (int)p->node[2], (int)p->node[3],
|
||||
(int)p->node[4], (int)p->node[5], (int)p->sock[0], (int)p->sock[1]);
|
||||
} else strcpy(str, "??");
|
||||
} else
|
||||
strcpy(str, "net=UNKOWN(NULLPOINTER)");
|
||||
|
||||
return(str);
|
||||
}
|
||||
|
||||
|
6
net1.h
6
net1.h
@ -1,4 +1,4 @@
|
||||
/* net1.h 11-Sep-95 */
|
||||
/* net1.h 14-Jan-96 */
|
||||
|
||||
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
|
||||
*
|
||||
@ -23,7 +23,9 @@ extern void print_t_info(struct t_info *t);
|
||||
extern void print_ud_data(struct t_unitdata *ud);
|
||||
#endif
|
||||
|
||||
extern char *visable_ipx_adr(ipxAddr_t *p);
|
||||
extern char *xvisable_ipx_adr(ipxAddr_t *p, int modus);
|
||||
#define visable_ipx_adr(adr) xvisable_ipx_adr((adr), 0)
|
||||
|
||||
extern void print_ipx_addr(ipxAddr_t *p);
|
||||
extern void print_ipx_data(IPX_DATA *p);
|
||||
extern void print_sip_data(SIP *sip);
|
||||
|
49
nwconn.c
49
nwconn.c
@ -1,4 +1,4 @@
|
||||
/* nwconn.c 09-Jan-96 */
|
||||
/* nwconn.c 13-Jan-96 */
|
||||
/* one process / connection */
|
||||
|
||||
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
|
||||
@ -159,9 +159,9 @@ static void handle_ncp_serv()
|
||||
if ((result = nw_get_volume_name(volume, xdata->name))>-1){
|
||||
struct fs_usage fsp;
|
||||
if (!nw_get_fs_usage(xdata->name, &fsp)) {
|
||||
U16_TO_BE16(38, xdata->sec_per_block); /* hard coded */
|
||||
U16_TO_BE16(fsp.fsu_blocks, xdata->total_blocks);
|
||||
U16_TO_BE16(fsp.fsu_bavail, xdata->avail_blocks);
|
||||
U16_TO_BE16(1000, xdata->sec_per_block); /* hard coded */
|
||||
U16_TO_BE16(fsp.fsu_blocks/1000, xdata->total_blocks);
|
||||
U16_TO_BE16(fsp.fsu_bavail/1000, xdata->avail_blocks);
|
||||
U16_TO_BE16(fsp.fsu_files, xdata->total_dirs);
|
||||
U16_TO_BE16(fsp.fsu_ffree, xdata->avail_dirs);
|
||||
U16_TO_BE16(0, xdata->removable);
|
||||
@ -371,8 +371,7 @@ static void handle_ncp_serv()
|
||||
} else if (*p == 0x15){ /* liefert Volume Information */
|
||||
/******** Get Volume Info with Handle ****/
|
||||
struct XDATA {
|
||||
uint8 reserve1;
|
||||
uint8 len;
|
||||
uint8 sectors[2];
|
||||
uint8 total_blocks[2];
|
||||
uint8 avail_blocks[2];
|
||||
uint8 total_dirs[2]; /* anz dirs */
|
||||
@ -387,9 +386,9 @@ static void handle_ncp_serv()
|
||||
if (result > -1) {
|
||||
struct fs_usage fsp;
|
||||
if (!nw_get_fs_usage(xdata->name, &fsp)) {
|
||||
xdata->len = 8; /* blocks entries */
|
||||
U16_TO_BE16(fsp.fsu_blocks, xdata->total_blocks);
|
||||
U16_TO_BE16(fsp.fsu_bavail, xdata->avail_blocks);
|
||||
U16_TO_BE16(1000, xdata->sectors);
|
||||
U16_TO_BE16(fsp.fsu_blocks/1000, xdata->total_blocks);
|
||||
U16_TO_BE16(fsp.fsu_bavail/1000, xdata->avail_blocks);
|
||||
U16_TO_BE16(fsp.fsu_files, xdata->total_dirs);
|
||||
U16_TO_BE16(fsp.fsu_ffree, xdata->avail_dirs);
|
||||
U16_TO_BE16(0, xdata->removable);
|
||||
@ -459,7 +458,8 @@ static void handle_ncp_serv()
|
||||
input->dir_handle);
|
||||
if (result > -1) data_len = result;
|
||||
else completition = (uint8) (-result);
|
||||
} else if (*p == 0x20){ /* scan volume user disk restrictions */
|
||||
} else if (*p == 0x20){
|
||||
/* scan volume user disk restrictions */
|
||||
uint8 volnr = *(p+1);
|
||||
uint32 sequenz = GET_BE32(p+2);
|
||||
struct XDATA {
|
||||
@ -468,8 +468,11 @@ static void handle_ncp_serv()
|
||||
uint8 id[4];
|
||||
uint8 restriction[4];
|
||||
} *xdata = (struct XDATA*) responsedata;
|
||||
xdata->entries = 0x0;
|
||||
data_len = (8 * xdata->entries) + 1;
|
||||
int result = nw_get_volume_name(volnr, NULL);
|
||||
if (result > -1) {
|
||||
xdata->entries = 0x0;
|
||||
data_len = (8 * xdata->entries) + 1;
|
||||
} else completition = (uint8) (-result);
|
||||
} else if (*p == 0x21) {
|
||||
/* change Vol restrictions for Obj */
|
||||
uint8 volnr = *(p+1);
|
||||
@ -554,7 +557,7 @@ static void handle_ncp_serv()
|
||||
/* ncpfs need this call */
|
||||
int volume = (int) *(p+1);
|
||||
struct XDATA {
|
||||
uint8 total_blocks[4];
|
||||
uint8 total_blocks[4]; /* LOW-HI !! */
|
||||
uint8 avail_blocks[4];
|
||||
uint8 purgeable_blocks[4];
|
||||
uint8 not_purgeable_blocks[4];
|
||||
@ -571,11 +574,11 @@ static void handle_ncp_serv()
|
||||
struct fs_usage fsp;
|
||||
memset(xdata, 0, sizeof(struct XDATA));
|
||||
if (!nw_get_fs_usage(name, &fsp)) {
|
||||
xdata->sec_per_block = 38; /* hard coded */
|
||||
U32_TO_BE32(fsp.fsu_blocks, xdata->total_blocks);
|
||||
U32_TO_BE32(fsp.fsu_bavail, xdata->avail_blocks);
|
||||
U32_TO_BE32(fsp.fsu_files, xdata->total_dirs);
|
||||
U32_TO_BE32(fsp.fsu_ffree, xdata->avail_dirs);
|
||||
xdata->sec_per_block = 1; /* hard coded */
|
||||
U32_TO_32(fsp.fsu_blocks, xdata->total_blocks);
|
||||
U32_TO_32(fsp.fsu_bavail, xdata->avail_blocks);
|
||||
U32_TO_32(fsp.fsu_files, xdata->total_dirs);
|
||||
U32_TO_32(fsp.fsu_ffree, xdata->avail_dirs);
|
||||
}
|
||||
xdata->namlen = strlen(name);
|
||||
strmaxcpy(xdata->name, name, xdata->namlen);
|
||||
@ -602,11 +605,11 @@ static void handle_ncp_serv()
|
||||
struct fs_usage fsp;
|
||||
memset(xdata, 0, sizeof(struct XDATA));
|
||||
if (!nw_get_fs_usage(name, &fsp)) {
|
||||
xdata->sec_per_block = 38; /* hard coded */
|
||||
U32_TO_BE32(fsp.fsu_blocks, xdata->total_blocks);
|
||||
U32_TO_BE32(fsp.fsu_bavail, xdata->avail_blocks);
|
||||
U32_TO_BE32(fsp.fsu_files, xdata->total_dirs);
|
||||
U32_TO_BE32(fsp.fsu_ffree, xdata->avail_dirs);
|
||||
xdata->sec_per_block = 1; /* hard coded */
|
||||
U32_TO_32(fsp.fsu_blocks, xdata->total_blocks);
|
||||
U32_TO_32(fsp.fsu_bavail, xdata->avail_blocks);
|
||||
U32_TO_32(fsp.fsu_files, xdata->total_dirs);
|
||||
U32_TO_32(fsp.fsu_ffree, xdata->avail_dirs);
|
||||
}
|
||||
xdata->namlen = strlen(name);
|
||||
strmaxcpy(xdata->name, name, xdata->namlen);
|
||||
|
68
nwdbm.c
68
nwdbm.c
@ -1,4 +1,4 @@
|
||||
/* nwdbm.c 08-Jan-96 data base for mars_nwe */
|
||||
/* nwdbm.c 13-Jan-96 data base for mars_nwe */
|
||||
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@ -951,39 +951,46 @@ int nw_test_passwd(uint32 obj_id, uint8 *vgl_key, uint8 *akt_key)
|
||||
|
||||
int nw_set_enpasswd(uint32 obj_id, uint8 *passwd)
|
||||
{
|
||||
nw_new_create_prop(obj_id, NULL, 0, 0, 0,
|
||||
"PASSWORD", P_FL_STAT|P_FL_ITEM, 0x44,
|
||||
passwd, 16);
|
||||
uint8 *prop_name="PASSWORD";
|
||||
if (passwd && *passwd) {
|
||||
nw_new_create_prop(obj_id, NULL, 0, 0, 0,
|
||||
prop_name, P_FL_STAT|P_FL_ITEM, 0x44,
|
||||
passwd, 16);
|
||||
} else
|
||||
(void)loc_delete_property(obj_id, prop_name, 0);
|
||||
return(0);
|
||||
}
|
||||
|
||||
int nw_set_passwd(uint32 obj_id, char *password)
|
||||
{
|
||||
uint8 passwd[200];
|
||||
uint8 s_uid[4];
|
||||
U32_TO_BE32(obj_id, s_uid);
|
||||
shuffle(s_uid, password, strlen(password), passwd);
|
||||
if (password && *password) {
|
||||
uint8 passwd[200];
|
||||
uint8 s_uid[4];
|
||||
U32_TO_BE32(obj_id, s_uid);
|
||||
shuffle(s_uid, password, strlen(password), passwd);
|
||||
#if 0
|
||||
XDPRINTF((2,0, "password %s->0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x",
|
||||
password,
|
||||
(int)passwd[0],
|
||||
(int)passwd[1],
|
||||
(int)passwd[2],
|
||||
(int)passwd[3],
|
||||
(int)passwd[4],
|
||||
(int)passwd[5],
|
||||
(int)passwd[6],
|
||||
(int)passwd[7],
|
||||
(int)passwd[8],
|
||||
(int)passwd[9],
|
||||
(int)passwd[10],
|
||||
(int)passwd[11],
|
||||
(int)passwd[12],
|
||||
(int)passwd[13],
|
||||
(int)passwd[14],
|
||||
(int)passwd[15]));
|
||||
XDPRINTF((2,0, "password %s->0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x",
|
||||
password,
|
||||
(int)passwd[0],
|
||||
(int)passwd[1],
|
||||
(int)passwd[2],
|
||||
(int)passwd[3],
|
||||
(int)passwd[4],
|
||||
(int)passwd[5],
|
||||
(int)passwd[6],
|
||||
(int)passwd[7],
|
||||
(int)passwd[8],
|
||||
(int)passwd[9],
|
||||
(int)passwd[10],
|
||||
(int)passwd[11],
|
||||
(int)passwd[12],
|
||||
(int)passwd[13],
|
||||
(int)passwd[14],
|
||||
(int)passwd[15]));
|
||||
#endif
|
||||
return(nw_set_enpasswd(obj_id, passwd));
|
||||
return(nw_set_enpasswd(obj_id, passwd));
|
||||
} else
|
||||
return(nw_set_enpasswd(obj_id, NULL));
|
||||
}
|
||||
|
||||
int prop_add_new_member(uint32 obj_id, int prop_id, uint32 member_id)
|
||||
@ -1085,7 +1092,10 @@ static void add_user(uint32 u_id, uint32 g_id,
|
||||
"UNIX_USER", P_FL_ITEM, 0x33,
|
||||
(char*)unname, strlen(unname));
|
||||
|
||||
if (password && *password) nw_set_passwd(u_id, password);
|
||||
if (password && *password) {
|
||||
if (*password == '-') *password='\0';
|
||||
nw_set_passwd(u_id, password);
|
||||
}
|
||||
}
|
||||
|
||||
void nw_fill_standard(char *servername, ipxAddr_t *adr)
|
||||
@ -1214,7 +1224,7 @@ void nw_init_dbm(char *servername, ipxAddr_t *adr)
|
||||
}
|
||||
}
|
||||
dbmclose();
|
||||
while (anz--) loc_delete_property(objs[anz], (char*)NULL, props[anz]); /* Nun l”schen */
|
||||
while (anz--) loc_delete_property(objs[anz], (char*)NULL, props[anz]); /* now delete */
|
||||
nw_fill_standard(servername, adr);
|
||||
}
|
||||
|
||||
|
145
nwroute.c
145
nwroute.c
@ -1,4 +1,4 @@
|
||||
/* nwroute.c 11-Jan-96 */
|
||||
/* nwroute.c 14-Jan-96 */
|
||||
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@ -32,16 +32,16 @@ static int anz_routes=0;
|
||||
static NW_ROUTES *nw_routes[MAX_NW_ROUTES];
|
||||
|
||||
typedef struct {
|
||||
uint8 *name;
|
||||
int typ;
|
||||
ipxAddr_t addr;
|
||||
int net; /* routing over NET */
|
||||
uint8 *name; /* Server Name */
|
||||
int typ; /* Server Typ */
|
||||
ipxAddr_t addr; /* Server Addr */
|
||||
uint32 net; /* routing over NET */
|
||||
int hops;
|
||||
int flags;
|
||||
} NW_SERVERS;
|
||||
|
||||
static int anz_servers=0;
|
||||
static NW_SERVERS *nw_servers[MAX_NW_ROUTES];
|
||||
static NW_SERVERS *nw_servers[MAX_NW_SERVERS];
|
||||
|
||||
static void insert_delete_net(uint32 destnet,
|
||||
uint32 rnet, /* routernet */
|
||||
@ -116,9 +116,35 @@ static void insert_delete_net(uint32 destnet,
|
||||
}
|
||||
}
|
||||
|
||||
void insert_delete_server(uint8 *name,
|
||||
int styp,
|
||||
ipxAddr_t *addr,
|
||||
|
||||
NW_NET_DEVICE *find_netdevice(uint32 network)
|
||||
/* return the device over which the network is routed, I hope */
|
||||
{
|
||||
uint32 net=network;
|
||||
int l=2;
|
||||
XDPRINTF((3, 0, "find_netdevice of network=%lX", net));
|
||||
while (l--) {
|
||||
int k=-1;
|
||||
while (++k < anz_net_devices) {
|
||||
NW_NET_DEVICE *nd=net_devices[k];
|
||||
if (nd->net == net) {
|
||||
XDPRINTF((3, 0, "found netdevive %s, frame=%d, ticks=%d",
|
||||
nd->devname, nd->frame, nd->ticks));
|
||||
return(nd);
|
||||
}
|
||||
}
|
||||
if (!l) return(NULL);
|
||||
k=-1;
|
||||
while (++k < anz_routes && nw_routes[k]->net != network);;
|
||||
if (k < anz_routes) net=nw_routes[k]->rnet;
|
||||
else return(NULL);
|
||||
}
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
void insert_delete_server(uint8 *name, /* Server Name */
|
||||
int styp, /* Server Typ */
|
||||
ipxAddr_t *addr, /* Server Addr */
|
||||
ipxAddr_t *from_addr,
|
||||
int hops,
|
||||
int do_delete, /* delete = 1 */
|
||||
@ -141,7 +167,7 @@ void insert_delete_server(uint8 *name,
|
||||
while (++k < anz_servers && (nw_servers[k]->typ != styp ||
|
||||
!nw_servers[k]->name || strcmp(nw_servers[k]->name, sname)) ) {
|
||||
if (nw_servers[k]->name) {
|
||||
XDPRINTF((3,0, "Server %s = typ=0x%04x",
|
||||
XDPRINTF((10,0, "Server %s = typ=0x%04x",
|
||||
nw_servers[k]->name, nw_servers[k]->typ));
|
||||
}
|
||||
if (freeslot < 0 && !nw_servers[k]->typ) freeslot=k;
|
||||
@ -151,8 +177,8 @@ void insert_delete_server(uint8 *name,
|
||||
if (do_delete) return; /* nothing to delete */
|
||||
|
||||
if (freeslot < 0) {
|
||||
if (anz_servers == MAX_NW_ROUTES) {
|
||||
XDPRINTF((1, 0, "too many servers=%d, increase MAX_NW_ROUTES in config.h", anz_servers));
|
||||
if (anz_servers == MAX_NW_SERVERS) {
|
||||
XDPRINTF((1, 0, "too many servers=%d, increase MAX_NW_SERVERS in config.h", anz_servers));
|
||||
return;
|
||||
}
|
||||
nw_servers[k] = (NW_SERVERS*)xcmalloc(sizeof(NW_SERVERS));
|
||||
@ -164,9 +190,12 @@ void insert_delete_server(uint8 *name,
|
||||
nr->hops = 0xffff;
|
||||
} else if (do_delete) {
|
||||
nr=nw_servers[k];
|
||||
if (nr->typ == 4) ins_del_bind_net_addr(nr->name, NULL);
|
||||
xfree(nr->name);
|
||||
memset(nr, 0, sizeof(NW_SERVERS));
|
||||
if (!IPXCMPNODE(nr->addr.node, my_server_adr.node) ||
|
||||
!IPXCMPNET (nr->addr.net, my_server_adr.net) ) {
|
||||
if (nr->typ == 4) ins_del_bind_net_addr(nr->name, NULL);
|
||||
xfree(nr->name);
|
||||
memset(nr, 0, sizeof(NW_SERVERS));
|
||||
}
|
||||
return;
|
||||
} else nr=nw_servers[k];
|
||||
/* here now i perhaps must change the entry */
|
||||
@ -284,7 +313,7 @@ static void send_rip_buff(ipxAddr_t *from_addr)
|
||||
}
|
||||
}
|
||||
|
||||
void send_rip_broadcast(int mode)
|
||||
static void send_rip_broadcast(int mode)
|
||||
/* mode=0, standard broadcast */
|
||||
/* mode=1, first trie */
|
||||
/* mode=2, shutdown */
|
||||
@ -355,7 +384,7 @@ void handle_rip(int fd, int ipx_pack_typ,
|
||||
}
|
||||
|
||||
/* <========================= SAP ============================> */
|
||||
void send_sap_broadcast(int mode)
|
||||
static void send_sap_broadcast(int mode)
|
||||
/* mode=0, standard broadcast */
|
||||
/* mode=1, first trie */
|
||||
/* mode=2, shutdown */
|
||||
@ -363,7 +392,8 @@ void send_sap_broadcast(int mode)
|
||||
int k=-1;
|
||||
while (++k < anz_net_devices) {
|
||||
NW_NET_DEVICE *nd=net_devices[k];
|
||||
if (nd->ticks < 7 || mode) { /* isdn devices should not get SAP broadcasts everytime */
|
||||
if (nd->ticks < 7 || mode) {
|
||||
/* isdn devices should not get SAP broadcasts everytime */
|
||||
IPX_DATA ipx_data;
|
||||
ipxAddr_t wild;
|
||||
int j=-1;
|
||||
@ -373,7 +403,8 @@ void send_sap_broadcast(int mode)
|
||||
U16_TO_BE16(SOCK_SAP, wild.sock);
|
||||
while (++j < anz_servers) {
|
||||
NW_SERVERS *nw=nw_servers[j];
|
||||
if (!nw->typ || (nw->net == nd->net && nw->hops)) continue; /* no SAP to this NET */
|
||||
if (!nw->typ || (nw->net == nd->net && nw->hops)
|
||||
|| (mode == 2 && nw->hops) ) continue; /* no SAP to this NET */
|
||||
memset(&ipx_data, 0, sizeof(ipx_data.sip));
|
||||
strcpy(ipx_data.sip.server_name, nw->name);
|
||||
memcpy(&ipx_data.sip.server_adr, &(nw->addr), sizeof(ipxAddr_t));
|
||||
@ -383,12 +414,12 @@ void send_sap_broadcast(int mode)
|
||||
U16_TO_BE16(16, ipx_data.sip.intermediate_networks);
|
||||
} else {
|
||||
U16_TO_BE16(nw->hops+1, ipx_data.sip.intermediate_networks);
|
||||
/* I hope hops are ok here */
|
||||
XDPRINTF((3, 0, "SEND SIP %s,0x%04x, hops=%d",
|
||||
nw->name, nw->typ, nw->hops+1));
|
||||
/* I hope 1 is ok here */
|
||||
}
|
||||
send_ipx_data(sockfd[SAP_SLOT],
|
||||
0,
|
||||
4, /* this is the official packet typ for SAP's */
|
||||
sizeof(ipx_data.sip),
|
||||
(char *)&(ipx_data.sip),
|
||||
&wild, "SIP Broadcast");
|
||||
@ -397,6 +428,60 @@ void send_sap_broadcast(int mode)
|
||||
}
|
||||
}
|
||||
|
||||
static FILE *open_route_info_fn(void)
|
||||
{
|
||||
static int tacs=0;
|
||||
FILE *f=NULL;
|
||||
if (print_route_tac > 0) {
|
||||
if (!tacs) {
|
||||
if (NULL != (f=fopen(pr_route_info_fn,
|
||||
(print_route_mode) ? "w" : "a"))) {
|
||||
tacs = print_route_tac-1;
|
||||
} else print_route_tac=0;
|
||||
} else tacs--;
|
||||
}
|
||||
return(f);
|
||||
}
|
||||
|
||||
void send_sap_rip_broadcast(int mode)
|
||||
/* mode=0, standard broadcast */
|
||||
/* mode=1, first trie */
|
||||
/* mode=2, shutdown */
|
||||
{
|
||||
send_sap_broadcast(mode);
|
||||
send_rip_broadcast(mode);
|
||||
if (!mode) {
|
||||
FILE *f= open_route_info_fn();
|
||||
if (f) {
|
||||
int k=-1;
|
||||
fprintf(f, "<--------- Routing Table ---------->\n");
|
||||
fprintf(f, "%8s Hops Tics %9s Router Node\n", "Network", "RouterNet");
|
||||
while (++k < anz_routes) {
|
||||
NW_ROUTES *nr = nw_routes[k];
|
||||
if (nr->net) {
|
||||
fprintf(f, "%08lX %4d %4d %08lX %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
nr->net, nr->hops, nr->ticks, nr->rnet,
|
||||
(int)nr->rnode[0], (int)nr->rnode[1], (int)nr->rnode[2],
|
||||
(int)nr->rnode[3], (int)nr->rnode[4], (int)nr->rnode[5]);
|
||||
}
|
||||
}
|
||||
k=-1;
|
||||
fprintf(f, "<--------- Server Table ---------->\n");
|
||||
fprintf(f, "%-20s %4s %9s Hops Server-Address\n","Name", "Typ", "RouterNet");
|
||||
while (++k < anz_servers) {
|
||||
NW_SERVERS *ns = nw_servers[k];
|
||||
if (ns->typ) {
|
||||
char sname[50];
|
||||
strmaxcpy(sname, ns->name, 20);
|
||||
fprintf(f, "%-20s %4d %08lX %4d %s\n", sname, ns->typ,
|
||||
ns->net, ns->hops, xvisable_ipx_adr(&(ns->addr), 1));
|
||||
}
|
||||
} /* while */
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void query_sap_on_net(uint32 net)
|
||||
/* searches for the next server on this network */
|
||||
{
|
||||
@ -409,7 +494,7 @@ static void query_sap_on_net(uint32 net)
|
||||
U16_TO_BE16(3, sqp.query_type);
|
||||
U16_TO_BE16(4, sqp.server_type);
|
||||
send_ipx_data(sockfd[SAP_SLOT], 17, sizeof(SQP),
|
||||
(char*)&sqp, &wild, "SERVER Query");
|
||||
(char*)&sqp, &wild, "SERVER Query");
|
||||
}
|
||||
|
||||
void get_servers(void)
|
||||
@ -417,10 +502,20 @@ void get_servers(void)
|
||||
int k=-1;
|
||||
while (++k < anz_net_devices) {
|
||||
NW_NET_DEVICE *nd=net_devices[k];
|
||||
if (nd->ticks < 7) query_sap_on_net(nd->net); /* only fast routes */
|
||||
if (nd->ticks < 7) query_sap_on_net(nd->net); /* only fast routes */
|
||||
}
|
||||
if (!anz_net_devices)
|
||||
query_sap_on_net(internal_net);
|
||||
if (!anz_net_devices) query_sap_on_net(internal_net);
|
||||
}
|
||||
|
||||
|
||||
int dont_send_wdog(ipxAddr_t *addr)
|
||||
/* returns != 0 if tics are to high for wdogs */
|
||||
{
|
||||
NW_NET_DEVICE *nd;
|
||||
if (!wdogs_till_tics) return(0); /* ever send wdogs */
|
||||
else if (wdogs_till_tics < 0) return(1); /* never send wdogs */
|
||||
if (NULL != (nd=find_netdevice(GET_BE32(addr->net))))
|
||||
return((nd->ticks < wdogs_till_tics) ? 0 : 1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
215
nwserv.c
215
nwserv.c
@ -1,4 +1,4 @@
|
||||
/* nwserv.c 09-Jan-96 */
|
||||
/* nwserv.c 14-Jan-96 */
|
||||
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@ -19,29 +19,32 @@
|
||||
#include "net.h"
|
||||
#include "nwserv.h"
|
||||
|
||||
uint32 internal_net = 0x0L; /* NETWORKNUMMER INTERN (SERVER) */
|
||||
ipxAddr_t my_server_adr; /* Address of this server */
|
||||
char my_nwname[50]; /* Name of this server */
|
||||
|
||||
uint32 internal_net = 0x0L; /* NETWORKNUMMER INTERN (SERVER) */
|
||||
ipxAddr_t my_server_adr; /* Address of this server */
|
||||
char my_nwname[50]; /* Name of this server */
|
||||
int print_route_tac = 0; /* every x broadcasts print it */
|
||||
int print_route_mode = 0; /* append */
|
||||
char *pr_route_info_fn = NULL; /* filename */
|
||||
int wdogs_till_tics = 0; /* send wdogs to all */
|
||||
/* <========== DEVICES ==========> */
|
||||
int anz_net_devices=0;
|
||||
int anz_net_devices=0;
|
||||
NW_NET_DEVICE *net_devices[MAX_NET_DEVICES];
|
||||
|
||||
uint16 ipx_sock_nummern[]={
|
||||
#ifdef WDOG_SLOT
|
||||
0, /* auto sock */
|
||||
#endif
|
||||
SOCK_SAP,
|
||||
SOCK_RIP,
|
||||
SOCK_ROUTE,
|
||||
SOCK_DIAGNOSE
|
||||
SOCK_SAP,
|
||||
SOCK_RIP,
|
||||
SOCK_ROUTE,
|
||||
SOCK_DIAGNOSE
|
||||
#ifdef ECHO_SLOT
|
||||
, SOCK_ECHO
|
||||
, SOCK_ECHO
|
||||
#endif
|
||||
#ifdef ERROR_SLOT
|
||||
, SOCK_ERROR
|
||||
, SOCK_ERROR
|
||||
#endif
|
||||
};
|
||||
};
|
||||
|
||||
#define NEEDED_SOCKETS (sizeof(ipx_sock_nummern) / sizeof(uint16))
|
||||
#define NEEDED_POLLS (NEEDED_SOCKETS+1)
|
||||
@ -55,16 +58,16 @@ static uint16 spx_diag_socket; /* SPX DIAGNOSE SOCKET */
|
||||
static ipxAddr_t nw386_adr; /* Address of NW-TEST Server */
|
||||
static int nw386_found = 0;
|
||||
static int client_mode = 0;
|
||||
static int ipxdebug = 0;
|
||||
static int pid_ncpserv = -1;
|
||||
static int ipxdebug = 0;
|
||||
static int pid_ncpserv = -1;
|
||||
static int fd_ncpserv_out = -1; /* ctrl-pipe out to ncpserv */
|
||||
static int fd_ncpserv_in = -1; /* ctrl-pipe in from ncpserv */
|
||||
|
||||
static time_t akttime_stamp = 0;
|
||||
static int broadsecs = 2048;
|
||||
static time_t server_down_stamp = 0;
|
||||
static time_t akttime_stamp = 0;
|
||||
static int broadsecs = 2048;
|
||||
static time_t server_down_stamp = 0;
|
||||
static int server_goes_down_secs = 10;
|
||||
static int save_ipx_routes = 0;
|
||||
static int save_ipx_routes = 0;
|
||||
|
||||
|
||||
static void write_to_ncpserv(int what, int connection,
|
||||
@ -159,30 +162,30 @@ static int start_ncpserv(char *nwname, ipxAddr_t *addr)
|
||||
|
||||
switch (pid=fork()) {
|
||||
case 0 : { /* new Process */
|
||||
char *progname="ncpserv";
|
||||
char addrstr[100];
|
||||
char pathname[300];
|
||||
int j = FD_NWSERV;
|
||||
close(fds_out[1]); /* no need to write */
|
||||
dup2(fds_out[0], 0); /* becommes stdin */
|
||||
close(fds_out[0]); /* no longer needed */
|
||||
char *progname="ncpserv";
|
||||
char addrstr[100];
|
||||
char pathname[300];
|
||||
int j = FD_NWSERV;
|
||||
close(fds_out[1]); /* no need to write */
|
||||
dup2(fds_out[0], 0); /* becommes stdin */
|
||||
close(fds_out[0]); /* no longer needed */
|
||||
|
||||
close(fds_in[0]); /* no need to read */
|
||||
dup2(fds_in[1], FD_NWSERV); /* becommes fd FD_NWSERV */
|
||||
close(fds_in[1]); /* no longer needed */
|
||||
while (j++ < 100) close(j); /* close all > 4 */
|
||||
ipx_addr_to_adr(addrstr, addr);
|
||||
execl(get_exec_path(pathname, progname), progname,
|
||||
nwname, addrstr, NULL);
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
close(fds_in[0]); /* no need to read */
|
||||
dup2(fds_in[1], FD_NWSERV); /* becommes fd FD_NWSERV */
|
||||
close(fds_in[1]); /* no longer needed */
|
||||
while (j++ < 100) close(j); /* close all > 4 */
|
||||
ipx_addr_to_adr(addrstr, addr);
|
||||
execl(get_exec_path(pathname, progname), progname,
|
||||
nwname, addrstr, NULL);
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
|
||||
case -1: close(fds_out[0]);
|
||||
close(fds_out[1]);
|
||||
close(fds_in[0]);
|
||||
close(fds_in[1]);
|
||||
return(-1); /* error */
|
||||
close(fds_out[1]);
|
||||
close(fds_in[0]);
|
||||
close(fds_in[1]);
|
||||
return(-1); /* error */
|
||||
}
|
||||
fds_out[0] = -1;
|
||||
fd_ncpserv_out = fds_out[1];
|
||||
@ -196,16 +199,16 @@ static int start_nwclient(void)
|
||||
{
|
||||
switch (fork()){
|
||||
case 0 : { /* new Process */
|
||||
char *progname="nwclient";
|
||||
char pathname[300];
|
||||
char my_addrstr[100];
|
||||
char serv_addrstr[100];
|
||||
ipx_addr_to_adr(my_addrstr, &my_server_adr);
|
||||
ipx_addr_to_adr(serv_addrstr, &nw386_adr);
|
||||
execl(get_exec_path(pathname, progname), progname,
|
||||
my_addrstr, serv_addrstr, NULL);
|
||||
}
|
||||
exit(1);
|
||||
char *progname="nwclient";
|
||||
char pathname[300];
|
||||
char my_addrstr[100];
|
||||
char serv_addrstr[100];
|
||||
ipx_addr_to_adr(my_addrstr, &my_server_adr);
|
||||
ipx_addr_to_adr(serv_addrstr, &nw386_adr);
|
||||
execl(get_exec_path(pathname, progname), progname,
|
||||
my_addrstr, serv_addrstr, NULL);
|
||||
}
|
||||
exit(1);
|
||||
|
||||
case -1: return(-1); /* error */
|
||||
}
|
||||
@ -223,13 +226,18 @@ static int start_nwclient(void)
|
||||
# define MAX_WDOG_TRIES 11 /* Standardtries */
|
||||
#endif
|
||||
|
||||
static void modify_wdog_conn(int conn, int mode);
|
||||
|
||||
static void send_wdog_packet(ipxAddr_t *addr, int conn, int what)
|
||||
{
|
||||
uint8 data[2];
|
||||
data[0] = (uint8) conn;
|
||||
data[1] = (uint8) what;
|
||||
send_ipx_data(sockfd[WDOG_SLOT], 17, 2, data, addr, "WDOG");
|
||||
if (what == '?' && dont_send_wdog(addr)) {
|
||||
modify_wdog_conn(conn, 0);
|
||||
XDPRINTF((2,0, "No wdog to %s", visable_ipx_adr(addr)));
|
||||
} else
|
||||
send_ipx_data(sockfd[WDOG_SLOT], 17, 2, data, addr, "WDOG");
|
||||
}
|
||||
|
||||
static void send_bcast_packet(ipxAddr_t *addr, int conn, int signature)
|
||||
@ -288,7 +296,7 @@ static void modify_wdog_conn(int conn, int mode)
|
||||
break;
|
||||
|
||||
default : c->counter = 0; /* reset */
|
||||
break;
|
||||
break;
|
||||
} /* switch */
|
||||
} else if (mode == 99) { /* remove */
|
||||
memset(c, 0, sizeof(CONN));
|
||||
@ -341,8 +349,8 @@ static void send_bcasts(int conn)
|
||||
|
||||
|
||||
static void send_server_respons(int fd, uint8 ipx_pack_typ,
|
||||
int respond_typ, int server_typ,
|
||||
ipxAddr_t *to_addr)
|
||||
int respond_typ, int server_typ,
|
||||
ipxAddr_t *to_addr)
|
||||
{
|
||||
IPX_DATA ipx_data;
|
||||
memset(&ipx_data, 0, sizeof(ipx_data.sip));
|
||||
@ -356,9 +364,9 @@ static void send_server_respons(int fd, uint8 ipx_pack_typ,
|
||||
U16_TO_BE16(server_typ, ipx_data.sip.server_type);
|
||||
U16_TO_BE16(0, ipx_data.sip.intermediate_networks);
|
||||
send_ipx_data(fd, ipx_pack_typ,
|
||||
sizeof(ipx_data.sip),
|
||||
(char *)&(ipx_data.sip),
|
||||
to_addr, "Server Response");
|
||||
sizeof(ipx_data.sip),
|
||||
(char *)&(ipx_data.sip),
|
||||
to_addr, "Server Response");
|
||||
}
|
||||
|
||||
void get_server_data(char *name,
|
||||
@ -377,10 +385,10 @@ void get_server_data(char *name,
|
||||
}
|
||||
|
||||
static void handle_sap(int fd,
|
||||
int ipx_pack_typ,
|
||||
int data_len,
|
||||
IPX_DATA *ipxdata,
|
||||
ipxAddr_t *from_addr)
|
||||
int ipx_pack_typ,
|
||||
int data_len,
|
||||
IPX_DATA *ipxdata,
|
||||
ipxAddr_t *from_addr)
|
||||
{
|
||||
int query_type = GET_BE16(ipxdata->sqp.query_type);
|
||||
int server_type = GET_BE16(ipxdata->sqp.server_type);
|
||||
@ -463,7 +471,7 @@ static void handle_sap(int fd,
|
||||
|
||||
|
||||
static void response_ipx_diag(int fd, int ipx_pack_typ,
|
||||
ipxAddr_t *to_addr)
|
||||
ipxAddr_t *to_addr)
|
||||
{
|
||||
IPX_DATA ipxdata;
|
||||
DIAGRESP *dia = &ipxdata.diaresp;
|
||||
@ -490,14 +498,14 @@ static void response_ipx_diag(int fd, int ipx_pack_typ,
|
||||
memcpy(p, my_server_adr.node, IPX_NODE_SIZE);
|
||||
datalen += IPX_NODE_SIZE;
|
||||
send_ipx_data(fd, ipx_pack_typ,
|
||||
datalen,
|
||||
(char*)&ipxdata,
|
||||
to_addr, "DIAG Response");
|
||||
datalen,
|
||||
(char*)&ipxdata,
|
||||
to_addr, "DIAG Response");
|
||||
}
|
||||
|
||||
static void handle_diag(int fd, int ipx_pack_typ,
|
||||
int data_len, IPX_DATA *ipxdata,
|
||||
ipxAddr_t *from_addr)
|
||||
int data_len, IPX_DATA *ipxdata,
|
||||
ipxAddr_t *from_addr)
|
||||
/* should handle CONFIGURATION REQUESTS one time */
|
||||
{
|
||||
CONFREQ *conf = &(ipxdata->confreq);
|
||||
@ -512,7 +520,7 @@ static void handle_diag(int fd, int ipx_pack_typ,
|
||||
exnodes += IPX_NODE_SIZE;
|
||||
}
|
||||
XDPRINTF((2,0,"DIAG Request, ipx_pack_typ %d, data_len %d, count %d",
|
||||
(int)ipx_pack_typ, data_len, count));
|
||||
(int)ipx_pack_typ, data_len, count));
|
||||
response_ipx_diag(fd, ipx_pack_typ, from_addr);
|
||||
}
|
||||
|
||||
@ -597,8 +605,8 @@ static void handle_event(int fd, uint16 socknr, int slot)
|
||||
/*
|
||||
print_ud_data(&ud);
|
||||
*/
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -676,7 +684,7 @@ static void get_ini(int full)
|
||||
break;
|
||||
#ifdef LINUX
|
||||
case 5 : save_ipx_routes=atoi(inhalt);
|
||||
break;
|
||||
break;
|
||||
#endif
|
||||
case 104 : /* nwclient */
|
||||
if (client_mode && atoi(inhalt))
|
||||
@ -689,6 +697,18 @@ static void get_ini(int full)
|
||||
server_goes_down_secs = 10;
|
||||
break;
|
||||
|
||||
case 300 : print_route_tac=atoi(inhalt);
|
||||
break;
|
||||
|
||||
case 301 : new_str(pr_route_info_fn, inhalt);
|
||||
break;
|
||||
|
||||
case 302 : print_route_mode=atoi(inhalt);
|
||||
break;
|
||||
|
||||
case 310 : wdogs_till_tics=atoi(inhalt);
|
||||
break;
|
||||
|
||||
default : break;
|
||||
} /* switch */
|
||||
} /* if */
|
||||
@ -696,6 +716,9 @@ static void get_ini(int full)
|
||||
fclose(f);
|
||||
}
|
||||
if (client_mode < 2) client_mode=0;
|
||||
if (print_route_tac && !pr_route_info_fn && !*pr_route_info_fn)
|
||||
print_route_tac = 0;
|
||||
if (!print_route_tac) xfree(pr_route_info_fn);
|
||||
if (full) {
|
||||
#ifdef LINUX
|
||||
init_ipx(internal_net, node, ipxdebug);
|
||||
@ -730,8 +753,7 @@ static void get_ini(int full)
|
||||
|
||||
static void send_down_broadcast(void)
|
||||
{
|
||||
send_sap_broadcast(2);
|
||||
send_rip_broadcast(2); /* shutdown rip */
|
||||
send_sap_rip_broadcast(2);
|
||||
}
|
||||
|
||||
static void close_all(void)
|
||||
@ -840,8 +862,8 @@ int main(int argc, char **argv)
|
||||
int fd = open_ipx_socket(ipx_sock_nummern[j], j, O_RDWR);
|
||||
if (fd < 0) {
|
||||
while (j--) {
|
||||
t_unbind(sockfd[j]);
|
||||
t_close(sockfd[j]);
|
||||
t_unbind(sockfd[j]);
|
||||
t_close(sockfd[j]);
|
||||
}
|
||||
return(1);
|
||||
} else {
|
||||
@ -855,11 +877,15 @@ int main(int argc, char **argv)
|
||||
|
||||
U16_TO_BE16(SOCK_NCP, my_server_adr.sock);
|
||||
if (!start_ncpserv(my_nwname, &my_server_adr)) {
|
||||
/* Jetzt POLLEN */
|
||||
ipxAddr_t server_adr_sap;
|
||||
/* now do polling */
|
||||
time_t broadtime;
|
||||
time(&broadtime);
|
||||
set_sigs();
|
||||
polls[NEEDED_SOCKETS].fd = fd_ncpserv_in;
|
||||
memcpy(&server_adr_sap, &my_server_adr, sizeof(ipxAddr_t));
|
||||
U16_TO_BE16(SOCK_SAP, server_adr_sap.sock);
|
||||
insert_delete_server(my_nwname, 0x4, &my_server_adr, &server_adr_sap, 0, 0, 0);
|
||||
while (1) {
|
||||
int anz_poll = poll(polls, NEEDED_POLLS, broadsecs);
|
||||
time(&akttime_stamp);
|
||||
@ -868,19 +894,19 @@ int main(int argc, char **argv)
|
||||
else if (fl_get_int == 2) down_server();
|
||||
}
|
||||
if (anz_poll > 0) { /* i have to work */
|
||||
struct pollfd *p = &polls[0];
|
||||
j = -1;
|
||||
while (++j < NEEDED_POLLS) {
|
||||
if (p->revents){
|
||||
struct pollfd *p = &polls[0];
|
||||
j = -1;
|
||||
while (++j < NEEDED_POLLS) {
|
||||
if (p->revents){
|
||||
if (j < NEEDED_SOCKETS) { /* socket */
|
||||
XDPRINTF((99, 0,"POLL %d, SOCKET %x", p->revents, sock_nummern[j]));
|
||||
if (p->revents & ~POLLIN)
|
||||
errorp(0, "STREAM error", "revents=0x%x", p->revents );
|
||||
else handle_event(p->fd, sock_nummern[j], j);
|
||||
XDPRINTF((99, 0,"POLL %d, SOCKET %x", p->revents, sock_nummern[j]));
|
||||
if (p->revents & ~POLLIN)
|
||||
errorp(0, "STREAM error", "revents=0x%x", p->revents );
|
||||
else handle_event(p->fd, sock_nummern[j], j);
|
||||
} else { /* fd_ncpserv_in */
|
||||
XDPRINTF((2, 0, "POLL %d, fh=%d", p->revents, p->fd));
|
||||
if (p->revents & ~POLLIN)
|
||||
errorp(0, "STREAM error", "revents=0x%x", p->revents );
|
||||
XDPRINTF((2, 0, "POLL %d, fh=%d", p->revents, p->fd));
|
||||
if (p->revents & ~POLLIN)
|
||||
errorp(0, "STREAM error", "revents=0x%x", p->revents );
|
||||
else {
|
||||
if (p->fd == fd_ncpserv_in) {
|
||||
int what;
|
||||
@ -889,7 +915,7 @@ int main(int argc, char **argv)
|
||||
ipxAddr_t adr;
|
||||
if (sizeof(int) == read(fd_ncpserv_in,
|
||||
(char*)&what, sizeof(int))) {
|
||||
XDPRINTF((2, 0, "GOT ncpserv_in what=0x%x", what));
|
||||
XDPRINTF((2, 0, "GOT ncpserv_in what=0x%x", what));
|
||||
switch (what) {
|
||||
case 0x2222 : /* insert wdog connection */
|
||||
if (sizeof(int) == read(fd_ncpserv_in,
|
||||
@ -904,7 +930,7 @@ int main(int argc, char **argv)
|
||||
case 0x4444 : /* reset wdog connection = 0 */
|
||||
/* force test wdog conn 1 = 1 */
|
||||
/* force test wdog conn 2 = 2 */
|
||||
/* remove wdog = 99 */
|
||||
/* remove wdog = 99 */
|
||||
if (sizeof(int) == read(fd_ncpserv_in,
|
||||
(char*)&conn, sizeof(int))
|
||||
&& sizeof(int) == read(fd_ncpserv_in,
|
||||
@ -932,10 +958,10 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (! --anz_poll) break;
|
||||
} /* if */
|
||||
p++;
|
||||
} /* while */
|
||||
if (! --anz_poll) break;
|
||||
} /* if */
|
||||
p++;
|
||||
} /* while */
|
||||
} else {
|
||||
XDPRINTF((99,0,"POLLING ..."));
|
||||
}
|
||||
@ -943,8 +969,7 @@ int main(int argc, char **argv)
|
||||
if (akttime_stamp - server_down_stamp > server_goes_down_secs) break;
|
||||
} else {
|
||||
if (akttime_stamp - broadtime > (broadsecs / 1000)) { /* ca. 60 seconds */
|
||||
send_sap_broadcast(broadsecs<3000); /* firsttime broadcast */
|
||||
send_rip_broadcast(broadsecs<3000); /* firsttime broadcast */
|
||||
send_sap_rip_broadcast((broadsecs<3000) ? 1 :0); /* firsttime broadcast */
|
||||
if (broadsecs < 32000) {
|
||||
rip_for_net(MAX_U32);
|
||||
get_servers();
|
||||
|
17
nwserv.h
17
nwserv.h
@ -1,4 +1,4 @@
|
||||
/* nwserv.h 11-Jan-96 */
|
||||
/* nwserv.h 14-Jan-96 */
|
||||
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@ -16,10 +16,13 @@
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
extern uint32 internal_net; /* NETWORKNUMMER INTERN (SERVER) */
|
||||
extern ipxAddr_t my_server_adr; /* Address of this server */
|
||||
extern char my_nwname[50]; /* Name of this server */
|
||||
|
||||
extern uint32 internal_net; /* NETWORKNUMMER INTERN (SERVER) */
|
||||
extern ipxAddr_t my_server_adr; /* Address of this server */
|
||||
extern char my_nwname[50]; /* Name of this server */
|
||||
extern int print_route_tac; /* every x broadcasts print it */
|
||||
extern int print_route_mode; /* append */
|
||||
extern char *pr_route_info_fn; /* filename */
|
||||
extern int wdogs_till_tics;
|
||||
|
||||
typedef struct {
|
||||
char *devname; /* "eth0" or "isdnX" */
|
||||
@ -46,8 +49,7 @@ extern NW_NET_DEVICE *net_devices[];
|
||||
extern int sockfd[];
|
||||
|
||||
extern void ins_del_bind_net_addr(char *name, ipxAddr_t *adr);
|
||||
extern void send_rip_broadcast(int mode);
|
||||
extern void send_sap_broadcast(int mode);
|
||||
extern void send_sap_rip_broadcast(int mode);
|
||||
extern void rip_for_net(uint32 net);
|
||||
extern void get_servers(void);
|
||||
|
||||
@ -64,4 +66,5 @@ extern void insert_delete_server(uint8 *name,
|
||||
int do_delete, /* delete = 1 */
|
||||
int flags);
|
||||
|
||||
extern int dont_send_wdog(ipxAddr_t *addr);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user