mars_nwe-0.97.pl04
This commit is contained in:
parent
da30e32a01
commit
32780f7403
56
connect.c
56
connect.c
@ -808,6 +808,8 @@ static int do_delete_file(NW_PATH *nwpath, FUNC_SEARCH *fs)
|
|||||||
XDPRINTF((5,0,"DELETE FILE unname:%s:", unname));
|
XDPRINTF((5,0,"DELETE FILE unname:%s:", unname));
|
||||||
if (get_volume_options(nwpath->volume, 1) & VOL_OPTION_IS_PIPE)
|
if (get_volume_options(nwpath->volume, 1) & VOL_OPTION_IS_PIPE)
|
||||||
return(0); /* don't delete 'pipe commands' */
|
return(0); /* don't delete 'pipe commands' */
|
||||||
|
else if (get_volume_options(nwpath->volume, 1) & VOL_OPTION_READONLY)
|
||||||
|
return(-0x8a); /* don't delete 'readonly' */
|
||||||
if (!unlink(unname)) return(0);
|
if (!unlink(unname)) return(0);
|
||||||
return(-0x8a); /* NO Delete Privileges */
|
return(-0x8a); /* NO Delete Privileges */
|
||||||
}
|
}
|
||||||
@ -828,10 +830,13 @@ static int do_set_file_info(NW_PATH *nwpath, FUNC_SEARCH *fs)
|
|||||||
{
|
{
|
||||||
char unname[256];
|
char unname[256];
|
||||||
NW_FILE_INFO *f=(NW_FILE_INFO*)fs->ubuf;
|
NW_FILE_INFO *f=(NW_FILE_INFO*)fs->ubuf;
|
||||||
|
int voloption;
|
||||||
strcpy(unname, build_unix_name(nwpath, 0));
|
strcpy(unname, build_unix_name(nwpath, 0));
|
||||||
XDPRINTF((5,0,"set_file_info unname:%s:", unname));
|
XDPRINTF((5,0,"set_file_info unname:%s:", unname));
|
||||||
if (get_volume_options(nwpath->volume, 1) & VOL_OPTION_IS_PIPE)
|
if ((voloption = get_volume_options(nwpath->volume, 1)) & VOL_OPTION_IS_PIPE)
|
||||||
return(0); /* don't change 'pipe commands' */
|
return(0); /* don't change 'pipe commands' */
|
||||||
|
else if (voloption & VOL_OPTION_READONLY)
|
||||||
|
return(-0x8c); /* no modify rights */
|
||||||
else {
|
else {
|
||||||
struct utimbuf ut;
|
struct utimbuf ut;
|
||||||
ut.actime = ut.modtime = nw_2_un_time(f->modify_date, f->modify_time);
|
ut.actime = ut.modtime = nw_2_un_time(f->modify_date, f->modify_time);
|
||||||
@ -882,7 +887,6 @@ int nw_chmod_datei(int dir_handle, uint8 *data, int len, int modus)
|
|||||||
return(-0x9c); /* wrong path */
|
return(-0x9c); /* wrong path */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
NW_PATH nwpath;
|
NW_PATH nwpath;
|
||||||
@ -891,26 +895,35 @@ int nw_mk_rd_dir(int dir_handle, uint8 *data, int len, int mode)
|
|||||||
if (completition > -1) {
|
if (completition > -1) {
|
||||||
char unname[256];
|
char unname[256];
|
||||||
strcpy(unname, build_unix_name(&nwpath, 2));
|
strcpy(unname, build_unix_name(&nwpath, 2));
|
||||||
#if 0
|
if (get_volume_options(nwpath.volume, 1) & VOL_OPTION_READONLY)
|
||||||
if (unname[0] && unname[1]) {
|
return(mode ? -0x84 : -0x8a);
|
||||||
char *p=unname+strlen(unname)-1;
|
|
||||||
if (*p=='/') *p = '\0';
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (mode) {
|
if (mode) {
|
||||||
XDPRINTF((5,0,"MKDIR dirname:%s:", unname));
|
XDPRINTF((5,0,"MKDIR dirname:%s:", unname));
|
||||||
if (!mkdir(unname, 0777)) return(0);
|
if (!mkdir(unname, 0777)) return(0);
|
||||||
completition = -0x84; /* No Create Priv.*/ /* -0x9f Direktory Aktive */
|
completition = -0x84; /* No Create Priv.*/ /* -0x9f Direktory Aktive */
|
||||||
} else { /* rmdir */
|
} else { /* rmdir */
|
||||||
|
int j = -1;
|
||||||
|
while (++j < (int)anz_dirhandles){
|
||||||
|
DIR_HANDLE *fh=&(dir_handles[j]);
|
||||||
|
if (fh->inode == completition && fh->f != (DIR*) NULL) {
|
||||||
|
closedir(fh->f);
|
||||||
|
fh->f = (DIR*)NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
XDPRINTF((5,0,"RMDIR dirname:%s:", unname));
|
XDPRINTF((5,0,"RMDIR dirname:%s:", unname));
|
||||||
|
|
||||||
if (!rmdir(unname)) {
|
if (!rmdir(unname)) {
|
||||||
NW_DIR *d=&(dirs[0]);
|
NW_DIR *d=&(dirs[0]);
|
||||||
int j = 0;
|
j = 0;
|
||||||
while (j++ < (int)used_dirs){
|
while (j++ < (int)used_dirs){
|
||||||
if (d->inode == completition) d->inode = 0;
|
if (d->inode == completition) d->inode = 0;
|
||||||
d++;
|
d++;
|
||||||
}
|
}
|
||||||
|
j = -1;
|
||||||
|
while (++j < (int)anz_dirhandles){
|
||||||
|
DIR_HANDLE *fh=&(dir_handles[j]);
|
||||||
|
if (fh->inode == completition) free_dir_handle(j+1);
|
||||||
|
}
|
||||||
completition = 0;
|
completition = 0;
|
||||||
} else if (errno == EEXIST)
|
} else if (errno == EEXIST)
|
||||||
completition = -0xa0; /* dir not empty */
|
completition = -0xa0; /* dir not empty */
|
||||||
@ -929,11 +942,12 @@ int mv_file(int qdirhandle, uint8 *q, int qlen,
|
|||||||
if (!completition > -1) {
|
if (!completition > -1) {
|
||||||
completition=conn_get_kpl_path(&zielpath, zdirhandle, z, zlen, 0);
|
completition=conn_get_kpl_path(&zielpath, zdirhandle, z, zlen, 0);
|
||||||
if (completition > -1) {
|
if (completition > -1) {
|
||||||
if (get_volume_options(quellpath.volume, 1) &
|
int optq = get_volume_options(quellpath.volume, 1);
|
||||||
VOL_OPTION_IS_PIPE ||
|
int optz = get_volume_options(zielpath.volume, 1);
|
||||||
get_volume_options(zielpath.volume, 1) &
|
if ((optq & VOL_OPTION_IS_PIPE) ||
|
||||||
VOL_OPTION_IS_PIPE)
|
(optz & VOL_OPTION_IS_PIPE)) completition = -0x9c;
|
||||||
completition = -0x9c;
|
else if ((optq & VOL_OPTION_READONLY) ||
|
||||||
|
(optz & VOL_OPTION_READONLY)) completition = -0x8b;
|
||||||
}
|
}
|
||||||
if (completition > -1){
|
if (completition > -1){
|
||||||
char unquelle[256];
|
char unquelle[256];
|
||||||
@ -942,7 +956,7 @@ int mv_file(int qdirhandle, uint8 *q, int qlen,
|
|||||||
strcpy(unziel, build_unix_name(&zielpath,0));
|
strcpy(unziel, build_unix_name(&zielpath,0));
|
||||||
if (!link(unquelle, unziel)){
|
if (!link(unquelle, unziel)){
|
||||||
if (unlink(unquelle)) {
|
if (unlink(unquelle)) {
|
||||||
completition=-0x9c;
|
completition=-0x8b;
|
||||||
/* TODO: here completition must be no pernmissions */
|
/* TODO: here completition must be no pernmissions */
|
||||||
unlink(unziel);
|
unlink(unziel);
|
||||||
}
|
}
|
||||||
@ -968,9 +982,12 @@ int mv_dir(int dir_handle, uint8 *q, int qlen,
|
|||||||
memcpy(&zielpath, &quellpath, sizeof(NW_PATH));
|
memcpy(&zielpath, &quellpath, sizeof(NW_PATH));
|
||||||
strmaxcpy(zielpath.fn, z, zlen);
|
strmaxcpy(zielpath.fn, z, zlen);
|
||||||
if (completition > -1) {
|
if (completition > -1) {
|
||||||
if (get_volume_options(quellpath.volume, 1) &
|
int optq = get_volume_options(quellpath.volume, 1);
|
||||||
VOL_OPTION_IS_PIPE)
|
int optz = get_volume_options(zielpath.volume, 1);
|
||||||
completition = -0x9c;
|
if ((optq & VOL_OPTION_IS_PIPE) ||
|
||||||
|
(optz & VOL_OPTION_IS_PIPE)) completition = -0x9c;
|
||||||
|
else if ((optq & VOL_OPTION_READONLY) ||
|
||||||
|
(optz & VOL_OPTION_READONLY)) completition = -0x8b;
|
||||||
}
|
}
|
||||||
if (completition > -1){
|
if (completition > -1){
|
||||||
int result;
|
int result;
|
||||||
@ -978,6 +995,7 @@ int mv_dir(int dir_handle, uint8 *q, int qlen,
|
|||||||
char unziel[256];
|
char unziel[256];
|
||||||
strcpy(unquelle, build_unix_name(&quellpath, 0));
|
strcpy(unquelle, build_unix_name(&quellpath, 0));
|
||||||
strcpy(unziel, build_unix_name(&zielpath, 0));
|
strcpy(unziel, build_unix_name(&zielpath, 0));
|
||||||
|
|
||||||
result = unx_mvdir((uint8 *)unquelle, (uint8 *)unziel);
|
result = unx_mvdir((uint8 *)unquelle, (uint8 *)unziel);
|
||||||
XDPRINTF((2,0, "rendir result=%d, '%s'->'%s'",
|
XDPRINTF((2,0, "rendir result=%d, '%s'->'%s'",
|
||||||
result, unquelle, unziel));
|
result, unquelle, unziel));
|
||||||
|
11
doc/CHANGES
11
doc/CHANGES
@ -120,4 +120,15 @@ Erste 'oeffentliche' Version
|
|||||||
- Parameter -k fuer SIGTERM und -h fuer SIGHUP eingebaut.
|
- Parameter -k fuer SIGTERM und -h fuer SIGHUP eingebaut.
|
||||||
- eigene 'pipe' Routine fuer Druck Queue Aufruf eingebaut.
|
- eigene 'pipe' Routine fuer Druck Queue Aufruf eingebaut.
|
||||||
- namespace services call rename file/dir eingebaut.
|
- namespace services call rename file/dir eingebaut.
|
||||||
|
<----- ^^^^^^^^^^ pl3 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
- utmp/wtmp Ipx-Adresseintraege korrigiert.
|
||||||
|
- setgroups(0,NULL) in nwserv eingbaut. (security)
|
||||||
|
- falls internal net = 0 wird nun die IP Nummer als internal net verwendet.
|
||||||
|
- Zugriffsrechte Bindery erweitert und korrigiert.
|
||||||
|
- Volume option -r fuer readonly eingebaut.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
373
doc/HOWTO.ger
Normal file
373
doc/HOWTO.ger
Normal file
@ -0,0 +1,373 @@
|
|||||||
|
Dieses HowTo ist noch unfertig.
|
||||||
|
|
||||||
|
Aktuelle Version erhaeltlich bei:
|
||||||
|
Hardy Buchholz <hardy@kool.f.eunet.de>
|
||||||
|
|
||||||
|
|
||||||
|
ALLGEMEINES
|
||||||
|
^^^^^^^^^^^
|
||||||
|
|
||||||
|
MARS_NWE ist ein frei erhaeltlicher Netware-Emulator fuer Linux.
|
||||||
|
(auch fuer Unixware)
|
||||||
|
|
||||||
|
|
||||||
|
IPX
|
||||||
|
^^^
|
||||||
|
|
||||||
|
|
||||||
|
QUICKINST (fuer alle Ungeduldigen und Wiederholungstaeter ;-)
|
||||||
|
^^^^^^^^^
|
||||||
|
1. "make" aufrufen.
|
||||||
|
2. "config.h" evtl. anpassen.
|
||||||
|
3. "make" aufrufen.
|
||||||
|
4. "nw.ini" zum Konfigurieren des Servers bearbeiten.
|
||||||
|
5. "make install" (und dann "make install_ini" wenn neue Konf-Datei).
|
||||||
|
6. "nwserv" starten, MsDOS | WIN | WfW | WIN95 | OS/2-Clients starten,
|
||||||
|
einloggen, Spass haben ;-)
|
||||||
|
|
||||||
|
|
||||||
|
Und wenns dann doch nicht funktioniert:
|
||||||
|
|
||||||
|
INSTALLATION
|
||||||
|
^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Kernel
|
||||||
|
^^^^^^
|
||||||
|
Voraussetzung um MARS_NWE laufen zu lassen ist ein Kernel mit
|
||||||
|
IPX-Option. Grundsaetzlich sollte der MARS_NWE unter allen neueren
|
||||||
|
Kernelversionen nutzbar sein. Die Kernelpatches aus dem Verzeichniss
|
||||||
|
"mars_mwe/examples" sind keine Vorraussetzung, steigern die
|
||||||
|
Performance des Servers aber ganz erheblich (ca. 30-40%). Weiter wird
|
||||||
|
dringend empfohlen, die Option FULL_INTERNAL_NET in der
|
||||||
|
Kernel-Konfiguration auf NEIN zu setzen. Sind die genannten
|
||||||
|
Bedingungen erfuellt, steht der Installation vom MARS_NWE von der
|
||||||
|
Linux-Seite nichts mehr im Weg, andernfalls sollte zuerst ein neuer
|
||||||
|
Kernel erzeugt (IPX = Y, FULL_INTERNAL_NET = N, Patch eingespielt?)
|
||||||
|
und Linux neu gebootet werden.
|
||||||
|
|
||||||
|
|
||||||
|
Novell
|
||||||
|
^^^^^^
|
||||||
|
Im Augenblick (Mai 96) werden noch einige Novell-Dateien benoetigt, um
|
||||||
|
sich z.b. auf dem Server anzumelden, Printqueues einzurichten etc.
|
||||||
|
Ausserdem muss ein Verzeichniss existieren, dass spaeter als Volume
|
||||||
|
"SYS" genutzt werden kann. Als minimale Dateien werden "LOGIN.EXE",
|
||||||
|
"CAPTURE.EXE", "MAP.EXE" und vielleicht noch "SYSCON.EXE" gebraucht.
|
||||||
|
In allernaechster Zukunft sollte es von Martin Stover auch die
|
||||||
|
"mars_dosutils" geben, so dass auf die Novell-Files verzichtet werden
|
||||||
|
kann. Damit ist dann ein vollwertiger Netware-kompatibler Server als
|
||||||
|
Freeware fuer Linux verfuegbar. Die Novell-Unterverzeichnisse "LOGIN",
|
||||||
|
"PUBLIC", "SYSTEM" und "MAIL" werden beim ersten Aufruf von "nwserv"
|
||||||
|
automatisch erzeugt (dafuer sollte der Eintrag 16 in der
|
||||||
|
"nw.ini/nwserv.conf" auf 1 bleiben). Man kann also mars_nwe, nachdem
|
||||||
|
in der nwserv.conf Datei der SYS Eintrag bearbeitet wurde, erstmal
|
||||||
|
einmal starten und dann per Client versuchen einen attach zu erhalten.
|
||||||
|
Der Client muss dann ein leeres LOGIN Verzeichnis bzw. Volume (bei
|
||||||
|
vlms) vorfinden. Dann sollte sich der Client mit einem extern
|
||||||
|
gestarteten LOGIN.EXE oder entsprechendem aus mars_dosutils auf dem
|
||||||
|
Server als Supervisor einloggen und die benoetigten Dateien ins LOGIN
|
||||||
|
Verzeichniss kopieren. Dieses hat den Vorteil, dass die Dateien in der
|
||||||
|
richtigen Schreibweise gross bzw. klein in das Verzeichnis kopiert
|
||||||
|
werden. Dateinamen die nicht in das Dos-Schema passen, oder
|
||||||
|
irrtuemlich in Gross- und Kleinschreibung gemischt wurden, sind
|
||||||
|
spaeter fuer den Client schlicht nicht sichtbar (waere z.b. bei LOGIN.
|
||||||
|
EXE nicht so schoen, wenns unsichtbar bliebe ;-).
|
||||||
|
|
||||||
|
|
||||||
|
Directories
|
||||||
|
^^^^^^^^^^^
|
||||||
|
Wie bereits gesagt muss wenigstens ein Verzeichniss mit der
|
||||||
|
Novell-Directory-Struktur existieren, wofuer der "nwserv" aber mit
|
||||||
|
Eintrag 16=1 in der nwserv.conf selbst sorgt. Daneben wird ein oder
|
||||||
|
mehrere Verzeichnisse gebraucht, die als Uebergabeverzeichnisse fuer
|
||||||
|
die Printqueues und eventuell eingerichtete Pipe-Dateien dienen.
|
||||||
|
Letztere koennen aber jederzeit nachtraeglich angelegt und auch neu
|
||||||
|
konfiguriert werden, unverzichtbar ist nur das Verzeichniss mit den
|
||||||
|
Novell-Directories, dass spaeter als Volume SYS freigegeben wird.
|
||||||
|
Generell ist es bestimmt keine schlechte Idee, alle Verzeichnisse und
|
||||||
|
Files, die fuer die Clients sichtbar sein sollen, gross zu schreiben.
|
||||||
|
|
||||||
|
|
||||||
|
MARS_NWE
|
||||||
|
^^^^^^^^
|
||||||
|
Die aktuelle Version vom MARS_NWE auspacken, was jetzt wohl schon
|
||||||
|
passiert ;-) ist. Wenn alles komplett ist, gibts jetzt die
|
||||||
|
Verzeichnisse "mars_nwe", "mars_nwe/examples" und "mars_nwe/doc". Im
|
||||||
|
doc-Verzeichniss sind ein paar Texte zum MARS_NWE und im
|
||||||
|
examples-Verzeichniss finden sich u.a. die bereits besprochenen
|
||||||
|
Patches. Hat bisher alles geklappt, kann jetzt der erste "make"
|
||||||
|
aufgerufen werden. Damit werden die Dateien "mk.li" und "config.h"
|
||||||
|
erzeugt. "mk. li" ist ein Scriptfile, mit dessen Hilfe der "make" fuer
|
||||||
|
Linux angepasst wird und braucht fuer Linux normalerweise nicht
|
||||||
|
veraendert werden, die "config.h" (die eigentliche Konfigurationsdatei
|
||||||
|
fuer "make" und den Compilerlauf) sollte aber wenigstens kontrolliert
|
||||||
|
werden.
|
||||||
|
Im Einzelnen kann man hier Folgendes einstellen:
|
||||||
|
Mit DO_DEBUG wird gesteuert, ob der Debugging-Code mit compiliert
|
||||||
|
werden soll. Generell ist besser mit debug-code, denn der Debug-Level
|
||||||
|
kann dann spaeter ueber die nwserv.conf eingestellt werden.
|
||||||
|
Abhaengig vom Eintrag DO_TESTING wird der MARS_NWE nur local (im
|
||||||
|
aktuellen Verzeichniss) oder endgueltig installiert.
|
||||||
|
Die meisten folgenden Eintraege sind selbsterklaerend (MAX_CONNECTIONS
|
||||||
|
...). Um MARS_NWE mit ncpfs oder WIN95 zu betreiben sollte
|
||||||
|
WITH_NAMESPACE_CALLS = 1 gesetzt werden.
|
||||||
|
INTERNAL_RIP_SAP ist standard auf 1, soll der MARS_NWE aber nur als
|
||||||
|
Server und nicht als Router eingesetzt werden, muss es auf Null
|
||||||
|
gesetzt werden, dann muss aber auch das Routing von Hand eingerichtet
|
||||||
|
werden und es wird ein externer RIP/SAP Daemon benoetigt. Wenn dieser
|
||||||
|
Define auf Null gesetzt ist, wird beim compilieren ein tool namens
|
||||||
|
"nwrouted" erzeugt. Dies ist der Routingund IPX-Konfigurationsteil aus
|
||||||
|
MARS_NWE. Er kann z.B. verwendet werden, wenn Linux normalerweise ohne
|
||||||
|
MARS_NWE lauft, IPX-Routing aber (z.B. fuer Linux als IPX-Client)
|
||||||
|
gebraucht wird, bzw. wenn MARS_NWE nur ab und zu, dass Routing aber
|
||||||
|
generell fuer Clients benoetigt wird.
|
||||||
|
|
||||||
|
Grundsaetzlich kann MARS_NWE auf zwei Arten eingerichtet werden:
|
||||||
|
|
||||||
|
1.Man kann alle Routen "von Hand" anlegen und MARS_NWE nur als Server
|
||||||
|
einsetzen. Hat natuerlich den Nachteil, dass man selbst fuer korrektes
|
||||||
|
IPX-Routing und richtige Einstellung der Internal-Net Nummern etc.
|
||||||
|
sorgen muss, bzw. dass zusaetzliche Programme wie ipx-configure, ipxd
|
||||||
|
usw. benoetigt werden. In mars_nwe/config.h muss folgende Zeile
|
||||||
|
vorhanden sein:
|
||||||
|
#define INTERNAL_RIP_SAP 0
|
||||||
|
Wie schon gesagt, wird dabei ab Version 0.97-PL3 der "routed" erzeugt.
|
||||||
|
|
||||||
|
2.
|
||||||
|
(Der Standard-Modus) MARS_NWE legt alle Routen selbst, man kann die
|
||||||
|
entsprechenden Devices in der Conf-Datei bestimmen und der MARS_NWE
|
||||||
|
arbeitet als RIP/SAP-Router (z.B. auch ueber ISDN...). Es werden keine
|
||||||
|
zusaetzlichen Tools wie IPX_Configure etc. benoetigt.
|
||||||
|
|
||||||
|
Sind alle Defines gesetzt, kann der zweite make gestartet werden.
|
||||||
|
Damit werden die Binaries "nwserv", "ncpserv", "nwbind", "nwconn" und
|
||||||
|
"nwclient" erzeugt (wenn INTERNAL_RIP_SAP=0 war auch "nwrouted").
|
||||||
|
Bevor der MARS_NWE endgueltig installiert wird, sollte jetzt die
|
||||||
|
"nw.ini" bearbeitet werden. Diese wird vom anschliessenden "make
|
||||||
|
install" ins "/etc/"-Verzeichniss unter dem Namen "nwserv.conf"
|
||||||
|
kopiert und ist die eigentliche Konfigurationsdatei fuer den MARS_NWE.
|
||||||
|
Sollte bereits eine "nwserv.conf" im "/etc"-Verzeichniss liegen, wird
|
||||||
|
diese nicht automatisch ueberschrieben. Will man, dass die
|
||||||
|
"nwserv.conf" mit der neuen "nw.ini" ueberschrieben wird (z.B. beim
|
||||||
|
Wechseln auf eine neue MARS_NWE-Version, so muss noch ein "make
|
||||||
|
install_ini" durchgefuehrt werden.
|
||||||
|
Die "nwserf.conf" kann jederzeit nachtraeglich bearbeitet werden,
|
||||||
|
viele Einstellungen koennen mit dem Aufruf "nwserv -h" in den
|
||||||
|
laufenden Server uebernommen werden. Die Eintraege sind nummeriert,
|
||||||
|
alles nach einem "#" ist Kommentar und wird ignoriert. Die Eintraege
|
||||||
|
und ihre Bedeutung sind kurz in der "nwserv.conf" selbst kommentiert.
|
||||||
|
Im Detail wird die "nwserv.conf" weiter unten besprochen. Fuer einen
|
||||||
|
ersten Testlauf sollten die Eintraege 1,3,4, und 12 unbedingt
|
||||||
|
kontrolliert oder geaendert werden. Nachdem das passiert ist, wird der
|
||||||
|
"make install" aufgerufen, um die Binaries und die "nwserf.conf" zu
|
||||||
|
installieren.
|
||||||
|
Ist alles fehlerfrei durchgelaufen (ein paar Warnings beim
|
||||||
|
Compilerlauf zaehlen nicht ;-), kann der "nwserv" zum testen
|
||||||
|
aufgerufen werden. Danach sollten mit "ps" drei Prozesse sichtbar sein
|
||||||
|
(etwa folgendermassen):
|
||||||
|
|
||||||
|
<-------------------- schnipp --------------------------------------->
|
||||||
|
1132 psf 1 < 0:00 nwserv
|
||||||
|
1133 psf 1 N 0:00 nwbind NWE_SERVER 22.22.22.22:0.0.0.0.0.1:4.51 4001
|
||||||
|
1134 psf 1 N 0:00 ncpserv NWE_SERVER 22.22.22.22:0.0.0.0.0.1:4.51 4001
|
||||||
|
1136 pP8 1 N 0:00 ps
|
||||||
|
<-------------------- schnipp --------------------------------------->
|
||||||
|
|
||||||
|
Passiert ist folgendes:
|
||||||
|
Der Hauptprozess "nwserv" ruft die beiden Prozesse "nwbind" und
|
||||||
|
"ncpserv" auf ("ncpserv" lauert auf eventuell startende IPX-Clients).
|
||||||
|
Die Parameter hinter den beiden Prozessen nwbind und ncpserv haben
|
||||||
|
folgende Bedeutung:
|
||||||
|
|
||||||
|
NWE_SERVER: Der Name, der in den nw.ini (nwserv.conf) als
|
||||||
|
SERVER-Name angegeben wurde (Eintrag Nr.2),
|
||||||
|
oder falls nichts eingegeben wurde der Unix-
|
||||||
|
Hostname.
|
||||||
|
|
||||||
|
22.22.22.22 Internal-Net Nummer des Servers.
|
||||||
|
|
||||||
|
0.0.0.0.0.1 Node-Nummer des Servers.
|
||||||
|
|
||||||
|
4.51 Socket-Nummer.
|
||||||
|
|
||||||
|
4001 Socket, ueber den die Prozesse miteinander kom-
|
||||||
|
munizieren
|
||||||
|
|
||||||
|
Es hat also keinen Sinn, "nwbind" oder "ncpserv" als eigenstaendige
|
||||||
|
Programme aufzurufen!
|
||||||
|
|
||||||
|
Ein "cat /proc/net/ipx*" sollte jetzt in etwa folgendes zeigen:
|
||||||
|
|
||||||
|
<-------------------- schnipp --------------------------------------->
|
||||||
|
ipx:
|
||||||
|
Local_Address Remote_Address Tx_Queue Rx_Queue State Uid
|
||||||
|
22222222:4000 Not_Connected 00000000 00000000 07 000
|
||||||
|
22222222:0452 Not_Connected 00000000 00000000 07 000
|
||||||
|
22222222:0453 Not_Connected 00000000 00000000 07 000
|
||||||
|
22222222:4001 Not_Connected 00000000 00000000 07 000
|
||||||
|
22222222:0451 Not_Connected 00000000 00000000 07 000
|
||||||
|
22222222:4002 Not_Connected 00000000 00000000 07 000
|
||||||
|
22222222:4003 Not_Connected 00000000 00000000 07 000
|
||||||
|
ipx_interface:
|
||||||
|
Network Node_Address Primary Device Frame_Type
|
||||||
|
22222222 000000000001 Yes Internal None
|
||||||
|
0000000A 0000E8037ECC No eth0 802.3
|
||||||
|
0000AFFE FCFCAC100101 No isdn2 EtherII
|
||||||
|
ipx_route:
|
||||||
|
Network Router_Net Router_Node
|
||||||
|
0000AFFE Directly Connected
|
||||||
|
0000000A Directly Connected
|
||||||
|
22222222 Directly Connected
|
||||||
|
<-------------------- schnipp --------------------------------------->
|
||||||
|
|
||||||
|
Die "ipx_interfaces" sind in diesem Beispiel eine Ethernetkarte (eth0)
|
||||||
|
und ein ISDN-Interface (auch das geht!). Das erste "Interface" ist der
|
||||||
|
Server mit seiner Internal-Net Nummer. "ipx_route" zeigt die aktuellen
|
||||||
|
Netzwerk-Routen, die vom nwserv verwaltet werden, d.h. die beiden
|
||||||
|
Netzwerke 0000AFFE und 0000000A sind augenblicklich erreichbar. "ipx"
|
||||||
|
zeigt die Sockets auf denen der Server lauscht. Meldet sich nun ein
|
||||||
|
IPX-Client auf dem Netz (Start von NETX oder mit VLM), so wird fuer
|
||||||
|
jeden Client ein Prozess "nwconn" gestartet, der die Connection
|
||||||
|
verwaltet. Wenn der Client erkannt wurde und alles funktioniert hat,
|
||||||
|
dann zeigt ein "ps" unter anderem folgendes:
|
||||||
|
|
||||||
|
<-------------------- schnipp --------------------------------------->
|
||||||
|
51 psf 5 < 0:00 /sbin/nwserv
|
||||||
|
53 psf 5 N 0:00 nwbind NWE_SERVER 22.22.22.22:0.0.0.0.0.1:4.51 4001
|
||||||
|
54 psf 5 N 0:00 ncpserv NWE_SERVER 22.22.22.22:0.0.0.0.0.1:4.51 4001
|
||||||
|
...
|
||||||
|
342 psf 5 N 0:00 nwconn 54 0.0.0.a:0.20.cb.0.1a.e8:40.3 1 4001
|
||||||
|
<-------------------- schnipp --------------------------------------->
|
||||||
|
|
||||||
|
Hier ist ein Client dazugekommen mit folgenden Daten:
|
||||||
|
|
||||||
|
Netzwerk-Nummer (nicht Internal-Net): 0.0.0.A
|
||||||
|
Kartennummer (Physikalisch): 0.20.cb.0.1a.e8
|
||||||
|
Socket-Nummer: 40.3
|
||||||
|
Connection Nummer: 1
|
||||||
|
Die letzte Nummer (4001) ist eine MARS_NWE interne Socketnummer.
|
||||||
|
|
||||||
|
Auf der Client-Seite sollte jetzt der Server mit SLIST sichtbar sein:
|
||||||
|
|
||||||
|
<-------------------- schnipp --------------------------------------->
|
||||||
|
Known NetWare File Servers Network Node Address Status
|
||||||
|
-------------------------- ------- ------------ ------
|
||||||
|
NWE_SERVER [22222222][ 1]Default
|
||||||
|
|
||||||
|
Total of 1 file servers found
|
||||||
|
<-------------------- schnipp --------------------------------------->
|
||||||
|
|
||||||
|
Auch die Dateien im Verzeichniss SYS:\LOGIN des Servers sollten jetzt
|
||||||
|
sichtbar sein (wenn nicht, ist moeglicherweise die Option "k" gesetzt
|
||||||
|
und die File-Namen sind auf der Linux-Seite grossgeschrieben oder
|
||||||
|
umgekehrt?. Siehe auch Kapitel Novell, weiter oben).
|
||||||
|
|
||||||
|
|
||||||
|
NWSERV.CONF
|
||||||
|
|
||||||
|
Die Datei "nw.ini" ist waerend der Installation als Vorlage fuer die
|
||||||
|
eigentliche Konfigurationsdatei "nwserv.conf" angelegt und bearbeitet
|
||||||
|
worden. Alle relevanten Einstellungen des MARS_NWE (ausser den
|
||||||
|
Compilereinstellungen in der "config.h") werden hier vorgenommen.
|
||||||
|
Einige davon koennen sogar waehrend der Laufzeit des Servers mittels
|
||||||
|
"nwserv -h" uebernommen werden.
|
||||||
|
In letzter Zeit hat Winfried Truemper die Kommentare ueberarbeitet und
|
||||||
|
erweitert, so dass viele Parameter jetzt in der Datei selber erklaert
|
||||||
|
werden.
|
||||||
|
Hier sollen nur ein paar Einstellungen diskutiert werden, die immer
|
||||||
|
wieder Fragen aufwerfen:
|
||||||
|
Mindesten ein Eintrag 1 (Volumes) muss vorhanden sein. Wie
|
||||||
|
schon im Kapitel Novell gesagt, gibt es auf Netware-Servern eine
|
||||||
|
minimale Directory-Struktur die aus den Verzeichnissen "LOGIN",
|
||||||
|
PUBLIC, "SYSTEM" und "MAIL" besteht, und in der standardmaessig
|
||||||
|
bestimmte Dateien (Login-Scripte, Map-, Capture- und Login-Commands
|
||||||
|
etc.) abgelegt sind. Damit der Client auf den Server Zugreifen kann
|
||||||
|
muessen diese also vorhanden sein. Mit Eintrag 16=1 werden diese beim
|
||||||
|
ersten Start von "nwserv" angelegt. Der Volume-Name ist ueblicherweise
|
||||||
|
"SYS".
|
||||||
|
Beim Anlegen und Eintragen der Optionen fuer das Volume SYS unbedingt
|
||||||
|
auf Gross- und Kleinschreibung achten, sonst sind diese Dateien
|
||||||
|
nachher fuer den Client nicht Sichtbar. Alle weiteren Volumes sind
|
||||||
|
Optional und koennen beliebige Verzeichnisse (ausser /) freigeben.
|
||||||
|
Auf Verzeichniss "/" hat nur der root=Supervisor Zugriff. Volumes
|
||||||
|
koennen mit NFS gemountete Verzeichnisse, CD-Roms, Floppys und
|
||||||
|
beliebige unter Linux mountbare Filesystems sein. Die einzige
|
||||||
|
Einschraenkung besteht in der Beschraenkung auf entweder alles gross
|
||||||
|
oder klein geschrieben und der Dos-Namensgebung fuer die Files
|
||||||
|
(xxxxxxxx.xxx).
|
||||||
|
Eine Besonderheit sind beim MARS_NWE die sogenannten PIPE-Volumes.
|
||||||
|
Hier koennen spaeter Shell-Scripte abgelegt werden, auf die vom
|
||||||
|
Dos-Client aus lesend und schreibend zugegriffen werden kann (siehe
|
||||||
|
PIPE-Volumes, weiter unten).
|
||||||
|
Eintrag 3 ist fuer die Internal-Net Nummer. Diese ist nur fuer den
|
||||||
|
Server und muss einmalig im gesamten Netzwerk sein. Mit einer Null als
|
||||||
|
Eintrag, wird die IP-Nummer des Linux-Hosts genommen, die ja
|
||||||
|
ueblicherweise einmalig im Netz ist. Die Node-Nummer ist bei
|
||||||
|
Netware-Servern 1, sollte also auch hier nicht anders eingestellt
|
||||||
|
werden. Die Internal-Net Nummer einzurichten ist zwingend notwendig
|
||||||
|
wenn der Server auch als Router arbeiten soll (mehr als ein
|
||||||
|
Net-device), oder mehr als ein Server im Netz aktiv ist, sollte aber
|
||||||
|
generell geschehen.
|
||||||
|
Bei Netware gibt es zwei Typen von Netzwerknummern, die interne und
|
||||||
|
externe Netzwerknummer. Die hier eingestellte interne wird verwendet,
|
||||||
|
damit nur solche Pakete vom Server empfangen werden, die auch direkt
|
||||||
|
fuer ihn bestimmt sind. Wenn mehrere Net-devices im Server
|
||||||
|
konfiguriert sind, dann uebernimmt der Server automatisch
|
||||||
|
Routing-Aufgaben. In diesem Fall sollen Pakete, die nicht fuer den
|
||||||
|
Server bestimmt, sind ja nur weitergeleitet werden. Die in der
|
||||||
|
Netzwerkkarte enthaltene physikalische Netzwerknummer ist daher
|
||||||
|
natuerlich ungeeignet.
|
||||||
|
Die Server unterscheiden sich aus Sicht der Arbeitsstationen nur durch
|
||||||
|
ihre interne Netznummer, Pakete werden von den Clients nur an diese
|
||||||
|
geschickt, der Server adressiert seine Paeckchen an den Client mit
|
||||||
|
Absender = interne Netznummer und Empfaenger = externe Netznummer. Die
|
||||||
|
externe Netzwerkadresse (in Eintrag 4) muss nun mit der Netzwerknummer
|
||||||
|
des LAN's uebereinstimmen, das an das hier konfigurierte Device
|
||||||
|
angeschlossen ist. Der Frame-Typ muss natuerlich auch mit dem
|
||||||
|
uebereinstimmen, der auf diesem LAN gueltig ist (Standard bei
|
||||||
|
Netware-Netzen ist meist 802.3, 802.2 ist bei einigen neueren (Netware
|
||||||
|
3.12 ..) zu finden.
|
||||||
|
Neuerdings kann in der "nwserv.conf" auch ein Autodetect der
|
||||||
|
Net-Devices eingestellt werden. Dies kann natuerlich nur
|
||||||
|
funktionieren, wenn an diesem Device mindestens ein anderer
|
||||||
|
Netware-Server haengt, der korrekt eingerichtet ist, damit vom
|
||||||
|
MARS_NWE die externe Netzwerknummer und der Frame-Typ vom laufenden
|
||||||
|
Datenverkehr abgeleitet werden kann.
|
||||||
|
Eintraege 7 - 13 legen die Securety- und Login-Details fest. Als
|
||||||
|
Besonderheit bei Eintrag 7 gilt: auch wenn die 8 (allow empty passwds)
|
||||||
|
eingetragen ist, muss der Supervisor ein Passwort haben (zumindest,
|
||||||
|
wenn der Root auf dem Linux-Rechner eines hat). Die Optionen fuer
|
||||||
|
Eintrag 7 (Passwd-Handling) sind hirarchisch gestaffelt, wobei die
|
||||||
|
Null nur verschluesseltes Passworthandling zulaesst, und damit die
|
||||||
|
sicherste Variante darstellt. Die unter 12 und 13 einzutragenden
|
||||||
|
Usernamen und Passworte werden beim ersten Start von "nwserv" in die
|
||||||
|
Bindery-Dateien (*.pag und *.dir-Files in /etc/) eingetragen. Danach
|
||||||
|
koennen (und sollten in der Praxis auch) diese Eintraege wieder aus
|
||||||
|
der "nwserv.conf" entfernt werden.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FILE-SERVICES
|
||||||
|
^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
PINT-QUEUES
|
||||||
|
^^^^^^^^^^^
|
||||||
|
|
||||||
|
PIPE-VOLUMES
|
||||||
|
^^^^^^^^^^^^
|
||||||
|
|
||||||
|
CLIENTS INSTALLIEREN
|
||||||
|
^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
FAQ's
|
||||||
|
^^^^^
|
||||||
|
|
||||||
|
|
||||||
|
TIPS UND LESESTOFF
|
||||||
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
EMAIL-ADRESSEN
|
||||||
|
^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
|
||||||
|
|
165
doc/INSTALL
165
doc/INSTALL
@ -1,70 +1,133 @@
|
|||||||
=========> !! important NOTE !!
|
This is the file "INSTALL", a step-by-step guide on how to install
|
||||||
You can configure mars_nwe in two ways.
|
the mars_nwe-package.
|
||||||
1. You want mars_nwe to handle routing/sap and configuring
|
|
||||||
ipx-interfaces. This is the default mode.
|
(1) Get a 'good' ipx-kernel-version and compile
|
||||||
You do not need any other ipx-tool or routers/daemons.
|
it with IPX-support, but no full internal net. You can do
|
||||||
In this modus the correct coexisting working
|
this by answering the following questions when running
|
||||||
of mars_nwe, dosemu, ncpfs or Caldera's nwclient was tested.
|
"make config":
|
||||||
-> you must use kernel < 1.3.60 or use kernel >= 1.3.60 and compile
|
|
||||||
your kernel with IPX-option CONFIG_IPX_INTERN=N
|
The IPX protocol (CONFIG_IPX) [N/m/y/?] y
|
||||||
This do NOT mean 'no internal net' but 'no *full* internal net'.
|
Full internal IPX network (CONFIG_IPX_INTERN) [N/y/?] n
|
||||||
In mars_nwe/config.h there must exist the following line:
|
|
||||||
|
For general questions about how to compile a kernel,
|
||||||
|
please see the Linux Kernel-HOWTO.
|
||||||
|
Best kernels for mars_nwe are 1.3.57
|
||||||
|
(with little patch from example directory)
|
||||||
|
or kernels >= 1.3.60.
|
||||||
|
Older kernels will sometimes not work because of
|
||||||
|
bugs in the ipx-code. See examples directory for
|
||||||
|
some patches.
|
||||||
|
|
||||||
|
(2) Decide, if mars_nwe should initialize your IPX-subsystem,
|
||||||
|
make routing and handle sap/rip or if you want to do this
|
||||||
|
with 3rd party products by hand.
|
||||||
|
Before mailing problems with mars_nwe please try the first.
|
||||||
|
|
||||||
|
(2a) Configuration of the IPX-subsystem by "mars_nwe"
|
||||||
|
|
||||||
|
You do not need any other ipx-tool or routers/daemons
|
||||||
|
in this case.
|
||||||
|
It was tested that "mars_nwe", "dosemu", "ncpfs" or
|
||||||
|
Caldera's "nwclient" do coexist friendly in this case.
|
||||||
|
|
||||||
|
|
||||||
|
Set INTERNAL_RIP_SAP to "1" in `mars_nwe/config.h':
|
||||||
|
|
||||||
#define INTERNAL_RIP_SAP 1
|
#define INTERNAL_RIP_SAP 1
|
||||||
If you have other IPX/NCP servers in your net you can let
|
|
||||||
your external nets configured automaticly.
|
|
||||||
To do this you must use internal net: entry '3' must be filled
|
If you have other IPX/NCP servers on your local net you
|
||||||
with a *UNIQUE* NetNumber and you must place minimal one
|
can let "mars_nwe" choose TRV ("the right values"(tm))
|
||||||
entry '4' with '0' as networknumber, device = '*' and frame=auto.
|
for you.
|
||||||
example for conf/ini file: (see also examples/nw.ini):
|
You request this with the following entries in `nwserv.conf':
|
||||||
3 0x77777 # UNIQUE network number for internal net.
|
|
||||||
|
3 0x0 # use your IP number for internal net.
|
||||||
4 0x0 * AUTO # autocreat Interfaces
|
4 0x0 * AUTO # autocreat Interfaces
|
||||||
|
|
||||||
|
Make sure that no other server is using your internal net number
|
||||||
|
as it's networknumber.
|
||||||
|
|
||||||
|
If there is no other IPX/NCP Server on your net then the network-
|
||||||
|
number from section '4' can be any number.
|
||||||
|
|
||||||
If there is no other IPX/NCP Server on your net then
|
|
||||||
network number in entry '4' can be any number.
|
|
||||||
4 0x10 eth0 ethernet_ii # eth0 device with network number '0x10'
|
4 0x10 eth0 ethernet_ii # eth0 device with network number '0x10'
|
||||||
# and frame ETHERNET_II.
|
# and frame ETHERNET_II.
|
||||||
4 0x20 eth0 802.3 # eth0 device with network number '0x20'
|
4 0x20 eth0 802.3 # eth0 device with network number '0x20'
|
||||||
# und frame ETHERNET_802.3.
|
# und frame ETHERNET_802.3.
|
||||||
|
|
||||||
2. You want to run mars_nwe only as a fileserver and use
|
|
||||||
special tools to configure ipx and rip/sap routers.
|
(2b) Manual configuration of the IPX-subsystem
|
||||||
-> In this mode you must use tools like ipx-configure and
|
|
||||||
ripd to configure ipx-interfaces, routes and handle rip/sap.
|
In this mode you must use tools like ipx-configure and
|
||||||
In mars_nwe/config.h there must exist the following line:
|
ipxd to configure ipx-interfaces, routes and handle rip/sap.
|
||||||
|
|
||||||
|
Set INTERNAL_RIP_SAP to "0" in `mars_nwe/config.h':
|
||||||
|
|
||||||
#define INTERNAL_RIP_SAP 0
|
#define INTERNAL_RIP_SAP 0
|
||||||
|
|
||||||
=========> create programs
|
|
||||||
1. call make.
|
|
||||||
2. perhaps you must modify mk.li and config.h
|
|
||||||
3. call make
|
|
||||||
|
|
||||||
=========> configure
|
(3) Compile the programs from the mars_nwe-package
|
||||||
modify nw.ini !
|
|
||||||
IMPORTANT !!
|
|
||||||
Please read examples/nw.ini if you use a new version
|
|
||||||
of mars_nwe and make the needed changes to your
|
|
||||||
'ini' or 'conf' file.
|
|
||||||
=========> install
|
|
||||||
"make install"
|
|
||||||
"make install_ini" to overwrite your old _installed_ ini.
|
|
||||||
|
|
||||||
=========> start programs
|
Unpack the source of "mars_nwe" and change to the directory
|
||||||
call nwserv ( as root !! )
|
`mars_nwe' (you already did that, otherwise you won't read this).
|
||||||
tested with Linux Version 1.2.13 and 1.3.32 and higher
|
Enter the command:
|
||||||
the linux-kernel must be configured with IPX=Y.
|
|
||||||
ipx-interface and ipx-routes are setup by the program if the
|
make
|
||||||
entry 4 (devices) in the nw.ini file is filled.
|
|
||||||
|
This will create the file `config.h' and 'mk.li'.
|
||||||
|
Edit them to suit your needs. 'mk.li" only needs to be altered under
|
||||||
|
very rare conditions or if you have problems with compiling/linking
|
||||||
|
this package.
|
||||||
|
|
||||||
|
Now run "make" again:
|
||||||
|
|
||||||
|
make
|
||||||
|
|
||||||
|
|
||||||
|
(4) Edit the configuration-file `nw.ini'.
|
||||||
|
|
||||||
|
Make sure you have all required sections included in your old
|
||||||
|
configuration-file, if you upgrade to a new version of "mars_nwe".
|
||||||
|
|
||||||
|
|
||||||
|
(5) Install everything
|
||||||
|
|
||||||
|
Just say
|
||||||
|
|
||||||
|
make install
|
||||||
|
and perhaps
|
||||||
|
make install_ini
|
||||||
|
|
||||||
|
The later is only if you want to _overwrite_ the already installed
|
||||||
|
versions of the configuration-file "nwserv.conf" by the "nw.ini" file.
|
||||||
|
|
||||||
|
|
||||||
|
(6) Create the directories visible to DOS-clients
|
||||||
|
|
||||||
|
At least the volume "SYS" must be defined in the configuration-file
|
||||||
|
"nwserv.conf". Create the associated directory if it does not
|
||||||
|
already exists and place the programs "login.exe" and "slist.exe"
|
||||||
|
into the "LOGIN" directory. You also can use the free mars_dosutils
|
||||||
|
with a poor version of these programms.
|
||||||
|
|
||||||
|
(7) Fire it up
|
||||||
|
|
||||||
|
As root, execute the command
|
||||||
|
|
||||||
|
nwserv
|
||||||
|
|
||||||
|
|
||||||
|
(8) Stop programs (server down)
|
||||||
|
|
||||||
=========> stop programs (server down)
|
|
||||||
If nwserv isn't daemonized, then the server can be stopped
|
If nwserv isn't daemonized, then the server can be stopped
|
||||||
with ^C, otherwise the server must be shut down with a
|
with ^C, otherwise the server must be shut down with a
|
||||||
kill of nwserv or with the right dos client programm
|
kill of nwserv or with starting 'nwserv -k' or with the
|
||||||
(fconsole server down) as supervisor. Entry 210 in the
|
right dos client programm (fconsole server down) as supervisor.
|
||||||
nw.ini file gives the time in seconds, before the server
|
Entry 210 in the nw.ini file gives the time in seconds, before
|
||||||
really shuts down.
|
the server really shuts down.
|
||||||
|
|
||||||
|
|
||||||
good luck :-)
|
good luck :-)
|
||||||
|
|
||||||
Martin
|
Martin Stover <mstover@freeway.de>
|
||||||
(mstover@freeway.de)
|
|
||||||
|
@ -65,6 +65,3 @@ I would appreciate hearing about further documented applications of
|
|||||||
the PIPE filesystem or suggestions for other ways of using it.
|
the PIPE filesystem or suggestions for other ways of using it.
|
||||||
|
|
||||||
Martin
|
Martin
|
||||||
|
|
||||||
(translated by Michael Beddow)
|
|
||||||
|
|
||||||
|
91
doc/README
91
doc/README
@ -1,70 +1,79 @@
|
|||||||
(C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany
|
|
||||||
|
|
||||||
to compile and install, please read INSTALL !
|
mars_nwe - Martin Stovers netware emulation
|
||||||
|
Copyright (C) 1993,1996 Martin Stover, Marburg, Germany
|
||||||
|
|
||||||
This is a little try to emulate some functions from
|
|
||||||
a NOVELL-SERVER under UNIX (LINUX).
|
|
||||||
The first version I have written 1993 on a USL1.1
|
|
||||||
with TLI-Code.
|
|
||||||
1994 I have ported it to LINUX. This was easy, because
|
|
||||||
I only have to write a small TLI->SOCKET emu.
|
|
||||||
|
|
||||||
Unfortunately I had no full description of the NCP-calls,
|
Help on how to compile and install can be found in `INSTALL'.
|
||||||
so many of the calls based on trying. :-(
|
|
||||||
|
|
||||||
WARNING: this code has still many BUG's !!
|
|
||||||
|
|
||||||
BINDERY: this are the *.pag and *.dir files.
|
"mars_nwe" is an attempt to emulate the basic functionality
|
||||||
These files are generated by the first starting
|
of a netware-server under UNIX (Linux).
|
||||||
|
The first version was written 1993 on a USL1.1 with TLI-Code.
|
||||||
|
1994 I ported it to LINUX, which was easy because I only had
|
||||||
|
to write a small TLI->SOCKET emulation (see the modul
|
||||||
|
"emutli").
|
||||||
|
|
||||||
|
Unfortunately I had no complete description of the NCP-calls,
|
||||||
|
so that the handling of many calls is based on experiments. :-(
|
||||||
|
|
||||||
|
WARNING: this code still has many BUG's!
|
||||||
|
|
||||||
|
BINDERY:
|
||||||
|
These are the *.pag and *.dir files.
|
||||||
|
They are generated by the first starting
|
||||||
of mars_nwe and are filled with the minimal
|
of mars_nwe and are filled with the minimal
|
||||||
needed Objects and Properties.
|
needed Objects and Properties.
|
||||||
The User SUPERVISOR must be described in the
|
The User SUPERVISOR must be described in the
|
||||||
nw.ini file, entry 12
|
nw.ini file, entry 12
|
||||||
|
|
||||||
NETWORK: If there is a real Novell-Server on the
|
NETWORK:
|
||||||
|
If there is a real Novell-Server on the
|
||||||
same net-line, then the NETWORK Number of
|
same net-line, then the NETWORK Number of
|
||||||
the network device in nw.ini should match
|
the network device in nw.ini should match
|
||||||
the NETWORK Number of the Novell-Server.
|
the NETWORK Number of the Novell-Server.
|
||||||
|
|
||||||
LINUX
|
LINUX KERNEL:
|
||||||
KERNEL: the only linux-kernel depending files
|
the only linux-kernel depending files
|
||||||
are emutli.[hc].
|
are emutli.[hc].
|
||||||
|
|
||||||
short description of the processes.
|
|
||||||
1) nwserv : the main program.Initiates all and starts 'ncpserv'.
|
Short description of the programs from this package:
|
||||||
sends broadcasts, wdogs, sap and rip packets.
|
----------------------------------------------------
|
||||||
If nwserv is started with a parameter, then the simple
|
|
||||||
|
nwserv:
|
||||||
|
the main program. Initiates all subsystems and
|
||||||
|
starts 'ncpserv'.
|
||||||
|
Sends broadcasts, wdogs, sap and rip packets.
|
||||||
|
If nwserv is started with the parameter 'y', then the simple
|
||||||
test client 'nwclient', only for debugging, is started.
|
test client 'nwclient', only for debugging, is started.
|
||||||
|
Parameter '-k' is for stopping the actual running nwserv
|
||||||
|
and parameter '-h' for sending a HUP signal to the
|
||||||
|
running nwserv.
|
||||||
|
|
||||||
2) ncpserv: opens NCP-Socket and handles NCP-Requests.
|
ncpserv:
|
||||||
When there comes NCP-Request 0x1111 (Get Connection Nr)
|
opens NCP-Socket and handles NCP-Requests.
|
||||||
then there will be started a new process 'nwconn'.
|
For every incoming NCP-Request 0x1111 (Get Connection Nr)
|
||||||
Every client-ncp-request reaches nwconn over
|
a new instance of 'nwconn' ist started.
|
||||||
ncpserv.
|
Every client-ncp-request reaches nwconn over ncpserv.
|
||||||
|
|
||||||
3) nwconn: will be started for every connection. Is connected
|
nwconn:
|
||||||
to ncpserv with a pipe.
|
started for every single connection. Communicates with
|
||||||
|
ncpserv over an ipx-socket.
|
||||||
|
|
||||||
Problems and TODO:
|
nwbind:
|
||||||
Many:-(
|
the bindery program. Communicates with
|
||||||
|
ncpserv and nwconn over an ipx-socket.
|
||||||
|
|
||||||
Here is a short list.
|
|
||||||
o - password changings from clients
|
|
||||||
o - make routing better.
|
|
||||||
o - making printing better.
|
|
||||||
o - clean the code !!!
|
|
||||||
o - make bindery code more complete.
|
|
||||||
o - and much more ...
|
|
||||||
|
|
||||||
Have luck with trying. :)
|
Have luck with trying. :)
|
||||||
|
|
||||||
|
|
||||||
Martin
|
Martin Stover <mstover@freeway.de>
|
||||||
(mstover@freeway.de)
|
|
||||||
|
BTW: The kick to make mars_nwe public was the publication of
|
||||||
|
linware ( lwared ), the NetWare-Emulator from
|
||||||
|
Ales Dryak <A.Dryak@sh.cvut.cz>
|
||||||
|
|
||||||
BTW: The kick to make mars_nwe public was the
|
|
||||||
publication of linware ( lwared ), the Novell-Server-Emulator
|
|
||||||
from Ales Dryak (A.Dryak@sh.cvut.cz).
|
|
||||||
I hope both products can make profit from each other.
|
I hope both products can make profit from each other.
|
||||||
-----> SuperNOS ala Linux ;-)
|
-----> SuperNOS ala Linux ;-)
|
||||||
Novell don't want to make it anymore. :-(
|
Novell don't want to make it anymore. :-(
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
Begin3
|
Begin3
|
||||||
Title: mars_nwe
|
Title: mars_nwe
|
||||||
Version: 0.97.pl3
|
Version: 0.97.pl4
|
||||||
Entered-date: 07-May-96
|
Entered-date: 11-May-96
|
||||||
Description: full novell-server-emulator (src),beta
|
Description: Full netware-emulator (src), beta.
|
||||||
supports file-services, bindery-services,
|
Supports file-services, bindery-services,
|
||||||
printing-services, routing-services
|
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: ftp.gwdg.de:/pub/linux/misc/ncpfs
|
Primary-site: ftp.gwdg.de:/pub/linux/misc/ncpfs
|
||||||
140kB mars_nwe-0.97.pl3.tgz
|
140kB mars_nwe-0.97.pl4.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.xx), UnixWare 2.0x
|
Platforms: Linux (1.2.xx, 1.3.xx), UnixWare 2.0x
|
||||||
Copying-policy: GNU
|
Copying-policy: GNU
|
||||||
|
@ -1,57 +1,64 @@
|
|||||||
/* config.h: 03-May-96 */
|
/* config.h: 13-May-96 */
|
||||||
/* some of this config is needed by make, others by cc */
|
/* some of this config is needed by make, others by cc */
|
||||||
#define DO_DEBUG 1 /* Compile in debug code */
|
|
||||||
|
|
||||||
#define DO_TESTING 0 /* only for the next choose */
|
#define DO_DEBUG 1 /* compile in debug code */
|
||||||
|
|
||||||
|
#define DO_TESTING 0 /* set this to "1" to test only */
|
||||||
|
|
||||||
#if DO_TESTING
|
#if DO_TESTING
|
||||||
# define FILENAME_NW_INI "./nw.ini" /* full name of ini (conf) file */
|
# define FILENAME_NW_INI "./nw.ini" /* full name of ini (conf) file */
|
||||||
# define PATHNAME_PROGS "." /* path location of progs */
|
# define PATHNAME_PROGS "." /* where to find the executables */
|
||||||
# define PATHNAME_BINDERY "." /* path location of bindery */
|
# define PATHNAME_BINDERY "." /* directory for bindery-files */
|
||||||
# define FUNC_17_02_IS_DEBUG 1
|
# define FUNC_17_02_IS_DEBUG 1
|
||||||
#else
|
#else
|
||||||
# define FILENAME_NW_INI "/etc/nwserv.conf" /* full name of ini (conf) file */
|
# define FILENAME_NW_INI "/etc/nwserv.conf"
|
||||||
# define PATHNAME_PROGS "/sbin" /* path location of progs */
|
/* full name of ini (conf) file */
|
||||||
# define PATHNAME_BINDERY "/etc" /* path location of bindery */
|
# define PATHNAME_PROGS "/sbin" /* where to find the executables */
|
||||||
|
# define PATHNAME_BINDERY "/etc" /* directory for bindery-files */
|
||||||
# define FUNC_17_02_IS_DEBUG 0
|
# define FUNC_17_02_IS_DEBUG 0
|
||||||
#endif
|
#endif
|
||||||
#define PATHNAME_PIDFILES "/var/run" /* path location of 'pidfiles' */
|
|
||||||
|
|
||||||
/* next for utmp/wtmp updates */
|
#define PATHNAME_PIDFILES "/var/run" /* directory for 'pidfiles' */
|
||||||
#define FILENAME_UTMP UTMP_FILE
|
|
||||||
/* can be set NULL if you don't want utmp/wtmp updates */
|
|
||||||
#define FILENAME_WTMP WTMP_FILE
|
|
||||||
/* can be set NULL if you don't want wtmp updates */
|
|
||||||
|
|
||||||
#define NETWORK_SERIAL_NMBR 0x44444444L /* Serial Number 4 Byte */
|
/* ----- logging the logins via "mars_nwe" in utmp/wtmp ------------------ */
|
||||||
#define NETWORK_APPL_NMBR 0x2222 /* Applikation Number 2 Byte */
|
#define FILENAME_UTMP UTMP_FILE /* use "NULL" instead of UTMP_FILE */
|
||||||
|
/* to disable logging via utmp */
|
||||||
|
#define FILENAME_WTMP WTMP_FILE /* use "NULL" instead of WTMP_FILE */
|
||||||
|
/* to disable logging via wtmp */
|
||||||
|
|
||||||
#define MAX_CONNECTIONS 5 /* max. Number of Connections */
|
#define NETWORK_SERIAL_NMBR 0x44444444L
|
||||||
/* must be < 256 !!! */
|
/* serial number (4 byte) */
|
||||||
|
#define NETWORK_APPL_NMBR 0x2222 /* application number (2 byte) */
|
||||||
|
|
||||||
|
#define MAX_CONNECTIONS 5 /* max. number of simultaneous */
|
||||||
|
/* connections handled by mars_nwe */
|
||||||
|
|
||||||
#define IPX_DATA_GR_546 1 /* allow ipx packets > 546+30 Byte */
|
#define IPX_DATA_GR_546 1 /* allow ipx packets > 546+30 Byte */
|
||||||
|
|
||||||
/* <-----------------------------------------------------------> */
|
/* <--------------------------------------------------------------------> */
|
||||||
#define MAX_NW_VOLS 10 /* max. Volumes */
|
#define MAX_NW_VOLS 10 /* max. number of mars_nwe-volumes */
|
||||||
#define MAX_FILE_HANDLES_CONN 80 /* max. open files /connection */
|
#define MAX_FILE_HANDLES_CONN 80 /* max. number of open files per */
|
||||||
|
/* connection */
|
||||||
/* <--------------- new namespace services call --------------> */
|
/* <--------------- new namespace services call -----------------------> */
|
||||||
#define WITH_NAME_SPACE_CALLS 1 /* Namespace Calls are only minimal */
|
#define MAX_DIR_BASE_ENTRIES 50 /* max. cached base entries per */
|
||||||
/* supported till now. */
|
/* connection */
|
||||||
/* to enable testing of them this */
|
#define WITH_NAME_SPACE_CALLS 0 /* Namespace Calls are only minimal */
|
||||||
|
/* supported so far. */
|
||||||
|
/* To enable testing of them this */
|
||||||
/* entry must be changed to '1' and */
|
/* entry must be changed to '1' and */
|
||||||
/* entry '6' in ini file must be set */
|
/* entry '6' in ini file should be set*/
|
||||||
/* to > '0', too. */
|
/* to > '0', too. */
|
||||||
#define MAX_DIR_BASE_ENTRIES 50 /* max. cached base entries/connection */
|
/* <--------------------------------------------------------------------> */
|
||||||
/* <-----------------------------------------------------------> */
|
#define MAX_NW_SERVERS 40 /* max. number of nw-servers on your */
|
||||||
#define MAX_NW_SERVERS 40 /* max. count of servers */
|
/* network */
|
||||||
|
|
||||||
/* <--------------- next is for linux only -------------------> */
|
/* <--------------- next is for linux only ----------------------------> */
|
||||||
#define INTERNAL_RIP_SAP 1 /* use internal/own rip/sap routines */
|
#define INTERNAL_RIP_SAP 1 /* use internal/own rip/sap routines */
|
||||||
/* -------------------- */
|
/* -------------------- */
|
||||||
#define MAX_NET_DEVICES 5 /* max. Netdevices, frames */
|
#define MAX_NET_DEVICES 5 /* max. Netdevices, frames */
|
||||||
#define MAX_NW_ROUTES 50 /* max. networks (internal + external) */
|
#define MAX_NW_ROUTES 50 /* max. nw-networks on your network */
|
||||||
|
/* (internal + external) */
|
||||||
#define MAX_RIP_ENTRIES 50 /* max. rip responses */
|
#define MAX_RIP_ENTRIES 50 /* max. rip responses */
|
||||||
/* -------------------- */
|
/* -------------------- */
|
||||||
#define SHADOW_PWD 0 /* change to '1' for shadow passwds */
|
#define SHADOW_PWD 0 /* change to '1' for shadow passwds */
|
||||||
|
|
||||||
|
|
||||||
|
445
examples/nw.ini
445
examples/nw.ini
@ -1,133 +1,310 @@
|
|||||||
# (C)opyright 1993, 1996, Martin Stover, Softwareentwicklung, Marburg
|
#
|
||||||
# last change: 28-Apr-96
|
# This is the configuration-file for "mars_nwe", the free netware-emulator
|
||||||
# MAR.S NW-Server Emulator
|
# for Linux.
|
||||||
# Einfache Konfiguration, alles ab # ist Kommentar.
|
#
|
||||||
# Jeder Eintrag beginnt mit einer Zahl und dann folgt der Inhalt.
|
# last change: 13-May-96
|
||||||
# simple configuration, all after # is ignored.
|
#
|
||||||
# every entry begins with a number and then the meet follows.
|
# Syntax of this config-file:
|
||||||
####################################
|
# - everything after the "#" is ignored, so it is used to
|
||||||
# entry 1 VOLUMES (max. volumes depend on your config.h)
|
# make comment-lines
|
||||||
# Volumename Volumepath Options (k=lowercase,p=pipe,m=removable)
|
# - entries _must_ begin with a number, indicating the section
|
||||||
1 SYS /u3/SYS/ # SYS 1
|
# they belong to
|
||||||
# SYS, der Name darf auch anders lauten, muss
|
# - hexadecimal values are prepended with "0x"
|
||||||
# eingerichtet sein mit den folgenden Verzeichnissen:
|
#
|
||||||
# LOGIN, PUBLIC, SYSTEM, MAIL.
|
# All examples are verbatim.
|
||||||
# SYS, may be named diffent but must be setup and must
|
|
||||||
# contains the following Directories: LOGIN, PUBLIC, SYSTEM, MAIL
|
|
||||||
####################################
|
# Section 1: volumes (required)
|
||||||
# Die folgenden Volumes sind optional.
|
#
|
||||||
# the following volumes are optional.
|
# In this section you list all directories accessible via "mars_nwe".
|
||||||
#1 HOME ~ k # Users HOME directory
|
# To be more specific: a mapping from Linux-directories to mars_nwe-volumes
|
||||||
#.............^^^
|
# is done. (Volumes are the beasts you can map to drive letters under DOS
|
||||||
# such a 'path' (~) stands for users home dir
|
# using "map.exe").
|
||||||
# this is an automatic changed volume.
|
#
|
||||||
#1 SYS1 /u3/SYS1/ # SYS 2 upshift
|
# Linux-directory mars_nwe-volume map.exe DOS-Drive
|
||||||
#1 TMP /tmp/ k # TMP downshift
|
# /var/local/nwe/SYS -------> SYS -------------> W:
|
||||||
#1 CD /cdrom km # CDROM downshift/removable
|
#
|
||||||
#1 PIPES /u3/pipes kp # pipecommands
|
# More than one entry is possible in this section.
|
||||||
# Falls lowercase nicht gesetzt ist, werden GROSSBUCHSTABEN erwartet.
|
# The maximum number of volumes is a compile-time option that must be
|
||||||
# If lowercase is not set then all filenames are upshift.
|
# specified in `config.h' before compiling mars_nwe.
|
||||||
# all flags for volumes:
|
#
|
||||||
# 'k' all is downshift
|
# Please note that at least the volume "SYS" must be defined and it must
|
||||||
# 'm' volume is moveable (cdrom)
|
# contain the following sub-directories: LOGIN, PUBLIC, SYSTEM, MAIL.
|
||||||
# 'o' volume has only one filesystem/device/namespace
|
# See the installation-instructions in the doc-directory for more infos.
|
||||||
|
#
|
||||||
|
# Syntax:
|
||||||
|
# 1 VOLUMENAME DIRECTORY OPTIONS
|
||||||
|
#
|
||||||
|
# VOLUMENAME: the name of the mars_nwe-volume (max. 8 characters)
|
||||||
|
# DIRECTORY: the directory on your Linux-system associated with that
|
||||||
|
# volume; use the special name "~" to refer to the users
|
||||||
|
# individual home-directory
|
||||||
|
#
|
||||||
|
# OPTIONS: none or some of the following characters (without a seperator)
|
||||||
|
# k allow lowercase-filenames (if you don't set this, all
|
||||||
|
# files _must_ be upper-case)
|
||||||
|
# m removable volume (e.g. cd-roms)
|
||||||
|
# o volume has only one filesystem/device/namespace
|
||||||
# this is for filesystems with high inode > 0xFFFFFFF.
|
# this is for filesystems with high inode > 0xFFFFFFF.
|
||||||
# because for namespace services mars_nwe normally use the
|
# because for namespace services mars_nwe normally use the
|
||||||
# first 4 bit of 32 bit inode for distinguish
|
# first 4 bit of 32 bit inode to distinguish
|
||||||
# between several devices/namespaces for one volume.
|
# between several devices/namespaces for one volume.
|
||||||
# 'p' 'PIPE' filesystem. All files are pipe commands.
|
# p "PIPE"-filesystem. All files are pipe commands.
|
||||||
# see 'doc/PIPE-FS'
|
# See `doc/PIPE-FS'.
|
||||||
######################################
|
# r readonly volume. Free disk space will also return 0.
|
||||||
# Eintrag 2 fuer den Servername.
|
#
|
||||||
# falls nicht gesetzt, wird hostname (in GROSSBUCHSTABEN) verwendet.
|
# examples:
|
||||||
# entry 2 for the servername. If not set, then the hostname (upshift)
|
1 SYS /u3/SYS/ # SYS upper-case filenames
|
||||||
# will be taken.
|
1 CDROM /cdrom km # lowercase filenames, removable
|
||||||
#2 MAR1 # Servername
|
1 HOME ~ k # users HOME directory, lowercase
|
||||||
######################################
|
|
||||||
# next entry for configure mars_nwe to use the internal net
|
|
||||||
|
# Section 2: servername (optional)
|
||||||
|
#
|
||||||
|
# The servername is the name under which this server will show up when
|
||||||
|
# using tools like "slist" (server-list).
|
||||||
|
#
|
||||||
|
# If you don't supply an entry for this section, the hostname of your
|
||||||
|
# Linux-machine will be converted to all-uppercase and used as the servername.
|
||||||
|
#
|
||||||
|
# Syntax:
|
||||||
|
# 2 SERVERNAME
|
||||||
|
#
|
||||||
|
# SERVERNAME: a name for this nw-server
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# 2 MARS
|
||||||
|
|
||||||
|
|
||||||
|
# Section 3: Number of the internal network
|
||||||
# If you have mars_nwe V > 0.96pl5 and a kernel >= 1.3.60
|
# If you have mars_nwe V > 0.96pl5 and a kernel >= 1.3.60
|
||||||
# or the small ipx-kpatch from the examples dir you should use
|
# or the small ipx-kpatch from the examples dir you should use
|
||||||
# internal net and routing.
|
# internal net and routing.
|
||||||
# NOTE: the internal NET Number must be UNIQUE
|
#
|
||||||
# in your IPX-environment. !
|
# NOTE: the internal net number must be _unique_ in your IPX-environment!
|
||||||
# INTERNAL NET [NODE] (default 1)
|
#
|
||||||
3 0xABCDEF99 1 # Net Number must be unique.
|
# Syntax:
|
||||||
######################################
|
# 3 INTERNAL_NET [NODE]
|
||||||
# entry 4: # for DEVICE(S)
|
#
|
||||||
|
# INTERNAL_NET: AUTO or 0 for using the ip number as INTERNAL_NET
|
||||||
|
#
|
||||||
|
# NODE: 1 (optional)
|
||||||
|
#
|
||||||
|
# Examples:
|
||||||
|
# 3 0xABCDEF99 # use a unique number
|
||||||
|
3 AUTO # use ip number as INTERNAL_NET
|
||||||
|
|
||||||
|
|
||||||
|
# Section 4: IPX-devices (optional)
|
||||||
|
#
|
||||||
# NOTE for people with other IPX/NCP servers on the net:
|
# NOTE for people with other IPX/NCP servers on the net:
|
||||||
# Your network numbers, frames must be the same as at your
|
# Your network numbers, frames must be the same as at your
|
||||||
# other servers on the same net.
|
# other servers on the same net.
|
||||||
# You also may choose a network number = '0', device = '*'
|
|
||||||
# and frame = 'auto' for autosetup of devices.
|
|
||||||
#
|
#
|
||||||
# NETWORK NUMBER, DEVICE, Frame-Typ TICKS (default 1)
|
# Syntax:
|
||||||
|
# 4 NET_NUMBER DEVICE FRAME TICKS
|
||||||
|
#
|
||||||
|
# NET_NUMBER:
|
||||||
|
# DEVICE: the network-interface associated with the NET_NUMBER
|
||||||
|
# FRAME:
|
||||||
|
# ethernet_ii
|
||||||
|
# 802.2
|
||||||
|
# 802.3 (default)
|
||||||
|
# snap
|
||||||
|
# token
|
||||||
|
# auto
|
||||||
|
# TICKS: ethernet: 1, isdn: 7
|
||||||
|
#
|
||||||
|
# Examples:
|
||||||
4 0x10 eth0 802.3 1
|
4 0x10 eth0 802.3 1
|
||||||
4 0x0 * AUTO 1 # autosetup all devices
|
# Automatic setup:
|
||||||
# ^^^^...........^^^....^^^^^^^
|
4 0x0 * AUTO 1
|
||||||
# NOTE: autosetup can only be choosen if you have other
|
#
|
||||||
# IXP/NCP servers on the same net which are setup correctly.
|
# NOTE: autosetup only works if there are other IXP/NCP servers on
|
||||||
######
|
# the same net which are setup correctly, that means: tells us the required
|
||||||
#4 0x22 eth0 ethernet_ii 1
|
# information about netnumber and frame.
|
||||||
#4 0x33 eth0 802.2 1
|
|
||||||
#4 0x55 isdn2 ethernet_ii 7
|
|
||||||
#4 0x66 tr0 token 1
|
# Section 5: Saving of ipx-routes (optional)
|
||||||
# Frames=ethernet_ii, 802.2, 802.3, snap, token, auto, (default 802.3),
|
#
|
||||||
5 0 # don't = 0, do = 1, save ipx-routes after server is down.
|
# This entry controls if the information regarding the ipx-routes should be
|
||||||
######################################
|
# saved beyond the livetime of the server.
|
||||||
# some clients are running better, if the server tells
|
# You can achieve a small speedup when starting mars_nwe by using this entry.
|
||||||
# that it is a 3.11 Server, although many calls
|
#
|
||||||
# (namespace services) of a real 3.11 Server are missing yet.
|
# Syntax:
|
||||||
# simple namespace services are implemented for testing
|
# 5 SAVE_FLAG
|
||||||
# since V 0.96pl8. To test them, this entry must be set to > 0.
|
#
|
||||||
# and config.h must be altered to compile in namespace calls.
|
# SAVE_FLAG:
|
||||||
6 0 # tells server version: 0=2.15, 1=3.11, 2=3.12
|
# 0 don't save routes (default)
|
||||||
######################################
|
# 1 do save routes
|
||||||
# Password handling
|
# Example:
|
||||||
7 0 # 0 = use only encrypted passwords stuff (default)
|
5 0
|
||||||
# 1 = allow the unencrypted change password routine.
|
|
||||||
# 7 = allow all unencrypted stuff, no empty nwe passwords.
|
|
||||||
# 8 = allow all unencrypted stuff, allow empty nwe passwords.
|
# Section 6: version-spoofing
|
||||||
# 9 = use all unencryted calls + get crypt key will allways fail
|
#
|
||||||
|
# Some clients work better if the server tells that it is a 3.11 Server,
|
||||||
|
# although many calls (namespace services) of a real 3.11 Server are
|
||||||
|
# missing yet.
|
||||||
|
# To test the namespace calls, this entry must be set to > 0 and `config.h'
|
||||||
|
# must be altered before compiling "mars_nwe".
|
||||||
|
#
|
||||||
|
# Syntax:
|
||||||
|
# 6 SERVER_VERSION
|
||||||
|
#
|
||||||
|
# SERVER_VERSION:
|
||||||
|
# 0 Version 2.15
|
||||||
|
# 1 Version 3.11
|
||||||
|
# 2 Version 3.12 (not implemented yet)
|
||||||
|
6 0
|
||||||
|
|
||||||
|
|
||||||
|
# Section 7: password handling (required)
|
||||||
|
# When changing your "mars_nwe"-password from a DOS-client, this client
|
||||||
|
# (think of "LOGIN.EXE", "SYSCON.EXE" or "SETPASS.EXE") can encrypt your
|
||||||
|
# password before sending it to the "mars_nwe"-server (this improves
|
||||||
|
# security a little bit).
|
||||||
|
# In this section you can enforce encryption of user-passwords or allow
|
||||||
|
# not-encrypted sending of passwords over the net.
|
||||||
|
# On the Linux-side, passwords will only be stored in encrypted format.
|
||||||
|
#
|
||||||
|
# Syntax:
|
||||||
|
# 7 FLAG
|
||||||
|
#
|
||||||
|
# FLAG:
|
||||||
|
# 0 use only encrypted passwords stuff.
|
||||||
|
# the encrypted change password call is not
|
||||||
|
# implemented till now, so if you choose this option
|
||||||
|
# you will not be able to change passwords from
|
||||||
|
# client size.
|
||||||
|
# 1 allow the unencrypted change password routine (default).
|
||||||
|
# You can use mars_dosutils or an old 2.15 setpass program.
|
||||||
|
#
|
||||||
|
# 7 allow all unencrypted stuff, no empty nwe passwords.
|
||||||
|
# 8 allow all unencrypted stuff, allow empty nwe passwords.
|
||||||
|
# 9 use all unencryted calls + get crypt key will allways fail
|
||||||
# so the login program will use the old unencryted calls.
|
# so the login program will use the old unencryted calls.
|
||||||
# this will *not* work with all clients !! (OS2/client)
|
# this will *not* work with all clients !! (OS2/client)
|
||||||
######################################
|
7 1
|
||||||
# GID and UID for _minimal_ rights
|
|
||||||
# will be used for not logins or not assigned mars_nwe users.
|
|
||||||
10 200 # GID
|
# Section 10 + 11 : UID and GID with minimal rights
|
||||||
11 201 # UID
|
#
|
||||||
######################################
|
# When loading the netware-drivers in the "autoexec.bat" of your
|
||||||
# the following passwords should be removed after the first
|
# DOS-client, you automatically "attach" to a netware-server.
|
||||||
# start, because these entries will be inserted (crypted) into
|
# As a result, a new drive-letter is accessible under DOS, usally
|
||||||
# the bindery. If you specify a password here, then this password
|
# containing the programs "login.exe" and "slist.exe".
|
||||||
# will be put into bindery after every start of mars_nwe.
|
# Because you haven't logged in, nothing else of the netware-server
|
||||||
# one entry 12 for SUPERVISOR
|
# will be visible to you. All actions requested from the DOS-client
|
||||||
## NW-Name UNIX-Name [PASSWORD]
|
# will be done with the following UID and GID on the Linux-side in this
|
||||||
12 SUPERVISOR root MYPW # Supervisor
|
# case.
|
||||||
#############################
|
# To achieve some level of security, the user/group asscociated with
|
||||||
# more entries 13 for other user(s)
|
# the UID and GID should only have _read_ rights on the files visible,
|
||||||
## NW-Name UNIX-Name [PASSWORD]
|
# _nothing_ else.
|
||||||
#13 MAR mar # others
|
#
|
||||||
#13 ALF mar # others
|
# On most Linux-systems, there is a user and group "nobody" defined in
|
||||||
#####
|
# `/etc/passwd' and `/etc/group'. Use the number of that user/group
|
||||||
# Read UnixUsers automaticly from passwd into bindery
|
# for the following entries.
|
||||||
# switch password
|
#
|
||||||
15 0 secure11
|
# Syntax:
|
||||||
# ^^^ 0=off (default), 1=on, 99=overwrite existing mars_nwe users.
|
# 10 GID
|
||||||
|
# 11 UID
|
||||||
|
# Example:
|
||||||
|
# 10 65534
|
||||||
|
# 11 65534
|
||||||
|
#
|
||||||
|
# GID numeric number of the group
|
||||||
|
# UID numeric number of the user
|
||||||
|
10 65534
|
||||||
|
11 65534
|
||||||
|
|
||||||
|
|
||||||
|
# Section 12: supervisor-login (required)
|
||||||
|
#
|
||||||
|
# The "supervisor" of a nw-server is much like "root" on the Linux-side.
|
||||||
|
#
|
||||||
|
# Syntax:
|
||||||
|
# 12 NW_LOGIN LINUX_LOGIN [PASSWORD]
|
||||||
|
#
|
||||||
|
# NW_LOGIN: the login-name for the "mars_nwe"-server (traditionally,
|
||||||
|
# this is "SUPERVISOR")
|
||||||
|
# LINUX_LOGIN: the account on the Linux-side associated with the NW_LOGIN
|
||||||
|
# (to improve security, don't use "root" here)
|
||||||
|
# PASSWORD: the password for the NW_LOGIN. It must be clear-text but
|
||||||
|
# will be encrypted and permanent stored in the
|
||||||
|
# bindery-files, so it can be deleted after the first start
|
||||||
|
# of "nwserv".
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
12 SUPERVISOR root top-secret
|
||||||
|
|
||||||
|
|
||||||
|
# Section 13: user-logins (optional)
|
||||||
|
#
|
||||||
|
# See section 12 for the syntax.
|
||||||
|
#
|
||||||
|
# Examples:
|
||||||
|
13 MAR mar mypw
|
||||||
|
13 ALF mar - # no password
|
||||||
|
|
||||||
|
|
||||||
|
# Section 15: read unix users automaticly from passwd into bindery
|
||||||
|
#
|
||||||
|
# Syntax:
|
||||||
|
# 15 FLAG DEFAULT_PASSWORD
|
||||||
|
#
|
||||||
|
# FLAG:
|
||||||
|
# 0 off
|
||||||
|
# 1 on
|
||||||
|
# 99 overwrite existing users.
|
||||||
|
#
|
||||||
|
# DEFAULT_PASSWORD: password for every new inserted user.
|
||||||
|
#
|
||||||
|
15 0 top-secret
|
||||||
|
#
|
||||||
# !!! IMPORTANT !!!
|
# !!! IMPORTANT !!!
|
||||||
# If you enable this feature you should chose a secure
|
# If you enable this feature you should chose a secure
|
||||||
# password for the users, because all not existent
|
# password for the users, because all not existent
|
||||||
# mars_nwe users will be inserted into bindery with this password.
|
# mars_nwe users will be inserted into bindery with this password.
|
||||||
###############
|
|
||||||
|
|
||||||
|
# Section 16: Tests on startup
|
||||||
|
#
|
||||||
16 1 # enable some bindery and sys dir tests/creats after starting.
|
16 1 # enable some bindery and sys dir tests/creats after starting.
|
||||||
#############################
|
# default = 1
|
||||||
# entry 21 for simple print queues
|
|
||||||
# the queue Directory must exist before printing !!!
|
|
||||||
# QUEUE NAME, Q_DIRECTORY, UNIX-print-command (pipe)
|
# Section 21: print queues (optional)
|
||||||
21 Q1 SYS:/PRINT/Q1 lpr
|
#
|
||||||
#21 Q2 SYS:/PRINT/Q2 lpr -C printer2
|
# Make the printers connected to your Linux-box accessible from the
|
||||||
#############################
|
# DOS-clients.
|
||||||
# >= 100 debug flags,
|
# Multiple entries are allowed.
|
||||||
# 0=nodebug, 1=mindebug(errors+notes), 99=maxdebug
|
#
|
||||||
|
# Syntax:
|
||||||
|
# 21 QUEUE_NAME QUEUE_DIR PRINT_COMMAND
|
||||||
|
#
|
||||||
|
# QUEUE_NAME: the name of the print queue
|
||||||
|
# QUEUE_DIR: spooling directory for the print-jobs; this directory must
|
||||||
|
# exist before printing
|
||||||
|
# PRINT_COMMAND: command used for serving the print-jobs under Linux
|
||||||
|
# (see "man lpr" and "man magicfilter" for details)
|
||||||
|
#
|
||||||
|
# Examples:
|
||||||
|
# 21 LASER SYS:/PRINT/L lpr -Plaser
|
||||||
|
# 21 OCTOPUSS SYS:/PRINT/O lpr -Php_deskjet
|
||||||
|
|
||||||
|
|
||||||
|
# --------------------------------------------------------
|
||||||
|
# You usally don't want to change anything below this line
|
||||||
|
# --------------------------------------------------------
|
||||||
|
|
||||||
|
# Sections 100-106: amount of debug-information
|
||||||
|
#
|
||||||
|
# FLAG:
|
||||||
|
# 0 no debug messages
|
||||||
|
# 1 errors and notes are reported
|
||||||
|
# ..
|
||||||
|
# 99 maximum debug level
|
||||||
100 0 # debug IPX KERNEL (0 | 1)
|
100 0 # debug IPX KERNEL (0 | 1)
|
||||||
101 1 # debug NWSERV
|
101 1 # debug NWSERV
|
||||||
102 0 # debug NCPSERV
|
102 0 # debug NCPSERV
|
||||||
@ -135,28 +312,46 @@
|
|||||||
104 0 # debug (start) NWCLIENT
|
104 0 # debug (start) NWCLIENT
|
||||||
105 0 # debug NWBIND
|
105 0 # debug NWBIND
|
||||||
106 1 # debug NWROUTED
|
106 1 # debug NWROUTED
|
||||||
#############################
|
|
||||||
|
|
||||||
|
# Sections 200-202: logging of "nwserv"
|
||||||
|
#
|
||||||
200 1 # 0 = no logfile and dont daemonize nwserv/nwrouted
|
200 1 # 0 = no logfile and dont daemonize nwserv/nwrouted
|
||||||
# # 1 = daemonize nwserv/nwrouted and use logfile
|
# # 1 = daemonize nwserv/nwrouted and use logfile
|
||||||
201 /tmp/nw.log # logfilename
|
201 /tmp/nw.log # filename of logfile
|
||||||
202 1 # 1=creat new logfile, 0=append to logfile
|
202 1 # 1=creat new logfile, 0=append to logfile
|
||||||
#############################
|
|
||||||
210 10 # 1 .. 600 (default 10) seconds after server really goes down
|
|
||||||
# # after a down command
|
# Sections 210,211: timing
|
||||||
|
#
|
||||||
|
210 10 # 1 .. 600 (default 10) seconds after server
|
||||||
|
# # really goes down after a down command
|
||||||
211 60 # 10 .. 600 (default 60) broadcasts every x seconds
|
211 60 # 10 .. 600 (default 60) broadcasts every x seconds
|
||||||
#############################
|
|
||||||
300 1 # > 0 print routing info to file every x broadcasts. ( normally minutes )
|
|
||||||
301 /tmp/nw.routes # filename.
|
# Sections 300-302: loging of routing-information
|
||||||
302 1 # creat new routing info file=1, append to this file=0
|
#
|
||||||
#############################
|
300 1 # > 0 print routing info to file every x broadcasts.
|
||||||
|
# # ( normally minutes )
|
||||||
|
301 /tmp/nw.routes # filename of logfile
|
||||||
|
302 1 # 1 = creat new routing info file
|
||||||
|
# # 0 = append to this file
|
||||||
|
|
||||||
|
|
||||||
|
# Section 310: watchdogs
|
||||||
|
#
|
||||||
310 7 # send wdog's only to device net < x ticks.
|
310 7 # send wdog's only to device net < x ticks.
|
||||||
# 0 = allways send wdogs. < 0 = never send wdogs
|
# 0 = allways send wdogs. < 0 = never send wdogs
|
||||||
##############################
|
#
|
||||||
|
# Section 400:
|
||||||
# station file for special handling of stations.
|
# station file for special handling of stations.
|
||||||
|
#
|
||||||
400 /etc/nwserv.stations # for syntax see file in the examples directory.
|
400 /etc/nwserv.stations # for syntax see file in the examples directory.
|
||||||
|
|
||||||
|
|
||||||
|
# Section 401: nearest server
|
||||||
|
#
|
||||||
# for special handling of the 'get nearest server request'.
|
# for special handling of the 'get nearest server request'.
|
||||||
401 0 # 0 = ignore entry 400, get nearest response ever enabled.
|
401 0 # 0 = ignore entry 400, get nearest response ever enabled.
|
||||||
# 1 = 400 are excludes, get nearest response normally enabled.
|
# 1 = 400 are excludes, get nearest response normally enabled.
|
||||||
# 2 = 400 are includes, get nearest response normally disabled.
|
# 2 = 400 are includes, get nearest response normally disabled.
|
||||||
###
|
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ C=.c
|
|||||||
|
|
||||||
V_H=0
|
V_H=0
|
||||||
V_L=97
|
V_L=97
|
||||||
P_L=3
|
P_L=4
|
||||||
|
|
||||||
#define D_P_L 1
|
#define D_P_L 1
|
||||||
DISTRIB=mars_nwe
|
DISTRIB=mars_nwe
|
||||||
|
151
namspace.c
151
namspace.c
@ -1,4 +1,4 @@
|
|||||||
/* namspace.c 06-May-96 : NameSpace Services, mars_nwe */
|
/* namspace.c 13-May-96 : NameSpace Services, mars_nwe */
|
||||||
|
|
||||||
/* !!!!!!!!!!!! NOTE !!!!!!!!!! */
|
/* !!!!!!!!!!!! NOTE !!!!!!!!!! */
|
||||||
/* Its very dirty till now. */
|
/* Its very dirty till now. */
|
||||||
@ -225,12 +225,6 @@ static DIR_BASE_ENTRY *allocate_dbe_p(int namespace)
|
|||||||
return(*pdbe);
|
return(*pdbe);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int allocate_dbe(int namespace)
|
|
||||||
{
|
|
||||||
DIR_BASE_ENTRY *dbe=allocate_dbe_p(namespace);
|
|
||||||
return((NULL != dbe) ? dbe->slot : -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void xx_free_dbe_p(DIR_BASE_ENTRY **dbe)
|
static void xx_free_dbe_p(DIR_BASE_ENTRY **dbe)
|
||||||
{
|
{
|
||||||
if (NULL != dbe && NULL != *dbe) {
|
if (NULL != dbe && NULL != *dbe) {
|
||||||
@ -293,6 +287,7 @@ char *debug_nwpath_name(N_NW_PATH *p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int get_comp_pathes_size(NW_HPATH *nwp, uint8 *pp_pathes)
|
static int get_comp_pathes_size(NW_HPATH *nwp, uint8 *pp_pathes)
|
||||||
|
/* returns size of path components in bytes */
|
||||||
{
|
{
|
||||||
int k = -1;
|
int k = -1;
|
||||||
int size = 0;
|
int size = 0;
|
||||||
@ -387,6 +382,7 @@ static int nwp_stat(N_NW_PATH *nwpath, char *debstr)
|
|||||||
|
|
||||||
static uint32 build_base_handle(N_NW_PATH *nwpath, int namespace)
|
static uint32 build_base_handle(N_NW_PATH *nwpath, int namespace)
|
||||||
/* returns basehandle of path, or 0 if not exist !! */
|
/* returns basehandle of path, or 0 if not exist !! */
|
||||||
|
/* nwpath must be filled, namespace must be specified */
|
||||||
{
|
{
|
||||||
uint32 basehandle=0L;
|
uint32 basehandle=0L;
|
||||||
if (!nwp_stat(nwpath, "build_base_handle")) {
|
if (!nwp_stat(nwpath, "build_base_handle")) {
|
||||||
@ -417,9 +413,13 @@ static int insert_get_base_entry(DIR_BASE_ENTRY *dbe,
|
|||||||
{
|
{
|
||||||
N_NW_PATH *nwpath = &(dbe->nwpath);
|
N_NW_PATH *nwpath = &(dbe->nwpath);
|
||||||
uint32 basehandle = build_base_handle(nwpath, namespace);
|
uint32 basehandle = build_base_handle(nwpath, namespace);
|
||||||
|
|
||||||
if (!basehandle && creatmode) { /* now creat the entry (file or dir) */
|
if (!basehandle && creatmode) { /* now creat the entry (file or dir) */
|
||||||
int result = 0;
|
int result = 0;
|
||||||
char *unname = nwpath_2_unix(nwpath, 2);
|
char *unname = nwpath_2_unix(nwpath, 2);
|
||||||
|
if (get_volume_options(nwpath->volume, 1) &
|
||||||
|
VOL_OPTION_READONLY) return(-0x8a);
|
||||||
|
|
||||||
if (creatmode & FILE_ATTR_DIR) {
|
if (creatmode & FILE_ATTR_DIR) {
|
||||||
/* creat dir */
|
/* creat dir */
|
||||||
if (mkdir(unname, 0777)) result=-0x84;
|
if (mkdir(unname, 0777)) result=-0x84;
|
||||||
@ -450,19 +450,19 @@ static int insert_get_base_entry(DIR_BASE_ENTRY *dbe,
|
|||||||
dbe->basehandle = basehandle;
|
dbe->basehandle = basehandle;
|
||||||
return(touch_handle_entry_p(dbe));
|
return(touch_handle_entry_p(dbe));
|
||||||
}
|
}
|
||||||
return(-0xff); /* no files matching */
|
return(-0xff); /* invalid path = -0x9c, -0xff no matching files */
|
||||||
}
|
}
|
||||||
|
|
||||||
static int build_dos_base(NW_HPATH *nwp,
|
static int build_dos_base(NW_HPATH *nwp,
|
||||||
uint8 *pathes,
|
uint8 *pathes,
|
||||||
int dbase,
|
DIR_BASE_ENTRY *dbe,
|
||||||
int mode, uint8 *rets)
|
int mode,
|
||||||
|
uint8 *rets)
|
||||||
/* routine returns the actual dbe entry offset or */
|
/* routine returns the actual dbe entry offset or */
|
||||||
/* < 0 if error */
|
/* < 0 if error */
|
||||||
/* if mode == 1, then last_path will be ignored and will be put */
|
/* if mode == 1, then last_path will be ignored and will be put */
|
||||||
/* into the rets variable */
|
/* into the rets variable */
|
||||||
{
|
{
|
||||||
DIR_BASE_ENTRY *dbe=dir_base[dbase];
|
|
||||||
N_NW_PATH *nwpath=&(dbe->nwpath);
|
N_NW_PATH *nwpath=&(dbe->nwpath);
|
||||||
int result=0;
|
int result=0;
|
||||||
if (!nwp->flag) { /* short handle */
|
if (!nwp->flag) { /* short handle */
|
||||||
@ -479,9 +479,9 @@ static int build_dos_base(NW_HPATH *nwp,
|
|||||||
} else if (nwp->flag == 1) { /* basehandle */
|
} else if (nwp->flag == 1) { /* basehandle */
|
||||||
uint32 basehandle = GET_32(nwp->base);
|
uint32 basehandle = GET_32(nwp->base);
|
||||||
int k = -1;
|
int k = -1;
|
||||||
result = -0x9b;
|
result = -0x9b; /* here wrong dir_handle should mean wrong basehandle */
|
||||||
while (++k < anz_dbe) {
|
while (++k < anz_dbe) {
|
||||||
if (k != dbase) {
|
if (k != dbe->slot) {
|
||||||
DIR_BASE_ENTRY *e=dir_base[k];
|
DIR_BASE_ENTRY *e=dir_base[k];
|
||||||
if ( (DIR_BASE_ENTRY*)NULL != e
|
if ( (DIR_BASE_ENTRY*)NULL != e
|
||||||
&& e->nwpath.volume == nwp->volume
|
&& e->nwpath.volume == nwp->volume
|
||||||
@ -507,7 +507,7 @@ static int build_dos_base(NW_HPATH *nwp,
|
|||||||
*(nwpath->path) = '\0';
|
*(nwpath->path) = '\0';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (pp) nwpath->fn=(uint8*)pp+1;
|
nwpath->fn = (pp) ? (uint8*)pp+1 : nwpath->path;
|
||||||
result = insert_get_base_entry(dbe, NAME_DOS, 0);
|
result = insert_get_base_entry(dbe, NAME_DOS, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -521,21 +521,19 @@ int nw_generate_dir_path(int namespace,
|
|||||||
|
|
||||||
/* returns Volume Number >=0 or errcode < 0 if error */
|
/* returns Volume Number >=0 or errcode < 0 if error */
|
||||||
{
|
{
|
||||||
int dbase = allocate_dbe(namespace);
|
DIR_BASE_ENTRY *dbe=allocate_dbe_p(namespace);
|
||||||
int result = -0xfb;
|
int result = -0xfb;
|
||||||
if (dbase > -1) {
|
if (NULL != dbe) {
|
||||||
if ((result = build_dos_base(nwp, nwp->pathes, dbase, 0, NULL)) > -1) {
|
if ((result = build_dos_base(nwp, nwp->pathes, dbe, 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, ns_dir_base); /* LOW - HIGH */
|
||||||
U32_TO_32(dbe->basehandle, dos_dir_base);
|
U32_TO_32(dbe->basehandle, dos_dir_base);
|
||||||
XDPRINTF((3, 0, "nw_generate_dir_path path=%s, result=%d, basehandle=0x%x",
|
XDPRINTF((3, 0, "nw_generate_dir_path path=%s, result=%d, basehandle=0x%x",
|
||||||
debug_nwpath_name(&(dbe->nwpath)), result, dbe->basehandle));
|
debug_nwpath_name(&(dbe->nwpath)), result, dbe->basehandle));
|
||||||
result= dbe->nwpath.volume;
|
result= dbe->nwpath.volume;
|
||||||
} else free_dbe(dbase);
|
} else free_dbe_p(dbe);
|
||||||
}
|
}
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
XDPRINTF((3, 0, "nw_generate_dir_path NOT OK dbase=%d, result=%d",
|
XDPRINTF((3, 0, "nw_generate_dir_path NOT OK result=-0x%x", -result));
|
||||||
dbase, result));
|
|
||||||
}
|
}
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
@ -640,18 +638,16 @@ int nw_optain_file_dir_info(int namespace, NW_HPATH *nwp,
|
|||||||
* But the _valid_ info is.
|
* But the _valid_ info is.
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
int dbase = allocate_dbe(namespace);
|
DIR_BASE_ENTRY *dbe = allocate_dbe_p(namespace);
|
||||||
int result = -0xfb;
|
int result = -0xfb;
|
||||||
if (dbase > -1) {
|
if (NULL != dbe) {
|
||||||
if ((result = build_dos_base(nwp, nwp->pathes, dbase, 0, NULL)) > -1) {
|
if ((result = build_dos_base(nwp, nwp->pathes, dbe, 0, NULL)) > -1) {
|
||||||
DIR_BASE_ENTRY *dbe=dir_base[result];
|
|
||||||
nwp_stat(&(dbe->nwpath), "nw_optain_file_dir_info");
|
nwp_stat(&(dbe->nwpath), "nw_optain_file_dir_info");
|
||||||
result = build_dir_info(dbe, infomask, responsedata);
|
result = build_dir_info(dbe, infomask, responsedata);
|
||||||
} else free_dbe(dbase);
|
} else free_dbe_p(dbe);
|
||||||
}
|
}
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
XDPRINTF((3, 0, "nw_optain_file_dir_info NOT OK dbase=%d, result=-0x%x",
|
XDPRINTF((3, 0, "nw_optain_file_dir_info NOT OK result=-0x%x", -result));
|
||||||
dbase, -result));
|
|
||||||
}
|
}
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
@ -663,8 +659,7 @@ static int nw_init_search(int namespace,
|
|||||||
DIR_BASE_ENTRY *dbe=allocate_dbe_p(namespace);
|
DIR_BASE_ENTRY *dbe=allocate_dbe_p(namespace);
|
||||||
int result = -0xfb;
|
int result = -0xfb;
|
||||||
if (NULL != dbe) {
|
if (NULL != dbe) {
|
||||||
if ((result = build_dos_base(nwp, nwp->pathes, dbe->slot, 0, NULL)) > -1) {
|
if ((result = build_dos_base(nwp, nwp->pathes, dbe, 0, NULL)) > -1) {
|
||||||
dbe=dir_base[result];
|
|
||||||
result = base_open_seek_dir(dbe, 0L);
|
result = base_open_seek_dir(dbe, 0L);
|
||||||
if (result > -1) {
|
if (result > -1) {
|
||||||
*responsedata++ = dbe->nwpath.volume;
|
*responsedata++ = dbe->nwpath.volume;
|
||||||
@ -789,22 +784,21 @@ static int nw_open_creat_file_or_dir(int namespace,
|
|||||||
NW_HPATH *nwp, uint8 *pathes,
|
NW_HPATH *nwp, uint8 *pathes,
|
||||||
uint8 *responsedata)
|
uint8 *responsedata)
|
||||||
{
|
{
|
||||||
int dbase = allocate_dbe(namespace);
|
DIR_BASE_ENTRY *dbe=allocate_dbe_p(namespace);
|
||||||
int result = -0xfb;
|
int result = -0xfb;
|
||||||
if (dbase > -1) {
|
if (NULL != dbe) {
|
||||||
int exist=-1;
|
int exist=-1;
|
||||||
uint8 last_part[258];
|
uint8 last_part[258];
|
||||||
*last_part='\0';
|
*last_part='\0';
|
||||||
if ((result = build_dos_base(nwp, pathes, dbase, 0, NULL)) > -1) {
|
if ((result = build_dos_base(nwp, pathes, dbe, 0, NULL)) > -1) {
|
||||||
exist = result;
|
exist = result;
|
||||||
} else if (opencreatmode & OPC_MODE_CREAT) {
|
} else if (opencreatmode & OPC_MODE_CREAT) {
|
||||||
result = build_dos_base(nwp, pathes, dbase, 1, last_part);
|
result = build_dos_base(nwp, pathes, dbe, 1, last_part);
|
||||||
if (result > -1)
|
if (result > -1)
|
||||||
result = get_add_new_entry(dir_base[result], last_part,
|
result = get_add_new_entry(dbe, last_part,
|
||||||
(creatattrib & FILE_ATTR_DIR) ? FILE_ATTR_DIR : 1);
|
(creatattrib & FILE_ATTR_DIR) ? FILE_ATTR_DIR : 1);
|
||||||
}
|
}
|
||||||
if (result > -1) {
|
if (result > -1) {
|
||||||
DIR_BASE_ENTRY *dbe=dir_base[result];
|
|
||||||
uint32 fhandle=0L;
|
uint32 fhandle=0L;
|
||||||
int actionresult=0;
|
int actionresult=0;
|
||||||
if (exist < 0) actionresult |= OPC_ACTION_CREAT;
|
if (exist < 0) actionresult |= OPC_ACTION_CREAT;
|
||||||
@ -837,7 +831,7 @@ static int nw_open_creat_file_or_dir(int namespace,
|
|||||||
responsedata++ ;
|
responsedata++ ;
|
||||||
result = 5 + build_dir_info(dbe,infomask, responsedata);
|
result = 5 + build_dir_info(dbe,infomask, responsedata);
|
||||||
}
|
}
|
||||||
}
|
} else free_dbe_p(dbe);
|
||||||
}
|
}
|
||||||
XDPRINTF((3, 0, "nw_open_creat mode=0x%x, creatattr=0x%x, access=0x%x, attr=0x%x, result=%d",
|
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));
|
opencreatmode, creatattrib, access_rights, attrib, result));
|
||||||
@ -847,24 +841,30 @@ static int nw_open_creat_file_or_dir(int namespace,
|
|||||||
static int nw_delete_file_dir(int namespace, int searchattrib,
|
static int nw_delete_file_dir(int namespace, int searchattrib,
|
||||||
NW_HPATH *nwp)
|
NW_HPATH *nwp)
|
||||||
{
|
{
|
||||||
int dbase = allocate_dbe(namespace);
|
DIR_BASE_ENTRY *dbe = allocate_dbe_p(namespace);
|
||||||
int result = -0xfb;
|
int result = -0xfb;
|
||||||
if (dbase > -1) {
|
if (dbe != NULL) {
|
||||||
if ((result = build_dos_base(nwp, nwp->pathes, dbase, 0, NULL)) > -1) {
|
if ((result = build_dos_base(nwp, nwp->pathes, dbe, 0, NULL)) > -1) {
|
||||||
DIR_BASE_ENTRY *dbe=dir_base[dbase=result];
|
|
||||||
uint8 *unname=(uint8*)nwpath_2_unix(&(dbe->nwpath), 2);
|
uint8 *unname=(uint8*)nwpath_2_unix(&(dbe->nwpath), 2);
|
||||||
if (S_ISDIR(dbe->nwpath.statb.st_mode)) result = rmdir(unname);
|
if (get_volume_options(dbe->nwpath.volume, 1) &
|
||||||
else result = unlink(unname);
|
VOL_OPTION_READONLY) result = -0x8a;
|
||||||
|
else {
|
||||||
|
if (S_ISDIR(dbe->nwpath.statb.st_mode)) {
|
||||||
|
free_dbe_p(dbe);
|
||||||
|
result = rmdir(unname);
|
||||||
|
} else {
|
||||||
|
if (-1 < (result = unlink(unname)))
|
||||||
|
free_dbe_p(dbe);
|
||||||
|
}
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
switch (errno) {
|
switch (errno) {
|
||||||
case EEXIST: result=-0xa0; /* dir not empty */
|
case EEXIST: result=-0xa0; /* dir not empty */
|
||||||
default: result=-0x8a; /* No privilegs */
|
default: result=-0x8a; /* No privilegs */
|
||||||
}
|
}
|
||||||
} else {
|
} else
|
||||||
result = 0;
|
result = 0;
|
||||||
free_dbe(dbase) ;
|
|
||||||
}
|
}
|
||||||
} else free_dbe(dbase);
|
} else free_dbe_p(dbe);
|
||||||
}
|
}
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
@ -875,8 +875,7 @@ static int nw_alloc_short_dir_handle(int namespace, int hmode,
|
|||||||
DIR_BASE_ENTRY *dbe=allocate_dbe_p(namespace);
|
DIR_BASE_ENTRY *dbe=allocate_dbe_p(namespace);
|
||||||
int result = -0xfb;
|
int result = -0xfb;
|
||||||
if (NULL != dbe) {
|
if (NULL != dbe) {
|
||||||
if ((result = build_dos_base(nwp, nwp->pathes, dbe->slot, 0, NULL)) > -1) {
|
if ((result = build_dos_base(nwp, nwp->pathes, dbe, 0, NULL)) > -1) {
|
||||||
dbe=dir_base[result];
|
|
||||||
if (S_ISDIR(dbe->nwpath.statb.st_mode)) {
|
if (S_ISDIR(dbe->nwpath.statb.st_mode)) {
|
||||||
result=xinsert_new_dir(dbe->nwpath.volume, dbe->nwpath.path,
|
result=xinsert_new_dir(dbe->nwpath.volume, dbe->nwpath.path,
|
||||||
dbe->nwpath.statb.st_ino, 300, hmode, task);
|
dbe->nwpath.statb.st_ino, 300, hmode, task);
|
||||||
@ -897,21 +896,26 @@ static int nw_rename_file_dir(int namespace,
|
|||||||
DIR_BASE_ENTRY *dbe_d = (NULL != dbe_s) ? allocate_dbe_p(namespace) : NULL;
|
DIR_BASE_ENTRY *dbe_d = (NULL != dbe_s) ? allocate_dbe_p(namespace) : NULL;
|
||||||
int result = -0xfb;
|
int result = -0xfb;
|
||||||
if (dbe_d &&
|
if (dbe_d &&
|
||||||
(result = build_dos_base(nwps, pathes_s, dbe_s->slot, 0, NULL)) > -1) {
|
(result = build_dos_base(nwps, pathes_s, dbe_s, 0, NULL)) > -1) {
|
||||||
uint8 last_part[258];
|
uint8 last_part[258];
|
||||||
uint8 *unname_s=
|
uint8 *unname_s=
|
||||||
(uint8*)nwpath_2_unix1(&((dbe_s=dir_base[result])->nwpath),
|
(uint8*)nwpath_2_unix1(&(dbe_s->nwpath), 2, 1);
|
||||||
2, 1);
|
if ((result = build_dos_base(nwpd, pathes_d, dbe_d,
|
||||||
if ((result = build_dos_base(nwpd, pathes_d, dbe_d->slot,
|
|
||||||
1, last_part)) > -1) {
|
1, last_part)) > -1) {
|
||||||
uint8 *unname_d =
|
uint8 *unname_d =
|
||||||
(uint8*)nwpath_2_unix2(&((dbe_d=dir_base[result])->nwpath),
|
(uint8*)nwpath_2_unix2(&(dbe_d->nwpath), 0, 1, last_part);
|
||||||
0, 1, last_part);
|
|
||||||
|
|
||||||
|
if (get_volume_options(dbe_s->nwpath.volume, 1) &
|
||||||
|
VOL_OPTION_READONLY) result= EROFS;
|
||||||
|
else if (get_volume_options(dbe_d->nwpath.volume, 1) &
|
||||||
|
VOL_OPTION_READONLY) result= EROFS;
|
||||||
|
|
||||||
|
else {
|
||||||
if (S_ISDIR(dbe_s->nwpath.statb.st_mode))
|
if (S_ISDIR(dbe_s->nwpath.statb.st_mode))
|
||||||
result = unx_mvdir(unname_s, unname_d);
|
result = unx_mvdir(unname_s, unname_d);
|
||||||
else
|
else
|
||||||
result = unx_mvfile(unname_s, unname_d);
|
result = unx_mvfile(unname_s, unname_d);
|
||||||
|
}
|
||||||
|
|
||||||
XDPRINTF((5, 0, "Rename:%d '%s' -> '%s'", result, unname_s, unname_d));
|
XDPRINTF((5, 0, "Rename:%d '%s' -> '%s'", result, unname_s, unname_d));
|
||||||
|
|
||||||
@ -920,8 +924,8 @@ static int nw_rename_file_dir(int namespace,
|
|||||||
case 0 : break;
|
case 0 : break;
|
||||||
|
|
||||||
case EEXIST : result = -0x92; break;
|
case EEXIST : result = -0x92; break;
|
||||||
|
case EROFS : result = -0x8b; break;
|
||||||
default : result = -0xff;
|
default : result = -0x8b;
|
||||||
}
|
}
|
||||||
if (!result) {
|
if (!result) {
|
||||||
free_dbe_p(dbe_s);
|
free_dbe_p(dbe_s);
|
||||||
@ -969,7 +973,7 @@ int handle_func_0x57(uint8 *p, uint8 *responsedata, int task)
|
|||||||
case 0x03 : /* Search for File or DIR */
|
case 0x03 : /* Search for File or DIR */
|
||||||
{
|
{
|
||||||
/* NW PATH STRUC */
|
/* NW PATH STRUC */
|
||||||
int datastream = *(p+1);
|
int datastream = (int) *(p+1);
|
||||||
int searchattrib = (int) GET_16(p+2); /* LOW-HI */
|
int searchattrib = (int) GET_16(p+2); /* LOW-HI */
|
||||||
uint32 infomask = GET_32(p+4); /* LOW-HI */
|
uint32 infomask = GET_32(p+4); /* LOW-HI */
|
||||||
int volume = *(p+8);
|
int volume = *(p+8);
|
||||||
@ -1123,4 +1127,37 @@ int handle_func_0x57(uint8 *p, uint8 *responsedata, int task)
|
|||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int handle_func_0x56(uint8 *p, uint8 *responsedata, int task)
|
||||||
|
/* extended attribute calls */
|
||||||
|
{
|
||||||
|
int result = -0xfb; /* unknown request */
|
||||||
|
int ufunc = (int) *p++; /* now p locates at 4 byte boundary */
|
||||||
|
XDPRINTF((3, 0, "0x56 call ufunc=0x%x", ufunc));
|
||||||
|
switch (ufunc) {
|
||||||
|
#if 0
|
||||||
|
case 0x03 : /* read extended attribute */
|
||||||
|
{
|
||||||
|
int flags = GET_BE16(p);
|
||||||
|
/* next 2 entries only if flags bits 0-1 = 00 */
|
||||||
|
int volume = (int)GET_32(p+2);
|
||||||
|
uint32 basehandle = (int)GET_32(p+6);
|
||||||
|
struct OUTPUT {
|
||||||
|
uint8 errorcode[4]; /* ???? */
|
||||||
|
uint8 ttl_v_length[4]; /* ???? */
|
||||||
|
uint8 ea_handle[4]; /* ???? */
|
||||||
|
uint8 access[4]; /* ???? */
|
||||||
|
uint8 value_length[2]; /* ???? */
|
||||||
|
uint8 value[2];
|
||||||
|
} *xdata= (struct OUTPUT*)responsedata;
|
||||||
|
memset(xdata, 0, sizeof(struct OUTPUT));
|
||||||
|
/* U32_TO_BE32(1, xdata->errorcode); */
|
||||||
|
result = sizeof(struct OUTPUT);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default : result = -0xfb; /* unknown request */
|
||||||
|
} /* switch */
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -68,5 +68,6 @@ typedef struct {
|
|||||||
|
|
||||||
|
|
||||||
extern int handle_func_0x57(uint8 *p, uint8 *responsedata, int task);
|
extern int handle_func_0x57(uint8 *p, uint8 *responsedata, int task);
|
||||||
|
extern int handle_func_0x56(uint8 *p, uint8 *responsedata, int task);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
2
net.h
2
net.h
@ -181,7 +181,7 @@ extern int errno;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef WITH_NAME_SPACE_CALLS
|
#ifndef WITH_NAME_SPACE_CALLS
|
||||||
# define WITH_NAME_SPACE_CALLS 1
|
# define WITH_NAME_SPACE_CALLS 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef MAX_DIR_BASE_ENTRIES
|
#ifndef MAX_DIR_BASE_ENTRIES
|
||||||
|
97
nwbind.c
97
nwbind.c
@ -1,5 +1,5 @@
|
|||||||
/* nwbind.c */
|
/* nwbind.c */
|
||||||
#define REVISION_DATE "05-May-96"
|
#define REVISION_DATE "08-May-96"
|
||||||
/* NCP Bindery SUB-SERVER */
|
/* NCP Bindery SUB-SERVER */
|
||||||
/* authentification and some message handling */
|
/* authentification and some message handling */
|
||||||
|
|
||||||
@ -144,9 +144,14 @@ int b_acc(uint32 obj_id, int security, int forwrite)
|
|||||||
* 3 = only supervisor has access
|
* 3 = only supervisor has access
|
||||||
* 4 = only internal access.
|
* 4 = only internal access.
|
||||||
*/
|
*/
|
||||||
|
char *acc_what=NULL;
|
||||||
|
char *acc_typ=NULL;
|
||||||
|
int errcode =0;
|
||||||
|
XDPRINTF((5,0, "b_acc for id=0x%lx, security=0x%x, forwrite=0x%x",
|
||||||
|
obj_id, security, forwrite));
|
||||||
if (internal_act || !act_c) return(0); /* allways full access to internal routines */
|
if (internal_act || !act_c) return(0); /* allways full access to internal routines */
|
||||||
if (forwrite) security >>= 4; /* writesecurity */
|
if (forwrite & 0xf) security >>= 4; /* writesecurity */
|
||||||
security &= 0x4;
|
security &= 0xf;
|
||||||
if (!security) return(0); /* rights for all */
|
if (!security) return(0); /* rights for all */
|
||||||
else if (security == 1) {
|
else if (security == 1) {
|
||||||
if (act_c->object_id > 0) return(0); /* rights for all logged */
|
if (act_c->object_id > 0) return(0); /* rights for all logged */
|
||||||
@ -155,10 +160,39 @@ int b_acc(uint32 obj_id, int security, int forwrite)
|
|||||||
|| act_c->object_id == 1 ) return(0); /* rights for the user */
|
|| act_c->object_id == 1 ) return(0); /* rights for the user */
|
||||||
} else if (security == 3 && act_c->object_id == 1) return(0);
|
} else if (security == 3 && act_c->object_id == 1) return(0);
|
||||||
|
|
||||||
XDPRINTF((1, 0, "b_acc no rights for 0x%x to %s property",
|
switch (forwrite&0xf) {
|
||||||
act_c->object_id, forwrite ? "read" : "write" ));
|
case 0 : acc_what = "read"; break;
|
||||||
|
case 1 : acc_what = "write"; break;
|
||||||
|
case 2 : acc_what = "creat"; break;
|
||||||
|
case 3 : acc_what = "delete"; break;
|
||||||
|
case 4 : acc_what = "rename"; break;
|
||||||
|
case 5 : acc_what = "change security"; break;
|
||||||
|
default : acc_what = "?" ; break;
|
||||||
|
}
|
||||||
|
|
||||||
return(forwrite ? -0xf8 : -0xfb);
|
switch ( (forwrite >> 4) & 0xf) {
|
||||||
|
case 0 : acc_typ = "obj" ; break;
|
||||||
|
case 1 : acc_typ = "prop"; break;
|
||||||
|
default : acc_typ = "?"; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (forwrite) {
|
||||||
|
case 0x00 : errcode = -0xf2; break;
|
||||||
|
case 0x01 : errcode = -0xf8; break; /* should be changed */
|
||||||
|
case 0x02 : errcode = -0xf5; break;
|
||||||
|
case 0x03 : errcode = -0xf4; break;
|
||||||
|
case 0x04 : errcode = -0xf3; break;
|
||||||
|
|
||||||
|
case 0x10 : errcode = -0xf9; break;
|
||||||
|
case 0x11 : errcode = -0xf8; break;
|
||||||
|
case 0x12 : errcode = -0xf7; break;
|
||||||
|
case 0x13 : errcode = -0xf6; break;
|
||||||
|
|
||||||
|
default : errcode = -0xff; break;
|
||||||
|
}
|
||||||
|
XDPRINTF((1, 0, "b_acc no rights for 0x%x to %s %s",
|
||||||
|
act_c->object_id, acc_what, acc_typ));
|
||||||
|
return(errcode);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sent_down_message(void)
|
static void sent_down_message(void)
|
||||||
@ -421,10 +455,11 @@ static void handle_fxx(int gelen, int func)
|
|||||||
XDPRINTF((1, 0, "Supervisor tried unencrypted LOGIN"));
|
XDPRINTF((1, 0, "Supervisor tried unencrypted LOGIN"));
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
|
{
|
||||||
internal_act = 1;
|
internal_act = 1;
|
||||||
result=nw_test_unenpasswd(obj.id, password);
|
result=nw_test_unenpasswd(obj.id, password);
|
||||||
internal_act = 0;
|
internal_act = 0;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
XDPRINTF((1, 0, "unencryted logins are not enabled"));
|
XDPRINTF((1, 0, "unencryted logins are not enabled"));
|
||||||
result=-0xff;
|
result=-0xff;
|
||||||
@ -438,7 +473,7 @@ static void handle_fxx(int gelen, int func)
|
|||||||
result = get_home_dir(responsedata + 2*sizeof(int)+1, obj.id);
|
result = get_home_dir(responsedata + 2*sizeof(int)+1, obj.id);
|
||||||
*(responsedata+ 2 * sizeof(int)) = (uint8) result;
|
*(responsedata+ 2 * sizeof(int)) = (uint8) result;
|
||||||
data_len = 2 * sizeof(int) + 1 + (int) *(responsedata+2* sizeof(int));
|
data_len = 2 * sizeof(int) + 1 + (int) *(responsedata+2* sizeof(int));
|
||||||
write_utmp(1, act_connection, act_c->pid_nwconn, &from_addr, pw_name);
|
write_utmp(1, act_connection, act_c->pid_nwconn, &(act_c->client_adr), pw_name);
|
||||||
} else completition = (uint8) -result;
|
} else completition = (uint8) -result;
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
@ -540,7 +575,7 @@ static void handle_fxx(int gelen, int func)
|
|||||||
*(responsedata+ 2 * sizeof(int)) = (uint8) result;
|
*(responsedata+ 2 * sizeof(int)) = (uint8) result;
|
||||||
data_len = 2 * sizeof(int) + 1 + (int) *(responsedata+2* sizeof(int));
|
data_len = 2 * sizeof(int) + 1 + (int) *(responsedata+2* sizeof(int));
|
||||||
write_utmp(1, act_connection, act_c->pid_nwconn,
|
write_utmp(1, act_connection, act_c->pid_nwconn,
|
||||||
&from_addr, pw_name);
|
&(act_c->client_adr), pw_name);
|
||||||
} else {
|
} else {
|
||||||
#if 0
|
#if 0
|
||||||
/* this is not ok */
|
/* this is not ok */
|
||||||
@ -551,7 +586,7 @@ static void handle_fxx(int gelen, int func)
|
|||||||
#endif
|
#endif
|
||||||
completition = (uint8) -result;
|
completition = (uint8) -result;
|
||||||
}
|
}
|
||||||
/* completition = 0xde menas login time has expired */
|
/* completition = 0xde means login time has expired */
|
||||||
/* completition = 0xdf means good login, but */
|
/* completition = 0xdf means good login, but */
|
||||||
/* login time has expired */
|
/* login time has expired */
|
||||||
/* perhaps I will integrate it later */
|
/* perhaps I will integrate it later */
|
||||||
@ -932,31 +967,23 @@ static void handle_fxx(int gelen, int func)
|
|||||||
struct XDATA {
|
struct XDATA {
|
||||||
uint8 acces_level;
|
uint8 acces_level;
|
||||||
uint8 object_id[4];
|
uint8 object_id[4];
|
||||||
} *xdata = (struct XDATA*) responsedata;
|
|
||||||
#else
|
|
||||||
uint8 *xdata = responsedata;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
NETOBJ obj;
|
|
||||||
obj.id = act_c->object_id;
|
|
||||||
if (0 != obj.id) {
|
|
||||||
int result = nw_get_obj(&obj);
|
|
||||||
if (!result) {
|
|
||||||
*xdata = obj.security;
|
|
||||||
U32_TO_BE32(obj.id, (xdata+1));
|
|
||||||
XDPRINTF((2,0, "ACCESS LEVEL:=0x%x, obj=0x%lx",
|
|
||||||
(int) obj.security, obj.id));
|
|
||||||
data_len = 5;
|
|
||||||
} else completition = (uint8)-result;
|
|
||||||
} else {
|
|
||||||
*xdata = 0;
|
|
||||||
memset(xdata+1, 0xff, 4);
|
|
||||||
data_len = 5;
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
uint8 *xdata = responsedata;
|
||||||
|
if (!act_c->object_id) {
|
||||||
|
*xdata = (uint8) 0;
|
||||||
|
memset(xdata+1, 0xff, 4);
|
||||||
|
} else {
|
||||||
|
*xdata = (act_c->object_id == 1) ? (uint8) 0x33
|
||||||
|
: (uint8) 0x22;
|
||||||
|
U32_TO_BE32(act_c->object_id, (xdata+1));
|
||||||
|
}
|
||||||
|
data_len = 5;
|
||||||
|
XDPRINTF((2,0, "ACCESS LEVEL:=0x%x, obj=0x%lx",
|
||||||
|
(int) *xdata, act_c->object_id));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
case 0x47 : { /* SCAN BINDERY OBJECT TRUSTEE PATH */
|
case 0x47 : { /* SCAN BINDERY OBJECT TRUSTEE PATH */
|
||||||
/* TODO !!! */
|
/* TODO !!! */
|
||||||
completition = (uint8)0xff;
|
completition = (uint8)0xff;
|
||||||
@ -979,10 +1006,8 @@ static void handle_fxx(int gelen, int func)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x49 : { /* IS CALLING STATION A MANAGER */
|
case 0x49 : { /* IS CALLING STATION A MANAGER */
|
||||||
NETOBJ obj;
|
completition = (act_c->object_id == 1) ? 0 : 0xff;
|
||||||
obj.id = GET_BE32(rdata);
|
/* here only SU = Manager */
|
||||||
/* TODO !! */
|
|
||||||
completition = 0; /* here allways Manager */
|
|
||||||
/* not manager, then completition = 0xff */
|
/* not manager, then completition = 0xff */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1216,7 +1241,7 @@ static void handle_fxx(int gelen, int func)
|
|||||||
default : completition = 0xfb; /* not known here */
|
default : completition = 0xfb; /* not known here */
|
||||||
} /* switch */
|
} /* switch */
|
||||||
} else if (func == 0x19) { /* logout */
|
} else if (func == 0x19) { /* logout */
|
||||||
write_utmp(0, act_connection, act_c->pid_nwconn, &from_addr, NULL);
|
write_utmp(0, act_connection, act_c->pid_nwconn, &(act_c->client_adr), NULL);
|
||||||
act_c->object_id = 0; /* not LOGIN */
|
act_c->object_id = 0; /* not LOGIN */
|
||||||
} else completition = 0xfb;
|
} else completition = 0xfb;
|
||||||
|
|
||||||
|
8
nwconn.c
8
nwconn.c
@ -1279,6 +1279,14 @@ static int handle_ncp_serv(void)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
#if WITH_NAME_SPACE_CALLS
|
#if WITH_NAME_SPACE_CALLS
|
||||||
|
case 0x56 : /* some extended atrribute calls */
|
||||||
|
{
|
||||||
|
int result = handle_func_0x56(requestdata, responsedata, ncprequest->task);
|
||||||
|
if (result > -1) data_len = result;
|
||||||
|
else completition=(uint8)-result;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case 0x57 : /* some new namespace calls */
|
case 0x57 : /* some new namespace calls */
|
||||||
{
|
{
|
||||||
int result = handle_func_0x57(requestdata, responsedata, ncprequest->task);
|
int result = handle_func_0x57(requestdata, responsedata, ncprequest->task);
|
||||||
|
68
nwdbm.c
68
nwdbm.c
@ -1,4 +1,4 @@
|
|||||||
/* nwdbm.c 30-Apr-96 data base for mars_nwe */
|
/* nwdbm.c 13-May-96 data base for mars_nwe */
|
||||||
/* (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
|
||||||
@ -42,7 +42,7 @@
|
|||||||
#define DBM_REMAINS_OPEN 1
|
#define DBM_REMAINS_OPEN 1
|
||||||
|
|
||||||
int tells_server_version=0;
|
int tells_server_version=0;
|
||||||
int password_scheme=0;
|
int password_scheme=PW_SCHEME_CHANGE_PW;
|
||||||
|
|
||||||
static datum key;
|
static datum key;
|
||||||
static datum data;
|
static datum data;
|
||||||
@ -62,7 +62,7 @@ static int x_dbminit(char *s)
|
|||||||
{
|
{
|
||||||
char buff[256];
|
char buff[256];
|
||||||
sprintf(buff, "%s/%s", PATHNAME_BINDERY, s);
|
sprintf(buff, "%s/%s", PATHNAME_BINDERY, s);
|
||||||
my_dbm = dbm_open(buff, O_RDWR|O_CREAT, 0666);
|
my_dbm = dbm_open(buff, O_RDWR|O_CREAT, 0600);
|
||||||
return( (my_dbm == NULL) ? -1 : 0);
|
return( (my_dbm == NULL) ? -1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -191,8 +191,10 @@ static int loc_delete_property(uint32 obj_id, uint8 *prop_name, uint8 prop_id)
|
|||||||
p = (NETPROP*)data.dptr;
|
p = (NETPROP*)data.dptr;
|
||||||
if (p != NULL && name_match(p->name, prop_name)){
|
if (p != NULL && name_match(p->name, prop_name)){
|
||||||
XDPRINTF((2,0, "found prop: %s, id=%d for deleting", p->name, (int)p->id));
|
XDPRINTF((2,0, "found prop: %s, id=%d for deleting", p->name, (int)p->id));
|
||||||
|
if (!b_acc(obj_id, p->security, 0x13)) {
|
||||||
if ((int)(p->id) > result) result = (int)(p->id);
|
if ((int)(p->id) > result) result = (int)(p->id);
|
||||||
xset[p->id]++;
|
xset[p->id]++;
|
||||||
|
} else if (result < 0) result = -0xf6; /* no delete priv. */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} /* for */
|
} /* for */
|
||||||
@ -246,9 +248,10 @@ static int loc_delete_property(uint32 obj_id, uint8 *prop_name, uint8 prop_id)
|
|||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int loc_delete_obj(uint32 objid)
|
static int loc_delete_obj(uint32 objid, int security)
|
||||||
{
|
{
|
||||||
int result=0;
|
int result = b_acc(objid, 0x33, 0x03); /* only supervisor or intern */
|
||||||
|
if (result) return(result); /* no object delete priv */
|
||||||
(void)loc_delete_property(objid, (uint8*)"*", 0);
|
(void)loc_delete_property(objid, (uint8*)"*", 0);
|
||||||
if (!dbminit(FNOBJ)){
|
if (!dbminit(FNOBJ)){
|
||||||
key.dptr = (char*)&objid;
|
key.dptr = (char*)&objid;
|
||||||
@ -263,7 +266,7 @@ int nw_delete_obj(NETOBJ *obj)
|
|||||||
{
|
{
|
||||||
int result = find_obj_id(obj, 0);
|
int result = find_obj_id(obj, 0);
|
||||||
XDPRINTF((2,0, "nw_delete_obj obj_id=%d, obj_name=%s", obj->id, obj->name));
|
XDPRINTF((2,0, "nw_delete_obj obj_id=%d, obj_name=%s", obj->id, obj->name));
|
||||||
if (!result) result=loc_delete_obj(obj->id);
|
if (!result) result=loc_delete_obj(obj->id, obj->security);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -272,7 +275,9 @@ int nw_rename_obj(NETOBJ *o, uint8 *newname)
|
|||||||
{
|
{
|
||||||
int result = find_obj_id(o, 0);
|
int result = find_obj_id(o, 0);
|
||||||
if (!result) {
|
if (!result) {
|
||||||
result = -0xff;
|
result = b_acc(0, 0x33, 0x04); /* only supervisor */
|
||||||
|
if (result) return(result); /* no obj rename priv */
|
||||||
|
else result=-0xff;
|
||||||
if (!dbminit(FNOBJ)){
|
if (!dbminit(FNOBJ)){
|
||||||
key.dsize = NETOBJ_KEY_SIZE;
|
key.dsize = NETOBJ_KEY_SIZE;
|
||||||
key.dptr = (char*)o;
|
key.dptr = (char*)o;
|
||||||
@ -285,6 +290,7 @@ int nw_rename_obj(NETOBJ *o, uint8 *newname)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
dbmclose();
|
dbmclose();
|
||||||
|
|
||||||
}
|
}
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
@ -294,7 +300,9 @@ int nw_change_obj_security(NETOBJ *o, int newsecurity)
|
|||||||
{
|
{
|
||||||
int result = find_obj_id(o, 0);
|
int result = find_obj_id(o, 0);
|
||||||
if (!result) {
|
if (!result) {
|
||||||
result = -0xff;
|
result = b_acc(o->id, o->security, 0x05);
|
||||||
|
if (result) return(result);
|
||||||
|
else result=-0xff;
|
||||||
if (!dbminit(FNOBJ)){
|
if (!dbminit(FNOBJ)){
|
||||||
key.dsize = NETOBJ_KEY_SIZE;
|
key.dsize = NETOBJ_KEY_SIZE;
|
||||||
key.dptr = (char*)o;
|
key.dptr = (char*)o;
|
||||||
@ -321,9 +329,9 @@ int nw_get_obj(NETOBJ *o)
|
|||||||
data = fetch(key);
|
data = fetch(key);
|
||||||
if (data.dptr != NULL){
|
if (data.dptr != NULL){
|
||||||
NETOBJ *obj=(NETOBJ*)data.dptr;
|
NETOBJ *obj=(NETOBJ*)data.dptr;
|
||||||
|
result = b_acc(o->id, obj->security, 0x0);
|
||||||
XDPRINTF((2,0, "got OBJ name=%s, id = 0x%x", obj->name, (int)obj->id));
|
XDPRINTF((2,0, "got OBJ name=%s, id = 0x%x", obj->name, (int)obj->id));
|
||||||
memcpy(o, data.dptr, sizeof(NETOBJ));
|
if (!result) memcpy(o, data.dptr, sizeof(NETOBJ));
|
||||||
result = 0;
|
|
||||||
}
|
}
|
||||||
} else result = -0xff;
|
} else result = -0xff;
|
||||||
dbmclose();
|
dbmclose();
|
||||||
@ -375,7 +383,7 @@ static int loc_change_prop_security(NETPROP *p, uint32 obj_id)
|
|||||||
if (data.dptr != NULL && name_match(prop->name, p->name) ) {
|
if (data.dptr != NULL && name_match(prop->name, p->name) ) {
|
||||||
uint8 security = p->security;
|
uint8 security = p->security;
|
||||||
XDPRINTF((2,0, "found PROP %s, id=0x%x", prop->name, (int) prop->id));
|
XDPRINTF((2,0, "found PROP %s, id=0x%x", prop->name, (int) prop->id));
|
||||||
result = b_acc(obj_id, prop->security, 1);
|
result = b_acc(obj_id, prop->security, 0x15);
|
||||||
if (!result) {
|
if (!result) {
|
||||||
memcpy(p, prop, sizeof(NETPROP));
|
memcpy(p, prop, sizeof(NETPROP));
|
||||||
p->security = security;
|
p->security = security;
|
||||||
@ -534,7 +542,7 @@ L1:
|
|||||||
static int ins_prop_val(uint32 obj_id, NETPROP *prop, int segment,
|
static int ins_prop_val(uint32 obj_id, NETPROP *prop, int segment,
|
||||||
uint8 *property_value, int erase_segments)
|
uint8 *property_value, int erase_segments)
|
||||||
{
|
{
|
||||||
int result = b_acc(obj_id, prop->security, 1);
|
int result = b_acc(obj_id, prop->security, 0x11);
|
||||||
if (result) return(result);
|
if (result) return(result);
|
||||||
if (!dbminit(FNVAL)){
|
if (!dbminit(FNVAL)){
|
||||||
NETVAL val;
|
NETVAL val;
|
||||||
@ -814,8 +822,9 @@ int nw_create_obj(NETOBJ *obj, uint32 wanted_id)
|
|||||||
* wanted_id should be taken as obj_id.
|
* wanted_id should be taken as obj_id.
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
int result = 0; /* OK */
|
int result = b_acc(0, 0x33, 0x02);
|
||||||
XDPRINTF((2,0, "creat OBJ=%s,type=0x%x", obj->name, (int)obj->type));
|
XDPRINTF((2,0, "creat OBJ=%s,type=0x%x", obj->name, (int)obj->type));
|
||||||
|
if (result) return(result); /* no object creat rights */
|
||||||
if (!dbminit(FNOBJ)){
|
if (!dbminit(FNOBJ)){
|
||||||
for (key = firstkey(); key.dptr != NULL; key = nextkey(key)) {
|
for (key = firstkey(); key.dptr != NULL; key = nextkey(key)) {
|
||||||
data = fetch(key);
|
data = fetch(key);
|
||||||
@ -863,10 +872,10 @@ int nw_obj_has_prop(NETOBJ *obj)
|
|||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int nw_create_obj_prop(NETOBJ *obj, NETPROP *prop)
|
||||||
int nw_create_obj_prop(NETOBJ *obj, NETPROP *prop)
|
|
||||||
{
|
{
|
||||||
int result=0;
|
int result = b_acc(obj->id, obj->security, 0x12);
|
||||||
|
if (result) return(result);
|
||||||
if (!dbminit(FNPROP)){
|
if (!dbminit(FNPROP)){
|
||||||
uint8 founds[256];
|
uint8 founds[256];
|
||||||
memset((char*)founds, 0, sizeof(founds) );
|
memset((char*)founds, 0, sizeof(founds) );
|
||||||
@ -957,6 +966,7 @@ uint32 nw_new_obj_prop(uint32 wanted_id,
|
|||||||
nw_new_obj(&wanted_id, objname, objtype,
|
nw_new_obj(&wanted_id, objname, objtype,
|
||||||
objflags, objsecurity);
|
objflags, objsecurity);
|
||||||
obj.id = wanted_id;
|
obj.id = wanted_id;
|
||||||
|
obj.security = objsecurity;
|
||||||
if (propname && *propname) {
|
if (propname && *propname) {
|
||||||
strmaxcpy(prop.name, propname, sizeof(prop.name));
|
strmaxcpy(prop.name, propname, sizeof(prop.name));
|
||||||
prop.flags = (uint8)propflags;
|
prop.flags = (uint8)propflags;
|
||||||
@ -1064,13 +1074,13 @@ int nw_test_passwd(uint32 obj_id, uint8 *vgl_key, uint8 *akt_key)
|
|||||||
nw_encrypt(keybuff, buf, keybuff);
|
nw_encrypt(keybuff, buf, keybuff);
|
||||||
return (memcmp(akt_key, keybuff, sizeof(keybuff)) ? -0xff : 0);
|
return (memcmp(akt_key, keybuff, sizeof(keybuff)) ? -0xff : 0);
|
||||||
} else {
|
} else {
|
||||||
|
if (obj_id == 1) return(-0xff);
|
||||||
if (password_scheme & PW_SCHEME_LOGIN) {
|
if (password_scheme & PW_SCHEME_LOGIN) {
|
||||||
if (!(password_scheme & PW_SCHEME_ALLOW_EMPTY_PW)) {
|
if (!(password_scheme & PW_SCHEME_ALLOW_EMPTY_PW)) {
|
||||||
MYPASSWD *pw = nw_getpwnam(obj_id);
|
MYPASSWD *pw = nw_getpwnam(obj_id);
|
||||||
if (pw && *(pw->pw_passwd) && !crypt_pw_ok(NULL, pw->pw_passwd))
|
if (pw && *(pw->pw_passwd) && !crypt_pw_ok(NULL, pw->pw_passwd))
|
||||||
return(-0xff);
|
return(-0xff);
|
||||||
}
|
}
|
||||||
if (obj_id == 1) return(-0xff);
|
|
||||||
}
|
}
|
||||||
return(0); /* no password */
|
return(0); /* no password */
|
||||||
}
|
}
|
||||||
@ -1180,14 +1190,16 @@ static void create_nw_db(char *fn, int allways)
|
|||||||
struct stat stbuff;
|
struct stat stbuff;
|
||||||
sprintf(fname, "%s/%s.dir", PATHNAME_BINDERY, fn);
|
sprintf(fname, "%s/%s.dir", PATHNAME_BINDERY, fn);
|
||||||
if (allways || stat(fname, &stbuff)){
|
if (allways || stat(fname, &stbuff)){
|
||||||
int fd = open(fname, O_CREAT | O_TRUNC | O_RDWR, 0666);
|
int fd = open(fname, O_CREAT | O_TRUNC | O_RDWR, 0600);
|
||||||
if (fd > -1) close(fd);
|
if (fd > -1) close(fd);
|
||||||
}
|
}
|
||||||
|
chmod(fname, 0600);
|
||||||
sprintf(fname, "%s/%s.pag", PATHNAME_BINDERY, fn);
|
sprintf(fname, "%s/%s.pag", PATHNAME_BINDERY, fn);
|
||||||
if (allways || stat(fname, &stbuff)){
|
if (allways || stat(fname, &stbuff)){
|
||||||
int fd = open(fname, O_CREAT | O_TRUNC | O_RDWR, 0666);
|
int fd = open(fname, O_CREAT | O_TRUNC | O_RDWR, 0600);
|
||||||
if (fd > -1) close(fd);
|
if (fd > -1) close(fd);
|
||||||
}
|
}
|
||||||
|
chmod(fname, 0600);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_pr_queue(uint32 q_id,
|
static void add_pr_queue(uint32 q_id,
|
||||||
@ -1246,7 +1258,7 @@ static void add_user(uint32 u_id, uint32 g_id,
|
|||||||
char *password, int dont_ch)
|
char *password, int dont_ch)
|
||||||
{
|
{
|
||||||
/* Typ Flags Security */
|
/* Typ Flags Security */
|
||||||
if (nw_new_obj(&u_id, name, 0x1 , 0x0, 0x33)
|
if (nw_new_obj(&u_id, name, 0x1 , 0x0, (u_id == 1) ? 0x33 : 0x31)
|
||||||
&& dont_ch) return;
|
&& dont_ch) return;
|
||||||
XDPRINTF((1, 0, "Add/Change User='%s', UnixUser='%s'",
|
XDPRINTF((1, 0, "Add/Change User='%s', UnixUser='%s'",
|
||||||
name, unname));
|
name, unname));
|
||||||
@ -1346,7 +1358,7 @@ int nw_fill_standard(char *servername, ipxAddr_t *adr)
|
|||||||
FILE *f = open_nw_ini();
|
FILE *f = open_nw_ini();
|
||||||
int auto_ins_user = 0;
|
int auto_ins_user = 0;
|
||||||
char auto_ins_passwd[100];
|
char auto_ins_passwd[100];
|
||||||
int make_tests = 0;
|
int make_tests = 1;
|
||||||
char sysentry[256];
|
char sysentry[256];
|
||||||
sysentry[0] = '\0';
|
sysentry[0] = '\0';
|
||||||
ge_id = nw_new_obj_prop(ge_id, "EVERYONE", 0x2, 0x0, 0x31,
|
ge_id = nw_new_obj_prop(ge_id, "EVERYONE", 0x2, 0x0, 0x31,
|
||||||
@ -1444,11 +1456,17 @@ int nw_fill_standard(char *servername, ipxAddr_t *adr)
|
|||||||
struct passwd *pw;
|
struct passwd *pw;
|
||||||
upstr(auto_ins_passwd);
|
upstr(auto_ins_passwd);
|
||||||
while (NULL != (pw=getpwent())) {
|
while (NULL != (pw=getpwent())) {
|
||||||
|
if ( (pw->pw_passwd[0] != '*' && pw->pw_passwd[0] != 'x')
|
||||||
|
|| pw->pw_passwd[1] != '\0') {
|
||||||
char nname[100];
|
char nname[100];
|
||||||
xstrcpy(nname, pw->pw_name);
|
xstrcpy(nname, pw->pw_name);
|
||||||
upstr(nname);
|
upstr(nname);
|
||||||
add_user(0L, ge_id, nname, pw->pw_name, auto_ins_passwd,
|
add_user(0L, ge_id, nname, pw->pw_name, auto_ins_passwd,
|
||||||
(auto_ins_user == 99) ? 0 : 99);
|
(auto_ins_user == 99) ? 0 : 99);
|
||||||
|
} else {
|
||||||
|
XDPRINTF((1,0, "Unix User:'%s' not added because passwd='%s'",
|
||||||
|
pw->pw_name, pw->pw_passwd));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
endpwent();
|
endpwent();
|
||||||
}
|
}
|
||||||
@ -1527,12 +1545,18 @@ int nw_init_dbm(char *servername, ipxAddr_t *adr)
|
|||||||
/* dynamic or without name */
|
/* dynamic or without name */
|
||||||
objs[anz++] = obj->id;
|
objs[anz++] = obj->id;
|
||||||
if (anz == 10000) break;
|
if (anz == 10000) break;
|
||||||
|
} else if (obj->type == 1 && obj->id != 1 && obj->security != 0x31) {
|
||||||
|
/* this is for correcting wrong obj security */
|
||||||
|
obj->security=0x31;
|
||||||
|
(void)store(key, data);
|
||||||
|
XDPRINTF((1,0, "Correcting access obj_id=0x%lx(%s)",
|
||||||
|
obj->id, obj->name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dbmclose();
|
dbmclose();
|
||||||
while (anz--) loc_delete_obj(objs[anz]); /* Now delete */
|
while (anz--) loc_delete_obj(objs[anz], 0x44); /* Now delete */
|
||||||
anz = 0;
|
anz = 0;
|
||||||
if (!dbminit(FNPROP)){
|
if (!dbminit(FNPROP)){
|
||||||
for (key = firstkey(); key.dptr != NULL; key = nextkey(key)) {
|
for (key = firstkey(); key.dptr != NULL; key = nextkey(key)) {
|
||||||
|
2
nwdbm.h
2
nwdbm.h
@ -162,8 +162,6 @@ extern int nw_create_obj(NETOBJ *obj, uint32 wanted_id);
|
|||||||
extern int nw_obj_has_prop(NETOBJ *obj);
|
extern int nw_obj_has_prop(NETOBJ *obj);
|
||||||
|
|
||||||
|
|
||||||
extern int nw_create_obj_prop(NETOBJ *obj, NETPROP *prop);
|
|
||||||
|
|
||||||
extern int nw_create_prop(int object_type,
|
extern int nw_create_prop(int object_type,
|
||||||
uint8 *object_name, int object_namlen,
|
uint8 *object_name, int object_namlen,
|
||||||
uint8 *prop_name, int prop_namlen,
|
uint8 *prop_name, int prop_namlen,
|
||||||
|
21
nwfile.c
21
nwfile.c
@ -1,4 +1,4 @@
|
|||||||
/* nwfile.c 01-May-96 */
|
/* nwfile.c 11-May-96 */
|
||||||
/* (C)opyright (C) 1993,1996 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
|
||||||
@ -69,7 +69,8 @@ static int free_file_handle(int fhandle)
|
|||||||
if (fh->f) ext_pclose(fh->f);
|
if (fh->f) ext_pclose(fh->f);
|
||||||
fh->f = NULL;
|
fh->f = NULL;
|
||||||
} else close(fh->fd);
|
} else close(fh->fd);
|
||||||
if (fh->tmodi > 0L && !(fh->flags & 2)) {
|
if (fh->tmodi > 0L && !(fh->flags & 2)
|
||||||
|
&& !(fh->flags & FILE_IS_READONLY)) {
|
||||||
/* now set date and time */
|
/* now set date and time */
|
||||||
struct utimbuf ut;
|
struct utimbuf ut;
|
||||||
ut.actime = ut.modtime = fh->tmodi;
|
ut.actime = ut.modtime = fh->tmodi;
|
||||||
@ -112,11 +113,14 @@ int file_creat_open(int volume, uint8 *unixname, struct stat *stbuff,
|
|||||||
if (fhandle > 0){
|
if (fhandle > 0){
|
||||||
FILE_HANDLE *fh=&(file_handles[fhandle-1]);
|
FILE_HANDLE *fh=&(file_handles[fhandle-1]);
|
||||||
int completition = -0xff; /* no File Found */
|
int completition = -0xff; /* no File Found */
|
||||||
if (get_volume_options(volume, 1) & VOL_OPTION_IS_PIPE) {
|
int dowrite = (access & 2) || creatmode ;
|
||||||
|
int voloptions = get_volume_options(volume, 1);
|
||||||
|
if (dowrite && (voloptions & VOL_OPTION_READONLY)) {
|
||||||
|
completition = (creatmode) ? -0x84 : -0x94;
|
||||||
|
} else if (voloptions & VOL_OPTION_IS_PIPE) {
|
||||||
/* this is a PIPE Volume */
|
/* this is a PIPE Volume */
|
||||||
int statr = stat(fh->fname, stbuff);
|
int statr = stat(fh->fname, stbuff);
|
||||||
if (!statr && (stbuff->st_mode & S_IFMT) != S_IFDIR) {
|
if (!statr && (stbuff->st_mode & S_IFMT) != S_IFDIR) {
|
||||||
int dowrite= (access & 2) || creatmode ;
|
|
||||||
char pipecommand[300];
|
char pipecommand[300];
|
||||||
char *topipe = "READ";
|
char *topipe = "READ";
|
||||||
if (creatmode) topipe = "CREAT";
|
if (creatmode) topipe = "CREAT";
|
||||||
@ -165,7 +169,7 @@ int file_creat_open(int volume, uint8 *unixname, struct stat *stbuff,
|
|||||||
fh->offd = 0L;
|
fh->offd = 0L;
|
||||||
if (fh->fd > -1) {
|
if (fh->fd > -1) {
|
||||||
if (statr) stat(fh->fname, stbuff);
|
if (statr) stat(fh->fname, stbuff);
|
||||||
} else completition = -0x9a;
|
} else completition = dowrite ? -0x94 : -0x93;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fh->fd > -1) {
|
if (fh->fd > -1) {
|
||||||
@ -184,8 +188,10 @@ int nw_set_fdate_time(uint32 fhandle, uint8 *datum, uint8 *zeit)
|
|||||||
if (fhandle > 0 && (--fhandle < anz_fhandles) ) {
|
if (fhandle > 0 && (--fhandle < anz_fhandles) ) {
|
||||||
FILE_HANDLE *fh=&(file_handles[fhandle]);
|
FILE_HANDLE *fh=&(file_handles[fhandle]);
|
||||||
if (fh->fd > -1) {
|
if (fh->fd > -1) {
|
||||||
|
if (!(fh->flags & FILE_IS_READONLY)) {
|
||||||
fh->tmodi = nw_2_un_time(datum, zeit);
|
fh->tmodi = nw_2_un_time(datum, zeit);
|
||||||
return(0);
|
return(0);
|
||||||
|
} else return(-0x8c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return(-0x88); /* wrong filehandle */
|
return(-0x88); /* wrong filehandle */
|
||||||
@ -208,7 +214,8 @@ int nw_close_datei(int fhandle, int reset_reuse)
|
|||||||
fh->f = NULL;
|
fh->f = NULL;
|
||||||
} else result=close(fh->fd);
|
} else result=close(fh->fd);
|
||||||
fh->fd = -1;
|
fh->fd = -1;
|
||||||
if (fh->tmodi > 0L && !(fh->flags&2)) {
|
if (fh->tmodi > 0L && !(fh->flags&2)
|
||||||
|
&& !(fh->flags & FILE_IS_READONLY)) {
|
||||||
struct utimbuf ut;
|
struct utimbuf ut;
|
||||||
ut.actime = ut.modtime = fh->tmodi;
|
ut.actime = ut.modtime = fh->tmodi;
|
||||||
utime(fh->fname, &ut);
|
utime(fh->fname, &ut);
|
||||||
@ -289,6 +296,7 @@ int nw_write_datei(int fhandle, uint8 *data, int size, uint32 offset)
|
|||||||
if (fhandle > 0 && (--fhandle < anz_fhandles)) {
|
if (fhandle > 0 && (--fhandle < anz_fhandles)) {
|
||||||
FILE_HANDLE *fh=&(file_handles[fhandle]);
|
FILE_HANDLE *fh=&(file_handles[fhandle]);
|
||||||
if (fh->fd > -1) {
|
if (fh->fd > -1) {
|
||||||
|
if (fh->flags & FILE_IS_READONLY) return(-0x94);
|
||||||
if (fh->flags & 2) { /* PIPE */
|
if (fh->flags & 2) { /* PIPE */
|
||||||
if (size)
|
if (size)
|
||||||
return(fwrite(data, 1, size, fh->f->fildes[0]));
|
return(fwrite(data, 1, size, fh->f->fildes[0]));
|
||||||
@ -336,6 +344,7 @@ int nw_server_copy(int qfhandle, uint32 qoffset,
|
|||||||
if (fhq->fd > -1 && fhz->fd > -1) {
|
if (fhq->fd > -1 && fhz->fd > -1) {
|
||||||
char buff[2048];
|
char buff[2048];
|
||||||
int wsize;
|
int wsize;
|
||||||
|
if (fhz->flags & FILE_IS_READONLY) return(-0x94);
|
||||||
if (lseek(fhq->fd, qoffset, SEEK_SET) > -1L &&
|
if (lseek(fhq->fd, qoffset, SEEK_SET) > -1L &&
|
||||||
lseek(fhz->fd, zoffset, SEEK_SET) > -1L) {
|
lseek(fhz->fd, zoffset, SEEK_SET) > -1L) {
|
||||||
retsize = 0;
|
retsize = 0;
|
||||||
|
4
nwfile.h
4
nwfile.h
@ -1,4 +1,4 @@
|
|||||||
/* nwfile.h 23-Jan-96 */
|
/* nwfile.h 11-May-96 */
|
||||||
#ifndef _NWFILE_H_
|
#ifndef _NWFILE_H_
|
||||||
#define _NWFILE_H_
|
#define _NWFILE_H_
|
||||||
#include "nwqueue.h"
|
#include "nwqueue.h"
|
||||||
@ -10,8 +10,10 @@ typedef struct {
|
|||||||
FILE_PIPE *f; /* for PIPE */
|
FILE_PIPE *f; /* for PIPE */
|
||||||
int flags; /* 2 = PIPE */
|
int flags; /* 2 = PIPE */
|
||||||
/* 4 = don't reuse after close */
|
/* 4 = don't reuse after close */
|
||||||
|
/* 0x20 = readonly */
|
||||||
char fname[256]; /* UNIX filename */
|
char fname[256]; /* UNIX filename */
|
||||||
} FILE_HANDLE;
|
} FILE_HANDLE;
|
||||||
|
#define FILE_IS_READONLY 0x20
|
||||||
|
|
||||||
extern void init_file_module(void);
|
extern void init_file_module(void);
|
||||||
|
|
||||||
|
139
nwroute.c
139
nwroute.c
@ -1,4 +1,4 @@
|
|||||||
/* nwroute.c 24-Apr-96 */
|
/* nwroute.c 12-May-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
|
||||||
@ -55,7 +55,7 @@ static void insert_delete_net(uint32 destnet,
|
|||||||
NW_NET_DEVICE *nd_dev = NULL;
|
NW_NET_DEVICE *nd_dev = NULL;
|
||||||
int ndticks = 99;
|
int ndticks = 99;
|
||||||
|
|
||||||
XDPRINTF((3,0,"%s net:0x%X, over 0x%X, 0x%02x:%02x:%02x:%02x:%02x:%02x",
|
XDPRINTF((3,0,"Beg: %s net:0x%X, over 0x%X, 0x%02x:%02x:%02x:%02x:%02x:%02x",
|
||||||
(do_delete) ? "DEL" : "INS", destnet, rnet,
|
(do_delete) ? "DEL" : "INS", destnet, rnet,
|
||||||
(int)rnode[0], (int)rnode[1], (int)rnode[2],
|
(int)rnode[0], (int)rnode[1], (int)rnode[2],
|
||||||
(int)rnode[3], (int)rnode[4], (int)rnode[5]));
|
(int)rnode[3], (int)rnode[4], (int)rnode[5]));
|
||||||
@ -388,7 +388,7 @@ void handle_rip(int fd, int ipx_pack_typ,
|
|||||||
int data_len, IPX_DATA *ipxdata,
|
int data_len, IPX_DATA *ipxdata,
|
||||||
ipxAddr_t *from_addr)
|
ipxAddr_t *from_addr)
|
||||||
|
|
||||||
/* All received rip packeta reach this function */
|
/* All received rip packets reach this function */
|
||||||
/* It can be a RIP Request or a RIP Respons */
|
/* It can be a RIP Request or a RIP Respons */
|
||||||
{
|
{
|
||||||
int operation = GET_BE16(ipxdata->rip.operation);
|
int operation = GET_BE16(ipxdata->rip.operation);
|
||||||
@ -429,46 +429,84 @@ void handle_rip(int fd, int ipx_pack_typ,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* <========================= SAP ============================> */
|
/* <========================= SAP ============================> */
|
||||||
void send_server_response(int respond_typ,
|
static void send_sap_to_addr(int entry, int hops, int ticks,
|
||||||
int styp, ipxAddr_t *to_addr)
|
int respond_typ, 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) {
|
if (entry > -1) {
|
||||||
|
IPX_DATA ipx_data;
|
||||||
NW_SERVERS *nw=nw_servers[entry];
|
NW_SERVERS *nw=nw_servers[entry];
|
||||||
|
memset(&ipx_data, 0, sizeof(ipx_data.sip));
|
||||||
strcpy((char*)ipx_data.sip.server_name, nw->name);
|
strcpy((char*)ipx_data.sip.server_name, nw->name);
|
||||||
memcpy(&ipx_data.sip.server_adr, &nw->addr, sizeof(ipxAddr_t));
|
memcpy(&ipx_data.sip.server_adr, &nw->addr, sizeof(ipxAddr_t));
|
||||||
hops++;
|
XDPRINTF((4, 0, "%s SERVER=%s, typ=0x%x, ticks=%d, hops=%d",
|
||||||
XDPRINTF((4, 0, "NEAREST SERVER=%s, typ=0x%x, ticks=%d, hops=%d",
|
(respond_typ==4) ? "NEAREST" : "GENERAL", nw->name,
|
||||||
nw->name, styp, tics, hops));
|
nw->typ, ticks, hops));
|
||||||
U16_TO_BE16(respond_typ, ipx_data.sip.response_type);
|
U16_TO_BE16(respond_typ, ipx_data.sip.response_type);
|
||||||
U16_TO_BE16(styp, ipx_data.sip.server_type);
|
U16_TO_BE16(nw->typ, ipx_data.sip.server_type);
|
||||||
U16_TO_BE16(hops, ipx_data.sip.intermediate_networks);
|
U16_TO_BE16(hops, ipx_data.sip.intermediate_networks);
|
||||||
send_ipx_data(sockfd[SAP_SLOT],
|
send_ipx_data(sockfd[SAP_SLOT],
|
||||||
4, /* this is the official packet typ for SAP's */
|
4, /* this is the official packet typ for SAP's */
|
||||||
sizeof(ipx_data.sip),
|
sizeof(ipx_data.sip),
|
||||||
(char *)&(ipx_data.sip),
|
(char *)&(ipx_data.sip),
|
||||||
to_addr, "Nearest Server Response");
|
to_addr, "Sap Server Response");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void send_server_response(int respond_typ,
|
||||||
|
int styp, ipxAddr_t *to_addr)
|
||||||
|
/* respond_typ 2 = general, 4 = nearest service respond */
|
||||||
|
{
|
||||||
|
int j=-1;
|
||||||
|
int ticks=99;
|
||||||
|
int hops=15;
|
||||||
|
int entry = -1;
|
||||||
|
int to_internal = (!no_internal)
|
||||||
|
&& (GET_BE32(to_addr->net) == internal_net)
|
||||||
|
&& (GET_BE16(to_addr->sock) != SOCK_SAP);
|
||||||
|
while (++j < anz_servers) {
|
||||||
|
NW_SERVERS *nw=nw_servers[j];
|
||||||
|
if (nw->typ == styp && nw->name && *(nw->name)) {
|
||||||
|
int xticks=999;
|
||||||
|
if (nw->net != internal_net) {
|
||||||
|
NW_NET_DEVICE *nd=find_netdevice(nw->net);
|
||||||
|
if (nd) xticks = nd->ticks;
|
||||||
|
if (to_internal)
|
||||||
|
send_sap_to_addr(j, nw->hops+1, xticks, respond_typ, to_addr);
|
||||||
|
} else xticks = 0;
|
||||||
|
if (xticks < ticks || (xticks == ticks && nw->hops <= hops)) {
|
||||||
|
ticks = xticks;
|
||||||
|
hops = nw->hops;
|
||||||
|
entry = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!to_internal)
|
||||||
|
send_sap_to_addr(entry, hops+1, ticks, respond_typ, to_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void send_sip_to_net(uint32 nd_net, int nd_ticks, int mode)
|
||||||
|
{
|
||||||
|
ipxAddr_t wild;
|
||||||
|
int j=-1;
|
||||||
|
memset(&wild, 0, sizeof(ipxAddr_t));
|
||||||
|
U32_TO_BE32(nd_net, wild.net);
|
||||||
|
memset(wild.node, 0xFF, IPX_NODE_SIZE);
|
||||||
|
U16_TO_BE16(SOCK_SAP, wild.sock);
|
||||||
|
while (++j < anz_servers) {
|
||||||
|
NW_SERVERS *nw=nw_servers[j];
|
||||||
|
if ( !nw->typ /* server has no typ */
|
||||||
|
|| ( nw->net == nd_net && nw->hops) /* server has same net but */
|
||||||
|
/* hops */
|
||||||
|
|| ( mode == 2 && nw->hops) ) { /* no SAP to this NET */
|
||||||
|
XDPRINTF((3, 0, "No SAP mode=%d, to net=0x%lx for server '%s'",
|
||||||
|
mode, nd_net, nw->name));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
send_sap_to_addr(j, (mode == 2) ? 16 : nw->hops+1,
|
||||||
|
nd_ticks,
|
||||||
|
2, /* General */
|
||||||
|
&wild);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -482,42 +520,7 @@ static void send_sap_broadcast(int mode)
|
|||||||
NW_NET_DEVICE *nd=net_devices[k];
|
NW_NET_DEVICE *nd=net_devices[k];
|
||||||
if (nd->is_up && (nd->ticks < 7 || mode)) {
|
if (nd->is_up && (nd->ticks < 7 || mode)) {
|
||||||
/* isdn devices should not get SAP broadcasts everytime */
|
/* isdn devices should not get SAP broadcasts everytime */
|
||||||
IPX_DATA ipx_data;
|
send_sip_to_net(nd->net, nd->ticks, mode);
|
||||||
ipxAddr_t wild;
|
|
||||||
int j=-1;
|
|
||||||
memset(&wild, 0, sizeof(ipxAddr_t));
|
|
||||||
U32_TO_BE32(nd->net, wild.net);
|
|
||||||
memset(wild.node, 0xFF, IPX_NODE_SIZE);
|
|
||||||
U16_TO_BE16(SOCK_SAP, wild.sock);
|
|
||||||
while (++j < anz_servers) {
|
|
||||||
NW_SERVERS *nw=nw_servers[j];
|
|
||||||
if ( !nw->typ /* server has no typ */
|
|
||||||
|| ( nw->net == nd->net && nw->hops) /* server has same net but */
|
|
||||||
/* hops */
|
|
||||||
|| ( mode == 2 && nw->hops) ) { /* no SAP to this NET */
|
|
||||||
XDPRINTF((3, 0, "No SAP mode=%d, to net=0x%lx for server '%s'",
|
|
||||||
mode, nd->net, nw->name));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
memset(&ipx_data, 0, sizeof(ipx_data.sip));
|
|
||||||
strcpy(ipx_data.sip.server_name, nw->name);
|
|
||||||
memcpy(&ipx_data.sip.server_adr, &(nw->addr), sizeof(ipxAddr_t));
|
|
||||||
U16_TO_BE16(2, ipx_data.sip.response_type); /* General */
|
|
||||||
U16_TO_BE16(nw->typ, ipx_data.sip.server_type); /* Fileserver */
|
|
||||||
if (mode == 2) {
|
|
||||||
U16_TO_BE16(16, ipx_data.sip.intermediate_networks);
|
|
||||||
} else {
|
|
||||||
U16_TO_BE16(nw->hops+1, ipx_data.sip.intermediate_networks);
|
|
||||||
/* I hope hops are ok here */
|
|
||||||
XDPRINTF((3, 0, "SEND SIP %s,0x%04x, hops=%d",
|
|
||||||
nw->name, nw->typ, nw->hops+1));
|
|
||||||
}
|
|
||||||
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");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
51
nwserv.c
51
nwserv.c
@ -21,6 +21,10 @@
|
|||||||
#include "net.h"
|
#include "net.h"
|
||||||
#include "nwserv.h"
|
#include "nwserv.h"
|
||||||
|
|
||||||
|
#ifdef LINUX
|
||||||
|
# include <netdb.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
uint32 internal_net = 0x0L; /* NETWORKNUMMER INTERN (SERVER) */
|
uint32 internal_net = 0x0L; /* NETWORKNUMMER INTERN (SERVER) */
|
||||||
int no_internal = 0; /* no use of internal net */
|
int no_internal = 0; /* no use of internal net */
|
||||||
int auto_creat_interfaces=0;
|
int auto_creat_interfaces=0;
|
||||||
@ -837,18 +841,37 @@ static void get_ini(int full)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#if INTERNAL_RIP_SAP
|
||||||
case 3 :
|
case 3 :
|
||||||
if (full) {
|
if (full) {
|
||||||
|
upstr(inhalt);
|
||||||
|
if (!strcmp(inhalt, "AUTO")) internal_net = 0;
|
||||||
|
else {
|
||||||
if (sscanf(inhalt, "%ld%c", &internal_net, &dummy) != 1)
|
if (sscanf(inhalt, "%ld%c", &internal_net, &dummy) != 1)
|
||||||
sscanf(inhalt, "%lx", &internal_net);
|
sscanf(inhalt, "%lx", &internal_net);
|
||||||
|
}
|
||||||
if (anz > 1) {
|
if (anz > 1) {
|
||||||
if (sscanf(inhalt2, "%ld%c", &node, &dummy) != 1)
|
if (sscanf(inhalt2, "%ld%c", &node, &dummy) != 1)
|
||||||
sscanf(inhalt2, "%lx", &node);
|
sscanf(inhalt2, "%lx", &node);
|
||||||
}
|
}
|
||||||
|
if (0 == internal_net) { /* now we try ip number */
|
||||||
|
char locname[50];
|
||||||
|
struct hostent *hent;
|
||||||
|
gethostname(locname, 48);
|
||||||
|
hent=gethostbyname(locname);
|
||||||
|
if (NULL != hent && hent->h_length == 4) {
|
||||||
|
internal_net = GET_BE32(*(hent->h_addr_list));
|
||||||
|
} else {
|
||||||
|
XDPRINTF((0, 0, "Cannot gethostbyname from '%s'",
|
||||||
|
locname));
|
||||||
|
if (hent) {
|
||||||
|
XDPRINTF((0, 0, "hent->h_length=%d", hent->h_length));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
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 &&
|
||||||
@ -978,11 +1001,12 @@ static void get_ini(int full)
|
|||||||
}
|
}
|
||||||
# endif
|
# 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);
|
||||||
|
|
||||||
#if LINUX && INTERNAL_RIP_SAP
|
#if INTERNAL_RIP_SAP
|
||||||
if (no_internal) {
|
if (no_internal) {
|
||||||
errorp(10, "WARNING:No use of internal net", NULL);
|
errorp(10, "WARNING:No use of internal net", NULL);
|
||||||
} else if (!anz_net_devices) {
|
} else if (!anz_net_devices) {
|
||||||
@ -1111,6 +1135,21 @@ static void set_sigs(void)
|
|||||||
|
|
||||||
static int server_is_down=0;
|
static int server_is_down=0;
|
||||||
|
|
||||||
|
static int usage(char *prog)
|
||||||
|
{
|
||||||
|
#if !IN_NWROUTED
|
||||||
|
fprintf(stderr, "usage:\t%s [-h|-k|y]\n", prog);
|
||||||
|
#else
|
||||||
|
fprintf(stderr, "usage:\t%s [-h]|-k]\n", prog);
|
||||||
|
#endif
|
||||||
|
fprintf(stderr, "\t-h: send HUP to main process\n");
|
||||||
|
fprintf(stderr, "\t-k: stop main process\n");
|
||||||
|
#if !IN_NWROUTED
|
||||||
|
fprintf(stderr, "\t y: start testclient code.\n");
|
||||||
|
#endif
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int j = 0;
|
int j = 0;
|
||||||
@ -1123,12 +1162,16 @@ int main(int argc, char **argv)
|
|||||||
switch (*a) {
|
switch (*a) {
|
||||||
case 'h' : init_mode = 1; break;
|
case 'h' : init_mode = 1; break;
|
||||||
case 'k' : init_mode = 2; break;
|
case 'k' : init_mode = 2; break;
|
||||||
default : break;
|
default : return(usage(argv[0]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (*a == 'y') client_mode=1;
|
} else if (*a == 'y')
|
||||||
|
client_mode=1;
|
||||||
/* in client mode the testprog 'nwclient' will be startet. */
|
/* in client mode the testprog 'nwclient' will be startet. */
|
||||||
|
else
|
||||||
|
return(usage(argv[0]));
|
||||||
}
|
}
|
||||||
|
setgroups(0, NULL);
|
||||||
init_tools(IN_PROG, init_mode);
|
init_tools(IN_PROG, init_mode);
|
||||||
get_ini(1);
|
get_ini(1);
|
||||||
j=-1;
|
j=-1;
|
||||||
|
18
nwvolume.c
18
nwvolume.c
@ -1,4 +1,4 @@
|
|||||||
/* nwvolume.c 22-Apr-96 */
|
/* nwvolume.c 11-May-96 */
|
||||||
/* (C)opyright (C) 1993,1996 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
|
||||||
@ -94,6 +94,10 @@ void nw_init_volumes(FILE *f)
|
|||||||
|= VOL_OPTION_IS_PIPE;
|
|= VOL_OPTION_IS_PIPE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'r' : vol->options
|
||||||
|
|= VOL_OPTION_READONLY;
|
||||||
|
break;
|
||||||
|
|
||||||
default : break;
|
default : break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -273,7 +277,17 @@ 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((char*)volname));
|
int volnr = nw_get_volume_number(volname, strlen((char*)volname));
|
||||||
return((volnr>-1 && !get_fs_usage((char*)nw_volumes[volnr].unixname, fsu)) ? 0 : -1);
|
if (volnr > -1) {
|
||||||
|
NW_VOL *v=&(nw_volumes[volnr]);
|
||||||
|
if (0 == (volnr=get_fs_usage((char*)v->unixname, fsu))) {
|
||||||
|
if (v->options & VOL_OPTION_READONLY) {
|
||||||
|
fsu->fsu_bfree = 0;
|
||||||
|
fsu->fsu_bavail = 0;
|
||||||
|
fsu->fsu_ffree = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(volnr);
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_volume_options(int volnr, int mode)
|
int get_volume_options(int volnr, int mode)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* nwvolume.h 29-Mar-96 */
|
/* nwvolume.h 11-May-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
|
||||||
@ -39,7 +39,7 @@ typedef struct {
|
|||||||
int max_maps_count; /* may be less than MAX_DEV_NAMESPACE_MAPS */
|
int max_maps_count; /* may be less than MAX_DEV_NAMESPACE_MAPS */
|
||||||
int maps_count; /* count of dev_namespace_maps */
|
int maps_count; /* count of dev_namespace_maps */
|
||||||
uint32 high_inode; /* hight inode to can handle correct */
|
uint32 high_inode; /* hight inode to can handle correct */
|
||||||
int options; /* *_1_* all is lowercase */
|
int options; /* see defines below */
|
||||||
} NW_VOL;
|
} NW_VOL;
|
||||||
|
|
||||||
#define VOL_OPTION_DOWNSHIFT 0x01 /* All downshift */
|
#define VOL_OPTION_DOWNSHIFT 0x01 /* All downshift */
|
||||||
@ -47,6 +47,7 @@ typedef struct {
|
|||||||
#define VOL_OPTION_REMOUNT 0x04 /* Volume can be remounted (cdroms) */
|
#define VOL_OPTION_REMOUNT 0x04 /* Volume can be remounted (cdroms) */
|
||||||
#define VOL_OPTION_IS_HOME 0x08 /* Volume is USERS HOME */
|
#define VOL_OPTION_IS_HOME 0x08 /* Volume is USERS HOME */
|
||||||
#define VOL_OPTION_ONE_DEV 0x10 /* Volume has only one filesys */
|
#define VOL_OPTION_ONE_DEV 0x10 /* Volume has only one filesys */
|
||||||
|
#define VOL_OPTION_READONLY 0x20 /* Volume is readonly */
|
||||||
|
|
||||||
/* 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. */
|
||||||
|
33
tools.c
33
tools.c
@ -1,4 +1,4 @@
|
|||||||
/* tools.c 06-May-96 */
|
/* tools.c 13-May-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
|
||||||
@ -266,7 +266,7 @@ static char *get_pidfilefn(char *buf)
|
|||||||
{
|
{
|
||||||
char lbuf[100];
|
char lbuf[100];
|
||||||
strcpy(lbuf, get_modstr());
|
strcpy(lbuf, get_modstr());
|
||||||
return(get_div_pathes(buf, downstr((uint8*)lbuf), 2, ".pid"));
|
return(get_div_pathes(buf, (char*)downstr((uint8*)lbuf), 2, ".pid"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void creat_pidfile(void)
|
void creat_pidfile(void)
|
||||||
@ -293,30 +293,33 @@ void init_tools(int module, int options)
|
|||||||
in_module = module;
|
in_module = module;
|
||||||
connection = (NWCONN == module) ? options : 0;
|
connection = (NWCONN == module) ? options : 0;
|
||||||
if (NWSERV == module || NWROUTED == module) {
|
if (NWSERV == module || NWROUTED == module) {
|
||||||
char *pidfn=get_pidfilefn(buf);
|
int kill_pid=-1;
|
||||||
|
char *pidfn=get_pidfilefn((char*)buf);
|
||||||
if (fn_exist(pidfn)) {
|
if (fn_exist(pidfn)) {
|
||||||
|
FILE *pf=fopen(pidfn, "r");
|
||||||
|
if ( NULL != pf) {
|
||||||
|
if (1 != fscanf(pf, "%d", &kill_pid) || kill_pid < 1
|
||||||
|
|| kill(kill_pid, 0) < 0)
|
||||||
|
kill_pid=-1;
|
||||||
|
fclose(pf);
|
||||||
|
}
|
||||||
|
if (kill_pid < 0) unlink((char*)buf);
|
||||||
|
}
|
||||||
|
if (kill_pid > -1) {
|
||||||
int sig;
|
int sig;
|
||||||
FILE *pf;
|
|
||||||
if (options == 1) { /* kill -HUP prog */
|
if (options == 1) { /* kill -HUP prog */
|
||||||
sig = SIGHUP;
|
sig = SIGHUP;
|
||||||
} else if (options == 2) { /* kill prog */
|
} else if (options == 2) { /* kill prog */
|
||||||
sig = SIGTERM;
|
sig = SIGTERM;
|
||||||
} else {
|
} else {
|
||||||
errorp(11, "INIT", "Program allways running or pidfn=%s exists" ,
|
errorp(11, "INIT", "Program pid=%d already running and pidfn=%s exists" ,
|
||||||
pidfn);
|
kill_pid, pidfn);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if ( NULL != (pf=fopen(pidfn, "r"))) {
|
if (kill_pid > 1) kill(kill_pid, sig);
|
||||||
int kill_pid=0;
|
|
||||||
if (1 == fscanf(pf, "%d", &kill_pid) && kill_pid > 1)
|
|
||||||
kill(kill_pid, sig);
|
|
||||||
fclose(pf);
|
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
|
||||||
exit(1);
|
|
||||||
} else if (options == 1 || options == 2) {
|
} else if (options == 1 || options == 2) {
|
||||||
errorp(11, "INIT", "Program not running or pidfn=%s not exists" ,
|
errorp(11, "INIT", "Program not running yet" );
|
||||||
pidfn);
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user