diff options
author | Giuseppe Scrivano <gscrivano@gnu.org> | 2004-12-11 15:44:17 +0000 |
---|---|---|
committer | Giuseppe Scrivano <gscrivano@gnu.org> | 2004-12-11 15:44:17 +0000 |
commit | 731b056ef08d2f77e069795e01c8b7c4c6ccbd75 (patch) | |
tree | 48328f3ab968d943a13975756582517d16197838 |
Initial revision
-rw-r--r-- | COPYING | 339 | ||||
-rw-r--r-- | Makefile | 20 | ||||
-rw-r--r-- | README | 14 | ||||
-rw-r--r-- | samba-3.0.5_hurd.diff | 66 | ||||
-rw-r--r-- | smb.c | 39 | ||||
-rw-r--r-- | smb.h | 43 | ||||
-rw-r--r-- | smbfs.c | 108 | ||||
-rw-r--r-- | smbnetfs.c | 952 |
8 files changed, 1581 insertions, 0 deletions
diff --git a/COPYING b/COPYING new file mode 100644 index 000000000..b8cf3a1ab --- /dev/null +++ b/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) 19yy <name of author> + + 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. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..097cab48f --- /dev/null +++ b/Makefile @@ -0,0 +1,20 @@ +CC=gcc +CFLAGS=-O0 -g3 -Wall +LDFLAGS= -L/lib -L/local/samba/lib/ -I/local/samba/include/ -lnsl -lnetfs -lfshelp -liohelp -lthreads -lports -lihash -ldl -lshouldbeinlibc -lsmbclient + +smbfs: clean smb.o smbfs.o smbnetfs.o + $(CC) $(LDFLAGS) smb.o smbfs.o smbnetfs.o -osmbfs + +smb.o: + $(CC) $(CFLAGS) smb.c -I/local/samba/include/ -c + +smbfs.o: + $(CC) $(CFLAGS) smbfs.c -I/local/samba/include/ -c + +smbnetfs.o: + $(CC) $(CFLAGS) smbnetfs.c -I/local/samba/include/ -c + +clean: + rm -rf *.o smbfs + +all: smbfs
\ No newline at end of file @@ -0,0 +1,14 @@ +To get libsmbclient compiled under GNU/Hurd do the following: + +1) download and uncompress samba-3.0.5 +2) apply the patch samba-3.0.5_hurd.diff +3) compile libsmbclient with + ./configure + make include/proto.h + make bin/libsmbclient.so +4) You need the files: bin/libsmbclient.so and include/libsmbclient.h +5) Modify the Makefile to have correct path + +To run the translator use the settrans command under GNU/Hurd. +settrans -c /src/smbfs/share/ /src/smbfs/smbfs -sSERVER_NAME -rSHARED_RESOURCE -wWORKGROUP -uUSERNAME -pPASSWORD + diff --git a/samba-3.0.5_hurd.diff b/samba-3.0.5_hurd.diff new file mode 100644 index 000000000..4064aa3f6 --- /dev/null +++ b/samba-3.0.5_hurd.diff @@ -0,0 +1,66 @@ +diff -Nr -U 5 samba_orig/source/configure samba_hurd/source/configure +--- samba_orig/source/configure 2004-07-20 18:33:26.000000000 +0200 ++++ samba_hurd/source/configure 2004-08-24 14:15:59.000000000 +0200 +@@ -18354,10 +18354,11 @@ + else + cat >conftest.$ac_ext <<_ACEOF + #line $LINENO "configure" + #include "confdefs.h" + ++#define _GNU_SOURCE + #if defined(HAVE_UNISTD_H) + #include <unistd.h> + #endif + #include <stdio.h> + #include <sys/stat.h> +diff -Nr -U 5 samba_orig/source/include/includes.h samba_hurd/source/include/includes.h +--- samba_orig/source/include/includes.h 2004-07-20 18:28:11.000000000 +0200 ++++ samba_hurd/source/include/includes.h 2004-08-24 14:15:50.000000000 +0200 +@@ -19,10 +19,13 @@ + 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 _GNU_SOURCE ++#define _FILE_OFFSET_BITS 64 ++ + #ifndef NO_CONFIG_H /* for some tests */ + #include "config.h" + #endif + + #include "local.h" +diff -Nr -U 5 samba_orig/source/lib/iconv.c samba_hurd/source/lib/iconv.c +--- samba_orig/source/lib/iconv.c 2004-07-20 18:28:03.000000000 +0200 ++++ samba_hurd/source/lib/iconv.c 2004-08-20 23:01:45.000000000 +0200 +@@ -75,11 +75,11 @@ + static struct charset_functions *find_charset_functions(const char *name) + { + struct charset_functions *c = charsets; + + while(c) { +- if (strcasecmp(name, c->name) == 0) { ++ if (c->name && strcasecmp(name, c->name) == 0) { + return c; + } + c = c->next; + } + +diff -Nr -U 5 samba_orig/source/tests/summary.c samba_hurd/source/tests/summary.c +--- samba_orig/source/tests/summary.c 2004-07-20 18:28:01.000000000 +0200 ++++ samba_hurd/source/tests/summary.c 2004-08-20 23:01:23.000000000 +0200 +@@ -1,14 +1,9 @@ + #include <stdio.h> + + main() + { +-#if !(defined(HAVE_FCNTL_LOCK) || defined(HAVE_STRUCT_FLOCK64)) +- printf("ERROR: No locking available. Running Samba would be unsafe\n"); +- exit(1); +-#endif +- + #if !(defined(HAVE_IFACE_IFCONF) || defined(HAVE_IFACE_IFREQ) || defined(HAVE_IFACE_AIX)) + printf("WARNING: No automated network interface determination\n"); + #endif + + #if !(defined(USE_SETEUID) || defined(USE_SETREUID) || defined(USE_SETRESUID) || defined(USE_SETUIDX)) @@ -0,0 +1,39 @@ +/* + + Copyright (C) 2004 Free Software Foundation, Inc. + Written by Giuseppe Scrivano <gscrivano@quipo.it> + + 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, 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. + */ +#include "smb.h" + +void +auth_data_fn (const char *server, const char *share, char *workgroup, + int wgmaxlen, char *username, int unmaxlen, char *password, + int pwmaxlen) +{ + if (strcmp (server, credentials.server)) + return; + strncpy (workgroup, credentials.workgroup, wgmaxlen); + strncpy (username, credentials.username, unmaxlen); + strncpy (password, credentials.password, pwmaxlen); +} + +int +init_smb () +{ + int ret = smbc_init (auth_data_fn, 10); + return ret; +} @@ -0,0 +1,43 @@ +/* + + Copyright (C) 2004 Free Software Foundation, Inc. + Written by Giuseppe Scrivano <gscrivano@quipo.it> + + 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, 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 _GNU_SOURCE 1 +#define _FILE_OFFSET_BITS 64 +#include <string.h> +#include <stdio.h> +#include <unistd.h> +#include <maptime.h> +#include <errno.h> +#include <error.h> +#include <argp.h> +#include <hurd/netfs.h> +#include <libsmbclient.h> + +struct smb_credentials +{ + char *server; + char *share; + char *workgroup; + char *username; + char *password; +}; +extern struct smb_credentials credentials; + +extern int init_smb (); +extern void stop_netsmb (); diff --git a/smbfs.c b/smbfs.c new file mode 100644 index 000000000..26287b180 --- /dev/null +++ b/smbfs.c @@ -0,0 +1,108 @@ +/* + + Copyright (C) 2004 Free Software Foundation, Inc. + Written by Giuseppe Scrivano <gscrivano@quipo.it> + + 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, 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. + */ + +#include "smb.h" +#include <stdio.h> + +static char doc[] = "smbfs - smb filesystem translator" \ + "\vSHARE Specify the resource in the form smb://[WORKGROUP/]HOST/SHARE"; +static char args_doc[] = "SHARE"; + + + +extern void smbfs_init (); +extern void smbfs_terminate (); +static struct argp_option options[] = +{ + {"server",'s',"SERVER",0,"server samba"}, + {"resource",'r',"RESOURCE",0,"resource to access"}, + {"password",'p',"PWD",0,"password to use"}, + {"username",'u',"USR",0,"username to use"}, + {"workgroup",'w',"WKG",0,"workgroup to use"}, + {0} +}; +static error_t parse_opt(int key, char *arg, struct argp_state *state) +{ + switch(key) + { + case 's': + credentials.server = arg; + break; + case 'r': + credentials.share = arg; + break; + case 'w': + credentials.workgroup = arg; + break; + case 'u': + credentials.username = arg; + break; + case 'p': + credentials.password = arg; + break; + case ARGP_KEY_ARG: + break; + case ARGP_KEY_END: + break; + default: + return ARGP_ERR_UNKNOWN; + } + return 0; +} + +static struct argp smb_argp = {options, parse_opt, args_doc, doc}; + +int +main (int argc, char *argv[]) +{ + mach_port_t bootstrap; + int err; + task_get_bootstrap_port (mach_task_self (), &bootstrap); + if (bootstrap == MACH_PORT_NULL) + { + error (1, errno, "You need to run this as a translator!"); + } + credentials.server = 0; + credentials.share = 0; + credentials.workgroup = 0; + credentials.username = 0; + credentials.password = 0; + + argp_parse(&smb_argp, argc, argv, 0, 0, &credentials); + + if((credentials.server == 0) || (credentials.share == 0)|| (credentials.workgroup == 0)|| (credentials.username == 0)|| (credentials.password == 0)) + { + error(2 , EINVAL, "You must specify server - share - workgroup - username - password !!!\n"); + } + + err = init_smb (); + + if (err < 0) + { + error(3, errno, "Error init_smb\n"); + } + netfs_init(); + netfs_startup(bootstrap, 0); + smbfs_init(); + for(;;) + netfs_server_loop (); + smbfs_terminate (); + return 0; +} diff --git a/smbnetfs.c b/smbnetfs.c new file mode 100644 index 000000000..af1d61880 --- /dev/null +++ b/smbnetfs.c @@ -0,0 +1,952 @@ +/* + + Copyright (C) 1997, 2002, 2004 Free Software Foundation, Inc. + Written by Giuseppe Scrivano <gscrivano@quipo.it> + + 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, 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. + */ + +#include "smb.h" +#include <stddef.h> +#include <sys/mman.h> +#include <hurd/fsys.h> +#include <dirent.h> +#include <sys/time.h> +#include <maptime.h> +#include <cthreads.h> + +/* Returned directory entries are aligned to blocks this many bytes long. + Must be a power of two. */ +#define DIRENT_ALIGN 4 +#define DIRENT_NAME_OFFS offsetof (struct dirent, d_name) +/* Length is structure before the name + the name + '\0', all + padded to a four-byte alignment. */ +#define DIRENT_LEN(name_len) ((DIRENT_NAME_OFFS + (name_len) + 1 + (DIRENT_ALIGN - 1)) & ~(DIRENT_ALIGN - 1)) + +struct smb_credentials credentials; +static volatile struct mapped_time_value *maptime; +static struct mutex smb_mutex; +char *netfs_server_name = "smbfs"; +char *netfs_server_version = "0.1"; +int netfs_maxsymlinks = 0; + +struct netnode +{ + struct node *node; + char *filename; + struct netnode *parent; + struct netnode *next; +}; + +static struct netnode *nodes; + +/* Free the memory used by the nodes. */ +void +clear_nodes () +{ + if (!nodes) + return; + struct netnode *pt = nodes; + struct netnode *pt2 = 0; + + for (;;) + { + pt2 = pt; + if (pt2) + { + pt = pt->next; + free (pt2->node); + free (pt2->filename); + free (pt2); + } + else + { + break; + } + } + nodes = 0; +} +void +append_node_to_list(struct netnode *n) +{ + n->next=nodes; + nodes=n; +} +/* Create a new node and initialize it with default values. */ +int +create_node(struct node **node) +{ + struct netnode *n = malloc (sizeof (struct netnode)); + if(!n) + return ENOMEM; + *node = n->node = netfs_make_node (n); + if (!(*node)) + { + free (n); + return ENOMEM; + } + append_node_to_list(n); + return 0; +} + +struct netnode * +search_node (char *filename, struct node *dir) +{ + struct netnode *pt = nodes; + while (pt) + { + if ((pt->parent) && (dir == pt->parent->node)) + { + if (!strcmp (pt->filename, filename)) + { + return pt; + } + } + pt = pt->next; + } + return 0; +} + +void +remove_node (struct node *np) +{ + struct netnode *pt; + struct netnode *prevpt; + + for ( pt=nodes, prevpt=0 ; pt ; pt=pt->next ) + { + if (pt->node == np) + { + free (pt->node); + free (pt->filename); + free (pt); + if (prevpt) + prevpt->next = pt->next; + else + nodes = pt->next; + break; + } + else + prevpt = pt; + } +} + +void +create_root_node () +{ + struct node *node; + int err=create_node(&node); + if(err) + return; + netfs_root_node = node; + node->nn->parent = 0; + node->nn->filename = malloc(strlen(credentials.share)+1); + if(node->nn->filename) + strcpy(node->nn->filename,credentials.share); + + netfs_validate_stat (node,0); + + } + + +int +add_node (char *filename, struct node *top ,struct netnode** nn) +{ + int err; + struct netnode *n; + struct node *newnode; + io_statbuf_t st; + n = search_node (filename, top); + if (n) + { + *nn=n; + return 0; + } + + err=create_node (&newnode); + if(err) + return err; + n = newnode->nn; + n->node = newnode; + if(top) + n->parent = top->nn; + else + n->parent = 0; + n->filename = malloc ( strlen(top->nn->filename) + strlen (filename) + 1); + if(!n->filename) + return 0; + sprintf (n->filename, "%s/%s", top->nn->filename , filename); + + mutex_lock (&smb_mutex); + err = smbc_stat(n->filename, &st); + mutex_unlock (&smb_mutex); + + if(err) + return errno; + + /* Consider only directories and regular files. */ + if(((st.st_mode & S_IFDIR) == 0) && ((st.st_mode & S_IFREG) == 0)) + err=-1; + if(err) + { + remove_node (newnode); + return errno; + } + + *nn=n; + return 0; +} + +error_t +netfs_validate_stat (struct node * np, struct iouser *cred) +{ + mutex_lock (&smb_mutex); + int err = smbc_stat(np->nn->filename, &np->nn_stat); + mutex_unlock (&smb_mutex); + if(err) + return errno; + + return 0; +} + +error_t +netfs_attempt_chown (struct iouser * cred, struct node * np, uid_t uid, + uid_t gid) +{ + return EOPNOTSUPP; +} + +error_t +netfs_attempt_chauthor (struct iouser * cred, struct node * np, uid_t author) +{ + return EOPNOTSUPP; +} + +error_t +netfs_attempt_chmod (struct iouser * cred, struct node * np, mode_t mode) +{ + int err; + mutex_lock (&smb_mutex); + err=smbc_chmod(np->nn->filename,mode); + mutex_unlock (&smb_mutex); + if(err) + return errno; + else + return 0; +} + +error_t +netfs_attempt_mksymlink (struct iouser * cred, struct node * np, char *name) +{ + return EOPNOTSUPP; +} + +error_t +netfs_attempt_mkdev (struct iouser * cred, struct node * np, mode_t type,dev_t indexes) +{ + return EOPNOTSUPP; +} + +error_t +netfs_set_translator (struct iouser * cred, struct node * np, char *argz,size_t argzlen) +{ + return 0; +} + +error_t +netfs_get_translator (struct node * node, char **argz, size_t * argz_len) +{ + return 0; +} + +error_t +netfs_attempt_chflags (struct iouser * cred, struct node * np, int flags) +{ + return EOPNOTSUPP; +} + +error_t +netfs_attempt_utimes (struct iouser * cred, struct node * np, + struct timespec * atime, struct timespec * mtime) +{ + int err; + struct timeval tv; + tv.tv_usec=0;/* Not used by samba. */ + if(mtime) + tv.tv_sec=mtime->tv_sec; + else + maptime_read(maptime, &tv); + mutex_lock (&smb_mutex); + err=smbc_utimes(np->nn->filename,&tv); + mutex_unlock (&smb_mutex); + if(err) + return errno; + else + return 0; +} + +error_t +netfs_attempt_set_size (struct iouser * cred, struct node * np, loff_t size) +{ + + mutex_lock (&smb_mutex); + int fd = smbc_open (np->nn->filename, O_WRONLY | O_CREAT, O_RDWR); + mutex_unlock (&smb_mutex); + int ret=0; + if (fd < 0) + { + return errno; + } + mutex_lock (&smb_mutex); + int current_filesize = smbc_lseek (fd, 0, SEEK_END); + mutex_unlock (&smb_mutex); + if(current_filesize<0) + { + mutex_lock (&smb_mutex); + smbc_close (fd); + mutex_unlock (&smb_mutex); + return errno; + } + if(current_filesize<size) + { + /* FIXME. trunc here. */ + mutex_lock (&smb_mutex); + smbc_close (fd); + fd = smbc_open (np->nn->filename, O_WRONLY | O_TRUNC, O_RDWR); + mutex_unlock (&smb_mutex); + current_filesize=0; + } + mutex_lock (&smb_mutex); + ret=smbc_lseek (fd, size, SEEK_SET); + mutex_unlock (&smb_mutex); + if (ret < 0) + { + mutex_lock (&smb_mutex); + smbc_close (fd); + mutex_unlock (&smb_mutex); + return errno; + } + mutex_lock (&smb_mutex); + smbc_close (fd); + mutex_unlock (&smb_mutex); + return 0; + +} + +error_t +netfs_attempt_statfs (struct iouser * cred, struct node * np, + fsys_statfsbuf_t * st) +{ + return EOPNOTSUPP; +} + +error_t +netfs_attempt_sync (struct iouser * cred, struct node * np, int wait) +{ + return 0; +} + +error_t +netfs_attempt_syncfs (struct iouser * cred, int wait) +{ + return 0; +} + +error_t +netfs_attempt_lookup (struct iouser * user, struct node * dir, char *name, + struct node ** np) +{ + error_t err = 0; + if (*name == '\0' || strcmp (name, ".") == 0) /*Current directory */ + { + netfs_nref (dir);/*Add a reference to current directory */ + *np = dir; + mutex_unlock (&dir->lock); + return 0; + } + else if (strcmp (name, "..") == 0) /*Parent directory */ + { + if (dir->nn->parent) + { + *np = dir->nn->parent->node; + if (*np) + { + netfs_nref (*np); + err=0; + } + else + err = ENOENT; + } + else + { + err = ENOENT; + *np = 0; + } + mutex_unlock (&dir->lock); + return err; + } + mutex_unlock (&dir->lock); + + struct netnode *n; + + err = add_node (name, dir,&n); + if(err) + return err; + *np = n->node; + netfs_nref (*np); + if (*np) + err = 0; + return err; +} + +error_t +netfs_attempt_unlink (struct iouser * user, struct node * dir, char *name) +{ + char *filename; + + if (dir->nn->filename) + filename = malloc (strlen (dir->nn->filename) + strlen (name) + 2); + else + filename = malloc (strlen (credentials.share) + strlen (name) + 1); + if (!filename) + return ENOMEM; + + if (dir->nn->filename) + sprintf (filename, "%s/%s", dir->nn->filename, name); + else + sprintf (filename, "%s/%s", credentials.share, name); + + mutex_lock (&smb_mutex); + error_t err = smbc_unlink (filename); + mutex_unlock (&smb_mutex); + + free (filename); + if(err) + return errno; + else + return 0; +} + +error_t +netfs_attempt_rename (struct iouser * user, struct node * fromdir, + char *fromname, struct node * todir, char *toname, + int excl) +{ + char *filename; /* Origin file name. */ + char *filename2; /* Destination file name. */ + + if (fromdir->nn->filename) + filename =malloc ( strlen (fromdir->nn->filename) +strlen (fromname) + 2); + else + filename = malloc (strlen (credentials.share) + strlen (fromname) + 1); + if (!filename) + return ENOMEM; + + if (todir->nn->filename) + filename2 =malloc ( strlen (todir->nn->filename) +strlen (toname) + 2); + else + filename2 = malloc (strlen (credentials.share) + strlen (toname) + 1); + + if (!filename2) + { + free (filename); + return ENOMEM; + } + + if (fromdir->nn->filename) + sprintf (filename, "%s/%s", fromdir->nn->filename,fromname); + else + sprintf (filename, "%s/%s", credentials.share, fromname); + + if (todir->nn->filename) + sprintf (filename, "%s/%s", todir->nn->filename, toname); + else + sprintf (filename, "%s/%s", credentials.share, toname); + + mutex_lock (&smb_mutex); + error_t err = smbc_rename (filename, filename2); + mutex_unlock (&smb_mutex); + + free (filename); + free (filename2); + return err?errno:0; +} + +error_t +netfs_attempt_mkdir (struct iouser * user, struct node * dir, char *name, + mode_t mode) +{ + char *filename; + error_t err; + + if (dir->nn->filename) + filename = malloc (strlen (dir->nn->filename) + strlen (name) + 2); + else + filename = malloc (strlen (credentials.share) + strlen (name) + 1); + if (!filename) + return ENOMEM; + + if (dir->nn->filename) + sprintf (filename, "%s/%s", dir->nn->filename,name); + else + sprintf (filename, "%s/%s", credentials.share, name); + + mutex_lock (&smb_mutex); + err = smbc_mkdir (filename, mode); + mutex_unlock (&smb_mutex); + + free(filename); + return err?errno:0; +} + +error_t +netfs_attempt_rmdir (struct iouser * user, struct node * dir, char *name) +{ + char *filename; + + if (dir->nn->filename) + filename = malloc (strlen (dir->nn->filename) +strlen (name) + 2); + else + filename = malloc (strlen (credentials.share) + strlen (name) + 1); + if (!filename) + return ENOMEM; + + if (dir->nn->filename) + sprintf (filename, "%s/%s", dir->nn->filename, name); + else + sprintf (filename, "%s/%s", credentials.share, name); + + mutex_lock (&smb_mutex); + error_t err = smbc_rmdir (filename); + mutex_unlock (&smb_mutex); + + free(filename); + return err?errno:0; +} + +error_t +netfs_attempt_link (struct iouser * user, struct node * dir, + struct node * file, char *name, int excl) +{ + return EOPNOTSUPP; +} + +error_t +netfs_attempt_mkfile (struct iouser * user, struct node * dir, mode_t mode, + struct node ** np) +{ + mutex_unlock (&dir->lock); + return EOPNOTSUPP; +} + +error_t +netfs_attempt_create_file (struct iouser * user, struct node * dir, + char *name, mode_t mode, struct node ** np) +{ + *np = 0; + error_t err=0; + char *filename; + if (dir->nn->filename) + filename = malloc ( strlen (dir->nn->filename) +strlen (name) + 2); + else + filename = malloc (strlen (credentials.share) + strlen (name) + 1); + if (!filename) + return ENOMEM; + + if (dir->nn->filename) + sprintf (filename, "%s/%s", dir->nn->filename,name); + else + sprintf (filename, "%s/%s", credentials.share, name); + + mutex_lock (&smb_mutex); + int fd = smbc_open (filename,O_WRONLY | O_CREAT , O_RDWR); + if (fd < 0) + { + mutex_unlock (&smb_mutex); + mutex_unlock (&dir->lock); + return errno; + } + smbc_close (fd); + mutex_unlock (&smb_mutex); + + struct netnode *nn; + err=add_node (name, dir,&nn); + if(err) + { + mutex_unlock (&dir->lock); + return err; + } + *np = nn->node; + + mutex_unlock (&dir->lock); + return 0; +} + +error_t +netfs_attempt_readlink (struct iouser * user, struct node * np, char *buf) +{ + return EOPNOTSUPP; +} + +error_t +netfs_check_open_permissions (struct iouser * user, struct node * np, + int flags, int newnode) +{ + error_t err; + io_statbuf_t nn_stat; + + mutex_lock (&smb_mutex); + err = smbc_stat (np->nn->filename, &nn_stat); + mutex_unlock (&smb_mutex); + + if (err) + { + return errno; + } + + if (flags & O_READ) + err = !(S_IREAD & nn_stat.st_mode); + if (flags & O_WRITE) + err |= !(S_IWRITE & nn_stat.st_mode); + if (flags & O_EXEC) + err |= !(S_IEXEC & nn_stat.st_mode); + + return err?EPERM:0; +} + +error_t +netfs_attempt_read (struct iouser * cred, struct node * np, loff_t offset, + size_t * len, void *data) +{ + mutex_lock (&smb_mutex); + int fd = smbc_open (np->nn->filename, O_RDONLY, O_RDWR); + mutex_unlock (&smb_mutex); + + int ret = 0; + + if (fd < 0) + { + *len = 0; + return errno; + } + mutex_lock (&smb_mutex); + ret = smbc_lseek (fd, offset, SEEK_SET); + mutex_unlock (&smb_mutex); + + if ((ret < 0) || (ret != offset)) + { + *len = 0; + mutex_lock (&smb_mutex); + smbc_close (fd); + mutex_unlock (&smb_mutex); + return errno; + } + mutex_lock (&smb_mutex); + ret = smbc_read (fd, data, *len); + mutex_unlock (&smb_mutex); + if (ret < 0) + { + *len = 0; + mutex_lock (&smb_mutex); + smbc_close (fd); + mutex_unlock (&smb_mutex); + return errno; + } + *len=ret; + mutex_lock (&smb_mutex); + smbc_close (fd); + mutex_unlock (&smb_mutex); + return 0; +} + +error_t +netfs_attempt_write (struct iouser * cred, struct node * np, loff_t offset, + size_t * len, void *data) +{ + mutex_lock (&smb_mutex); + int fd = smbc_open (np->nn->filename, O_WRONLY, O_RDWR); + mutex_unlock (&smb_mutex); + int ret=0; + if (fd < 0) + { + *len = 0; + return errno; + } + mutex_lock (&smb_mutex); + ret = smbc_lseek (fd, offset, SEEK_SET) < 0; + mutex_unlock (&smb_mutex); + if ((ret < 0) || (ret != offset)) + { + *len = 0; + mutex_lock (&smb_mutex); + smbc_close (fd); + mutex_unlock (&smb_mutex); + return errno; + } + mutex_lock (&smb_mutex); + ret = smbc_write (fd, data, *len); + mutex_unlock (&smb_mutex); + if (ret < 0) + { + *len = 0; + mutex_lock (&smb_mutex); + smbc_close (fd); + mutex_unlock (&smb_mutex); + return errno; + } + *len=ret; + mutex_lock (&smb_mutex); + smbc_close (fd); + mutex_unlock (&smb_mutex); + + return 0; +} + +error_t +netfs_report_access (struct iouser * cred, struct node * np, int *types) +{ + *types = 0; + if(fshelp_access(&np->nn_stat, S_IREAD, cred) == 0) + *types |= O_READ; + if(fshelp_access(&np->nn_stat, S_IWRITE, cred) == 0) + *types |= O_WRITE; + if(fshelp_access(&np->nn_stat, S_IEXEC, cred) == 0) + *types |= O_EXEC; + return 0; +} + +struct iouser * +netfs_make_user (uid_t * uids, int nuids, uid_t * gids, int ngids) +{ + return 0; +} + +void +netfs_node_norefs (struct node *np) +{ + remove_node (np); +} + +error_t +netfs_get_dirents (struct iouser *cred, struct node *dir, int entry, + int nentries, char **data, + mach_msg_type_number_t * datacnt, vm_size_t bufsize, + int *amt) +{ + if (!dir) + return ENOTDIR; + io_statbuf_t st; + struct smbc_dirent * dirent; + int size = 0, dd; + int nreturningentries=0; + int err=0; + int add_dir_entry_size=0; + char *p = 0; + + mutex_lock (&smb_mutex); + dd = smbc_opendir (dir->nn->filename); + mutex_unlock (&smb_mutex); + + if (dd<0) + return ENOTDIR; + + mutex_lock (&smb_mutex); + err=smbc_lseekdir(dd, entry); + mutex_unlock (&smb_mutex); + + if(err) + { + if(errno == EINVAL) + { + *datacnt=0; + *amt=0; + mutex_lock (&smb_mutex); + smbc_closedir(dd); + mutex_unlock (&smb_mutex); + return 0; + } + return errno; + } + + int addSize (char *filename) + { + if(nentries == -1 || nreturningentries < nentries) + { + size_t new_size = size + DIRENT_LEN (strlen (filename)); + if (bufsize > 0 && new_size > bufsize) + return 1; + size = new_size; + nreturningentries++; + return 0; + } + else + return 1; + } + for(;;) + { + mutex_lock (&smb_mutex); + dirent = smbc_readdir(dd); + mutex_unlock (&smb_mutex); + if(!dirent) + break; + if( (dirent->smbc_type == SMBC_DIR) || (dirent->smbc_type == SMBC_FILE) )/* Add only files and directories. */ + if(addSize(dirent->name))/* bufsize or nentries reached. */ + break; + + } + if(size > *datacnt) /* if the supplied buffer isn't large enough. */ + { + *data = mmap (0, size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS, 0, 0); + } + if (!(*data) || (*data == (void *) -1)) + { + mutex_lock (&smb_mutex); + smbc_closedir(dd); + mutex_unlock (&smb_mutex); + return ENOMEM; + } + mutex_lock (&smb_mutex); + err=smbc_lseekdir(dd, entry); + mutex_unlock (&smb_mutex); + if(err) + { + if(errno == EINVAL) + { + *datacnt=0; + *amt=0; + mutex_lock (&smb_mutex); + smbc_closedir(dd); + mutex_unlock (&smb_mutex); + return 0; + } + return errno; + } + + add_dir_entry_size=size; + p = *data; + int count=0; + int add_dir_entry (const char *name, ino_t fileno, int type) + { + if(count < nreturningentries) + { + struct dirent hdr; + size_t name_len = strlen (name); + size_t sz = DIRENT_LEN (name_len); + + if (sz > add_dir_entry_size) + return 1; + + add_dir_entry_size -= sz; + + hdr.d_fileno = fileno; + hdr.d_reclen = sz; + hdr.d_type = type; + hdr.d_namlen = name_len; + + memcpy (p, &hdr, DIRENT_NAME_OFFS); + strcpy (p + DIRENT_NAME_OFFS, name); + p += sz; + ++count; + return 0; + } + else + return 1; + } + + for(;;) + { + mutex_lock (&smb_mutex); + dirent = smbc_readdir(dd); + mutex_unlock(&smb_mutex); + if(!dirent) + break; + int type = 0; + if (dirent->smbc_type == SMBC_DIR) + type = DT_DIR; + else if (dirent->smbc_type == SMBC_FILE) + type = DT_REG; + else + continue; + char *stat_file_name; + stat_file_name=malloc(strlen(dir->nn->filename)+strlen(dirent->name)+2); + if(!stat_file_name) + { + mutex_lock (&smb_mutex); + smbc_closedir(dd); + mutex_unlock (&smb_mutex); + return ENOMEM; + } + if(!strcmp(dirent->name,".")) + { + sprintf(stat_file_name,"%s",dir->nn->filename); + mutex_lock (&smb_mutex); + err=smbc_stat(stat_file_name, &st); + mutex_unlock (&smb_mutex); + } + else if(!strcmp(dirent->name,"..")) + { + if(dir->nn->parent) + sprintf(stat_file_name,"%s/%s",dir->nn->filename,dirent->name); + else + st.st_ino=0; + } + else + { + sprintf(stat_file_name,"%s/%s",dir->nn->filename,dirent->name); + mutex_lock (&smb_mutex); + err=smbc_stat(stat_file_name, &st); + mutex_unlock(&smb_mutex); + } + + free(stat_file_name); + if(err) + { + mutex_lock (&smb_mutex); + smbc_closedir(dd); + mutex_unlock (&smb_mutex); + return errno; + } + + err=add_dir_entry (dirent->name, st.st_ino, type); + if (err) + break; + } + + *datacnt=size; + *amt=nreturningentries; + mutex_lock (&smb_mutex); + smbc_closedir(dd); + mutex_unlock (&smb_mutex); + return 0; +} + +void +smbfs_init () +{ + int err; + nodes = 0; + err = maptime_map(0,0, &maptime); + if(err) + return; + + create_root_node (); +} + +void +smbfs_terminate () +{ + mutex_init (&smb_mutex); + clear_nodes (); +} |