int main(int argc, char *argv[]) { int islogin, error; char *p, *p1; struct ncp_conn_loginfo li; islogin = strcmp(__progname, "ncplogin") == 0; if (argc == 2) { if (strcmp(argv[1], "-h") == 0) { if (islogin) login_usage(); else logout_usage(); } } if (ncp_initlib()) exit(1); if (ncp_li_init(&li, argc, argv)) return 1; if (argc >= 2 && argv[argc - 1][0] == '/') { p = argv[argc - 1]; error = 1; do { if (*p++ != '/') break; p1 = strchr(p, ':'); if (p1 == NULL) break; *p1++ = 0; if (ncp_li_setserver(&li, p)) break; if (*p1 == 0) break; if (ncp_li_setuser(&li, p1)) break; error = 0; } while(0); if (error) errx(EX_DATAERR, "an error occurred while parsing '%s'", argv[argc - 1]); } if (ncp_li_readrc(&li)) return 1; if (ncp_rc) rc_close(ncp_rc); if (islogin) login(argc, argv, &li); else logout(argc, argv, &li); return 0; }
static void login(int argc, char *argv[], struct ncp_conn_loginfo *li) { int error = 0, connid, opt, setprimary = 0; while ((opt = getopt(argc, argv, STDPARAM_OPT"D")) != -1) { switch(opt){ case STDPARAM_ARGS: if (ncp_li_arg(li, opt, optarg)) exit(1); break; case 'D': setprimary = 1; break; default: login_usage(); /*NOTREACHED*/ } } if (li->access_mode == 0) li->access_mode = S_IRWXU; if (ncp_li_check(li)) exit(1); li->opt |= NCP_OPT_WDOG | NCP_OPT_PERMANENT; /* now we can try to login, or use already established connection */ error = ncp_li_login(li, &connid); if (error) { ncp_error("Could not login to server %s", error, li->server); exit(1); } error = ncp_setpermanent(connid, 1); if (error && errno != EACCES){ ncp_error("Can't make connection permanent", error); exit(1); } if (setprimary && ncp_setprimary(connid, 1) != 0) ncp_error("Warning: can't make connection primary", errno); printf("Logged in with conn handle:%d\n", connid); return; }
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); }