From 28334ea9f1b43194da125998b404d60aae948841 Mon Sep 17 00:00:00 2001 From: Mario Fetka Date: Sun, 13 Nov 2011 00:38:56 +0100 Subject: [PATCH] mars_nwe-0.96.pl08 --- CHANGES | 22 +- INSTALL | 21 +- INSTALL.ger | 22 + Makefile | 10 +- connect.c | 457 ++++----------------- connect.h | 178 +++++++- emutli.c | 35 +- emutli.h | 4 +- examples/README.dosemu | 7 + examples/README.patch | 4 +- examples/config.h | 32 +- examples/dosemu-patch | 11 + examples/mk.li | 54 ++- examples/nw.ini | 20 +- makefile.unx | 60 +-- mars_nwe.lsm | 10 +- namspace.c | 896 ++++++++++++++++++++++++++++++++++++++++- namspace.h | 53 ++- ncpserv.c | 91 ++++- net.h | 253 +++--------- netinit.c | 308 -------------- nwclient.c | 16 +- nwconn.c | 78 ++-- nwdbm.c | 4 +- nwfile.c | 369 +++++++++++++++++ nwfile.h | 38 ++ nwroute.c | 72 +++- nwroute1.c | 172 ++++++++ nwserv.c | 221 ++++++---- nwserv.h | 26 +- nwvolume.c | 17 +- nwvolume.h | 15 +- tools.c | 24 +- tools.h | 7 +- 34 files changed, 2449 insertions(+), 1158 deletions(-) create mode 100644 examples/README.dosemu create mode 100644 examples/dosemu-patch delete mode 100644 netinit.c create mode 100644 nwfile.c create mode 100644 nwfile.h create mode 100644 nwroute1.c diff --git a/CHANGES b/CHANGES index 8b0aa94..bca685c 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,5 @@ Sorry, this is in German only. :-( -Aenderungen in mars_nwe bis zum : 22-Jan-96 +Aenderungen in mars_nwe bis zum : 08-Feb-96 -------------------------------- Erste 'oeffentliche' Version ^^^^^^^^^^ VERSION 0.94 ^^^^^^^^ @@ -61,4 +61,24 @@ Erste 'oeffentliche' Version net < angebbarer anzahl tics ist. (z.B. fuer IPX ueber ISDN) - Verarbeitung von 'PIPE Jobs' eingebaut. - Bug beim Drucken korrigiert. (nprint funktionierte nicht) +- 0x17, 0x35 u. 0x37 upstr objname eingebaut. +- auf USL 2.xx (UnixWare (tm)) wieder zum Laufen gebracht. +- kann nun auch ohne internen Router (RIP/SAP) erzeugt werden. + dafuer define INTERNAL_RIP_SAP in config.h eingebaut. +- kann auch als standalone router only Fileserver Aktivitaet + verwendet werden. + Dafuer define FILE_SERVER_INACTIV in config.h eingebaut. +- mk.li erweitert. +- Schalter zum Testen von namespace calls eingebaut. config.h +- config.h um folgende Konstanten erweitert. + NETWORK_SERIAL_NMBR 0x44444444L /* Serial Number 4 Byte */ + NETWORK_APPL_NMBR 0x2222 /* Applikation Number 2 Byte */ +- Schalter fuer das aktivieren von Namespace services calls + in config.h eingebaut. define WITH_NAME_SPACE_CALLS +- Schalter 'm' fuer removable volumes ( z.B. CDROMS ) + eingebaut. (Lauri Tischler) +- func 0x17, ufunc 0x15 eingebaut. + + + diff --git a/INSTALL b/INSTALL index f25dd3d..0a882b5 100644 --- a/INSTALL +++ b/INSTALL @@ -1,3 +1,22 @@ +=========> !! important NOTE !! +You can configure mars_nwe in two ways. +1. You want mars_nwe to handle routing/sap and configuring + ipx-interfaces. This is the default mode. + You do not need any other ipx-tool or routers/daemons. + In this modus the correct coexisting working + of mars_nwe, dosemu, ncpfs or Caldera's nwclient was tested. +-> you must use kernel < 1.3.60 or use kernel >= 1.3.60 and compile + your kernel with IPX-option CONFIG_IPX_INTERN=N + In mars_nwe/config.h there must exist the following line: + #define INTERNAL_RIP_SAP 1 + +2. You want to run mars_nwe only as a fileserver and use + special tools to configure ipx and rip/sap routers. +-> In this mode you must use tools like ipx-configure and + ripd to configure ipx-interfaces, routes and handle rip/sap. + In mars_nwe/config.h there must exist the following line: + #define INTERNAL_RIP_SAP 0 + =========> create programs 1. call make. 2. perhaps you must modify mk.li and config.h @@ -28,7 +47,7 @@ kill of nwserv or with the right dos client programm nw.ini file gives the time in seconds, before the server really shuts down. -Viel Erfolg / good Luck :-) +good luck :-) Martin (mstover@freeway.de) diff --git a/INSTALL.ger b/INSTALL.ger index a582396..d15c25e 100644 --- a/INSTALL.ger +++ b/INSTALL.ger @@ -1,3 +1,25 @@ +=========> !! wichtiger HINWEIS !! +Mars_nwe kann auf Arten konfiguriert werden. +1. Mars_nwe soll die IPX-Routen automatisch setzen, + die IPX-Interfaces per ini/conf Datei konfigurieren + und als RIP/SAP Router arbeiten. + Dieses ist der default Modus. Es werden keine weiteren + Programme wie ipx-configure oder IPX rip/sap Daemons + benoetigt. + In diesem Modus wurde das korrekte Zusammenspiel mit + dosemu, ncpfs oder Caldera's nwclient getestet. +-> Es muss ein Kernel < 1.3.60 oder aber ein Kernel >= 1.3.60, + kompiliert mit IPX-Option CONFIG_IPX_INTERN=N, verwendet werden. + In mars_nwe/config.h muss folgende Zeile vorhanden sein. + #define INTERNAL_RIP_SAP 1 + +2. Mars_nwe soll nur als File Server Verwendung finden. +-> Die IPX-Interfaces muessen durch andere Programme/Tools + wie 'ipx-configure' oder aehnliche eingerichtet werden + und es muss ein rip/sap router/daemon eingerichtet sein. + In mars_nwe/config.h muss folgende Zeile vorhanden sein. + #define INTERNAL_RIP_SAP 0 + =========> Programme erzeugen 1. make aufrufen. 2. mk.li und config.h evtl. anpassen diff --git a/Makefile b/Makefile index 37867b9..236ca9b 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,7 @@ -# Makefile mars_nwe: 06-Dec-95 +# Makefile mars_nwe: 31-Jan-96 + VPATH= + all: rmeflag mk.li config.h nw.ini @if [ -r .eflag ] ; then \ echo ""; \ @@ -9,7 +11,7 @@ all: rmeflag mk.li config.h nw.ini echo "Please make your changes and run make again"; \ echo "********************************************************"; \ echo "";\ - echo ""; else ./mk.li && (\ + echo ""; else ./mk.li && (\ if [ -r .mk.notes ] ; then echo "" ; \ echo ""; \ echo "********************************************************" ; \ @@ -61,12 +63,12 @@ config.h: examples/config.h echo "and change it to your requirements." >> .eflag ; fi rmeflag: - @ - rm -f .eflag + @- rm -f .eflag nw.ini: examples/nw.ini @if [ -r $@ ] ; then echo "NOTE:examples/$@ is newer then $@" > .mk.notes ; \ echo "please compare examples/$@ with $@" >> .mk.notes; \ echo "make the changes you need and touch $@" >> .mk.notes; \ - else cp -a examples/$@ . ; \ + else cp examples/$@ . ; \ echo "$@ created (from examples/$@) Please edit $@" > .mk.notes;\ echo "and change it to your requirements." >> .mk.notes ; fi diff --git a/connect.c b/connect.c index 2bd9288..0eba2f5 100644 --- a/connect.c +++ b/connect.c @@ -1,5 +1,5 @@ -/* connect.c 22-Jan-96 */ -/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany +/* connect.c 23-Jan-96 */ +/* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany * * 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 @@ -34,6 +34,7 @@ static int default_uid=-1; static int default_gid=-1; #include "nwvolume.h" +#include "nwfile.h" #include "connect.h" NW_DIR dirs[MAX_NW_DIRS]; @@ -41,13 +42,10 @@ int used_dirs=0; static int connect_is_init = 0; -#define MAX_FILEHANDLES 80 #define MAX_DIRHANDLES 80 -static FILE_HANDLE file_handles[MAX_FILEHANDLES]; static DIR_HANDLE dir_handles[MAX_DIRHANDLES]; -static int anz_fhandles=0; static int anz_dirhandles=0; static char *build_unix_name(NW_PATH *nwpath, int modus) @@ -65,79 +63,18 @@ static char *build_unix_name(NW_PATH *nwpath, int modus) strcpy(unixname, "ZZZZZZZZZZZZ"); /* vorsichthalber */ return(unixname); } - strcpy(unixname, nw_volumes[volume].unixname); /* first UNIXNAME VOLUME */ + strcpy(unixname, (char*)nw_volumes[volume].unixname); /* first UNIXNAME VOLUME */ p = pp = unixname+strlen(unixname); - strcpy(p, nwpath->path); /* now the path */ - p += strlen(nwpath->path); + strcpy(p, (char*)nwpath->path); /* now the path */ + p += strlen((char*)nwpath->path); if ( (!(modus & 1)) && nwpath->fn[0]) - strcpy(p, nwpath->fn); /* and now fn */ + strcpy(p, (char*)nwpath->fn); /* and now fn */ else if ((modus & 2) && (*(p-1) == '/')) *(p-1) = '\0'; if (nw_volumes[volume].options & 1) downstr((uint8*)pp); return(unixname); } -static int new_file_handle(void) -{ - int rethandle = -1; - FILE_HANDLE *fh=NULL; - while (++rethandle < anz_fhandles) { - FILE_HANDLE *fh=&(file_handles[rethandle]); - if (fh->fd == -1 && !(fh->flags & 4)) { /* empty slot */ - rethandle++; - break; - } else fh=NULL; - } - if (fh == NULL) { - if (anz_fhandles < MAX_FILEHANDLES) { - fh=&(file_handles[anz_fhandles]); - rethandle = ++anz_fhandles; - } else return(0); /* no free handle anymore */ - } - /* init handle */ - fh->fd = -2; - fh->offd = 0L; - fh->tmodi = 0L; - fh->name[0] = '\0'; - fh->flags = 0; - fh->f = NULL; - XDPRINTF((5, 0, "new_file_handle=%d, anz_fhandles=%d", - rethandle, anz_fhandles)); - return(rethandle); -} - -static int free_file_handle(int fhandle) -{ - int result=-0x88; - if (fhandle > 0 && (fhandle <= anz_fhandles)) { - FILE_HANDLE *fh=&(file_handles[fhandle-1]); - if (fh->fd > -1) { - if (fh->flags & 2) { - if (fh->f) pclose(fh->f); - fh->f = NULL; - } else close(fh->fd); - if (fh->tmodi > 0L && !(fh->flags & 2)) { - /* now set date and time */ - struct utimbuf ut; - ut.actime = ut.modtime = fh->tmodi; - utime(fh->name, &ut); - fh->tmodi = 0L; - } - } - fh->fd = -1; - if (fhandle == anz_fhandles && !(fh->flags & 4)) { - /* was last */ - anz_fhandles--; - while (anz_fhandles && file_handles[anz_fhandles-1].fd == -1 - && !(file_handles[anz_fhandles-1].flags & 4) ) - anz_fhandles--; - } - result=0; - } - XDPRINTF((5, 0, "free_file_handle=%d, anz_fhandles=%d, result=%d", - fhandle, anz_fhandles, result)); - return(result); /* wrong filehandle */ -} static int new_dir_handle(ino_t inode, NW_PATH *nwpath) /* @@ -152,7 +89,7 @@ static int new_dir_handle(ino_t inode, NW_PATH *nwpath) int nhandle = 0; for (rethandle=0; rethandle < anz_dirhandles; rethandle++){ fh=&(dir_handles[rethandle]); - if (fh->f == (DIR*) NULL) { + if (!fh->inode) { if (!nhandle) nhandle = rethandle+1; } else if (fh->inode == inode && fh->volume == nwpath->volume){ /* Dieser hat Vorrang */ @@ -187,6 +124,10 @@ static int new_dir_handle(ino_t inode, NW_PATH *nwpath) fh->vol_options = nw_volumes[fh->volume].options; fh->inode = inode; fh->timestamp = akttime; + if (fh->vol_options & VOL_OPTION_REMOUNT) { + closedir(fh->f); + fh->f = NULL; + } } else { fh->f = (DIR*)NULL; fh->unixname[0] = '\0'; @@ -205,7 +146,8 @@ static int free_dir_handle(int dhandle) closedir(fh->f); fh->f = (DIR*)NULL; } - while (anz_dirhandles && dir_handles[anz_dirhandles-1].f == (DIR*)NULL) + fh->inode = 0; + while (anz_dirhandles && !dir_handles[anz_dirhandles-1].inode) anz_dirhandles--; return(0); } @@ -240,7 +182,7 @@ static char nwpathname[300]; char volname[100]; if (p->volume < 0 || p->volume >= used_nw_volumes) { sprintf(volname, "<%d=NOT-OK>", (int)p->volume); - } else strcpy(volname, nw_volumes[p->volume].sysname); + } else strcpy(volname, (char*)nw_volumes[p->volume].sysname); sprintf(nwpathname, "%s:%s%s", volname, p->path, p->fn); return(nwpathname); } @@ -475,6 +417,23 @@ static int get_dir_entry(NW_PATH *nwpath, return(okflag); } +static DIR *give_dh_f(DIR_HANDLE *dh) +{ + if (!dh->f) { + *(dh->kpath) = '\0'; + dh->f = opendir(dh->unixname); + } + return(dh->f); +} + +static void release_dh_f(DIR_HANDLE *dh) +{ + if (dh->f && (dh->vol_options & VOL_OPTION_REMOUNT) ) { + closedir(dh->f); + dh->f = NULL; + } +} + static int get_dh_entry(DIR_HANDLE *dh, uint8 *search, int *sequence, @@ -483,8 +442,9 @@ static int get_dh_entry(DIR_HANDLE *dh, /* returns 1 if OK and 0 if not OK */ { - DIR *f = dh->f; + DIR *f = give_dh_f(dh); int okflag = 0; + if (f != (DIR*)NULL) { struct dirent *dirbuff; uint8 entry[256]; @@ -525,16 +485,17 @@ static int get_dh_entry(DIR_HANDLE *dh, } /* while */ dh->kpath[0] = '\0'; *sequence = (int) telldir(f); + release_dh_f(dh); } /* if */ return(okflag); } void conn_build_path_fn( uint8 *vol, - uint8 *path, - uint8 *fn, - int *has_wild, - uint8 *data, - int len) + uint8 *path, + uint8 *fn, + int *has_wild, + uint8 *data, + int len) /* is called from build_path */ { @@ -819,111 +780,6 @@ static int get_dir_attrib(NW_DIR_INFO *d, struct stat *stb, } -int nw_creat_open_file(int dir_handle, uint8 *data, int len, - NW_FILE_INFO *info, int attrib, int access, int creatmode) -/* - * creatmode: 0 = open, 1 = creat, 2 = creatnew - * attrib ?? - * access: 0x1=read, 0x2=write - */ -{ - int fhandle=new_file_handle(); - - if (fhandle > 0){ - FILE_HANDLE *fh=&(file_handles[fhandle-1]); - NW_PATH nwpath; - int completition = conn_get_kpl_path(&nwpath, dir_handle, data, len, 0); - -#ifdef TEST_FNAME - int got_testfn = 0; - if (!nw_debug){ - if (strstr(nwpath.fn, TEST_FNAME)){ - nw_debug = 99; - got_testfn++; - } - } -#endif - if (completition > -1) { - struct stat stbuff; - completition = -0xff; /* no File Found */ - strcpy(fh->name, build_unix_name(&nwpath, 0)); - if (get_volume_options(nwpath.volume, 1) & VOL_OPTION_IS_PIPE) { - /* this is a PIPE Dir */ - int statr = stat(fh->name, &stbuff); - if (!statr && (stbuff.st_mode & S_IFMT) != S_IFDIR) { - char pipecommand[300]; - char *pipeopen = (creatmode || (access & 2)) ? "w" : "r"; - char *topipe = "READ"; - if (creatmode) topipe = "CREAT"; - else if (access & 2) topipe = "WRITE"; - sprintf(pipecommand, "%s %s", fh->name, topipe); - fh->f = popen(pipecommand, pipeopen); - fh->fd = (fh->f) ? fileno(fh->f) : -1; - if (fh->fd > -1) { - fh->flags |= 2; - get_file_attrib(info, &stbuff, &nwpath); - return(fhandle); - } - } - } else { - if (creatmode) { /* creat File */ - if (creatmode & 0x2) { /* creatnew */ - if (!stat(fh->name, &stbuff)) { - XDPRINTF((5,0,"CREAT File exist!! :%s:", fh->name)); - fh->fd = -1; - completition = -0x85; /* No Priv */ - } else { - XDPRINTF((5,0,"CREAT FILE:%s: Handle=%d", fh->name, fhandle)); - fh->fd = creat(fh->name, 0777); - if (fh->fd < 0) completition = -0x84; /* no create Rights */ - } - } else { - XDPRINTF((5,0,"CREAT FILE, ever with attrib:0x%x, access:0x%x, fh->name:%s: handle:%d", - attrib, access, fh->name, fhandle)); - fh->fd = open(fh->name, O_CREAT|O_TRUNC|O_RDWR, 0777); - if (fh->fd < 0) completition = -0x85; /* no delete /create Rights */ - } - if (fh->fd > -1) { - close(fh->fd); - fh->fd = open(fh->name, O_RDWR); - fh->offd = 0L; - stat(fh->name, &stbuff); - } - } else { - int statr = stat(fh->name, &stbuff); - int acm = (access & 2) ? (int) O_RDWR /*|O_CREAT*/ : (int)O_RDONLY; - if ( (!statr && (stbuff.st_mode & S_IFMT) != S_IFDIR) - || (statr && (acm & O_CREAT))){ - XDPRINTF((5,0,"OPEN FILE with attrib:0x%x, access:0x%x, fh->name:%s: fhandle=%d",attrib,access, fh->name, fhandle)); - fh->fd = open(fh->name, acm, 0777); - fh->offd = 0L; - if (fh->fd > -1) { - if (statr) stat(fh->name, &stbuff); - } else completition = -0x9a; - } - - } - - if (fh->fd > -1) { - get_file_attrib(info, &stbuff, &nwpath); -#ifdef TEST_FNAME - if (got_testfn) test_handle = fhandle; -#endif - return(fhandle); - } - } /* else (NOT DEVICE) */ - } - XDPRINTF((5,0,"OPEN FILE not OK ! fh->name:%s: fhandle=%d",fh->name, fhandle)); - free_file_handle(fhandle); -#ifdef TEST_FNAME - if (got_testfn) { - test_handle = -1; - nw_debug = -99; - } -#endif - return(completition); - } else return(-0x81); /* no more File Handles */ -} static int do_delete_file(NW_PATH *nwpath, FUNC_SEARCH *fs) { @@ -967,168 +823,6 @@ int nw_chmod_datei(int dir_handle, uint8 *data, int len, int modus) return(-0x9c); /* wrong path */ } -int nw_close_datei(int fhandle) -{ - if (fhandle > 0 && (fhandle <= anz_fhandles)) { - FILE_HANDLE *fh=&(file_handles[fhandle-1]); - if (fh->fd > -1) { - int result = 0; - int result2; - if (fh->flags & 2) { - if (fh->f) { - result=pclose(fh->f); - if (result) result = -1; - } - fh->f = NULL; - } else result=close(fh->fd); - fh->fd = -1; - if (fh->tmodi > 0L && !(fh->flags&2)) { - struct utimbuf ut; - ut.actime = ut.modtime = fh->tmodi; - utime(fh->name, &ut); - fh->tmodi = 0L; - } -#ifdef TEST_FNAME - if (fhandle == test_handle) { - test_handle = -1; - nw_debug = -99; - } -#endif - result2=free_file_handle(fhandle); - return((result == -1) ? -0xff : result2); - } else return(free_file_handle(fhandle)); - } - return(-0x88); /* wrong filehandle */ -} - - -int nw_read_datei(int fhandle, uint8 *data, int size, uint32 offset) -{ - if (fhandle > 0 && (--fhandle < anz_fhandles)) { - FILE_HANDLE *fh=&(file_handles[fhandle]); - if (fh->fd > -1) { - if (fh->offd != (long)offset) - fh->offd=lseek(fh->fd, offset, SEEK_SET); - if (fh->offd > -1L) { - size = read(fh->fd, data, size); - fh->offd+=(long)size; - } else size = -1; - return(size); - } - } - return(- 0x88); /* wrong filehandle */ -} - -int nw_seek_datei(int fhandle, int modus) -{ - if (fhandle > 0 && (--fhandle < anz_fhandles)) { - FILE_HANDLE *fh=&(file_handles[fhandle]); - if (fh->fd > -1) { - int size=-0xfb; - if (!modus) { - if ( (size=fh->offd=lseek(fh->fd, 0L, SEEK_END)) < 0L) - size = -1; - } - return(size); - } - } - return(-0x88); /* wrong filehandle */ -} - - -int nw_write_datei(int fhandle, uint8 *data, int size, uint32 offset) -{ - if (fhandle > 0 && (--fhandle < anz_fhandles)) { - FILE_HANDLE *fh=&(file_handles[fhandle]); - if (fh->fd > -1) { - if (fh->offd != (long)offset) - fh->offd = lseek(fh->fd, offset, SEEK_SET); - if (size) { - if (fh->offd > -1L) { - size = write(fh->fd, data, size); - fh->offd+=(long)size; - } else size = -1; - return(size); - } else { /* strip FILE */ - /* TODO: for LINUX */ - struct flock flockd; - int result= /* -1 */ 0; - flockd.l_type = 0; - flockd.l_whence = SEEK_SET; - flockd.l_start = offset; - flockd.l_len = 0; -#if HAVE_TLI - result = fcntl(fh->fd, F_FREESP, &flockd); - XDPRINTF((5,0,"File %s is stripped, result=%d", fh->name, result)); -#endif - return(result); - } - } - } - return(- 0x88); /* wrong filehandle */ -} - -int nw_server_copy(int qfhandle, uint32 qoffset, - int zfhandle, uint32 zoffset, - uint32 size) -{ - if (qfhandle > 0 && (--qfhandle < anz_fhandles) - && zfhandle > 0 && (--zfhandle < anz_fhandles) ) { - FILE_HANDLE *fhq=&(file_handles[qfhandle]); - FILE_HANDLE *fhz=&(file_handles[zfhandle]); - int retsize = -1; - if (fhq->fd > -1 && fhz->fd > -1) { - char buff[2048]; - int wsize; - if (lseek(fhq->fd, qoffset, SEEK_SET) > -1L && - lseek(fhz->fd, zoffset, SEEK_SET) > -1L) { - retsize = 0; - while (size && !retsize) { - int xsize = read(fhq->fd, buff, min(size, (uint32)sizeof(buff))); - if (xsize > 0){ - if ((wsize =write(fhz->fd, buff, xsize)) != xsize) { - retsize = -0x1; /* out of Disk SPace */ - break; - } else { - size -= (uint32)xsize; - retsize += wsize; - } - } else { - if (xsize < 0) retsize=-0x93; /* no read privilegs */ - break; - } - } - } - fhq->offd = -1L; - fhz->offd = -1L; -/* - if (!retsize) (retsize=fhz->offd=lseek(fhz->fd, 0L, SEEK_END)); -*/ - return(retsize); - } - } - return(- 0x88); /* wrong filehandle */ -} - - -int nw_lock_datei(int fhandle, int offset, int size, int do_lock) -{ - if (fhandle > 0 && (--fhandle < anz_fhandles)) { - FILE_HANDLE *fh=&(file_handles[fhandle]); - if (fh->fd > -1) { - struct flock flockd; - int result; - flockd.l_type = (do_lock) ? F_WRLCK : F_UNLCK; - flockd.l_whence = SEEK_SET; - flockd.l_start = offset; - flockd.l_len = size; - result = fcntl(fh->fd, F_SETLK, &flockd); - if (!result) return(0); - else return(-0x21); /* LOCK Violation */ - } - } - return(-0x88); /* wrong filehandle */ -} int nw_mk_rd_dir(int dir_handle, uint8 *data, int len, int mode) { @@ -1257,9 +951,9 @@ int nw_init_connect(void) d++; } + init_file_module(); + if (connect_is_init) { - k = 0; - while (k++ < anz_fhandles) free_file_handle(k); k = 0; while (k++ < anz_dirhandles) free_dir_handle(k); } else connect_is_init++; @@ -1292,7 +986,6 @@ int nw_init_connect(void) /* first Handle must be known und must not be temp */ /* and has no Drive-Character */ used_dirs = 1; - anz_fhandles = 0; anz_dirhandles = 0; return(0); } else return(-1); @@ -1528,7 +1221,6 @@ int nw_get_vol_number(int dir_handle) return(result); } - int nw_get_eff_dir_rights(int dir_handle, uint8 *data, int len, int modus) /* modus 0=only_dir, 1=dirs and files */ { @@ -1546,18 +1238,27 @@ int nw_get_eff_dir_rights(int dir_handle, uint8 *data, int len, int modus) return(completition); } -int nw_set_fdate_time(uint32 fhandle, uint8 *datum, uint8 *zeit) +int nw_creat_open_file(int dir_handle, uint8 *data, int len, + NW_FILE_INFO *info, int attrib, int access, + int creatmode) +/* + * creatmode: 0 = open | 1 = creat | 2 = creatnew & 4 == save handle + * attrib ?? + * access: 0x1=read, 0x2=write + */ { - if (fhandle > 0 && (--fhandle < anz_fhandles) ) { - FILE_HANDLE *fh=&(file_handles[fhandle]); - if (fh->fd > -1) { - fh->tmodi = nw_2_un_time(datum, zeit); - return(0); - } - } - return(-0x88); /* wrong filehandle */ -} + NW_PATH nwpath; + int completition = conn_get_kpl_path(&nwpath, dir_handle, data, len, 0); + if (completition > -1) { + struct stat stbuff; + completition=file_creat_open(nwpath.volume, build_unix_name(&nwpath, 0), + &stbuff, attrib, access, creatmode); + if (completition > -1) + get_file_attrib(info, &stbuff, &nwpath); + } + return(completition); +} static int s_nw_scan_dir_info(int dir_handle, uint8 *data, int len, uint8 *subnr, @@ -1622,8 +1323,8 @@ static int s_nw_scan_dir_info(int dir_handle, int nw_scan_dir_info(int dir_handle, uint8 *data, int len, uint8 *subnr, uint8 *subname, uint8 *subdatetime, uint8 *owner) { - int k = len; - char *p = data+len; + int k = len; + uint8 *p = data+len; uint8 dirname[256]; while (k--) { uint8 c = *--p; @@ -1845,11 +1546,7 @@ static void free_queue_job(int q_id) if (q_id > 0 && q_id <= anz_jobs) { INT_QUEUE_JOB **pp=&(queue_jobs[q_id-1]); uint32 fhandle = (*pp)->fhandle; - if (fhandle > 0) { - FILE_HANDLE *fh=&(file_handles[fhandle-1]); - fh->flags &= (~4); - nw_close_datei(fhandle); - } + if (fhandle > 0) nw_close_datei(fhandle, 1); if (q_id == anz_jobs) { xfree(*pp); --anz_jobs; @@ -1889,12 +1586,7 @@ static int create_queue_file(char *job_file_name, if (result > -1) result = nw_creat_open_file(result, job_file_name+1, (int) *job_file_name, - &fnfo, 0x6, 0x6, 1); - - if (result > 0){ - FILE_HANDLE *fh=&(file_handles[result-1]); - fh->flags = 4; /* don't reuse after close */ - } + &fnfo, 0x6, 0x6, 1 | 4); XDPRINTF((5,0,"creat queue file bez=`%s` handle=%d", job_bez, result)); @@ -1932,8 +1624,8 @@ int nw_creat_queue(int connection, uint8 *queue_id, uint8 *queue_job, if (result > -1) { jo->fhandle = (uint32) result; - U32_TO_BE32(jo->fhandle, jo->q.o.job_file_handle); - U16_TO_BE16(0, jo->q.o.job_file_handle+4); + U16_TO_BE16(0, jo->q.o.job_file_handle); + U32_TO_BE32(jo->fhandle, jo->q.o.job_file_handle+2); result = 0; } jo->q.o.server_station = 0; @@ -1969,8 +1661,7 @@ int nw_creat_queue(int connection, uint8 *queue_id, uint8 *queue_job, if (result > -1) { jo->fhandle = (uint32) result; - U16_TO_BE16((uint16)result, jo->q.n.job_file_handle); - U16_TO_BE16(0, jo->q.n.job_file_handle+2); + U32_TO_BE32(jo->fhandle, jo->q.n.job_file_handle); result = 0; } U32_TO_BE32(0, jo->q.n.server_station); @@ -1993,16 +1684,14 @@ int nw_close_file_queue(uint8 *queue_id, if (jo_id > 0 && jo_id <= anz_jobs){ INT_QUEUE_JOB *jo=queue_jobs[jo_id-1]; int fhandle = (int)jo->fhandle; + char unixname[300]; + strmaxcpy(unixname, file_get_unix_name(fhandle), sizeof(unixname)-1); XDPRINTF((5,0,"nw_close_file_queue fhandle=%d", fhandle)); - if (fhandle > 0 && fhandle <= anz_fhandles) { - FILE_HANDLE *fh=&(file_handles[fhandle-1]); - char unixname[300]; + if (*unixname) { char printcommand[256]; FILE *f=NULL; - strmaxcpy(unixname, fh->name, sizeof(unixname)-1); strmaxcpy(printcommand, prc, prc_len); - fh->flags &= (~4); - nw_close_datei(fhandle); + nw_close_datei(fhandle, 1); jo->fhandle = 0L; if (NULL != (f = fopen(unixname, "r"))) { int is_ok = 0; @@ -2027,7 +1716,7 @@ int nw_close_file_queue(uint8 *queue_id, } } else XDPRINTF((1,0,"Cannot open queue-file `%s`", unixname)); } else - XDPRINTF((2,0,"fhandle=%d NOT OK anz_fhandles=%d", fhandle, anz_fhandles)); + XDPRINTF((2,0,"fhandle=%d NOT OK !", fhandle)); free_queue_job(jo_id); } return(result); diff --git a/connect.h b/connect.h index 4362bcb..4230957 100644 --- a/connect.h +++ b/connect.h @@ -1,15 +1,6 @@ -/* connect.h 21-Jan-96 */ - -typedef struct { - int fd; /* von System bei Open bzw. Create */ - long offd; /* aktueller File Offset */ - time_t tmodi; /* modification TIME */ - FILE *f; /* for PIPE */ - int flags; /* 2 = PIPE */ - /* 4 = don't reuse after close */ - char name[256]; /* UNIX Dateiname */ -} FILE_HANDLE; - +/* connect.h 28-Jan-96 */ +#ifndef _CONNECT_H_ +#define _CONNECT_H_ typedef struct { DIR *f; char unixname[256]; /* kompletter unixname */ @@ -37,6 +28,95 @@ typedef struct { uint8 task; /* actual task */ } NW_DIR; +typedef struct { + uint8 name[14]; /* filename in DOS format */ + uint8 attrib; /* Attribute */ + uint8 ext_attrib; /* File Execute Type */ + uint8 size[4]; /* size of file */ + uint8 create_date[2]; + uint8 acces_date[2]; + uint8 modify_date[2]; + uint8 modify_time[2]; +} NW_FILE_INFO; + +typedef struct { + uint8 name[14]; /* dirname */ + uint8 attrib; + uint8 ext_attrib; + uint8 create_date[2]; + uint8 create_time[2]; + uint8 owner_id[4]; + uint8 access_right_mask; + uint8 reserved; /* future use */ + uint8 next_search[2]; +} NW_DIR_INFO; + + +extern int nw_init_connect(void); +extern int nw_free_handles(int task); + +extern int nw_creat_open_file(int dir_handle, uint8 *data, int len, + NW_FILE_INFO *info, int attrib, int access, int mode); + +extern int nw_delete_datei(int dir_handle, uint8 *data, int len); +extern int nw_chmod_datei(int dir_handle, uint8 *data, int len, int modus); + +extern int mv_file(int qdirhandle, uint8 *q, int qlen, + int zdirhandle, uint8 *z, int zlen); + + + +extern int nw_mk_rd_dir(int dir_handle, uint8 *data, int len, int mode); + +extern int nw_search(uint8 *info, + int dirhandle, int searchsequence, + int search_attrib, uint8 *data, int len); + +extern int nw_dir_search(uint8 *info, + int dirhandle, int searchsequence, + int search_attrib, uint8 *data, int len); + + +extern int nw_find_dir_handle( int dir_handle, + uint8 *data, /* zus„tzlicher Pfad */ + int len); /* L„nge Pfad */ + +extern int nw_alloc_dir_handle( + int dir_handle, /* Suche ab Pfad dirhandle */ + uint8 *data, /* zus„tzl. Pfad */ + int len, /* L„nge DATA */ + int driveletter, /* A .. Z normal */ + int is_temphandle, /* tempor„res Handle 1 */ + /* spez. temp Handle 2 */ + int task); /* Prozess Task */ + + +extern int nw_open_dir_handle( int dir_handle, + uint8 *data, /* zus„tzlicher Pfad */ + int len, /* L„nge DATA */ + int *volume, /* Volume */ + int *dir_id, /* „hnlich Filehandle */ + int *searchsequence); + + +extern int nw_free_dir_handle(int dir_handle); + +extern int nw_set_dir_handle(int targetdir, int dir_handle, + uint8 *data, int len, int task); + +extern int nw_get_directory_path(int dir_handle, uint8 *name); + +extern int nw_get_vol_number(int dir_handle); + + + +extern int nw_get_eff_dir_rights(int dir_handle, uint8 *data, int len, int modus); + +extern int nw_scan_dir_info(int dir_handle, uint8 *data, int len, + uint8 *subnr, uint8 *subname, + uint8 *subdatetime, uint8 *owner); + + #define MAX_NW_DIRS 255 extern NW_DIR dirs[MAX_NW_DIRS]; extern int used_dirs; @@ -64,6 +144,77 @@ extern int fn_match(uint8 *s, uint8 *p, uint8 options); /* queues */ +typedef struct { + uint8 record_in_use[2]; + uint8 record_previous[4]; + uint8 record_next[4]; + uint8 client_connection[4]; + uint8 client_task[4]; + uint8 client_id[4]; + + uint8 target_id[4]; /* 0xff, 0xff, 0xff, 0xff */ + uint8 target_execute_time[6]; /* all 0xff */ + uint8 job_entry_time[6]; /* all zero */ + uint8 job_id[4]; /* ?? alles 0 HI-LOW */ + uint8 job_typ[2]; /* z.B. Printform HI-LOW */ + uint8 job_position[2]; /* ?? alles 0 low-high ? */ + uint8 job_control_flags[2]; /* z.B 0x10, 0x00 */ + /* 0x80 operator hold flag */ + /* 0x40 user hold flag */ + /* 0x20 entry open flag */ + /* 0x10 service restart flag */ + /* 0x08 autostart flag */ + + uint8 job_file_name[14]; /* len + DOS filename */ + uint8 job_file_handle[4]; + uint8 server_station[4]; + uint8 server_task[4]; + uint8 server_id[4]; + uint8 job_bez[50]; /* "LPT1 Catch" */ + uint8 client_area[152]; +} QUEUE_JOB; + +typedef struct { + uint8 client_connection; + uint8 client_task; + uint8 client_id[4]; + uint8 target_id[4]; /* 0xff, 0xff, 0xff, 0xff */ + uint8 target_execute_time[6]; /* all 0xff */ + uint8 job_entry_time[6]; /* all zero */ + uint8 job_id[2]; /* ?? alles 0 HI-LOW */ + uint8 job_typ[2]; /* z.B. Printform HI-LOW */ + uint8 job_position; /* zero */ + uint8 job_control_flags; /* z.B 0x10 */ + /* 0x80 operator hold flag */ + /* 0x40 user hold flag */ + /* 0x20 entry open flag */ + /* 0x10 service restart flag */ + /* 0x08 autostart flag */ + + uint8 job_file_name[14]; /* len + DOS filename */ + uint8 job_file_handle[6]; + uint8 server_station; + uint8 server_task; + uint8 server_id[4]; + uint8 job_bez[50]; /* "LPT1 Catch" */ + uint8 client_area[152]; +} QUEUE_JOB_OLD; /* before 3.11 */ + +typedef struct { + uint8 version; /* normal 0x0 */ + uint8 tabsize; /* normal 0x8 */ + uint8 anz_copies[2]; /* copies 0x0, 0x01 */ + uint8 print_flags[2]; /* 0x0, 0xc0 z.B. with banner */ + uint8 max_lines[2]; /* 0x0, 0x42 */ + uint8 max_chars[2]; /* 0x0, 0x84 */ + uint8 form_name[16]; /* "UNKNOWN" */ + uint8 reserved[6]; /* all zero */ + uint8 banner_user_name[13]; /* "SUPERVISOR" */ + uint8 bannner_file_name[13]; /* "LST:" */ + uint8 bannner_header_file_name[14]; /* all zero */ + uint8 file_path_name[80]; /* all zero */ +} QUEUE_PRINT_AREA; + extern int nw_creat_queue(int connection, uint8 *queue_id, uint8 *queue_job, uint8 *dirname, int dir_nam_len, int old_call); @@ -72,7 +223,6 @@ extern int nw_close_file_queue(uint8 *queue_id, uint8 *prc, int prc_len); - extern uint16 un_date_2_nw(time_t time, uint8 *d); extern time_t nw_2_un_time(uint8 *d, uint8 *t); extern uint16 un_time_2_nw(time_t time, uint8 *d); @@ -80,4 +230,4 @@ extern uint16 un_time_2_nw(time_t time, uint8 *d); extern void xun_date_2_nw(time_t time, uint8 *d); extern void xun_time_2_nw(time_t time, uint8 *d); - +#endif diff --git a/emutli.c b/emutli.c index 760c152..935c569 100644 --- a/emutli.c +++ b/emutli.c @@ -1,9 +1,9 @@ -/* emutli.c 22-Jan-96 */ +/* emutli.c 07-Feb-96 */ /* * One short try to emulate TLI with SOCKETS. */ -/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany +/* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany * * 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 @@ -237,30 +237,6 @@ void exit_dev(char *devname, int frame) del_interface(devname, frame); } -int get_ipx_addr(ipxAddr_t *addr) -{ - int sock = socket(AF_IPX, SOCK_DGRAM, AF_IPX); - int result=-1; - if (sock > -1) { - struct sockaddr_ipx ipxs; - int maxplen=sizeof(struct sockaddr_ipx); - result=0; - memset((char*)&ipxs, 0, sizeof(struct sockaddr_ipx)); - ipxs.sipx_family=AF_IPX; - if (bind(sock, (struct sockaddr*)&ipxs, sizeof(struct sockaddr_ipx))==-1){ - errorp(0, "EMUTLI:bind", NULL); - result = -1; - } else { - if (getsockname(sock, (struct sockaddr*)&ipxs, &maxplen) == -1){ - errorp(0, "EMUTLI:init_ipx:getsockname", NULL); - result = -1; - } else sock2ipxadr(addr, &ipxs); - } - close(sock); - } else errorp(0, "EMUTLI:bind", NULL); - return(result); -} - void ipx_route_add(uint32 dest_net, uint32 route_net, uint8 *route_node) @@ -351,7 +327,10 @@ int t_bind(int sock, struct t_bind *a_in, struct t_bind *a_out) && a_in->addr.len == sizeof(ipxAddr_t)) ipx2sockadr(&ipxs, (ipxAddr_t*) (a_in->addr.buf)); - ipxs.sipx_network = 0L; + ipxs.sipx_network = 0L; /* allways default net */ + + memset(ipxs.sipx_node, 0, IPX_NODE_SIZE); /* allways default node */ + /* Hi Volker :) */ if (bind(sock, (struct sockaddr*)&ipxs, sizeof(struct sockaddr_ipx))==-1) { errorp(0, "TLI-BIND", "socket Nr:0x%x", (int)GET_BE16(&(ipxs.sipx_port))); @@ -388,7 +367,7 @@ int t_close(int fd) int poll( struct pollfd *fds, unsigned long nfds, int timeout) -/* z.Z. nur POLL-IN */ +/* only POLL-IN */ { fd_set readfs; /* diff --git a/emutli.h b/emutli.h index 5210372..3a69659 100644 --- a/emutli.h +++ b/emutli.h @@ -1,4 +1,4 @@ -/* emutli.h 11-Sep-95 */ +/* emutli.h 30-Jan-96 */ /* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany * @@ -101,7 +101,9 @@ extern void exit_ipx(int full); extern int init_dev(char *devname, int frame, uint32 network); extern void exit_dev(char *devname, int frame); +#if 0 extern int get_ipx_addr(ipxAddr_t *addr); +#endif extern void ipx_route_add(uint32 dest_net, uint32 route_net, diff --git a/examples/README.dosemu b/examples/README.dosemu new file mode 100644 index 0000000..c89e02b --- /dev/null +++ b/examples/README.dosemu @@ -0,0 +1,7 @@ +If dosemu don't work together with mars_nwe you should apply +the dirty dosemu-patch to the dosemu program. +In 1.3.6? the changing of an existing route over the internal net +is not ignored, but handled as an error (EINVAL, Alan's idea :-( ) . +Therefor actual dosemus can fail when then want to access a external +server. + diff --git a/examples/README.patch b/examples/README.patch index 5db3794..30e7fa9 100644 --- a/examples/README.patch +++ b/examples/README.patch @@ -1,4 +1,6 @@ -this kernelpatch for kernels 1.3.56,57,58, ?? makes 3 things. +!! this kernelpatch is not needed for kernel >= 1.3.60 :) !! + +this kernelpatch for clean kernels 1.3.56,57,58, pur 59 makes 3 things. - removes the ipx-send bug. BIG THANKS to Volker Lendecke. the problem was that sometimes the sendto function hung. diff --git a/examples/config.h b/examples/config.h index e298b8a..d12be24 100644 --- a/examples/config.h +++ b/examples/config.h @@ -1,16 +1,32 @@ -/* config.h: 22-Jan-96 */ +/* config.h: 08-Feb-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 */ #define PATHNAME_BINDERY "/etc" /* path location of bindery */ -#define MAX_CONNECTIONS 5 /* max. Number of Connections */ - /* must be < 256 !!! */ +#define NETWORK_SERIAL_NMBR 0x44444444L /* Serial Number 4 Byte */ +#define NETWORK_APPL_NMBR 0x2222 /* Applikation Number 2 Byte */ -#define MAX_NW_VOLS 10 /* max. Volumes */ +#define MAX_CONNECTIONS 5 /* max. Number of Connections */ + /* must be < 256 !!! */ +#define MAX_NW_VOLS 10 /* max. Volumes */ +#define IPX_DATA_GR_546 1 /* allow ipx packets > 546+30 Byte */ + +#define WITH_NAME_SPACE_CALLS 0 /* Namespace Calls are only badly */ + /* supported till now. */ + /* to enable testing of them this */ + /* entry must be changed to '1' and */ + /* entry '6' in ini file must be set */ + /* to '1', too. */ + +#define MAX_NW_SERVERS 40 /* max. count of servers */ + +/* <--------------- next is for linux only -------------------> */ +#define INTERNAL_RIP_SAP 1 /* use internal/own rip/sap process */ +#define MAX_NET_DEVICES 5 /* max. Netdevices, frames */ +#define MAX_NW_ROUTES 50 /* max. networks (internal + external) */ + +/* this is for very special use of mars_nwe to only act as a router */ +#define FILE_SERVER_INACTIV 0 /* 1 = ncpserv will not be startet */ -#define MAX_NET_DEVICES 5 /* max. Netdevices, frames */ -#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/dosemu-patch b/examples/dosemu-patch new file mode 100644 index 0000000..5b3db01 --- /dev/null +++ b/examples/dosemu-patch @@ -0,0 +1,11 @@ +--- net/ipxglt.c Thu Feb 8 10:02:54 1996 ++++ net/ipxglt.c Thu Feb 8 10:13:21 1996 +@@ -59,7 +59,7 @@ + } + + if(ioctl(sock,SIOCADDRT,(void *)&rt) < 0) { +- if( errno != EEXIST ) { ++ if( errno != EEXIST && errno != EINVAL ) { + close( sock ); + return( -2 ); + } diff --git a/examples/mk.li b/examples/mk.li index a583d9a..78a075c 100755 --- a/examples/mk.li +++ b/examples/mk.li @@ -1,6 +1,6 @@ #!/bin/sh -# mk.li 16-Nov-95 ### -# +# mk.li 30-Jan-96 ### +# please edit this file ! mk() { @@ -14,12 +14,46 @@ mk() chmod 666 $ERRFILE } -export CC=cc -export CCP="cc -E" -#export CFLAGS="-pipe -O2 -fomit-frame-pointer" -#problems gcc2.5.8 ^^^^^^^^^^^^^^^^^^^^^^^^ -export CFLAGS="-pipe" -export HOSTCFLAGS="-DLINUX" -export TMP=/tmp -MAKE=make +TOLOWER='tr "[A-Z]" "[a-z]"' +UNX=`uname -s | $TOLOWER` + +case $UNX in + linux) + CC=cc; + CCP="cc -E"; +# CFLAGS="-pipe -O2 -fomit-frame-pointer" +# problems gcc2.5.8 ^^^^^^^^^^^^^^^^^^^^^ + CFLAGS="-pipe" + HOSTCFLAGS="-DLINUX" + NDBMLIB="-ldbm" + NSLLIB="" + MAKE=make + TMP=/tmp + INSTALL=install + ;; +########### USL UNIX ############## + unix_sv) + CC=cc + CCP="gcc -E" + CFLAGS="-pipe" + HOSTCFLAGS="" + NDBMLIB="/usr/ucblib/libucb.a" + NSLLIB="-lnsl" + MAKE=gmake + TMP=/tmp + INSTALL=/usr/ucb/install + ;; + *) echo "mk.li: Unknown or not supported OS, probably you must set \$UNX" + ;; +esac + +export CC +export CCP +export CFLAGS +export HOSTCFLAGS +export NDBMLIB +export NSLLIB +export TMP +export INSTALL + mk $@ diff --git a/examples/nw.ini b/examples/nw.ini index a651669..d67d6eb 100644 --- a/examples/nw.ini +++ b/examples/nw.ini @@ -1,19 +1,19 @@ # (C)opyright 1993, 1995, Martin Stover, Softwareentwicklung, Marburg -# last change: 22-Jan-96 +# last change: 08-Feb-96 # MAR.S NW-Server Emulator # Einfache Konfiguration, alles ab # ist Kommentar. # Jeder Eintrag beginnt mit einer Zahl und dann folgt der Inhalt. # simple configuration, all after # is ignored. # every entry begins with a number and then the meet follows. -# entry 1 VOLUMES (max. 5) entry 1 -# Volumename Volumepath Options (k=lowercase,p=pipe) +# entry 1 VOLUMES (max. volumes depend on your config.h) +# Volumename Volumepath Options (k=lowercase,p=pipe,m=removable) 1 SYS /u3/SYS/ # SYS 1 #################################### # Die folgenden Volumes sind optional. # the following volumes are optional. #1 SYS1 /u3/SYS1/ # SYS 2 upshift #1 TMP /tmp/ k # TMP downshift -#1 CD /cdrom k # CDROM downshift +#1 CD /cdrom km # CDROM downshift/removable #1 PIPES /u3/pipes kp # pipecommands # Falls lowercase nicht gesetzt ist, werden GROSSBUCHSTABEN erwartet. # If lowercase is not set then all filenames are upshift. @@ -30,10 +30,11 @@ #2 MAR1 # Servername ###################################### # next entry for configure mars_nwe to use the internal net -# If you have mars_nwe V > 0.96pl5 and the small ipx-kpatch -# from the examples dir you can use Internal Net and Routing. +# If you have mars_nwe V > 0.96pl5 and a kernel >= 1.3.60 +# or the small ipx-kpatch from the examples dir you can use +# internal net and routing. # INTERNAL NET [NODE] -###3 0x999999 1 # Node default 1 +#3 0x999999 1 # Node default 1 ###################################### # entry 4: # for DEVICE(S) # if your ipx is allready up, then entry 4 must be removed. @@ -48,6 +49,9 @@ # some clients are running better, if the server tells # that it is a 3.11 Server, although many calls # (namespace services) of a real 3.11 Server are missing yet. +# simple namespace services are implemented for testing +# since V 0.96pl8. To test them, this entry must be set to '1'. +# and config.h must be altered to allow namespace calls. 6 0 # tells server version: 2.15=0, 3.11=1 ###################################### # GID and UID for _minimal_ rights @@ -89,7 +93,7 @@ 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 ) +300 0 # > 0 print routing info to file every x broadcasts. ( minutes ) 301 /tmp/nw.routes # filename. 302 1 # creat new filename=1, append to file=0 ############################# diff --git a/makefile.unx b/makefile.unx index 3ad14e6..19fec7c 100644 --- a/makefile.unx +++ b/makefile.unx @@ -1,4 +1,6 @@ -# makefile.unx 15-Jan-96 +#if 0 +#makefile.unx 07-Feb-96 +#endif VPATH=.. O=.o C=.c @@ -6,7 +8,7 @@ C=.c DEBUG=-DDB V_H=0 V_L=96 -P_L=7 +P_L=8 #define D_P_L 1 DISTRIB=mars_nwe #if D_P_L @@ -53,24 +55,12 @@ $(DESTMAKEFILE): makefile.unx config.h #endif -PROG1=netinit +PROG1= PROG2=nwserv PROG3=nwconn PROG4=ncpserv PROG5=nwclient -#ifdef LINUX -EMUTLIOBJ=emutli$(O) -PROG1= -NDBMLIB=-ldbm -NSLLIB= -#else -NDBMLIB=/usr/ucblib/libucb.a -NSLLIB=-lnsl -#endif - -PROGS=$(PROG1) $(PROG2) $(PROG3) $(PROG4) $(PROG5) - #include "config.h" #ifdef FILENAME_NW_INI M_FILENAME_NW_INI=FILENAME_NW_INI @@ -84,25 +74,43 @@ M_PATHNAME_PROGS=PATHNAME_PROGS M_PATHNAME_PROGS="." #endif +#ifndef INTERNAL_RIP_SAP +#define INTERNAL_RIP_SAP 1 +#endif + +#ifdef LINUX +EMUTLIOBJ=emutli$(O) +# if INTERNAL_RIP_SAP +NWROUTE_O=nwroute$(O) +# else +NWROUTE_O=nwroute1$(O) +# endif +#else +NWROUTE_O=nwroute1$(O) +#endif + +PROGS=$(PROG1) $(PROG2) $(PROG3) $(PROG4) $(PROG5) + OBJ1= $(EMUTLIOBJ) net1$(O) tools$(O) -OBJ2= $(OBJ1) nwroute$(O) -OBJ3= $(OBJ1) connect$(O) namspace$(O) nwvolume$(O) +OBJ2= $(OBJ1) $(NWROUTE_O) +OBJ3= $(OBJ1) connect$(O) namspace$(O) nwvolume$(O) nwfile$(O) OBJ4= $(OBJ1) nwdbm$(O) nwcrypt$(O) OBJ5= $(OBJ1) -OBJS= net1$(O) tools$(O) connect$(O) nwdbm$(O) nwroute$(O) \ +OBJS= net1$(O) tools$(O) connect$(O) nwdbm$(O) $(NWROUTE_O) \ namspace$(O) nwvolume$(O) \ $(PROG2)$(O) $(PROG3)$(O) $(PROG4)$(O) $(PROG5)$(O) -HOBJ3= $(PROG3)$(O) connect$(O) namspace$(O) +HOBJ3= $(PROG3)$(O) connect$(O) namspace$(O) nwvolume$(O) nwfile$(O) $(PROG1): $(PROG1)$(O) $(OBJ1) $(CC) -o ../$(PROG1) $(PROG1)$(O) $(OBJ1) $(NSLLIB) $(PROG2): $(PROG2)$(O) $(OBJ2) $(CC) -o ../$(PROG2) $(PROG2)$(O) $(OBJ2) $(NSLLIB) - +#if 0 #$(CC) -o ../$(PROG2) $(PROG2)$(O) $(OBJ2) $(NDBMLIB) $(NSLLIB) +#endif $(PROG3): $(PROG3)$(O) $(OBJ3) $(CC) -o ../$(PROG3) $(PROG3)$(O) $(OBJ3) $(NSLLIB) @@ -113,7 +121,7 @@ $(PROG4): $(PROG4)$(O) $(OBJ4) $(PROG5): $(PROG5)$(O) $(OBJ5) $(CC) -o ../$(PROG5) $(PROG5)$(O) $(OBJ5) $(NSLLIB) -$(HOBJ3): namspace.h connect.h nwvolume.h +$(HOBJ3): namspace.h connect.h nwvolume.h nwfile.h $(OBJS): net.h config.h $(C)$(O): @@ -123,11 +131,11 @@ $(C)$(O): n_all: $(PROGS) n_install_ini: - cd .. && install -m 664 nw.ini $(M_FILENAME_NW_INI) && cd obj + cd .. && $(INSTALL) -m 664 nw.ini $(M_FILENAME_NW_INI) && cd obj n_install: - cd .. && install -d $(M_PATHNAME_PROGS) && cd obj - cd .. && install $(PROGS) $(M_PATHNAME_PROGS) && cd obj + cd .. && $(INSTALL) -d $(M_PATHNAME_PROGS) && cd obj + cd .. && $(INSTALL) $(PROGS) $(M_PATHNAME_PROGS) && cd obj @cd .. && (if [ -r $(M_FILENAME_NW_INI) ] ; then \ echo ""; \ echo "********************************************************"; \ @@ -138,7 +146,7 @@ echo ""; \ echo "********************************************************"; \ echo ""; \ else \ -install -m 664 nw.ini $(M_FILENAME_NW_INI); \ +$(INSTALL) -m 664 nw.ini $(M_FILENAME_NW_INI); \ echo ""; \ echo "********************************************************"; \ echo ""; \ @@ -175,8 +183,6 @@ n_make_dir: n_clean1 $(DISTRIB).lsm \ $(DISTRIB)/. \ ; rm -f $(DISTRIB)/config.h \ -; rm -f $(DISTRIB)/namspace.? \ -; cp old/namspace.? $(DISTRIB)/. \ ; ln -f \ examples/$(STERN) \ $(DISTRIB)/examples/. \ diff --git a/mars_nwe.lsm b/mars_nwe.lsm index e3b8a23..1ae6f7c 100644 --- a/mars_nwe.lsm +++ b/mars_nwe.lsm @@ -1,16 +1,16 @@ Begin3 Title: mars_nwe -Version: 0.96pl7 -Entered-date: 22-Jan-96 +Version: 0.96pl8 +Entered-date: 08-Feb-96 Description: full novell-server-emulator (src),beta - file-services, bindery-services, printing-services - needs no kernelchanges, usefull for testing ipx + supports file-services, bindery-services, + printing-services, routing-services Keywords: novell, netware, server, ipx, ncp, tli Author: mstover@freeway.de (Martin Stover) Maintained-by: mstover@freeway.de (Martin Stover) Primary-site: linux01.gwdg.de /pub/ncpfs 120kB mars_nwe-0.96.pl7.tgz Alternate-site: ftp.uni-duisburg.de /pub/linux/ipxware -Platforms: Linux (1.2.xx, 1.3.32, 1.3.55 tested, others should work) +Platforms: Linux (1.2.xx, 1.3.32, > 1.3.55 tested, others should work) Copying-policy: GNU End diff --git a/namspace.c b/namspace.c index 2855b50..aadd44e 100644 --- a/namspace.c +++ b/namspace.c @@ -1,6 +1,10 @@ -/* namspace.c 08-Jan-96 : NameSpace Services, mars_nwe */ +/* namspace.c 07-Feb-96 : NameSpace Services, mars_nwe */ -/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany +/* !!!!!!!!!!!! NOTE !!!!!!!!!! */ +/* Its very dirty till now. */ +/* namespace calls should be only activated for testings */ + +/* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany * * 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 @@ -20,8 +24,896 @@ #include "net.h" #include #include +#ifndef LINUX +#include +#endif + +#include "nwvolume.h" #include "connect.h" +#include "nwfile.h" #include "namspace.h" #if WITH_NAME_SPACE_CALLS + +#define NW_PATH /* */ + + +typedef struct { + int volume; /* Volume Number */ + int has_wild; /* fn has wildcards */ + struct stat statb; + uint8 *fn; /* points to last entry of path */ + uint8 path[512]; /* path + fn */ +} N_NW_PATH; + +typedef struct { + DIR *fdir; /* for dir searches */ + uint8 *kpath; /* points one after unixname */ + uint8 *unixname; /* is allocates fullname of path */ + /* + 257 Byte for filename. */ +} DIR_SEARCH_STRUCT; + +typedef struct { + uint32 basehandle; + int namespace; /* namespace of this entry */ + DIR_SEARCH_STRUCT *dir; /* for dir searches */ + N_NW_PATH nwpath; +} DIR_BASE_ENTRY; + +#define MAX_DIR_BASE_ENTRIES 300 + +static DIR_BASE_ENTRY *dir_base[MAX_DIR_BASE_ENTRIES]; +static int anz_dbe = 0; + +static void init_nwpath(N_NW_PATH *nwpath) +{ + nwpath->volume = -1; + nwpath->has_wild = 0; + nwpath->fn = nwpath->path; + *(nwpath->path) = '\0'; +} + +static char *xnwpath_2_unix(N_NW_PATH *nwpath, int modus, + int allocate_extra) +/* + * returns complete UNIX path + * modus & 1 : ignore fn, (only path) + * modus & 2 : no '/' at end + * + * if allocate_extra > 0, then not the static buffer will be returned + * but a fresh allocated buffer, which must be deallocated later. + */ +{ + static char unixname[512]; /* should be big enouugh */ + int len; + int volume = nwpath->volume; + char *p, *pp; + if (volume < 0 || volume >= used_nw_volumes) { + fprintf(stderr, "nwpath_2_unix volume=%d not ok\n", volume); + strcpy(unixname, "Z/Z/Z/Z"); /* */ + len = strlen(unixname); + } else { + int m = ((modus & 1) && nwpath->fn > nwpath->path) /* last path = fn */ + ? nwpath->fn - nwpath->path + : strlen((char*)nwpath->path); + len = nw_volumes[volume].unixnamlen; + if (m+len >= sizeof(unixname)) { + fprintf(stderr, "nwpath_2_unix buffer to small, needs %d Byte", + m+len+1); + strcpy(unixname, "Z/Z/Z/Z"); /* */ + len = strlen(unixname); + } else { + memcpy(unixname, nw_volumes[volume].unixname, len); /* first UNIXNAME VOLUME */ + p = pp = unixname+len; + memcpy(p, nwpath->path, m); /* path or partiell path */ + len += m; + p += m; + if ((modus & 2) && *(p-1) == '/' ) *(--p) = '\0'; + else *p = '\0'; + if (nw_volumes[volume].options & 1) downstr((uint8*)pp); + } + } + if (allocate_extra) { + char *ret=xmalloc(len+allocate_extra+2); + strcpy(ret, unixname); + return(ret); + } + return(unixname); +} + +#define nwpath_2_unix(nwpath, modus) xnwpath_2_unix((nwpath), (modus), 0) + +static void free_dbe_dir(DIR_BASE_ENTRY *dbe) +{ + DIR_SEARCH_STRUCT *d = dbe->dir; + if (NULL != d) { + if (d->fdir) closedir(d->fdir); + xfree(d->unixname); + xfree(dbe->dir); + } +} + +static int allocate_dbe_dir(DIR_BASE_ENTRY *dbe) +{ + DIR_SEARCH_STRUCT *d; + if (dbe->dir) free_dbe_dir(dbe); + dbe->dir = d = (DIR_SEARCH_STRUCT*) xcmalloc(sizeof(DIR_SEARCH_STRUCT)); + d->unixname = (uint8*)xnwpath_2_unix(&(dbe->nwpath), 2, 258); + if (NULL == (d->fdir = opendir(d->unixname))) { + free_dbe_dir(dbe); + return(-0xff); + } else { + d->kpath = d->unixname+strlen(d->unixname); + *(d->kpath) = '/'; + *(++d->kpath) = '\0'; + return(0); + } +} + +static void free_dbe_ptr(DIR_BASE_ENTRY *dbe) +{ + if (dbe != (DIR_BASE_ENTRY*)NULL) { + free_dbe_dir(dbe); + xfree(dbe); + } +} + +static int base_open_seek_dir(DIR_BASE_ENTRY *dbe, uint32 offset) +{ + int result = ((dbe->nwpath.statb.st_mode & S_IFMT) != S_IFDIR) ? -0xff : 0; + if (!result) { + if (NULL == dbe->dir) result=allocate_dbe_dir(dbe); + if (result>-1) seekdir(dbe->dir->fdir, offset); + } + if (result < 0 && NULL != dbe->dir) free_dbe_dir(dbe); + XDPRINTF((3, 0, "base_open_seek_dir offset=%d, result=%d", offset, result)); + return(result); +} + + +static int allocate_dbe(int namespace) +/* returns new allocated dir_base_entry */ +{ + int j=-1; + DIR_BASE_ENTRY **pdbe=(DIR_BASE_ENTRY**) NULL; + if (namespace) return(-0xff); /* TODO: more namespaces */ + while (++j < anz_dbe && NULL != *(pdbe = &(dir_base[j])) ) ;; + if (j == anz_dbe) { + if (anz_dbe == MAX_DIR_BASE_ENTRIES) { /* return(-0xff); */ + pdbe = &(dir_base[--j]); + free_dbe_ptr(*pdbe); + } else pdbe = &(dir_base[anz_dbe++]); + } + *pdbe = (DIR_BASE_ENTRY*)xcmalloc(sizeof(DIR_BASE_ENTRY)); + (*pdbe)->namespace = namespace; + init_nwpath(&((*pdbe)->nwpath)); + return(j); +} + +static void free_dbe(int dbase) +{ + if (dbase > -1 && dbase < anz_dbe) { + free_dbe_ptr(dir_base[dbase]); + dir_base[dbase] = (DIR_BASE_ENTRY*)NULL; + if (dbase+1 == anz_dbe) { + while (anz_dbe && ((DIR_BASE_ENTRY*)NULL == dir_base[anz_dbe-1]) ) + --anz_dbe; + } + } +} + +int touch_handle_entry(int dbase) +/* routine touchs this entry and returns the new offset */ +{ + XDPRINTF((4, 0, "touch_handle_entry entry dbase=%d", dbase)); + if (dbase > 2) { + DIR_BASE_ENTRY *dbe=dir_base[dbase]; + while (dbase--) dir_base[dbase+1] = dir_base[dbase]; + dbase=0; + dir_base[0] = dbe; + } + XDPRINTF((4, 0, "touch_handle_entry return dbase=%d", dbase)); + return(dbase); +} + +char *debug_nwpath_name(N_NW_PATH *p) +/* for debugging */ +{ +#ifdef DB + static char nwpathname[512]; + char volname[300]; + if (nw_get_volume_name(p->volume, volname) < 0) + sprintf(volname, "<%d=NOT-OK>", (int)p->volume); + sprintf(nwpathname, "`%s:%s`,fn=`%s`", volname, p->path, p->fn); +#else + static char nwpathname[2]; + nwpathname[0]='\0'; + nwpathname[1]='\0'; +#endif + return(nwpathname); +} + + +static int add_hpath_to_nwpath(N_NW_PATH *nwpath, + NW_HPATH *nwp, uint8 *pp_pathes) +/* Routine adds nwp to nwpath */ +/* nwpath must be setup correctly before entry */ +/* return > -1 if ok */ +{ + int result = 0; + int k = -1; + uint8 *pp = nwpath->path+strlen(nwpath->path); + while (!result && ++k < nwp->components) { + int len = (int) *(pp_pathes++); + uint8 *p = pp_pathes; + pp_pathes+=len; + + if (!k && nwpath->volume == -1) { /* first component is volume */ + if ((nwpath->volume=nw_get_volume_number(p, len)) < 0) { + result = nwpath->volume; + goto leave_build_nwpath; + } + } else { /* here is path (+ fn ) */ + int i=len; + if (pp > nwpath->path) { /* not the first entry */ + *pp='/'; + *++pp='\0'; + } + while (i--) { + if (*p == 0xae) *pp++ = '.'; + else if (*p > 0x60 && *p < 0x7b) { + *pp++ = *p - 0x20; /* all is upshift */ + } else if (*p == 0xaa || *p == '*' ) { + *pp++ = '*'; + nwpath->has_wild++; + } else if (*p == 0xbf || *p == '?' ) { + *pp++ = '?'; + nwpath->has_wild++; + } else if (*p == '/' || *p == '\\') { + *pp++ = '/'; + } else if (*p == ':') { /* extract volume */ + int vlen = (int) (pp - nwpath->path); + if ((nwpath->volume=nw_get_volume_number(nwpath->path, vlen)) < 0) { + result = nwpath->volume; + goto leave_build_nwpath; + } + pp=nwpath->path; + *pp='\0'; + } else *pp++ = *p; + p++; + } /* while */ + *pp = '\0'; + } /* else */ + } /* while */ + if (nwpath->volume < 0) result=-0x9c; +leave_build_nwpath: + XDPRINTF((2, 0, "add_hpath_to_nwpath: result=0x%x, nwpath=%s", + result, debug_nwpath_name(nwpath))); + return(result); +} + +static uint32 build_base_handle(N_NW_PATH *nwpath, int namespace) +/* returns basehandle of path, or 0 if not exist !! */ +{ + uint32 basehandle=0L; + if (!stat(nwpath_2_unix(nwpath, 2), &(nwpath->statb))) { + DEV_NAMESPACE_MAP dnm; + dnm.dev = nwpath->statb.st_dev; + dnm.namespace = namespace; + basehandle=nw_vol_inode_to_handle(nwpath->volume, + nwpath->statb.st_ino, + &dnm); + } else { + XDPRINTF((4,0, "build_base_handle failed:`%s`", + debug_nwpath_name(nwpath))); + } + return(basehandle); +} + +static int find_base_entry(int volume, uint32 basehandle) +{ + int k=-1; + while (++k < anz_dbe) { + DIR_BASE_ENTRY *e=dir_base[k]; + if ( (DIR_BASE_ENTRY*)NULL != e + && basehandle == e->basehandle + && volume == e->nwpath.volume) return(k); + } + return(-0x9b); +} + +static int insert_get_base_entry(N_NW_PATH *nwpath, int dbase, + int namespace, int creatmode) +{ + uint32 basehandle = build_base_handle(nwpath, namespace); + if (!basehandle && creatmode) { + int result = 0; + char *unname = nwpath_2_unix(nwpath, 2); + if (creatmode & FILE_ATTR_DIR) { + /* creat dir */ + if (mkdir(unname, 0777)) result=-0x84; + } else { + /* creat file */ + if ((result = creat(unname, 0777)) > -1) { + close(result); + result = 0; + } else result=-0x84; + } + if (result) return(result); + basehandle = build_base_handle(nwpath, namespace); + } + if (basehandle) { + DIR_BASE_ENTRY *dbe=dir_base[dbase]; + int k=-1; + while (++k < anz_dbe) { + DIR_BASE_ENTRY *e=dir_base[k]; + if ( (DIR_BASE_ENTRY*)NULL != e + && basehandle == e->basehandle + && nwpath->volume == e->nwpath.volume) { + free_dbe(dbase); + return(touch_handle_entry(k)); + } + } /* while */ + /* now i know that it's a new base entry */ + dbe->basehandle = basehandle; + return(touch_handle_entry(dbase)); + } + return(-0x9c); +} + +static int build_dos_base(NW_HPATH *nwp, uint8 *pathes, + int dbase, int mode, uint8 *rets) +/* routine returns the actual dbe entry offset or */ +/* < 0 if error */ +/* if mode == 1, then last_path will be ignored and will be put */ +/* into the rets variable */ +{ + DIR_BASE_ENTRY *dbe=dir_base[dbase]; + N_NW_PATH *nwpath=&(dbe->nwpath); + int result=0; + if (!nwp->flag) { /* short handle */ + int dir_handle = nwp->base[0]; + if (dir_handle > 0 && --dir_handle < (int)used_dirs + && dirs[dir_handle].inode) { + nwpath->volume = dirs[dir_handle].volume; + strcpy(nwpath->path, dirs[dir_handle].path); + result = (nwpath->volume > -1) ? 0 : -0x98; + } else result = -0x9b; + } else if (nwp->flag == 1) { /* basehandle */ + uint32 basehandle = GET_32(nwp->base); + int k=-1; + result = -0x9b; + while (++k < anz_dbe) { + if (k != dbase) { + DIR_BASE_ENTRY *e=dir_base[k]; + if ( (DIR_BASE_ENTRY*)NULL != e + && e->nwpath.volume == nwp->volume + && e->basehandle == basehandle) { + nwpath->volume = e->nwpath.volume; + strcpy(nwpath->path, e->nwpath.path); + result = (nwpath->volume > -1) ? 0 : -0x98; + break; + } + } + } + } else if (nwp->flag != 0xff) result=-0xff; + if (!result) { + if ((result = add_hpath_to_nwpath(nwpath, nwp, pathes)) > -1) { + char *pp=strrchr((char*)nwpath->path, '/'); + if (mode) { + if (pp) { + if (rets) strcpy(rets, pp+1); + *(pp)=0; + pp=strrchr((char*)nwpath->path, '/'); + } else { + if (rets) strcpy(rets, nwpath->path); + *(nwpath->path) = '\0'; + } + } + if (pp) nwpath->fn=(uint8*)pp+1; + result = insert_get_base_entry(nwpath, dbase, NAME_DOS, 0); + } + } + return(result); +} + +int nw_generate_dir_path(int namespace, + NW_HPATH *nwp, + uint8 *ns_dir_base, + uint8 *dos_dir_base) + +/* returns Volume Number >=0 or errcode < 0 if error */ +{ + int dbase = allocate_dbe(namespace); + int result = -0xfb; + if (dbase > -1) { + if ((result = build_dos_base(nwp, nwp->pathes, dbase, 0, NULL)) > -1) { + DIR_BASE_ENTRY *dbe=dir_base[result]; + U32_TO_32(dbe->basehandle, ns_dir_base); /* LOW - HIGH */ + U32_TO_32(dbe->basehandle, dos_dir_base); + XDPRINTF((3, 0, "nw_generate_dir_path path=%s, result=%d, basehandle=0x%x", + debug_nwpath_name(&(dbe->nwpath)), result, dbe->basehandle)); + result= dbe->nwpath.volume; + } else free_dbe(dbase); + } + if (result < 0) { + XDPRINTF((3, 0, "nw_generate_dir_path NOT OK dbase=%d, result=%d", + dbase, result)); + } + return(result); +} + +static int build_dir_info(DIR_BASE_ENTRY *dbe, uint32 infomask, uint8 *p) +{ + N_NW_PATH *nwpath=&(dbe->nwpath); + struct stat *stb=&(nwpath->statb); + int result = 76; + memset(p, 0, result); + if (infomask & INFO_MSK_DATA_STREAM_SPACE) { + U32_TO_32(stb->st_size, p); + } + p += 4; + if (infomask & INFO_MSK_ATTRIBUTE_INFO) { + uint32 mask=0L; + if (S_ISDIR(stb->st_mode)) mask |= FILE_ATTR_DIR; + U32_TO_32(mask, p); + p += 4; + U16_TO_16((uint16)(mask & 0xFFFF), p); + p +=2; + } else p+=6; + if (infomask & INFO_MSK_DATA_STREAM_SIZE) { + U32_TO_32(stb->st_size, p); + } + p +=4; + if (infomask & INFO_MSK_TOTAL_DATA_STREAM_SIZE) { + U32_TO_32(stb->st_size, p); + p +=4; + U16_TO_16(0, p); + p +=2; + } else p+=6; + if (infomask & INFO_MSK_CREAT_INFO) { + xun_time_2_nw(stb->st_mtime, p); + p +=2; + xun_date_2_nw(stb->st_mtime, p); + p +=2; + U32_TO_32(1, p); + p +=4; + } else p+=8; + if (infomask & INFO_MSK_MODIFY_INFO) { + xun_time_2_nw(stb->st_mtime, p); + p +=2; + xun_date_2_nw(stb->st_mtime, p); + p +=2; + U32_TO_32(1, p); + p +=4; + xun_date_2_nw(stb->st_atime, p); /* access date */ + p +=2; + } else p+=10; + if (infomask & INFO_MSK_ARCHIVE_INFO) { + xun_time_2_nw(0, p); + p +=2; + xun_date_2_nw(0, p); + p +=2; + U32_TO_32(0, p); + p +=4; + } else p+=8; + if (infomask & INFO_MSK_RIGHTS_INFO) { + U16_TO_16(0, p); + } + p +=2; + if (infomask & INFO_MSK_DIR_ENTRY_INFO) { + U32_TO_32(dbe->basehandle, p); + p +=4; + U32_TO_32(dbe->basehandle, p); + p +=4; + U32_TO_32(nwpath->volume, p); + p +=4; + } else p+=12; + if (infomask & INFO_MSK_EXT_ATTRIBUTES) { + U32_TO_32(0, p); /* Ext Attr Data Size */ + p +=4; + U32_TO_32(0, p); /* Ext Attr Count */ + p +=4; + U32_TO_32(0, p); /* Ext Attr Key Size */ + p +=4; + } else p+=12; + if (infomask & INFO_MSK_NAME_SPACE_INFO){ + U32_TO_32(0, p); /* Creator of the name space number */ + } + p +=4; + /* ---------------------------------------------- */ + if (infomask & INFO_MSK_ENTRY_NAME) { + *p = (uint8) strlen(nwpath->fn); + result++; + if (*p) { + memcpy(p+1, nwpath->fn, (int) *p); + result += (int) *p; + } + } + XDPRINTF((3, 0, "build_dir_info:path=%s, result=%d, basehandle=0x%x", + debug_nwpath_name(nwpath), result, dbe->basehandle)); + return(result); +} +int nw_optain_file_dir_info(int namespace, NW_HPATH *nwp, + int destnamspace, + int searchattrib, uint32 infomask, + uint8 *responsedata) +/* returns sizeof info_mask + * the sizeof info_mask is NOT related by the infomask. + * But the _valid_ info is. + */ +{ + int dbase = allocate_dbe(namespace); + int result = -0xfb; + if (dbase > -1) { + if ((result = build_dos_base(nwp, nwp->pathes, dbase, 0, NULL)) > -1) { + result = build_dir_info(dir_base[result], infomask, responsedata); + } else free_dbe(dbase); + } + if (result < 0) { + XDPRINTF((3, 0, "nw_optain_file_dir_info NOT OK dbase=%d, result=0x%x", + dbase, result)); + } + return(result); +} + +static int nw_init_search(int namespace, + NW_HPATH *nwp, + uint8 *responsedata) +{ + int dbase = allocate_dbe(namespace); + int result = -0xfb; + if (dbase > -1) { + if ((result = build_dos_base(nwp, nwp->pathes, dbase, 0, NULL)) > -1) { + DIR_BASE_ENTRY *dbe=dir_base[result]; + result = base_open_seek_dir(dbe, 0L); + if (result > -1) { + *responsedata++ = dbe->nwpath.volume; + U32_TO_32(dbe->basehandle, responsedata); + responsedata+=4; + U32_TO_32(0L, responsedata); /* searchsequenz */ + result = 9; + } + XDPRINTF((3, 0, "nw_init_search path=%s, result=%d, basehandle=0x%x", + debug_nwpath_name(&(dbe->nwpath)), result, dbe->basehandle)); + } else free_dbe(dbase); + } + if (result < 0) { + XDPRINTF((3, 0, "nw_init_search NOT OK dbase=%d, result=%d", + dbase, result)); + } + return(result); +} + +int get_add_new_entry(DIR_BASE_ENTRY *qbe, uint8 *path, int creatmode) +{ + int dbase = allocate_dbe(qbe->namespace); + if (dbase > -1) { + DIR_BASE_ENTRY *dbe=dir_base[dbase]; + N_NW_PATH *nwpath=&(dbe->nwpath); + int result = -0x9c; + nwpath->volume=qbe->nwpath.volume; + strcpy(nwpath->path, qbe->nwpath.path); + nwpath->fn = nwpath->path+strlen(nwpath->path); + if (nwpath->fn > nwpath->path && *(nwpath->fn-1) != '/') { + *(nwpath->fn) = '/'; + *(++ nwpath->fn) = '\0'; + } + strcpy(nwpath->fn, path); + + result = insert_get_base_entry(nwpath, dbase, qbe->namespace, creatmode); + if (result < 0) free_dbe(dbase); + return(result); + } + return(dbase); +} + +int nw_search_file_dir(int namespace, int datastream, + uint32 searchattrib, uint32 infomask, + int volume, uint32 basehandle, uint32 sequence, + int len, uint8 *path, uint8 *responsedata) + +{ + int result = find_base_entry(volume, basehandle); + if (result > -1) { + DIR_BASE_ENTRY *dbe=dir_base[result]; + if ((result = base_open_seek_dir(dbe, sequence)) > -1) { + uint8 entry[256]; + struct dirent *dirbuff; + struct stat statb; + int dest_entry=-1; + DIR_SEARCH_STRUCT *ds=dbe->dir; + int vol_options = get_volume_options(volume, 0); + strmaxcpy(entry, path, min(255, len)); + if (vol_options & VOL_OPTION_DOWNSHIFT) downstr(entry); + XDPRINTF((5,0,"nw_search_file_dir searchpath=%s", entry)); + while ((dirbuff = readdir(ds->fdir)) != (struct dirent*)NULL){ + if (dirbuff->d_ino) { + uint8 *name=(uint8*)(dirbuff->d_name); + XDPRINTF((10,0,"nw_search_file_dir Name=%s", + name)); + if ( (name[0] != '.' && ( + (!strcmp(name, entry)) || + (entry[0] == '*' && entry[1] == '\0') + || fn_match(name, entry, vol_options)))) { + strcpy(ds->kpath, name); + XDPRINTF((5,0,"nw_search_file_dir Name found=%s unixname=%s", + name, ds->unixname)); + if (!stat(ds->unixname, &statb) + && ( !S_ISDIR(statb.st_mode) || + (searchattrib & FILE_ATTR_DIR) ) ) { + strcpy(entry, name); + if (vol_options & 1) upstr(entry); + if ((dest_entry = get_add_new_entry(dbe, entry, 0)) > -1) + break; + } + } + } /* if */ + } /* while */ + *(ds->kpath) = '\0'; + if (dest_entry > -1) { + DIR_BASE_ENTRY *dest_dbe=dir_base[dest_entry]; + sequence = (uint32) telldir(ds->fdir); + *responsedata = (uint8) volume; + responsedata++; + U32_TO_32(basehandle, responsedata); + responsedata+=4; + U32_TO_32(sequence, responsedata); + responsedata+=4; + *responsedata = (uint8) 0; /* reserved */ + responsedata++; + result = 10 + + build_dir_info(dest_dbe, + infomask|INFO_MSK_NAME_SPACE_INFO, + responsedata); + } else result=-0xfe; /* no files matching */ + } /* if result */ + } + return(result); +} + +static int nw_open_creat_file_or_dir(int namespace, + int opencreatmode, + int attrib, uint32 infomask, + uint32 creatattrib, + int access_rights, + NW_HPATH *nwp, uint8 *pathes, + uint8 *responsedata) +{ + int dbase = allocate_dbe(namespace); + int result = -0xfb; + if (dbase > -1) { + int exist=-1; + uint8 last_part[258]; + *last_part='\0'; + if ((result = build_dos_base(nwp, pathes, dbase, 0, NULL)) > -1) { + exist = result; + } else if (opencreatmode & OPC_MODE_CREAT) { + result = build_dos_base(nwp, pathes, dbase, 1, last_part); + if (result > -1) + result = get_add_new_entry(dir_base[result], last_part, + (creatattrib & FILE_ATTR_DIR) ? FILE_ATTR_DIR : 1); + } + if (result > -1) { + DIR_BASE_ENTRY *dbe=dir_base[result]; + uint32 fhandle=0L; + int actionresult=0; + if (exist < 0) actionresult |= OPC_ACTION_CREAT; + if (!(creatattrib & FILE_ATTR_DIR)) { + int creatmode=0; /* open */ + int attrib=0; + if (opencreatmode & (OPC_MODE_OPEN | OPC_MODE_CREAT) ) { + if (opencreatmode & OPC_MODE_CREAT) { +#if 0 + if (exist > -1 && !(opencreatmode & OPC_MODE_REPLACE)) + creatmode=2; + else +#endif + creatmode = 1; + } + if ((result = file_creat_open(dbe->nwpath.volume, + nwpath_2_unix(&dbe->nwpath, 2), &(dbe->nwpath.statb), + attrib, access_rights, creatmode)) > -1) { + + fhandle = (uint32) result; + actionresult |= OPC_ACTION_OPEN; /* FILE OPEN */ + if (exist > -1 && (opencreatmode & OPC_MODE_REPLACE)) + actionresult |= OPC_ACTION_REPLACE; /* FILE REPLACED */ + } + } else result=-0xff; + } else if (exist > -1) result=-0x84; + if (result > -1) { + U32_TO_BE32(fhandle, responsedata); + responsedata += 4; + *responsedata =(uint8) actionresult; + responsedata++ ; + result = 5 + build_dir_info(dbe,infomask, responsedata); + } + } + } + XDPRINTF((3, 0, "nw_open_creat mode=0x%x, creatattr=0x%x, access=0x%x, attr=0x%x, result=%d", + opencreatmode, creatattrib, access_rights, attrib, result)); + return(result); +} + +static int nw_delete_file_dir(int namespace, int searchattrib, + NW_HPATH *nwp) +{ + int dbase = allocate_dbe(namespace); + int result = -0xfb; + if (dbase > -1) { + if ((result = build_dos_base(nwp, nwp->pathes, dbase, 0, NULL)) > -1) { + DIR_BASE_ENTRY *dbe=dir_base[dbase=result]; + uint8 *unname=(uint8*)nwpath_2_unix(&(dbe->nwpath), 2); + + if (S_ISDIR(dbe->nwpath.statb.st_mode)) result = rmdir(unname); + else result = unlink(unname); + if (result < 0) { + switch (errno) { + case EEXIST: result=-0xa0; /* dir not empty */ + default: result=-0x8a; /* No privilegs */ + } + } else { + result = 0; + free_dbe(dbase) ; + } + } else free_dbe(dbase); + } + return(result); +} + +int handle_func_0x57(uint8 *p, uint8 *responsedata) +{ + int result = -0xfb; /* unknown request */ + int ufunc = (int) *p++; /* now p locates at 4 byte boundary */ + int namespace = (int) *p; /* for most calls */ + XDPRINTF((3, 0, "0x57 call ufunc=0x%x namespace=%d", ufunc, namespace)); + switch (ufunc) { + case 0x01 : /* open creat file or subdir */ + { + /* NW PATH STRUC */ + int opencreatmode = *(p+1); + int attrib = (int) GET_16(p+2); /* LOW-HI */ + uint32 infomask = GET_32(p+4); /* LOW-HI */ + uint32 creatattrib = GET_32(p+8); + int access_rights = (int) GET_16(p+12); /* LOW-HI */ + NW_HPATH nwpathstruct; + memcpy(&nwpathstruct, p+14, sizeof(nwpathstruct)); + result = nw_open_creat_file_or_dir(namespace, opencreatmode, + attrib, infomask, creatattrib, access_rights, + &nwpathstruct, p+21, responsedata); + } + break; + + + case 0x02 : /* Initialize Search */ + { + /* NW PATH STRUC */ + NW_HPATH *nwpathstruct = (NW_HPATH *) (p+2); + result = nw_init_search(namespace, nwpathstruct, responsedata); + } + break; + + case 0x03 : /* Search for File or DIR */ + { + /* NW PATH STRUC */ + int datastream = *(p+1); + int searchattrib = (int) GET_16(p+2); /* LOW-HI */ + uint32 infomask = GET_32(p+4); /* LOW-HI */ + int volume = *(p+8); + uint32 basehandle = GET_32(p+9); /* LOW-HI */ + uint32 sequence = GET_32(p+13); /* LOW-HI */ + int len = *(p+17); + uint8 *path = p+18; + result = nw_search_file_dir(namespace, datastream, + searchattrib, infomask, + volume, basehandle, sequence, + len, path, responsedata); + } + break; + + + case 0x06 : /* Obtain File or Subdir Info */ + { + int destnamspace = (int) p+1; + int searchattrib = (int) GET_16(p+2); /* LOW-HI */ + uint32 infomask = GET_32(p+4); /* LOW-HI */ + NW_HPATH *nwpathstruct = (NW_HPATH *) (p+8); + result = nw_optain_file_dir_info(namespace, nwpathstruct, + destnamspace, + searchattrib, infomask, + responsedata); + } + break; + + + case 0x07 : /* Modify File or Dir Info */ + { + + } + break; + + case 0x08 : /* Delete a File or Subdir */ + { + int searchattrib = (int) GET_16(p+2); /* LOW-HI */ + NW_HPATH *nwpathstruct = (NW_HPATH *) (p+4); + result = nw_delete_file_dir(namespace, searchattrib, nwpathstruct); + } + break; + + + + case 0x09 : /* Set short Dir Handle*/ + { + + } + break; + + case 0x0c : /* alloc short dir Handle */ + { + + } + break; + + + case 0x15 : /* Get Path String from short dir new */ + { + + } + break; + + case 0x16 : /* Generate Dir BASE and VolNumber */ + { + NW_HPATH *nwpathstruct = (NW_HPATH *) (p+4); + struct OUTPUT { + uint8 ns_dir_base[4]; /* BASEHANDLE */ + uint8 dos_dir_base[4]; /* BASEHANDLE */ + uint8 volume; /* Volumenumber*/ + } *xdata= (struct OUTPUT*)responsedata; + result = nw_generate_dir_path(namespace, + nwpathstruct, xdata->ns_dir_base, xdata->dos_dir_base); + if (result >-1 ) { + xdata->volume = result; + result = sizeof(struct OUTPUT); + } + } + break; + + case 0x18 : /* Get Name Spaces Loaded*/ + { + int volume=*(p+2); + struct OUTPUT { + uint8 anz_name_spaces; + uint8 name_space_list[1]; + } *xdata= (struct OUTPUT*)responsedata; + result=get_volume_options(volume, 0); + if (result >-1) { + xdata->anz_name_spaces = (uint8) 1; + xdata->name_space_list[0] = (uint8) NAME_DOS; + result=xdata->anz_name_spaces+1; + } + } + break; + + case 0x1a : /* Get Huge NS Info new*/ + { + + } + break; + case 0x1c : /* GetFullPathString new*/ + { + + } + break; + case 0x1d : /* GetEffDirRights new */ + { + + } + break; + + default : result = -0xfb; /* unknown request */ + } /* switch */ + return(result); +} + #endif diff --git a/namspace.h b/namspace.h index 37180a7..c462b50 100644 --- a/namspace.h +++ b/namspace.h @@ -1,6 +1,6 @@ -/* namspace.h 08-Jan-96 : NameSpace Services, mars_nwe */ +/* namspace.h 07-Feb-96 : NameSpace Services, mars_nwe */ -/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany +/* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany * * 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 @@ -17,4 +17,51 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#define WITH_NAME_SPACE_CALLS 0 +#if WITH_NAME_SPACE_CALLS + +#define NAME_DOS 0 +#define NAME_MAC 1 +#define NAME_NFS 2 +#define NAME_FTAM 3 +#define NAME_OS2 4 + +typedef struct { + uint8 volume; /* Volumenumber */ + uint8 base[4]; /* Base or short Handle, handle is base[0] !! */ + uint8 flag; /* 0=handle, 1=base, 0xff=not path nor handle */ + uint8 components; /* nmbrs of pathes, components */ + uint8 pathes[1]; /* form len+name */ +} NW_HPATH; + +#define INFO_MSK_ENTRY_NAME 0x00000001 +#define INFO_MSK_DATA_STREAM_SPACE 0x00000002 +#define INFO_MSK_ATTRIBUTE_INFO 0x00000004 +#define INFO_MSK_DATA_STREAM_SIZE 0x00000008 +#define INFO_MSK_TOTAL_DATA_STREAM_SIZE 0x00000010 +#define INFO_MSK_EXT_ATTRIBUTES 0x00000020 +#define INFO_MSK_ARCHIVE_INFO 0x00000040 +#define INFO_MSK_MODIFY_INFO 0x00000080 +#define INFO_MSK_CREAT_INFO 0x00000100 +#define INFO_MSK_NAME_SPACE_INFO 0x00000200 +#define INFO_MSK_DIR_ENTRY_INFO 0x00000400 +#define INFO_MSK_RIGHTS_INFO 0x00000800 + +/* Attributes */ +#define FILE_ATTR_NORMAL 0x00000000 +#define FILE_ATTR_DIR 0x00000010 +#define FILE_ATTR_SHARE 0x00000080 + +/* OPEN/CREAT Modes */ +#define OPC_MODE_OPEN 0x01 +#define OPC_MODE_REPLACE 0x02 +#define OPC_MODE_CREAT 0x08 + +/* OPEN/CREAT ACTION Results */ +#define OPC_ACTION_OPEN 0x01 +#define OPC_ACTION_CREAT 0x02 +#define OPC_ACTION_REPLACE 0x04 + + +extern int handle_func_0x57(uint8 *p, uint8 *responsedata); + +#endif diff --git a/ncpserv.c b/ncpserv.c index 8305b71..1d4bfff 100644 --- a/ncpserv.c +++ b/ncpserv.c @@ -1,6 +1,6 @@ /* ncpserv.c */ -#define REVISION_DATE "22-Jan-96" -/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany +#define REVISION_DATE "08-Feb-96" +/* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany * * 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 @@ -440,9 +440,9 @@ static int handle_fxx(CONNECTION *c, int gelen, int func) uint8 appl_number[2]; } *xdata = (struct XDATA*) responsedata; /* serial-number 4-Byte */ - U32_TO_BE32(0x44444444, xdata->serial_number); + U32_TO_BE32(NETWORK_SERIAL_NMBR, xdata->serial_number); /* applikation-number 2-Byte */ - U16_TO_BE16(0x2222, xdata->appl_number); + U16_TO_BE16(NETWORK_APPL_NMBR, xdata->appl_number); data_len = sizeof(struct XDATA); } break; @@ -484,6 +484,31 @@ static int handle_fxx(CONNECTION *c, int gelen, int func) } else completition = (uint8) -result; } break; + case 0x15 : { /* Get Object Connection List */ + uint8 *p = rdata; + int result; + NETOBJ obj; + obj.type = GET_BE16(p); + p+=2; + strmaxcpy((char*)obj.name, (char*)(p+1), (int) *(p)); + upstr(obj.name); + result = find_obj_id(&obj, 0); + if (!result){ + int k=-1; + int anz = 0; + p = responsedata+1; + while (++k < anz_connect && anz < 255) { + CONNECTION *cn= &connections[k]; + if (cn->fd > -1 && cn->object_id == obj.id) { + *p++=(uint8)k+1; + anz++; + } + } /* while */ + *responsedata = anz; + data_len = 1 + anz; + } else completition=(uint8)-result; + } + break; case 0x16 : { /* Get Connection Info, OLD */ struct XDATA { @@ -521,7 +546,12 @@ static int handle_fxx(CONNECTION *c, int gelen, int func) uint8 *p = c->crypt_key; uint8 *pp = responsedata; data_len = k; - while (k--) *pp++ = *p++ = (uint8) rand(); + while (k--) *pp++ = *p++ = +#if 0 + (uint8) rand(); +#else + (uint8) k; +#endif /* if all here are same (1 or 2) then the resulting key is */ /* 00000000 */ } @@ -623,6 +653,7 @@ static int handle_fxx(CONNECTION *c, int gelen, int func) NETOBJ obj; obj.type = GET_BE16(p); strmaxcpy((char*)obj.name, (char*)(p+3), (int) *(p+2)); + upstr(obj.name); result = find_obj_id(&obj, 0); if (!result){ U32_TO_BE32(obj.id, xdata->object_id); @@ -666,6 +697,7 @@ static int handle_fxx(CONNECTION *c, int gelen, int func) NETOBJ obj; obj.type = GET_BE16(p); strmaxcpy((char*)obj.name, (char*)(p+3),(int) *(p+2)); + upstr(obj.name); result = find_obj_id(&obj, last_obj_id); if (!result){ U32_TO_BE32(obj.id, xdata->object_id); @@ -969,7 +1001,8 @@ static int handle_fxx(CONNECTION *c, int gelen, int func) obj.name, result)); } break; -#if 0 + +#ifdef _CHANGE_PASSWD_TESTING_ case 0x4b : { /* keyed change pasword */ uint8 *p = rdata+sizeof(c->crypt_key); NETOBJ obj; @@ -981,12 +1014,11 @@ static int handle_fxx(CONNECTION *c, int gelen, int func) p += (*p+1); /* here is now password-type ?? 0x60,0x66 */ if (0 == (result = find_obj_id(&obj, 0))) - /* result=nw_test_passwd(obj.id, c->crypt_key, rdata); +#if 0 if (result > -1) - */ result=nw_set_enpasswd(obj.id, p+1); - +#endif if (result< 0) completition = (uint8) -result; XDPRINTF((1, 0, "Keyed Change PW from OBJECT='%s', result=0x%x", obj.name, result)); @@ -1003,7 +1035,7 @@ static int handle_fxx(CONNECTION *c, int gelen, int func) XDPRINTF((1, 0, "TODO:Create QUEUE ??")); } break; - case 0x66 : { /* Read Queue Current Status */ + case 0x66 : { /* Read Queue Current Status */ /* !!!!!! TO DO */ NETOBJ obj; obj.id = GET_BE32(rdata); @@ -1011,6 +1043,17 @@ static int handle_fxx(CONNECTION *c, int gelen, int func) completition=0xd5; /* no Queue Job */ }break; + case 0x6A : /* Remove Job from Queue OLD */ + case 0x80 : { /* Remove Job from Queue NEW */ + NETOBJ obj; + uint32 jobnr = (ufunc == 0x6A) + ? GET_BE16(rdata+4) + : GET_BE32(rdata+4); + obj.id = GET_BE32(rdata); + XDPRINTF((1, 0, "TODO:Remove Job=%ld from Queue Q=0x%lx", jobnr, obj.id)); + completition=0xd5; /* no Queue Job */ + }break; + case 0x6B : { /* Get Queue Job List, old */ /* !!!!!! TO DO */ NETOBJ obj; @@ -1028,7 +1071,7 @@ static int handle_fxx(CONNECTION *c, int gelen, int func) }break; case 0x68: /* creat queue job and file old */ - case 0x79: { /* creat queue job and file */ + case 0x79: { /* creat queue job and file new */ uint32 q_id = GET_BE32(rdata); uint8 *dir_name = rdata+4+280+1; int result = nw_get_q_dirname(q_id, dir_name); @@ -1054,6 +1097,14 @@ static int handle_fxx(CONNECTION *c, int gelen, int func) } break; + + case 0x7d : { /* Read Queue Current Status, new */ + NETOBJ obj; + obj.id = GET_BE32(rdata); + XDPRINTF((1, 0, "TODO:READ QUEUE STATUS NEW of Q=0x%lx", obj.id)); + completition=0xd5; /* no Queue Job */ + }break; + case 0xc8 : { /* CHECK CONSOLE PRIVILEGES */ XDPRINTF((1, 0, "TODO: CHECK CONSOLE PRIV")); /* !!!!!! TODO completition=0xc6 (no rights) */ @@ -1065,11 +1116,18 @@ static int handle_fxx(CONNECTION *c, int gelen, int func) char *revision_date = REVISION_DATE; char *copyright = "(C)opyright Martin Stover"; int k=strlen(company)+1; - + int l; memset(responsedata, 0, 512); strcpy(responsedata, company); - k += (1+sprintf(responsedata+k, revision, - _VERS_H_, _VERS_L_ )); + + l = 1 + sprintf(responsedata+k, revision, + _VERS_H_, _VERS_L_ ); +#if 0 + k+=l; +#else + /* BUG in LIB */ + k += (1 + strlen(responsedata+k)); +#endif strcpy(responsedata+k, revision_date); k += (strlen(revision_date)+1); strcpy(responsedata+k, copyright); @@ -1092,7 +1150,7 @@ static int handle_fxx(CONNECTION *c, int gelen, int func) int anz_conns = (int) *p++; uint8 *co = p; int msglen = (int) *(p+anz_conns); - char *msg = p+anz_conns+1; + char *msg = (char*) p+anz_conns+1; int k = -1; if (anz_conns) { while (++k < anz_conns) { @@ -1138,6 +1196,7 @@ static int handle_fxx(CONNECTION *c, int gelen, int func) ncpresponse->connection = ncprequest->connection; ncpresponse->reserved = 0; ncpresponse->completition = completition; + if (c->message[0]) connect_status |= 0x40; ncpresponse->connect_status = connect_status; data_len=write(c->fd, (char*)ncpresponse, sizeof(NCPRESPONSE) + data_len); @@ -1267,7 +1326,7 @@ static int handle_ctrl(void) case 0x3333 : /* 'bindery' calls */ if (sizeof(conn) == read(0, (char*)&conn, sizeof(conn))) { - uint8 *buff = xmalloc(conn+10); + uint8 *buff = (uint8*) xmalloc(conn+10); XDPRINTF((2,0, "0x3333 len=%d", conn)); if (conn == read(0, (char*)buff, conn)) handle_bind_calls(buff); diff --git a/net.h b/net.h index 32189b5..eb69779 100644 --- a/net.h +++ b/net.h @@ -1,6 +1,6 @@ -/* net.h 22-Jan-96 */ +/* net.h 08-Feb-96 */ -/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany +/* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany * * 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 @@ -116,10 +116,21 @@ # define PATHNAME_BINDERY "." /* location of bindery files */ #endif +#ifndef NETWORK_SERIAL_NMBR +# define NETWORK_SERIAL_NMBR 0x44444444L /* Serial Number 4 Byte */ +#endif +#ifndef NETWORK_APPL_NMBR +# define NETWORK_APPL_NMBR 0x2222 /* Applikation Number 2 Byte */ +#endif + #ifndef IPX_DATA_GR_546 # define IPX_DATA_GR_546 1 #endif +#ifndef WITH_NAME_SPACE_CALLS +# define WITH_NAME_SPACE_CALLS 0 +#endif + #ifndef MAX_NW_ROUTES # define MAX_NW_ROUTES 50 #endif @@ -134,6 +145,27 @@ # define IPX_MAX_DATA 546 #endif +#ifdef LINUX +# ifndef INTERNAL_RIP_SAP +# define INTERNAL_RIP_SAP 1 +# endif +# if INTERNAL_RIP_SAP +# ifndef FILE_SERVER_INACTIV +# define FILE_SERVER_INACTIV 0 +# endif +# else +# undef FILE_SERVER_INACTIV +# define FILE_SERVER_INACTIV 0 +# endif +#else +/* USL has good rip/sap router */ +# undef INTERNAL_RIP_SAP +# define INTERNAL_RIP_SAP 0 +# undef FILE_SERVER_INACTIV +# define FILE_SERVER_INACTIV 0 +#endif + + #define MAX_SERVER_NAME 48 typedef union { @@ -178,7 +210,6 @@ typedef union { uint8 server_hops[2]; } saps; } sap; - struct S_WDOG { /* Watchdog */ uint8 connid; /* connection ID */ uint8 status; /* STATUS */ @@ -238,11 +269,11 @@ typedef union { char data[IPX_MAX_DATA]; } IPX_DATA; -typedef struct S_SIP SIP; -typedef struct S_SQP SQP; -typedef struct S_SAP SAP; -typedef struct S_SAPS SAPS; -typedef struct S_RIP RIP; +typedef struct S_SIP SIP; +typedef struct S_SQP SQP; +typedef struct S_SAP SAP; +typedef struct S_SAPS SAPS; +typedef struct S_RIP RIP; typedef struct S_CONFREQ CONFREQ; typedef struct S_DIAGRESP DIAGRESP; @@ -250,202 +281,30 @@ typedef struct S_NCPRESPONSE NCPRESPONSE; typedef struct S_NCPREQUEST NCPREQUEST; /* SOCKETS */ -#define SOCK_ROUTE 0x0001 /* Routing Information */ -#define SOCK_ECHO 0x0002 /* Echo Protokoll Packet */ -#define SOCK_ERROR 0x0003 /* Error Handler Packet */ -#define SOCK_NCP 0x0451 /* File Service CORE */ +#define SOCK_AUTO 0x0000 /* Autobound Socket */ +#define SOCK_ROUTE 0x0001 /* Routing Information */ +#define SOCK_ECHO 0x0002 /* Echo Protokoll Packet */ +#define SOCK_ERROR 0x0003 /* Error Handler Packet */ +#define SOCK_NCP 0x0451 /* File Service CORE */ #define SOCK_SAP 0x0452 /* SAP Service Advertising Packet */ -#define SOCK_RIP 0x0453 /* Routing Information Packet */ -#define SOCK_NETBIOS 0x0455 /* NET BIOS Packet */ -#define SOCK_DIAGNOSE 0x0456 /* Diagnostic Packet */ -#define SOCK_NVT 0x8063 /* NVT (Netzerk Virtual Terminal) */ +#define SOCK_RIP 0x0453 /* Routing Information Packet */ +#define SOCK_NETBIOS 0x0455 /* NET BIOS Packet */ +#define SOCK_DIAGNOSE 0x0456 /* Diagnostic Packet */ +#define SOCK_NVT 0x8063 /* NVT (Network Virtual Terminal) */ /* PACKET TYPES */ -#define PACKT_0 0 /* unknown */ -#define PACKT_ROUTE 1 /* Routing Information */ -#define PACKT_ECHO 2 /* Echo Packet */ -#define PACKT_ERROR 3 /* Error Packet */ +#define PACKT_0 0 /* unknown */ +#define PACKT_ROUTE 1 /* Routing Information */ +#define PACKT_ECHO 2 /* Echo Packet */ +#define PACKT_ERROR 3 /* Error Packet */ #define PACKT_EXCH 4 /* Packet Exchange Packet */ -#define PACKT_SPX 5 /* SPX Packet */ - /* 16 - 31 Experimental */ -#define PACKT_CORE 17 /* Core Protokoll (NCP) */ - - -#define FD_NWSERV 3 /* one after stderr */ - +#define PACKT_SPX 5 /* SPX Packet */ + /* 16 - 31 Experimental */ +#define PACKT_CORE 17 /* Core Protokoll (NCP) */ +#define FD_NWSERV 3 /* one after stderr */ #include "net1.h" -/* connect.c */ -typedef struct { - uint8 name[14]; /* filename in DOS format */ - uint8 attrib; /* Attribute */ - uint8 ext_attrib; /* File Execute Type */ - uint8 size[4]; /* size of file */ - uint8 create_date[2]; - uint8 acces_date[2]; - uint8 modify_date[2]; - uint8 modify_time[2]; -} NW_FILE_INFO; - -typedef struct { - uint8 name[14]; /* dirname */ - uint8 attrib; - uint8 ext_attrib; - uint8 create_date[2]; - uint8 create_time[2]; - uint8 owner_id[4]; - uint8 access_right_mask; - uint8 reserved; /* future use */ - uint8 next_search[2]; -} NW_DIR_INFO; - -typedef struct { - uint8 record_in_use[2]; - uint8 record_previous[4]; - uint8 record_next[4]; - uint8 client_connection[4]; - uint8 client_task[4]; - uint8 client_id[4]; - - uint8 target_id[4]; /* 0xff, 0xff, 0xff, 0xff */ - uint8 target_execute_time[6]; /* all 0xff */ - uint8 job_entry_time[6]; /* all zero */ - uint8 job_id[4]; /* ?? alles 0 HI-LOW */ - uint8 job_typ[2]; /* z.B. Printform HI-LOW */ - uint8 job_position[2]; /* ?? alles 0 low-high ? */ - uint8 job_control_flags[2]; /* z.B 0x10, 0x00 */ - /* 0x80 operator hold flag */ - /* 0x40 user hold flag */ - /* 0x20 entry open flag */ - /* 0x10 service restart flag */ - /* 0x08 autostart flag */ - - uint8 job_file_name[14]; /* len + DOS filename */ - uint8 job_file_handle[4]; - uint8 server_station[4]; - uint8 server_task[4]; - uint8 server_id[4]; - uint8 job_bez[50]; /* "LPT1 Catch" */ - uint8 client_area[152]; -} QUEUE_JOB; - -typedef struct { - uint8 client_connection; - uint8 client_task; - uint8 client_id[4]; - uint8 target_id[4]; /* 0xff, 0xff, 0xff, 0xff */ - uint8 target_execute_time[6]; /* all 0xff */ - uint8 job_entry_time[6]; /* all zero */ - uint8 job_id[2]; /* ?? alles 0 HI-LOW */ - uint8 job_typ[2]; /* z.B. Printform HI-LOW */ - uint8 job_position; /* zero */ - uint8 job_control_flags; /* z.B 0x10 */ - /* 0x80 operator hold flag */ - /* 0x40 user hold flag */ - /* 0x20 entry open flag */ - /* 0x10 service restart flag */ - /* 0x08 autostart flag */ - - uint8 job_file_name[14]; /* len + DOS filename */ - uint8 job_file_handle[6]; - uint8 server_station; - uint8 server_task; - uint8 server_id[4]; - uint8 job_bez[50]; /* "LPT1 Catch" */ - uint8 client_area[152]; -} QUEUE_JOB_OLD; /* before 3.11 */ - -typedef struct { - uint8 version; /* normal 0x0 */ - uint8 tabsize; /* normal 0x8 */ - uint8 anz_copies[2]; /* copies 0x0, 0x01 */ - uint8 print_flags[2]; /* 0x0, 0xc0 z.B. with banner */ - uint8 max_lines[2]; /* 0x0, 0x42 */ - uint8 max_chars[2]; /* 0x0, 0x84 */ - uint8 form_name[16]; /* "UNKNOWN" */ - uint8 reserved[6]; /* all zero */ - uint8 banner_user_name[13]; /* "SUPERVISOR" */ - uint8 bannner_file_name[13]; /* "LST:" */ - uint8 bannner_header_file_name[14]; /* all zero */ - uint8 file_path_name[80]; /* all zero */ -} QUEUE_PRINT_AREA; - - -extern int nw_init_connect(void); -extern int nw_free_handles(int task); - -extern int nw_creat_open_file(int dir_handle, uint8 *data, int len, - NW_FILE_INFO *info, int attrib, int access, int mode); - -extern int nw_read_datei(int fhandle, uint8 *data, int size, uint32 offset); -extern int nw_seek_datei(int fhandle, int modus); -extern int nw_write_datei(int fhandle, uint8 *data, int size, uint32 offset); -extern int nw_lock_datei(int fhandle, int offset, int size, int do_lock); -extern int nw_close_datei(int fhandle); - -extern int nw_server_copy(int qfhandle, uint32 qoffset, - int zfhandle, uint32 zoffset, - uint32 size); - -extern int nw_delete_datei(int dir_handle, uint8 *data, int len); -extern int nw_chmod_datei(int dir_handle, uint8 *data, int len, int modus); - -extern int mv_file(int qdirhandle, uint8 *q, int qlen, - int zdirhandle, uint8 *z, int zlen); - - - -extern int nw_mk_rd_dir(int dir_handle, uint8 *data, int len, int mode); - -extern int nw_search(uint8 *info, - int dirhandle, int searchsequence, - int search_attrib, uint8 *data, int len); - -extern int nw_dir_search(uint8 *info, - int dirhandle, int searchsequence, - int search_attrib, uint8 *data, int len); - - -extern int nw_find_dir_handle( int dir_handle, - uint8 *data, /* zus„tzlicher Pfad */ - int len); /* L„nge Pfad */ - -extern int nw_alloc_dir_handle( - int dir_handle, /* Suche ab Pfad dirhandle */ - uint8 *data, /* zus„tzl. Pfad */ - int len, /* L„nge DATA */ - int driveletter, /* A .. Z normal */ - int is_temphandle, /* tempor„res Handle 1 */ - /* spez. temp Handle 2 */ - int task); /* Prozess Task */ - - -extern int nw_open_dir_handle( int dir_handle, - uint8 *data, /* zus„tzlicher Pfad */ - int len, /* L„nge DATA */ - int *volume, /* Volume */ - int *dir_id, /* „hnlich Filehandle */ - int *searchsequence); - - -extern int nw_free_dir_handle(int dir_handle); - -extern int nw_set_dir_handle(int targetdir, int dir_handle, - uint8 *data, int len, int task); - -extern int nw_get_directory_path(int dir_handle, uint8 *name); - -extern int nw_get_vol_number(int dir_handle); - - - -extern int nw_get_eff_dir_rights(int dir_handle, uint8 *data, int len, int modus); - -extern int nw_set_fdate_time(uint32 fhandle, uint8 *datum, uint8 *zeit); -extern int nw_scan_dir_info(int dir_handle, uint8 *data, int len, - uint8 *subnr, uint8 *subname, - uint8 *subdatetime, uint8 *owner); #include "tools.h" diff --git a/netinit.c b/netinit.c deleted file mode 100644 index 0027ad5..0000000 --- a/netinit.c +++ /dev/null @@ -1,308 +0,0 @@ -/* netinit.c 11-Sep-95 */ -/* Initialisierung VON IPX u. SPX unter USL 1.1 */ -/* 'emuliert' Teil von NPSD */ - -/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany - * - * 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 of the License, 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 "net.h" -#include -#define NET_DEBUG 1 -#define MY_NETWORK 0x10 -#if NET_DEBUG -void print_adaptinfo(FILE *fout, ipxAdapterInfo_t *ai, char *s) -{ - if (s != NULL) - fprintf(fout, "\n---- %s ----\n", s); - fprintf(fout, -"dl_primitive = %lu \n\ -dl_max_sdu = %lu \n\ -dl_min_sdu = %lu \n\ -dl_addr_length = %lu \n\ -dl_mac_type = %lu \n\ -dl_reserved = %lu \n\ -dl_current_state = %lu \n\ -dl_sap_length = %ld \n\ -dl_service_mode = %lu \n\ -dl_qos_length = %lu \n\ -dl_qos_offset = %lu \n\ -dl_qos_range_length = %lu \n\ -dl_qos_range_offset = %lu \n\ -dl_provider_style = %lu \n\ -dl_addr_offset = %lu \n\ -dl_version = %lu \n\ -dl_brdcst_addr_length = %lu \n\ -dl_brdcst_addr_offset = %lu \n\ -dl_growth = %lu \n", - ai->dl_primitive, - ai->dl_max_sdu, - ai->dl_min_sdu, - ai->dl_addr_length, - ai->dl_mac_type, - ai->dl_reserved, - ai->dl_current_state, - ai->dl_sap_length, - ai->dl_service_mode, - ai->dl_qos_length, - ai->dl_qos_offset, - ai->dl_qos_range_length, - ai->dl_qos_range_offset, - ai->dl_provider_style, - ai->dl_addr_offset, - ai->dl_version, - ai->dl_brdcst_addr_length, - ai->dl_brdcst_addr_offset, - ai->dl_growth); - fflush(fout); -} - -void print_netinfo(FILE *fout, netInfo_t *ni, char *s) -{ - ipxAdapterInfo_t *ai = &(ni->adapInfo); - if (s != NULL) - fprintf(fout, "\n---- %s ----\n", s); - fprintf(fout, "Lan:%lx, state:%lx, err:%lx, netw:%lx, mux:%lx, node:%x.%x.%x.%x.%x.%x\n", - ni->lan, ni->state, ni->streamError, ni->network, - ni->muxId, - (int)ni->nodeAddress[0], - (int)ni->nodeAddress[1], - (int)ni->nodeAddress[2], - (int)ni->nodeAddress[3], - (int)ni->nodeAddress[4], - (int)ni->nodeAddress[5]); - print_adaptinfo(fout, ai, NULL); -} -#else -#define print_adaptinfo(fout, ai, s) -#define print_netinfo(fout, ni, s) -#endif - - -int main(int argc, char **argv) -{ - int ipx0fd=open("/dev/ipx0", O_RDWR); - if (ipx0fd > -1) { - int lan0fd=open("/dev/lan0", O_RDWR); - if (lan0fd > -1) { - struct strioctl str1, str2, str3, str4; - int ipxfd; - int j = -1; - long max_adapter=0; - netInfo_t netinfo; - long info_req = DL_INFO_REQ; - ipxAdapterInfo_t *ai = &(netinfo.adapInfo); - dl_bind_req_t bind_req; - struct { - dl_bind_ack_t b; - uint8 addr[8]; /* Adresse */ - } bind_ack; - int muxid; - int flagsp=0; - int ilen; - struct strbuf cntr1; -#if NET_DEBUG - FILE *fout = fopen("xyz", "w+"); -#endif - /* DL_INFO */ - cntr1.maxlen = 4; - cntr1.len = 4; - cntr1.buf = (char *)&info_req; - putmsg(lan0fd, &cntr1, NULL, 0); - cntr1.maxlen = sizeof(ipxAdapterInfo_t); - cntr1.len = 0; - cntr1.buf = (char*)ai; - if ((ilen=getmsg(lan0fd, &cntr1, NULL, &flagsp)) > 0) { - char dummy[100]; - cntr1.maxlen = sizeof(dummy); - cntr1.len = 0; - cntr1.buf = dummy; - flagsp = 0; - getmsg(lan0fd, &cntr1, NULL, &flagsp); - fprintf(stderr, "DL_INFO getmsg=%d bzw. %d > 0\n", ilen, cntr1.len); - } - print_adaptinfo(fout, ai, "nach DL_INFO"); - /* ----------------------------------------------- */ - bind_req.dl_primitive = DL_BIND_REQ; - bind_req.dl_sap = 0x8137; /* SAP Type fr NetWare */ - bind_req.dl_max_conind = 1; - bind_req.dl_service_mode = DL_CLDLS; /* 2 */ - bind_req.dl_conn_mgmt = 0; - bind_req.dl_xidtest_flg = 1; - - cntr1.maxlen = sizeof(dl_bind_req_t); - cntr1.len = sizeof(dl_bind_req_t); - cntr1.buf = (char*)&bind_req; - putmsg(lan0fd, &cntr1, NULL, 0); - - memset(&bind_ack, 0, sizeof(bind_ack)); - bind_ack.b.dl_primitive = DL_BIND_REQ; - cntr1.maxlen = sizeof(bind_ack); - cntr1.len = 0; - cntr1.buf = (char*)&bind_ack; - flagsp = 0; - getmsg(lan0fd, &cntr1, NULL, &flagsp); - fprintf(stderr, "BIND ACK:sap 0x%x, addr_len %d, addr_offs %d\n \ - addr=0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x\n" , - bind_ack.b.dl_sap, bind_ack.b.dl_addr_length, bind_ack.b.dl_addr_offset, - (int)bind_ack.addr[0], - (int)bind_ack.addr[1], - (int)bind_ack.addr[2], - (int)bind_ack.addr[3], - (int)bind_ack.addr[4], - (int)bind_ack.addr[5], - (int)bind_ack.addr[6], - (int)bind_ack.addr[7]); - - - /* DL_INFO */ - cntr1.maxlen = 4; - cntr1.len = 4; - cntr1.buf = (char *)&info_req; - putmsg(lan0fd, &cntr1, NULL, 0); - cntr1.maxlen = sizeof(ipxAdapterInfo_t); - cntr1.len = 0; - cntr1.buf = (char*)ai; - if ((ilen=getmsg(lan0fd, &cntr1, NULL, &flagsp)) > 0) { - char dummy[100]; - cntr1.maxlen = sizeof(dummy); - cntr1.len = 0; - cntr1.buf = dummy; - flagsp = 0; - getmsg(lan0fd, &cntr1, NULL, &flagsp); - fprintf(stderr, "DL_INFO getmsg=%d bzw. %d > 0\n", ilen, cntr1.len); - } - print_adaptinfo(fout, ai, "nach DL_INFO 2"); - /* ----------------------------------------------- */ - - str1.ic_cmd = IPX_GET_MAX_CONNECTED_LANS; - str1.ic_timout = 0; - str1.ic_len = 4; - str1.ic_dp = (char*)&max_adapter; - ioctl(ipx0fd, I_STR, &str1); - - printf("Max Adapter %ld\n", max_adapter); - muxid = ioctl(ipx0fd, I_LINK, lan0fd); /* LINK */ - -/*-----------------------------------------------*/ - - /* - str3.ic_cmd = IPX_SET_FRAME_TYPE_8023; - str3.ic_len = 0; - str3.ic_timout = 5; - str3.ic_dp = 0; - ioctl(ipx0fd, I_STR, &str3); - */ - /* - str2.ic_cmd = IPX_SET_FRAME_TYPE_SNAP; - */ - /* - str2.ic_cmd = IPX_SET_FRAME_TYPE_8022; - */ - str2.ic_timout = 0; - str2.ic_len = sizeof(netinfo); - str2.ic_dp = (char*)&netinfo; - netinfo.lan = 0; - netinfo.state = 0; - netinfo.network = MY_NETWORK; - netinfo.muxId = muxid; - netinfo.nodeAddress[0] = bind_ack.addr[0]; /* 0x00 */ - netinfo.nodeAddress[1] = bind_ack.addr[1]; /* 0x80 */ - netinfo.nodeAddress[2] = bind_ack.addr[2]; /* 0x48 */ - netinfo.nodeAddress[3] = bind_ack.addr[3]; /* 0x83 */ - netinfo.nodeAddress[4] = bind_ack.addr[4]; /* 0x14 */ - netinfo.nodeAddress[5] = bind_ack.addr[5]; /* 0x3f */ - /* - ai->dl_primitive = DL_INFO_REQ ; - ioctl(ipx0fd, I_STR, &str2); - print_netinfo(fout, &netinfo, "nach SET_FRAME"); - */ - - str3.ic_cmd = IPX_SET_LAN_INFO; - str3.ic_len = sizeof(netinfo); - str3.ic_timout = 5; - str3.ic_dp = (char*)&netinfo; - ioctl(ipx0fd, I_STR, &str3); - print_netinfo(fout, &netinfo, "nach IPX_SET_LAN_INFO"); - -#if 0 - if ((ipxfd = open("/dev/ipx", O_RDWR)) > -1){ - int spxfd = open("/dev/nspxd", O_RDWR); - if (spxfd > -1){ - int pid=-1; - int akt_pid = getpid(); - char *progname = "nwserv"; - muxid = ioctl(spxfd, I_LINK, ipxfd); - str4.ic_cmd = IPX_SET_SPX; - str4.ic_len = 0; - str4.ic_timout = 5; - str4.ic_dp = (char*) NULL; - ioctl(spxfd, I_STR, &str4); - close(ipxfd); - pid=fork(); - if (pid == 0) { /* Child */ - close(spxfd); - close(ipx0fd); - close(lan0fd); - execl(progname, progname, (argc > 1) ? *(argv+1) : NULL, NULL); - /* Falls nicht OK Calling Prozess killen */ - kill(akt_pid, SIGTERM); - kill(akt_pid, SIGQUIT); - exit (1); - } - if (pid > -1){ - pause(); - kill(pid, SIGTERM); /* T”chter killen */ - kill(pid, SIGQUIT); - } else perror("nwserv not running"); - close(spxfd); - } else { - perror("spx not open"); - close(ipxfd); - } - } else perror("ipx not open"); -#else - if ((ipxfd = open("/dev/ipx", O_RDWR)) > -1){ - int pid=-1; - int akt_pid = getpid(); - char *progname = "nwserv"; - close(ipxfd); - pid=fork(); - if (pid == 0) { /* Child */ - close(ipx0fd); - close(lan0fd); - execl(progname, progname, (argc > 1) ? *(argv+1) : NULL, NULL); - /* Falls nicht OK Calling Prozess killen */ - kill(akt_pid, SIGTERM); - kill(akt_pid, SIGQUIT); - exit (1); - } - if (pid > -1){ - pause(); - kill(pid, SIGTERM); /* T”chter killen */ - kill(pid, SIGQUIT); - } else perror("nwserv not running"); - } else perror("ipx not open"); -#endif - - close(lan0fd); -#if NET_DEBUG - fclose(fout); -#endif - } else perror("lan0 not open"); - close(ipx0fd); - } else perror("ipx0 not open"); -} diff --git a/nwclient.c b/nwclient.c index a0f8596..b7f0c37 100644 --- a/nwclient.c +++ b/nwclient.c @@ -236,6 +236,8 @@ static int do_17_17(void) return(-1); } + + static int get_network_serial_number(void) { uint8 data[] = {0, 1, 0x12}; @@ -610,6 +612,17 @@ static void test2(void) } } +static int do_5f(void) +{ + uint8 data[] = {0x10, 0, 0, 0}; + RDATA(data, 0x17, "do_5f"); + if (!handle_event()) { + return(0); + } + return(-1); +} + + static void teste_reads(void) { @@ -681,7 +694,7 @@ static void test_wdog(void) /* --------------------------------------------------------- */ int main(int argc, char **argv) { - nw_debug = 1; /* dieses Modul dient nur zum Debuggen !! */ + init_tools(NWCLIENT); if (argc != 3) { fprintf(stderr, "usage: nwclient MY_ADDR SERVER_ADDR\n"); @@ -701,6 +714,7 @@ int main(int argc, char **argv) get_pkt_size(); get_connect(); get_server_time(); + do_5f(); file_search_init(NULL, 1, NULL); get_bindery_access(); diff --git a/nwconn.c b/nwconn.c index aaa79a2..c5a5a68 100644 --- a/nwconn.c +++ b/nwconn.c @@ -1,7 +1,7 @@ -/* nwconn.c 13-Jan-96 */ +/* nwconn.c 07-Feb-96 */ /* one process / connection */ -/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany +/* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany * * 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 @@ -21,6 +21,7 @@ #include "net.h" #include #include "nwvolume.h" +#include "nwfile.h" #include "connect.h" #include "namspace.h" @@ -165,7 +166,11 @@ static void handle_ncp_serv() 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); + if ( get_volume_options(volume, 1) & VOL_OPTION_REMOUNT) { + U16_TO_BE16(1, xdata->removable); + } else { + U16_TO_BE16(0, xdata->removable); + } } data_len = sizeof(struct XDATA); } else completition = (uint8) -result; @@ -383,7 +388,8 @@ static void handle_ncp_serv() int result = nw_get_vol_number((int)*(p+1)); memset(xdata, 0, sizeof(struct XDATA)); if (result > -1) { - result = nw_get_volume_name(result, xdata->name); + int volume = result; + result = nw_get_volume_name(volume, xdata->name); if (result > -1) { struct fs_usage fsp; if (!nw_get_fs_usage(xdata->name, &fsp)) { @@ -392,7 +398,11 @@ static void handle_ncp_serv() 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); + if (get_volume_options(volume, 1) & VOL_OPTION_REMOUNT) { + U16_TO_BE16(1, xdata->removable); + } else { + U16_TO_BE16(0, xdata->removable); + } } data_len = sizeof(struct XDATA); XDPRINTF((5,0,"GIVE VOLUME INFO von :%s:", xdata->name)); @@ -569,7 +579,7 @@ static void handle_ncp_serv() uint8 namlen; uint8 name[1]; } *xdata = (struct XDATA*) responsedata; - char name[100]; + uint8 name[100]; int result = nw_get_volume_name(volume, name); if (result > -1){ struct fs_usage fsp; @@ -581,7 +591,7 @@ static void handle_ncp_serv() U32_TO_32(fsp.fsu_files, xdata->total_dirs); U32_TO_32(fsp.fsu_ffree, xdata->avail_dirs); } - xdata->namlen = strlen(name); + xdata->namlen = strlen((char*)name); strmaxcpy(xdata->name, name, xdata->namlen); data_len = xdata->namlen + 30; } else completition = (uint8) -result; @@ -599,7 +609,7 @@ static void handle_ncp_serv() uint8 name[1]; /* Volume Name */ } *xdata = (struct XDATA*) responsedata; int result = nw_get_vol_number(dir_handle); - char name[100]; + uint8 name[100]; if (result > -1) result = nw_get_volume_name(result, name); if (result > -1) { @@ -612,7 +622,7 @@ static void handle_ncp_serv() U32_TO_32(fsp.fsu_files, xdata->total_dirs); U32_TO_32(fsp.fsu_ffree, xdata->avail_dirs); } - xdata->namlen = strlen(name); + xdata->namlen = strlen((char*)name); strmaxcpy(xdata->name, name, xdata->namlen); data_len = xdata->namlen + 22; } else completition = (uint8) -result; @@ -770,8 +780,8 @@ static void handle_ncp_serv() struct INPUT { uint8 header[7]; /* Requestheader */ uint8 reserve; /* 0x1 */ - uint8 fhandle[4]; /* Filehandle */ uint8 ext_fhandle[2]; /* all zero */ + uint8 fhandle[4]; /* Filehandle */ uint8 offset[4]; uint8 size[4]; uint8 weisnicht[2]; /* lock timeout ??? */ @@ -836,8 +846,8 @@ static void handle_ncp_serv() struct INPUT { uint8 header[7]; /* Requestheader */ uint8 reserve; - uint8 fhandle[4]; /* filehandle */ uint8 ext_fhandle[2]; /* all zero */ + uint8 fhandle[4]; /* filehandle */ } *input = (struct INPUT *)ncprequest; uint32 fhandle = GET_BE32(input->fhandle); XDPRINTF((2,0, "TODO: COMMIT FILE:fhandle=%ld", fhandle)); @@ -927,11 +937,11 @@ static void handle_ncp_serv() struct INPUT { uint8 header[7]; /* Requestheader */ uint8 reserve; - uint8 fhandle[4]; /* filehandle */ uint8 ext_fhandle[2]; /* all zero */ + uint8 fhandle[4]; /* filehandle */ } *input = (struct INPUT *)ncprequest; uint32 fhandle = GET_BE32(input->fhandle); - completition = (uint8)(-nw_close_datei(fhandle)); + completition = (uint8)(-nw_close_datei(fhandle, 0)); if (!completition && fhandle == test_handle) { do_druck++; test_handle = -1; @@ -950,8 +960,8 @@ static void handle_ncp_serv() uint8 data[1]; /* Name */ } *input = (struct INPUT *)ncprequest; struct OUTPUT { - uint8 fhandle[4]; /* Filehandle */ uint8 extfhandle[2]; + uint8 fhandle[4]; /* Filehandle */ uint8 reserved[2]; /* rese. by NOVELL */ NW_FILE_INFO fileinfo; } *xdata= (struct OUTPUT*)responsedata; @@ -1041,8 +1051,8 @@ static void handle_ncp_serv() struct INPUT { uint8 header[7]; /* Requestheader */ uint8 filler; + uint8 ext_filehandle[2]; /* all zero */ uint8 fhandle[4]; /* Dateihandle */ - uint8 ext_filehandle[2]; /* ?? alles 0 */ } *input = (struct INPUT *)ncprequest; struct OUTPUT { uint8 size[4]; /* Position ??? */ @@ -1062,8 +1072,8 @@ static void handle_ncp_serv() struct INPUT { uint8 header[7]; /* Requestheader */ uint8 filler; + uint8 ext_fhandle[2]; /* all zero */ uint8 fhandle[4]; /* filehandle */ - uint8 reserve[2]; /* alles 0 */ uint8 offset[4]; /* alles 0 */ uint8 max_size[2]; /* zu lesende Bytes */ } *input = (struct INPUT *)ncprequest; @@ -1093,8 +1103,8 @@ static void handle_ncp_serv() uint8 header[7]; /* Requestheader */ uint8 filler; /* 0 Filler ?? */ - uint8 fhandle[4]; /* Dateihandle */ uint8 ext_handle[2]; + uint8 fhandle[4]; /* Dateihandle */ uint8 offset[4]; /* SEEK OFFSET */ uint8 size[2]; /* Datasize */ uint8 data[2]; /* Schreibdaten */ @@ -1116,15 +1126,15 @@ static void handle_ncp_serv() case 0x4a : { /* File SERVER COPY */ /* should be OK */ struct INPUT { - uint8 header[7]; /* Requestheader */ - uint8 reserved; /* Reserved by Novell */ - uint8 qfhandle[4]; /* Quellfile */ - uint8 reserve1[2]; /* ext Filehandle */ - uint8 zfhandle[4]; /* Zielfile */ - uint8 reserve2[2]; /* ext Filehandle */ - uint8 qoffset[4]; /* Quellfile Offset */ - uint8 zoffset[4]; /* Zielfile Offset */ - uint8 size[4]; /* Anzahl */ + uint8 header[7]; /* Requestheader */ + uint8 reserved; /* Reserved by Novell */ + uint8 qext_fhandle[2]; /* ext Filehandle */ + uint8 qfhandle[4]; /* Quellfile */ + uint8 zext_fhandle[2]; /* ext Filehandle */ + uint8 zfhandle[4]; /* Zielfile */ + uint8 qoffset[4]; /* SourceFile Offset */ + uint8 zoffset[4]; /* DestFile Offset */ + uint8 size[4]; /* copysize */ } *input = (struct INPUT *)ncprequest; int qfhandle = GET_BE32(input->qfhandle); int zfhandle = GET_BE32(input->zfhandle); @@ -1150,8 +1160,8 @@ static void handle_ncp_serv() struct INPUT { uint8 header[7]; /* Requestheader */ uint8 filler; + uint8 reserve[2]; /* ext Filehandle */ uint8 fhandle[4]; /* Dateihandle */ - uint8 reserve[2]; /* ext Filehandle ??? */ uint8 zeit[2]; /* time */ uint8 datum[2]; /* date */ } *input = (struct INPUT *)ncprequest; @@ -1177,8 +1187,8 @@ static void handle_ncp_serv() uint8 data[2]; /* Name */ } *input = (struct INPUT *)ncprequest; struct OUTPUT { + uint8 ext_fhandle[2]; /* all zero */ uint8 fhandle[4]; /* Dateihandle */ - uint8 ext_fhandle[2]; /* z.B 0x0 0x0 */ uint8 reserve2[2]; /* z.B 0x0 0x0 */ NW_FILE_INFO fileinfo; } *xdata= (struct OUTPUT*)responsedata; @@ -1216,12 +1226,24 @@ static void handle_ncp_serv() break; #endif +#ifdef _MAR_TESTS_ + case 0x5f : { /* ????????????? UNIX Client */ + struct INPUT { + uint8 header[7]; /* Requestheader */ + uint8 unknown[4]; /* 0x10, 0,0,0 */ + } *input = (struct INPUT *)ncprequest; + completition = 0; + } + break; + +#endif #if 0 case 0x61 : { /* Negotiate Buffer Size, Packetsize new ??? */ /* > 3.11 */ /* similar request as 0x21 */ } + #endif default : completition = 0xfb; /* unknown request */ diff --git a/nwdbm.c b/nwdbm.c index 35c324e..3070fca 100644 --- a/nwdbm.c +++ b/nwdbm.c @@ -951,7 +951,7 @@ int nw_test_passwd(uint32 obj_id, uint8 *vgl_key, uint8 *akt_key) int nw_set_enpasswd(uint32 obj_id, uint8 *passwd) { - uint8 *prop_name="PASSWORD"; + uint8 *prop_name=(uint8*)"PASSWORD"; if (passwd && *passwd) { nw_new_create_prop(obj_id, NULL, 0, 0, 0, prop_name, P_FL_STAT|P_FL_ITEM, 0x44, @@ -968,7 +968,7 @@ int nw_set_passwd(uint32 obj_id, char *password) uint8 s_uid[4]; U32_TO_BE32(obj_id, s_uid); shuffle(s_uid, password, strlen(password), passwd); -#if 0 +#if 1 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], diff --git a/nwfile.c b/nwfile.c new file mode 100644 index 0000000..17bc6b4 --- /dev/null +++ b/nwfile.c @@ -0,0 +1,369 @@ +/* nwfile.c 23-Jan-96 */ +/* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany + * + * 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 of the License, 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 "net.h" + +#include +#include + +#include + +#include "nwvolume.h" +#include "nwfile.h" +#include "connect.h" + + +#define MAX_FILEHANDLES 80 +static FILE_HANDLE file_handles[MAX_FILEHANDLES]; +static int anz_fhandles=0; + + +static int new_file_handle(uint8 *unixname) +{ + int rethandle = -1; + FILE_HANDLE *fh=NULL; + while (++rethandle < anz_fhandles) { + FILE_HANDLE *fh=&(file_handles[rethandle]); + if (fh->fd == -1 && !(fh->flags & 4)) { /* empty slot */ + rethandle++; + break; + } else fh=NULL; + } + if (fh == NULL) { + if (anz_fhandles < MAX_FILEHANDLES) { + fh=&(file_handles[anz_fhandles]); + rethandle = ++anz_fhandles; + } else return(0); /* no free handle anymore */ + } + /* init handle */ + fh->fd = -2; + fh->offd = 0L; + fh->tmodi = 0L; + strcpy((char*)fh->fname, (char*)unixname); + fh->flags = 0; + fh->f = NULL; + XDPRINTF((5, 0, "new_file_handle=%d, anz_fhandles=%d, fn=%s", + rethandle, anz_fhandles, unixname)); + return(rethandle); +} + +static int free_file_handle(int fhandle) +{ + int result=-0x88; + if (fhandle > 0 && (fhandle <= anz_fhandles)) { + FILE_HANDLE *fh=&(file_handles[fhandle-1]); + if (fh->fd > -1) { + if (fh->flags & 2) { + if (fh->f) pclose(fh->f); + fh->f = NULL; + } else close(fh->fd); + if (fh->tmodi > 0L && !(fh->flags & 2)) { + /* now set date and time */ + struct utimbuf ut; + ut.actime = ut.modtime = fh->tmodi; + utime(fh->fname, &ut); + fh->tmodi = 0L; + } + } + fh->fd = -1; + if (fhandle == anz_fhandles && !(fh->flags & 4)) { + /* was last */ + anz_fhandles--; + while (anz_fhandles && file_handles[anz_fhandles-1].fd == -1 + && !(file_handles[anz_fhandles-1].flags & 4) ) + anz_fhandles--; + } + result=0; + } + XDPRINTF((5, 0, "free_file_handle=%d, anz_fhandles=%d, result=%d", + fhandle, anz_fhandles, result)); + return(result); /* wrong filehandle */ +} + +void init_file_module(void) +{ + int k = -1; + while (k++ < anz_fhandles) free_file_handle(k); + anz_fhandles = 0; +} + +int file_creat_open(int volume, uint8 *unixname, struct stat *stbuff, + int attrib, int access, int creatmode) +/* + * creatmode: 0 = open | 1 = creat | 2 = creatnew & 4 == save handle + * attrib ?? + * access: 0x1=read, 0x2=write + */ +{ + int fhandle=new_file_handle(unixname); + if (fhandle > 0){ + FILE_HANDLE *fh=&(file_handles[fhandle-1]); + int completition = -0xff; /* no File Found */ + if (get_volume_options(volume, 1) & VOL_OPTION_IS_PIPE) { + /* this is a PIPE Dir */ + int statr = stat(fh->fname, stbuff); + if (!statr && (stbuff->st_mode & S_IFMT) != S_IFDIR) { + char pipecommand[300]; + char *pipeopen = (creatmode || (access & 2)) ? "w" : "r"; + char *topipe = "READ"; + if (creatmode) topipe = "CREAT"; + else if (access & 2) topipe = "WRITE"; + sprintf(pipecommand, "%s %s", fh->fname, topipe); + fh->f = popen(pipecommand, pipeopen); + fh->fd = (fh->f) ? fileno(fh->f) : -1; + if (fh->fd > -1) { + fh->flags |= 2; + if (creatmode & 4) fh->flags |= 4; + return(fhandle); + } + } + } else { + if (creatmode) { /* creat File */ + if (creatmode & 0x2) { /* creatnew */ + if (!stat(fh->fname, stbuff)) { + XDPRINTF((5,0,"CREAT File exist!! :%s:", fh->fname)); + fh->fd = -1; + completition = -0x85; /* No Priv */ + } else { + XDPRINTF((5,0,"CREAT FILE:%s: Handle=%d", fh->fname, fhandle)); + fh->fd = creat(fh->fname, 0777); + if (fh->fd < 0) completition = -0x84; /* no create Rights */ + } + } else { + XDPRINTF((5,0,"CREAT FILE, ever with attrib:0x%x, access:0x%x, fh->fname:%s: handle:%d", + attrib, access, fh->fname, fhandle)); + fh->fd = open(fh->fname, O_CREAT|O_TRUNC|O_RDWR, 0777); + if (fh->fd < 0) completition = -0x85; /* no delete /create Rights */ + } + if (fh->fd > -1) { + close(fh->fd); + fh->fd = open(fh->fname, O_RDWR); + fh->offd = 0L; + stat(fh->fname, stbuff); + } + } else { + int statr = stat(fh->fname, stbuff); + int acm = (access & 2) ? (int) O_RDWR /*|O_CREAT*/ : (int)O_RDONLY; + if ( (!statr && (stbuff->st_mode & S_IFMT) != S_IFDIR) + || (statr && (acm & O_CREAT))){ + XDPRINTF((5,0,"OPEN FILE with attrib:0x%x, access:0x%x, fh->fname:%s: fhandle=%d",attrib,access, fh->fname, fhandle)); + fh->fd = open(fh->fname, acm, 0777); + fh->offd = 0L; + if (fh->fd > -1) { + if (statr) stat(fh->fname, stbuff); + } else completition = -0x9a; + } + } + if (fh->fd > -1) { + if (creatmode & 4) fh->flags |= 4; + return(fhandle); + } + } /* else (NOT DEVICE) */ + XDPRINTF((5,0,"OPEN FILE not OK ! fh->name:%s: fhandle=%d",fh->fname, fhandle)); + free_file_handle(fhandle); + return(completition); + } else return(-0x81); /* no more File Handles */ +} + +int nw_set_fdate_time(uint32 fhandle, uint8 *datum, uint8 *zeit) +{ + if (fhandle > 0 && (--fhandle < anz_fhandles) ) { + FILE_HANDLE *fh=&(file_handles[fhandle]); + if (fh->fd > -1) { + fh->tmodi = nw_2_un_time(datum, zeit); + return(0); + } + } + return(-0x88); /* wrong filehandle */ +} + +int nw_close_datei(int fhandle, int reset_reuse) +{ + XDPRINTF((5, 0, "nw_close_datei handle=%d", fhandle)); + if (fhandle > 0 && (fhandle <= anz_fhandles)) { + FILE_HANDLE *fh=&(file_handles[fhandle-1]); + if (reset_reuse) fh->flags &= (~4); + if (fh->fd > -1) { + int result = 0; + int result2; + if (fh->flags & 2) { + if (fh->f) { + result=pclose(fh->f); + if (result) result = -1; + } + fh->f = NULL; + } else result=close(fh->fd); + fh->fd = -1; + if (fh->tmodi > 0L && !(fh->flags&2)) { + struct utimbuf ut; + ut.actime = ut.modtime = fh->tmodi; + utime(fh->fname, &ut); + fh->tmodi = 0L; + } +#ifdef TEST_FNAME + if (fhandle == test_handle) { + test_handle = -1; + nw_debug = -99; + } +#endif + result2=free_file_handle(fhandle); + return((result == -1) ? -0xff : result2); + } else return(free_file_handle(fhandle)); + } + return(-0x88); /* wrong filehandle */ +} + +uint8 *file_get_unix_name(int fhandle) +{ + if (fhandle > 0 && (--fhandle < anz_fhandles)) { + return((uint8*)file_handles[fhandle].fname); + } + return(NULL); +} + +int nw_read_datei(int fhandle, uint8 *data, int size, uint32 offset) +{ + if (fhandle > 0 && (--fhandle < anz_fhandles)) { + FILE_HANDLE *fh=&(file_handles[fhandle]); + if (fh->fd > -1) { + if (fh->offd != (long)offset) + fh->offd=lseek(fh->fd, offset, SEEK_SET); + if (fh->offd > -1L) { + size = read(fh->fd, data, size); + fh->offd+=(long)size; + } else size = -1; + return(size); + } + } + return(- 0x88); /* wrong filehandle */ +} + +int nw_seek_datei(int fhandle, int modus) +{ + if (fhandle > 0 && (--fhandle < anz_fhandles)) { + FILE_HANDLE *fh=&(file_handles[fhandle]); + if (fh->fd > -1) { + int size=-0xfb; + if (!modus) { + if ( (size=fh->offd=lseek(fh->fd, 0L, SEEK_END)) < 0L) + size = -1; + } + return(size); + } + } + return(-0x88); /* wrong filehandle */ +} + + +int nw_write_datei(int fhandle, uint8 *data, int size, uint32 offset) +{ + if (fhandle > 0 && (--fhandle < anz_fhandles)) { + FILE_HANDLE *fh=&(file_handles[fhandle]); + if (fh->fd > -1) { + if (fh->offd != (long)offset) + fh->offd = lseek(fh->fd, offset, SEEK_SET); + if (size) { + if (fh->offd > -1L) { + size = write(fh->fd, data, size); + fh->offd+=(long)size; + } else size = -1; + return(size); + } else { /* strip FILE */ + /* TODO: for LINUX */ + struct flock flockd; + int result= /* -1 */ 0; + flockd.l_type = 0; + flockd.l_whence = SEEK_SET; + flockd.l_start = offset; + flockd.l_len = 0; +#if HAVE_TLI + result = fcntl(fh->fd, F_FREESP, &flockd); + XDPRINTF((5,0,"File %s is stripped, result=%d", fh->fname, result)); +#endif + return(result); + } + } + } + return(- 0x88); /* wrong filehandle */ +} + +int nw_server_copy(int qfhandle, uint32 qoffset, + int zfhandle, uint32 zoffset, + uint32 size) +{ + if (qfhandle > 0 && (--qfhandle < anz_fhandles) + && zfhandle > 0 && (--zfhandle < anz_fhandles) ) { + FILE_HANDLE *fhq=&(file_handles[qfhandle]); + FILE_HANDLE *fhz=&(file_handles[zfhandle]); + int retsize = -1; + if (fhq->fd > -1 && fhz->fd > -1) { + char buff[2048]; + int wsize; + if (lseek(fhq->fd, qoffset, SEEK_SET) > -1L && + lseek(fhz->fd, zoffset, SEEK_SET) > -1L) { + retsize = 0; + while (size && !retsize) { + int xsize = read(fhq->fd, buff, min(size, (uint32)sizeof(buff))); + if (xsize > 0){ + if ((wsize =write(fhz->fd, buff, xsize)) != xsize) { + retsize = -0x1; /* out of Disk SPace */ + break; + } else { + size -= (uint32)xsize; + retsize += wsize; + } + } else { + if (xsize < 0) retsize=-0x93; /* no read privilegs */ + break; + } + } + } + fhq->offd = -1L; + fhz->offd = -1L; +/* + if (!retsize) (retsize=fhz->offd=lseek(fhz->fd, 0L, SEEK_END)); +*/ + return(retsize); + } + } + return(- 0x88); /* wrong filehandle */ +} + + +int nw_lock_datei(int fhandle, int offset, int size, int do_lock) +{ + if (fhandle > 0 && (--fhandle < anz_fhandles)) { + FILE_HANDLE *fh=&(file_handles[fhandle]); + if (fh->fd > -1) { + struct flock flockd; + int result; + flockd.l_type = (do_lock) ? F_WRLCK : F_UNLCK; + flockd.l_whence = SEEK_SET; + flockd.l_start = offset; + flockd.l_len = size; + result = fcntl(fh->fd, F_SETLK, &flockd); + if (!result) return(0); + else return(-0x21); /* LOCK Violation */ + } + } + return(-0x88); /* wrong filehandle */ +} + + + + diff --git a/nwfile.h b/nwfile.h new file mode 100644 index 0000000..139d623 --- /dev/null +++ b/nwfile.h @@ -0,0 +1,38 @@ +/* nwfile.h 23-Jan-96 */ +#ifndef _NWFILE_H_ +#define _NWFILE_H_ + +typedef struct { + int fd; /* filehandle from system open/creat */ + long offd; /* aktuell file offset */ + time_t tmodi; /* modification TIME */ + FILE *f; /* for PIPE */ + int flags; /* 2 = PIPE */ + /* 4 = don't reuse after close */ + char fname[256]; /* UNIX filename */ +} FILE_HANDLE; + +extern void init_file_module(void); + +extern int file_creat_open(int volume, uint8 *unixname, + struct stat *stbuff, + int attrib, int access, int creatmode); + +extern int nw_set_fdate_time(uint32 fhandle, uint8 *datum, uint8 *zeit); + + +extern int nw_close_datei(int fhandle, int reset_reuse); + +extern uint8 *file_get_unix_name(int fhandle); + +extern int nw_read_datei(int fhandle, uint8 *data, int size, uint32 offset); +extern int nw_seek_datei(int fhandle, int modus); +extern int nw_write_datei(int fhandle, uint8 *data, int size, uint32 offset); +extern int nw_server_copy(int qfhandle, uint32 qoffset, + int zfhandle, uint32 zoffset, + uint32 size); + +extern int nw_lock_datei(int fhandle, int offset, int size, int do_lock); + + +#endif diff --git a/nwroute.c b/nwroute.c index b036289..ce48897 100644 --- a/nwroute.c +++ b/nwroute.c @@ -1,4 +1,4 @@ -/* nwroute.c 14-Jan-96 */ +/* nwroute.c 08-Feb-96 */ /* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany * * This program is free software; you can redistribute it and/or modify @@ -190,9 +190,12 @@ void insert_delete_server(uint8 *name, /* Server Name */ nr->hops = 0xffff; } else if (do_delete) { nr=nw_servers[k]; +#if !FILE_SERVER_INACTIV 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); + !IPXCMPNET (nr->addr.net, my_server_adr.net) ) +#endif + { + ins_del_bind_net_addr(nr->name, nr->typ, NULL); xfree(nr->name); memset(nr, 0, sizeof(NW_SERVERS)); } @@ -200,13 +203,15 @@ void insert_delete_server(uint8 *name, /* Server Name */ } else nr=nw_servers[k]; /* here now i perhaps must change the entry */ if (nr->hops > 16 || memcmp(&(nr->addr), addr, sizeof(ipxAddr_t))) { - ins_del_bind_net_addr(nr->name, addr); + ins_del_bind_net_addr(nr->name, nr->typ, addr); memcpy(&(nr->addr), addr, sizeof(ipxAddr_t)); +#if !FILE_SERVER_INACTIV if (IPXCMPNODE(from_addr->node, my_server_adr.node) && IPXCMPNET (from_addr->net, my_server_adr.net) && GET_BE16(from_addr->sock) == SOCK_SAP) { hops = 0; } +#endif } if (hops <= nr->hops && 0 != (net = GET_BE32(from_addr->net)) ) { nr->net = net; @@ -384,6 +389,48 @@ void handle_rip(int fd, int ipx_pack_typ, } /* <========================= SAP ============================> */ +void send_server_response(int respond_typ, + int styp, ipxAddr_t *to_addr) +/* respond_typ 2 = general, 4 = nearest service respond */ +{ + IPX_DATA ipx_data; + int j=-1; + int tics=99; + int hops=15; + int entry = -1; + memset(&ipx_data, 0, sizeof(ipx_data.sip)); + while (++j < anz_servers) { + NW_SERVERS *nw=nw_servers[j]; + if (nw->typ == styp && nw->name && *(nw->name)) { + int xtics=999; + if (nw->net != internal_net) { + NW_NET_DEVICE *nd=find_netdevice(nw->net); + if (nd) xtics = nd->ticks; + } else xtics =0; + if (xtics < tics || (xtics == tics && nw->hops <= hops)) { + tics = xtics; + hops = nw->hops; + entry = j; + } + } + } + if (entry > -1) { + NW_SERVERS *nw=nw_servers[entry]; + strcpy((char*)ipx_data.sip.server_name, nw->name); + memcpy(&ipx_data.sip.server_adr, &nw->addr, sizeof(ipxAddr_t)); + XDPRINTF((4, 0, "NEAREST SERVER=%s, typ=0x%x, tics=%d, hops=%d", + nw->name, styp, tics, hops)); + U16_TO_BE16(respond_typ, ipx_data.sip.response_type); + U16_TO_BE16(styp, ipx_data.sip.server_type); + U16_TO_BE16(hops, ipx_data.sip.intermediate_networks); + send_ipx_data(sockfd[SAP_SLOT], + 4, /* this is the official packet typ for SAP's */ + sizeof(ipx_data.sip), + (char *)&(ipx_data.sip), + to_addr, "Nearest Server Response"); + } +} + static void send_sap_broadcast(int mode) /* mode=0, standard broadcast */ /* mode=1, first trie */ @@ -448,9 +495,20 @@ void send_sap_rip_broadcast(int mode) /* mode=1, first trie */ /* mode=2, shutdown */ { - send_sap_broadcast(mode); - send_rip_broadcast(mode); - if (!mode) { +static int flipflop=0; + if (mode) { + send_sap_broadcast(mode); + send_rip_broadcast(mode); + } else { + if (flipflop) { + send_rip_broadcast(mode); + flipflop=0; + } else { + send_sap_broadcast(mode); + flipflop=1; + } + } + if (!mode && flipflop) { /* jedes 2. mal */ FILE *f= open_route_info_fn(); if (f) { int k=-1; diff --git a/nwroute1.c b/nwroute1.c new file mode 100644 index 0000000..4482a37 --- /dev/null +++ b/nwroute1.c @@ -0,0 +1,172 @@ +/* nwroute1.c 08-Feb-96 */ +/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany + * + * 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 of the License, 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 "net.h" +#include "nwserv.h" + +/* this should be removed one time if there is a good */ +/* sapdaemon <-> nwserv handling */ +typedef struct { + uint8 *name; /* Server Name */ + int typ; /* Server Typ */ + ipxAddr_t addr; /* Server Addr */ +} NW_SERVERS; + +static int anz_servers=0; +static NW_SERVERS *nw_servers[MAX_NW_SERVERS]; + +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 */ + int flags) +{ + int k=-1; + int freeslot=-1; + uint32 net; + uint8 sname[MAX_SERVER_NAME+2]; + NW_SERVERS *nr=NULL; + strmaxcpy(sname, name, MAX_SERVER_NAME); + upstr(sname); + XDPRINTF((3, 0, "%s %s %s,0x%04x", + visable_ipx_adr(addr), + (do_delete) ? "DEL" : "INS", sname, (int) styp)); + k=-1; + + if (!*sname) return; + while (++k < anz_servers && (nw_servers[k]->typ != styp || + !nw_servers[k]->name || strcmp((char*)nw_servers[k]->name, (char*)sname)) ) { + if (freeslot < 0 && !nw_servers[k]->typ) freeslot=k; + } + if (k == anz_servers) { /* server not found */ + if (do_delete) return; /* nothing to delete */ + if (freeslot < 0) { + 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)); + anz_servers++; + } else k=freeslot; + nr = nw_servers[k]; + new_str(nr->name, sname); + nr->typ = styp; + memset(&(nr->addr), 0, sizeof(ipxAddr_t)); + } else if (do_delete) { + nr=nw_servers[k]; + if (!IPXCMPNODE(nr->addr.node, my_server_adr.node) || + !IPXCMPNET (nr->addr.net, my_server_adr.net) ) { + ins_del_bind_net_addr(nr->name, nr->typ, NULL); + xfree(nr->name); + memset(nr, 0, sizeof(NW_SERVERS)); + } + return; + } else nr=nw_servers[k]; + /* here now i perhaps must change the entry */ + if (memcmp(&(nr->addr), addr, sizeof(ipxAddr_t))) { + ins_del_bind_net_addr(nr->name, nr->typ, addr); + memcpy(&(nr->addr), addr, sizeof(ipxAddr_t)); + } +} + +void rip_for_net(uint32 net) +{ +; +} + +void handle_rip(int fd, int ipx_pack_typ, + int data_len, IPX_DATA *ipxdata, + ipxAddr_t *from_addr) +{ +; +} + + +void send_server_response(int respond_typ, + int styp, ipxAddr_t *to_addr) +{ + ;; /* dummy */ +} + +void get_servers(void) +{ +#if 1 + SQP sqp; + ipxAddr_t wild; + memset(&wild, 0, sizeof(ipxAddr_t)); +#ifdef xxxLINUX + U32_TO_BE32(internal_net, wild.net); + memcpy(wild.node, my_server_adr.node, IPX_NODE_SIZE); +#else + memset(wild.node, 0xFF, IPX_NODE_SIZE); +#endif + U16_TO_BE16(SOCK_SAP, wild.sock); + U16_TO_BE16(1, sqp.query_type); + U16_TO_BE16(4, sqp.server_type); + send_ipx_data(sockfd[SAP_SLOT], 17, sizeof(SQP), + (char*)&sqp, &wild, "SERVER Query"); +#endif +} + +void send_sap_rip_broadcast(int mode) +/* mode=0, standard broadcast */ +/* mode=1, first trie */ +/* mode=2, shutdown */ +{ + IPX_DATA ipx_data; + ipxAddr_t wild; + memset(&wild, 0, sizeof(ipxAddr_t)); +#ifdef xxxLINUX + U32_TO_BE32(internal_net, wild.net); + memcpy(wild.node, my_server_adr.node, IPX_NODE_SIZE); +#else + memset(wild.node, 0xFF, IPX_NODE_SIZE); +#endif + U16_TO_BE16(SOCK_SAP, wild.sock); + memset(&ipx_data, 0, sizeof(ipx_data.sip)); + strcpy((char *)ipx_data.sip.server_name, my_nwname); + memcpy(&ipx_data.sip.server_adr, &my_server_adr, sizeof(ipxAddr_t)); + U16_TO_BE16(SOCK_NCP, ipx_data.sip.server_adr.sock); + U16_TO_BE16(2, ipx_data.sip.response_type); + U16_TO_BE16(4, ipx_data.sip.server_type); + U16_TO_BE16(mode == 2 ? 16 : 0, ipx_data.sip.intermediate_networks); + send_ipx_data(sockfd[SAP_SLOT], + 4, /* this is the official packet typ for SAP's */ + sizeof(ipx_data.sip), + (char *)&(ipx_data.sip), + &wild, "SIP Broadcast"); + if (!mode) get_servers(); + if (mode == 1) { + U16_TO_BE16(SOCK_SAP, wild.sock); + memset(&ipx_data, 0, sizeof(ipx_data.sip)); + strcpy((char *)ipx_data.sip.server_name, my_nwname); + memcpy(&ipx_data.sip.server_adr, &my_server_adr, sizeof(ipxAddr_t)); + U16_TO_BE16(SOCK_NCP, ipx_data.sip.server_adr.sock); + U16_TO_BE16(2, ipx_data.sip.response_type); + U16_TO_BE16(4, ipx_data.sip.server_type); + U16_TO_BE16(mode == 2 ? 16 : 0, ipx_data.sip.intermediate_networks); + } +} + +int dont_send_wdog(ipxAddr_t *addr) +/* returns != 0 if tics are to high for wdogs */ +{ + return(0); +} diff --git a/nwserv.c b/nwserv.c index 0e71482..b239363 100644 --- a/nwserv.c +++ b/nwserv.c @@ -1,5 +1,5 @@ -/* nwserv.c 14-Jan-96 */ -/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany +/* nwserv.c 08-Feb-96 */ +/* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany * * 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 @@ -30,24 +30,38 @@ int wdogs_till_tics = 0; /* send wdogs to all */ int anz_net_devices=0; NW_NET_DEVICE *net_devices[MAX_NET_DEVICES]; -uint16 ipx_sock_nummern[]={ -#ifdef WDOG_SLOT - 0, /* auto sock */ +uint16 ipx_sock_nummern[]={ SOCK_AUTO /* WDOG */ +#if INTERNAL_RIP_SAP + ,SOCK_SAP +#else + ,SOCK_AUTO #endif - SOCK_SAP, - SOCK_RIP, - SOCK_ROUTE, - SOCK_DIAGNOSE + +#ifdef RIP_SLOT + ,SOCK_RIP +#endif + +#ifdef ROUTE_SLOT + ,SOCK_ROUTE +#endif +#ifdef DIAG_SLOT + ,SOCK_DIAGNOSE +#endif + #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) +#if FILE_SERVER_INACTIV +# define NEEDED_POLLS (NEEDED_SOCKETS) +#else +# define NEEDED_POLLS (NEEDED_SOCKETS+1) +#endif static uint16 sock_nummern [NEEDED_SOCKETS]; @@ -69,7 +83,7 @@ static time_t server_down_stamp = 0; static int server_goes_down_secs = 10; static int save_ipx_routes = 0; - +#if !FILE_SERVER_INACTIV static void write_to_ncpserv(int what, int connection, char *data, int data_size) { @@ -100,8 +114,15 @@ static void write_to_ncpserv(int what, int connection, default : break; } } +#else +static void write_to_ncpserv(int what, int connection, + char *data, int data_size) +{ +;; /* dummy */ +} +#endif -void ins_del_bind_net_addr(char *name, ipxAddr_t *adr) +void ins_del_bind_net_addr(uint8 *name, int styp, ipxAddr_t *adr) { uint8 buf[1024]; uint8 *p = buf; @@ -109,9 +130,9 @@ void ins_del_bind_net_addr(char *name, ipxAddr_t *adr) if (NULL != adr) { /* insert */ *p=0x01; p+=2; len+=2; - U16_TO_BE16(0x4, p); + U16_TO_BE16(styp, p); p+=2; len+=2; - *p = strlen(name); + *p = strlen((char*)name); strmaxcpy(p+1, name, *p); len += (*p+1); p+=(*p + 1); memcpy(p, adr, sizeof(ipxAddr_t)); @@ -119,31 +140,33 @@ void ins_del_bind_net_addr(char *name, ipxAddr_t *adr) } else { /* delete */ *p=0x02; p+=2; len+=2; - U16_TO_BE16(0x4, p); + U16_TO_BE16(styp, p); p+=2; len+=2; - *p = strlen(name); + *p = strlen((char*)name); strmaxcpy(p+1, name, *p); len += (*p+1); p+=(*p + 1); } - write_to_ncpserv(0x3333, 0, buf, len); + write_to_ncpserv(0x3333, 0, (char *)buf, len); } static int open_ipx_socket(uint16 sock_nr, int nr, int open_mode) { int ipx_fd=t_open("/dev/ipx", open_mode, NULL); - struct t_bind bind; + struct t_bind bind; if (ipx_fd < 0) { t_error("t_open !Ok"); return(-1); } + memset(&my_server_adr, 0, sizeof(ipxAddr_t)); U16_TO_BE16(sock_nr, my_server_adr.sock); /* actual read socket */ bind.addr.len = sizeof(ipxAddr_t); bind.addr.maxlen = sizeof(ipxAddr_t); bind.addr.buf = (char*)&my_server_adr; bind.qlen = 0; /* ever */ + if (t_bind(ipx_fd, &bind, &bind) < 0){ char sxx[200]; - sprintf(sxx,"NWSERV:t_bind !OK in open_ipx_socket, sock=%d", sock_nr); + sprintf(sxx,"NWSERV:t_bind !OK in open_ipx_socket, sock=0x%x", (int) sock_nr); t_error(sxx); t_close(ipx_fd); return(-1); @@ -155,11 +178,13 @@ static int open_ipx_socket(uint16 sock_nr, int nr, int open_mode) static int start_ncpserv(char *nwname, ipxAddr_t *addr) { +#if !FILE_SERVER_INACTIV int fds_out[2]; int fds_in[2]; int pid; if (pipe(fds_out) < 0 || pipe(fds_in) < 0) return(-1); + switch (pid=fork()) { case 0 : { /* new Process */ char *progname="ncpserv"; @@ -192,6 +217,7 @@ static int start_ncpserv(char *nwname, ipxAddr_t *addr) fds_in[1] = -1; fd_ncpserv_in = fds_in[0]; pid_ncpserv = pid; +#endif return(0); /* OK */ } @@ -237,7 +263,7 @@ static void send_wdog_packet(ipxAddr_t *addr, int conn, int what) 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"); + send_ipx_data(sockfd[WDOG_SLOT], 17, 2, (char*)data, addr, "WDOG"); } static void send_bcast_packet(ipxAddr_t *addr, int conn, int signature) @@ -249,7 +275,7 @@ static void send_bcast_packet(ipxAddr_t *addr, int conn, int signature) * '!' = broadcast waiting inform * '@' = sft_iii server change over inform. */ - send_ipx_data(sockfd[WDOG_SLOT], 17, 2, data, addr, "BCAST"); + send_ipx_data(sockfd[WDOG_SLOT], 17, 2, (char*)data, addr, "BCAST"); } typedef struct { @@ -347,28 +373,6 @@ 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) -{ - IPX_DATA ipx_data; - memset(&ipx_data, 0, sizeof(ipx_data.sip)); - strcpy(ipx_data.sip.server_name, my_nwname); - memcpy(&ipx_data.sip.server_adr, &my_server_adr, sizeof(ipxAddr_t)); - - U16_TO_BE16(SOCK_NCP, ipx_data.sip.server_adr.sock); - /* NCP SOCKET verwenden */ - - U16_TO_BE16(respond_typ, ipx_data.sip.response_type); - 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"); -} - void get_server_data(char *name, ipxAddr_t *adr, ipxAddr_t *from_addr) @@ -392,19 +396,15 @@ static void handle_sap(int fd, { int query_type = GET_BE16(ipxdata->sqp.query_type); int server_type = GET_BE16(ipxdata->sqp.server_type); + if (query_type == 3) { XDPRINTF((2,0,"SAP NEAREST SERVER request typ=%d von %s", server_type, visable_ipx_adr(from_addr))); - if (server_type == 4) { - /* Get Nearest File Server */ - send_server_respons(fd, ipx_pack_typ, 4, server_type, from_addr); - } + /* Get Nearest File Server */ + send_server_response(4, server_type, from_addr); } else if (query_type == 1) { /* general Request */ XDPRINTF((2,0, "SAP GENERAL request server_type =%d", server_type)); - if (server_type == 4) { - /* Get General File Server Request */ - send_server_respons(fd, ipx_pack_typ, 4, server_type, from_addr); - } + send_server_response(2, server_type, from_addr); } else if (query_type == 2 || query_type == 4) { /* periodic general or shutdown response (2) * or nearests Service Response (4) @@ -421,17 +421,16 @@ static void handle_sap(int fd, XDPRINTF((2,0, "TYP=%2d,hops=%2d, Addr=%s, Name=%s", type, hops, visable_ipx_adr(ad), name)); - if (type == 4) /* && strcmp(name, my_nwname)) */ { /* from Fileserver */ + if (type == 4) { /* from Fileserver */ if (16 == hops) { /* shutdown */ XDPRINTF((2,0, "SERVER %s IS GOING DOWN", name)); insert_delete_server(name, type, NULL, NULL, 16, 1, 0); } else { - get_server_data(name, ad, from_addr); + get_server_data((char*)name, ad, from_addr); insert_delete_server(name, type, ad, from_addr, hops, 0, 0); } } - p+=sizeof(SAPS); } /* while */ } else { @@ -470,6 +469,7 @@ static void handle_sap(int fd, #endif +#ifdef DIAG_SLOT static void response_ipx_diag(int fd, int ipx_pack_typ, ipxAddr_t *to_addr) { @@ -523,6 +523,7 @@ static void handle_diag(int fd, int ipx_pack_typ, (int)ipx_pack_typ, data_len, count)); response_ipx_diag(fd, ipx_pack_typ, from_addr); } +#endif static void handle_event(int fd, uint16 socknr, int slot) { @@ -565,6 +566,7 @@ static void handle_event(int fd, uint16 socknr, int slot) if (server_down_stamp) return; /* no more interests */ +#if INTERNAL_RIP_SAP if ( IPXCMPNODE(source_adr.node, my_server_adr.node) && IPXCMPNET (source_adr.net, my_server_adr.net)) { @@ -579,11 +581,17 @@ static void handle_event(int fd, uint16 socknr, int slot) /* it also can be Packets from DOSEMU OR ncpfs on this machine */ XDPRINTF((2,0,"Packet from OWN maschine:sock=0x%x", source_sock)); } +#endif - switch (socknr) { - case SOCK_SAP : handle_sap( fd, (int) ipx_pack_typ, ud.udata.len, &ipx_data_buff, &source_adr); break; - case SOCK_RIP : handle_rip( fd, (int) ipx_pack_typ, ud.udata.len, &ipx_data_buff, &source_adr); break; - case SOCK_DIAGNOSE : handle_diag(fd, (int) ipx_pack_typ, ud.udata.len, &ipx_data_buff, &source_adr); break; + switch (slot) { + case SAP_SLOT : handle_sap( fd, (int) ipx_pack_typ, ud.udata.len, &ipx_data_buff, &source_adr); break; +#ifdef RIP_SLOT + case RIP_SLOT : handle_rip( fd, (int) ipx_pack_typ, ud.udata.len, &ipx_data_buff, &source_adr); break; +#endif + +#ifdef DIAG_SLOT + case DIAG_SLOT : handle_diag(fd, (int) ipx_pack_typ, ud.udata.len, &ipx_data_buff, &source_adr); break; +#endif default : if (WDOG_SLOT == slot) { /* this is a watchdog packet */ @@ -610,6 +618,54 @@ static void handle_event(int fd, uint16 socknr, int slot) } } +#if 0 +static int get_ipx_addr(ipxAddr_t *addr) +{ + int fd=t_open("/dev/ipx", O_RDWR, NULL); + struct t_optmgmt optb; + int result = -1; + if (fd < 0) { + t_error("t_open !Ok"); + return(-1); + } + optb.opt.maxlen = optb.opt.len = sizeof(ipxAddr_t); + optb.opt.buf = (char*)addr; + optb.flags = 0; + result = t_optmgmt(fd, &optb, &optb); + if (result < 0) t_error("t_optmgmt !Ok"); + else result=0; + t_close(fd); + return(result); +} +#else + +static int get_ipx_addr(ipxAddr_t *addr) +{ + int fd=t_open("/dev/ipx", O_RDWR, NULL); + struct t_bind bind; + int result = -1; + if (fd < 0) { + t_error("t_open !Ok"); + return(-1); + } + bind.addr.len = sizeof(ipxAddr_t); + bind.addr.maxlen = sizeof(ipxAddr_t); + bind.addr.buf = (char*)addr; + bind.qlen = 0; /* ever */ + memset(addr, 0, sizeof(ipxAddr_t)); + + if (t_bind(fd, &bind, &bind) < 0) + t_error("tbind:get_ipx_addr"); + else { + result=0; + t_unbind(fd); + } + t_close(fd); + return(result); +} +#endif + + static void get_ini(int full) { FILE *f = open_nw_ini(); @@ -617,7 +673,7 @@ static void get_ini(int full) uint32 node = 1; /* default 1 */ if (full) { gethostname(my_nwname, 48); - upstr(my_nwname); + upstr((uint8*)my_nwname); } if (f){ char buff[500]; @@ -635,7 +691,7 @@ static void get_ini(int full) case 2 : if (full) { strncpy(my_nwname, inhalt, 48); my_nwname[47] = '\0'; - upstr(my_nwname); + upstr((uint8*)my_nwname); } break; @@ -650,6 +706,7 @@ static void get_ini(int full) } break; +#if INTERNAL_RIP_SAP case 4 : if (full) { if (anz_net_devices < MAX_NET_DEVICES && @@ -682,7 +739,7 @@ static void get_ini(int full) } } break; -#ifdef LINUX + case 5 : save_ipx_routes=atoi(inhalt); break; #endif @@ -700,7 +757,7 @@ static void get_ini(int full) case 300 : print_route_tac=atoi(inhalt); break; - case 301 : new_str(pr_route_info_fn, inhalt); + case 301 : new_str(pr_route_info_fn, (uint8*)inhalt); break; case 302 : print_route_mode=atoi(inhalt); @@ -721,6 +778,7 @@ static void get_ini(int full) if (!print_route_tac) xfree(pr_route_info_fn); if (full) { #ifdef LINUX +# if INTERNAL_RIP_SAP init_ipx(internal_net, node, ipxdebug); for (k=0; k < anz_net_devices; k++){ NW_NET_DEVICE *nd=net_devices[k]; @@ -736,7 +794,9 @@ static void get_ini(int full) nd->devname, frname, nd->net)); init_dev(nd->devname, nd->frame, nd->net); } +# endif #endif + if (!get_ipx_addr(&my_server_adr)) { internal_net = GET_BE32(my_server_adr.net); } else exit(1); @@ -781,6 +841,7 @@ static void close_all(void) } #ifdef LINUX +# if INTERNAL_RIP_SAP if (!save_ipx_routes) { for (j=0; j server_goes_down_secs) break; } else { - if (akttime_stamp - broadtime > (broadsecs / 1000)) { /* ca. 60 seconds */ + if (akttime_stamp - broadtime > (broadsecs / 1000)) { /* ca. 30 seconds */ send_sap_rip_broadcast((broadsecs<3000) ? 1 :0); /* firsttime broadcast */ - if (broadsecs < 32000) { + if (broadsecs < 30000) { rip_for_net(MAX_U32); get_servers(); broadsecs *= 2; + if (broadsecs > 30000) +#if INTERNAL_RIP_SAP + broadsecs = 30000; /* every 30 sec. */ +#else + broadsecs = 60000; /* every 60 sec. */ +#endif } send_wdogs(); broadtime = akttime_stamp; diff --git a/nwserv.h b/nwserv.h index 55aea4a..4fbb324 100644 --- a/nwserv.h +++ b/nwserv.h @@ -1,4 +1,4 @@ -/* nwserv.h 14-Jan-96 */ +/* nwserv.h 30-Jan-96 */ /* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany * * This program is free software; you can redistribute it and/or modify @@ -36,19 +36,25 @@ extern int anz_net_devices; extern NW_NET_DEVICE *net_devices[]; /* <======== SOCKETS =========> */ -#define WDOG_SLOT 0 /* Watchdog send + recv */ -#define SAP_SLOT 1 -#define RIP_SLOT (SAP_SLOT +1) -#define ROUTE_SLOT (RIP_SLOT +1) -#define DIAG_SLOT (ROUTE_SLOT +1) -#if 0 -#define ECHO_SLOT (DIAG_SLOT +1) -#define ERR_SLOT (ECHO_SLOT +1) +#define WDOG_SLOT 0 /* Watchdog send + recv */ +#define SAP_SLOT 1 /* SAP wellkwon or dynamic */ + +#if INTERNAL_RIP_SAP +# define RIP_SLOT (SAP_SLOT +1) +# if 0 +# define ROUTE_SLOT (RIP_SLOT +1) +# define DIAG_SLOT (ROUTE_SLOT +1) +# define ECHO_SLOT (DIAG_SLOT +1) +# define ERR_SLOT (ECHO_SLOT +1) +# endif #endif extern int sockfd[]; -extern void ins_del_bind_net_addr(char *name, ipxAddr_t *adr); +extern void ins_del_bind_net_addr(uint8 *name, int styp, ipxAddr_t *adr); +extern void send_server_response(int respond_typ, + int styp, ipxAddr_t *to_addr); + extern void send_sap_rip_broadcast(int mode); extern void rip_for_net(uint32 net); extern void get_servers(void); diff --git a/nwvolume.c b/nwvolume.c index b938d14..d9d60ee 100644 --- a/nwvolume.c +++ b/nwvolume.c @@ -1,4 +1,4 @@ -/* nwvolume.c 15-Jan-96 */ +/* nwvolume.c 07-Feb-96 */ /* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany * * This program is free software; you can redistribute it and/or modify @@ -20,6 +20,12 @@ #include #include + +#ifndef LINUX +#include +#define statfs statvfs +#endif + #include #include "nwvolume.h" @@ -74,6 +80,9 @@ void nw_init_volumes(FILE *f) case 'p' : nw_volumes[used_nw_volumes].options |= VOL_OPTION_IS_PIPE; break; + case 'm' : nw_volumes[used_nw_volumes].options + |= VOL_OPTION_REMOUNT; break; + default : break; } } @@ -181,7 +190,7 @@ int nw_get_volume_name(int volnr, uint8 *volname) if (volnr < MAX_NW_VOLS) result=0; } if (nw_debug > 4) { - char xvolname[10]; + uint8 xvolname[10]; if (!volname) { volname = xvolname; *volname = '\0'; @@ -220,10 +229,10 @@ static int get_fs_usage(char *path, struct fs_usage *fsp) return(0); } -int nw_get_fs_usage(char *volname, struct fs_usage *fsu) +int nw_get_fs_usage(uint8 *volname, struct fs_usage *fsu) /* returns 0 if OK, else errocode < 0 */ { - int volnr = nw_get_volume_number(volname, strlen(volname)); + int volnr = nw_get_volume_number(volname, strlen((char*)volname)); return((volnr>-1 && !get_fs_usage(nw_volumes[volnr].unixname, fsu)) ? 0 : -1); } diff --git a/nwvolume.h b/nwvolume.h index abaa397..7661ad9 100644 --- a/nwvolume.h +++ b/nwvolume.h @@ -1,4 +1,4 @@ -/* nwvolume.h 15-Jan-96 */ +/* nwvolume.h 07-Feb-96 */ /* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany * * This program is free software; you can redistribute it and/or modify @@ -15,6 +15,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#ifndef _NWVOLUME_H_ +#define _NWVOLUME_H_ #define MAX_DEV_NAMESPACE_MAPS 256 @@ -31,16 +33,16 @@ typedef struct { typedef struct { uint8 *sysname; /* VOL_NAME */ - uint8 *unixname; /* UNIX-Verzeichnis */ + uint8 *unixname; /* UNIX-DIR */ int unixnamlen; /* len of unixname */ DEV_NAMESPACE_MAP *dev_namespace_maps[MAX_DEV_NAMESPACE_MAPS]; int maps_count; /* count of dev_namespace_maps */ - uint8 options; /* *_1_* alles in Kleinbuchstaben */ + uint8 options; /* *_1_* all is lowercase */ } NW_VOL; #define VOL_OPTION_DOWNSHIFT 1 -#define VOL_OPTION_IS_PIPE 2 /* Volume has only pipes */ - +#define VOL_OPTION_IS_PIPE 2 /* Volume has only pipes */ +#define VOL_OPTION_REMOUNT 4 /* Volume can be remounted (cdroms) */ /* stolen from GNU-fileutils */ /* Space usage statistics for a filesystem. Blocks are 512-byte. */ @@ -58,7 +60,7 @@ extern int used_nw_volumes; extern void nw_init_volumes(FILE *f); extern int nw_get_volume_number(uint8 *volname, int namelen); extern int nw_get_volume_name(int volnr, uint8 *volname); -extern int nw_get_fs_usage(char *volname, struct fs_usage *fsu); +extern int nw_get_fs_usage(uint8 *volname, struct fs_usage *fsu); extern int get_volume_options(int volnr, int mode); extern uint32 nw_vol_inode_to_handle(int volume, ino_t inode, @@ -66,3 +68,4 @@ extern uint32 nw_vol_inode_to_handle(int volume, ino_t inode, extern ino_t nw_vol_handle_to_inode(int volume, uint32 handle, DEV_NAMESPACE_MAP *dnm); +#endif diff --git a/tools.c b/tools.c index b64e956..467ea23 100644 --- a/tools.c +++ b/tools.c @@ -19,6 +19,13 @@ #include "net.h" #include +#ifndef LINUX +#include +extern int _sys_nerr; +extern char _sys_errlist[]; +#endif + + int nw_debug=0; FILE *logfile=stdout; @@ -27,7 +34,8 @@ static char *modnames[] = { "???????", "NWSERV ", "NCPSERV", - "NWCONN " }; + "NWCONN ", + "NWCLIEN" }; static char *get_modstr(void) { @@ -59,9 +67,9 @@ void x_x_xfree(char **p) } } -int strmaxcpy(char *dest, char *source, int len) +int strmaxcpy(uint8 *dest, uint8 *source, int len) { - int slen = (source != (char *)NULL) ? min(len, strlen(source)) : 0; + int slen = (source != (uint8 *)NULL) ? min(len, strlen((char*)source)) : 0; if (slen) memcpy(dest, source, slen); dest[slen] = '\0'; return(slen); @@ -69,7 +77,7 @@ int strmaxcpy(char *dest, char *source, int len) int x_x_xnewstr(uint8 **p, uint8 *s) { - int len = (s == NULL) ? 0 : strlen(s); + int len = (s == NULL) ? 0 : strlen((char*)s); if (*p != (uint8 *)NULL) free((char*)*p); *p = (uint8*)xmalloc(len+1); if (len) strcpy((char*)(*p), (char*)s); @@ -87,6 +95,7 @@ void dprintf(char *p, ...) va_end(ap); fprintf(logfile, "\n"); fflush(logfile); + fflush(logfile); } } @@ -159,11 +168,11 @@ int get_ini_entry(FILE *f, int entry, char *str, int strsize) if (len > se+1 && se > 0 && se < 4 && ppi){ char sx[10]; int fentry; - strmaxcpy(sx, buff, se); + strmaxcpy((uint8*)sx, (uint8*)buff, se); fentry = atoi(sx); if (fentry > 0 && ((!entry) || entry == fentry)) { if (ppe) *(ppe+1) = '\0'; - strmaxcpy(str, ppi, strsize-1); + strmaxcpy((uint8*)str, (uint8*)ppi, strsize-1); if (do_open) fclose(f); return(fentry); } @@ -194,6 +203,7 @@ void get_ini_debug(int module) * 1 = nwserv * 2 = ncpserv * 3 = nwconn + * 4 = nwclient */ { int debug = get_ini_int(100+module); @@ -222,7 +232,7 @@ void init_tools(int module) while (0 != (what=get_ini_entry(f, 0, buff, sizeof(buff)))) { /* daemonize */ if (200 == what) dodaemon = atoi(buff); else if (201 == what) { - strmaxcpy(logfilename, buff, sizeof(logfilename)-1); + strmaxcpy((uint8*)logfilename, (uint8*)buff, sizeof(logfilename)-1); withlog++; } else if (202 == what) { new_log = atoi(buff); diff --git a/tools.h b/tools.h index 04e39a8..0943322 100644 --- a/tools.h +++ b/tools.h @@ -1,4 +1,4 @@ -/* tools.h : 15-Jan-96 */ +/* tools.h : 28-Jan-96 */ /* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany * @@ -21,6 +21,7 @@ #define NWSERV 1 #define NCPSERV 2 #define NWCONN 3 +#define NWCLIENT 4 extern FILE *logfile; extern void x_x_xfree(char **p); @@ -31,7 +32,7 @@ extern int x_x_xnewstr(uint8 **p, uint8 *s); extern char *xmalloc(uint size); extern char *xcmalloc(uint size); -extern int strmaxcpy(char *dest, char *source, int len); +extern int strmaxcpy(uint8 *dest, uint8 *source, int len); extern void dprintf(char *p, ...); extern void xdprintf(int dlevel, int mode, char *p, ...); extern void errorp(int mode, char *what, char *p, ...); @@ -52,8 +53,10 @@ extern int nw_debug; #ifdef DB # define DPRINTF(x) dprintf x # define XDPRINTF(x) xdprintf x +# define D() XDPRINTF((3, 0, "Z: %d" , __LINE__)); #else # define DPRINTF(x) /* */ # define XDPRINTF(x) /* */ +# define D() /* */ #endif