85e6b6747d07050e01ec91acef2453655821f9abGordon Ross/*
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * CDDL HEADER START
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross *
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * The contents of this file are subject to the terms of the
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * Common Development and Distribution License (the "License").
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * You may not use this file except in compliance with the License.
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross *
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * or http://www.opensolaris.org/os/licensing.
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * See the License for the specific language governing permissions
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * and limitations under the License.
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross *
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * When distributing Covered Code, include this CDDL HEADER in each
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * If applicable, add the following below this CDDL HEADER, with the
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * fields enclosed by brackets "[]" replaced with your own identifying
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * information: Portions Copyright [yyyy] [name of copyright owner]
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross *
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * CDDL HEADER END
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross */
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross/*
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross */
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross/*
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * Test program for opening an SMB connection directly.
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross */
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross#include <sys/types.h>
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross#include <errno.h>
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross#include <fcntl.h>
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross#include <stdio.h>
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross#include <stdlib.h>
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross#include <string.h>
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross#include <unistd.h>
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross#include <netdb.h>
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross#include <libintl.h>
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross#include <netsmb/smb_lib.h>
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Rossextern char *optarg;
85e6b6747d07050e01ec91acef2453655821f9abGordon Rossextern int optind, opterr, optopt;
85e6b6747d07050e01ec91acef2453655821f9abGordon Rossextern int smb_iod_connect(struct smb_ctx *);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Rossstatic char *server;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Rossstatic void
85e6b6747d07050e01ec91acef2453655821f9abGordon Rosstconn_usage(void)
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross{
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross printf("usage: tconn [-d domain][-u user][-p passwd] server\n");
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross exit(1);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross}
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Rossint
85e6b6747d07050e01ec91acef2453655821f9abGordon Rossmain(int argc, char *argv[])
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross{
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross int c, error, aflags;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross struct smb_ctx *ctx = NULL;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross char *dom = NULL;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross char *usr = NULL;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross char *pw = NULL;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross char *secopt = NULL;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross struct addrinfo *ai;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross while ((c = getopt(argc, argv, "vd:p:s:u:")) != -1) {
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross switch (c) {
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross case 'v':
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross smb_debug = 1;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross smb_verbose = 1;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross break;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross case 'd':
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross dom = optarg;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross break;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross case 'u':
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross usr = optarg;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross break;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross case 'p':
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross pw = optarg;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross break;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross case 's':
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross secopt = optarg;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross break;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross case '?':
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross tconn_usage();
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross break;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross }
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross }
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross if (optind >= argc)
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross tconn_usage();
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross server = argv[optind];
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross if (pw != NULL && (dom == NULL || usr == NULL)) {
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross fprintf(stderr, "%s: -p arg requires -d dom -u usr\n",
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross argv[0]);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross tconn_usage();
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross }
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross /*
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * This section is intended to demonstrate how an
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * RPC client library might use this interface.
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross */
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross error = smb_ctx_alloc(&ctx);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross if (error) {
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross fprintf(stderr, "%s: smb_ctx_alloc failed\n", argv[0]);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross goto out;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross }
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross /*
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * Set server, share, domain, user
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * (in the ctx handle).
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross */
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross smb_ctx_setfullserver(ctx, server);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross smb_ctx_setshare(ctx, "IPC$", USE_IPC);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross if (dom)
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross smb_ctx_setdomain(ctx, dom, B_TRUE);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross if (usr)
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross smb_ctx_setuser(ctx, usr, B_TRUE);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross if (pw)
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross smb_ctx_setpassword(ctx, pw, NULL);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross /*
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * Hackish option to override the Authentication Type flags.
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * Sorry about exposing the flag values here, but this is
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * really a programmer's test tool. See smbfs_api.h for
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * the SMB_AT_... flag values.
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross */
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross if (secopt != NULL) {
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross aflags = atoi(secopt);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross if (aflags < 1 || aflags > 0x1f) {
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross fprintf(stderr, "%s: -s {0..31}\n", argv[0]);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross tconn_usage();
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross }
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross smb_ctx_setauthflags(ctx, aflags);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross }
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross /*
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * Resolve the server address,
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * setup derived defaults.
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross */
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross error = smb_ctx_resolve(ctx);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross if (error) {
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross fprintf(stderr, "%s: smb_ctx_resolve failed\n", argv[0]);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross goto out;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross }
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross if ((ai = ctx->ct_addrinfo) == NULL) {
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross fprintf(stderr, "%s: no ct_addrinfo\n", argv[0]);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross goto out;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross }
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross memcpy(&ctx->ct_srvaddr, ai->ai_addr, ai->ai_addrlen);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross /*
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * If this code were in smbutil or mount_smbfs, it would
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross * get system and $HOME/.nsmbrc settings here, like this:
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross */
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross error = smb_iod_connect(ctx);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross if (error) {
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross fprintf(stderr, "%s: smb_iod_connect failed\n", argv[0]);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross goto out;
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross }
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross printf("Yea, we connected!\n");
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Rossout:
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross smb_ctx_free(ctx);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross return ((error) ? 1 : 0);
85e6b6747d07050e01ec91acef2453655821f9abGordon Ross}