diff options
-rw-r--r-- | docs/textdocs/BROWSING.txt | 2 | ||||
-rw-r--r-- | source3/client/smbmnt.c | 36 | ||||
-rw-r--r-- | source3/client/smbmount.c | 72 |
3 files changed, 54 insertions, 56 deletions
diff --git a/docs/textdocs/BROWSING.txt b/docs/textdocs/BROWSING.txt index f81ff06b68..83f43bc5fa 100644 --- a/docs/textdocs/BROWSING.txt +++ b/docs/textdocs/BROWSING.txt @@ -74,7 +74,7 @@ parameters on the command line of nmbd in inetd.conf. This trick is to not use spaces between the option and the parameter (eg: -d2 instead of -d 2), and to not use the -B and -N options. New versions of nmbd are now far more likely to correctly find your broadcast and network -addess, so in most cases these aren't needed. +address, so in most cases these aren't needed. The other big problem people have is that their broadcast address, netmask or IP address is wrong (specified with the "interfaces" option diff --git a/source3/client/smbmnt.c b/source3/client/smbmnt.c index 9bb7f56672..2891ea709c 100644 --- a/source3/client/smbmnt.c +++ b/source3/client/smbmnt.c @@ -53,18 +53,18 @@ help(void) "-f mode permission the files get (octal notation)\n" "-d mode permission the dirs get (octal notation)\n" "-P pid connection handler's pid\n\n" + "-s share share name on server\n\n" "-h print this help text\n"); } static int -parse_args(int argc, char *argv[], struct smb_mount_data *data) +parse_args(int argc, char *argv[], struct smb_mount_data *data, char **share) { int opt; struct passwd *pwd; struct group *grp; - while ((opt = getopt (argc, argv, "u:g:f:d:")) - != EOF) + while ((opt = getopt (argc, argv, "u:g:f:d:s:")) != EOF) { switch (opt) { @@ -108,6 +108,9 @@ parse_args(int argc, char *argv[], struct smb_mount_data *data) case 'd': data->dir_mode = strtol(optarg, NULL, 8); break; + case 's': + *share = optarg; + break; default: return -1; } @@ -157,17 +160,13 @@ mount_ok(struct stat *st) int main(int argc, char *argv[]) { - struct smb_mount_data data; - struct stat st; - - int fd; - int um; + char *mount_point, *share_name = NULL; + FILE *mtab; + int fd, um; unsigned int flags; - - char *mount_point; - - struct mntent ment; - FILE *mtab; + struct smb_mount_data data; + struct stat st; + struct mntent ment; progname = argv[0]; @@ -222,7 +221,7 @@ main(int argc, char *argv[]) data.file_mode = (S_IRWXU|S_IRWXG|S_IRWXO) & ~um; data.dir_mode = 0; - if (parse_args(argc, argv, &data) != 0) { + if (parse_args(argc, argv, &data, &share_name) != 0) { usage(); return -1; } @@ -239,15 +238,14 @@ main(int argc, char *argv[]) flags = MS_MGC_VAL; - if (mount(NULL, mount_point, "smbfs", - flags, (char *)&data) < 0) { + if (mount(share_name, mount_point, "smbfs", flags, (char *)&data) < 0) + { perror("mount error"); - printf("Please look at smbmount's manual page for " - "possible reasons\n"); + printf("Please refer to the smbmnt(8) manual page\n"); return -1; } - ment.mnt_fsname = "none"; + ment.mnt_fsname = share_name ? share_name : "none"; ment.mnt_dir = fullpath(mount_point); ment.mnt_type = "smbfs"; ment.mnt_opts = ""; diff --git a/source3/client/smbmount.c b/source3/client/smbmount.c index 645523db0f..abf00e2b78 100644 --- a/source3/client/smbmount.c +++ b/source3/client/smbmount.c @@ -23,6 +23,12 @@ #undef SYSLOG #endif +#include <linux/version.h> +#define LVERSION(major,minor,patch) (((((major)<<8)+(minor))<<8)+(patch)) +#if LINUX_VERSION_CODE < LVERSION(2,1,70) +#error this code will only compile on versions of linux after 2.1.70 +#endif + #include "includes.h" #include <linux/smb_fs.h> static struct smb_conn_opt conn_options; @@ -31,6 +37,9 @@ static struct smb_conn_opt conn_options; #define REGISTER 0 #endif +/* Uncomment this to allow debug the smbmount daemon */ +#define SMBFS_DEBUG 1 + pstring cur_dir = "\\"; pstring cd_path = ""; extern pstring service; @@ -60,6 +69,7 @@ extern pstring user_socket_options; extern int name_type; extern int max_protocol; +int port = SMB_PORT; time_t newer_than = 0; @@ -178,9 +188,6 @@ static BOOL chkpath(char *path,BOOL report) return(CVAL(inbuf,smb_rcls) == 0); } - -/* #define SMBFS_DEBUG 1 */ - static void daemonize(void) { @@ -260,9 +267,7 @@ send_fs_socket(char *mount_point, char *inbuf, char *outbuf) { if ((fd = open(mount_point, O_RDONLY)) < 0) { -#ifdef SMBFS_DEBUG - printf("smbclient: can't open %s\n", mount_point); -#endif + DEBUG(0, ("smbmount: can't open %s\n", mount_point)); break; } @@ -276,9 +281,7 @@ send_fs_socket(char *mount_point, char *inbuf, char *outbuf) res = ioctl(fd, SMB_IOC_NEWCONN, &conn_options); if (res != 0) { -#ifdef SMBFS_DEBUG - printf("smbclient: ioctl failed, res=%d\n",res); -#endif + DEBUG(0, ("smbmount: ioctl failed, res=%d\n", res)); } close_sockets(); @@ -299,21 +302,22 @@ send_fs_socket(char *mount_point, char *inbuf, char *outbuf) */ signal(SIGUSR1, &usr1_handler); pause(); -#ifdef SMBFS_DEBUG - printf("smbclient: got signal, getting new socket\n"); -#endif + DEBUG(0, ("smbmount: got signal, getting new socket\n")); - res = mount_send_login(inbuf,outbuf); + res = cli_open_sockets(port); if (!res) { -#ifdef SMBFS_DEBUG - printf("smbclient: login failed\n"); -#endif + DEBUG(0, ("smbmount: can't open sockets\n")); + continue; + } + + res = mount_send_login(inbuf, outbuf); + if (!res) + { + DEBUG(0, ("smbmount: login failed\n")); } } -#ifdef SMBFS_DEBUG - printf("smbclient: exit\n"); -#endif + DEBUG(0, ("smbmount: exit\n")); exit(1); } @@ -323,10 +327,11 @@ mount smbfs static void cmd_mount(char *inbuf,char *outbuf) { pstring mpoint; - char mount_point[MAXPATHLEN+1]; + pstring share_name; pstring mount_command; fstring buf; int retval; + char mount_point[MAXPATHLEN+1]; if (!next_token(NULL, mpoint, NULL)) { @@ -342,7 +347,15 @@ static void cmd_mount(char *inbuf,char *outbuf) return; } - sprintf(mount_command, "smbmnt %s", mount_point); + /* + * Build the service name to report on the Unix side, + * converting '\' to '/' and ' ' to '_'. + */ + strcpy(share_name, service); + string_replace(share_name, '\\', '/'); + string_replace(share_name, ' ', '_'); + + sprintf(mount_command, "smbmnt %s -s %s", mount_point, share_name); while(next_token(NULL, buf, NULL)) { @@ -350,7 +363,7 @@ static void cmd_mount(char *inbuf,char *outbuf) strcat(mount_command, buf); } - DEBUG(3,("mount command: %s\n", mount_command)); + DEBUG(3, ("mount command: %s\n", mount_command)); /* * Create the background process before trying the mount. @@ -368,9 +381,6 @@ static void cmd_mount(char *inbuf,char *outbuf) } - - - /* This defines the commands supported by this client */ struct { @@ -667,7 +677,6 @@ static void usage(char *pname) { fstring base_directory; char *pname = argv[0]; - int port = SMB_PORT; int opt; extern FILE *dbf; extern char *optarg; @@ -739,7 +748,7 @@ static void usage(char *pname) if (*argv[1] != '-') { - strcpy(service,argv[1]); + strcpy(service, argv[1]); /* Convert any '/' characters in the service name to '\' characters */ string_replace( service, '/','\\'); argc--; @@ -752,15 +761,6 @@ static void usage(char *pname) exit(1); } -/* - if (count_chars(service,'\\') > 3) - { - usage(pname); - printf("\n%s: Too many '\\' characters in service\n",service); - exit(1); - } - */ - if (argc > 1 && (*argv[1] != '-')) { got_pass = True; |