From aaa3c6e7ccd64ae63190ffeb79c6645796a973ed Mon Sep 17 00:00:00 2001 From: ncpfs archive import Date: Tue, 28 Apr 2026 20:39:57 +0200 Subject: [PATCH] Import ncpfs 0.3 --- .downloads/ncpfs-0.3.tgz | Bin 0 -> 46498 bytes BUGS | 17 +++++ Changes | 7 ++ Makefile | 4 +- README | 46 ++++++++++-- dir.c | 127 +++++++++++++++++++-------------- inode.c | 24 ++++++- ncpfs-0.2.lsm => ncpfs-0.3.lsm | 8 +-- ncpmount.c | 4 +- sock.c | 2 +- 10 files changed, 170 insertions(+), 69 deletions(-) create mode 100644 .downloads/ncpfs-0.3.tgz create mode 100644 BUGS rename ncpfs-0.2.lsm => ncpfs-0.3.lsm (73%) diff --git a/.downloads/ncpfs-0.3.tgz b/.downloads/ncpfs-0.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..df7691e9d2519a811d0bd3d10cd8cbea4c3cff70 GIT binary patch literal 46498 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

6c@0kP? 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�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 YtyKCS7N&2%-oC(%8|EoMB)~!b4{?t7F8}}l literal 0 HcmV?d00001 diff --git a/BUGS b/BUGS new file mode 100644 index 0000000..cea62ba --- /dev/null +++ b/BUGS @@ -0,0 +1,17 @@ +Maybe you want to look at LIMITATIONS in README. Some might consider +them to be bugs. + +But there are really problems that might be fixed in the future. + +Invalid directory timestamps: +I did not yet find out how to get valid timestamps for directories +from a NetWare server. So I simply return 0, which means 01.01.70. If +anybody knows how to get these values, please mail +lendecke@namu01.gwdg.de. + +'df' returns 0: +Free disk space is distributed among the volumes in NetWare. df is +only able to report one number per mounted filesystem. As connections +are quite expensive for NetWare (with lwared that might change ...), I +rejected the alternative to mount only a single volume for a unix +mount point. So I simply return 0. diff --git a/Changes b/Changes index c9af799..9c6a84c 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,10 @@ +ncpfs-0.2 -> ncpfs-0.3 + +- removed bug in get_pname_static +- removed bug in 'ncpmount -n' +- fake '.' and '..' +- return 0 for df and directory timestamps. See file BUGS + ncpfs-0.1 -> ncpfs-0.2 - should be compileable with gcc other than 2.7.0 diff --git a/Makefile b/Makefile index f41c49e..81f1dfc 100644 --- a/Makefile +++ b/Makefile @@ -6,8 +6,8 @@ INCLUDES = -I/usr/src/linux/include CFLAGS = -Wall -Wstrict-prototypes -O2 -DMODULE -fomit-frame-pointer \ $(INCLUDES) \ - -DDEBUG_NCP_MALLOC # -DDEBUG_NCP=1 -DDEBUG_NCP_MALLOC +# -DDEBUG_NCP_MALLOC CC = gcc -D__KERNEL__ -I. AS = as @@ -52,7 +52,7 @@ clean: rm -f *.o *~ realclean: clean - rm -fr ncpmount ncptest .depend $(DISTFILE) mnt + rm -fr ncpmount ncptest .depend $(DISTFILE) mnt *.out modules: ncpfs.o diff --git a/README b/README index ffdb0cb..e57e845 100644 --- a/README +++ b/README @@ -17,13 +17,46 @@ I use tools written by Greg Page, Caldera. I hope I did not do too much harm to their business. For your convenience I included the file ipx.tar made available by Caldera. -For the curious: the file ncplib.c is usable from user space as well! -Look at the file ncptest.c for a possible use. I use ncptest to check -my assumptions about the widely undocumented NetWare Core -Protocol. Maybe this is the beginning of a free NetWare API for Linux! -I would be happy to receive your comments on this. +My main source of information is a book written in german by Manfred +Hill and Ralf Zessin, "Netzwerkprogrammierung in C", IWT Verlag GmbH, +1995, ISBN 3-88322-491-X. It contains quite a lot of typographical and +other errors, but I find it very valuable as an introduction to NCP +programming. If you know about the concepts and possibilities of NCP, +Ralph Brown's interrupt list becomes much more readable. It's much +easier to find undocumented information if you know what to look for! -LIMITATIONS (compare these with smbfs :-)) + +MAILING LIST + +There is a mailing list for discussing lwared and ncpfs. Here's the +message I received after subscribing: + +--- +Thank you for your subscription to the list "linware". + +Topics for the list: +- discussing LinWare server, its features, installation problems and bugs +- using IPX protocol under Linux +- IPX routing and router daemons under Linux + +Send your list postings to address: "linware@sh.cvut.cz" +Send your list control commands to address: "listserv@sh.cvut.cz" +--- + +You can subscribe to this list by sending a message with a line +'add your_name@your_host linware' to listserv@sh.cvut.cz . + + +NCPLIB + +For the curious: the file ncplib.c is usable from user space as well. +Look at the file ncptest.c for a possible use. I use ncptest to check +my assumptions about the widely undocumented NetWare Core Protocol. +Maybe this is the beginning of a free NetWare API for Linux! I would +be happy to receive your comments on this. + + +LIMITATIONS (compare these with smbfs :-) The limitations ncpfs has are the natural limitations of the NCP protocol, which was designed with MS-DOS based PCs in mind. The first @@ -44,4 +77,3 @@ different. You can never know when the client will access the file-id you offered, so you would have to cache the inode numbers indefinitely long. I think this should not be done in kernel mode, as it would require an unlimited amount of RAM. - diff --git a/dir.c b/dir.c index 6b9ee20..4d96f5d 100644 --- a/dir.c +++ b/dir.c @@ -303,13 +303,34 @@ ncp_readdir(struct inode *inode, struct file *filp, } static int -ncp_read_volume_list(struct ncp_server *server, int start_with, int cache_size) +ncp_read_volume_list(struct ncp_server *server, int fpos, int cache_size) { struct ncp_dirent *entry = c_entry; int total_count = 0; int i; + void fill_one(char *name) + { + if (total_count < fpos) { + DPRINTK("ncp_do_readdir: skipped file: %s\n", name); + } else if (total_count >= fpos + cache_size) { + return; + } else { + DPRINTK("ncp_do_readdir: found file: %s\n", name); + + entry->attr = aDIR; + entry->mtime = 0; + entry->ctime = 0; + entry->atime = 0; + entry->size = 1024; + entry->f_pos = total_count; + strcpy(entry->path, name); + entry += 1; + } + total_count += 1; + } + for (i=0; i 0) { - - if (total_count < start_with) { - DPRINTK("ncp_read_volumes: skipped vol: %s\n", - info.volume_name); - } else if (total_count >= start_with + cache_size) { - return (total_count - start_with); - } else { - DPRINTK("ncp_read_volumes: found vol %s\n", - info.volume_name); - entry->attr = aDIR; - entry->mtime = 0; - entry->ctime = 0; - entry->atime = 0; - entry->size = 1024; - entry->f_pos = total_count; - strcpy(entry->path, info.volume_name); - entry += 1; - } - - total_count += 1; + fill_one(info.volume_name); } } - return (total_count - start_with); + fill_one("."); + fill_one(".."); + return (total_count - fpos); } static int @@ -353,6 +357,41 @@ ncp_do_readdir(struct ncp_server *server, struct inode *dir, int fpos, int total_count = 0; + void fill_one(int attr, char *name, + int upd_time, int upd_date, + int cr_date, int ac_date, int length) + { + if (total_count < fpos) { + DPRINTK("ncp_do_readdir: skipped file: %s\n", name); + } else if (total_count >= fpos + cache_size) { + return; + } else { + DPRINTK("ncp_do_readdir: found file: %s\n", name); + + entry->attr = attr; + if ((attr & aDIR) == 0) { + entry->mtime = date_dos2unix(upd_time, + upd_date); + entry->ctime = date_dos2unix(0, cr_date); + entry->atime = date_dos2unix(0, ac_date); + entry->size = length; + } else { + /* Sorry, I do not know how to get the + * values for directories :-(. Mail + * lendecke@namu01.gwdg.de if you + * know more. */ + entry->mtime = 0; + entry->ctime = 0; + entry->atime = 0; + entry->size = 1024; + } + entry->f_pos = total_count; + strcpy(entry->path, name); + entry += 1; + } + total_count += 1; + } + void doit(int attr) { if (ncp_file_search_init(server, 0, NCP_FINFO(dir)->path, @@ -363,35 +402,20 @@ ncp_do_readdir(struct ncp_server *server, struct inode *dir, int fpos, while (ncp_file_search_continue(server, &fsinfo, attr, "*", &finfo) == 0) { + + fill_one(attr, finfo.file_name, + finfo.update_time, finfo.update_date, + finfo.creation_date, finfo.access_date, + finfo.file_length); - if (total_count < fpos) { - DPRINTK("ncp_do_readdir: skipped file: %s\n", - finfo.file_name); - } else if (total_count >= fpos + cache_size) { - return; - } else { - DPRINTK("ncp_do_readdir: found file: %s\n", - finfo.file_name); - - entry->attr = attr; - entry->mtime = - date_dos2unix(finfo.update_time, - finfo.update_date); - entry->ctime = - date_dos2unix(0, finfo.creation_date); - entry->atime = - date_dos2unix(0, finfo.access_date); - entry->size = (attr & aDIR) != 0 ? - 1024 : finfo.file_length; - entry->f_pos = total_count; - strcpy(entry->path, finfo.file_name); - entry += 1; - } - total_count += 1; + } return; } + fill_one(aDIR, ".", 0, 0, 0, 0, 0); + fill_one(aDIR, "..", 0, 0, 0, 0, 0); + doit(0); doit(aDIR); @@ -480,7 +504,7 @@ get_pname_static(struct inode *dir, const char *name, int len, /* We're at the top */ path[0] = '\0'; - *res_len = 1; + *res_len = 0; return 0; } @@ -497,7 +521,6 @@ get_pname_static(struct inode *dir, const char *name, int len, path[len] = '\0'; } else if (parentlen == 0) { - memcpy(path, name, len); path[len] = ':'; path[len+1] = '\0'; @@ -787,10 +810,10 @@ ncp_lookup(struct inode *dir, const char *__name, int len, i, c_entry[i].path); if (strcmp(c_entry[i].path, __name) == 0) { DPRINTK("ncp_lookup: found in cache!\n"); - finfo = c_entry[i]; - finfo.path = NULL; /* It's not ours! */ - found_in_cache = 1; - break; + finfo = c_entry[i]; + finfo.path = NULL; /* It's not ours! */ + found_in_cache = 1; + break; } i = (i + 1) % c_size; DDPRINTK("ncp_lookup: index %d, name %s failed\n", diff --git a/inode.c b/inode.c index 742158d..05f9e77 100644 --- a/inode.c +++ b/inode.c @@ -34,6 +34,7 @@ extern int close_fp(struct file *filp); static void ncp_put_inode(struct inode *); static void ncp_read_inode(struct inode *); static void ncp_put_super(struct super_block *); +static void ncp_statfs(struct super_block *sb, struct statfs *buf, int bufsiz); static int ncp_notify_change(struct inode *inode, struct iattr *attr); static struct super_operations ncp_sops = { @@ -43,7 +44,7 @@ static struct super_operations ncp_sops = { ncp_put_inode, /* put inode */ ncp_put_super, /* put superblock */ NULL, /* write superblock */ - NULL, /* stat filesystem */ + ncp_statfs, /* stat filesystem */ NULL }; @@ -329,6 +330,27 @@ ncp_put_super(struct super_block *sb) MOD_DEC_USE_COUNT; } +static void +ncp_statfs(struct super_block *sb, struct statfs *buf, int bufsiz) +{ + struct statfs tmp; + + /* We cannot say how much disk space is left on a mounted + NetWare Server, because free space is distributed over + volumes, and the current user might have disk quotas. So + free space is not that simple to determine. Our decision + here is to err conservatively. */ + + tmp.f_type = NCP_SUPER_MAGIC; + tmp.f_bsize = 512; + tmp.f_blocks = 0; + tmp.f_bfree = 0; + tmp.f_bavail = 0; + tmp.f_files = -1; + tmp.f_ffree = -1; + tmp.f_namelen = 12; + memcpy_tofs(buf, &tmp, bufsiz); +} /* DO MORE */ static int diff --git a/ncpfs-0.2.lsm b/ncpfs-0.3.lsm similarity index 73% rename from ncpfs-0.2.lsm rename to ncpfs-0.3.lsm index e2559f8..be0973a 100644 --- a/ncpfs-0.2.lsm +++ b/ncpfs-0.3.lsm @@ -1,14 +1,14 @@ Begin3 Title: ncpfs -Version: 0.2 -Entered-date: 19. October 1995 +Version: 0.3 +Entered-date: 01. November 1995 Description: With ncpfs you can mount volumes of your novell server under Linux. Keywords: filesystem kernel ncp novell netware Author: lendecke@namu01.gwdg.de (Volker Lendecke) Maintained-by: lendecke@namu01.gwdg.de (Volker Lendecke) Primary-site: linux01.gwdg.de:/pub/ncpfs - ~44k ncpfs-0.2.tgz - ~ 1k ncpfs-0.2.lsm + ~45k ncpfs-0.3.tgz + ~ 1k ncpfs-0.3.lsm Copying-policy: GPL End diff --git a/ncpmount.c b/ncpmount.c index 7922945..af49a92 100644 --- a/ncpmount.c +++ b/ncpmount.c @@ -334,7 +334,7 @@ parse_args(int argc, char *argv[], struct ncp_mount_data *data, *got_password = 1; break; case 'n': - data->password[0] = '0'; + data->password[0] = '\0'; *got_password = 1; break; default: @@ -629,7 +629,7 @@ main(int argc, char *argv[]) ment.mnt_fsname = server_name; ment.mnt_dir = fullpath(mount_point); ment.mnt_type = "ncpfs"; - ment.mnt_opts = ""; + ment.mnt_opts = "rw"; ment.mnt_freq = 0; ment.mnt_passno= 0; diff --git a/sock.c b/sock.c index ff79887..11e6bbd 100644 --- a/sock.c +++ b/sock.c @@ -84,7 +84,7 @@ ncp_wdog_data_ready(struct sock *sk, int len) sendto(sock, (void *)packet_buf, 2, 1, 0, (struct sockaddr *)&sender, sizeof(sender)); - printk("send result: %d\n", result); + DPRINTK("send result: %d\n", result); } set_fs(fs); }