From 6331687e52120a88851980890022df078ef857cf Mon Sep 17 00:00:00 2001 From: Mario Fetka Date: Sun, 13 Nov 2011 00:38:57 +0100 Subject: [PATCH] mars_nwe-0.97.pl09 --- Makefile | 4 + connect.c | 285 ++++++++++++++++++++++++++++--------------- connect.h | 12 +- doc/CHANGES | 21 +++- doc/CREDITS | 3 + doc/NEWS | 11 ++ doc/README | 2 +- doc/README.ger | 2 +- doc/mars_nwe.lsm | 8 +- emutli.c | 45 +++---- emutli1.c | 8 +- emutli1.h | 7 +- examples/config.h | 1 + examples/kpatch2.0.1 | 64 ++++++++++ examples/mk.li | 18 ++- examples/nw.ini | 10 +- makefile.unx | 14 ++- namspace.c | 14 +-- ncpserv.c | 43 ++++--- net.h | 35 +++++- nwbind.c | 19 +-- nwconn.c | 51 ++++---- nwconn.h | 6 + nwcrypt.c | 44 ++++++- nwcrypt.h | 5 +- nwdbm.c | 52 +++++--- nwdbm.h | 2 + nwfile.c | 124 ++++++++++++++++--- nwfile.h | 4 + nwroute.c | 67 +++++++++- nwroute1.c | 2 +- nwserv.c | 39 +++--- nwserv.h | 2 +- nwvolume.c | 10 ++ 34 files changed, 741 insertions(+), 293 deletions(-) create mode 100644 examples/kpatch2.0.1 create mode 100644 nwconn.h diff --git a/Makefile b/Makefile index 4731d40..5041d5c 100644 --- a/Makefile +++ b/Makefile @@ -32,6 +32,10 @@ routed: install: ./mk.li $@ +reboot: + ./mk.li $@ + + install_ini: nw.ini ./mk.li $@ diff --git a/connect.c b/connect.c index 412c69a..cef469a 100644 --- a/connect.c +++ b/connect.c @@ -28,12 +28,15 @@ static int test_handle=-1; #endif -#define DONT_KNOW_IF_OK 1 +#define DONT_KNOW_IF_OK 0 static int default_uid=-1; static int default_gid=-1; +static int act_uid=-1; +static int act_gid=-1; + #include "nwvolume.h" #include "nwfile.h" #include "connect.h" @@ -175,6 +178,8 @@ void set_default_guid(void) "Cannot set default gid=%d and uid=%d" , default_gid, default_uid); exit(1); } + act_gid = default_gid; + act_uid = default_uid; } void set_guid(int gid, int uid) @@ -197,6 +202,8 @@ void set_guid(int gid, int uid) if (seteuid(uid) == -1) set_default_guid(); } XDPRINTF((5,0,"SET GID=%d, UID=%d OK", gid, uid)); + act_gid = gid; + act_uid = uid; } } @@ -231,12 +238,16 @@ static int x_str_match(uint8 *s, uint8 *p) if (*p++ != *s++) return(0); break; - case '?' : if ((sc = *s++) == '.') { + case '?' : if ( (sc = *s++) == '.' || sc == '\0' ) { uint8 *pp=p; - while (*pp) { - if (*pp++ == '.') p=pp; + while (*pp=='?' || *pp=='*') ++pp; + if (*pp=='.') p=++pp; + else if (*pp || sc) return(0); + if (!sc) { + while (*pp=='?' || *pp=='*') ++pp; + return((*pp) ? 0 : 1); } - } else if (!sc) return(1); /* one character */ + } break; case '.' : @@ -306,6 +317,7 @@ int fn_match(uint8 *s, uint8 *p, int options) if (pf++) return(0); /* no 2. pouint */ len=0; } else { + ++len; if ((pf && len > 3) || len > 8) return(0); if (options & VOL_OPTION_DOWNSHIFT){ /* only downshift chars */ if (*ss >= 'A' && *ss <= 'Z') return(0); @@ -547,7 +559,7 @@ static int get_dh_entry(DIR_HANDLE *dh, return(okflag); } -void conn_build_path_fn( uint8 *vol, +static void conn_build_path_fn( uint8 *vol, uint8 *path, uint8 *fn, int *has_wild, @@ -737,7 +749,9 @@ static int build_verz_name(NW_PATH *nwpath, /* gets complete path */ return(completition); } +#if DONT_KNOW_IF_OK static int lastdirhandle=0; +#endif int conn_get_kpl_path(NW_PATH *nwpath, int dirhandle, uint8 *data, int len, int only_dir) /* @@ -759,7 +773,7 @@ int conn_get_kpl_path(NW_PATH *nwpath, int dirhandle, return(completition); } -uint16 un_date_2_nw(time_t time, uint8 *d) +void un_date_2_nw(time_t time, uint8 *d, int high_low) { struct tm *s_tm=localtime(&time); uint16 xdate=s_tm->tm_year - 80; @@ -767,8 +781,26 @@ uint16 un_date_2_nw(time_t time, uint8 *d) xdate |= s_tm->tm_mon+1; xdate <<= 5; xdate |= s_tm->tm_mday; - if (d) U16_TO_BE16(xdate, d); - return(xdate); + if (high_low) { + U16_TO_BE16(xdate, d); + } else { + U16_TO_16(xdate, d); + } +} + +void un_time_2_nw(time_t time, uint8 *d, int high_low) +{ + struct tm *s_tm=localtime(&time); + uint16 xdate=s_tm->tm_hour; + xdate <<= 6; + xdate |= s_tm->tm_min; + xdate <<= 5; + xdate |= (s_tm->tm_sec / 2); + if (high_low) { + U16_TO_BE16(xdate, d); + } else { + U16_TO_16(xdate, d); + } } time_t nw_2_un_time(uint8 *d, uint8 *t) @@ -792,37 +824,83 @@ time_t nw_2_un_time(uint8 *d, uint8 *t) return(mktime(&s_tm)); } -uint16 un_time_2_nw(time_t time, uint8 *d) +static int un_nw_attrib(struct stat *stb, int attrib, int mode) +/* mode: 0 = un2nw , 1 = nw2un */ { - struct tm *s_tm=localtime(&time); - uint16 xdate=s_tm->tm_hour; - xdate <<= 6; - xdate |= s_tm->tm_min; - xdate <<= 5; - xdate |= (s_tm->tm_sec / 2); - if (d) U16_TO_BE16(xdate, d); - return(xdate); + /* Attribute */ + /* 0x01 readonly */ + /* 0x02 hidden */ + /* 0x04 System */ + /* 0x20 Archive Flag */ + /* 0x80 Sharable */ /* TLINK (TCC 2.0) don't like it ???? */ + + if (!mode) { + /* UNIX access -> NW access */ + attrib = 0x20; + if (act_uid == stb->st_uid) { + if (!(stb->st_mode & S_IWUSR)) { + attrib |= 0x1; /* RO */ + } + if (!(stb->st_mode & S_IRUSR)) { + attrib |= 0x2; /* Hidden */ + } + } else if (act_gid == stb->st_gid) { + if (!(stb->st_mode & S_IWGRP)) { + attrib |= 0x1; /* RO */ + } + if (!(stb->st_mode & S_IRGRP)) { + attrib |= 0x2; /* Hidden */ + } + } else { + if (!(stb->st_mode & S_IWOTH)) { + attrib |= 0x1; /* RO */ + } + if (!(stb->st_mode & S_IROTH)) { + attrib |= 0x2; /* Hidden */ + } + } + /* only shared if gid == gid && x Flag */ + + if ((act_gid == stb->st_gid) && (stb->st_mode & S_IXGRP)) + attrib |= 0x80; /* shared flag */ + + return(attrib); + } else { + /* NW access -> UNIX access */ + + int mode = S_IRUSR | S_IRGRP; + if (attrib & 0x2) /* hidden */ + stb->st_mode &= ~mode; + else + stb->st_mode |= mode; + + mode = S_IWUSR | S_IWGRP; + if (attrib & 0x1) /* R/O */ + stb->st_mode &= ~mode; + else + stb->st_mode |= mode; + + if (attrib & 0x80) /* Shared */ + stb->st_mode |= S_IXGRP; + else + stb->st_mode &= ~S_IXGRP; + return(stb->st_mode); + } } static int get_file_attrib(NW_FILE_INFO *f, struct stat *stb, NW_PATH *nwpath) { - XDPRINTF((5,0, "get_file_attrib of %s", conn_get_nwpath_name(nwpath) )); strncpy((char*)f->name, (char*)nwpath->fn, sizeof(f->name)); - /* Attribute */ - /* 0x20 Archive Flag */ - /* 0x80 Sharable */ /* TLINK (TCC 2.0) don't like it ???? */ -#if 1 - if (!strcmp((char*)nwpath->fn, "TURBOC.$LN")) f->attrib = 0x20; - else f->attrib = 0x80; -#else - f->attrib = 0x20; -#endif + f->attrib = (uint8) un_nw_attrib(stb, 0, 0); + XDPRINTF((5,0, "get_file_attrib = 0x%x of ,%s, uid=%d, gid=%d", + (int)f->attrib, conn_get_nwpath_name(nwpath), + stb->st_uid, stb->st_gid)); f->ext_attrib = 0; - un_date_2_nw(stb->st_mtime, f->create_date); - un_date_2_nw(stb->st_atime, f->acces_date ); - un_date_2_nw(stb->st_mtime, f->modify_date); - un_time_2_nw(stb->st_mtime, f->modify_time); + un_date_2_nw(stb->st_mtime, f->create_date, 1); + un_date_2_nw(stb->st_atime, f->acces_date, 1); + un_date_2_nw(stb->st_mtime, f->modify_date, 1); + un_time_2_nw(stb->st_mtime, f->modify_time, 1); U32_TO_BE32(stb->st_size, f->size); return(1); } @@ -835,9 +913,8 @@ static int get_dir_attrib(NW_DIR_INFO *d, struct stat *stb, d->attrib = 0x10; /* Verzeichnis */ d->ext_attrib = 0xff; /* effektive rights ?? */ - - un_date_2_nw(stb->st_mtime, d->create_date); - un_time_2_nw(stb->st_mtime, d->create_time); + un_date_2_nw(stb->st_mtime, d->create_date, 1); + un_time_2_nw(stb->st_mtime, d->create_time, 1); U32_TO_BE32(1L, d->owner_id); d->access_right_mask = 0; @@ -879,13 +956,19 @@ static int do_set_file_info(NW_PATH *nwpath, FUNC_SEARCH *fs) strcpy(unname, build_unix_name(nwpath, 0)); XDPRINTF((5,0,"set_file_info unname:%s:", unname)); 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 */ + return(-0x8c); /* no modify rights */ else { struct utimbuf ut; + struct stat statb; + int result=0; ut.actime = ut.modtime = nw_2_un_time(f->modify_date, f->modify_time); - if (!utime(unname, &ut)) return(0); + if ( 0 == (result=stat(unname, &statb)) && + 0 == (result=utime(unname, &ut))){ + result = chmod(unname, un_nw_attrib(&statb, (int)f->attrib, 1)); + } + return( (result != 0) ? -0x8c : 0); /* no modify rights */ } return(-0x85); /* NO Privileges */ } @@ -906,7 +989,9 @@ int nw_set_file_information(int dir_handle, uint8 *data, int len, return(completition); } -int nw_chmod_datei(int dir_handle, uint8 *data, int len, int modus) +int nw_chmod_datei(int dir_handle, uint8 *data, int len, + int attrib, int access) + { char unname[256]; struct stat stbuff; @@ -925,9 +1010,10 @@ int nw_chmod_datei(int dir_handle, uint8 *data, int len, int modus) } if (completition < 0) return(completition); strcpy(unname, build_unix_name(&nwpath, 2)); - XDPRINTF((5,0,"CHMOD DATEI unname:%s:", unname)); + XDPRINTF((5,0,"set file attrib 0x%x, unname:%s:", unname)); if (!stat(unname, &stbuff)){ - return(0); + int result = chmod(unname, un_nw_attrib(&stbuff, access, 1)); + return( (result != 0) ? -0x8c : 0); /* no modify rights */ } return(-0x9c); /* wrong path */ } @@ -1068,12 +1154,14 @@ static int change_dir_entry( NW_DIR *dir, int volume, dir->inode = inode; dir->volume = (uint8) volume; dir->timestamp = time(NULL); + if (driveletter > -1) { dir->drive = (uint8) driveletter; dir->task = (uint8)task; } else { if (task < (int)dir->task) dir->task = (uint8) task; } + if (is_temp > -1) dir->is_temp = (uint8) is_temp; return(0); } else { @@ -1145,7 +1233,6 @@ int nw_init_connect(void) "UnixPath=`%s`", build_unix_name(&nwlogin, 0)); return(-1); } - (void)change_dir_entry(&(dirs[0]), 0, nwlogin.path, stbuff.st_ino, 0, 0, 1, 0); /* first Handle must be known und must not be temp */ @@ -1158,17 +1245,22 @@ int nw_init_connect(void) int nw_free_handles(int task) /* - * if task==0 then all is initialized - * else the temp handles of the actuell task and greater - * are deleted. I hope it is right. !?? + * if task== -1 then all is initialized + * else the temp handles of the actual task ( and greater ) + * are deleted. I hope this is right. !?? */ { - if (!task) return(nw_init_connect()); + if (task == -1) return(nw_init_connect()); else { NW_DIR *d = &(dirs[0]); int k = used_dirs; while (k--) { +#if 0 if (d->is_temp && d->task >= task) { +#else + if (d->is_temp && d->task == task) { + /* only actual task */ +#endif xfree(d->path); d->volume = 0; d->inode = 0; @@ -1191,7 +1283,13 @@ int xinsert_new_dir(int volume, uint8 *path, int inode, int drive, int is_temp, /* first look, whether drive is allready in use */ for (j = 0; j < (int)used_dirs; j++) { NW_DIR *d = &(dirs[j]); - if (d->inode && !is_temp && !d->is_temp && (int)d->drive == drive) { + if (!d->inode) freehandle = j+1; + else if (!is_temp && !d->is_temp + && (int)d->drive == drive +#if 0 + && (int)d->task == task +#endif + ) { (void)change_dir_entry(d, volume, path, inode, drive, is_temp, 1, task); return(++j); } else if (!d->inode) freehandle = j+1; @@ -1233,11 +1331,7 @@ int nw_search(uint8 *info, &searchsequence, search_attrib, &stbuff)){ -#if 1 - if ( (stbuff.st_mode & S_IFMT) == S_IFDIR) { -#else - if (search_attrib & 0x10) { -#endif + if ( S_ISDIR(stbuff.st_mode) ) { get_dir_attrib((NW_DIR_INFO*)info, &stbuff, &nwpath); } else { @@ -1265,12 +1359,7 @@ int nw_dir_search(uint8 *info, &searchsequence, search_attrib, &stbuff)){ - -#if 1 - if ( (stbuff.st_mode & S_IFMT) == S_IFDIR) { -#else - if (search_attrib & 0x10) { -#endif + if ( S_ISDIR(stbuff.st_mode) ) { get_dir_attrib((NW_DIR_INFO*)info, &stbuff, &nwpath); } else { @@ -1282,21 +1371,21 @@ int nw_dir_search(uint8 *info, } else return(completition); /* wrong path */ } -int nw_alloc_dir_handle( int dir_handle, /* Suche ab Pfad dirhandle */ - uint8 *data, /* zusaetzl. Pfad */ - int len, /* L„nge DATA */ +int nw_alloc_dir_handle( int dir_handle, /* source directory handle */ + uint8 *data, /* source path */ + int len, /* pathlen */ int driveletter, /* A .. Z normal */ - int is_temphandle, /* temporaeres Handle 1 */ - /* spez. temp Handle 2 */ + int is_temphandle, /* temp handle = 1 */ + /* special temp handle = 2 */ int task) /* Prozess Task */ { NW_PATH nwpath; 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", + XDPRINTF((2,0,"Allocate %shandle:%s, Qhandle=%d, drive=%d, Task=%d, result=0x%x", (is_temphandle) ? "Temp" : "Perm", conn_get_nwpath_name(&nwpath), - dir_handle, driveletter, inode)); + dir_handle, driveletter, task, inode)); return(inode); } @@ -1336,11 +1425,17 @@ int nw_open_dir_handle( int dir_handle, return(completition); } -int nw_free_dir_handle(int dir_handle) +int nw_free_dir_handle(int dir_handle, int task) { if (dir_handle && --dir_handle < (int)used_dirs) { NW_DIR *d=&(dirs[dir_handle]); - if (!d->inode) return(-0x9b); /* wrong handle */ + XDPRINTF((2,0,"free dhandle:%d, task=%d, d->inode=0x%x, used_dirs=%d", + dir_handle+1, task, d->inode, used_dirs)); + if (!d->inode +#if 0 + || d->task != task +#endif + ) return(-0x9b); /* wrong handle */ else { d->inode = 0; xfree(d->path); @@ -1357,9 +1452,13 @@ int nw_set_dir_handle(int targetdir, int dir_handle, 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, conn_get_nwpath_name(&nwpath))); - return(change_dir_entry(&dirs[targetdir], nwpath.volume, nwpath.path, inode, -1, -1, 0, task)); + && dirs[targetdir].is_temp != 2) { + /* do not change special temphandles */ + XDPRINTF((2,0,"Change dhandle:%d(%d) -> `%s`", targetdir+1, task, + 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 */ } @@ -1385,7 +1484,8 @@ int nw_get_vol_number(int dir_handle) /* Get Volume Nummmer with Handle */ { int result = -0x9b; /* wrong handle */ - if (dir_handle > 0 && --dir_handle < (int)used_dirs) { + if (dir_handle > 0 && --dir_handle < (int)used_dirs + && dirs[dir_handle].inode ) { result = dirs[dir_handle].volume; if (result < 0 || result >= used_nw_volumes) result = -0x98; /* wrong volume */ } @@ -1467,8 +1567,8 @@ static int s_nw_scan_dir_info(int dir_handle, U16_TO_BE16(aktsequenz, subnr); strncpy((char*)subname, (char*)dirname, 16); U32_TO_BE32(1L, owner); /* erstmal */ - un_date_2_nw(stbuff.st_mtime, subdatetime); - un_time_2_nw(stbuff.st_mtime, subdatetime+2); + un_date_2_nw(stbuff.st_mtime, subdatetime, 1); + un_time_2_nw(stbuff.st_mtime, subdatetime+2, 1); return(0xff); } strcpy((char*)dirname, (char*)wild); @@ -1479,8 +1579,8 @@ static int s_nw_scan_dir_info(int dir_handle, U16_TO_BE16(1, subnr); memset(subname, 0, 16); U32_TO_BE32(1L, owner); - un_date_2_nw(stbuff.st_mtime, subdatetime); - un_time_2_nw(stbuff.st_mtime, subdatetime+2); + un_date_2_nw(stbuff.st_mtime, subdatetime, 1); + un_time_2_nw(stbuff.st_mtime, subdatetime+2, 1); return(0xff); } } @@ -1539,18 +1639,6 @@ typedef struct { uint8 reserved_2[28]; } NW_DOS_FILE_INFO; -void xun_date_2_nw(time_t time, uint8 *d) -{ - uint16 i = un_date_2_nw(time, NULL); - memcpy(d, &i, 2); -} - -void xun_time_2_nw(time_t time, uint8 *d) -{ - uint16 i = un_time_2_nw(time, NULL); - memcpy(d, &i, 2); -} - static void get_dos_file_attrib(NW_DOS_FILE_INFO *f, struct stat *stb, NW_PATH *nwpath) @@ -1560,13 +1648,16 @@ static void get_dos_file_attrib(NW_DOS_FILE_INFO *f, /* Attribute */ /* 0x20 Archive Flag */ /* 0x80 Sharable */ - f->attributes[0] = 0x20; - xun_date_2_nw(stb->st_mtime, f->created.date); - xun_time_2_nw(stb->st_mtime, f->created.time); + f->attributes[0] = (uint8) un_nw_attrib(stb, 0, 0); + XDPRINTF((5,0, "get_dos_file_attrib = 0x%x of ,%s, uid=%d, gid=%d", + (int)f->attributes[0], conn_get_nwpath_name(nwpath), + stb->st_uid, stb->st_gid)); + un_date_2_nw(stb->st_mtime, f->created.date, 0); + un_time_2_nw(stb->st_mtime, f->created.time, 0); U32_TO_BE32(1, f->created.id); memcpy(&(f->updated), &(f->created), sizeof(NW_DOS_FILE_INFO)); - xun_date_2_nw(stb->st_atime, f->last_access_date); - memcpy(f->size, &(stb->st_size), 4); + un_date_2_nw(stb->st_atime, f->last_access_date, 0); + U32_TO_32(stb->st_size, f->size); } typedef struct { @@ -1596,11 +1687,11 @@ static void get_dos_dir_attrib(NW_DOS_DIR_INFO *f, f->namlen=min(strlen((char*)nwpath->fn), 12); strncpy((char*)f->name, (char*)nwpath->fn, f->namlen); f->attributes[0] = 0x10; /* Dir */ - xun_date_2_nw(stb->st_mtime, f->created.date); - xun_time_2_nw(stb->st_mtime, f->created.time); + un_date_2_nw(stb->st_mtime, f->created.date,0); + un_time_2_nw(stb->st_mtime, f->created.time,0); U32_TO_BE32(1, f->created.id); - xun_date_2_nw(stb->st_mtime, f->modify_date); - xun_time_2_nw(stb->st_mtime, f->modify_time); + un_date_2_nw(stb->st_mtime, f->modify_date, 0); + un_time_2_nw(stb->st_mtime, f->modify_time, 0); U32_TO_BE32(MAX_U32, f->max_space); } @@ -1653,7 +1744,7 @@ int nw_scan_a_root_dir(uint8 *rdata, NW_PATH nwpath; uint8 data[2]; 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", + XDPRINTF((5,0,"nw_scan_a_root_directory_2 path:%s:, fn:%s:, completition:0x%x", nwpath.path, nwpath.fn, completition)); if (completition > -1) { struct stat stbuff; diff --git a/connect.h b/connect.h index e3823da..8271287 100644 --- a/connect.h +++ b/connect.h @@ -67,7 +67,8 @@ extern int nw_delete_datei(int dir_handle, uint8 *data, int len); extern int nw_set_file_information(int dir_handle, uint8 *data, int len, int searchattrib, NW_FILE_INFO *f); -extern int nw_chmod_datei(int dir_handle, uint8 *data, int len, int modus); +extern int nw_chmod_datei(int dir_handle, uint8 *data, int len, + int attrib, int access); extern int mv_file(int qdirhandle, uint8 *q, int qlen, int zdirhandle, uint8 *z, int zlen); @@ -111,7 +112,7 @@ extern int nw_open_dir_handle( int dir_handle, int *searchsequence); -extern int nw_free_dir_handle(int dir_handle); +extern int nw_free_dir_handle(int dir_handle, int task); extern int nw_set_dir_handle(int targetdir, int dir_handle, uint8 *data, int len, int task); @@ -154,12 +155,9 @@ extern int nw_scan_a_root_dir(uint8 *rdata, extern int fn_match(uint8 *s, uint8 *p, int options); - -extern uint16 un_date_2_nw(time_t time, uint8 *d); +extern void un_date_2_nw(time_t time, uint8 *d, int high_low); extern time_t nw_2_un_time(uint8 *d, uint8 *t); -extern uint16 un_time_2_nw(time_t time, uint8 *d); -extern void xun_date_2_nw(time_t time, uint8 *d); -extern void xun_time_2_nw(time_t time, uint8 *d); +extern void un_time_2_nw(time_t time, uint8 *d, int high_low); #endif diff --git a/doc/CHANGES b/doc/CHANGES index e69c0e2..6049119 100644 --- a/doc/CHANGES +++ b/doc/CHANGES @@ -1,5 +1,5 @@ Sorry, this is in German only. -Aenderungen in mars_nwe bis zum : 20-Jun-96 +Aenderungen in mars_nwe bis zum : 24-Jun-96 -------------------------------- Erste 'oeffentliche' Version ^^^^^^^^^^ VERSION 0.94 ^^^^^^^^ @@ -138,10 +138,21 @@ Erste 'oeffentliche' Version - Bug beim Listen von grossen Direktories korrigiert. (Fritz Elfert) - CRYPTED CHANGE PASSWORD Routine implementiert. (Guntram Blohm) <----- ^^^^^^^^^^ pl7 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - - - - +- automatische Registrierung von extern angelegten IPX-Interfaces + bzw. Loeschung eines Interfaces. (z.B. fuer ppp ) +- nw.routes nun mit Uhrzeitangabe +- Code fuer Linux/Sparc bereinigt und macros angepasst. (Ruedi Kneubuehler) +- Locking Code erweitert / korrigiert. +- watchdog BUG beseitigt. ( > MAX_CONNECTIONS ) +- workaround fuer sendto haenger eingebaut. +- pipe files nun mit connnection und pid parameter. +- Accesshandling erweitert. +<----- ^^^^^^^^^^ pl8 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +- Problem ( 0 byte free ) bei grosen Volumes korrigiert. (Botond K. Szabo) +- Wildcard Handling veraendert/korrigiert ? +- Dateien werden nun mittels mmap gelesen. + neuer config.h Schalter USE_MMAP +<----- ^^^^^^^^^^ pl9 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/doc/CREDITS b/doc/CREDITS index 556df5a..1038fdf 100644 --- a/doc/CREDITS +++ b/doc/CREDITS @@ -19,6 +19,9 @@ Ales Dryak Fritz Elfert gives Bugreport and Patches +Ruedi Kneubuehler + helping and testing for linux/sparc + Volker Lendecke helps distributing diff --git a/doc/NEWS b/doc/NEWS index 8900356..d53a5c8 100644 --- a/doc/NEWS +++ b/doc/NEWS @@ -1,4 +1,15 @@ # in this files are important notes for user of mars_nwe. +------12-Jul-96--- 0.97.pl9 ---------- +automatic adding and removing of ipx-interfaces. (internal router) +now running under linux/sparc. +better file locking/sharing. +some unix->dos attribute handling now. +better read performance (mmap(ing)) +A not yet assigned mars_nwe user is now automatic assigned +to a Linux user with same name when the password is changed and the +new password is not null. +------------------ 0.97.pl7 ---------- +Crypted Change password call implemented. ------05-May-96--- 0.97.pl3 ---------- Now nwserv can be called with parameter '-h' to send SIGHUP to the main nwserv program or with '-k' to send SIGTERM diff --git a/doc/README b/doc/README index 9d69009..a797124 100644 --- a/doc/README +++ b/doc/README @@ -68,7 +68,7 @@ nwbind: Have luck with trying. :) -Martin Stover +Martin Stover BTW: The kick to make mars_nwe public was the publication of linware ( lwared ), the NetWare-Emulator from diff --git a/doc/README.ger b/doc/README.ger index 3d4c98a..a387f71 100644 --- a/doc/README.ger +++ b/doc/README.ger @@ -70,7 +70,7 @@ der fehlenden bzw. fehlerhaften NCP-Calls wuerde ich mich freuen. Martin -(mstover@freeway.de) + PS: Den Anstoss, mars_nwe zu veroeffentlichen, gab die Veroeffentlichung von linware ( lwared ), dem Novell-Server-Emulator diff --git a/doc/mars_nwe.lsm b/doc/mars_nwe.lsm index 20d173a..5c1a9e4 100644 --- a/doc/mars_nwe.lsm +++ b/doc/mars_nwe.lsm @@ -1,7 +1,7 @@ Begin3 Title: mars_nwe -Version: 0.97.pl7 -Entered-date: 20-Jun-96 +Version: 0.97.pl9 +Entered-date: 12-Jul-96 Description: Full netware-emulator (src), beta. Supports file-services, bindery-services, printing-services, routing-services. @@ -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: ftp.gwdg.de:/pub/linux/misc/ncpfs - 160kB mars_nwe-0.97.pl7.tgz + 160kB mars_nwe-0.97.pl9.tgz 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, 2.xx), UnixWare (2.xx) Copying-policy: GNU End diff --git a/emutli.c b/emutli.c index 8ab86d7..eea0f1f 100644 --- a/emutli.c +++ b/emutli.c @@ -1,3 +1,4 @@ +#define DO_IPX_SEND_TEST 1 /* emutli.c 28-Apr-96 */ /* * One short try to emulate TLI with SOCKETS. @@ -204,36 +205,19 @@ int t_rcvudata(int fd, struct t_unitdata *ud, int *flags) ud->addr.len = sizeof(ipxAddr_t); return(result); } -#define HAVE_IPX_SEND_BUG 0 -#if HAVE_IPX_SEND_BUG -static int last_fd; + + +#if DO_IPX_SEND_TEST static int new_try; +static int anz_tries; +static struct t_unitdata *test_ud; static void sig_alarm(int rsig) { - struct sockaddr_ipx ipxs; - int maxplen=sizeof(struct sockaddr_ipx); signal(rsig, SIG_IGN); - XDPRINTF((1, 0, "GOT ALARM SIGNAL in sendto")); - memset((char*)&ipxs, 0, sizeof(struct sockaddr_ipx)); - ipxs.sipx_family=AF_IPX; - if (getsockname(last_fd, (struct sockaddr*)&ipxs, &maxplen) != -1){ - int sock; - int i = 5; - while (close(last_fd) == -1 && i--) sleep(1); - sleep(2); - sock = socket(AF_IPX, SOCK_DGRAM, AF_IPX); - if (bind(sock, (struct sockaddr*)&ipxs, sizeof(struct sockaddr_ipx))==-1) { - errorp(0, "TLI-BIND", "socket Nr:0x%x", (int)GET_BE16(&(ipxs.sipx_port))); - exit(1); - } - if (sock != last_fd) { - dup2(sock, last_fd); - close(sock); - } - new_try++; - } else - errorp(0, "getsockname", NULL); + XDPRINTF((0, 0,"GOT ALARM try=%d, sendto=%s", + anz_tries+1, visable_ipx_adr((ipxAddr_t *) test_ud->addr.buf) )); + if (anz_tries++ < 3) new_try++; } #endif @@ -244,16 +228,15 @@ int t_sndudata(int fd, struct t_unitdata *ud) struct sockaddr_ipx ipxs; if (ud->addr.len != sizeof(ipxAddr_t)) return(-1); -#if HAVE_IPX_SEND_BUG +#if DO_IPX_SEND_TEST { - int anz_tries=3; + anz_tries=0; + test_ud =ud; do { void (*old_sig)(int rsig) = signal(SIGALRM, sig_alarm); new_try = 0; alarm(2); - last_fd = fd; #endif - memset(&ipxs, 0, sizeof(struct sockaddr_ipx)); ipxs.sipx_family=AF_IPX; ipx2sockadr(&ipxs, (ipxAddr_t*) (ud->addr.buf)); @@ -262,10 +245,10 @@ int t_sndudata(int fd, struct t_unitdata *ud) result = sendto(fd,(void *)ud->udata.buf, ud->udata.len, 0, (struct sockaddr *) &ipxs, sizeof(ipxs)); -#if HAVE_IPX_SEND_BUG +#if DO_IPX_SEND_TEST alarm(0); signal(SIGALRM, old_sig); - } while (new_try && anz_tries--); + } while (new_try); } #endif diff --git a/emutli1.c b/emutli1.c index 46db2b6..277f15b 100644 --- a/emutli1.c +++ b/emutli1.c @@ -1,4 +1,4 @@ -/* emutli1.c 28-Apr-96 */ +/* emutli1.c 24-Jun-96 */ /* * One short try to emulate TLI with SOCKETS. */ @@ -58,7 +58,7 @@ static int x_ioctl(int sock, int mode, void *id) return(result); } -static int interface_data(uint8* data, uint32 *rnet, uint8 *node, +int read_interface_data(uint8* data, uint32 *rnet, uint8 *node, int *flags, uint8 *name) /* returns frame or if error < 0 */ @@ -112,7 +112,7 @@ int get_interface_frame_name(char *name, uint32 net) while (fgets((char*)buff, sizeof(buff), f) != NULL){ uint32 rnet; uint8 dname[25]; - int fframe = interface_data((uint8*) buff, &rnet, NULL, NULL, dname); + int fframe = read_interface_data((uint8*) buff, &rnet, NULL, NULL, dname); if (fframe < 0) continue; if (rnet == net) { if (name) strcpy(name, dname); @@ -148,7 +148,7 @@ static void del_special_net(int special, char *devname, int frame) uint8 name[25]; while (fgets((char*)buff, sizeof(buff), f) != NULL){ int flags = 0; - int frame = interface_data((uint8*) buff, NULL, NULL, + int frame = read_interface_data((uint8*) buff, NULL, NULL, &flags, name); if (frame < 0) continue; sipx->sipx_type = frame; diff --git a/emutli1.h b/emutli1.h index ebdae9c..b47f079 100644 --- a/emutli1.h +++ b/emutli1.h @@ -1,4 +1,4 @@ -/* emutli1.h 28-Apr-96 */ +/* emutli1.h 24-Jun-96 */ /* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany * @@ -21,7 +21,12 @@ #define _EMUTLI1_H_ extern void set_locipxdebug(int debug); + +extern int read_interface_data(uint8* data, uint32 *rnet, uint8 *node, + int *flags, uint8 *name); + extern int get_interface_frame_name(char *name, uint32 net); + extern int get_frame_name(uint8 *framename, int frame); extern int init_ipx(uint32 network, uint32 node, int ipx_debug); extern void exit_ipx(int full); diff --git a/examples/config.h b/examples/config.h index b3a8d9d..4e75614 100644 --- a/examples/config.h +++ b/examples/config.h @@ -34,6 +34,7 @@ #define IPX_DATA_GR_546 1 /* allow ipx packets > 546+30 Byte */ +#define USE_MMAP 1 /* use mmap systen call */ /* <--------------------------------------------------------------------> */ #define MAX_NW_VOLS 10 /* max. number of mars_nwe-volumes */ #define MAX_FILE_HANDLES_CONN 80 /* max. number of open files per */ diff --git a/examples/kpatch2.0.1 b/examples/kpatch2.0.1 new file mode 100644 index 0000000..1fe3078 --- /dev/null +++ b/examples/kpatch2.0.1 @@ -0,0 +1,64 @@ +--- linux.org/include/linux/ipx.h Mon May 13 22:39:28 1996 ++++ linux/include/linux/ipx.h Thu Jul 4 00:09:54 1996 +@@ -75,5 +75,6 @@ + #define SIOCAIPXITFCRT (SIOCPROTOPRIVATE) + #define SIOCAIPXPRISLT (SIOCPROTOPRIVATE+1) + #define SIOCIPXCFGDATA (SIOCPROTOPRIVATE+2) ++#define SIOCIPXNCPCONN (SIOCPROTOPRIVATE+3) + #endif + +--- linux.org/include/net/sock.h Wed Jun 12 23:08:41 1996 ++++ linux/include/net/sock.h Thu Jul 4 00:09:12 1996 +@@ -112,6 +112,10 @@ + * know the connection this socket belongs to. + */ + struct ncp_server *ncp_server; ++/* ++ * To handle special NCP-Sockets for mars_nwe ++ */ ++ unsigned short ipx_ncp_conn; + + }; + #endif + +--- linux.org/net/ipx/af_ipx.c Wed Jun 12 22:55:00 1996 ++++ linux/net/ipx/af_ipx.c Thu Jul 4 00:09:46 1996 +@@ -468,6 +468,20 @@ + ipx_socket *sock1 = NULL, *sock2 = NULL; + struct sk_buff *skb1 = NULL, *skb2 = NULL; + ++ if (intrfc == ipx_primary_net ++ && ntohs(ipx->ipx_dest.sock) == 0x451 ++ && *((char*)(ipx+1)) == 0x22 ++ && *((char*)(ipx+1)+1) == 0x22) { ++ int connection = (int) *((char*)(ipx+1)+3); ++ /* 255 connections are enough ;) */ ++ if (connection) { ++ for (sock1=intrfc->if_sklist; ++ (sock1 != NULL) && ++ (sock1->protinfo.af_ipx.ipx_ncp_conn != connection); ++ sock1=sock1->next);; ++ } ++ } ++ if (sock1 == NULL) + sock1 = ipxitf_find_socket(intrfc, ipx->ipx_dest.sock); + + /* +@@ -2243,6 +2257,17 @@ + if(err) return err; + return(ipxcfg_get_config_data((void *)arg)); + } ++ ++ case SIOCIPXNCPCONN: ++ { ++ if (!suser()) return(-EPERM); ++ err = verify_area(VERIFY_READ, (void *)arg, ++ sizeof(unsigned short)); ++ if (err) return err; ++ sk->protinfo.af_ipx.ipx_ncp_conn = get_fs_word(arg); ++ return 0; ++ } ++ + case SIOCGSTAMP: + if (sk) + { diff --git a/examples/mk.li b/examples/mk.li index 88dce0e..54b0d71 100755 --- a/examples/mk.li +++ b/examples/mk.li @@ -1,5 +1,5 @@ #!/bin/sh -# mk.li 27-Apr-96 ### +# mk.li 10-Jul-96 ### # please edit this file ! mk() @@ -20,6 +20,7 @@ mk() TOLOWER='tr "[A-Z]" "[a-z]"' UNX=`uname -s | $TOLOWER` +MASCHINE=`uname -m` MK_PPID=$$ export MK_PPID trap 'echo "Error: Try again :)" && exit 1' 1 @@ -33,8 +34,21 @@ case $UNX in # CFLAGS="-pipe -O2 -fomit-frame-pointer" # problems gcc2.5.8 ^^^^^^^^^^^^^^^^^^^^^ CFLAGS="-pipe -Wall" - HOSTCFLAGS="-DLINUX" + + case $MASCHINE in + sparc) + HOSTCFLAGS="-DLINUX -DSPARC" + ;; + *) + HOSTCFLAGS="-DLINUX" + ;; + esac + +if [ -f /usr/lib/libgdbm.a ] || [ -f /usr/lib/libgdbm.so ] ; then + NDBMLIB="-lgdbm" +else NDBMLIB="-ldbm" +fi CRYPTLIB="" NSLLIB="" MAKE=make diff --git a/examples/nw.ini b/examples/nw.ini index f38ec55..36e2f4b 100644 --- a/examples/nw.ini +++ b/examples/nw.ini @@ -13,7 +13,7 @@ # Syntax of this config-file: -# - everything after a "#" is not treated as a comment (particularly +# - everything after a "#" is treated as a comment (particularly # it does never belong to the values themselves) # - entries _must_ begin with a number, indicating the section # they belong to @@ -160,7 +160,7 @@ # Section 4: IPX-devices (strongly recommended) # # This section contains information for the ipx-router built into mars_nwe -# and/or the external program "ipxrouted". +# and/or the external program "nwrouted". # Both processes exchange the ipx-packets between your machine and the rest # of the world (in other words: their functionallity is essential). Of # course, to use one of both is already sufficient. @@ -272,9 +272,9 @@ # # FLAG: # 0 enforce encryption of _all_ passwords by the DOS-client -# (disables changing of password from the clients) +# (default) # 1 as "0", but allow the non-encrypted version of the -# "change password"-routine. (default) +# "change password"-routine. # 7 allow all non-encrypted stuff but no empty nwe passwords. # 8 allow all non-encrypted stuff and also allow empty # nwe-passwords. @@ -283,7 +283,7 @@ # this will *not* work with all clients !! (OS2/client) # ------------------------------------------------------------------------- -7 1 +7 0 # Section 8: currently not used diff --git a/makefile.unx b/makefile.unx index e709677..cb1a962 100644 --- a/makefile.unx +++ b/makefile.unx @@ -1,5 +1,5 @@ #if 0 -#makefile.unx 20-May-96 +#makefile.unx 10-Jul-96 #endif VPATH=$(V_VPATH) @@ -9,7 +9,7 @@ C=.c V_H=0 V_L=97 -P_L=7 +P_L=9 #define D_P_L 1 DISTRIB=mars_nwe @@ -40,6 +40,9 @@ distclean: $(DESTMAKEFILE) install: $(DESTMAKEFILE) $(MAKE) -f $(DESTMAKEFILE) n_$@ +reboot: $(DESTMAKEFILE) + $(MAKE) -f $(DESTMAKEFILE) n_$@ + install_ini: $(DESTMAKEFILE) $(MAKE) -f $(DESTMAKEFILE) n_$@ @@ -184,6 +187,11 @@ echo "********************************************************"; \ echo ""; \ fi; cd $(OBJDIR) ) +n_reboot: n_install + -nwserv -k + sleep 5 + nwserv + clean_d: cd $(VPATH) && (\ find $(DISTRIB) \( -name .e.pck -o -name '~*' -o -name '*~' -o -name core \) \ @@ -220,7 +228,7 @@ make_dir: n_diff: make_dir clean_d cd $(VPATH) && ( \ - makepatch $(DISTRIB).org $(DISTRIB) > $(PATCHF) \ + makepatch org/$(DISTRIB) $(DISTRIB) > $(PATCHF) \ ; gzip -9 -f $(PATCHF) \ ; cd $(OBJDIR) ) diff --git a/namspace.c b/namspace.c index 8513420..946e7ba 100644 --- a/namspace.c +++ b/namspace.c @@ -567,27 +567,27 @@ static int build_dir_info(DIR_BASE_ENTRY *dbe, uint32 infomask, uint8 *p) p +=2; } else p+=6; if (infomask & INFO_MSK_CREAT_INFO) { - xun_time_2_nw(stb->st_mtime, p); + un_time_2_nw(stb->st_mtime, p, 0); p +=2; - xun_date_2_nw(stb->st_mtime, p); + un_date_2_nw(stb->st_mtime, p, 0); p +=2; U32_TO_32(1, p); p +=4; } else p+=8; if (infomask & INFO_MSK_MODIFY_INFO) { - xun_time_2_nw(stb->st_mtime, p); + un_time_2_nw(stb->st_mtime, p, 0); p +=2; - xun_date_2_nw(stb->st_mtime, p); + un_date_2_nw(stb->st_mtime, p, 0); p +=2; U32_TO_32(1, p); p +=4; - xun_date_2_nw(stb->st_atime, p); /* access date */ + un_date_2_nw(stb->st_atime, p, 0); /* access date */ p +=2; } else p+=10; if (infomask & INFO_MSK_ARCHIVE_INFO) { - xun_time_2_nw(0, p); + un_time_2_nw(0, p, 0); p +=2; - xun_date_2_nw(0, p); + un_date_2_nw(0, p, 0); p +=2; U32_TO_32(0, p); p +=4; diff --git a/ncpserv.c b/ncpserv.c index acd746c..d47013c 100644 --- a/ncpserv.c +++ b/ncpserv.c @@ -67,8 +67,7 @@ static void write_to_nwserv(int what, int connection, int mode, break; case 0x4444 : /* tell the wdog there's no need to look 0 */ - /* fast activate wdog to free connection 1 */ - /* slow activate wdog to free connection 2 */ + /* activate wdogs to free connection 1 */ /* the connection ist closed 99 */ write(FD_NWSERV, &what, sizeof(int)); write(FD_NWSERV, &connection, sizeof(int)); @@ -93,8 +92,8 @@ static void write_to_nwserv(int what, int connection, int mode, #define nwserv_insert_conn(connection, adr, size) \ write_to_nwserv(0x2222, (connection), 0, (adr), (size)) -#define nwserv_handle_wdog(connection, mode) \ - write_to_nwserv(0x4444, (connection), (mode), NULL, 0) +#define nwserv_activate_wdogs() \ + write_to_nwserv(0x4444, 0, 1, NULL, 0) #define nwserv_reset_wdog(connection) \ write_to_nwserv(0x4444, (connection), 0, NULL, 0) @@ -156,11 +155,13 @@ typedef struct { static CONNECTION connections[MAX_CONNECTIONS]; static int anz_connect=0; /* actual count connections */ +#define L_MAX_CONNECTIONS MAX_CONNECTIONS + static int new_conn_nr(void) { int j = -1; if (!anz_connect){ /* init all */ - j = MAX_CONNECTIONS; + j = L_MAX_CONNECTIONS; while (j--) { connections[j].fd = -1; connections[j].pid = -1; @@ -169,7 +170,7 @@ static int new_conn_nr(void) return(1); } j = -1; - while (++j < MAX_CONNECTIONS) { + while (++j < L_MAX_CONNECTIONS) { CONNECTION *c=&(connections[j]); if (c->fd < 0 && c->pid < 0) { if (++j > anz_connect) anz_connect=j; @@ -177,9 +178,7 @@ static int new_conn_nr(void) } } /* nothing free */ - j=0; - while (j++ < MAX_CONNECTIONS) - nwserv_handle_wdog(j, 2); /* slow activate wdog */ + nwserv_activate_wdogs(); return(0); /* nothing free */ } @@ -347,7 +346,7 @@ static int find_get_conn_nr(ipxAddr_t *addr) } } } - if (connection) { + if (connection>0) { uint8 buff[sizeof(ipxAddr_t)+sizeof(uint16)+sizeof(uint32)]; memcpy(buff, addr, sizeof(ipxAddr_t)); #if CALL_NWCONN_OVER_SOCKET @@ -557,7 +556,7 @@ static void handle_ncp_request(void) ncp_response(0x3333, ncprequest->sequence, connection, - 1, /* task */ + 0, /* task here is 0 !? */ 0x0, /* completition */ 0, /* conn status */ 0); @@ -565,13 +564,20 @@ static void handle_ncp_request(void) } } } - XDPRINTF((10,0, "c->fd = %d", c->fd)); } + /* here someting is wrong */ + XDPRINTF((1,0, "Not ok:0x%x,%s,fd=%d,conn=%d of %d", + type, + visable_ipx_adr(&from_addr), + c->fd, + ncprequest->connection, + anz_connect)); + } else { + /* here the connection number is wrong */ + XDPRINTF((1,0, "Not ok:0x%x conn=%d of %d conns", + type, ncprequest->connection, + anz_connect)); } - /* here someting is wrong */ - XDPRINTF((1,0, "GOT 0x%x connection=%d of %d conns not OK", - type, ncprequest->connection, anz_connect)); - if (type == 0x5555 || (type == 0x2222 && ncprequest->function == 0x19)) { compl = 0; cstat = 0; @@ -579,16 +585,13 @@ static void handle_ncp_request(void) compl = 0; cstat = 1; } - ncp_response(0x3333, ncprequest->sequence, ncprequest->connection, - 1, /* task */ + (type== 0x5555) ? 0 : 1, /* task */ compl, /* completition */ cstat, /* conn status */ 0); - - #if !CALL_NWCONN_OVER_SOCKET /* here comes a call from nwbind */ } else if (type == 0x3333 diff --git a/net.h b/net.h index 0f3a863..3b3a0e2 100644 --- a/net.h +++ b/net.h @@ -65,19 +65,39 @@ extern int errno; #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif -#define U16_TO_BE16(u, b) { uint16 a=(u); \ +#ifdef SPARC +# define U16_TO_BE16 X_U16_TO_16 +# define U32_TO_BE32 X_U32_TO_32 +# define U16_TO_16 X_U16_TO_BE16 +# define U32_TO_32 X_U32_TO_BE32 +#else +# define U16_TO_BE16 X_U16_TO_BE16 +# define U32_TO_BE32 X_U32_TO_BE32 +# define U16_TO_16 X_U16_TO_16 +# define U32_TO_32 X_U32_TO_32 +#endif + +#define X_U16_TO_BE16(u, b) { uint16 a=(uint16)(u); \ *( (uint8*) (b) ) = *( ((uint8*) (&a)) +1); \ *( ((uint8*) (b)) +1) = *( (uint8*) (&a)); } - -#define U32_TO_BE32(u, ar) { uint32 a= (u); uint8 *b= ((uint8*)(ar))+3; \ +#if 0 +/* I don't know anymore why I did coded it in this form */ +#define X_U32_TO_BE32(u, ar) { uint32 a= (uint32)(u); uint8 *b= ((uint8*)(ar))+3; \ *b-- = (uint8)a; a >>= 8; \ *b-- = (uint8)a; a >>= 8; \ *b-- = (uint8)a; a >>= 8; \ *b = (uint8)a; } +#else +#define X_U32_TO_BE32(u, b) { uint32 a=(uint32)(u); \ + *( (uint8*) (b)) = *( ((uint8*) (&a))+3); \ + *( ((uint8*) (b)) +1) = *( ((uint8*) (&a))+2); \ + *( ((uint8*) (b)) +2) = *( ((uint8*) (&a))+1); \ + *( ((uint8*) (b)) +3) = *( (uint8*) (&a)); } +#endif -#define U16_TO_16(u, b) { uint16 a=(u); memcpy(b, &a, 2); } -#define U32_TO_32(u, b) { uint32 a=(u); memcpy(b, &a, 4); } +#define X_U16_TO_16(u, b) { uint16 a=(uint16)(u); memcpy(b, &a, 2); } +#define X_U32_TO_32(u, b) { uint32 a=(uint32)(u); memcpy(b, &a, 4); } #define GET_BE16(b) ( (int) *(((uint8*)(b))+1) \ | ( ( (int) *( (uint8*)(b) ) << 8) ) ) @@ -96,6 +116,7 @@ extern int errno; | ( ((uint32) *(((uint8*)(b))+2) ) << 16) \ | ( ((uint32) *(((uint8*)(b))+3) ) << 24) ) + #define MAX_U32 ((uint32)0xffffffffL) #define MAX_U16 ((uint16)0xffff) @@ -181,6 +202,10 @@ extern int errno; # define IPX_DATA_GR_546 1 #endif +#ifndef USE_MMAP +# define USE_MMAP 1 +#endif + #ifndef WITH_NAME_SPACE_CALLS # define WITH_NAME_SPACE_CALLS 0 #endif diff --git a/nwbind.c b/nwbind.c index e5926d2..fe552ed 100644 --- a/nwbind.c +++ b/nwbind.c @@ -1,5 +1,5 @@ /* nwbind.c */ -#define REVISION_DATE "19-Jun-96" +#define REVISION_DATE "12-Jul-96" /* NCP Bindery SUB-SERVER */ /* authentification and some message handling */ @@ -44,22 +44,6 @@ static void write_to_nwserv(int what, int connection, int mode, char *data, int size) { switch (what) { - case 0x2222 : /* insert wdog connection */ - write(FD_NWSERV, &what, sizeof(int)); - write(FD_NWSERV, &connection, sizeof(int)); - write(FD_NWSERV, &size, sizeof(int)); - write(FD_NWSERV, data, size); /* ipxAddr_t */ - break; - - case 0x4444 : /* tell the wdog there's no need to look 0 */ - /* fast activate wdog to free connection 1 */ - /* slow activate wdog to free connection 2 */ - /* the connection ist closed 99 */ - write(FD_NWSERV, &what, sizeof(int)); - write(FD_NWSERV, &connection, sizeof(int)); - write(FD_NWSERV, &mode, sizeof(int)); - break; - case 0x6666 : /* send to client that server holds message */ write(FD_NWSERV, &what, sizeof(int)); write(FD_NWSERV, &connection, sizeof(int)); @@ -1058,6 +1042,7 @@ static void handle_fxx(int gelen, int func) internal_act=1; result=nw_keychange_passwd(obj.id, act_c->crypt_key, rdata, (int)*p, p+1, act_c->object_id); + if (!result) test_ins_unx_user(obj.id); internal_act = 0; } diff --git a/nwconn.c b/nwconn.c index 3d7b7ea..7d62f65 100644 --- a/nwconn.c +++ b/nwconn.c @@ -26,6 +26,8 @@ #include "nwqueue.h" #include "namspace.h" +int act_connection = 0; +int act_pid = 0; #define FD_NCP_OUT 3 @@ -179,7 +181,7 @@ static int handle_ncp_serv(void) if (!nw_get_fs_usage(xdata->name, &fsp)) { int sector_scale=1; while (fsp.fsu_blocks/sector_scale > 0xffff) - sector_scale*=2; + sector_scale+=2; U16_TO_BE16(sector_scale, xdata->sec_per_block); U16_TO_BE16(fsp.fsu_blocks/sector_scale, xdata->total_blocks); U16_TO_BE16(fsp.fsu_bavail/sector_scale, xdata->avail_blocks); @@ -384,7 +386,7 @@ static int handle_ncp_serv(void) /******** Allocate Permanent DIR Handle **/ || *p == 0x13 /* Allocate Temp Dir Handle */ /******** Allocate Temp DIR Handle **/ - || *p == 0x16) { /* Allocate spez Temp Dir Handle */ + || *p == 0x16) { /* Allocate Special Temp Dir Handle */ /******** Allocate spez temp DIR Handle **/ struct XDATA { uint8 dirhandle; /* new Dir Handle */ @@ -406,7 +408,8 @@ static int handle_ncp_serv(void) } else if (*p == 0x14){ /* deallocate Dir Handle */ /******** Free DIR Handle ****************/ - int err_code = nw_free_dir_handle((int)*(p+1)); + int err_code = nw_free_dir_handle((int)*(p+1), + (int)(ncprequest->task)); if (err_code) completition = (uint8) -err_code; } else if (*p == 0x15){ /* liefert Volume Information */ /******** Get Volume Info with Handle ****/ @@ -429,7 +432,7 @@ static int handle_ncp_serv(void) if (!nw_get_fs_usage(xdata->name, &fsp)) { int sector_scale=1; while (fsp.fsu_blocks/sector_scale > 0xffff) - sector_scale*=2; + sector_scale+=2; U16_TO_BE16(sector_scale, xdata->sectors); U16_TO_BE16(fsp.fsu_blocks/sector_scale, xdata->total_blocks); U16_TO_BE16(fsp.fsu_bavail/sector_scale, xdata->avail_blocks); @@ -537,6 +540,8 @@ static int handle_ncp_serv(void) } else if (*p == 0x25){ /* setting FILE INFO ??*/ /* TODO !!!!!!!!!!!!!!!!!!!! */ + + do_druck++; } else if (*p == 0x26) { /* Scan file or Dir for ext trustees */ @@ -798,13 +803,11 @@ static int handle_ncp_serv(void) break; case 0x18 : /* End of Job */ - nw_free_handles((ncprequest->task > 0) ? - (int) (ncprequest->task) : 1); - + nw_free_handles(ncprequest->task); break; case 0x19 : /* logout, some of this call is handled in ncpserv. */ - nw_free_handles(0); + nw_free_handles(-1); set_default_guid(); nw_setup_home_vol(-1, NULL); return(-1); /* nwbind must do rest */ @@ -1095,21 +1098,22 @@ static int handle_ncp_serv(void) } break; - case 0x46 : /* chmod file ??? */ + case 0x46 : /* set file attributes */ { struct INPUT { uint8 header[7]; /* Requestheader */ - uint8 attrib; /* 0x80, od 0x0 */ - /* 0x80 for example for sharable */ - uint8 dir_handle; /* ??? z.B.0x1 */ - uint8 modus; /* z.B.0x6 */ + uint8 access; /* 0x80, od 0x0 */ + /* 0x80 for example is shared */ + uint8 dir_handle; + uint8 attrib; /* search attrib */ uint8 len; - uint8 data[2]; /* Name */ + uint8 data[2]; /* filename */ } *input = (struct INPUT *)ncprequest; completition = (uint8) (-nw_chmod_datei((int)input->dir_handle, input->data, (int)input->len, - (int)input->modus)); + (int)input->attrib, + (int)input->access)); } break; @@ -1454,7 +1458,7 @@ static int fl_get_int=0; static void sig_quit(int rsig) { XDPRINTF((2, 0, "Got Signal=%d", rsig)); - fl_get_int=2; + fl_get_int=-1; } static void sig_pipe(int rsig) @@ -1465,14 +1469,14 @@ static void sig_pipe(int rsig) static void sig_hup(int rsig) { - fl_get_int=1; + if (!fl_get_int) fl_get_int=1; signal(SIGHUP, sig_hup); } static void get_new_debug(void) { get_ini_debug(3); - fl_get_int=0; + if (fl_get_int > 0) fl_get_int=0; } static void set_sig(void) @@ -1500,8 +1504,9 @@ int main(int argc, char **argv) father_pid, *(argv+2), *(argv+3))); adr_to_ipx_addr(&from_addr, *(argv+2)); - + act_connection = atoi(*(argv+3)); if (nw_init_connect()) exit(1); + act_pid = getpid(); sscanf(argv[4], "%x", &sock_nwbind); @@ -1537,11 +1542,11 @@ int main(int argc, char **argv) U16_TO_BE16(0x3333, ncpresponse->type); ncpresponse->task = (uint8) 1; /* allways 1 */ ncpresponse->reserved = (uint8) 0; /* allways 0 */ - ncpresponse->connection = (uint8) atoi(*(argv+3)); + ncpresponse->connection = (uint8)act_connection; set_sig(); - while (1) { + while (fl_get_int >= 0) { int data_len = read(0, readbuff, sizeof(readbuff)); /* this read is a pipe or a socket read, * depending on CALL_NWCONN_OVER_SOCKET @@ -1549,8 +1554,8 @@ int main(int argc, char **argv) ncpresponse->connect_status = (uint8) 0; if (fl_get_int) { - if (fl_get_int == 1) get_new_debug(); - else if (fl_get_int == 2) break; + if (fl_get_int == 1) get_new_debug(); + else if (fl_get_int < 0) break; } if (data_len > 0) { diff --git a/nwconn.h b/nwconn.h new file mode 100644 index 0000000..601770a --- /dev/null +++ b/nwconn.h @@ -0,0 +1,6 @@ +#ifndef _NWCONN_H_ +#define _NWCONN_H_ +extern int act_connection; +extern int act_pid; +#endif + diff --git a/nwcrypt.c b/nwcrypt.c index eadc0b7..d427425 100644 --- a/nwcrypt.c +++ b/nwcrypt.c @@ -212,7 +212,7 @@ nw_encrypt(unsigned char *fra,unsigned char *buf,unsigned char *til) /* =========== next is from Guntram Blohm ! =============== */ -char newshuffle[256+16] = { +static char newshuffle[256+16] = { 0x0f, 0x08, 0x05, 0x07, 0x0c, 0x02, 0x0e, 0x09, 0x00, 0x01, 0x06, 0x0d, 0x03, 0x04, 0x0b, 0x0a, 0x02, 0x0c, 0x0e, 0x06, 0x0f, 0x00, 0x01, 0x08, @@ -258,7 +258,7 @@ char newshuffle[256+16] = { }; -int nw_decrypt_newpass(char *oldpwd, char *newpwd, char *undecr) +void nw_decrypt_newpass(char *oldpwd, char *newpwd, char *undecr) { int i, j, n; unsigned char ch, cl; @@ -297,3 +297,43 @@ int nw_decrypt_newpass(char *oldpwd, char *newpwd, char *undecr) memcpy(undecr, copy, 8); } + +void newpassencrypt(char *old, char *new, char *out) +{ + char *p, *bx; + char copy[8]; + int i, di, ax; + char cl, dl, ch; + + memcpy(copy, new, 8); + + for (i=0; i<16; i++) + { + for (di=0, ax=0, p=old; di<8; di++, ax+=0x20, p++) + { + cl=newshuffle[(((copy[di]^*p)>>4)&0x0f)+ax+0x10]<<4; + dl=newshuffle[((copy[di]^*p)&0xf)+ax]; + copy[di]=cl|dl; + } + + ch=old[7]; + for (bx=old+7; bx>old; bx--) + { + *bx=((bx[-1]>>4)&0x0f)|((*bx)<<4); + } + *old=((ch>>4)&0x0f)|(*old)<<4; + + memset(out, '\0', 8); + + for (di=0; di<16; di++) + { + if (newshuffle[di+0x100]&1) + ch=((copy[newshuffle[di+0x100]/2]>>4)&0x0f); + else + ch=copy[newshuffle[di+0x100]/2]&0x0f; + out[di/2]|=((di&1) ? ch<<4 : ch); + } + memcpy(copy, out, 8); + } +} + diff --git a/nwcrypt.h b/nwcrypt.h index 19cee4d..34a4517 100644 --- a/nwcrypt.h +++ b/nwcrypt.h @@ -1,4 +1,4 @@ -/* nwcrypt.h 19-Jun-96 */ +/* nwcrypt.h 22-Jun-96 */ extern void shuffle(unsigned char *lon, const unsigned char *buf, int buflen, unsigned char *target); @@ -7,5 +7,6 @@ extern void nw_encrypt(unsigned char *fra, unsigned char *buf,unsigned char *til); -extern int nw_decrypt_newpass(char *oldpwd, char *newpwd, char *undecr); +extern void nw_decrypt_newpass(char *oldpwd, char *newpwd, char *undecr); +extern void newpassencrypt(char *old, char *new, char *out); diff --git a/nwdbm.c b/nwdbm.c index 0e1573e..31f3af1 100644 --- a/nwdbm.c +++ b/nwdbm.c @@ -1,4 +1,4 @@ -/* nwdbm.c 20-Jun-96 data base for mars_nwe */ +/* nwdbm.c 12-Jul-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 @@ -42,7 +42,7 @@ #define DBM_REMAINS_OPEN 1 int tells_server_version=0; -int password_scheme=PW_SCHEME_CHANGE_PW; +int password_scheme=0; /* PW_SCHEME_CHANGE_PW; */ static datum key; static datum data; @@ -1185,10 +1185,13 @@ int nw_set_passwd(uint32 obj_id, char *password, int dont_ch) */ int nw_keychange_passwd(uint32 obj_id, uint8 *cryptkey, uint8 *oldpass, int cryptedlen, uint8 *newpass, uint32 act_id) +/* returns 1 if new password is zero */ { uint8 storedpass[200]; uint8 keybuff[8]; char buf[100]; + uint8 s_uid[4]; + int len; int result = loc_nw_test_passwd(keybuff, storedpass, obj_id, cryptkey, oldpass); @@ -1205,8 +1208,6 @@ int nw_keychange_passwd(uint32 obj_id, uint8 *cryptkey, uint8 *oldpass, if (result < 0) { /* wrong passwd */ if (1 == act_id) { /* supervisor is changing passwd */ - uint8 buf[8]; - uint8 s_uid[4]; U32_TO_BE32(obj_id, s_uid); shuffle(s_uid, buf, 0, storedpass); nw_encrypt(cryptkey, storedpass, keybuff); @@ -1223,7 +1224,10 @@ int nw_keychange_passwd(uint32 obj_id, uint8 *cryptkey, uint8 *oldpass, nw_decrypt_newpass(storedpass+8, newpass+8, newpass+8); XDPRINTF((5, 0, "realnew: %s", hex_str(buf,newpass, 16))); nw_set_enpasswd(obj_id, newpass, 0); - return(0); + /* testing for zero password */ + U32_TO_BE32(obj_id, s_uid); + shuffle(s_uid, buf, 0, storedpass); + return(memcmp(newpass, storedpass, 16) ? 0 : 1); } int prop_add_new_member(uint32 obj_id, int prop_id, uint32 member_id) @@ -1321,7 +1325,15 @@ static void add_user_to_group(uint32 u_id, uint32 g_id) } -static void add_user(uint32 u_id, uint32 g_id, +static void add_user_2_unx(uint32 u_id, char *unname) +{ + if (unname && *unname) + nw_new_obj_prop(u_id, NULL, 0 , 0 , 0 , + "UNIX_USER", P_FL_ITEM, 0x33, + (char*)unname, strlen(unname)); +} + +static void add_user_g(uint32 u_id, uint32 g_id, char *name, char *unname, char *password, int dont_ch) { @@ -1331,11 +1343,7 @@ static void add_user(uint32 u_id, uint32 g_id, XDPRINTF((1, 0, "Add/Change User='%s', UnixUser='%s'", name, unname)); add_user_to_group(u_id, g_id); - if (unname && *unname) - nw_new_obj_prop(u_id, NULL, 0 , 0 , 0 , - "UNIX_USER", P_FL_ITEM, 0x33, - (char*)unname, strlen(unname)); - + add_user_2_unx(u_id, unname); if (password && *password) { if (*password == '-') *password='\0'; nw_set_passwd(u_id, password, dont_ch); @@ -1408,6 +1416,20 @@ static uint8 *test_add_dir(uint8 *unixname, uint8 *pp, int shorten, return(pp); } +void test_ins_unx_user(uint32 id) +{ + NETOBJ obj; + obj.id = id; + if ((MYPASSWD*)NULL == nw_getpwnam(id) && !nw_get_obj(&obj)){ + struct passwd *pw; + uint8 unxname[50]; + xstrcpy(unxname, obj.name); + downstr(unxname); + pw = getpwnam(unxname); + if (NULL != pw && pw->pw_uid) /* only non root user */ + add_user_2_unx(id, unxname); + } +} int nw_fill_standard(char *servername, ipxAddr_t *adr) /* fills the standardproperties */ @@ -1416,13 +1438,15 @@ int nw_fill_standard(char *servername, ipxAddr_t *adr) uint32 su_id = 0x00000001; uint32 ge_id = 0x01000001; uint32 serv_id = 0x03000001; - uint32 pserv_id = 0L; uint32 q1_id = 0x0E000001; #if 0 uint32 guest_id = 0x02000001; uint32 nbo_id = 0x0B000001; uint32 ngr_id = 0x0C000001; uint32 ps1_id = 0x0D000001; +#endif +#if _MAR_TESTS_ + uint32 pserv_id = 0L; #endif FILE *f = open_nw_ini(); int auto_ins_user = 0; @@ -1500,7 +1524,7 @@ int nw_fill_standard(char *servername, ipxAddr_t *adr) if (what == 14) add_group(nname, uname, password); else - add_user((12 == what) ? su_id : 0L, ge_id, nname, + add_user_g((12 == what) ? su_id : 0L, ge_id, nname, uname, password, 0); } } else if (15 == what) { @@ -1539,7 +1563,7 @@ int nw_fill_standard(char *servername, ipxAddr_t *adr) char nname[100]; xstrcpy(nname, pw->pw_name); upstr(nname); - add_user(0L, ge_id, nname, pw->pw_name, auto_ins_passwd, + add_user_g(0L, ge_id, nname, pw->pw_name, auto_ins_passwd, (auto_ins_user == 99) ? 0 : 99); } else { XDPRINTF((1,0, "Unix User:'%s' not added because passwd='%s'", diff --git a/nwdbm.h b/nwdbm.h index 2e99308..f5ab8aa 100644 --- a/nwdbm.h +++ b/nwdbm.h @@ -188,6 +188,8 @@ extern int nw_keychange_passwd(uint32 obj_id, extern int nw_get_q_dirname(uint32 q_id, uint8 *buff); extern int nw_get_q_prcommand(uint32 q_id, uint8 *buff); +extern void test_ins_unx_user(uint32 id); + extern int nw_fill_standard(char *servername, ipxAddr_t *adr); extern int nw_init_dbm(char *servername, ipxAddr_t *adr); #endif diff --git a/nwfile.c b/nwfile.c index 0221395..d412c88 100644 --- a/nwfile.c +++ b/nwfile.c @@ -26,6 +26,10 @@ #include "nwvolume.h" #include "nwfile.h" #include "connect.h" +#include "nwconn.h" +#if USE_MMAP +# include +#endif static FILE_HANDLE file_handles[MAX_FILE_HANDLES_CONN]; static int anz_fhandles=0; @@ -68,7 +72,16 @@ static int free_file_handle(int fhandle) if (fh->fh_flags & FH_IS_PIPE_COMMAND) { if (fh->f) ext_pclose(fh->f); fh->f = NULL; - } else close(fh->fd); + } else { +#if USE_MMAP + if (fh->p_mmap) { + munmap(fh->p_mmap, fh->size_mmap); + fh->p_mmap = NULL; + fh->size_mmap = 0; + } +#endif + close(fh->fd); + } if (fh->tmodi > 0L && !(FH_IS_PIPE_COMMAND & fh->fh_flags) && !(FH_IS_READONLY & fh->fh_flags) ) { /* now set date and time */ @@ -105,15 +118,29 @@ int file_creat_open(int volume, uint8 *unixname, struct stat *stbuff, /* * creatmode: 0 = open | 1 = creat | 2 = creatnew & 4 == save handle * attrib ?? - * access: 0x1=readonly, 0x2=writeonly, 0x4=deny read, 0x5=deny write + * + * access: 0x1=read, + * 0x2=write, + * 0x4=deny read, -> F_WRLCK + * 0x8=deny write -> F_RDLCK + * 0x10=SH_COMPAT + * + * 0x09 (O_RDONLY | O_DENYWRITE); + * 0x05 (O_RDONLY | O_DENYREAD); + * + * 0x0b (O_RDWR | O_DENYWRITE); + * 0x07 (O_RDWR | O_DENYREAD); + * + * 0x05 (O_RDONLY | O_DENYREAD | O_DENYWRITE); + * 0x07 (O_RDWR | O_DENYREAD | O_DENYWRITE); * */ { int fhandle=new_file_handle(unixname); + int dowrite = (access & 2) || creatmode ; if (fhandle > 0){ FILE_HANDLE *fh=&(file_handles[fhandle-1]); int completition = -0xff; /* no File Found */ - int dowrite = (access & 2) || creatmode ; int voloptions = get_volume_options(volume, 1); if (dowrite && (voloptions & VOL_OPTION_READONLY)) { completition = (creatmode) ? -0x84 : -0x94; @@ -125,7 +152,9 @@ int file_creat_open(int volume, uint8 *unixname, struct stat *stbuff, char *topipe = "READ"; if (creatmode) topipe = "CREAT"; else if (dowrite) topipe = "WRITE"; - sprintf(pipecommand, "%s %s", fh->fname, topipe); + sprintf(pipecommand, "%s %s %d %d", + fh->fname, topipe, + act_connection, act_pid); fh->f = ext_popen(pipecommand, geteuid(), getegid()); fh->fd = (fh->f) ? fileno(fh->f->fildes[1]) : -1; if (fh->fd > -1) { @@ -178,6 +207,43 @@ int file_creat_open(int volume, uint8 *unixname, struct stat *stbuff, } } if (fh->fd > -1) { + if (!(fh->fh_flags & FH_IS_PIPE)) { + /* Not a PIPE */ + if ((access & 0x4) || (access & 0x8)) { + struct flock flockd; + int result; + flockd.l_type = (access & 0x8) ? F_RDLCK : F_WRLCK; + flockd.l_whence = SEEK_SET; + flockd.l_start = 0; + flockd.l_len = 0; + result = fcntl(fh->fd, F_SETLK, &flockd); + XDPRINTF((5, 0, "open shared lock:result=%d", result)); + if (result == -1) { + close(fh->fd); + fh->fd = -1; + completition=-0xfe; + } + } +#if USE_MMAP + if (fh->fd > -1 && !dowrite) { + fh->size_mmap = fh->offd=lseek(fh->fd, 0L, SEEK_END); + if (fh->size_mmap > 0) { + fh->p_mmap = mmap(NULL, + fh->size_mmap, + PROT_READ, + MAP_SHARED, + fh->fd, 0); + if (fh->p_mmap == (uint8*) -1) { + fh->p_mmap = NULL; + fh->size_mmap=0; + } + } + } +#endif + } + } + if (fh->fd > -1) { + if (!dowrite) fh->fh_flags |= FH_IS_READONLY; if (creatmode & 4) fh->fh_flags |= FH_DO_NOT_REUSE; return(fhandle); } @@ -218,7 +284,16 @@ int nw_close_datei(int fhandle, int reset_reuse) if (result > 0) result = 0; } fh->f = NULL; - } else result=close(fh->fd); + } else { +#if USE_MMAP + if (fh->p_mmap) { + munmap(fh->p_mmap, fh->size_mmap); + fh->p_mmap = NULL; + fh->size_mmap = 0; + } +#endif + result=close(fh->fd); + } fh->fd = -1; if (fh->tmodi > 0L && !(fh->fh_flags & FH_IS_PIPE) && !(fh->fh_flags & FH_IS_READONLY)) { @@ -265,19 +340,31 @@ int nw_read_datei(int fhandle, uint8 *data, int size, uint32 offset) } } } else { - if (fh->offd != (long)offset) { - fh->offd=lseek(fh->fd, offset, SEEK_SET); - if (fh->offd < 0) { - XDPRINTF((5,0,"read-file failed in lseek")); +#if USE_MMAP + if (fh->p_mmap) { + if (offset < fh->size_mmap) { + if (size + offset > fh->size_mmap) + size = fh->size_mmap - offset; + memcpy(data, fh->p_mmap+offset, size); + } else size=-1; + } else { +#endif + if (fh->offd != (long)offset) { + fh->offd=lseek(fh->fd, offset, SEEK_SET); + if (fh->offd < 0) { + XDPRINTF((5,0,"read-file failed in lseek")); + } } + if (fh->offd > -1L) { + if ((size = read(fh->fd, data, size)) > -1) + fh->offd+=(long)size; + else { + XDPRINTF((5,0,"read-file failed in read")); + } + } else size = -1; +#if USE_MMAP } - if (fh->offd > -1L) { - if ((size = read(fh->fd, data, size)) > -1) - fh->offd+=(long)size; - else { - XDPRINTF((5,0,"read-file failed in read")); - } - } else size = -1; +#endif } if (size == -1) size=0; return(size); @@ -402,7 +489,10 @@ int nw_lock_datei(int fhandle, int offset, int size, int do_lock) struct flock flockd; int result; if (fh->fh_flags & FH_IS_PIPE) return(0); - flockd.l_type = (do_lock) ? F_WRLCK : F_UNLCK; + flockd.l_type = (do_lock) + ? ((fh->fh_flags & FH_IS_READONLY) ? F_RDLCK + : F_WRLCK) + : F_UNLCK; flockd.l_whence = SEEK_SET; flockd.l_start = offset; flockd.l_len = size; diff --git a/nwfile.h b/nwfile.h index bc5dcd9..068cb70 100644 --- a/nwfile.h +++ b/nwfile.h @@ -6,6 +6,10 @@ typedef struct { int fd; /* filehandle from system open/creat */ long offd; /* actual file offset */ +#if USE_MMAP + uint8 *p_mmap; /* for use with mmap */ + int size_mmap; +#endif time_t tmodi; /* modification TIME */ FILE_PIPE *f; /* for PIPE */ int fh_flags; /* 2 = PIPE */ diff --git a/nwroute.c b/nwroute.c index b67f0f4..9d48b1f 100644 --- a/nwroute.c +++ b/nwroute.c @@ -529,12 +529,12 @@ static void send_sap_broadcast(int mode) } } -static FILE *open_route_info_fn(void) +static FILE *open_route_info_fn(int force) { static int tacs=0; FILE *f=NULL; if (print_route_tac > 0) { - if (!tacs) { + if (!tacs || force) { if (NULL != (f=fopen(pr_route_info_fn, (print_route_mode) ? "w" : "a"))) { tacs = print_route_tac-1; @@ -544,11 +544,14 @@ static FILE *open_route_info_fn(void) return(f); } -void print_routing_info(void) +void print_routing_info(int force) { - FILE *f= open_route_info_fn(); + FILE *f= open_route_info_fn(force); if (f) { int k=-1; + time_t xtime; + time(&xtime); + fprintf(f, "%s", ctime(&xtime) ); fprintf(f, "<--------- Devices ---------------->\n"); fprintf(f, "%-15s %-15s %5s Network Status\n", "DevName", "Frame", "Ticks"); while (++k < anz_net_devices) { @@ -589,12 +592,18 @@ void print_routing_info(void) } } +static int look_for_interfaces(void); + + void send_sap_rip_broadcast(int mode) /* mode=0, standard broadcast */ /* mode=1, first trie */ /* mode=2, shutdown */ { static int flipflop=1; + int force_print_routes=(mode == 1); + if (auto_creat_interfaces) + force_print_routes = look_for_interfaces(); if (mode) { send_rip_broadcast(mode); send_sap_broadcast(mode); @@ -607,7 +616,8 @@ static int flipflop=1; flipflop=1; } } - if (flipflop) print_routing_info(); /* every second time */ + if (flipflop || force_print_routes) + print_routing_info(force_print_routes); /* every second time */ } static void query_sap_on_net(uint32 net) @@ -667,6 +677,7 @@ int test_ins_device_net(uint32 rnet) foundfree = k; } else if (nd->net == rnet) return(0); } + if ((rnetframe=get_interface_frame_name(rnetdevname, rnet)) < 0) return(0); @@ -737,3 +748,49 @@ int test_ins_device_net(uint32 rnet) } return(1); } + +static int look_for_interfaces(void) +{ + FILE *f=fopen("/proc/net/ipx_interface", "r"); + int find_diffs=0; + if (f) { + char buff[200]; + NW_NET_DEVICE *nd; + int k = -1; + + while (++k < anz_net_devices) { + nd=net_devices[k]; + if (nd->is_up == 2) nd->is_up = -2; /* this will be put DOWN */ + } + + while (fgets((char*)buff, sizeof(buff), f) != NULL){ + uint32 rnet; + uint8 dname[25]; + int flags; + int fframe = read_interface_data((uint8*) buff, &rnet, NULL, &flags, dname); + if (fframe < 0) continue; + if (rnet > 0L && !(flags & 2)) { + int found=0; + k=-1; + while (++k < anz_net_devices) { + nd=net_devices[k]; + if (nd->net == rnet) { + found++; + break; + } + } + if (found && nd->is_up) { + if (nd->is_up == -2) nd->is_up=2; /* reset */ + } else find_diffs=test_ins_device_net(rnet); + } + } + fclose(f); + + k = -1; + while (++k < anz_net_devices) { + nd=net_devices[k]; + if (nd->is_up < 0) nd->is_up = 0; /* this will be put DOWN */ + } + } + return(find_diffs); +} diff --git a/nwroute1.c b/nwroute1.c index 25bf791..5cca716 100644 --- a/nwroute1.c +++ b/nwroute1.c @@ -125,7 +125,7 @@ void get_servers(void) #endif } -void print_routing_info(void) +void print_routing_info(int force) { ;; /* DUMMY */ } diff --git a/nwserv.c b/nwserv.c index 9f7eef5..dcafa9b 100644 --- a/nwserv.c +++ b/nwserv.c @@ -406,9 +406,9 @@ static void send_bcast_packet(ipxAddr_t *addr, int conn, int signature) } typedef struct { - ipxAddr_t addr; /* address of client */ - time_t last_time; /* last wdog packet sent */ - int counter; /* max. 11 packets */ + ipxAddr_t addr; /* address of client */ + time_t last_time; /* time of last wdog packet sent */ + int counter; /* max. 11 packets */ } CONN; static CONN conns[MAX_CONNECTIONS]; @@ -422,7 +422,7 @@ static void insert_wdog_conn(int conn, ipxAddr_t *adr) c=&(conns[hi_conn++]); memset(c, 0, sizeof(CONN)); } - c=&(conns[--conn]); + c=&(conns[conn-1]); c->last_time = akttime_stamp; c->counter = 0; if (NULL != adr) memcpy(&(c->addr), adr, sizeof(ipxAddr_t)); @@ -431,22 +431,21 @@ static void insert_wdog_conn(int conn, ipxAddr_t *adr) static void modify_wdog_conn(int conn, int mode) /* mode = 0 : reset */ -/* mode = 1 : force test 1 */ -/* mode = 2 : force test 2 */ +/* mode = 1 : activate */ /* mode = 99 : remove wdog */ { if (conn > 0 && --conn < hi_conn) { CONN *c=&(conns[conn]); if (mode < 99) { - c->last_time = akttime_stamp; switch (mode) { - case 1 : c->counter = MAX_WDOG_TRIES; /* quick test */ - break; - - case 2 : c->counter = max(2, MAX_WDOG_TRIES); /* slow test (activate)*/ + case 1 : /* activate Wdog */ + if (!c->counter) c->counter=1; + c->counter = max(c->counter, MAX_WDOG_TRIES-1); + c->last_time = 1; break; default : c->counter = 0; /* reset */ + c->last_time = akttime_stamp; break; } /* switch */ } else if (mode == 99) { /* remove */ @@ -462,14 +461,14 @@ static void modify_wdog_conn(int conn, int mode) } } -static void send_wdogs(int force) +static void send_wdogs() { int k = hi_conn; while (k--) { CONN *c = &(conns[k]); if (c->last_time) { time_t t_diff = akttime_stamp - c->last_time; - if ( (c->counter && (t_diff > 50 || force)) + if ( (c->counter && t_diff > 50) || t_diff > WDOG_TRIE_AFTER_SEC) { /* max. 5 minutes */ if (c->counter > MAX_WDOG_TRIES) { /* now its enough with trying */ @@ -1016,7 +1015,7 @@ static void get_ini(int full) } else if (!anz_net_devices) { errorp(10, "WARNING:No external devices specified", NULL); } - print_routing_info(); + print_routing_info(1); #endif XDPRINTF((1, 0, "%s name='%s', INTERNAL NET=0x%lx, NODE=0x%02x:%02x:%02x:%02x:%02x:%02x", @@ -1119,6 +1118,7 @@ static void handle_hup_reqest(void) get_ini(0); write_to_ncpserv(0xeeee, 0, NULL, 0); /* inform ncpserv */ write_to_nwbind( 0xeeee, 0, NULL, 0); /* inform nwbind */ + send_sap_rip_broadcast(1); /* firsttime broadcast */ fl_get_int=0; } @@ -1268,15 +1268,18 @@ int main(int argc, char **argv) break; case 0x4444 : /* reset wdog connection = 0 */ - /* force test wdog conn 1 = 1 */ - /* force test wdog conn 2 = 2 */ + /* activate wdogs = 1 */ /* remove wdog = 99 */ if (sizeof(int) == read(p->fd, (char*)&conn, sizeof(int)) && sizeof(int) == read(p->fd, (char*)&what, sizeof(what))) + if (what == 1) { + while (conn++ < hi_conn) { modify_wdog_conn(conn, what); - if (what > 0 && what < 99) call_wdog++; + } + call_wdog++; + } break; case 0x5555 : /* close connection */ @@ -1330,7 +1333,7 @@ int main(int argc, char **argv) bsecs=server_broadcast_secs; broadmillisecs = bsecs*1000+10; } - send_wdogs(call_wdog); + send_wdogs(); broadtime = akttime_stamp; } else { if (call_wdog) send_wdogs(1); diff --git a/nwserv.h b/nwserv.h index c2b8793..b9189a9 100644 --- a/nwserv.h +++ b/nwserv.h @@ -59,7 +59,7 @@ extern void ins_del_bind_net_addr(uint8 *name, int styp, ipxAddr_t *adr); extern void send_server_response(int respond_typ, int styp, ipxAddr_t *to_addr); -extern void print_routing_info(void); +extern void print_routing_info(int force); extern void send_sap_rip_broadcast(int mode); extern void rip_for_net(uint32 net); extern void get_servers(void); diff --git a/nwvolume.c b/nwvolume.c index 09f03a5..613ccd2 100644 --- a/nwvolume.c +++ b/nwvolume.c @@ -260,6 +260,15 @@ static int get_fs_usage(char *path, struct fs_usage *fsp) { struct statfs fsd; if (statfs (path, &fsd) < 0) return (-1); +#if 0 +/* test for a 'big' volume */ +fsd.f_blocks = 3733075; +fsd.f_bfree = 1531638; +fsd.f_bavail = 1338518; +fsd.f_files = 966656; +fsd.f_ffree = 916066; +fsd.f_bsize = 1024; +#endif XDPRINTF((3, 0, "blocks=%d, bfree=%d, bavail=%d, files=%d, ffree=%d, bsize=%d", fsd.f_blocks, fsd.f_bfree, fsd.f_bavail, @@ -270,6 +279,7 @@ static int get_fs_usage(char *path, struct fs_usage *fsp) fsp->fsu_bavail = convert_blocks (fsd.f_bavail); fsp->fsu_files = fsd.f_files; fsp->fsu_ffree = fsd.f_ffree; + return(0); }