⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smbmount.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
	}	if (mount_uid) {		slprintf(tmp, sizeof(tmp)-1, "%d", mount_uid);		args[i++] = "-u";		args[i++] = smb_xstrdup(tmp);	}	if (mount_gid) {		slprintf(tmp, sizeof(tmp)-1, "%d", mount_gid);		args[i++] = "-g";		args[i++] = smb_xstrdup(tmp);	}	if (mount_fmask) {		slprintf(tmp, sizeof(tmp)-1, "0%o", mount_fmask);		args[i++] = "-f";		args[i++] = smb_xstrdup(tmp);	}	if (mount_dmask) {		slprintf(tmp, sizeof(tmp)-1, "0%o", mount_dmask);		args[i++] = "-d";		args[i++] = smb_xstrdup(tmp);	}	if (options) {		args[i++] = "-o";		args[i++] = options;	}	if (sys_fork() == 0) {		char *smbmnt_path;		asprintf(&smbmnt_path, "%s/smbmnt", dyn_BINDIR);				if (file_exist(smbmnt_path)) {			execv(smbmnt_path, args);			fprintf(stderr,				"smbfs/init_mount: execv of %s failed. Error was %s.",				smbmnt_path, strerror(errno));		} else {			execvp("smbmnt", args);			fprintf(stderr,				"smbfs/init_mount: execv of %s failed. Error was %s.",				"smbmnt", strerror(errno));		}		free(smbmnt_path);		exit(1);	}	if (waitpid(-1, &status, 0) == -1) {		fprintf(stderr,"waitpid failed: Error was %s", strerror(errno) );		/* FIXME: do some proper error handling */		exit(1);	}	if (WIFEXITED(status) && WEXITSTATUS(status) != 0) {		fprintf(stderr,"smbmnt failed: %d\n", WEXITSTATUS(status));		/* FIXME: do some proper error handling */		exit(1);	} else if (WIFSIGNALED(status)) {		fprintf(stderr, "smbmnt killed by signal %d\n", WTERMSIG(status));		exit(1);	}	/* Ok...  This is the rubicon for that mount point...  At any point	   after this, if the connections fail and can not be reconstructed	   for any reason, we will have to unmount the mount point.  There	   is no exit from the next call...	*/	send_fs_socket(lp_ctx, service, mount_point, c);}/****************************************************************************get a password from a a file or file descriptorexit on failure (from smbclient, move to libsmb or shared .c file?)****************************************************************************/static void get_password_file(void){	int fd = -1;	char *p;	bool close_it = false;	pstring spec;	char pass[128];	if ((p = getenv("PASSWD_FD")) != NULL) {		pstrcpy(spec, "descriptor ");		pstrcat(spec, p);		sscanf(p, "%d", &fd);		close_it = false;	} else if ((p = getenv("PASSWD_FILE")) != NULL) {		fd = open(p, O_RDONLY, 0);		pstrcpy(spec, p);		if (fd < 0) {			fprintf(stderr, "Error opening PASSWD_FILE %s: %s\n",				spec, strerror(errno));			exit(1);		}		close_it = true;	}	for(p = pass, *p = '\0'; /* ensure that pass is null-terminated */	    p && p - pass < sizeof(pass);) {		switch (read(fd, p, 1)) {		case 1:			if (*p != '\n' && *p != '\0') {				*++p = '\0'; /* advance p, and null-terminate pass */				break;			}		case 0:			if (p - pass) {				*p = '\0'; /* null-terminate it, just in case... */				p = NULL; /* then force the loop condition to become false */				break;			} else {				fprintf(stderr, "Error reading password from file %s: %s\n",					spec, "empty password\n");				exit(1);			}		default:			fprintf(stderr, "Error reading password from file %s: %s\n",				spec, strerror(errno));			exit(1);		}	}	pstrcpy(password, pass);	if (close_it)		close(fd);}/****************************************************************************get username and password from a credentials fileexit on failure (from smbclient, move to libsmb or shared .c file?)****************************************************************************/static void read_credentials_file(char *filename){	FILE *auth;	fstring buf;	uint16_t len = 0;	char *ptr, *val, *param;	if ((auth=sys_fopen(filename, "r")) == NULL)	{		/* fail if we can't open the credentials file */		DEBUG(0,("ERROR: Unable to open credentials file!\n"));		exit (-1);	}	while (!feof(auth))	{		/* get a line from the file */		if (!fgets (buf, sizeof(buf), auth))			continue;		len = strlen(buf);		if ((len) && (buf[len-1]=='\n'))		{			buf[len-1] = '\0';			len--;		}		if (len == 0)			continue;		/* break up the line into parameter & value.		   will need to eat a little whitespace possibly */		param = buf;		if (!(ptr = strchr (buf, '=')))			continue;		val = ptr+1;		*ptr = '\0';		/* eat leading white space */		while ((*val!='\0') && ((*val==' ') || (*val=='\t')))			val++;		if (strwicmp("password", param) == 0)		{			pstrcpy(password, val);			got_pass = true;		}		else if (strwicmp("username", param) == 0) {			pstrcpy(username, val);		}		memset(buf, 0, sizeof(buf));	}	fclose(auth);}/****************************************************************************usage on the program****************************************************************************/static void usage(void){	printf("Usage: mount.smbfs service mountpoint [-o options,...]\n");	printf("Version %s\n\n",VERSION);	printf("Options:\n\      username=<arg>                  SMB username\n\      password=<arg>                  SMB password\n\      credentials=<filename>          file with username/password\n\      krb                             use kerberos (active directory)\n\      netbiosname=<arg>               source NetBIOS name\n\      uid=<arg>                       mount uid or username\n\      gid=<arg>                       mount gid or groupname\n\      port=<arg>                      remote SMB port number\n\      fmask=<arg>                     file umask\n\      dmask=<arg>                     directory umask\n\      debug=<arg>                     debug level\n\      ip=<arg>                        destination host or IP address\n\      workgroup=<arg>                 workgroup on destination\n\      sockopt=<arg>                   TCP socket options\n\      scope=<arg>                     NetBIOS scope\n\      iocharset=<arg>                 Linux charset (iso8859-1, utf8)\n\      codepage=<arg>                  server codepage (cp850)\n\      ttl=<arg>                       dircache time to live\n\      guest                           don't prompt for a password\n\      ro                              mount read-only\n\      rw                              mount read-write\n\\n\This command is designed to be run from within /bin/mount by giving\n\the option '-t smbfs'. For example:\n\  mount -t smbfs -o username=tridge,password=foobar //fjall/test /data/test\n\");}/****************************************************************************  Argument parsing for mount.smbfs interface  mount will call us like this:    mount.smbfs device mountpoint -o <options>    <options> is never empty, containing at least rw or ro ****************************************************************************/static void parse_mount_smb(int argc, char **argv){	int opt;	char *opts;	char *opteq;	extern char *optarg;	int val;	char *p;	/* FIXME: This function can silently fail if the arguments are	 * not in the expected order.	> The arguments syntax of smbmount 2.2.3a (smbfs of Debian stable)	> requires that one gives "-o" before further options like username=...	> . Without -o, the username=.. setting is *silently* ignored. I've	> spent about an hour trying to find out why I couldn't log in now..	*/	if (argc < 2 || argv[1][0] == '-') {		usage();		exit(1);	}		pstrcpy(service, argv[1]);	pstrcpy(mpoint, argv[2]);	/* Convert any '/' characters in the service name to	   '\' characters */	string_replace(service, '/','\\');	argc -= 2;	argv += 2;	opt = getopt(argc, argv, "o:");	if(opt != 'o') {		return;	}	options[0] = 0;	p = options;	/*	 * option parsing from nfsmount.c (util-linux-2.9u)	 */        for (opts = strtok(optarg, ","); opts; opts = strtok(NULL, ",")) {		DEBUG(3, ("opts: %s\n", opts));                if ((opteq = strchr_m(opts, '='))) {                        val = atoi(opteq + 1);                        *opteq = '\0';                        if (!strcmp(opts, "username") || 			    !strcmp(opts, "logon")) {				char *lp;				got_user = true;				pstrcpy(username,opteq+1);				if ((lp=strchr_m(username,'%'))) {					*lp = 0;					pstrcpy(password,lp+1);					got_pass = true;					memset(strchr_m(opteq+1,'%')+1,'X',strlen(password));				}				if ((lp=strchr_m(username,'/'))) {					*lp = 0;					pstrcpy(workgroup,lp+1);				}			} else if(!strcmp(opts, "passwd") ||				  !strcmp(opts, "password")) {				pstrcpy(password,opteq+1);				got_pass = true;				memset(opteq+1,'X',strlen(password));			} else if(!strcmp(opts, "credentials")) {				pstrcpy(credentials,opteq+1);			} else if(!strcmp(opts, "netbiosname")) {				pstrcpy(my_netbios_name,opteq+1);			} else if(!strcmp(opts, "uid")) {				mount_uid = nametouid(opteq+1);			} else if(!strcmp(opts, "gid")) {				mount_gid = nametogid(opteq+1);			} else if(!strcmp(opts, "port")) {				smb_port = val;			} else if(!strcmp(opts, "fmask")) {				mount_fmask = strtol(opteq+1, NULL, 8);			} else if(!strcmp(opts, "dmask")) {				mount_dmask = strtol(opteq+1, NULL, 8);			} else if(!strcmp(opts, "debug")) {				DEBUGLEVEL = val;			} else if(!strcmp(opts, "ip")) {				dest_ip = interpret_addr2(opteq+1);				if (is_zero_ip(dest_ip)) {					fprintf(stderr,"Can't resolve address %s\n", opteq+1);					exit(1);				}				have_ip = true;			} else if(!strcmp(opts, "workgroup")) {				pstrcpy(workgroup,opteq+1);			} else if(!strcmp(opts, "sockopt")) {				lp_set_cmdline("socket options", opteq+1);			} else if(!strcmp(opts, "scope")) {				lp_set_cmdline("netbios scope", opteq+1);			} else {				slprintf(p, sizeof(pstring) - (p - options) - 1, "%s=%s,", opts, opteq+1);				p += strlen(p);			}		} else {			val = 1;			if(!strcmp(opts, "nocaps")) {				fprintf(stderr, "Unhandled option: %s\n", opteq+1);				exit(1);			} else if(!strcmp(opts, "guest")) {				*password = '\0';				got_pass = true;			} else if(!strcmp(opts, "krb")) {#ifdef HAVE_KRB5				use_kerberos = true;				if(!status32_smbfs)					fprintf(stderr, "Warning: kerberos support will only work for samba servers\n");#else				fprintf(stderr,"No kerberos support compiled in\n");				exit(1);#endif			} else if(!strcmp(opts, "rw")) {				mount_ro = 0;			} else if(!strcmp(opts, "ro")) {				mount_ro = 1;			} else {				strncpy(p, opts, sizeof(pstring) - (p - options) - 1);				p += strlen(opts);				*p++ = ',';				*p = 0;			}		}	}	if (!*service) {		usage();		exit(1);	}	if (p != options) {		*(p-1) = 0;	/* remove trailing , */		DEBUG(3,("passthrough options '%s'\n", options));	}}/****************************************************************************  main program****************************************************************************/ int main(int argc,char *argv[]){	extern char *optarg;	extern int optind;	char *p;	struct loadparm_context *lp_ctx;	DEBUGLEVEL = 1;	/* here we are interactive, even if run from autofs */	setup_logging("mount.smbfs",DEBUG_STDERR);#if 0 /* JRA - Urban says not needed ? */	/* CLI_FORCE_ASCII=false makes smbmount negotiate unicode. The default	   is to not announce any unicode capabilities as current smbfs does	   not support it. */	p = getenv("CLI_FORCE_ASCII");	if (p && !strcmp(p, "false"))		unsetenv("CLI_FORCE_ASCII");	else		setenv("CLI_FORCE_ASCII", "true", 1);#endif	if (getenv("USER")) {		pstrcpy(username,getenv("USER"));		if ((p=strchr_m(username,'%'))) {			*p = 0;			pstrcpy(password,p+1);			got_pass = true;			memset(strchr_m(getenv("USER"),'%')+1,'X',strlen(password));		}		strupper(username);	}	if (getenv("PASSWD")) {		pstrcpy(password, getenv("PASSWD"));		got_pass = true;	}	if (getenv("PASSWD_FD") || getenv("PASSWD_FILE")) {		get_password_file();		got_pass = true;	}	if (*username == 0 && getenv("LOGNAME")) {		pstrcpy(username,getenv("LOGNAME"));	}	lp_ctx = loadparm_init(talloc_autofree_context());	if (!lp_load(lp_ctx, dyn_CONFIGFILE)) {		fprintf(stderr, "Can't load %s - run testparm to debug it\n", 			lp_config_file());	}	parse_mount_smb(argc, argv);	if (use_kerberos && !got_user) {		got_pass = true;	}	if (*credentials != 0) {		read_credentials_file(credentials);	}	DEBUG(3,("mount.smbfs started (version %s)\n", VERSION));	if (*workgroup == 0) {		pstrcpy(workgroup, lp_workgroup());	}	if (!*my_netbios_name) {		pstrcpy(my_netbios_name, myhostname());	}	strupper(my_netbios_name);	init_mount(lp_ctx);	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -