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; }
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); }
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; }
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; }
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; }
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; }
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; }
/* * 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; }
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); }