login.c revision 88282
1/* 2 * Copyright (c) 2000, Boris Popov 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by Boris Popov. 16 * 4. Neither the name of the author nor the names of any co-contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * 32 * $Id: login.c,v 1.6 2001/08/22 03:33:38 bp Exp $ 33 */ 34#include <sys/param.h> 35#include <sys/errno.h> 36#include <sys/stat.h> 37#include <err.h> 38#include <stdio.h> 39#include <unistd.h> 40#include <strings.h> 41#include <stdlib.h> 42#include <sysexits.h> 43 44#include <cflib.h> 45 46#include <netsmb/smb_lib.h> 47#include <netsmb/smb_conn.h> 48 49#include "common.h" 50 51 52int 53cmd_login(int argc, char *argv[]) 54{ 55 struct smb_ctx sctx, *ctx = &sctx; 56 int error, opt, setprimary = 0, level; 57 58 if (argc < 2) 59 login_usage(); 60 if (smb_ctx_init(ctx, argc, argv, SMBL_VC, SMBL_SHARE, SMB_ST_ANY) != 0) 61 exit(1); 62 if (smb_ctx_readrc(ctx) != 0) 63 exit(1); 64 if (smb_rc) 65 rc_close(smb_rc); 66 while ((opt = getopt(argc, argv, STDPARAM_OPT"D")) != EOF) { 67 switch(opt){ 68 case STDPARAM_ARGS: 69 error = smb_ctx_opt(ctx, opt, optarg); 70 if (error) 71 exit(1); 72 break; 73 case 'D': 74 setprimary = 1; 75 break; 76 default: 77 login_usage(); 78 /*NOTREACHED*/ 79 } 80 } 81#ifdef APPLE 82 if (loadsmbvfs()) 83 errx(EX_OSERR, "SMB filesystem is not available"); 84#endif 85 if (smb_ctx_resolve(ctx) != 0) 86 exit(1); 87 level = ctx->ct_parsedlevel; 88 error = smb_ctx_lookup(ctx, level, 0); 89 if (error == 0) { 90 smb_error("connection already exists", error); 91 exit(0); 92 } 93 error = smb_ctx_lookup(ctx, level, SMBLK_CREATE); 94 if (error) { 95 smb_error("could not login to server %s", error, ctx->ct_ssn.ioc_srvname); 96 exit(1); 97 } 98 switch (level) { 99 case SMBL_VC: 100 opt = SMBV_PERMANENT; 101 break; 102 case SMBL_SHARE: 103 opt = SMBS_PERMANENT; 104 break; 105 default: 106 smb_error("unknown connection level %d", 0, level); 107 exit(1); 108 } 109 error = smb_ctx_setflags(ctx, level, opt, opt); 110 if (error && error != EACCES) { 111 smb_error("Can't make connection permanent", error); 112 exit(1); 113 } 114 printf("Connected to %s%s%s\n", ctx->ct_ssn.ioc_user, 115 level == SMBL_SHARE ? "@" : "", 116 level == SMBL_SHARE ? ctx->ct_sh.ioc_share : ""); 117 return 0; 118} 119 120int 121cmd_logout(int argc, char *argv[]) 122{ 123 struct smb_ctx sctx, *ctx = &sctx; 124 int error, opt, level; 125 126 if (argc < 2) 127 logout_usage(); 128 if (smb_ctx_init(ctx, argc, argv, SMBL_VC, SMBL_SHARE, SMB_ST_ANY) != 0) 129 exit(1); 130 if (smb_ctx_readrc(ctx) != 0) 131 exit(1); 132 if (smb_rc) 133 rc_close(smb_rc); 134 while ((opt = getopt(argc, argv, STDPARAM_OPT)) != EOF){ 135 switch (opt) { 136 case STDPARAM_ARGS: 137 error = smb_ctx_opt(ctx, opt, optarg); 138 if (error) 139 exit(1); 140 break; 141 default: 142 logout_usage(); 143 /*NOTREACHED*/ 144 } 145 } 146#ifdef APPLE 147 error = loadsmbvfs(); 148 if (error) 149 errx(EX_OSERR, "SMB filesystem is not available"); 150#endif 151 ctx->ct_ssn.ioc_opt &= ~SMBVOPT_CREATE; 152 ctx->ct_sh.ioc_opt &= ~SMBSOPT_CREATE; 153 if (smb_ctx_resolve(ctx) != 0) 154 exit(1); 155 level = ctx->ct_parsedlevel; 156 error = smb_ctx_lookup(ctx, level, 0); 157 if (error == ENOENT) { 158/* ctx->ct_ssn.ioc_opt |= SMBCOPT_SINGLE; 159 error = smb_ctx_login(ctx); 160 if (error == ENOENT) { 161 ctx->ct_ssn.ioc_opt |= SMBCOPT_PRIVATE; 162 error = smb_ctx_login(ctx); 163 if (error == ENOENT) { 164 ctx->ct_ssn.ioc_opt &= ~SMBCOPT_SINGLE; 165 error = smb_ctx_login(ctx); 166 } 167 }*/ 168 if (error) { 169 smb_error("There is no connection to %s", error, ctx->ct_ssn.ioc_srvname); 170 exit(1); 171 } 172 } 173 if (error) 174 exit(1); 175 switch (level) { 176 case SMBL_VC: 177 opt = SMBV_PERMANENT; 178 break; 179 case SMBL_SHARE: 180 opt = SMBS_PERMANENT; 181 break; 182 default: 183 smb_error("unknown connection level %d", 0, level); 184 exit(1); 185 } 186 error = smb_ctx_setflags(ctx, level, opt, 0); 187 if (error && error != EACCES) { 188 smb_error("Can't release connection", error); 189 exit(1); 190 } 191 printf("Connection unmarked as permanent and will be closed when possible\n"); 192 exit(0); 193} 194 195void 196login_usage(void) 197{ 198 printf( 199 "usage: smbutil login [-E cs1:cs2] [-I host] [-L locale] [-M crights:srights]\n" 200 " [-N cowner:cgroup/sowner:sgroup] [-P]\n" 201 " [-R retrycount] [-T timeout]\n" 202 " [-W workgroup] //user@server\n"); 203 exit(1); 204} 205 206void 207logout_usage(void) 208{ 209 printf("usage: smbutil logout [user@server]\n"); 210 exit(1); 211} 212