mars_nwe-0.96.pl08
This commit is contained in:
parent
01778ec986
commit
28334ea9f1
22
CHANGES
22
CHANGES
@ -1,5 +1,5 @@
|
|||||||
Sorry, this is in German only. :-(
|
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
|
Erste 'oeffentliche' Version
|
||||||
^^^^^^^^^^ VERSION 0.94 ^^^^^^^^
|
^^^^^^^^^^ VERSION 0.94 ^^^^^^^^
|
||||||
@ -61,4 +61,24 @@ Erste 'oeffentliche' Version
|
|||||||
net < angebbarer anzahl tics ist. (z.B. fuer IPX ueber ISDN)
|
net < angebbarer anzahl tics ist. (z.B. fuer IPX ueber ISDN)
|
||||||
- Verarbeitung von 'PIPE Jobs' eingebaut.
|
- Verarbeitung von 'PIPE Jobs' eingebaut.
|
||||||
- Bug beim Drucken korrigiert. (nprint funktionierte nicht)
|
- 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.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
21
INSTALL
21
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
|
=========> create programs
|
||||||
1. call make.
|
1. call make.
|
||||||
2. perhaps you must modify mk.li and config.h
|
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
|
nw.ini file gives the time in seconds, before the server
|
||||||
really shuts down.
|
really shuts down.
|
||||||
|
|
||||||
Viel Erfolg / good Luck :-)
|
good luck :-)
|
||||||
|
|
||||||
Martin
|
Martin
|
||||||
(mstover@freeway.de)
|
(mstover@freeway.de)
|
||||||
|
22
INSTALL.ger
22
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
|
=========> Programme erzeugen
|
||||||
1. make aufrufen.
|
1. make aufrufen.
|
||||||
2. mk.li und config.h evtl. anpassen
|
2. mk.li und config.h evtl. anpassen
|
||||||
|
10
Makefile
10
Makefile
@ -1,5 +1,7 @@
|
|||||||
# Makefile mars_nwe: 06-Dec-95
|
# Makefile mars_nwe: 31-Jan-96
|
||||||
|
|
||||||
VPATH=
|
VPATH=
|
||||||
|
|
||||||
all: rmeflag mk.li config.h nw.ini
|
all: rmeflag mk.li config.h nw.ini
|
||||||
@if [ -r .eflag ] ; then \
|
@if [ -r .eflag ] ; then \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
@ -9,7 +11,7 @@ all: rmeflag mk.li config.h nw.ini
|
|||||||
echo "Please make your changes and run make again"; \
|
echo "Please make your changes and run make again"; \
|
||||||
echo "********************************************************"; \
|
echo "********************************************************"; \
|
||||||
echo "";\
|
echo "";\
|
||||||
echo ""; else ./mk.li && (\
|
echo ""; else ./mk.li && (\
|
||||||
if [ -r .mk.notes ] ; then echo "" ; \
|
if [ -r .mk.notes ] ; then echo "" ; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
echo "********************************************************" ; \
|
echo "********************************************************" ; \
|
||||||
@ -61,12 +63,12 @@ config.h: examples/config.h
|
|||||||
echo "and change it to your requirements." >> .eflag ; fi
|
echo "and change it to your requirements." >> .eflag ; fi
|
||||||
|
|
||||||
rmeflag:
|
rmeflag:
|
||||||
@ - rm -f .eflag
|
@- rm -f .eflag
|
||||||
|
|
||||||
nw.ini: examples/nw.ini
|
nw.ini: examples/nw.ini
|
||||||
@if [ -r $@ ] ; then echo "NOTE:examples/$@ is newer then $@" > .mk.notes ; \
|
@if [ -r $@ ] ; then echo "NOTE:examples/$@ is newer then $@" > .mk.notes ; \
|
||||||
echo "please compare examples/$@ with $@" >> .mk.notes; \
|
echo "please compare examples/$@ with $@" >> .mk.notes; \
|
||||||
echo "make the changes you need and touch $@" >> .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 "$@ created (from examples/$@) Please edit $@" > .mk.notes;\
|
||||||
echo "and change it to your requirements." >> .mk.notes ; fi
|
echo "and change it to your requirements." >> .mk.notes ; fi
|
||||||
|
457
connect.c
457
connect.c
@ -1,5 +1,5 @@
|
|||||||
/* connect.c 22-Jan-96 */
|
/* connect.c 23-Jan-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
|
* 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
|
* 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;
|
static int default_gid=-1;
|
||||||
|
|
||||||
#include "nwvolume.h"
|
#include "nwvolume.h"
|
||||||
|
#include "nwfile.h"
|
||||||
#include "connect.h"
|
#include "connect.h"
|
||||||
|
|
||||||
NW_DIR dirs[MAX_NW_DIRS];
|
NW_DIR dirs[MAX_NW_DIRS];
|
||||||
@ -41,13 +42,10 @@ int used_dirs=0;
|
|||||||
|
|
||||||
static int connect_is_init = 0;
|
static int connect_is_init = 0;
|
||||||
|
|
||||||
#define MAX_FILEHANDLES 80
|
|
||||||
#define MAX_DIRHANDLES 80
|
#define MAX_DIRHANDLES 80
|
||||||
|
|
||||||
static FILE_HANDLE file_handles[MAX_FILEHANDLES];
|
|
||||||
static DIR_HANDLE dir_handles[MAX_DIRHANDLES];
|
static DIR_HANDLE dir_handles[MAX_DIRHANDLES];
|
||||||
|
|
||||||
static int anz_fhandles=0;
|
|
||||||
static int anz_dirhandles=0;
|
static int anz_dirhandles=0;
|
||||||
|
|
||||||
static char *build_unix_name(NW_PATH *nwpath, int modus)
|
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 */
|
strcpy(unixname, "ZZZZZZZZZZZZ"); /* vorsichthalber */
|
||||||
return(unixname);
|
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);
|
p = pp = unixname+strlen(unixname);
|
||||||
strcpy(p, nwpath->path); /* now the path */
|
strcpy(p, (char*)nwpath->path); /* now the path */
|
||||||
p += strlen(nwpath->path);
|
p += strlen((char*)nwpath->path);
|
||||||
if ( (!(modus & 1)) && nwpath->fn[0])
|
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';
|
else if ((modus & 2) && (*(p-1) == '/')) *(p-1) = '\0';
|
||||||
if (nw_volumes[volume].options & 1) downstr((uint8*)pp);
|
if (nw_volumes[volume].options & 1) downstr((uint8*)pp);
|
||||||
return(unixname);
|
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)
|
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;
|
int nhandle = 0;
|
||||||
for (rethandle=0; rethandle < anz_dirhandles; rethandle++){
|
for (rethandle=0; rethandle < anz_dirhandles; rethandle++){
|
||||||
fh=&(dir_handles[rethandle]);
|
fh=&(dir_handles[rethandle]);
|
||||||
if (fh->f == (DIR*) NULL) {
|
if (!fh->inode) {
|
||||||
if (!nhandle) nhandle = rethandle+1;
|
if (!nhandle) nhandle = rethandle+1;
|
||||||
} else if (fh->inode == inode && fh->volume == nwpath->volume){
|
} else if (fh->inode == inode && fh->volume == nwpath->volume){
|
||||||
/* Dieser hat Vorrang */
|
/* 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->vol_options = nw_volumes[fh->volume].options;
|
||||||
fh->inode = inode;
|
fh->inode = inode;
|
||||||
fh->timestamp = akttime;
|
fh->timestamp = akttime;
|
||||||
|
if (fh->vol_options & VOL_OPTION_REMOUNT) {
|
||||||
|
closedir(fh->f);
|
||||||
|
fh->f = NULL;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
fh->f = (DIR*)NULL;
|
fh->f = (DIR*)NULL;
|
||||||
fh->unixname[0] = '\0';
|
fh->unixname[0] = '\0';
|
||||||
@ -205,7 +146,8 @@ static int free_dir_handle(int dhandle)
|
|||||||
closedir(fh->f);
|
closedir(fh->f);
|
||||||
fh->f = (DIR*)NULL;
|
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--;
|
anz_dirhandles--;
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
@ -240,7 +182,7 @@ static char nwpathname[300];
|
|||||||
char volname[100];
|
char volname[100];
|
||||||
if (p->volume < 0 || p->volume >= used_nw_volumes) {
|
if (p->volume < 0 || p->volume >= used_nw_volumes) {
|
||||||
sprintf(volname, "<%d=NOT-OK>", (int)p->volume);
|
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);
|
sprintf(nwpathname, "%s:%s%s", volname, p->path, p->fn);
|
||||||
return(nwpathname);
|
return(nwpathname);
|
||||||
}
|
}
|
||||||
@ -475,6 +417,23 @@ static int get_dir_entry(NW_PATH *nwpath,
|
|||||||
return(okflag);
|
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,
|
static int get_dh_entry(DIR_HANDLE *dh,
|
||||||
uint8 *search,
|
uint8 *search,
|
||||||
int *sequence,
|
int *sequence,
|
||||||
@ -483,8 +442,9 @@ static int get_dh_entry(DIR_HANDLE *dh,
|
|||||||
|
|
||||||
/* returns 1 if OK and 0 if not OK */
|
/* returns 1 if OK and 0 if not OK */
|
||||||
{
|
{
|
||||||
DIR *f = dh->f;
|
DIR *f = give_dh_f(dh);
|
||||||
int okflag = 0;
|
int okflag = 0;
|
||||||
|
|
||||||
if (f != (DIR*)NULL) {
|
if (f != (DIR*)NULL) {
|
||||||
struct dirent *dirbuff;
|
struct dirent *dirbuff;
|
||||||
uint8 entry[256];
|
uint8 entry[256];
|
||||||
@ -525,16 +485,17 @@ static int get_dh_entry(DIR_HANDLE *dh,
|
|||||||
} /* while */
|
} /* while */
|
||||||
dh->kpath[0] = '\0';
|
dh->kpath[0] = '\0';
|
||||||
*sequence = (int) telldir(f);
|
*sequence = (int) telldir(f);
|
||||||
|
release_dh_f(dh);
|
||||||
} /* if */
|
} /* if */
|
||||||
return(okflag);
|
return(okflag);
|
||||||
}
|
}
|
||||||
|
|
||||||
void conn_build_path_fn( uint8 *vol,
|
void conn_build_path_fn( uint8 *vol,
|
||||||
uint8 *path,
|
uint8 *path,
|
||||||
uint8 *fn,
|
uint8 *fn,
|
||||||
int *has_wild,
|
int *has_wild,
|
||||||
uint8 *data,
|
uint8 *data,
|
||||||
int len)
|
int len)
|
||||||
|
|
||||||
/* is called from build_path */
|
/* 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)
|
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 */
|
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)
|
int nw_mk_rd_dir(int dir_handle, uint8 *data, int len, int mode)
|
||||||
{
|
{
|
||||||
@ -1257,9 +951,9 @@ int nw_init_connect(void)
|
|||||||
d++;
|
d++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
init_file_module();
|
||||||
|
|
||||||
if (connect_is_init) {
|
if (connect_is_init) {
|
||||||
k = 0;
|
|
||||||
while (k++ < anz_fhandles) free_file_handle(k);
|
|
||||||
k = 0;
|
k = 0;
|
||||||
while (k++ < anz_dirhandles) free_dir_handle(k);
|
while (k++ < anz_dirhandles) free_dir_handle(k);
|
||||||
} else connect_is_init++;
|
} else connect_is_init++;
|
||||||
@ -1292,7 +986,6 @@ int nw_init_connect(void)
|
|||||||
/* first Handle must be known und must not be temp */
|
/* first Handle must be known und must not be temp */
|
||||||
/* and has no Drive-Character */
|
/* and has no Drive-Character */
|
||||||
used_dirs = 1;
|
used_dirs = 1;
|
||||||
anz_fhandles = 0;
|
|
||||||
anz_dirhandles = 0;
|
anz_dirhandles = 0;
|
||||||
return(0);
|
return(0);
|
||||||
} else return(-1);
|
} else return(-1);
|
||||||
@ -1528,7 +1221,6 @@ int nw_get_vol_number(int dir_handle)
|
|||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int nw_get_eff_dir_rights(int dir_handle, uint8 *data, int len, int modus)
|
int nw_get_eff_dir_rights(int dir_handle, uint8 *data, int len, int modus)
|
||||||
/* modus 0=only_dir, 1=dirs and files */
|
/* 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);
|
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) ) {
|
NW_PATH nwpath;
|
||||||
FILE_HANDLE *fh=&(file_handles[fhandle]);
|
int completition = conn_get_kpl_path(&nwpath, dir_handle, data, len, 0);
|
||||||
if (fh->fd > -1) {
|
if (completition > -1) {
|
||||||
fh->tmodi = nw_2_un_time(datum, zeit);
|
struct stat stbuff;
|
||||||
return(0);
|
completition=file_creat_open(nwpath.volume, build_unix_name(&nwpath, 0),
|
||||||
}
|
&stbuff, attrib, access, creatmode);
|
||||||
}
|
|
||||||
return(-0x88); /* wrong filehandle */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (completition > -1)
|
||||||
|
get_file_attrib(info, &stbuff, &nwpath);
|
||||||
|
}
|
||||||
|
return(completition);
|
||||||
|
}
|
||||||
|
|
||||||
static int s_nw_scan_dir_info(int dir_handle,
|
static int s_nw_scan_dir_info(int dir_handle,
|
||||||
uint8 *data, int len, uint8 *subnr,
|
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,
|
int nw_scan_dir_info(int dir_handle, uint8 *data, int len, uint8 *subnr,
|
||||||
uint8 *subname, uint8 *subdatetime, uint8 *owner)
|
uint8 *subname, uint8 *subdatetime, uint8 *owner)
|
||||||
{
|
{
|
||||||
int k = len;
|
int k = len;
|
||||||
char *p = data+len;
|
uint8 *p = data+len;
|
||||||
uint8 dirname[256];
|
uint8 dirname[256];
|
||||||
while (k--) {
|
while (k--) {
|
||||||
uint8 c = *--p;
|
uint8 c = *--p;
|
||||||
@ -1845,11 +1546,7 @@ static void free_queue_job(int q_id)
|
|||||||
if (q_id > 0 && q_id <= anz_jobs) {
|
if (q_id > 0 && q_id <= anz_jobs) {
|
||||||
INT_QUEUE_JOB **pp=&(queue_jobs[q_id-1]);
|
INT_QUEUE_JOB **pp=&(queue_jobs[q_id-1]);
|
||||||
uint32 fhandle = (*pp)->fhandle;
|
uint32 fhandle = (*pp)->fhandle;
|
||||||
if (fhandle > 0) {
|
if (fhandle > 0) nw_close_datei(fhandle, 1);
|
||||||
FILE_HANDLE *fh=&(file_handles[fhandle-1]);
|
|
||||||
fh->flags &= (~4);
|
|
||||||
nw_close_datei(fhandle);
|
|
||||||
}
|
|
||||||
if (q_id == anz_jobs) {
|
if (q_id == anz_jobs) {
|
||||||
xfree(*pp);
|
xfree(*pp);
|
||||||
--anz_jobs;
|
--anz_jobs;
|
||||||
@ -1889,12 +1586,7 @@ static int create_queue_file(char *job_file_name,
|
|||||||
if (result > -1)
|
if (result > -1)
|
||||||
result = nw_creat_open_file(result, job_file_name+1,
|
result = nw_creat_open_file(result, job_file_name+1,
|
||||||
(int) *job_file_name,
|
(int) *job_file_name,
|
||||||
&fnfo, 0x6, 0x6, 1);
|
&fnfo, 0x6, 0x6, 1 | 4);
|
||||||
|
|
||||||
if (result > 0){
|
|
||||||
FILE_HANDLE *fh=&(file_handles[result-1]);
|
|
||||||
fh->flags = 4; /* don't reuse after close */
|
|
||||||
}
|
|
||||||
|
|
||||||
XDPRINTF((5,0,"creat queue file bez=`%s` handle=%d",
|
XDPRINTF((5,0,"creat queue file bez=`%s` handle=%d",
|
||||||
job_bez, result));
|
job_bez, result));
|
||||||
@ -1932,8 +1624,8 @@ int nw_creat_queue(int connection, uint8 *queue_id, uint8 *queue_job,
|
|||||||
|
|
||||||
if (result > -1) {
|
if (result > -1) {
|
||||||
jo->fhandle = (uint32) result;
|
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);
|
||||||
U16_TO_BE16(0, jo->q.o.job_file_handle+4);
|
U32_TO_BE32(jo->fhandle, jo->q.o.job_file_handle+2);
|
||||||
result = 0;
|
result = 0;
|
||||||
}
|
}
|
||||||
jo->q.o.server_station = 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) {
|
if (result > -1) {
|
||||||
jo->fhandle = (uint32) result;
|
jo->fhandle = (uint32) result;
|
||||||
U16_TO_BE16((uint16)result, jo->q.n.job_file_handle);
|
U32_TO_BE32(jo->fhandle, jo->q.n.job_file_handle);
|
||||||
U16_TO_BE16(0, jo->q.n.job_file_handle+2);
|
|
||||||
result = 0;
|
result = 0;
|
||||||
}
|
}
|
||||||
U32_TO_BE32(0, jo->q.n.server_station);
|
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){
|
if (jo_id > 0 && jo_id <= anz_jobs){
|
||||||
INT_QUEUE_JOB *jo=queue_jobs[jo_id-1];
|
INT_QUEUE_JOB *jo=queue_jobs[jo_id-1];
|
||||||
int fhandle = (int)jo->fhandle;
|
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));
|
XDPRINTF((5,0,"nw_close_file_queue fhandle=%d", fhandle));
|
||||||
if (fhandle > 0 && fhandle <= anz_fhandles) {
|
if (*unixname) {
|
||||||
FILE_HANDLE *fh=&(file_handles[fhandle-1]);
|
|
||||||
char unixname[300];
|
|
||||||
char printcommand[256];
|
char printcommand[256];
|
||||||
FILE *f=NULL;
|
FILE *f=NULL;
|
||||||
strmaxcpy(unixname, fh->name, sizeof(unixname)-1);
|
|
||||||
strmaxcpy(printcommand, prc, prc_len);
|
strmaxcpy(printcommand, prc, prc_len);
|
||||||
fh->flags &= (~4);
|
nw_close_datei(fhandle, 1);
|
||||||
nw_close_datei(fhandle);
|
|
||||||
jo->fhandle = 0L;
|
jo->fhandle = 0L;
|
||||||
if (NULL != (f = fopen(unixname, "r"))) {
|
if (NULL != (f = fopen(unixname, "r"))) {
|
||||||
int is_ok = 0;
|
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((1,0,"Cannot open queue-file `%s`", unixname));
|
||||||
} else
|
} 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);
|
free_queue_job(jo_id);
|
||||||
}
|
}
|
||||||
return(result);
|
return(result);
|
||||||
|
178
connect.h
178
connect.h
@ -1,15 +1,6 @@
|
|||||||
/* connect.h 21-Jan-96 */
|
/* connect.h 28-Jan-96 */
|
||||||
|
#ifndef _CONNECT_H_
|
||||||
typedef struct {
|
#define _CONNECT_H_
|
||||||
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;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
DIR *f;
|
DIR *f;
|
||||||
char unixname[256]; /* kompletter unixname */
|
char unixname[256]; /* kompletter unixname */
|
||||||
@ -37,6 +28,95 @@ typedef struct {
|
|||||||
uint8 task; /* actual task */
|
uint8 task; /* actual task */
|
||||||
} NW_DIR;
|
} 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
|
#define MAX_NW_DIRS 255
|
||||||
extern NW_DIR dirs[MAX_NW_DIRS];
|
extern NW_DIR dirs[MAX_NW_DIRS];
|
||||||
extern int used_dirs;
|
extern int used_dirs;
|
||||||
@ -64,6 +144,77 @@ extern int fn_match(uint8 *s, uint8 *p, uint8 options);
|
|||||||
|
|
||||||
|
|
||||||
/* queues */
|
/* 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,
|
extern int nw_creat_queue(int connection, uint8 *queue_id, uint8 *queue_job,
|
||||||
uint8 *dirname, int dir_nam_len, int old_call);
|
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);
|
uint8 *prc, int prc_len);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern uint16 un_date_2_nw(time_t time, uint8 *d);
|
extern uint16 un_date_2_nw(time_t time, uint8 *d);
|
||||||
extern time_t nw_2_un_time(uint8 *d, uint8 *t);
|
extern time_t nw_2_un_time(uint8 *d, uint8 *t);
|
||||||
extern uint16 un_time_2_nw(time_t time, uint8 *d);
|
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_date_2_nw(time_t time, uint8 *d);
|
||||||
extern void xun_time_2_nw(time_t time, uint8 *d);
|
extern void xun_time_2_nw(time_t time, uint8 *d);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
35
emutli.c
35
emutli.c
@ -1,9 +1,9 @@
|
|||||||
/* emutli.c 22-Jan-96 */
|
/* emutli.c 07-Feb-96 */
|
||||||
/*
|
/*
|
||||||
* One short try to emulate TLI with SOCKETS.
|
* 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
|
* 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
|
* 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);
|
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,
|
void ipx_route_add(uint32 dest_net,
|
||||||
uint32 route_net,
|
uint32 route_net,
|
||||||
uint8 *route_node)
|
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))
|
&& a_in->addr.len == sizeof(ipxAddr_t))
|
||||||
ipx2sockadr(&ipxs, (ipxAddr_t*) (a_in->addr.buf));
|
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) {
|
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)));
|
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)
|
int poll( struct pollfd *fds, unsigned long nfds, int timeout)
|
||||||
/* z.Z. nur POLL-IN */
|
/* only POLL-IN */
|
||||||
{
|
{
|
||||||
fd_set readfs;
|
fd_set readfs;
|
||||||
/*
|
/*
|
||||||
|
4
emutli.h
4
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
|
/* (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 int init_dev(char *devname, int frame, uint32 network);
|
||||||
extern void exit_dev(char *devname, int frame);
|
extern void exit_dev(char *devname, int frame);
|
||||||
|
|
||||||
|
#if 0
|
||||||
extern int get_ipx_addr(ipxAddr_t *addr);
|
extern int get_ipx_addr(ipxAddr_t *addr);
|
||||||
|
#endif
|
||||||
|
|
||||||
extern void ipx_route_add(uint32 dest_net,
|
extern void ipx_route_add(uint32 dest_net,
|
||||||
uint32 route_net,
|
uint32 route_net,
|
||||||
|
7
examples/README.dosemu
Normal file
7
examples/README.dosemu
Normal file
@ -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.
|
||||||
|
|
@ -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.
|
- removes the ipx-send bug. BIG THANKS to Volker Lendecke.
|
||||||
the problem was that sometimes the sendto function hung.
|
the problem was that sometimes the sendto function hung.
|
||||||
|
@ -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 */
|
/* 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 FILENAME_NW_INI "/etc/nwserv.conf" /* full name of ini (conf) file */
|
||||||
#define PATHNAME_PROGS "/sbin" /* path location of progs */
|
#define PATHNAME_PROGS "/sbin" /* path location of progs */
|
||||||
#define PATHNAME_BINDERY "/etc" /* path location of bindery */
|
#define PATHNAME_BINDERY "/etc" /* path location of bindery */
|
||||||
|
|
||||||
#define MAX_CONNECTIONS 5 /* max. Number of Connections */
|
#define NETWORK_SERIAL_NMBR 0x44444444L /* Serial Number 4 Byte */
|
||||||
/* must be < 256 !!! */
|
#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 */
|
|
||||||
|
11
examples/dosemu-patch
Normal file
11
examples/dosemu-patch
Normal file
@ -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 );
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# mk.li 16-Nov-95 ###
|
# mk.li 30-Jan-96 ###
|
||||||
#
|
# please edit this file !
|
||||||
|
|
||||||
mk()
|
mk()
|
||||||
{
|
{
|
||||||
@ -14,12 +14,46 @@ mk()
|
|||||||
chmod 666 $ERRFILE
|
chmod 666 $ERRFILE
|
||||||
}
|
}
|
||||||
|
|
||||||
export CC=cc
|
TOLOWER='tr "[A-Z]" "[a-z]"'
|
||||||
export CCP="cc -E"
|
UNX=`uname -s | $TOLOWER`
|
||||||
#export CFLAGS="-pipe -O2 -fomit-frame-pointer"
|
|
||||||
#problems gcc2.5.8 ^^^^^^^^^^^^^^^^^^^^^^^^
|
case $UNX in
|
||||||
export CFLAGS="-pipe"
|
linux)
|
||||||
export HOSTCFLAGS="-DLINUX"
|
CC=cc;
|
||||||
export TMP=/tmp
|
CCP="cc -E";
|
||||||
MAKE=make
|
# 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 $@
|
mk $@
|
||||||
|
@ -1,19 +1,19 @@
|
|||||||
# (C)opyright 1993, 1995, Martin Stover, Softwareentwicklung, Marburg
|
# (C)opyright 1993, 1995, Martin Stover, Softwareentwicklung, Marburg
|
||||||
# last change: 22-Jan-96
|
# last change: 08-Feb-96
|
||||||
# MAR.S NW-Server Emulator
|
# MAR.S NW-Server Emulator
|
||||||
# Einfache Konfiguration, alles ab # ist Kommentar.
|
# Einfache Konfiguration, alles ab # ist Kommentar.
|
||||||
# Jeder Eintrag beginnt mit einer Zahl und dann folgt der Inhalt.
|
# Jeder Eintrag beginnt mit einer Zahl und dann folgt der Inhalt.
|
||||||
# simple configuration, all after # is ignored.
|
# simple configuration, all after # is ignored.
|
||||||
# every entry begins with a number and then the meet follows.
|
# every entry begins with a number and then the meet follows.
|
||||||
# entry 1 VOLUMES (max. 5) entry 1
|
# entry 1 VOLUMES (max. volumes depend on your config.h)
|
||||||
# Volumename Volumepath Options (k=lowercase,p=pipe)
|
# Volumename Volumepath Options (k=lowercase,p=pipe,m=removable)
|
||||||
1 SYS /u3/SYS/ # SYS 1
|
1 SYS /u3/SYS/ # SYS 1
|
||||||
####################################
|
####################################
|
||||||
# Die folgenden Volumes sind optional.
|
# Die folgenden Volumes sind optional.
|
||||||
# the following volumes are optional.
|
# the following volumes are optional.
|
||||||
#1 SYS1 /u3/SYS1/ # SYS 2 upshift
|
#1 SYS1 /u3/SYS1/ # SYS 2 upshift
|
||||||
#1 TMP /tmp/ k # TMP downshift
|
#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
|
#1 PIPES /u3/pipes kp # pipecommands
|
||||||
# Falls lowercase nicht gesetzt ist, werden GROSSBUCHSTABEN erwartet.
|
# Falls lowercase nicht gesetzt ist, werden GROSSBUCHSTABEN erwartet.
|
||||||
# If lowercase is not set then all filenames are upshift.
|
# If lowercase is not set then all filenames are upshift.
|
||||||
@ -30,10 +30,11 @@
|
|||||||
#2 MAR1 # Servername
|
#2 MAR1 # Servername
|
||||||
######################################
|
######################################
|
||||||
# next entry for configure mars_nwe to use the internal net
|
# next entry for configure mars_nwe to use the internal net
|
||||||
# If you have mars_nwe V > 0.96pl5 and the small ipx-kpatch
|
# If you have mars_nwe V > 0.96pl5 and a kernel >= 1.3.60
|
||||||
# from the examples dir you can use Internal Net and Routing.
|
# or the small ipx-kpatch from the examples dir you can use
|
||||||
|
# internal net and routing.
|
||||||
# INTERNAL NET [NODE]
|
# INTERNAL NET [NODE]
|
||||||
###3 0x999999 1 # Node default 1
|
#3 0x999999 1 # Node default 1
|
||||||
######################################
|
######################################
|
||||||
# entry 4: # for DEVICE(S)
|
# entry 4: # for DEVICE(S)
|
||||||
# if your ipx is allready up, then entry 4 must be removed.
|
# 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
|
# some clients are running better, if the server tells
|
||||||
# that it is a 3.11 Server, although many calls
|
# that it is a 3.11 Server, although many calls
|
||||||
# (namespace services) of a real 3.11 Server are missing yet.
|
# (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
|
6 0 # tells server version: 2.15=0, 3.11=1
|
||||||
######################################
|
######################################
|
||||||
# GID and UID for _minimal_ rights
|
# GID and UID for _minimal_ rights
|
||||||
@ -89,7 +93,7 @@
|
|||||||
210 10 # 1 .. 600 (default 10) seconds after server really goes down
|
210 10 # 1 .. 600 (default 10) seconds after server really goes down
|
||||||
# # after a down command
|
# # 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.
|
301 /tmp/nw.routes # filename.
|
||||||
302 1 # creat new filename=1, append to file=0
|
302 1 # creat new filename=1, append to file=0
|
||||||
#############################
|
#############################
|
||||||
|
60
makefile.unx
60
makefile.unx
@ -1,4 +1,6 @@
|
|||||||
# makefile.unx 15-Jan-96
|
#if 0
|
||||||
|
#makefile.unx 07-Feb-96
|
||||||
|
#endif
|
||||||
VPATH=..
|
VPATH=..
|
||||||
O=.o
|
O=.o
|
||||||
C=.c
|
C=.c
|
||||||
@ -6,7 +8,7 @@ C=.c
|
|||||||
DEBUG=-DDB
|
DEBUG=-DDB
|
||||||
V_H=0
|
V_H=0
|
||||||
V_L=96
|
V_L=96
|
||||||
P_L=7
|
P_L=8
|
||||||
#define D_P_L 1
|
#define D_P_L 1
|
||||||
DISTRIB=mars_nwe
|
DISTRIB=mars_nwe
|
||||||
#if D_P_L
|
#if D_P_L
|
||||||
@ -53,24 +55,12 @@ $(DESTMAKEFILE): makefile.unx config.h
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
PROG1=netinit
|
PROG1=
|
||||||
PROG2=nwserv
|
PROG2=nwserv
|
||||||
PROG3=nwconn
|
PROG3=nwconn
|
||||||
PROG4=ncpserv
|
PROG4=ncpserv
|
||||||
PROG5=nwclient
|
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"
|
#include "config.h"
|
||||||
#ifdef FILENAME_NW_INI
|
#ifdef FILENAME_NW_INI
|
||||||
M_FILENAME_NW_INI=FILENAME_NW_INI
|
M_FILENAME_NW_INI=FILENAME_NW_INI
|
||||||
@ -84,25 +74,43 @@ M_PATHNAME_PROGS=PATHNAME_PROGS
|
|||||||
M_PATHNAME_PROGS="."
|
M_PATHNAME_PROGS="."
|
||||||
#endif
|
#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)
|
OBJ1= $(EMUTLIOBJ) net1$(O) tools$(O)
|
||||||
OBJ2= $(OBJ1) nwroute$(O)
|
OBJ2= $(OBJ1) $(NWROUTE_O)
|
||||||
OBJ3= $(OBJ1) connect$(O) namspace$(O) nwvolume$(O)
|
OBJ3= $(OBJ1) connect$(O) namspace$(O) nwvolume$(O) nwfile$(O)
|
||||||
OBJ4= $(OBJ1) nwdbm$(O) nwcrypt$(O)
|
OBJ4= $(OBJ1) nwdbm$(O) nwcrypt$(O)
|
||||||
OBJ5= $(OBJ1)
|
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) \
|
namspace$(O) nwvolume$(O) \
|
||||||
$(PROG2)$(O) $(PROG3)$(O) $(PROG4)$(O) $(PROG5)$(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)
|
$(PROG1): $(PROG1)$(O) $(OBJ1)
|
||||||
$(CC) -o ../$(PROG1) $(PROG1)$(O) $(OBJ1) $(NSLLIB)
|
$(CC) -o ../$(PROG1) $(PROG1)$(O) $(OBJ1) $(NSLLIB)
|
||||||
|
|
||||||
$(PROG2): $(PROG2)$(O) $(OBJ2)
|
$(PROG2): $(PROG2)$(O) $(OBJ2)
|
||||||
$(CC) -o ../$(PROG2) $(PROG2)$(O) $(OBJ2) $(NSLLIB)
|
$(CC) -o ../$(PROG2) $(PROG2)$(O) $(OBJ2) $(NSLLIB)
|
||||||
|
#if 0
|
||||||
#$(CC) -o ../$(PROG2) $(PROG2)$(O) $(OBJ2) $(NDBMLIB) $(NSLLIB)
|
#$(CC) -o ../$(PROG2) $(PROG2)$(O) $(OBJ2) $(NDBMLIB) $(NSLLIB)
|
||||||
|
#endif
|
||||||
|
|
||||||
$(PROG3): $(PROG3)$(O) $(OBJ3)
|
$(PROG3): $(PROG3)$(O) $(OBJ3)
|
||||||
$(CC) -o ../$(PROG3) $(PROG3)$(O) $(OBJ3) $(NSLLIB)
|
$(CC) -o ../$(PROG3) $(PROG3)$(O) $(OBJ3) $(NSLLIB)
|
||||||
@ -113,7 +121,7 @@ $(PROG4): $(PROG4)$(O) $(OBJ4)
|
|||||||
$(PROG5): $(PROG5)$(O) $(OBJ5)
|
$(PROG5): $(PROG5)$(O) $(OBJ5)
|
||||||
$(CC) -o ../$(PROG5) $(PROG5)$(O) $(OBJ5) $(NSLLIB)
|
$(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
|
$(OBJS): net.h config.h
|
||||||
|
|
||||||
$(C)$(O):
|
$(C)$(O):
|
||||||
@ -123,11 +131,11 @@ $(C)$(O):
|
|||||||
n_all: $(PROGS)
|
n_all: $(PROGS)
|
||||||
|
|
||||||
n_install_ini:
|
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:
|
n_install:
|
||||||
cd .. && install -d $(M_PATHNAME_PROGS) && cd obj
|
cd .. && $(INSTALL) -d $(M_PATHNAME_PROGS) && cd obj
|
||||||
cd .. && install $(PROGS) $(M_PATHNAME_PROGS) && cd obj
|
cd .. && $(INSTALL) $(PROGS) $(M_PATHNAME_PROGS) && cd obj
|
||||||
@cd .. && (if [ -r $(M_FILENAME_NW_INI) ] ; then \
|
@cd .. && (if [ -r $(M_FILENAME_NW_INI) ] ; then \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
echo "********************************************************"; \
|
echo "********************************************************"; \
|
||||||
@ -138,7 +146,7 @@ echo ""; \
|
|||||||
echo "********************************************************"; \
|
echo "********************************************************"; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
else \
|
else \
|
||||||
install -m 664 nw.ini $(M_FILENAME_NW_INI); \
|
$(INSTALL) -m 664 nw.ini $(M_FILENAME_NW_INI); \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
echo "********************************************************"; \
|
echo "********************************************************"; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
@ -175,8 +183,6 @@ n_make_dir: n_clean1
|
|||||||
$(DISTRIB).lsm \
|
$(DISTRIB).lsm \
|
||||||
$(DISTRIB)/. \
|
$(DISTRIB)/. \
|
||||||
; rm -f $(DISTRIB)/config.h \
|
; rm -f $(DISTRIB)/config.h \
|
||||||
; rm -f $(DISTRIB)/namspace.? \
|
|
||||||
; cp old/namspace.? $(DISTRIB)/. \
|
|
||||||
; ln -f \
|
; ln -f \
|
||||||
examples/$(STERN) \
|
examples/$(STERN) \
|
||||||
$(DISTRIB)/examples/. \
|
$(DISTRIB)/examples/. \
|
||||||
|
10
mars_nwe.lsm
10
mars_nwe.lsm
@ -1,16 +1,16 @@
|
|||||||
Begin3
|
Begin3
|
||||||
Title: mars_nwe
|
Title: mars_nwe
|
||||||
Version: 0.96pl7
|
Version: 0.96pl8
|
||||||
Entered-date: 22-Jan-96
|
Entered-date: 08-Feb-96
|
||||||
Description: full novell-server-emulator (src),beta
|
Description: full novell-server-emulator (src),beta
|
||||||
file-services, bindery-services, printing-services
|
supports file-services, bindery-services,
|
||||||
needs no kernelchanges, usefull for testing ipx
|
printing-services, routing-services
|
||||||
Keywords: novell, netware, server, ipx, ncp, tli
|
Keywords: novell, netware, server, ipx, ncp, tli
|
||||||
Author: mstover@freeway.de (Martin Stover)
|
Author: mstover@freeway.de (Martin Stover)
|
||||||
Maintained-by: mstover@freeway.de (Martin Stover)
|
Maintained-by: mstover@freeway.de (Martin Stover)
|
||||||
Primary-site: linux01.gwdg.de /pub/ncpfs
|
Primary-site: linux01.gwdg.de /pub/ncpfs
|
||||||
120kB mars_nwe-0.96.pl7.tgz
|
120kB mars_nwe-0.96.pl7.tgz
|
||||||
Alternate-site: ftp.uni-duisburg.de /pub/linux/ipxware
|
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
|
Copying-policy: GNU
|
||||||
End
|
End
|
||||||
|
896
namspace.c
896
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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -20,8 +24,896 @@
|
|||||||
#include "net.h"
|
#include "net.h"
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <utime.h>
|
#include <utime.h>
|
||||||
|
#ifndef LINUX
|
||||||
|
#include <errno.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "nwvolume.h"
|
||||||
#include "connect.h"
|
#include "connect.h"
|
||||||
|
#include "nwfile.h"
|
||||||
#include "namspace.h"
|
#include "namspace.h"
|
||||||
|
|
||||||
#if WITH_NAME_SPACE_CALLS
|
#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
|
#endif
|
||||||
|
53
namspace.h
53
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
|
* 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
|
* 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.
|
* 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
|
||||||
|
91
ncpserv.c
91
ncpserv.c
@ -1,6 +1,6 @@
|
|||||||
/* ncpserv.c */
|
/* ncpserv.c */
|
||||||
#define REVISION_DATE "22-Jan-96"
|
#define REVISION_DATE "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
|
* 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
|
* 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];
|
uint8 appl_number[2];
|
||||||
} *xdata = (struct XDATA*) responsedata;
|
} *xdata = (struct XDATA*) responsedata;
|
||||||
/* serial-number 4-Byte */
|
/* serial-number 4-Byte */
|
||||||
U32_TO_BE32(0x44444444, xdata->serial_number);
|
U32_TO_BE32(NETWORK_SERIAL_NMBR, xdata->serial_number);
|
||||||
/* applikation-number 2-Byte */
|
/* 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);
|
data_len = sizeof(struct XDATA);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -484,6 +484,31 @@ static int handle_fxx(CONNECTION *c, int gelen, int func)
|
|||||||
} else completition = (uint8) -result;
|
} else completition = (uint8) -result;
|
||||||
} break;
|
} 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 */
|
case 0x16 : { /* Get Connection Info, OLD */
|
||||||
struct XDATA {
|
struct XDATA {
|
||||||
@ -521,7 +546,12 @@ static int handle_fxx(CONNECTION *c, int gelen, int func)
|
|||||||
uint8 *p = c->crypt_key;
|
uint8 *p = c->crypt_key;
|
||||||
uint8 *pp = responsedata;
|
uint8 *pp = responsedata;
|
||||||
data_len = k;
|
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 */
|
/* if all here are same (1 or 2) then the resulting key is */
|
||||||
/* 00000000 */
|
/* 00000000 */
|
||||||
}
|
}
|
||||||
@ -623,6 +653,7 @@ static int handle_fxx(CONNECTION *c, int gelen, int func)
|
|||||||
NETOBJ obj;
|
NETOBJ obj;
|
||||||
obj.type = GET_BE16(p);
|
obj.type = GET_BE16(p);
|
||||||
strmaxcpy((char*)obj.name, (char*)(p+3), (int) *(p+2));
|
strmaxcpy((char*)obj.name, (char*)(p+3), (int) *(p+2));
|
||||||
|
upstr(obj.name);
|
||||||
result = find_obj_id(&obj, 0);
|
result = find_obj_id(&obj, 0);
|
||||||
if (!result){
|
if (!result){
|
||||||
U32_TO_BE32(obj.id, xdata->object_id);
|
U32_TO_BE32(obj.id, xdata->object_id);
|
||||||
@ -666,6 +697,7 @@ static int handle_fxx(CONNECTION *c, int gelen, int func)
|
|||||||
NETOBJ obj;
|
NETOBJ obj;
|
||||||
obj.type = GET_BE16(p);
|
obj.type = GET_BE16(p);
|
||||||
strmaxcpy((char*)obj.name, (char*)(p+3),(int) *(p+2));
|
strmaxcpy((char*)obj.name, (char*)(p+3),(int) *(p+2));
|
||||||
|
upstr(obj.name);
|
||||||
result = find_obj_id(&obj, last_obj_id);
|
result = find_obj_id(&obj, last_obj_id);
|
||||||
if (!result){
|
if (!result){
|
||||||
U32_TO_BE32(obj.id, xdata->object_id);
|
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));
|
obj.name, result));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#if 0
|
|
||||||
|
#ifdef _CHANGE_PASSWD_TESTING_
|
||||||
case 0x4b : { /* keyed change pasword */
|
case 0x4b : { /* keyed change pasword */
|
||||||
uint8 *p = rdata+sizeof(c->crypt_key);
|
uint8 *p = rdata+sizeof(c->crypt_key);
|
||||||
NETOBJ obj;
|
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 */
|
p += (*p+1); /* here is now password-type ?? 0x60,0x66 */
|
||||||
|
|
||||||
if (0 == (result = find_obj_id(&obj, 0)))
|
if (0 == (result = find_obj_id(&obj, 0)))
|
||||||
/*
|
|
||||||
result=nw_test_passwd(obj.id, c->crypt_key, rdata);
|
result=nw_test_passwd(obj.id, c->crypt_key, rdata);
|
||||||
|
#if 0
|
||||||
if (result > -1)
|
if (result > -1)
|
||||||
*/
|
|
||||||
result=nw_set_enpasswd(obj.id, p+1);
|
result=nw_set_enpasswd(obj.id, p+1);
|
||||||
|
#endif
|
||||||
if (result< 0) completition = (uint8) -result;
|
if (result< 0) completition = (uint8) -result;
|
||||||
XDPRINTF((1, 0, "Keyed Change PW from OBJECT='%s', result=0x%x",
|
XDPRINTF((1, 0, "Keyed Change PW from OBJECT='%s', result=0x%x",
|
||||||
obj.name, result));
|
obj.name, result));
|
||||||
@ -1003,7 +1035,7 @@ static int handle_fxx(CONNECTION *c, int gelen, int func)
|
|||||||
XDPRINTF((1, 0, "TODO:Create QUEUE ??"));
|
XDPRINTF((1, 0, "TODO:Create QUEUE ??"));
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case 0x66 : { /* Read Queue Current Status */
|
case 0x66 : { /* Read Queue Current Status */
|
||||||
/* !!!!!! TO DO */
|
/* !!!!!! TO DO */
|
||||||
NETOBJ obj;
|
NETOBJ obj;
|
||||||
obj.id = GET_BE32(rdata);
|
obj.id = GET_BE32(rdata);
|
||||||
@ -1011,6 +1043,17 @@ static int handle_fxx(CONNECTION *c, int gelen, int func)
|
|||||||
completition=0xd5; /* no Queue Job */
|
completition=0xd5; /* no Queue Job */
|
||||||
}break;
|
}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 */
|
case 0x6B : { /* Get Queue Job List, old */
|
||||||
/* !!!!!! TO DO */
|
/* !!!!!! TO DO */
|
||||||
NETOBJ obj;
|
NETOBJ obj;
|
||||||
@ -1028,7 +1071,7 @@ static int handle_fxx(CONNECTION *c, int gelen, int func)
|
|||||||
}break;
|
}break;
|
||||||
|
|
||||||
case 0x68: /* creat queue job and file old */
|
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);
|
uint32 q_id = GET_BE32(rdata);
|
||||||
uint8 *dir_name = rdata+4+280+1;
|
uint8 *dir_name = rdata+4+280+1;
|
||||||
int result = nw_get_q_dirname(q_id, dir_name);
|
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;
|
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 */
|
case 0xc8 : { /* CHECK CONSOLE PRIVILEGES */
|
||||||
XDPRINTF((1, 0, "TODO: CHECK CONSOLE PRIV"));
|
XDPRINTF((1, 0, "TODO: CHECK CONSOLE PRIV"));
|
||||||
/* !!!!!! TODO completition=0xc6 (no rights) */
|
/* !!!!!! 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 *revision_date = REVISION_DATE;
|
||||||
char *copyright = "(C)opyright Martin Stover";
|
char *copyright = "(C)opyright Martin Stover";
|
||||||
int k=strlen(company)+1;
|
int k=strlen(company)+1;
|
||||||
|
int l;
|
||||||
memset(responsedata, 0, 512);
|
memset(responsedata, 0, 512);
|
||||||
strcpy(responsedata, company);
|
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);
|
strcpy(responsedata+k, revision_date);
|
||||||
k += (strlen(revision_date)+1);
|
k += (strlen(revision_date)+1);
|
||||||
strcpy(responsedata+k, copyright);
|
strcpy(responsedata+k, copyright);
|
||||||
@ -1092,7 +1150,7 @@ static int handle_fxx(CONNECTION *c, int gelen, int func)
|
|||||||
int anz_conns = (int) *p++;
|
int anz_conns = (int) *p++;
|
||||||
uint8 *co = p;
|
uint8 *co = p;
|
||||||
int msglen = (int) *(p+anz_conns);
|
int msglen = (int) *(p+anz_conns);
|
||||||
char *msg = p+anz_conns+1;
|
char *msg = (char*) p+anz_conns+1;
|
||||||
int k = -1;
|
int k = -1;
|
||||||
if (anz_conns) {
|
if (anz_conns) {
|
||||||
while (++k < 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->connection = ncprequest->connection;
|
||||||
ncpresponse->reserved = 0;
|
ncpresponse->reserved = 0;
|
||||||
ncpresponse->completition = completition;
|
ncpresponse->completition = completition;
|
||||||
|
if (c->message[0]) connect_status |= 0x40;
|
||||||
ncpresponse->connect_status = connect_status;
|
ncpresponse->connect_status = connect_status;
|
||||||
data_len=write(c->fd, (char*)ncpresponse,
|
data_len=write(c->fd, (char*)ncpresponse,
|
||||||
sizeof(NCPRESPONSE) + data_len);
|
sizeof(NCPRESPONSE) + data_len);
|
||||||
@ -1267,7 +1326,7 @@ static int handle_ctrl(void)
|
|||||||
|
|
||||||
case 0x3333 : /* 'bindery' calls */
|
case 0x3333 : /* 'bindery' calls */
|
||||||
if (sizeof(conn) == read(0, (char*)&conn, sizeof(conn))) {
|
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));
|
XDPRINTF((2,0, "0x3333 len=%d", conn));
|
||||||
if (conn == read(0, (char*)buff, conn))
|
if (conn == read(0, (char*)buff, conn))
|
||||||
handle_bind_calls(buff);
|
handle_bind_calls(buff);
|
||||||
|
253
net.h
253
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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -116,10 +116,21 @@
|
|||||||
# define PATHNAME_BINDERY "." /* location of bindery files */
|
# define PATHNAME_BINDERY "." /* location of bindery files */
|
||||||
#endif
|
#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
|
#ifndef IPX_DATA_GR_546
|
||||||
# define IPX_DATA_GR_546 1
|
# define IPX_DATA_GR_546 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef WITH_NAME_SPACE_CALLS
|
||||||
|
# define WITH_NAME_SPACE_CALLS 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef MAX_NW_ROUTES
|
#ifndef MAX_NW_ROUTES
|
||||||
# define MAX_NW_ROUTES 50
|
# define MAX_NW_ROUTES 50
|
||||||
#endif
|
#endif
|
||||||
@ -134,6 +145,27 @@
|
|||||||
# define IPX_MAX_DATA 546
|
# define IPX_MAX_DATA 546
|
||||||
#endif
|
#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
|
#define MAX_SERVER_NAME 48
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
@ -178,7 +210,6 @@ typedef union {
|
|||||||
uint8 server_hops[2];
|
uint8 server_hops[2];
|
||||||
} saps;
|
} saps;
|
||||||
} sap;
|
} sap;
|
||||||
|
|
||||||
struct S_WDOG { /* Watchdog */
|
struct S_WDOG { /* Watchdog */
|
||||||
uint8 connid; /* connection ID */
|
uint8 connid; /* connection ID */
|
||||||
uint8 status; /* STATUS */
|
uint8 status; /* STATUS */
|
||||||
@ -238,11 +269,11 @@ typedef union {
|
|||||||
char data[IPX_MAX_DATA];
|
char data[IPX_MAX_DATA];
|
||||||
} IPX_DATA;
|
} IPX_DATA;
|
||||||
|
|
||||||
typedef struct S_SIP SIP;
|
typedef struct S_SIP SIP;
|
||||||
typedef struct S_SQP SQP;
|
typedef struct S_SQP SQP;
|
||||||
typedef struct S_SAP SAP;
|
typedef struct S_SAP SAP;
|
||||||
typedef struct S_SAPS SAPS;
|
typedef struct S_SAPS SAPS;
|
||||||
typedef struct S_RIP RIP;
|
typedef struct S_RIP RIP;
|
||||||
|
|
||||||
typedef struct S_CONFREQ CONFREQ;
|
typedef struct S_CONFREQ CONFREQ;
|
||||||
typedef struct S_DIAGRESP DIAGRESP;
|
typedef struct S_DIAGRESP DIAGRESP;
|
||||||
@ -250,202 +281,30 @@ typedef struct S_NCPRESPONSE NCPRESPONSE;
|
|||||||
typedef struct S_NCPREQUEST NCPREQUEST;
|
typedef struct S_NCPREQUEST NCPREQUEST;
|
||||||
|
|
||||||
/* SOCKETS */
|
/* SOCKETS */
|
||||||
#define SOCK_ROUTE 0x0001 /* Routing Information */
|
#define SOCK_AUTO 0x0000 /* Autobound Socket */
|
||||||
#define SOCK_ECHO 0x0002 /* Echo Protokoll Packet */
|
#define SOCK_ROUTE 0x0001 /* Routing Information */
|
||||||
#define SOCK_ERROR 0x0003 /* Error Handler Packet */
|
#define SOCK_ECHO 0x0002 /* Echo Protokoll Packet */
|
||||||
#define SOCK_NCP 0x0451 /* File Service CORE */
|
#define SOCK_ERROR 0x0003 /* Error Handler Packet */
|
||||||
|
#define SOCK_NCP 0x0451 /* File Service CORE */
|
||||||
#define SOCK_SAP 0x0452 /* SAP Service Advertising Packet */
|
#define SOCK_SAP 0x0452 /* SAP Service Advertising Packet */
|
||||||
#define SOCK_RIP 0x0453 /* Routing Information Packet */
|
#define SOCK_RIP 0x0453 /* Routing Information Packet */
|
||||||
#define SOCK_NETBIOS 0x0455 /* NET BIOS Packet */
|
#define SOCK_NETBIOS 0x0455 /* NET BIOS Packet */
|
||||||
#define SOCK_DIAGNOSE 0x0456 /* Diagnostic Packet */
|
#define SOCK_DIAGNOSE 0x0456 /* Diagnostic Packet */
|
||||||
#define SOCK_NVT 0x8063 /* NVT (Netzerk Virtual Terminal) */
|
#define SOCK_NVT 0x8063 /* NVT (Network Virtual Terminal) */
|
||||||
/* PACKET TYPES */
|
/* PACKET TYPES */
|
||||||
|
|
||||||
#define PACKT_0 0 /* unknown */
|
#define PACKT_0 0 /* unknown */
|
||||||
#define PACKT_ROUTE 1 /* Routing Information */
|
#define PACKT_ROUTE 1 /* Routing Information */
|
||||||
#define PACKT_ECHO 2 /* Echo Packet */
|
#define PACKT_ECHO 2 /* Echo Packet */
|
||||||
#define PACKT_ERROR 3 /* Error Packet */
|
#define PACKT_ERROR 3 /* Error Packet */
|
||||||
#define PACKT_EXCH 4 /* Packet Exchange Packet */
|
#define PACKT_EXCH 4 /* Packet Exchange Packet */
|
||||||
#define PACKT_SPX 5 /* SPX Packet */
|
#define PACKT_SPX 5 /* SPX Packet */
|
||||||
/* 16 - 31 Experimental */
|
/* 16 - 31 Experimental */
|
||||||
#define PACKT_CORE 17 /* Core Protokoll (NCP) */
|
#define PACKT_CORE 17 /* Core Protokoll (NCP) */
|
||||||
|
|
||||||
|
|
||||||
#define FD_NWSERV 3 /* one after stderr */
|
|
||||||
|
|
||||||
|
|
||||||
|
#define FD_NWSERV 3 /* one after stderr */
|
||||||
|
|
||||||
#include "net1.h"
|
#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"
|
#include "tools.h"
|
||||||
|
|
||||||
|
308
netinit.c
308
netinit.c
@ -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 <sys/dlpi.h>
|
|
||||||
#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 f<>r 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");
|
|
||||||
}
|
|
16
nwclient.c
16
nwclient.c
@ -236,6 +236,8 @@ static int do_17_17(void)
|
|||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int get_network_serial_number(void)
|
static int get_network_serial_number(void)
|
||||||
{
|
{
|
||||||
uint8 data[] = {0, 1, 0x12};
|
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)
|
static void teste_reads(void)
|
||||||
{
|
{
|
||||||
@ -681,7 +694,7 @@ static void test_wdog(void)
|
|||||||
/* --------------------------------------------------------- */
|
/* --------------------------------------------------------- */
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
nw_debug = 1; /* dieses Modul dient nur zum Debuggen !! */
|
init_tools(NWCLIENT);
|
||||||
|
|
||||||
if (argc != 3) {
|
if (argc != 3) {
|
||||||
fprintf(stderr, "usage: nwclient MY_ADDR SERVER_ADDR\n");
|
fprintf(stderr, "usage: nwclient MY_ADDR SERVER_ADDR\n");
|
||||||
@ -701,6 +714,7 @@ int main(int argc, char **argv)
|
|||||||
get_pkt_size();
|
get_pkt_size();
|
||||||
get_connect();
|
get_connect();
|
||||||
get_server_time();
|
get_server_time();
|
||||||
|
do_5f();
|
||||||
|
|
||||||
file_search_init(NULL, 1, NULL);
|
file_search_init(NULL, 1, NULL);
|
||||||
get_bindery_access();
|
get_bindery_access();
|
||||||
|
78
nwconn.c
78
nwconn.c
@ -1,7 +1,7 @@
|
|||||||
/* nwconn.c 13-Jan-96 */
|
/* nwconn.c 07-Feb-96 */
|
||||||
/* one process / connection */
|
/* 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -21,6 +21,7 @@
|
|||||||
#include "net.h"
|
#include "net.h"
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include "nwvolume.h"
|
#include "nwvolume.h"
|
||||||
|
#include "nwfile.h"
|
||||||
#include "connect.h"
|
#include "connect.h"
|
||||||
#include "namspace.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_bavail/1000, xdata->avail_blocks);
|
||||||
U16_TO_BE16(fsp.fsu_files, xdata->total_dirs);
|
U16_TO_BE16(fsp.fsu_files, xdata->total_dirs);
|
||||||
U16_TO_BE16(fsp.fsu_ffree, xdata->avail_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);
|
data_len = sizeof(struct XDATA);
|
||||||
} else completition = (uint8) -result;
|
} else completition = (uint8) -result;
|
||||||
@ -383,7 +388,8 @@ static void handle_ncp_serv()
|
|||||||
int result = nw_get_vol_number((int)*(p+1));
|
int result = nw_get_vol_number((int)*(p+1));
|
||||||
memset(xdata, 0, sizeof(struct XDATA));
|
memset(xdata, 0, sizeof(struct XDATA));
|
||||||
if (result > -1) {
|
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) {
|
if (result > -1) {
|
||||||
struct fs_usage fsp;
|
struct fs_usage fsp;
|
||||||
if (!nw_get_fs_usage(xdata->name, &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_bavail/1000, xdata->avail_blocks);
|
||||||
U16_TO_BE16(fsp.fsu_files, xdata->total_dirs);
|
U16_TO_BE16(fsp.fsu_files, xdata->total_dirs);
|
||||||
U16_TO_BE16(fsp.fsu_ffree, xdata->avail_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);
|
data_len = sizeof(struct XDATA);
|
||||||
XDPRINTF((5,0,"GIVE VOLUME INFO von :%s:", xdata->name));
|
XDPRINTF((5,0,"GIVE VOLUME INFO von :%s:", xdata->name));
|
||||||
@ -569,7 +579,7 @@ static void handle_ncp_serv()
|
|||||||
uint8 namlen;
|
uint8 namlen;
|
||||||
uint8 name[1];
|
uint8 name[1];
|
||||||
} *xdata = (struct XDATA*) responsedata;
|
} *xdata = (struct XDATA*) responsedata;
|
||||||
char name[100];
|
uint8 name[100];
|
||||||
int result = nw_get_volume_name(volume, name);
|
int result = nw_get_volume_name(volume, name);
|
||||||
if (result > -1){
|
if (result > -1){
|
||||||
struct fs_usage fsp;
|
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_files, xdata->total_dirs);
|
||||||
U32_TO_32(fsp.fsu_ffree, xdata->avail_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);
|
strmaxcpy(xdata->name, name, xdata->namlen);
|
||||||
data_len = xdata->namlen + 30;
|
data_len = xdata->namlen + 30;
|
||||||
} else completition = (uint8) -result;
|
} else completition = (uint8) -result;
|
||||||
@ -599,7 +609,7 @@ static void handle_ncp_serv()
|
|||||||
uint8 name[1]; /* Volume Name */
|
uint8 name[1]; /* Volume Name */
|
||||||
} *xdata = (struct XDATA*) responsedata;
|
} *xdata = (struct XDATA*) responsedata;
|
||||||
int result = nw_get_vol_number(dir_handle);
|
int result = nw_get_vol_number(dir_handle);
|
||||||
char name[100];
|
uint8 name[100];
|
||||||
if (result > -1)
|
if (result > -1)
|
||||||
result = nw_get_volume_name(result, name);
|
result = nw_get_volume_name(result, name);
|
||||||
if (result > -1) {
|
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_files, xdata->total_dirs);
|
||||||
U32_TO_32(fsp.fsu_ffree, xdata->avail_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);
|
strmaxcpy(xdata->name, name, xdata->namlen);
|
||||||
data_len = xdata->namlen + 22;
|
data_len = xdata->namlen + 22;
|
||||||
} else completition = (uint8) -result;
|
} else completition = (uint8) -result;
|
||||||
@ -770,8 +780,8 @@ static void handle_ncp_serv()
|
|||||||
struct INPUT {
|
struct INPUT {
|
||||||
uint8 header[7]; /* Requestheader */
|
uint8 header[7]; /* Requestheader */
|
||||||
uint8 reserve; /* 0x1 */
|
uint8 reserve; /* 0x1 */
|
||||||
uint8 fhandle[4]; /* Filehandle */
|
|
||||||
uint8 ext_fhandle[2]; /* all zero */
|
uint8 ext_fhandle[2]; /* all zero */
|
||||||
|
uint8 fhandle[4]; /* Filehandle */
|
||||||
uint8 offset[4];
|
uint8 offset[4];
|
||||||
uint8 size[4];
|
uint8 size[4];
|
||||||
uint8 weisnicht[2]; /* lock timeout ??? */
|
uint8 weisnicht[2]; /* lock timeout ??? */
|
||||||
@ -836,8 +846,8 @@ static void handle_ncp_serv()
|
|||||||
struct INPUT {
|
struct INPUT {
|
||||||
uint8 header[7]; /* Requestheader */
|
uint8 header[7]; /* Requestheader */
|
||||||
uint8 reserve;
|
uint8 reserve;
|
||||||
uint8 fhandle[4]; /* filehandle */
|
|
||||||
uint8 ext_fhandle[2]; /* all zero */
|
uint8 ext_fhandle[2]; /* all zero */
|
||||||
|
uint8 fhandle[4]; /* filehandle */
|
||||||
} *input = (struct INPUT *)ncprequest;
|
} *input = (struct INPUT *)ncprequest;
|
||||||
uint32 fhandle = GET_BE32(input->fhandle);
|
uint32 fhandle = GET_BE32(input->fhandle);
|
||||||
XDPRINTF((2,0, "TODO: COMMIT FILE:fhandle=%ld", fhandle));
|
XDPRINTF((2,0, "TODO: COMMIT FILE:fhandle=%ld", fhandle));
|
||||||
@ -927,11 +937,11 @@ static void handle_ncp_serv()
|
|||||||
struct INPUT {
|
struct INPUT {
|
||||||
uint8 header[7]; /* Requestheader */
|
uint8 header[7]; /* Requestheader */
|
||||||
uint8 reserve;
|
uint8 reserve;
|
||||||
uint8 fhandle[4]; /* filehandle */
|
|
||||||
uint8 ext_fhandle[2]; /* all zero */
|
uint8 ext_fhandle[2]; /* all zero */
|
||||||
|
uint8 fhandle[4]; /* filehandle */
|
||||||
} *input = (struct INPUT *)ncprequest;
|
} *input = (struct INPUT *)ncprequest;
|
||||||
uint32 fhandle = GET_BE32(input->fhandle);
|
uint32 fhandle = GET_BE32(input->fhandle);
|
||||||
completition = (uint8)(-nw_close_datei(fhandle));
|
completition = (uint8)(-nw_close_datei(fhandle, 0));
|
||||||
if (!completition && fhandle == test_handle) {
|
if (!completition && fhandle == test_handle) {
|
||||||
do_druck++;
|
do_druck++;
|
||||||
test_handle = -1;
|
test_handle = -1;
|
||||||
@ -950,8 +960,8 @@ static void handle_ncp_serv()
|
|||||||
uint8 data[1]; /* Name */
|
uint8 data[1]; /* Name */
|
||||||
} *input = (struct INPUT *)ncprequest;
|
} *input = (struct INPUT *)ncprequest;
|
||||||
struct OUTPUT {
|
struct OUTPUT {
|
||||||
uint8 fhandle[4]; /* Filehandle */
|
|
||||||
uint8 extfhandle[2];
|
uint8 extfhandle[2];
|
||||||
|
uint8 fhandle[4]; /* Filehandle */
|
||||||
uint8 reserved[2]; /* rese. by NOVELL */
|
uint8 reserved[2]; /* rese. by NOVELL */
|
||||||
NW_FILE_INFO fileinfo;
|
NW_FILE_INFO fileinfo;
|
||||||
} *xdata= (struct OUTPUT*)responsedata;
|
} *xdata= (struct OUTPUT*)responsedata;
|
||||||
@ -1041,8 +1051,8 @@ static void handle_ncp_serv()
|
|||||||
struct INPUT {
|
struct INPUT {
|
||||||
uint8 header[7]; /* Requestheader */
|
uint8 header[7]; /* Requestheader */
|
||||||
uint8 filler;
|
uint8 filler;
|
||||||
|
uint8 ext_filehandle[2]; /* all zero */
|
||||||
uint8 fhandle[4]; /* Dateihandle */
|
uint8 fhandle[4]; /* Dateihandle */
|
||||||
uint8 ext_filehandle[2]; /* ?? alles 0 */
|
|
||||||
} *input = (struct INPUT *)ncprequest;
|
} *input = (struct INPUT *)ncprequest;
|
||||||
struct OUTPUT {
|
struct OUTPUT {
|
||||||
uint8 size[4]; /* Position ??? */
|
uint8 size[4]; /* Position ??? */
|
||||||
@ -1062,8 +1072,8 @@ static void handle_ncp_serv()
|
|||||||
struct INPUT {
|
struct INPUT {
|
||||||
uint8 header[7]; /* Requestheader */
|
uint8 header[7]; /* Requestheader */
|
||||||
uint8 filler;
|
uint8 filler;
|
||||||
|
uint8 ext_fhandle[2]; /* all zero */
|
||||||
uint8 fhandle[4]; /* filehandle */
|
uint8 fhandle[4]; /* filehandle */
|
||||||
uint8 reserve[2]; /* alles 0 */
|
|
||||||
uint8 offset[4]; /* alles 0 */
|
uint8 offset[4]; /* alles 0 */
|
||||||
uint8 max_size[2]; /* zu lesende Bytes */
|
uint8 max_size[2]; /* zu lesende Bytes */
|
||||||
} *input = (struct INPUT *)ncprequest;
|
} *input = (struct INPUT *)ncprequest;
|
||||||
@ -1093,8 +1103,8 @@ static void handle_ncp_serv()
|
|||||||
uint8 header[7]; /* Requestheader */
|
uint8 header[7]; /* Requestheader */
|
||||||
|
|
||||||
uint8 filler; /* 0 Filler ?? */
|
uint8 filler; /* 0 Filler ?? */
|
||||||
uint8 fhandle[4]; /* Dateihandle */
|
|
||||||
uint8 ext_handle[2];
|
uint8 ext_handle[2];
|
||||||
|
uint8 fhandle[4]; /* Dateihandle */
|
||||||
uint8 offset[4]; /* SEEK OFFSET */
|
uint8 offset[4]; /* SEEK OFFSET */
|
||||||
uint8 size[2]; /* Datasize */
|
uint8 size[2]; /* Datasize */
|
||||||
uint8 data[2]; /* Schreibdaten */
|
uint8 data[2]; /* Schreibdaten */
|
||||||
@ -1116,15 +1126,15 @@ static void handle_ncp_serv()
|
|||||||
case 0x4a : { /* File SERVER COPY */
|
case 0x4a : { /* File SERVER COPY */
|
||||||
/* should be OK */
|
/* should be OK */
|
||||||
struct INPUT {
|
struct INPUT {
|
||||||
uint8 header[7]; /* Requestheader */
|
uint8 header[7]; /* Requestheader */
|
||||||
uint8 reserved; /* Reserved by Novell */
|
uint8 reserved; /* Reserved by Novell */
|
||||||
uint8 qfhandle[4]; /* Quellfile */
|
uint8 qext_fhandle[2]; /* ext Filehandle */
|
||||||
uint8 reserve1[2]; /* ext Filehandle */
|
uint8 qfhandle[4]; /* Quellfile */
|
||||||
uint8 zfhandle[4]; /* Zielfile */
|
uint8 zext_fhandle[2]; /* ext Filehandle */
|
||||||
uint8 reserve2[2]; /* ext Filehandle */
|
uint8 zfhandle[4]; /* Zielfile */
|
||||||
uint8 qoffset[4]; /* Quellfile Offset */
|
uint8 qoffset[4]; /* SourceFile Offset */
|
||||||
uint8 zoffset[4]; /* Zielfile Offset */
|
uint8 zoffset[4]; /* DestFile Offset */
|
||||||
uint8 size[4]; /* Anzahl */
|
uint8 size[4]; /* copysize */
|
||||||
} *input = (struct INPUT *)ncprequest;
|
} *input = (struct INPUT *)ncprequest;
|
||||||
int qfhandle = GET_BE32(input->qfhandle);
|
int qfhandle = GET_BE32(input->qfhandle);
|
||||||
int zfhandle = GET_BE32(input->zfhandle);
|
int zfhandle = GET_BE32(input->zfhandle);
|
||||||
@ -1150,8 +1160,8 @@ static void handle_ncp_serv()
|
|||||||
struct INPUT {
|
struct INPUT {
|
||||||
uint8 header[7]; /* Requestheader */
|
uint8 header[7]; /* Requestheader */
|
||||||
uint8 filler;
|
uint8 filler;
|
||||||
|
uint8 reserve[2]; /* ext Filehandle */
|
||||||
uint8 fhandle[4]; /* Dateihandle */
|
uint8 fhandle[4]; /* Dateihandle */
|
||||||
uint8 reserve[2]; /* ext Filehandle ??? */
|
|
||||||
uint8 zeit[2]; /* time */
|
uint8 zeit[2]; /* time */
|
||||||
uint8 datum[2]; /* date */
|
uint8 datum[2]; /* date */
|
||||||
} *input = (struct INPUT *)ncprequest;
|
} *input = (struct INPUT *)ncprequest;
|
||||||
@ -1177,8 +1187,8 @@ static void handle_ncp_serv()
|
|||||||
uint8 data[2]; /* Name */
|
uint8 data[2]; /* Name */
|
||||||
} *input = (struct INPUT *)ncprequest;
|
} *input = (struct INPUT *)ncprequest;
|
||||||
struct OUTPUT {
|
struct OUTPUT {
|
||||||
|
uint8 ext_fhandle[2]; /* all zero */
|
||||||
uint8 fhandle[4]; /* Dateihandle */
|
uint8 fhandle[4]; /* Dateihandle */
|
||||||
uint8 ext_fhandle[2]; /* z.B 0x0 0x0 */
|
|
||||||
uint8 reserve2[2]; /* z.B 0x0 0x0 */
|
uint8 reserve2[2]; /* z.B 0x0 0x0 */
|
||||||
NW_FILE_INFO fileinfo;
|
NW_FILE_INFO fileinfo;
|
||||||
} *xdata= (struct OUTPUT*)responsedata;
|
} *xdata= (struct OUTPUT*)responsedata;
|
||||||
@ -1216,12 +1226,24 @@ static void handle_ncp_serv()
|
|||||||
break;
|
break;
|
||||||
#endif
|
#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
|
#if 0
|
||||||
case 0x61 : { /* Negotiate Buffer Size, Packetsize new ??? */
|
case 0x61 : { /* Negotiate Buffer Size, Packetsize new ??? */
|
||||||
/* > 3.11 */
|
/* > 3.11 */
|
||||||
/* similar request as 0x21 */
|
/* similar request as 0x21 */
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
default : completition = 0xfb; /* unknown request */
|
default : completition = 0xfb; /* unknown request */
|
||||||
|
4
nwdbm.c
4
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)
|
int nw_set_enpasswd(uint32 obj_id, uint8 *passwd)
|
||||||
{
|
{
|
||||||
uint8 *prop_name="PASSWORD";
|
uint8 *prop_name=(uint8*)"PASSWORD";
|
||||||
if (passwd && *passwd) {
|
if (passwd && *passwd) {
|
||||||
nw_new_create_prop(obj_id, NULL, 0, 0, 0,
|
nw_new_create_prop(obj_id, NULL, 0, 0, 0,
|
||||||
prop_name, P_FL_STAT|P_FL_ITEM, 0x44,
|
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];
|
uint8 s_uid[4];
|
||||||
U32_TO_BE32(obj_id, s_uid);
|
U32_TO_BE32(obj_id, s_uid);
|
||||||
shuffle(s_uid, password, strlen(password), passwd);
|
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",
|
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,
|
password,
|
||||||
(int)passwd[0],
|
(int)passwd[0],
|
||||||
|
369
nwfile.c
Normal file
369
nwfile.c
Normal file
@ -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 <dirent.h>
|
||||||
|
#include <utime.h>
|
||||||
|
|
||||||
|
#include <sys/errno.h>
|
||||||
|
|
||||||
|
#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 */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
38
nwfile.h
Normal file
38
nwfile.h
Normal file
@ -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
|
72
nwroute.c
72
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
|
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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;
|
nr->hops = 0xffff;
|
||||||
} else if (do_delete) {
|
} else if (do_delete) {
|
||||||
nr=nw_servers[k];
|
nr=nw_servers[k];
|
||||||
|
#if !FILE_SERVER_INACTIV
|
||||||
if (!IPXCMPNODE(nr->addr.node, my_server_adr.node) ||
|
if (!IPXCMPNODE(nr->addr.node, my_server_adr.node) ||
|
||||||
!IPXCMPNET (nr->addr.net, my_server_adr.net) ) {
|
!IPXCMPNET (nr->addr.net, my_server_adr.net) )
|
||||||
if (nr->typ == 4) ins_del_bind_net_addr(nr->name, NULL);
|
#endif
|
||||||
|
{
|
||||||
|
ins_del_bind_net_addr(nr->name, nr->typ, NULL);
|
||||||
xfree(nr->name);
|
xfree(nr->name);
|
||||||
memset(nr, 0, sizeof(NW_SERVERS));
|
memset(nr, 0, sizeof(NW_SERVERS));
|
||||||
}
|
}
|
||||||
@ -200,13 +203,15 @@ void insert_delete_server(uint8 *name, /* Server Name */
|
|||||||
} else nr=nw_servers[k];
|
} else nr=nw_servers[k];
|
||||||
/* here now i perhaps must change the entry */
|
/* here now i perhaps must change the entry */
|
||||||
if (nr->hops > 16 || memcmp(&(nr->addr), addr, sizeof(ipxAddr_t))) {
|
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));
|
memcpy(&(nr->addr), addr, sizeof(ipxAddr_t));
|
||||||
|
#if !FILE_SERVER_INACTIV
|
||||||
if (IPXCMPNODE(from_addr->node, my_server_adr.node) &&
|
if (IPXCMPNODE(from_addr->node, my_server_adr.node) &&
|
||||||
IPXCMPNET (from_addr->net, my_server_adr.net)
|
IPXCMPNET (from_addr->net, my_server_adr.net)
|
||||||
&& GET_BE16(from_addr->sock) == SOCK_SAP) {
|
&& GET_BE16(from_addr->sock) == SOCK_SAP) {
|
||||||
hops = 0;
|
hops = 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
if (hops <= nr->hops && 0 != (net = GET_BE32(from_addr->net)) ) {
|
if (hops <= nr->hops && 0 != (net = GET_BE32(from_addr->net)) ) {
|
||||||
nr->net = net;
|
nr->net = net;
|
||||||
@ -384,6 +389,48 @@ void handle_rip(int fd, int ipx_pack_typ,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* <========================= SAP ============================> */
|
/* <========================= 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)
|
static void send_sap_broadcast(int mode)
|
||||||
/* mode=0, standard broadcast */
|
/* mode=0, standard broadcast */
|
||||||
/* mode=1, first trie */
|
/* mode=1, first trie */
|
||||||
@ -448,9 +495,20 @@ void send_sap_rip_broadcast(int mode)
|
|||||||
/* mode=1, first trie */
|
/* mode=1, first trie */
|
||||||
/* mode=2, shutdown */
|
/* mode=2, shutdown */
|
||||||
{
|
{
|
||||||
send_sap_broadcast(mode);
|
static int flipflop=0;
|
||||||
send_rip_broadcast(mode);
|
if (mode) {
|
||||||
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();
|
FILE *f= open_route_info_fn();
|
||||||
if (f) {
|
if (f) {
|
||||||
int k=-1;
|
int k=-1;
|
||||||
|
172
nwroute1.c
Normal file
172
nwroute1.c
Normal file
@ -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);
|
||||||
|
}
|
221
nwserv.c
221
nwserv.c
@ -1,5 +1,5 @@
|
|||||||
/* nwserv.c 14-Jan-96 */
|
/* nwserv.c 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
|
* 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
|
* 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;
|
int anz_net_devices=0;
|
||||||
NW_NET_DEVICE *net_devices[MAX_NET_DEVICES];
|
NW_NET_DEVICE *net_devices[MAX_NET_DEVICES];
|
||||||
|
|
||||||
uint16 ipx_sock_nummern[]={
|
uint16 ipx_sock_nummern[]={ SOCK_AUTO /* WDOG */
|
||||||
#ifdef WDOG_SLOT
|
#if INTERNAL_RIP_SAP
|
||||||
0, /* auto sock */
|
,SOCK_SAP
|
||||||
|
#else
|
||||||
|
,SOCK_AUTO
|
||||||
#endif
|
#endif
|
||||||
SOCK_SAP,
|
|
||||||
SOCK_RIP,
|
#ifdef RIP_SLOT
|
||||||
SOCK_ROUTE,
|
,SOCK_RIP
|
||||||
SOCK_DIAGNOSE
|
#endif
|
||||||
|
|
||||||
|
#ifdef ROUTE_SLOT
|
||||||
|
,SOCK_ROUTE
|
||||||
|
#endif
|
||||||
|
#ifdef DIAG_SLOT
|
||||||
|
,SOCK_DIAGNOSE
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef ECHO_SLOT
|
#ifdef ECHO_SLOT
|
||||||
, SOCK_ECHO
|
,SOCK_ECHO
|
||||||
#endif
|
#endif
|
||||||
#ifdef ERROR_SLOT
|
#ifdef ERROR_SLOT
|
||||||
, SOCK_ERROR
|
,SOCK_ERROR
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NEEDED_SOCKETS (sizeof(ipx_sock_nummern) / sizeof(uint16))
|
#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];
|
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 server_goes_down_secs = 10;
|
||||||
static int save_ipx_routes = 0;
|
static int save_ipx_routes = 0;
|
||||||
|
|
||||||
|
#if !FILE_SERVER_INACTIV
|
||||||
static void write_to_ncpserv(int what, int connection,
|
static void write_to_ncpserv(int what, int connection,
|
||||||
char *data, int data_size)
|
char *data, int data_size)
|
||||||
{
|
{
|
||||||
@ -100,8 +114,15 @@ static void write_to_ncpserv(int what, int connection,
|
|||||||
default : break;
|
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 buf[1024];
|
||||||
uint8 *p = buf;
|
uint8 *p = buf;
|
||||||
@ -109,9 +130,9 @@ void ins_del_bind_net_addr(char *name, ipxAddr_t *adr)
|
|||||||
if (NULL != adr) { /* insert */
|
if (NULL != adr) { /* insert */
|
||||||
*p=0x01;
|
*p=0x01;
|
||||||
p+=2; len+=2;
|
p+=2; len+=2;
|
||||||
U16_TO_BE16(0x4, p);
|
U16_TO_BE16(styp, p);
|
||||||
p+=2; len+=2;
|
p+=2; len+=2;
|
||||||
*p = strlen(name);
|
*p = strlen((char*)name);
|
||||||
strmaxcpy(p+1, name, *p);
|
strmaxcpy(p+1, name, *p);
|
||||||
len += (*p+1); p+=(*p + 1);
|
len += (*p+1); p+=(*p + 1);
|
||||||
memcpy(p, adr, sizeof(ipxAddr_t));
|
memcpy(p, adr, sizeof(ipxAddr_t));
|
||||||
@ -119,31 +140,33 @@ void ins_del_bind_net_addr(char *name, ipxAddr_t *adr)
|
|||||||
} else { /* delete */
|
} else { /* delete */
|
||||||
*p=0x02;
|
*p=0x02;
|
||||||
p+=2; len+=2;
|
p+=2; len+=2;
|
||||||
U16_TO_BE16(0x4, p);
|
U16_TO_BE16(styp, p);
|
||||||
p+=2; len+=2;
|
p+=2; len+=2;
|
||||||
*p = strlen(name);
|
*p = strlen((char*)name);
|
||||||
strmaxcpy(p+1, name, *p);
|
strmaxcpy(p+1, name, *p);
|
||||||
len += (*p+1); p+=(*p + 1);
|
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)
|
static int open_ipx_socket(uint16 sock_nr, int nr, int open_mode)
|
||||||
{
|
{
|
||||||
int ipx_fd=t_open("/dev/ipx", open_mode, NULL);
|
int ipx_fd=t_open("/dev/ipx", open_mode, NULL);
|
||||||
struct t_bind bind;
|
struct t_bind bind;
|
||||||
if (ipx_fd < 0) {
|
if (ipx_fd < 0) {
|
||||||
t_error("t_open !Ok");
|
t_error("t_open !Ok");
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
memset(&my_server_adr, 0, sizeof(ipxAddr_t));
|
||||||
U16_TO_BE16(sock_nr, my_server_adr.sock); /* actual read socket */
|
U16_TO_BE16(sock_nr, my_server_adr.sock); /* actual read socket */
|
||||||
bind.addr.len = sizeof(ipxAddr_t);
|
bind.addr.len = sizeof(ipxAddr_t);
|
||||||
bind.addr.maxlen = sizeof(ipxAddr_t);
|
bind.addr.maxlen = sizeof(ipxAddr_t);
|
||||||
bind.addr.buf = (char*)&my_server_adr;
|
bind.addr.buf = (char*)&my_server_adr;
|
||||||
bind.qlen = 0; /* ever */
|
bind.qlen = 0; /* ever */
|
||||||
|
|
||||||
if (t_bind(ipx_fd, &bind, &bind) < 0){
|
if (t_bind(ipx_fd, &bind, &bind) < 0){
|
||||||
char sxx[200];
|
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_error(sxx);
|
||||||
t_close(ipx_fd);
|
t_close(ipx_fd);
|
||||||
return(-1);
|
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)
|
static int start_ncpserv(char *nwname, ipxAddr_t *addr)
|
||||||
{
|
{
|
||||||
|
#if !FILE_SERVER_INACTIV
|
||||||
int fds_out[2];
|
int fds_out[2];
|
||||||
int fds_in[2];
|
int fds_in[2];
|
||||||
int pid;
|
int pid;
|
||||||
if (pipe(fds_out) < 0 || pipe(fds_in) < 0) return(-1);
|
if (pipe(fds_out) < 0 || pipe(fds_in) < 0) return(-1);
|
||||||
|
|
||||||
|
|
||||||
switch (pid=fork()) {
|
switch (pid=fork()) {
|
||||||
case 0 : { /* new Process */
|
case 0 : { /* new Process */
|
||||||
char *progname="ncpserv";
|
char *progname="ncpserv";
|
||||||
@ -192,6 +217,7 @@ static int start_ncpserv(char *nwname, ipxAddr_t *addr)
|
|||||||
fds_in[1] = -1;
|
fds_in[1] = -1;
|
||||||
fd_ncpserv_in = fds_in[0];
|
fd_ncpserv_in = fds_in[0];
|
||||||
pid_ncpserv = pid;
|
pid_ncpserv = pid;
|
||||||
|
#endif
|
||||||
return(0); /* OK */
|
return(0); /* OK */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -237,7 +263,7 @@ static void send_wdog_packet(ipxAddr_t *addr, int conn, int what)
|
|||||||
modify_wdog_conn(conn, 0);
|
modify_wdog_conn(conn, 0);
|
||||||
XDPRINTF((2,0, "No wdog to %s", visable_ipx_adr(addr)));
|
XDPRINTF((2,0, "No wdog to %s", visable_ipx_adr(addr)));
|
||||||
} else
|
} 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)
|
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
|
* '!' = broadcast waiting inform
|
||||||
* '@' = sft_iii server change over 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 {
|
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,
|
void get_server_data(char *name,
|
||||||
ipxAddr_t *adr,
|
ipxAddr_t *adr,
|
||||||
ipxAddr_t *from_addr)
|
ipxAddr_t *from_addr)
|
||||||
@ -392,19 +396,15 @@ static void handle_sap(int fd,
|
|||||||
{
|
{
|
||||||
int query_type = GET_BE16(ipxdata->sqp.query_type);
|
int query_type = GET_BE16(ipxdata->sqp.query_type);
|
||||||
int server_type = GET_BE16(ipxdata->sqp.server_type);
|
int server_type = GET_BE16(ipxdata->sqp.server_type);
|
||||||
|
|
||||||
if (query_type == 3) {
|
if (query_type == 3) {
|
||||||
XDPRINTF((2,0,"SAP NEAREST SERVER request typ=%d von %s",
|
XDPRINTF((2,0,"SAP NEAREST SERVER request typ=%d von %s",
|
||||||
server_type, visable_ipx_adr(from_addr)));
|
server_type, visable_ipx_adr(from_addr)));
|
||||||
if (server_type == 4) {
|
/* Get Nearest File Server */
|
||||||
/* Get Nearest File Server */
|
send_server_response(4, server_type, from_addr);
|
||||||
send_server_respons(fd, ipx_pack_typ, 4, server_type, from_addr);
|
|
||||||
}
|
|
||||||
} else if (query_type == 1) { /* general Request */
|
} else if (query_type == 1) { /* general Request */
|
||||||
XDPRINTF((2,0, "SAP GENERAL request server_type =%d", server_type));
|
XDPRINTF((2,0, "SAP GENERAL request server_type =%d", server_type));
|
||||||
if (server_type == 4) {
|
send_server_response(2, server_type, from_addr);
|
||||||
/* Get General File Server Request */
|
|
||||||
send_server_respons(fd, ipx_pack_typ, 4, server_type, from_addr);
|
|
||||||
}
|
|
||||||
} else if (query_type == 2 || query_type == 4) {
|
} else if (query_type == 2 || query_type == 4) {
|
||||||
/* periodic general or shutdown response (2)
|
/* periodic general or shutdown response (2)
|
||||||
* or nearests Service Response (4)
|
* 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,
|
XDPRINTF((2,0, "TYP=%2d,hops=%2d, Addr=%s, Name=%s", type, hops,
|
||||||
visable_ipx_adr(ad), name));
|
visable_ipx_adr(ad), name));
|
||||||
|
|
||||||
if (type == 4) /* && strcmp(name, my_nwname)) */ { /* from Fileserver */
|
if (type == 4) { /* from Fileserver */
|
||||||
if (16 == hops) {
|
if (16 == hops) {
|
||||||
/* shutdown */
|
/* shutdown */
|
||||||
XDPRINTF((2,0, "SERVER %s IS GOING DOWN", name));
|
XDPRINTF((2,0, "SERVER %s IS GOING DOWN", name));
|
||||||
insert_delete_server(name, type, NULL, NULL, 16, 1, 0);
|
insert_delete_server(name, type, NULL, NULL, 16, 1, 0);
|
||||||
} else {
|
} 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);
|
insert_delete_server(name, type, ad, from_addr, hops, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
p+=sizeof(SAPS);
|
p+=sizeof(SAPS);
|
||||||
} /* while */
|
} /* while */
|
||||||
} else {
|
} else {
|
||||||
@ -470,6 +469,7 @@ static void handle_sap(int fd,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DIAG_SLOT
|
||||||
static void response_ipx_diag(int fd, int ipx_pack_typ,
|
static void response_ipx_diag(int fd, int ipx_pack_typ,
|
||||||
ipxAddr_t *to_addr)
|
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));
|
(int)ipx_pack_typ, data_len, count));
|
||||||
response_ipx_diag(fd, ipx_pack_typ, from_addr);
|
response_ipx_diag(fd, ipx_pack_typ, from_addr);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void handle_event(int fd, uint16 socknr, int slot)
|
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 (server_down_stamp) return; /* no more interests */
|
||||||
|
|
||||||
|
#if INTERNAL_RIP_SAP
|
||||||
if ( IPXCMPNODE(source_adr.node, my_server_adr.node) &&
|
if ( IPXCMPNODE(source_adr.node, my_server_adr.node) &&
|
||||||
IPXCMPNET (source_adr.net, my_server_adr.net)) {
|
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 */
|
/* it also can be Packets from DOSEMU OR ncpfs on this machine */
|
||||||
XDPRINTF((2,0,"Packet from OWN maschine:sock=0x%x", source_sock));
|
XDPRINTF((2,0,"Packet from OWN maschine:sock=0x%x", source_sock));
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (socknr) {
|
switch (slot) {
|
||||||
case SOCK_SAP : handle_sap( fd, (int) ipx_pack_typ, ud.udata.len, &ipx_data_buff, &source_adr); break;
|
case SAP_SLOT : 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;
|
#ifdef RIP_SLOT
|
||||||
case SOCK_DIAGNOSE : handle_diag(fd, (int) ipx_pack_typ, ud.udata.len, &ipx_data_buff, &source_adr); break;
|
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 :
|
default :
|
||||||
if (WDOG_SLOT == slot) { /* this is a watchdog packet */
|
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)
|
static void get_ini(int full)
|
||||||
{
|
{
|
||||||
FILE *f = open_nw_ini();
|
FILE *f = open_nw_ini();
|
||||||
@ -617,7 +673,7 @@ static void get_ini(int full)
|
|||||||
uint32 node = 1; /* default 1 */
|
uint32 node = 1; /* default 1 */
|
||||||
if (full) {
|
if (full) {
|
||||||
gethostname(my_nwname, 48);
|
gethostname(my_nwname, 48);
|
||||||
upstr(my_nwname);
|
upstr((uint8*)my_nwname);
|
||||||
}
|
}
|
||||||
if (f){
|
if (f){
|
||||||
char buff[500];
|
char buff[500];
|
||||||
@ -635,7 +691,7 @@ static void get_ini(int full)
|
|||||||
case 2 : if (full) {
|
case 2 : if (full) {
|
||||||
strncpy(my_nwname, inhalt, 48);
|
strncpy(my_nwname, inhalt, 48);
|
||||||
my_nwname[47] = '\0';
|
my_nwname[47] = '\0';
|
||||||
upstr(my_nwname);
|
upstr((uint8*)my_nwname);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -650,6 +706,7 @@ static void get_ini(int full)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#if INTERNAL_RIP_SAP
|
||||||
case 4 :
|
case 4 :
|
||||||
if (full) {
|
if (full) {
|
||||||
if (anz_net_devices < MAX_NET_DEVICES &&
|
if (anz_net_devices < MAX_NET_DEVICES &&
|
||||||
@ -682,7 +739,7 @@ static void get_ini(int full)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#ifdef LINUX
|
|
||||||
case 5 : save_ipx_routes=atoi(inhalt);
|
case 5 : save_ipx_routes=atoi(inhalt);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
@ -700,7 +757,7 @@ static void get_ini(int full)
|
|||||||
case 300 : print_route_tac=atoi(inhalt);
|
case 300 : print_route_tac=atoi(inhalt);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 301 : new_str(pr_route_info_fn, inhalt);
|
case 301 : new_str(pr_route_info_fn, (uint8*)inhalt);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 302 : print_route_mode=atoi(inhalt);
|
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 (!print_route_tac) xfree(pr_route_info_fn);
|
||||||
if (full) {
|
if (full) {
|
||||||
#ifdef LINUX
|
#ifdef LINUX
|
||||||
|
# if INTERNAL_RIP_SAP
|
||||||
init_ipx(internal_net, node, ipxdebug);
|
init_ipx(internal_net, node, ipxdebug);
|
||||||
for (k=0; k < anz_net_devices; k++){
|
for (k=0; k < anz_net_devices; k++){
|
||||||
NW_NET_DEVICE *nd=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));
|
nd->devname, frname, nd->net));
|
||||||
init_dev(nd->devname, nd->frame, nd->net);
|
init_dev(nd->devname, nd->frame, nd->net);
|
||||||
}
|
}
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!get_ipx_addr(&my_server_adr)) {
|
if (!get_ipx_addr(&my_server_adr)) {
|
||||||
internal_net = GET_BE32(my_server_adr.net);
|
internal_net = GET_BE32(my_server_adr.net);
|
||||||
} else exit(1);
|
} else exit(1);
|
||||||
@ -781,6 +841,7 @@ static void close_all(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef LINUX
|
#ifdef LINUX
|
||||||
|
# if INTERNAL_RIP_SAP
|
||||||
if (!save_ipx_routes) {
|
if (!save_ipx_routes) {
|
||||||
for (j=0; j<anz_net_devices;j++) {
|
for (j=0; j<anz_net_devices;j++) {
|
||||||
NW_NET_DEVICE *nd=net_devices[j];
|
NW_NET_DEVICE *nd=net_devices[j];
|
||||||
@ -790,8 +851,8 @@ static void close_all(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
exit_ipx(!save_ipx_routes);
|
exit_ipx(!save_ipx_routes);
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void down_server(void)
|
static void down_server(void)
|
||||||
@ -818,6 +879,7 @@ static void sig_quit(int rsig)
|
|||||||
{
|
{
|
||||||
signal(rsig, SIG_IGN);
|
signal(rsig, SIG_IGN);
|
||||||
signal(SIGHUP, SIG_IGN); /* don't want it anymore */
|
signal(SIGHUP, SIG_IGN); /* don't want it anymore */
|
||||||
|
XDPRINTF((2, 0, "Got Signal=%d", rsig));
|
||||||
fl_get_int=2;
|
fl_get_int=2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -874,18 +936,25 @@ int main(int argc, char **argv)
|
|||||||
polls[j].fd = -1;
|
polls[j].fd = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
U16_TO_BE16(SOCK_NCP, my_server_adr.sock);
|
U16_TO_BE16(SOCK_NCP, my_server_adr.sock);
|
||||||
if (!start_ncpserv(my_nwname, &my_server_adr)) {
|
if (!start_ncpserv(my_nwname, &my_server_adr)) {
|
||||||
ipxAddr_t server_adr_sap;
|
|
||||||
/* now do polling */
|
/* now do polling */
|
||||||
time_t broadtime;
|
time_t broadtime;
|
||||||
time(&broadtime);
|
time(&broadtime);
|
||||||
set_sigs();
|
set_sigs();
|
||||||
polls[NEEDED_SOCKETS].fd = fd_ncpserv_in;
|
|
||||||
memcpy(&server_adr_sap, &my_server_adr, sizeof(ipxAddr_t));
|
#if !FILE_SERVER_INACTIV
|
||||||
U16_TO_BE16(SOCK_SAP, server_adr_sap.sock);
|
{
|
||||||
insert_delete_server(my_nwname, 0x4, &my_server_adr, &server_adr_sap, 0, 0, 0);
|
ipxAddr_t server_adr_sap;
|
||||||
|
polls[NEEDED_SOCKETS].fd = fd_ncpserv_in;
|
||||||
|
U16_TO_BE16(SOCK_NCP, my_server_adr.sock);
|
||||||
|
memcpy(&server_adr_sap, &my_server_adr, sizeof(ipxAddr_t));
|
||||||
|
U16_TO_BE16(SOCK_SAP, server_adr_sap.sock);
|
||||||
|
insert_delete_server((uint8*)my_nwname, 0x4,
|
||||||
|
&my_server_adr, &server_adr_sap, 0, 0, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
int anz_poll = poll(polls, NEEDED_POLLS, broadsecs);
|
int anz_poll = poll(polls, NEEDED_POLLS, broadsecs);
|
||||||
time(&akttime_stamp);
|
time(&akttime_stamp);
|
||||||
@ -968,12 +1037,18 @@ int main(int argc, char **argv)
|
|||||||
if (server_down_stamp) {
|
if (server_down_stamp) {
|
||||||
if (akttime_stamp - server_down_stamp > server_goes_down_secs) break;
|
if (akttime_stamp - server_down_stamp > server_goes_down_secs) break;
|
||||||
} else {
|
} 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 */
|
send_sap_rip_broadcast((broadsecs<3000) ? 1 :0); /* firsttime broadcast */
|
||||||
if (broadsecs < 32000) {
|
if (broadsecs < 30000) {
|
||||||
rip_for_net(MAX_U32);
|
rip_for_net(MAX_U32);
|
||||||
get_servers();
|
get_servers();
|
||||||
broadsecs *= 2;
|
broadsecs *= 2;
|
||||||
|
if (broadsecs > 30000)
|
||||||
|
#if INTERNAL_RIP_SAP
|
||||||
|
broadsecs = 30000; /* every 30 sec. */
|
||||||
|
#else
|
||||||
|
broadsecs = 60000; /* every 60 sec. */
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
send_wdogs();
|
send_wdogs();
|
||||||
broadtime = akttime_stamp;
|
broadtime = akttime_stamp;
|
||||||
|
26
nwserv.h
26
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
|
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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[];
|
extern NW_NET_DEVICE *net_devices[];
|
||||||
|
|
||||||
/* <======== SOCKETS =========> */
|
/* <======== SOCKETS =========> */
|
||||||
#define WDOG_SLOT 0 /* Watchdog send + recv */
|
#define WDOG_SLOT 0 /* Watchdog send + recv */
|
||||||
#define SAP_SLOT 1
|
#define SAP_SLOT 1 /* SAP wellkwon or dynamic */
|
||||||
#define RIP_SLOT (SAP_SLOT +1)
|
|
||||||
#define ROUTE_SLOT (RIP_SLOT +1)
|
#if INTERNAL_RIP_SAP
|
||||||
#define DIAG_SLOT (ROUTE_SLOT +1)
|
# define RIP_SLOT (SAP_SLOT +1)
|
||||||
#if 0
|
# if 0
|
||||||
#define ECHO_SLOT (DIAG_SLOT +1)
|
# define ROUTE_SLOT (RIP_SLOT +1)
|
||||||
#define ERR_SLOT (ECHO_SLOT +1)
|
# define DIAG_SLOT (ROUTE_SLOT +1)
|
||||||
|
# define ECHO_SLOT (DIAG_SLOT +1)
|
||||||
|
# define ERR_SLOT (ECHO_SLOT +1)
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern int sockfd[];
|
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 send_sap_rip_broadcast(int mode);
|
||||||
extern void rip_for_net(uint32 net);
|
extern void rip_for_net(uint32 net);
|
||||||
extern void get_servers(void);
|
extern void get_servers(void);
|
||||||
|
17
nwvolume.c
17
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
|
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@ -20,6 +20,12 @@
|
|||||||
|
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <sys/vfs.h>
|
#include <sys/vfs.h>
|
||||||
|
|
||||||
|
#ifndef LINUX
|
||||||
|
#include <sys/statvfs.h>
|
||||||
|
#define statfs statvfs
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <utime.h>
|
#include <utime.h>
|
||||||
|
|
||||||
#include "nwvolume.h"
|
#include "nwvolume.h"
|
||||||
@ -74,6 +80,9 @@ void nw_init_volumes(FILE *f)
|
|||||||
case 'p' : nw_volumes[used_nw_volumes].options
|
case 'p' : nw_volumes[used_nw_volumes].options
|
||||||
|= VOL_OPTION_IS_PIPE; break;
|
|= VOL_OPTION_IS_PIPE; break;
|
||||||
|
|
||||||
|
case 'm' : nw_volumes[used_nw_volumes].options
|
||||||
|
|= VOL_OPTION_REMOUNT; break;
|
||||||
|
|
||||||
default : break;
|
default : break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -181,7 +190,7 @@ int nw_get_volume_name(int volnr, uint8 *volname)
|
|||||||
if (volnr < MAX_NW_VOLS) result=0;
|
if (volnr < MAX_NW_VOLS) result=0;
|
||||||
}
|
}
|
||||||
if (nw_debug > 4) {
|
if (nw_debug > 4) {
|
||||||
char xvolname[10];
|
uint8 xvolname[10];
|
||||||
if (!volname) {
|
if (!volname) {
|
||||||
volname = xvolname;
|
volname = xvolname;
|
||||||
*volname = '\0';
|
*volname = '\0';
|
||||||
@ -220,10 +229,10 @@ static int get_fs_usage(char *path, struct fs_usage *fsp)
|
|||||||
return(0);
|
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 */
|
/* 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);
|
return((volnr>-1 && !get_fs_usage(nw_volumes[volnr].unixname, fsu)) ? 0 : -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
15
nwvolume.h
15
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
|
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
#ifndef _NWVOLUME_H_
|
||||||
|
#define _NWVOLUME_H_
|
||||||
|
|
||||||
#define MAX_DEV_NAMESPACE_MAPS 256
|
#define MAX_DEV_NAMESPACE_MAPS 256
|
||||||
|
|
||||||
@ -31,16 +33,16 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8 *sysname; /* VOL_NAME */
|
uint8 *sysname; /* VOL_NAME */
|
||||||
uint8 *unixname; /* UNIX-Verzeichnis */
|
uint8 *unixname; /* UNIX-DIR */
|
||||||
int unixnamlen; /* len of unixname */
|
int unixnamlen; /* len of unixname */
|
||||||
DEV_NAMESPACE_MAP *dev_namespace_maps[MAX_DEV_NAMESPACE_MAPS];
|
DEV_NAMESPACE_MAP *dev_namespace_maps[MAX_DEV_NAMESPACE_MAPS];
|
||||||
int maps_count; /* count of 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;
|
} NW_VOL;
|
||||||
|
|
||||||
#define VOL_OPTION_DOWNSHIFT 1
|
#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 */
|
/* stolen from GNU-fileutils */
|
||||||
/* Space usage statistics for a filesystem. Blocks are 512-byte. */
|
/* 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 void nw_init_volumes(FILE *f);
|
||||||
extern int nw_get_volume_number(uint8 *volname, int namelen);
|
extern int nw_get_volume_number(uint8 *volname, int namelen);
|
||||||
extern int nw_get_volume_name(int volnr, uint8 *volname);
|
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 int get_volume_options(int volnr, int mode);
|
||||||
|
|
||||||
extern uint32 nw_vol_inode_to_handle(int volume, ino_t inode,
|
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,
|
extern ino_t nw_vol_handle_to_inode(int volume, uint32 handle,
|
||||||
DEV_NAMESPACE_MAP *dnm);
|
DEV_NAMESPACE_MAP *dnm);
|
||||||
|
#endif
|
||||||
|
24
tools.c
24
tools.c
@ -19,6 +19,13 @@
|
|||||||
#include "net.h"
|
#include "net.h"
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#ifndef LINUX
|
||||||
|
#include <errno.h>
|
||||||
|
extern int _sys_nerr;
|
||||||
|
extern char _sys_errlist[];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
int nw_debug=0;
|
int nw_debug=0;
|
||||||
FILE *logfile=stdout;
|
FILE *logfile=stdout;
|
||||||
|
|
||||||
@ -27,7 +34,8 @@ static char *modnames[] =
|
|||||||
{ "???????",
|
{ "???????",
|
||||||
"NWSERV ",
|
"NWSERV ",
|
||||||
"NCPSERV",
|
"NCPSERV",
|
||||||
"NWCONN " };
|
"NWCONN ",
|
||||||
|
"NWCLIEN" };
|
||||||
|
|
||||||
static char *get_modstr(void)
|
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);
|
if (slen) memcpy(dest, source, slen);
|
||||||
dest[slen] = '\0';
|
dest[slen] = '\0';
|
||||||
return(slen);
|
return(slen);
|
||||||
@ -69,7 +77,7 @@ int strmaxcpy(char *dest, char *source, int len)
|
|||||||
|
|
||||||
int x_x_xnewstr(uint8 **p, uint8 *s)
|
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);
|
if (*p != (uint8 *)NULL) free((char*)*p);
|
||||||
*p = (uint8*)xmalloc(len+1);
|
*p = (uint8*)xmalloc(len+1);
|
||||||
if (len) strcpy((char*)(*p), (char*)s);
|
if (len) strcpy((char*)(*p), (char*)s);
|
||||||
@ -87,6 +95,7 @@ void dprintf(char *p, ...)
|
|||||||
va_end(ap);
|
va_end(ap);
|
||||||
fprintf(logfile, "\n");
|
fprintf(logfile, "\n");
|
||||||
fflush(logfile);
|
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){
|
if (len > se+1 && se > 0 && se < 4 && ppi){
|
||||||
char sx[10];
|
char sx[10];
|
||||||
int fentry;
|
int fentry;
|
||||||
strmaxcpy(sx, buff, se);
|
strmaxcpy((uint8*)sx, (uint8*)buff, se);
|
||||||
fentry = atoi(sx);
|
fentry = atoi(sx);
|
||||||
if (fentry > 0 && ((!entry) || entry == fentry)) {
|
if (fentry > 0 && ((!entry) || entry == fentry)) {
|
||||||
if (ppe) *(ppe+1) = '\0';
|
if (ppe) *(ppe+1) = '\0';
|
||||||
strmaxcpy(str, ppi, strsize-1);
|
strmaxcpy((uint8*)str, (uint8*)ppi, strsize-1);
|
||||||
if (do_open) fclose(f);
|
if (do_open) fclose(f);
|
||||||
return(fentry);
|
return(fentry);
|
||||||
}
|
}
|
||||||
@ -194,6 +203,7 @@ void get_ini_debug(int module)
|
|||||||
* 1 = nwserv
|
* 1 = nwserv
|
||||||
* 2 = ncpserv
|
* 2 = ncpserv
|
||||||
* 3 = nwconn
|
* 3 = nwconn
|
||||||
|
* 4 = nwclient
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
int debug = get_ini_int(100+module);
|
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 */
|
while (0 != (what=get_ini_entry(f, 0, buff, sizeof(buff)))) { /* daemonize */
|
||||||
if (200 == what) dodaemon = atoi(buff);
|
if (200 == what) dodaemon = atoi(buff);
|
||||||
else if (201 == what) {
|
else if (201 == what) {
|
||||||
strmaxcpy(logfilename, buff, sizeof(logfilename)-1);
|
strmaxcpy((uint8*)logfilename, (uint8*)buff, sizeof(logfilename)-1);
|
||||||
withlog++;
|
withlog++;
|
||||||
} else if (202 == what) {
|
} else if (202 == what) {
|
||||||
new_log = atoi(buff);
|
new_log = atoi(buff);
|
||||||
|
7
tools.h
7
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
|
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
|
||||||
*
|
*
|
||||||
@ -21,6 +21,7 @@
|
|||||||
#define NWSERV 1
|
#define NWSERV 1
|
||||||
#define NCPSERV 2
|
#define NCPSERV 2
|
||||||
#define NWCONN 3
|
#define NWCONN 3
|
||||||
|
#define NWCLIENT 4
|
||||||
|
|
||||||
extern FILE *logfile;
|
extern FILE *logfile;
|
||||||
extern void x_x_xfree(char **p);
|
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 *xmalloc(uint size);
|
||||||
extern char *xcmalloc(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 dprintf(char *p, ...);
|
||||||
extern void xdprintf(int dlevel, int mode, char *p, ...);
|
extern void xdprintf(int dlevel, int mode, char *p, ...);
|
||||||
extern void errorp(int mode, char *what, char *p, ...);
|
extern void errorp(int mode, char *what, char *p, ...);
|
||||||
@ -52,8 +53,10 @@ extern int nw_debug;
|
|||||||
#ifdef DB
|
#ifdef DB
|
||||||
# define DPRINTF(x) dprintf x
|
# define DPRINTF(x) dprintf x
|
||||||
# define XDPRINTF(x) xdprintf x
|
# define XDPRINTF(x) xdprintf x
|
||||||
|
# define D() XDPRINTF((3, 0, "Z: %d" , __LINE__));
|
||||||
#else
|
#else
|
||||||
# define DPRINTF(x) /* */
|
# define DPRINTF(x) /* */
|
||||||
# define XDPRINTF(x) /* */
|
# define XDPRINTF(x) /* */
|
||||||
|
# define D() /* */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user