4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Copyright (c) 2000, Boris Popov
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * All rights reserved.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Redistribution and use in source and binary forms, with or without
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * modification, are permitted provided that the following conditions
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * are met:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 1. Redistributions of source code must retain the above copyright
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * notice, this list of conditions and the following disclaimer.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 2. Redistributions in binary form must reproduce the above copyright
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * notice, this list of conditions and the following disclaimer in the
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * documentation and/or other materials provided with the distribution.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 3. All advertising materials mentioning features or use of this software
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * must display the following acknowledgement:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * This product includes software developed by Boris Popov.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 4. Neither the name of the author nor the names of any co-contributors
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * may be used to endorse or promote products derived from this software
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * without specific prior written permission.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * SUCH DAMAGE.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * $Id: view.c,v 1.9 2004/12/13 00:25:39 lindak Exp $
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross/*
ae3d7f90695ef456a6da4f7bdccd448ebe0b99e1Gordon Ross * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross#include <sys/types.h>
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross#include <errno.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <stdio.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <err.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <unistd.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <strings.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <stdlib.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sysexits.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <libintl.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross#include <netsmb/smb.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <netsmb/smb_lib.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <netsmb/smb_netshareenum.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include "common.h"
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossint enum_shares(smb_ctx_t *);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossvoid print_shares(int, int, struct share_info *);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossvoid
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossview_usage(void)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross{
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross printf(gettext("usage: smbutil view [connection options] //"
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross "[workgroup;][user[:password]@]server\n"));
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross exit(1);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross}
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossint
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rosscmd_view(int argc, char *argv[])
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross{
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross struct smb_ctx *ctx;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross int error, err2, opt;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (argc < 2)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross view_usage();
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross error = smb_ctx_alloc(&ctx);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (error)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (error);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross error = smb_ctx_scan_argv(ctx, argc, argv,
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross SMBL_SERVER, SMBL_SERVER, USE_WILDCARD);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (error)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (error);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross error = smb_ctx_readrc(ctx);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (error)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (error);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross while ((opt = getopt(argc, argv, STDPARAM_OPT)) != EOF) {
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (opt == '?')
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross view_usage();
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross error = smb_ctx_opt(ctx, opt, optarg);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (error)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (error);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross }
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross smb_ctx_setshare(ctx, "IPC$", USE_IPC);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /*
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Resolve the server address,
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * setup derived defaults.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross error = smb_ctx_resolve(ctx);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (error)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (error);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /*
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Have server, share, etc. from above:
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * smb_ctx_scan_argv, option settings.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Get the session and tree.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossagain:
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross error = smb_ctx_get_ssn(ctx);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (error == EAUTH) {
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross err2 = smb_get_authentication(ctx);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (err2 == 0)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross goto again;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross }
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (error) {
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross smb_error(gettext("//%s: login failed"),
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross error, ctx->ct_fullserver);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (error);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross }
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross error = smb_ctx_get_tree(ctx);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (error) {
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross smb_error(gettext("//%s/%s: tree connect failed"),
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross error, ctx->ct_fullserver, ctx->ct_origshare);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (error);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross }
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /*
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Have IPC$ tcon, now list shares.
ae3d7f90695ef456a6da4f7bdccd448ebe0b99e1Gordon Ross * This prints its own errors.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross error = enum_shares(ctx);
ae3d7f90695ef456a6da4f7bdccd448ebe0b99e1Gordon Ross if (error)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (error);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross smb_ctx_free(ctx);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (0);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross}
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#ifdef I18N /* not defined, put here so xgettext(1) can find strings */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic char *shtype[] = {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow gettext("disk"),
4bff34e37def8a90f9194d81bc345c52ba20086athurlow gettext("printer"),
4bff34e37def8a90f9194d81bc345c52ba20086athurlow gettext("device"), /* Communications device */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow gettext("IPC"), /* Inter process communication */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow gettext("unknown")
4bff34e37def8a90f9194d81bc345c52ba20086athurlow};
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#else
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic char *shtype[] = {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "disk",
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "printer",
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "device", /* Communications device */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "IPC", /* IPC Inter process communication */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "unknown"
4bff34e37def8a90f9194d81bc345c52ba20086athurlow};
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#endif
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossenum_shares(smb_ctx_t *ctx)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross struct share_info *share_info;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross int error, entries, total;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /*
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * XXX: Later, try RPC first,
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * then fall back to RAP...
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow error = smb_netshareenum(ctx, &entries, &total, &share_info);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (error) {
ae3d7f90695ef456a6da4f7bdccd448ebe0b99e1Gordon Ross smb_error(gettext("//%s failed to list shares"),
ae3d7f90695ef456a6da4f7bdccd448ebe0b99e1Gordon Ross error, ctx->ct_fullserver);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (error);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross print_shares(entries, total, share_info);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (0);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross}
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossvoid
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossprint_shares(int entries, int total,
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross struct share_info *share_info)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross{
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross struct share_info *ep;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross int i;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross printf(gettext("Share Type Comment\n"));
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross printf("-------------------------------\n");
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
4bff34e37def8a90f9194d81bc345c52ba20086athurlow for (ep = share_info, i = 0; i < entries; i++, ep++) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int sti = ep->type & STYPE_MASK;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (sti > STYPE_UNKNOWN)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow sti = STYPE_UNKNOWN;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow printf("%-12s %-10s %s\n", ep->netname,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow gettext(shtype[sti]),
4bff34e37def8a90f9194d81bc345c52ba20086athurlow ep->remark ? ep->remark : "");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow free(ep->netname);
9c9af2590af49bb395bc8d2eace0f2d4ea16d165Gordon Ross free(ep->remark);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow printf(gettext("\n%d shares listed from %d available\n"),
4bff34e37def8a90f9194d81bc345c52ba20086athurlow entries, total);
9c9af2590af49bb395bc8d2eace0f2d4ea16d165Gordon Ross
4bff34e37def8a90f9194d81bc345c52ba20086athurlow free(share_info);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}