1/*
2   Unix SMB/CIFS implementation.
3   SMB wrapper functions - frontend
4   Copyright (C) Andrew Tridgell 1998
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2 of the License, or
9   (at your option) any later version.
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program; if not, write to the Free Software
18   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include "includes.h"
22
23static void smbsh_usage(void)
24{
25	printf("smbsh [options]\n\n");
26	printf(" -W workgroup\n");
27	printf(" -U username\n");
28	printf(" -P prefix\n");
29	printf(" -R resolve order\n");
30	printf(" -d debug level\n");
31	printf(" -l logfile\n");
32	printf(" -L libdir\n");
33	exit(0);
34}
35
36int main(int argc, char *argv[])
37{
38	char *p, *u;
39	const char *libd = dyn_LIBDIR;
40	pstring line, wd;
41	int opt;
42	extern char *optarg;
43	extern int optind;
44
45	dbf = x_stdout;
46	smbw_setup_shared();
47
48	while ((opt = getopt(argc, argv, "W:U:R:d:P:l:hL:")) != EOF) {
49		switch (opt) {
50		case 'L':
51			libd = optarg;
52			break;
53		case 'W':
54			smbw_setshared("WORKGROUP", optarg);
55			break;
56		case 'l':
57			smbw_setshared("LOGFILE", optarg);
58			break;
59		case 'P':
60			smbw_setshared("PREFIX", optarg);
61			break;
62		case 'd':
63			smbw_setshared("DEBUG", optarg);
64			break;
65		case 'U':
66			p = strchr_m(optarg,'%');
67			if (p) {
68				*p=0;
69				smbw_setshared("PASSWORD",p+1);
70			}
71			smbw_setshared("USER", optarg);
72			break;
73		case 'R':
74			smbw_setshared("RESOLVE_ORDER",optarg);
75			break;
76
77		case 'h':
78		default:
79			smbsh_usage();
80		}
81	}
82
83
84	if (!smbw_getshared("USER")) {
85		printf("Username: ");
86		u = fgets_slash(line, sizeof(line)-1, x_stdin);
87		smbw_setshared("USER", u);
88	}
89
90	if (!smbw_getshared("PASSWORD")) {
91		p = getpass("Password: ");
92		smbw_setshared("PASSWORD", p);
93	}
94
95	setenv("PS1", "smbsh$ ", 1);
96
97	sys_getwd(wd);
98
99	slprintf(line,sizeof(line)-1,"PWD_%d", (int)getpid());
100
101	smbw_setshared(line, wd);
102
103	slprintf(line,sizeof(line)-1,"%s/smbwrapper.so", libd);
104	setenv("LD_PRELOAD", line, 1);
105
106	slprintf(line,sizeof(line)-1,"%s/smbwrapper.32.so", libd);
107
108	if (file_exist(line, NULL)) {
109		slprintf(line,sizeof(line)-1,"%s/smbwrapper.32.so:DEFAULT", libd);
110		setenv("_RLD_LIST", line, 1);
111		slprintf(line,sizeof(line)-1,"%s/smbwrapper.so:DEFAULT", libd);
112		setenv("_RLDN32_LIST", line, 1);
113	} else {
114		slprintf(line,sizeof(line)-1,"%s/smbwrapper.so:DEFAULT", libd);
115		setenv("_RLD_LIST", line, 1);
116	}
117
118	{
119    	char *shellpath = getenv("SHELL");
120		if(shellpath)
121			execl(shellpath,"smbsh",NULL);
122		else
123			execl("/bin/sh","smbsh",NULL);
124	}
125	printf("launch failed!\n");
126	return 1;
127}
128