diff --git a/.downloads/ncpfs-0.24.tgz b/.downloads/ncpfs-0.24.tgz new file mode 100644 index 0000000..f0d972b Binary files /dev/null and b/.downloads/ncpfs-0.24.tgz differ diff --git a/Changes b/Changes index 5ac2828..56766d1 100644 --- a/Changes +++ b/Changes @@ -1,6 +1,12 @@ I only began this file with ncpfs-0.12. If you're interested in older versions, you can find them on ftp.gwdg.de:/pub/linux/misc/ncpfs/old. +ncpfs-0.23 -> ncpfs-0.24 +- Fixed a bug that made it impossible to umount a filesystem after you + tried 'mkdir .' or 'mkdir ..'. +- Fixed a bad race condition when opening files. +- Made the default timeout values more robust. + ncpfs-0.22 -> ncpfs-0.23 - Fixed a memory allocation problem in nwmsg.c. Thanks to Andrew Ross diff --git a/Makefile b/Makefile index 6cfcaf3..6609631 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ # Makefile for the linux ncp-filesystem routines. # -VERSION = 0.23 +VERSION = 0.24 # If you are using kerneld to autoload ncp support, # uncomment this (kerneld is in linux since about 1.3.57): diff --git a/README b/README index 971d622..830f12a 100644 --- a/README +++ b/README @@ -5,6 +5,14 @@ provided. INSTALLATION +Before you start the installation, make sure that your kernel has IPX +support compiled in. When 'make config' asks you for + +The IPX protocol (CONFIG_IPX) [N/y/m/?] + +simply answer 'y'. Probably you do not need the full internal net that +you are asked for next. + The installation of ncpfs depends on the kernel version you are using. For kernel 1.2, you should simply type 'make' and look at what's in the bin/ directory after that. Please be sure that your diff --git a/kernel-1.2/src/dir.c b/kernel-1.2/src/dir.c index da45557..b1a7f77 100644 --- a/kernel-1.2/src/dir.c +++ b/kernel-1.2/src/dir.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "ncplib_kernel.h" struct ncp_dirent { @@ -827,7 +828,7 @@ ncp_lookup(struct inode *dir, const char *__name, int len, memcpy(name, __name, len); name[len] = 0; - + lock_super(dir->i_sb); result_info = ncp_find_dir_inode(dir, name); if (result_info != 0) @@ -841,6 +842,7 @@ ncp_lookup(struct inode *dir, const char *__name, int len, inode number */ *result = iget(dir->i_sb, ncp_info_ino(server, result_info)); + unlock_super(dir->i_sb); iput(dir); if (*result == NULL) @@ -903,6 +905,7 @@ ncp_lookup(struct inode *dir, const char *__name, int len, } if (res != 0) { + unlock_super(dir->i_sb); iput(dir); return -ENOENT; } @@ -913,10 +916,12 @@ ncp_lookup(struct inode *dir, const char *__name, int len, if (!(*result = ncp_iget(dir, &finfo))) { + unlock_super(dir->i_sb); iput(dir); return -EACCES; } + unlock_super(dir->i_sb); iput(dir); return 0; } @@ -946,6 +951,7 @@ ncp_create(struct inode *dir, const char *name, int len, int mode, _name[len] = '\0'; str_upper(_name); + lock_super(dir->i_sb); if (ncp_open_create_file_or_subdir(NCP_SERVER(dir), NCP_ISTRUCT(dir), _name, OC_MODE_CREATE|OC_MODE_OPEN| @@ -953,6 +959,7 @@ ncp_create(struct inode *dir, const char *name, int len, int mode, 0, AR_READ|AR_WRITE, &finfo) != 0) { + unlock_super(dir->i_sb); iput(dir); return -EACCES; } @@ -965,10 +972,12 @@ ncp_create(struct inode *dir, const char *name, int len, int mode, if (!(*result = ncp_iget(dir, &finfo)) < 0) { ncp_close_file(NCP_SERVER(dir), finfo.file_handle); + unlock_super(dir->i_sb); iput(dir); return -EINVAL; } + unlock_super(dir->i_sb); iput(dir); return 0; } @@ -985,6 +994,7 @@ ncp_mkdir(struct inode *dir, const char *name, int len, int mode) || ( (len == 2) && (name[1] == '.')))) { + iput(dir); return -EEXIST; } diff --git a/kernel-1.2/src/file.c b/kernel-1.2/src/file.c index 6032c07..2ba0d07 100644 --- a/kernel-1.2/src/file.c +++ b/kernel-1.2/src/file.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "ncplib_kernel.h" #include @@ -50,8 +51,10 @@ ncp_make_open(struct inode *i, int right) DPRINTK("ncp_make_open: dirent->opened = %d\n", finfo->opened); + lock_super(i->i_sb); if (finfo->opened == 0) { + finfo->access = -1; /* tries max. rights */ if (ncp_open_create_file_or_subdir(NCP_SERVER(i), NULL, NULL, @@ -69,12 +72,10 @@ ncp_make_open(struct inode *i, int right) { finfo->access = O_RDONLY; } - else - { - return -EACCES; - } } + unlock_super(i->i_sb); + if ( ((right == O_RDONLY) && ( (finfo->access == O_RDONLY) || (finfo->access == O_RDWR))) || ((right == O_WRONLY) && ( (finfo->access == O_WRONLY) diff --git a/kernel-1.2/src/inode.c b/kernel-1.2/src/inode.c index 4ebaa49..d576ae4 100644 --- a/kernel-1.2/src/inode.c +++ b/kernel-1.2/src/inode.c @@ -132,7 +132,9 @@ static void ncp_put_inode(struct inode *inode) { struct nw_file_info *finfo = NCP_FINFO(inode); + struct super_block *sb = inode->i_sb; + lock_super(sb); if (finfo->opened != 0) { if (ncp_close_file(NCP_SERVER(inode), finfo->file_handle)!=0) @@ -155,6 +157,7 @@ ncp_put_inode(struct inode *inode) } clear_inode(inode); + unlock_super(sb); } struct super_block * diff --git a/ncpfs-0.23.lsm b/ncpfs-0.24.lsm similarity index 65% rename from ncpfs-0.23.lsm rename to ncpfs-0.24.lsm index 8832381..72c1444 100644 --- a/ncpfs-0.23.lsm +++ b/ncpfs-0.24.lsm @@ -1,7 +1,7 @@ Begin3 Title: ncpfs -Version: 0.23 -Entered-date: 04. May 1996 +Version: 0.24 +Entered-date: 02. June 1996 Description: With ncpfs you can mount volumes of your netware server under Linux. You can also print to netware print queues and spool netware print queues to the @@ -9,11 +9,11 @@ Description: With ncpfs you can mount volumes of your netware 1.3.71 and above. ncpfs does NOT work with any 1.3.x kernel below 1.3.71. Keywords: filesystem ncp novell netware printing -Author: lendecke@namu01.gwdg.de (Volker Lendecke) -Maintained-by: lendecke@namu01.gwdg.de (Volker Lendecke) +Author: lendecke@namu01.Num.Math.Uni-Goettingen.de (Volker Lendecke) +Maintained-by: lendecke@namu01.Num.Math.Uni-Goettingen.de (Volker Lendecke) Primary-site: ftp.gwdg.de:/pub/linux/misc/ncpfs Alternate-site: sunsite.unc.edu:/pub/system/Filesystems/ncpfs - ~120k ncpfs-0.23.tgz - ~ 1k ncpfs-0.23.lsm + ~120k ncpfs-0.24.tgz + ~ 1k ncpfs-0.24.lsm Copying-policy: GPL End diff --git a/util/ncplib.c b/util/ncplib.c index f54794b..1ad50f6 100644 --- a/util/ncplib.c +++ b/util/ncplib.c @@ -520,7 +520,7 @@ do_ncp_call(struct ncp_conn *conn, int request_size) *((struct ncp_request_header *)(&(conn->packet))); int result; - int retries = 3; + int retries = 20; int len; long err; struct ncp_reply_header *r = @@ -542,7 +542,7 @@ do_ncp_call(struct ncp_conn *conn, int request_size) re_select: len = ipx_recv(conn->ncp_sock, - conn->packet, NCP_PACKET_SIZE, 0, 1, &err); + conn->packet, NCP_PACKET_SIZE, 0, 3, &err); if ( (len == sizeof(*r)) && (r->type == NCP_POSITIVE_ACK)) diff --git a/util/ncplib_err.et b/util/ncplib_err.et index 58905d3..3e785d3 100644 --- a/util/ncplib_err.et +++ b/util/ncplib_err.et @@ -21,10 +21,16 @@ ec NCPL_ET_NO_SPEC, ec NCPL_ET_INVALID_MODE, "$HOME/.nwclient has invalid mode" -ec NCPL_ET_LOGIN_FAILED, - "Login failed" +ec NCPL_ET_LOGIN_DENIED, + "Login denied" ec NCPL_ET_NO_INTERFACE, "No primary IPX interface found" +ec NCPL_ET_NO_PASSWORD, + "Could not get password" + +ec NCPL_ET_PWD_TOO_LONG, + "Password too long" + end \ No newline at end of file