Example #1
0
File: ctx.c Project: execunix/vinos
int
smb_ctx_setserver(struct smb_ctx *ctx, const char *name)
{
	char *d;

	/*
	 * If the name contains dot, it's likely a IP address
	 * or a name. Update srvaddr in that case, and use
	 * first part of the name (up to the dot) as NetBIOS name.
	 */
	if ((d = strchr(name, '.'))) {
		static char nm[sizeof(ctx->ct_ssn.ioc_srvname)];
		int error;

		error = smb_ctx_setsrvaddr(ctx, name);
		if (error)
			return (error);
		
		/* cut name to MAXSRVNAMELEN */
		if (strlen(name) >= sizeof(ctx->ct_ssn.ioc_srvname)) {
			snprintf(nm, sizeof(nm), "%.*s",
			    (int)(sizeof(ctx->ct_ssn.ioc_srvname) - 1), name);
			name = nm;
		}
	}

	if (strlen(name) >= sizeof(ctx->ct_ssn.ioc_srvname)) {
		smb_error("server name '%s' too long", 0, name);
		return ENAMETOOLONG;
	}
	nls_str_upper(ctx->ct_ssn.ioc_srvname, name);
	return 0;
}
Example #2
0
int
cmd_logout(int argc, char *argv[])
{
	char *dom, *usr;
	int err, opt;

	while ((opt = getopt(argc, argv, "a")) != EOF) {
		switch (opt) {

		case 'a':	/* smbutil logout -a */
			if (optind != argc)
				logout_usage();
			err = smbfs_keychain_del_owner();
			if (err)
				errx(1,
gettext("failed to delete keychain entries"));
			return (0);

		default:
			logout_usage();
			break;
		}
	}

	/* This part is like login. */
	dom = usr = NULL;
	if (optind < argc) {
		strcpy(tmp_arg, argv[optind]);
		err = smbfs_parse_domuser(tmp_arg, &dom, &usr);
		if (err)
			errx(1, gettext("failed to parse %s"), argv[optind]);
		optind++;
	}
	if (optind != argc)
		logout_usage();

	if (dom == NULL || usr == NULL) {
		err = smbfs_default_dom_usr(NULL, NULL,
		    def_dom, sizeof (def_dom),
		    def_usr, sizeof (def_usr));
		if (err)
			errx(1, gettext("failed to get defaults"));
	}
	if (dom == NULL)
		dom = def_dom;
	else
		nls_str_upper(dom, dom);
	if (usr == NULL)
		usr = def_usr;

	err = smbfs_keychain_del((uid_t)-1, dom, usr);
	if (err)
		errx(1, gettext("failed to delete keychain entry"));

	return (0);
}
Example #3
0
int
smb_ctx_setworkgroup(struct smb_ctx *ctx, const char *name)
{
	if (strlen(name) >= SMB_MAXUSERNAMELEN) {
		smb_error("workgroup name '%s' too long", 0, name);
		return ENAMETOOLONG;
	}
	nls_str_upper(ctx->ct_ssn.ioc_workgroup, name);
	return 0;
}
Example #4
0
int
smb_ctx_setserver(struct smb_ctx *ctx, const char *name)
{
	if (strlen(name) >= SMB_MAXSRVNAMELEN) {
		smb_error("server name '%s' too long", 0, name);
		return ENAMETOOLONG;
	}
	nls_str_upper(ctx->ct_ssn.ioc_srvname, name);
	return 0;
}
Example #5
0
int
smb_ctx_setuser(struct smb_ctx *ctx, const char *name)
{
	if (strlen(name) > SMB_MAXUSERNAMELEN) {
		smb_error("user name '%s' too long", 0, name);
		return ENAMETOOLONG;
	}
	nls_str_upper(ctx->ct_ssn.ioc_user, name);
	return 0;
}
Example #6
0
int
smb_ctx_setshare(struct smb_ctx *ctx, const char *share, int stype)
{
	if (strlen(share) >= SMB_MAXSHARENAMELEN) {
		smb_error("share name '%s' too long", 0, share);
		return ENAMETOOLONG;
	}
	nls_str_upper(ctx->ct_sh.ioc_share, share);
	if (share[0] != 0)
		ctx->ct_parsedlevel = SMBL_SHARE;
	ctx->ct_sh.ioc_stype = stype;
	return 0;
}
Example #7
0
int
nb_ctx_setscope(struct nb_ctx *ctx, const char *scope)
{
	size_t slen = strlen(scope);

	if (slen >= 128) {
		smb_error("scope '%s' is too long", 0, scope);
		return ENAMETOOLONG;
	}
	if (ctx->nb_scope)
		free(ctx->nb_scope);
	ctx->nb_scope = malloc(slen + 1);
	if (ctx->nb_scope == NULL)
		return ENOMEM;
	nls_str_upper(ctx->nb_scope, scope);
	return 0;
}
Example #8
0
/*
 * Verify context before connect operation(s),
 * lookup specified server and try to fill all forgotten fields.
 */
int
smb_ctx_resolve(struct smb_ctx *ctx)
{
	struct smbioc_ossn *ssn = &ctx->ct_ssn;
	struct smbioc_oshare *sh = &ctx->ct_sh;
	struct nb_name nn;
	struct sockaddr *sap;
	struct sockaddr_nb *salocal, *saserver;
	char *cp;
	u_char cstbl[256];
	u_int i;
	int error = 0;
	
	ctx->ct_flags &= ~SMBCF_RESOLVED;
	if (ssn->ioc_srvname[0] == 0) {
		smb_error("no server name specified", 0);
		return EINVAL;
	}
	if (ssn->ioc_user[0] == 0) {
		smb_error("no user name specified for server %s",
		    0, ssn->ioc_srvname);
		return EINVAL;
	}
	if (ctx->ct_minlevel >= SMBL_SHARE && sh->ioc_share[0] == 0) {
		smb_error("no share name specified for %s@%s",
		    0, ssn->ioc_user, ssn->ioc_srvname);
		return EINVAL;
	}
	error = nb_ctx_resolve(ctx->ct_nb);
	if (error)
		return error;
	if (ssn->ioc_localcs[0] == 0)
		strcpy(ssn->ioc_localcs, "default");	/* XXX: locale name ? */
	error = smb_addiconvtbl("tolower", ssn->ioc_localcs, nls_lower);
	if (error)
		return error;
	error = smb_addiconvtbl("toupper", ssn->ioc_localcs, nls_upper);
	if (error)
		return error;
	if (ssn->ioc_servercs[0] != 0) {
		for(i = 0; i < sizeof(cstbl); i++)
			cstbl[i] = i;
		nls_mem_toext(cstbl, cstbl, sizeof(cstbl));
		error = smb_addiconvtbl(ssn->ioc_servercs, ssn->ioc_localcs, cstbl);
		if (error)
			return error;
		for(i = 0; i < sizeof(cstbl); i++)
			cstbl[i] = i;
		nls_mem_toloc(cstbl, cstbl, sizeof(cstbl));
		error = smb_addiconvtbl(ssn->ioc_localcs, ssn->ioc_servercs, cstbl);
		if (error)
			return error;
	}
	if (ctx->ct_srvaddr) {
		error = nb_resolvehost_in(ctx->ct_srvaddr, &sap);
	} else {
		error = nbns_resolvename(ssn->ioc_srvname, ctx->ct_nb, &sap);
	}
	if (error) {
		smb_error("can't get server address", error);
		return error;
	}
	nn.nn_scope = ctx->ct_nb->nb_scope;
	nn.nn_type = NBT_SERVER;
	strcpy(nn.nn_name, ssn->ioc_srvname);
	error = nb_sockaddr(sap, &nn, &saserver);
	nb_snbfree(sap);
	if (error) {
		smb_error("can't allocate server address", error);
		return error;
	}
	ssn->ioc_server = (struct sockaddr*)saserver;
	if (ctx->ct_locname[0] == 0) {
		error = nb_getlocalname(ctx->ct_locname);
		if (error) {
			smb_error("can't get local name", error);
			return error;
		}
		nls_str_upper(ctx->ct_locname, ctx->ct_locname);
	}
	strcpy(nn.nn_name, ctx->ct_locname);
	nn.nn_type = NBT_WKSTA;
	nn.nn_scope = ctx->ct_nb->nb_scope;
	error = nb_sockaddr(NULL, &nn, &salocal);
	if (error) {
		nb_snbfree((struct sockaddr*)saserver);
		smb_error("can't allocate local address", error);
		return error;
	}
	ssn->ioc_local = (struct sockaddr*)salocal;
	ssn->ioc_lolen = salocal->snb_len;
	ssn->ioc_svlen = saserver->snb_len;
	if (ssn->ioc_password[0] == 0 && (ctx->ct_flags & SMBCF_NOPWD) == 0) {
		cp = getpass("Password:");
		error = smb_ctx_setpassword(ctx, cp);
		if (error)
			return error;
	}
	ctx->ct_flags |= SMBCF_RESOLVED;
	return 0;
}
Example #9
0
int
cmd_login(int argc, char *argv[])
{
	static char prompt[64];
	char *dom, *usr, *pass;
	int err, opt;
	int check = 0;

	while ((opt = getopt(argc, argv, "c")) != EOF) {
		switch (opt) {

		case 'c':	/* smbutil login -c ... */
			check = 1;
			break;

		default:
			login_usage();
			break;
		}
	}

	dom = usr = NULL;
	if (optind < argc) {
		strcpy(tmp_arg, argv[optind]);
		err = smbfs_parse_domuser(tmp_arg, &dom, &usr);
		if (err)
			errx(1, gettext("failed to parse %s"), argv[optind]);
		optind++;
	}
	if (optind != argc)
		login_usage();

	if (dom == NULL || usr == NULL) {
		err = smbfs_default_dom_usr(NULL, NULL,
		    def_dom, sizeof (def_dom),
		    def_usr, sizeof (def_usr));
		if (err)
			errx(1, gettext("failed to get defaults"));
	}
	if (dom == NULL)
		dom = def_dom;
	else
		nls_str_upper(dom, dom);
	if (usr == NULL)
		usr = def_usr;

	if (check) {
		err = smbfs_keychain_chk(dom, usr);
		if (!err)
			printf(gettext("Keychain entry exists.\n"));
		else
			printf(gettext("Keychain entry not found.\n"));
		return (0);
	}

	snprintf(prompt, sizeof (prompt),
	    gettext("Password for %s/%s:"), dom, usr);
	pass = getpassphrase(prompt);

	err = smbfs_keychain_add((uid_t)-1, dom, usr, pass);
	if (err)
		errx(1, gettext("failed to add keychain entry"));

	return (0);
}