mars_nwe-0.96.pl04

This commit is contained in:
Mario Fetka 2011-11-13 00:38:55 +01:00
parent 475b65b9b9
commit c374994026
22 changed files with 683 additions and 607 deletions

10
CHANGES
View File

@ -44,5 +44,11 @@ Erste 'oeffentliche' Version
- Noch einen Wildcard Fehler korrigiert. (James MacLean)
- Debug Routine und Levels veraendert.
- Packet Groesse > 546 Byte erlaubt.
- MAX_NW_ROUTES ist nun in config.h.
- nwroute.c build_rip_buff if condition richtig geklammert.
- Code mittels cc -Wall etwas gesaeubert.
- RIP Broadcast's werden nun ueber einen temporaeren socket
geschrieben.
- direkte Responses von ncpserv werden nun ueber einen
temporaeren socket und nicht mehr ueber den NCP-Socket
geschrieben.

108
connect.c
View File

@ -19,7 +19,6 @@
#include "net.h"
#include <dirent.h>
#include <utime.h>
#include <sys/errno.h>
@ -27,50 +26,14 @@ extern int errno;
/* #define TEST_FNAME "PRINT.000"
*/
#ifdef TEST_FNAME
static int test_handle=-1;
#endif
static int default_uid=-1;
static int default_gid=-1;
typedef struct {
int fd; /* von System bei Open bzw. Create */
long offd; /* aktueller File Offset */
time_t tmodi; /* modification TIME */
char name[256]; /* UNIX Dateiname */
} FILE_HANDLE;
typedef struct {
DIR *f;
char unixname[256]; /* kompletter unixname */
ino_t inode; /* Unix Inode */
time_t timestamp; /* f<>r letzte Allocierung */
char *kpath; /* Ein Zeichen nach unixname */
uint8 vol_options; /* Suchoptions */
uint8 volume; /* Volume Number */
} DIR_HANDLE;
typedef struct {
uint8 *sysname; /* VOL_NAME */
uint8 *unixname; /* UNIX-Verzeichnis */
uint8 options; /* *_1_* alles in Kleinbuchstaben */
} NW_VOL;
typedef struct {
uint8 path[256]; /* directory */
uint8 fn[256]; /* file */
int volume; /* Volume Number */
int has_wild; /* fn has wildcards */
} NW_PATH;
typedef struct {
ino_t inode; /* Unix Inode dieses Verzeichnisses */
time_t timestamp; /* Zeitmarke */
uint8 *path; /* path ab Volume */
uint8 volume; /* Welches Volume */
uint8 is_temp; /* 0:perm. 1:temp 2: spez. temp */
uint8 drive; /* driveletter */
uint8 task; /* actual task */
} NW_DIR;
#include "connect.h"
#define MAX_NW_DIRS 255
static NW_DIR dirs[MAX_NW_DIRS];
@ -260,7 +223,7 @@ void set_guid(int gid, int uid)
} else XDPRINTF((5,0,"SET GID=%d, UID=%d OK", gid, uid));
}
static char *get_nwpath_name(NW_PATH *p)
char *conn_get_nwpath_name(NW_PATH *p)
/* for debugging */
{
static char nwpathname[300];
@ -568,7 +531,7 @@ static int get_dh_entry(DIR_HANDLE *dh,
return(okflag);
}
static void build_path_fn( uint8 *vol,
void conn_build_path_fn( uint8 *vol,
uint8 *path,
uint8 *fn,
int *has_wild,
@ -627,7 +590,7 @@ static int build_path( NW_PATH *path,
*/
{
uint8 vol[20];
build_path_fn(vol, path->path,
conn_build_path_fn(vol, path->path,
(only_dir) ? (uint8)NULL
: path->fn,
&(path->has_wild),
@ -646,7 +609,6 @@ static int build_path( NW_PATH *path,
}
if (path->volume < 0) return(-0x98);
}
return(0);
}
@ -668,7 +630,7 @@ static int nw_path_ok(NW_PATH *nwpath)
if (!stat(build_unix_name(nwpath, 1 | 2 ), &stbuff)
&& (stbuff.st_mode & S_IFMT) == S_IFDIR) result=stbuff.st_ino;
else {
XDPRINTF((4,0, "NW_PATH_OK failed:`%s`", get_nwpath_name(nwpath)));
XDPRINTF((4,0, "NW_PATH_OK failed:`%s`", conn_get_nwpath_name(nwpath)));
}
return(result);
}
@ -759,7 +721,7 @@ static int build_verz_name(NW_PATH *nwpath, /* gets complete path */
return(completition);
}
static int get_kpl_path(NW_PATH *nwpath, int dirhandle,
int conn_get_kpl_path(NW_PATH *nwpath, int dirhandle,
uint8 *data, int len, int only_dir)
/*
* if ok then the inode of dir will be returned
@ -819,7 +781,7 @@ static uint16 un_time_2_nw(time_t time, uint8 *d)
static int get_file_attrib(NW_FILE_INFO *f, struct stat *stb,
NW_PATH *nwpath)
{
XDPRINTF((5,0, "get_file_attrib of %s", get_nwpath_name(nwpath) ));
XDPRINTF((5,0, "get_file_attrib of %s", conn_get_nwpath_name(nwpath) ));
strncpy(f->name, nwpath->fn, sizeof(f->name));
/* Attribute */
/* 0x20 Archive Flag */
@ -842,7 +804,7 @@ static int get_file_attrib(NW_FILE_INFO *f, struct stat *stb,
static int get_dir_attrib(NW_DIR_INFO *d, struct stat *stb,
NW_PATH *nwpath)
{
XDPRINTF((5,0, "get_dir_attrib of %s", get_nwpath_name(nwpath)));
XDPRINTF((5,0, "get_dir_attrib of %s", conn_get_nwpath_name(nwpath)));
strncpy(d->name, nwpath->fn, sizeof(d->name));
d->attrib = 0x10; /* Verzeichnis */
@ -872,7 +834,7 @@ int nw_creat_open_file(int dir_handle, uint8 *data, int len,
if (fhandle){
FILE_HANDLE *fh=&(file_handles[fhandle-1]);
NW_PATH nwpath;
int completition = get_kpl_path(&nwpath, dir_handle, data, len, 0);
int completition = conn_get_kpl_path(&nwpath, dir_handle, data, len, 0);
#ifdef TEST_FNAME
int got_testfn = 0;
@ -961,7 +923,7 @@ static int do_delete_file(NW_PATH *nwpath, FUNC_SEARCH *fs)
int nw_delete_datei(int dir_handle, uint8 *data, int len)
{
NW_PATH nwpath;
int completition = get_kpl_path(&nwpath, dir_handle, data, len, 0);
int completition = conn_get_kpl_path(&nwpath, dir_handle, data, len, 0);
if (completition > -1) {
completition = func_search_entry(&nwpath, 0x6, do_delete_file, NULL);
if (completition < 0) return(completition);
@ -1145,7 +1107,7 @@ int nw_lock_datei(int fhandle, int offset, int size, int do_lock)
int nw_mk_rd_dir(int dir_handle, uint8 *data, int len, int mode)
{
NW_PATH nwpath;
int completition = get_kpl_path(&nwpath, dir_handle, data, len, !mode);
int completition = conn_get_kpl_path(&nwpath, dir_handle, data, len, !mode);
if (completition > -1) {
char unname[256];
@ -1184,9 +1146,9 @@ int mv_file(int qdirhandle, uint8 *q, int qlen,
{
NW_PATH quellpath;
NW_PATH zielpath;
int completition=get_kpl_path(&quellpath, qdirhandle, q, qlen, 0);
int completition=conn_get_kpl_path(&quellpath, qdirhandle, q, qlen, 0);
if (!completition > -1){
completition=get_kpl_path(&zielpath, zdirhandle, z, zlen, 0);
completition=conn_get_kpl_path(&zielpath, zdirhandle, z, zlen, 0);
if (completition > -1){
char unquelle[256];
char unziel[256];
@ -1390,7 +1352,7 @@ int nw_search(uint8 *info,
{
NW_PATH nwpath;
int completition = get_kpl_path(&nwpath, dirhandle, data, len, 0);
int completition = conn_get_kpl_path(&nwpath, dirhandle, data, len, 0);
XDPRINTF((5,0,"nw_search path:%s:, fn:%s:, completition:0x%x",
nwpath.path, nwpath.fn, completition));
if (completition > -1) {
@ -1457,11 +1419,11 @@ int nw_alloc_dir_handle( int dir_handle, /* Suche ab Pfad dirhandle */
int task) /* Prozess Task */
{
NW_PATH nwpath;
int inode=get_kpl_path(&nwpath, dir_handle, data, len, 1);
int inode=conn_get_kpl_path(&nwpath, dir_handle, data, len, 1);
if (inode > -1)
inode = insert_new_dir(&nwpath, inode, driveletter, is_temphandle, task);
XDPRINTF((5,0,"Allocate %shandle:%s, Handle=%d, drive=%d, result=0x%x",
(is_temphandle) ? "Temp" : "Perm", get_nwpath_name(&nwpath),
(is_temphandle) ? "Temp" : "Perm", conn_get_nwpath_name(&nwpath),
dir_handle, driveletter, inode));
return(inode);
}
@ -1481,10 +1443,10 @@ int nw_open_dir_handle( int dir_handle,
{
NW_PATH nwpath;
int completition = get_kpl_path(&nwpath, dir_handle, data, len, 1);
int completition = conn_get_kpl_path(&nwpath, dir_handle, data, len, 1);
if (completition > -1) {
XDPRINTF((5,0,"NW_OPEN_DIR: completition = 0x%x; nwpath= %s",
(int)completition, get_nwpath_name(&nwpath) ));
(int)completition, conn_get_nwpath_name(&nwpath) ));
completition = new_dir_handle((ino_t)completition, &nwpath);
if (completition > -1) {
@ -1520,11 +1482,11 @@ int nw_set_dir_handle(int targetdir, int dir_handle,
/* targetdirs gets path of dirhandle + data */
{
NW_PATH nwpath;
int inode = get_kpl_path(&nwpath, dir_handle, data, len, 1);
int inode = conn_get_kpl_path(&nwpath, dir_handle, data, len, 1);
if (inode > -1){
if (targetdir > 0 && --targetdir < used_dirs
&& dirs[targetdir].is_temp != 2) { /* not a spez. temphandle */
XDPRINTF((5,0,"Change dhandle:%d -> `%s`", targetdir+1, get_nwpath_name(&nwpath)));
XDPRINTF((5,0,"Change dhandle:%d -> `%s`", targetdir+1, conn_get_nwpath_name(&nwpath)));
return(change_dir_entry(&dirs[targetdir], nwpath.volume, nwpath.path, inode, -1, -1, 0, task));
/* here the existing handle is only modified */
} else return(-0x9b); /* BAD DIR Handle */
@ -1596,7 +1558,7 @@ int nw_get_eff_dir_rights(int dir_handle, uint8 *data, int len, int modus)
char unname[256];
struct stat stbuff;
NW_PATH nwpath;
int completition = get_kpl_path(&nwpath, dir_handle, data, len,
int completition = conn_get_kpl_path(&nwpath, dir_handle, data, len,
(modus) ? 0 : 1);
if (completition < 0) return(completition);
strcpy(unname, build_unix_name(&nwpath, 0));
@ -1709,6 +1671,17 @@ int nw_get_fs_usage(char *volname, struct fs_usage *fsu)
return((volnr>-1 && !get_fs_usage(vols[volnr].unixname, fsu)) ? 0 : -1);
}
int nw_get_vol_info(int volnr)
/* returns >= 0 if OK, else errocode < 0 */
{
int result = -0x98; /* Volume not exist */;
if (volnr < used_vols) {
result =0;
}
XDPRINTF((5,0,"NW_GET_VOL_INFO von VOLNR:%d, result=0x%x", volnr, result));
return(result);
}
typedef struct {
uint8 time[2];
uint8 date[2];
@ -1814,7 +1787,7 @@ int nw_scan_a_directory(uint8 *rdata,
uint32 searchbeg) /* 32 bit */
{
NW_PATH nwpath;
int completition = get_kpl_path(&nwpath, dirhandle, data, len, 0);
int completition = conn_get_kpl_path(&nwpath, dirhandle, data, len, 0);
XDPRINTF((5,0,"nw_scan_a_directory path:%s:, fn:%s:, completition:0x%x",
nwpath.path, nwpath.fn, completition));
if (completition > -1) {
@ -1846,7 +1819,7 @@ int nw_scan_a_root_dir(uint8 *rdata,
{
NW_PATH nwpath;
uint8 data[2];
int completition = get_kpl_path(&nwpath, dirhandle, data, 0, 1);
int completition = conn_get_kpl_path(&nwpath, dirhandle, data, 0, 1);
XDPRINTF((5,0,"nw_scan_a_directory_2 path:%s:, fn:%s:, completition:0x%x",
nwpath.path, nwpath.fn, completition));
if (completition > -1) {
@ -1860,6 +1833,12 @@ int nw_scan_a_root_dir(uint8 *rdata,
} else return(completition); /* wrong path */
}
/* <======================================================================> */
/* minimal queue handling to enable very simple printing */
/* qick and dirty !!!!!!!!!!!!!!! */
@ -1945,7 +1924,7 @@ static int create_queue_file(char *job_file_name,
int result;
NW_FILE_INFO fnfo;
*job_file_name
= sprintf(job_file_name+1, "%07X%d.%03d", q_id, jo_id, connection);
= sprintf(job_file_name+1, "%07lX%d.%03d", q_id, jo_id, connection);
result=nw_alloc_dir_handle(0, dirname, dir_nam_len, 99, 2, 1);
if (result > -1)
@ -1962,7 +1941,6 @@ static int create_queue_file(char *job_file_name,
int nw_creat_queue(int connection, uint8 *queue_id, uint8 *queue_job,
uint8 *dirname, int dir_nam_len, int old_call)
{
QUEUE_JOB job_buff;
INT_QUEUE_JOB *jo = give_new_queue_job(old_call);
uint32 q_id = GET_BE32(queue_id);
int result = -0xff;

71
connect.h Normal file
View File

@ -0,0 +1,71 @@
/* connect.h 08-Jan-96 */
typedef struct {
int fd; /* von System bei Open bzw. Create */
long offd; /* aktueller File Offset */
time_t tmodi; /* modification TIME */
char name[256]; /* UNIX Dateiname */
} FILE_HANDLE;
typedef struct {
DIR *f;
char unixname[256]; /* kompletter unixname */
ino_t inode; /* Unix Inode */
time_t timestamp; /* f<>r letzte Allocierung */
char *kpath; /* Ein Zeichen nach unixname */
uint8 vol_options; /* Suchoptions */
uint8 volume; /* Volume Number */
} DIR_HANDLE;
typedef struct {
uint8 *sysname; /* VOL_NAME */
uint8 *unixname; /* UNIX-Verzeichnis */
uint8 options; /* *_1_* alles in Kleinbuchstaben */
} NW_VOL;
typedef struct {
uint8 path[256]; /* directory */
uint8 fn[256]; /* file */
int volume; /* Volume Number */
int has_wild; /* fn has wildcards */
} NW_PATH;
typedef struct {
ino_t inode; /* Unix Inode dieses Verzeichnisses */
time_t timestamp; /* Zeitmarke */
uint8 *path; /* path ab Volume */
uint8 volume; /* Welches Volume */
uint8 is_temp; /* 0:perm. 1:temp 2: spez. temp */
uint8 drive; /* driveletter */
uint8 task; /* actual task */
} NW_DIR;
extern int conn_get_kpl_path(NW_PATH *nwpath, int dirhandle,
uint8 *data, int len, int only_dir) ;
extern char *conn_get_nwpath_name(NW_PATH *p);
extern void set_default_guid(void);
extern void set_guid(int gid, int uid);
extern int nw_scan_a_directory(uint8 *rdata,
int dirhandle,
uint8 *data,
int len,
int searchattrib,
uint32 searchbeg); /* 32 bit */
extern int nw_scan_a_root_dir(uint8 *rdata,
int dirhandle);
/* queues */
extern int nw_creat_queue(int connection, uint8 *queue_id, uint8 *queue_job,
uint8 *dirname, int dir_nam_len, int old_call);
extern int nw_close_file_queue(uint8 *queue_id,
uint8 *job_id,
uint8 *prc, int prc_len);

View File

@ -1,4 +1,4 @@
/* emutli.c 24-Dec-95 */
/* emutli.c 08-Jan-96 */
/*
* One short try to emulate TLI with SOCKETS.
*/
@ -307,7 +307,6 @@ void ipx_route_add(uint32 dest_net,
void ipx_route_del(uint32 net)
{
struct rtentry rd;
int result;
int sock;
/* Router */
struct sockaddr_ipx *sr = (struct sockaddr_ipx *)&rd.rt_gateway;
@ -315,7 +314,6 @@ void ipx_route_del(uint32 net)
struct sockaddr_ipx *st = (struct sockaddr_ipx *)&rd.rt_dst;
rd.rt_flags = RTF_GATEWAY;
st->sipx_network = htonl(net);
if ( (sock = socket(AF_IPX, SOCK_DGRAM, AF_IPX)) < 0){
errorp(0, "EMUTLI:ipx_route_del", NULL);
return;

View File

@ -1,12 +1,17 @@
/* config.h: 10-Dec-95 */
/* config.h: 03-Jan-96 */
/* some of this config is needed by make, others by cc */
#define FILENAME_NW_INI "/etc/nwserv.conf" /* full name of ini (conf) file */
#define PATHNAME_PROGS "/sbin" /* path location of progs */
#define PATHNAME_BINDERY "/etc" /* path location of bindery */
#define MAX_CONNECTIONS 5 /* max. Number of Connections */
/* must be < 256 !!! */
#define MAX_NW_VOLS 10 /* max. Volumes */
#define MAX_NET_DEVICES 1 /* max. Netdevices, frames */
#define IPX_DATA_GR_546 1 /* allow ipx packets > 546+30 Byte */
#define MAX_NW_ROUTES 50 /* max. networks (internal + external) */

View File

@ -1,4 +1,4 @@
# makefile.unx 25-Dec-95
# makefile.unx 09-Jan-96
VPATH=..
O=.o
C=.c
@ -6,7 +6,7 @@ C=.c
DEBUG=-DDB
V_H=0
V_L=96
P_L=2
P_L=4
#define D_P_L 1
DISTRIB=mars_nwe
#if D_P_L
@ -87,7 +87,6 @@ M_PATHNAME_PROGS="."
OBJ1= $(EMUTLIOBJ) net1$(O) tools$(O)
OBJ2= $(OBJ1) nwroute$(O)
#nwdbm$(O)
OBJ3= $(OBJ1) connect$(O) namspace$(O)
OBJ4= $(OBJ1) nwdbm$(O) nwcrypt$(O)
OBJ5= $(OBJ1)
@ -95,6 +94,8 @@ OBJ5= $(OBJ1)
OBJS= net1$(O) tools$(O) connect$(O) nwdbm$(O) \
$(PROG2)$(O) $(PROG3)$(O) $(PROG4)$(O) $(PROG5)$(O)
HOBJ3= $(PROG3)$(O) connect$(O) namspace$(O)
$(PROG1): $(PROG1)$(O) $(OBJ1)
$(CC) -o ../$(PROG1) $(PROG1)$(O) $(OBJ1) $(NSLLIB)
@ -112,6 +113,9 @@ $(PROG4): $(PROG4)$(O) $(OBJ4)
$(PROG5): $(PROG5)$(O) $(OBJ5)
$(CC) -o ../$(PROG5) $(PROG5)$(O) $(OBJ5) $(NSLLIB)
$(PROG3)$(O): namspace.h connect.h
connect$(O): namspace.h connect.h
namspace$(O): namspace.h connect.h
$(OBJS): net.h config.h
$(C)$(O):
@ -173,6 +177,8 @@ n_make_dir: n_clean1
$(DISTRIB).lsm \
$(DISTRIB)/. \
; rm -f $(DISTRIB)/config.h \
; rm -f $(DISTRIB)/namspace.? \
; cp old/namspace.? $(DISTRIB)/. \
; ln -f \
examples/$(STERN) \
$(DISTRIB)/examples/. \

View File

@ -1,7 +1,7 @@
Begin3
Title: mars_nwe
Version: 0.96
Entered-date: 20-Dec-95
Version: 0.96pl4
Entered-date: 09-Jan-96
Description: full novell-server-emulator (src),beta
file-services, bindery-services, printing-services
needs no kernelchanges, usefull for testing ipx
@ -9,8 +9,8 @@ Keywords: novell, netware, server, ipx, ncp, tli
Author: mstover@freeway.de (Martin Stover)
Maintained-by: mstover@freeway.de (Martin Stover)
Primary-site: linux01.gwdg.de /pub/ncpfs
90kB mars_nwe-0.96.tgz
100kB mars_nwe-0.96.pl4.tgz
Alternate-site: ftp.uni-duisburg.de /pub/linux/ipxware
Platforms: Linux (1.2.xx, 1.3.32 tested, others should work)
Platforms: Linux (1.2.xx, 1.3.32, 1.3.55 tested, others should work)
Copying-policy: GNU
End

View File

@ -1,4 +1,4 @@
/* namspace.c 26-Nov-95 : NameSpace Services, mars_nwe */
/* namspace.c 08-Jan-96 : NameSpace Services, mars_nwe */
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
*
@ -18,87 +18,10 @@
*/
#include "net.h"
#include <dirent.h>
#include <utime.h>
#include "connect.h"
#include "namspace.h"
typedef struct {
int x;
} DIR_BASE_ENTRY;
#define MAX_DIR_BASE 20
int nw_generate_dir_path(uint8 *nwpathstruct,
uint8 *ns_dir_base, uint8 *dos_dir_base)
/* returns Volume Number >=0 or errcode < 0 if error */
{
return(-0xfb); /* TODO: complete call */
}
int handle_func_0x57(uint8 *p, uint8 *responsedata)
{
int result = -0xfb; /* unknown request */
int ufunc = (int) *p++; /* now p locates at 4 byte boundary */
int namspace = (int) *p; /* for most calls */
switch (ufunc) {
case 0x02 : /* Initialize Search */
{
/* NW PATH STRUC */
}
break;
case 0x07 : /* Modify File or Dir Info */
{
}
break;
case 0x09 : /* Set short Dir Handle*/
{
}
break;
case 0x15 : /* Get Path String from short dir neu*/
{
}
break;
case 0x16 : /* Generate Dir BASE and VolNumber */
{
uint8 *nwpathstruct = p+3;
struct OUTPUT {
uint8 ns_dir_base[4]; /* BASEHANDLE */
uint8 dos_dir_base[4]; /* BASEHANDLE */
uint8 volume; /* Volumenumber*/
} *xdata= (struct OUTPUT*)responsedata;
result = nw_generate_dir_path(nwpathstruct,
xdata->ns_dir_base, xdata->dos_dir_base);
if (result >-1) {
xdata->volume = result;
result = sizeof(struct OUTPUT);
}
}
break;
case 0x0c : /* alloc short dir Handle */
{
}
break;
case 0x1a : /* Get Huge NS Info new*/
{
}
break;
case 0x1c : /* GetFullPathString new*/
{
}
break;
case 0x1d : /* GetEffDirRights new */
{
}
break;
default : result = -0xfb; /* unknown request */
} /* switch */
return(result);
}
#if WITH_NAME_SPACE_CALLS
#endif

20
namspace.h Normal file
View File

@ -0,0 +1,20 @@
/* namspace.h 08-Jan-96 : NameSpace Services, mars_nwe */
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#define WITH_NAME_SPACE_CALLS 0

View File

@ -1,5 +1,5 @@
/* ncpserv.c, 24-Dec-95 */
/* ncpserv.c */
#define REVISION_DATE "09-Jan-96"
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
*
* This program is free software; you can redistribute it and/or modify
@ -126,7 +126,6 @@ static int anz_connect=0; /* actual anz connections */
static int new_conn_nr(void)
{
int j = -1;
int not_logged=-1;
if (!anz_connect){ /* init all */
j = MAX_CONNECTIONS;
while (j--) {
@ -293,8 +292,9 @@ static int handle_fxx(CONNECTION *c, int gelen, int func)
NCPRESPONSE *ncpresponse = (NCPRESPONSE*)&ipxoutdata;
uint8 *responsedata = ((uint8*)&ipxoutdata)+sizeof(NCPRESPONSE);
uint8 *requestdata = ((uint8*)ncprequest)+sizeof(NCPREQUEST);
#if 0
uint8 len = *(requestdata+1);
#endif
uint8 ufunc = *(requestdata+2);
uint8 *rdata = requestdata+3;
uint8 completition = 0;
@ -478,7 +478,7 @@ static int handle_fxx(CONNECTION *c, int gelen, int func)
if (!result) {
c->object_id = obj.id; /* actuell Object ID */
c->t_login = akttime; /* u. login Time */
get_guid(rdata+2, rdata+2+sizeof(int), obj.id);
get_guid((int*) (rdata+2), (int*) (rdata+2+sizeof(int)), obj.id);
in_len=12 + 2*sizeof(int);
return(-1); /* nwconn must do the rest */
} else completition = (uint8) -result;
@ -540,7 +540,7 @@ static int handle_fxx(CONNECTION *c, int gelen, int func)
if (result > -1) {
c->object_id = obj.id; /* actuell Object */
c->t_login = akttime; /* and login time */
get_guid(rdata+2, rdata+2+sizeof(int), obj.id);
get_guid((int*)(rdata+2), (int*)(rdata+2+sizeof(int)), obj.id);
in_len=12 + 2*sizeof(int);
return(-1); /* nwconn must do the rest */
} else completition = (uint8) -result;
@ -948,7 +948,6 @@ static int handle_fxx(CONNECTION *c, int gelen, int func)
case 0x49 : { /* IS CALLING STATION A MANAGER */
NETOBJ obj;
int result;
obj.id = GET_BE32(rdata);
/* TODO !! */
completition = 0; /* here allways Manager */
@ -1063,7 +1062,7 @@ static int handle_fxx(CONNECTION *c, int gelen, int func)
case 0xc9 : { /* GET FILE SERVER DESCRIPTION STRINGs */
char *company = "Mars :-)";
char *revision = "Version %d.%d";
char *revision_date= "24-Dec-95";
char *revision_date = REVISION_DATE;
char *copyright = "(C)opyright Martin Stover";
int k=strlen(company)+1;
@ -1163,11 +1162,11 @@ static void ncp_response(int type, int sequence,
if (nw_debug){
char comment[80];
sprintf(comment, "NCP-RESP compl=0x%x ", completition);
send_ipx_data(ncp_fd, 17, sizeof(NCPRESPONSE) + data_len,
send_ipx_data(-1, 17, sizeof(NCPRESPONSE) + data_len,
(char *) ncpresponse,
&from_addr, comment);
} else
send_ipx_data(ncp_fd, 17, sizeof(NCPRESPONSE) + data_len,
send_ipx_data(-1, 17, sizeof(NCPRESPONSE) + data_len,
(char *) ncpresponse,
&from_addr, NULL);
}
@ -1362,6 +1361,7 @@ int main(int argc, char *argv[])
if (diff_time > 50) /* after max. 50 seconds */
nwserv_reset_wdog(connection);
/* tell the wdog there's no need to look */
if (ncprequest->sequence == c->sequence
&& !c->retry++) {
/* perhaps nwconn is busy */
@ -1409,7 +1409,10 @@ int main(int argc, char *argv[])
ncp_response(0x3333, ncprequest->sequence,
ncprequest->connection,
0, 0xff, 0x08, 0);
0,
0xff, /* completition */
0xff, /* conn status */
0);
} else if (type == 0x1111) {
/* GIVE CONNECTION Nr connection */

16
net.h
View File

@ -1,4 +1,4 @@
/* net.h 02-Jan-96 */
/* net.h 08-Jan-96 */
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
*
@ -34,6 +34,7 @@
#include "unistd.h"
#include <sys/stat.h>
#include <time.h>
#include <sys/wait.h>
#ifndef LINUX
# include "stropts.h"
@ -107,6 +108,10 @@
# define IPX_DATA_GR_546 1
#endif
#ifndef MAX_NW_ROUTES
# define MAX_NW_ROUTES 50
#endif
#if IPX_DATA_GR_546
# define IPX_MAX_DATA 1058
#else
@ -351,15 +356,6 @@ typedef struct {
} QUEUE_PRINT_AREA;
typedef struct {
uint8 volume;
uint8 base[4]; /* Base or Handle */
uint8 flag; /* 0=base, 1=handle, 0xff=not path nor handle */
uint8 components; /* nmbrs of pathes, components */
uint8 pathes[1]; /* form len+name */
} NW_HPATH;
extern int nw_init_connect(void);
extern int nw_free_handles(int task);

41
net1.c
View File

@ -1,4 +1,4 @@
/* net1.c, 24-Dec-95 */
/* net1.c, 09-Jan-96 */
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
*
@ -138,13 +138,14 @@ void ipx_addr_to_adr(char *s, ipxAddr_t *p)
}
int send_ipx_data(int fd, int pack_typ,
int send_ipx_data(int fdx, int pack_typ,
int data_len, char *data,
ipxAddr_t *to_addr, char *comment)
{
int fd=fdx;
int result=0;
struct t_unitdata ud;
uint8 ipx_pack_typ = (uint8) pack_typ;
ud.opt.len = sizeof(ipx_pack_typ);
ud.opt.maxlen = sizeof(ipx_pack_typ);
ud.opt.buf = (char*)&ipx_pack_typ;
@ -156,16 +157,32 @@ int send_ipx_data(int fd, int pack_typ,
ud.addr.buf = (char*)to_addr;
if (comment != NULL) XDPRINTF((2,0,"%s TO: ", comment));
if (nw_debug > 1) print_ipx_addr(to_addr);
if (t_sndudata(fd, &ud) < 0){
if (nw_debug > 1) t_error("t_sndudata !OK");
if (fd < 0) {
struct t_bind bind;
ipxAddr_t addr;
fd=t_open("/dev/ipx", O_RDWR, NULL);
if (fd < 0) {
t_error("t_open !Ok");
return(-1);
}
return(0);
memset(&addr,0, sizeof(ipxAddr_t));
bind.addr.len = sizeof(ipxAddr_t);
bind.addr.maxlen = sizeof(ipxAddr_t);
bind.addr.buf = (char*)&addr;
bind.qlen = 0; /* ever */
if (t_bind(fd, &bind, &bind) < 0){
t_error("t_bind in send_ipx_data");
t_close(fd);
return(-1);
}
}
if ((result=t_sndudata(fd, &ud)) < 0){
if (nw_debug > 1) t_error("t_sndudata !OK");
}
if (fdx < 0 && fd > -1) {
t_unbind(fd);
t_close(fd);
}
return(result);
}

View File

@ -1,4 +1,4 @@
/* nwconn.c 02-Jan-96 */
/* nwconn.c 09-Jan-96 */
/* one process / connection */
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
@ -19,6 +19,9 @@
*/
#include "net.h"
#include <dirent.h>
#include "connect.h"
#include "namspace.h"
static int father_pid = -1;
static ipxAddr_t from_addr;
@ -306,21 +309,25 @@ static void handle_ncp_serv()
} else if (*p == 0xa){ /* legt Verzeichnis an */
/******** Create Dir *********************/
int dir_handle = (int) *(p+1);
#if 0
int rightmask = (int) *(p+2);
#endif
int pathlen = (int) *(p+3);
uint8 *path = p+4;
int code = nw_mk_rd_dir(dir_handle, path, pathlen, 1);
if (code) completition = (uint8) -code;
} else if (*p == 0xb){ /* l”scht Verzeichnis */
} else if (*p == 0xb){ /* deletes dir */
/******** Delete DIR *********************/
int dir_handle = (int) *(p+1);
#if 0
int reserved = (int) *(p+2); /* Res. by NOVELL */
#endif
int pathlen = (int) *(p+3);
uint8 *path = p+4;
int code = nw_mk_rd_dir(dir_handle, path, pathlen, 0);
if (code) completition = (uint8) -code;
} else if (*p == 0xd){ /* Add Trustees to DIR */
/******** GetDirektoryPATH ***************/
/******** AddTrustesstoDir ***************/
struct INPUT {
uint8 header[7]; /* Requestheader */
uint8 div[3]; /* 0x0, dlen, typ */
@ -1195,11 +1202,13 @@ static void handle_ncp_serv()
}
break;
#if 0
#if WITH_NAME_SPACE_CALLS
case 0x57 : /* some new namespace calls */
{
int result = handle_func_0x57(requestdata, responsedata);
if (result > -1) data_len = result;
else completition=(uint8)-result;
}
break;
#endif
@ -1288,7 +1297,6 @@ static void set_sig(void)
int main(int argc, char **argv)
{
int completition = 0;
if (argc != 4) {
fprintf(stderr, "usage nwconn PID FROM_ADDR Connection\n");
exit(1);
@ -1299,6 +1307,7 @@ int main(int argc, char **argv)
init_tools(NWCONN);
XDPRINTF((1, 0, "FATHER PID=%d, ADDR=%s CON:%s", father_pid, *(argv+2), *(argv+3)));
adr_to_ipx_addr(&from_addr, *(argv+2));
if (nw_init_connect()) exit(1);

View File

@ -118,7 +118,7 @@ static buf32 encryptkeys =
0x6B,0x0F,0xD5,0x70,0xAE,0xFB,0xAD,0x11,
0xF4,0x47,0xDC,0xA7,0xEC,0xCF,0x50,0xC0};
#include "nwcrypt.h"
static void
shuffle1(buf32 temp, unsigned char *target)
{

7
nwcrypt.h Normal file
View File

@ -0,0 +1,7 @@
/* nwcrypt.h */
extern void shuffle(unsigned char *lon,
const unsigned char *buf, int buflen,
unsigned char *target);
extern void nw_encrypt(unsigned char *fra,
unsigned char *buf,unsigned char *til);

18
nwdbm.c
View File

@ -1,4 +1,4 @@
/* nwdbm.c 24-Dec-95 data base for mars_nwe */
/* nwdbm.c 08-Jan-96 data base for mars_nwe */
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
*
* This program is free software; you can redistribute it and/or modify
@ -23,12 +23,14 @@
#include "net.h"
#include "nwdbm.h"
#include "nwcrypt.h"
#ifdef LINUX
# include <ndbm.h>
#else
# include </usr/ucbinclude/ndbm.h>
#endif
int tells_server_version=0;
static char *fnprop = "nwprop";
@ -1062,7 +1064,7 @@ static void add_pr_queue(uint32 q_id,
}
static uint32 add_user(uint32 u_id, uint32 g_id,
static void add_user(uint32 u_id, uint32 g_id,
char *name, char *unname, char *password)
{
uint8 buff[4];
@ -1089,17 +1091,17 @@ static uint32 add_user(uint32 u_id, uint32 g_id,
void nw_fill_standard(char *servername, ipxAddr_t *adr)
/* fills the Standardproperties */
{
char serverna[50];
uint8 buff[12];
char serverna[MAX_SERVER_NAME+2];
uint32 su_id = 0x00000001;
uint32 ge_id = 0x01000001;
uint32 guest_id = 0x02000001;
uint32 serv_id = 0x03000001;
uint32 q1_id = 0x0E000001;
#if 0
uint32 guest_id = 0x02000001;
uint32 nbo_id = 0x0B000001;
uint32 ngr_id = 0x0C000001;
uint32 ps1_id = 0x0D000001;
uint32 q1_id = 0x0E000001;
#endif
FILE *f = open_nw_ini();
ge_id =
nw_new_create_prop(ge_id, "EVERYONE", 0x2, 0x0, 0x31,
@ -1162,7 +1164,7 @@ void nw_fill_standard(char *servername, ipxAddr_t *adr)
fclose(f);
}
if (servername && adr) {
strmaxcpy(serverna, servername, 48);
strmaxcpy(serverna, servername, MAX_SERVER_NAME);
upstr(serverna);
nw_new_create_prop(serv_id, serverna, 0x4, O_FL_DYNA, 0x40,
"NET_ADDRESS", P_FL_ITEM | P_FL_DYNA, 0x40,

View File

@ -1,4 +1,4 @@
/* nwdbm.h 11-Sep-95 */
/* nwdbm.h 08-Jan-96 */
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
*
* This program is free software; you can redistribute it and/or modify
@ -168,6 +168,12 @@ extern uint32 nw_new_create_prop(uint32 wanted_id,
char *propname, int propflags, int propsecurity,
char *value, int valuesize);
extern int get_guid(int *gid, int *uid, uint32 obj_id);
extern int nw_test_passwd(uint32 obj_id, uint8 *vgl_key, uint8 *akt_key);
extern int nw_get_q_dirname(uint32 q_id, uint8 *buff);
extern int nw_get_q_prcommand(uint32 q_id, uint8 *buff);
extern void nw_fill_standard(char *servername, ipxAddr_t *adr);
extern void nw_init_dbm(char *servername, ipxAddr_t *adr);

View File

@ -1,4 +1,4 @@
/* nwroute.c 24-Dec-95 */
/* nwroute.c 08-Jan-96 */
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
*
* This program is free software; you can redistribute it and/or modify
@ -19,7 +19,6 @@
#include "net.h"
#include "nwserv.h"
#define MAX_NW_ROUTES 50 /* max. 1 complete RIP packet should be enough */
typedef struct {
uint32 net; /* destnet */
@ -65,7 +64,10 @@ static void insert_delete_net(uint32 destnet,
if (k == anz_routes) { /* no route slot found */
if (do_delete) return; /* nothing to delete */
if (freeslot < 0) {
if (anz_routes == MAX_NW_ROUTES) return;
if (anz_routes == MAX_NW_ROUTES) {
XDPRINTF((1, 0, "too many routes=%d, increase MAX_NW_ROUTES in config.h", anz_routes));
return;
}
nw_routes[k] = (NW_ROUTES*)xmalloc(sizeof(NW_ROUTES));
anz_routes++;
} else k=freeslot;
@ -153,7 +155,7 @@ static void build_rip_buff(uint32 destnet)
k=-1;
while (++k < anz_routes) {
NW_ROUTES *nr=nw_routes[k];
if ((is_wild || nr->net == destnet) && rmode==1 || nr->hops < 2)
if ( (is_wild || nr->net == destnet) && (rmode==1 || nr->hops < 2) )
ins_rip_buff(nr->net, (rmode==1) ? 16 : nr->hops, nr->ticks);
}
}
@ -178,7 +180,9 @@ static void send_rip_buff(ipxAddr_t *from_addr)
(operation==1) ? "Request" : "Response", rentries));
p+=2;
while (rentries--) {
#if 0
uint32 net = GET_BE32(p);
#endif
uint16 hops = GET_BE16(p+4);
uint16 ticks = GET_BE16(p+6);
XDPRINTF((2,0, "hops=%3d, ticks %3d, network:%02x.%02x.%02x.%02x",
@ -298,7 +302,13 @@ void send_sap_broadcast(int mode)
U16_TO_BE16(1, ipx_data.sip.intermediate_networks);
/* I hope 1 is ok here */
}
send_ipx_data(sockfd[MY_BROADCAST_SLOT], 0,
#ifdef MY_BROADCAST_SLOT
send_ipx_data(sockfd[MY_BROADCAST_SLOT],
#else
send_ipx_data(-1,
#endif
0,
sizeof(ipx_data.sip),
(char *)&(ipx_data.sip),
&wild, "SIP Broadcast");

View File

@ -1,4 +1,4 @@
/* nwserv.c 20-Dec-95 */
/* nwserv.c 09-Jan-96 */
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
*
* This program is free software; you can redistribute it and/or modify
@ -27,8 +27,13 @@ char my_nwname[50]; /* Name of this server */
int anz_net_devices=0;
NW_NET_DEVICE *net_devices[MAX_NET_DEVICES];
uint16 ipx_sock_nummern[]={ 0, /* auto sock */
uint16 ipx_sock_nummern[]={
#ifdef MY_BROADCAST_SLOT
0, /* auto sock */
#endif
#ifdef WDOG_SLOT
0, /* auto sock */
#endif
SOCK_SAP,
SOCK_RIP,
SOCK_ROUTE,
@ -578,8 +583,12 @@ static void handle_event(int fd, uint16 socknr, int slot)
IPXCMPNET (source_adr.net, my_server_adr.net)) {
int source_sock = (int) GET_BE16(source_adr.sock);
#if 0
if ( source_sock == sock_nummern[MY_BROADCAST_SLOT]
|| source_sock == sock_nummern[WDOG_SLOT]
#endif
if ( source_sock == sock_nummern[WDOG_SLOT]
|| source_sock == SOCK_SAP
|| source_sock == SOCK_RIP) {
XDPRINTF((2,0,"OWN Packet from sock:0x%04x, ignored", source_sock));
@ -639,7 +648,7 @@ static void get_ini(int full)
char inhalt4[500];
char dummy;
int anz;
if ((anz=sscanf((char*)buff, "%s %s %s", inhalt, inhalt2,
if ((anz=sscanf((char*)buff, "%s %s %s %s", inhalt, inhalt2,
inhalt3, inhalt4)) > 0) {
switch (what) {
case 2 : if (full) {

View File

@ -1,4 +1,4 @@
/* nwserv.h 09-Dec-95 */
/* nwserv.h 09-Jan-96 */
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
*
* This program is free software; you can redistribute it and/or modify
@ -33,16 +33,18 @@ extern int anz_net_devices;
extern NW_NET_DEVICE *net_devices[];
/* <======== SOCKETS =========> */
#define MY_BROADCAST_SLOT 0 /* Server Broadcast OUT */
#define WDOG_SLOT 1 /* Watchdog send + recv */
#define SAP_SLOT 2
#define RIP_SLOT 3
#define ROUTE_SLOT 4
#define DIAG_SLOT 5
#if 0
#define ECHO_SLOT 6
#define ERR_SLOT 7
#define MY_BROADCAST_SLOT 0 /* Server Broadcast OUT */
#endif
#define WDOG_SLOT 0 /* Watchdog send + recv */
#define SAP_SLOT 1
#define RIP_SLOT (SAP_SLOT +1)
#define ROUTE_SLOT (RIP_SLOT +1)
#define DIAG_SLOT (ROUTE_SLOT +1)
#if 0
#define ECHO_SLOT (DIAG_SLOT +1)
#define ERR_SLOT (ECHO_SLOT +1)
#endif
extern int sockfd[];

11
tools.c
View File

@ -1,4 +1,4 @@
/* tools.c 24-Dec-95 */
/* tools.c 07-Jan-96 */
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
*
* This program is free software; you can redistribute it and/or modify
@ -45,6 +45,13 @@ char *xmalloc(uint size)
return(p);
}
char *xcmalloc(uint size)
{
char *p = xmalloc(size);
if (size) memset(p, 0, size);
return(p);
}
void x_x_xfree(char **p)
{
if (*p != (char *)NULL){
@ -301,7 +308,7 @@ int get_fs_usage(char *path, struct fs_usage *fsp)
struct statfs fsd;
if (statfs (path, &fsd) < 0) return (-1);
XDPRINTF((3, 0,
"blocks=%d, bfree=%d, bavail=%d, files=%d, ffree=%d, bsize=%d\n",
"blocks=%d, bfree=%d, bavail=%d, files=%d, ffree=%d, bsize=%d",
fsd.f_blocks, fsd.f_bfree, fsd.f_bavail,
fsd.f_files, fsd.f_ffree, fsd.f_bsize));
#define convert_blocks(b) adjust_blocks ((b), fsd.f_bsize, 512)

View File

@ -1,4 +1,4 @@
/* tools.h : 14-Nov-95 */
/* tools.h : 07-Jan-96 */
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
*
@ -30,6 +30,7 @@ extern int x_x_xnewstr(uint8 **p, uint8 *s);
#define new_str(p, s) x_x_xnewstr((uint8 **)&(p), s)
extern char *xmalloc(uint size);
extern char *xcmalloc(uint size);
extern int strmaxcpy(char *dest, char *source, int len);
extern void dprintf(char *p, ...);
extern void xdprintf(int dlevel, int mode, char *p, ...);