diff --git a/CHANGES b/CHANGES index 8732b9f..60a652e 100644 --- a/CHANGES +++ b/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) diff --git a/connect.c b/connect.c index b07e361..e8d3959 100644 --- a/connect.c +++ b/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)); diff --git a/examples/config.h b/examples/config.h index 0d8c1a9..2390cb2 100644 --- a/examples/config.h +++ b/examples/config.h @@ -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 */ diff --git a/examples/nw.ini b/examples/nw.ini index db45053..4cf3502 100644 --- a/examples/nw.ini +++ b/examples/nw.ini @@ -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 + diff --git a/makefile.unx b/makefile.unx index 5378f60..3c0186a 100644 --- a/makefile.unx +++ b/makefile.unx @@ -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 diff --git a/mars_nwe.lsm b/mars_nwe.lsm index 593ed02..01f019e 100644 --- a/mars_nwe.lsm +++ b/mars_nwe.lsm @@ -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 diff --git a/ncpserv.c b/ncpserv.c index 031c283..ef5354a 100644 --- a/ncpserv.c +++ b/ncpserv.c @@ -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 diff --git a/net.h b/net.h index ba61b38..2e17103 100644 --- a/net.h +++ b/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 diff --git a/net1.c b/net1.c index 40d1ea5..2ab78e4 100644 --- a/net1.c +++ b/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); } diff --git a/net1.h b/net1.h index ad49025..7068445 100644 --- a/net1.h +++ b/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); diff --git a/nwconn.c b/nwconn.c index 2e1f116..5e8032e 100644 --- a/nwconn.c +++ b/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); diff --git a/nwdbm.c b/nwdbm.c index 3650c3d..35c324e 100644 --- a/nwdbm.c +++ b/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); } diff --git a/nwroute.c b/nwroute.c index 2fe2df6..b036289 100644 --- a/nwroute.c +++ b/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); +} + diff --git a/nwserv.c b/nwserv.c index 70862bb..0e71482 100644 --- a/nwserv.c +++ b/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(); diff --git a/nwserv.h b/nwserv.h index a7ecae0..55aea4a 100644 --- a/nwserv.h +++ b/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);