1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-27 03:21:53 +03:00

Merge branch 'v3-2-test' of ssh://git.samba.org/data/git/samba into v3-2-simo

This commit is contained in:
Simo Sorce 2007-12-05 17:55:50 -05:00
commit 78581ad070

View File

@ -27,14 +27,14 @@ extern bool in_client;
extern char *optarg;
extern int optind;
static pstring credentials;
static pstring my_netbios_name;
static pstring password;
static pstring username;
static pstring workgroup;
static pstring mpoint;
static pstring service;
static pstring options;
static char *credentials;
static fstring my_netbios_name;
static char *password;
static char *username;
static fstring workgroup;
static char *mpoint;
static char *service;
static char *options;
static struct sockaddr_storage dest_ip;
static bool have_ip;
@ -122,15 +122,22 @@ static struct cli_state *do_connection(char *the_service)
struct nmb_name called, calling;
char *server_n;
struct sockaddr_storage ip;
pstring server;
char *server;
char *share;
const char *c_username;
const char *c_password;
TALLOC_CTX *ctx = talloc_tos();
if (the_service[0] != '\\' || the_service[1] != '\\') {
usage();
exit(1);
}
pstrcpy(server, the_service+2);
server = talloc_strdup(ctx, the_service+2);
if (!server) {
fprintf(stderr,"Out of memory\n");
exit(ENOMEM);
}
share = strchr_m(server,'\\');
if (!share) {
usage();
@ -195,7 +202,10 @@ static struct cli_state *do_connection(char *the_service)
if (!got_pass) {
char *pass = getpass("Password: ");
if (pass) {
pstrcpy(password, pass);
password = talloc_strdup(talloc_tos(), pass);
if (!password) {
return NULL;
}
}
}
@ -211,13 +221,17 @@ static struct cli_state *do_connection(char *the_service)
c->force_dos_errors = True;
}
if (!NT_STATUS_IS_OK(cli_session_setup(c, username,
password, strlen(password),
password, strlen(password),
workgroup))) {
c_password = password ? password : "";
c_username = username ? username : "";
if (!NT_STATUS_IS_OK(cli_session_setup(c,
c_username,
c_password, strlen(c_password),
c_password, strlen(c_password),
workgroup))) {
/* if a password was not supplied then try again with a
null username */
if (password[0] || !username[0] ||
if (c_password[0] || !c_username[0] ||
!NT_STATUS_IS_OK(cli_session_setup(c, "", "", 0, "", 0, workgroup))) {
DEBUG(0,("%d: session setup failed: %s\n",
sys_getpid(), cli_errstr(c)));
@ -230,7 +244,7 @@ static struct cli_state *do_connection(char *the_service)
DEBUG(4,("%d: session setup ok\n", sys_getpid()));
if (!cli_send_tconX(c, share, "?????",
password, strlen(password)+1)) {
c_password, strlen(c_password)+1)) {
DEBUG(0,("%d: tree connect failed: %s\n",
sys_getpid(), cli_errstr(c)));
cli_shutdown(c);
@ -244,7 +258,6 @@ static struct cli_state *do_connection(char *the_service)
return c;
}
/****************************************************************************
unmount smbfs (this is a bailout routine to clean up if a reconnect fails)
Code blatently stolen from smbumount.c
@ -428,13 +441,16 @@ static void send_fs_socket(char *the_service, char *mount_point, struct cli_stat
/**
* Mount a smbfs
**/
#define NUM_ARGS 20
static void init_mount(void)
{
char mount_point[PATH_MAX+1];
pstring tmp;
pstring svc2;
TALLOC_CTX *ctx = talloc_tos();
char *svc2;
struct cli_state *c;
const char *args[20];
const char *args[NUM_ARGS];
int i, status;
if (realpath(mpoint, mount_point) == NULL) {
@ -455,11 +471,15 @@ static void init_mount(void)
*/
daemonize();
pstrcpy(svc2, service);
svc2 = talloc_strdup(ctx, service);
if (!svc2) {
fprintf(stderr, "Out of memory.\n");
exit(ENOMEM);
}
string_replace(svc2, '\\','/');
string_replace(svc2, ' ','_');
memset(args, 0, sizeof(args[0])*20);
memset(args, 0, sizeof(args[0])*NUM_ARGS);
i=0;
args[i++] = "smbmnt";
@ -468,30 +488,46 @@ static void init_mount(void)
args[i++] = "-s";
args[i++] = svc2;
if (mount_ro) {
if (mount_ro && i < NUM_ARGS-2) {
args[i++] = "-r";
}
if (mount_uid) {
slprintf(tmp, sizeof(tmp)-1, "%d", mount_uid);
if (mount_uid && i < NUM_ARGS-3) {
args[i++] = "-u";
args[i++] = smb_xstrdup(tmp);
args[i] = talloc_asprintf(ctx, "%d", mount_uid);
if (!args[i]) {
fprintf(stderr, "Out of memory.\n");
exit(ENOMEM);
}
i++;
}
if (mount_gid) {
slprintf(tmp, sizeof(tmp)-1, "%d", mount_gid);
if (mount_gid && i < NUM_ARGS-3) {
args[i++] = "-g";
args[i++] = smb_xstrdup(tmp);
args[i] = talloc_asprintf(ctx, "%d", mount_gid);
if (!args[i]) {
fprintf(stderr, "Out of memory.\n");
exit(ENOMEM);
}
i++;
}
if (mount_fmask) {
slprintf(tmp, sizeof(tmp)-1, "0%o", mount_fmask);
if (mount_fmask && i < NUM_ARGS-3) {
args[i++] = "-f";
args[i++] = smb_xstrdup(tmp);
args[i] = talloc_asprintf(ctx, "0%o", mount_fmask);
if (!args[i]) {
fprintf(stderr, "Out of memory.\n");
exit(ENOMEM);
}
i++;
}
if (mount_dmask) {
slprintf(tmp, sizeof(tmp)-1, "0%o", mount_dmask);
if (mount_dmask && i < NUM_ARGS-3) {
args[i++] = "-d";
args[i++] = smb_xstrdup(tmp);
args[i] = talloc_asprintf(ctx, "0%o", mount_dmask);
if (!args[i]) {
fprintf(stderr, "Out of memory.\n");
exit(ENOMEM);
}
i++;
}
if (options) {
if (options && i < NUM_ARGS-3) {
args[i++] = "-o";
args[i++] = options;
}
@ -500,7 +536,7 @@ static void init_mount(void)
char *smbmnt_path;
asprintf(&smbmnt_path, "%s/smbmnt", dyn_BINDIR);
if (file_exist(smbmnt_path, NULL)) {
execv(smbmnt_path, (char * const *)args);
fprintf(stderr,
@ -544,22 +580,33 @@ static void init_mount(void)
get a password from a a file or file descriptor
exit on failure (from smbclient, move to libsmb or shared .c file?)
****************************************************************************/
static void get_password_file(void)
{
int fd = -1;
char *p;
bool close_it = False;
pstring spec;
char *spec;
TALLOC_CTX *ctx = talloc_tos();
char pass[128];
if ((p = getenv("PASSWD_FD")) != NULL) {
pstrcpy(spec, "descriptor ");
pstrcat(spec, p);
sscanf(p, "%d", &fd);
spec = talloc_asprintf(ctx,
"descriptor %s",
p);
if (!spec) {
fprintf(stderr, "Out of memory.\n");
exit(ENOMEM);
}
fd = atoi(p);
close_it = False;
} else if ((p = getenv("PASSWD_FILE")) != NULL) {
fd = sys_open(p, O_RDONLY, 0);
pstrcpy(spec, p);
spec = talloc_strdup(ctx, p);
if (!spec) {
fprintf(stderr, "Out of memory.\n");
exit(ENOMEM);
}
if (fd < 0) {
fprintf(stderr, "Error opening PASSWD_FILE %s: %s\n",
spec, strerror(errno));
@ -593,7 +640,7 @@ static void get_password_file(void)
exit(1);
}
}
pstrcpy(password, pass);
password = talloc_strdup(ctx, pass);
if (close_it)
close(fd);
}
@ -602,7 +649,8 @@ static void get_password_file(void)
get username and password from a credentials file
exit on failure (from smbclient, move to libsmb or shared .c file?)
****************************************************************************/
static void read_credentials_file(char *filename)
static void read_credentials_file(const char *filename)
{
FILE *auth;
fstring buf;
@ -645,11 +693,11 @@ static void read_credentials_file(char *filename)
if (strwicmp("password", param) == 0)
{
pstrcpy(password, val);
password = talloc_strdup(talloc_tos(),val);
got_pass = True;
}
else if (strwicmp("username", param) == 0) {
pstrcpy(username, val);
username = talloc_strdup(talloc_tos(), val);
}
memset(buf, 0, sizeof(buf));
@ -716,7 +764,7 @@ static void parse_mount_smb(int argc, char **argv)
char *opts;
char *opteq;
int val;
char *p;
TALLOC_CTX *ctx = talloc_tos();
/* FIXME: This function can silently fail if the arguments are
* not in the expected order.
@ -733,9 +781,17 @@ static void parse_mount_smb(int argc, char **argv)
usage();
exit(1);
}
pstrcpy(service, argv[1]);
pstrcpy(mpoint, argv[2]);
service = talloc_strdup(ctx, argv[1]);
if (!service) {
fprintf(stderr,"Out of memory\n");
exit(ENOMEM);
}
mpoint = talloc_strdup(ctx, argv[2]);
if (!mpoint) {
fprintf(stderr,"Out of memory\n");
exit(ENOMEM);
}
/* Convert any '/' characters in the service name to
'\' characters */
@ -748,8 +804,11 @@ static void parse_mount_smb(int argc, char **argv)
return;
}
options[0] = 0;
p = options;
options = talloc_strdup(ctx, "");
if (!options) {
fprintf(stderr,"Out of memory\n");
exit(ENOMEM);
}
/*
* option parsing from nfsmount.c (util-linux-2.9u)
@ -760,30 +819,46 @@ static void parse_mount_smb(int argc, char **argv)
val = atoi(opteq + 1);
*opteq = '\0';
if (!strcmp(opts, "username") ||
if (!strcmp(opts, "username") ||
!strcmp(opts, "logon")) {
char *lp;
got_user = True;
pstrcpy(username,opteq+1);
username = talloc_strdup(ctx, opteq+1);
if (!username) {
fprintf(stderr,"Out of memory\n");
exit(ENOMEM);
}
if ((lp=strchr_m(username,'%'))) {
*lp = 0;
pstrcpy(password,lp+1);
password = talloc_strdup(ctx, lp+1);
if (!password) {
fprintf(stderr,"Out of memory\n");
exit(ENOMEM);
}
got_pass = True;
memset(strchr_m(opteq+1,'%')+1,'X',strlen(password));
}
if ((lp=strchr_m(username,'/'))) {
*lp = 0;
pstrcpy(workgroup,lp+1);
fstrcpy(workgroup,lp+1);
}
} else if(!strcmp(opts, "passwd") ||
!strcmp(opts, "password")) {
pstrcpy(password,opteq+1);
password = talloc_strdup(ctx,opteq+1);
if (!password) {
fprintf(stderr,"Out of memory\n");
exit(ENOMEM);
}
got_pass = True;
memset(opteq+1,'X',strlen(password));
} else if(!strcmp(opts, "credentials")) {
pstrcpy(credentials,opteq+1);
credentials = talloc_strdup(ctx,opteq+1);
if (!credentials) {
fprintf(stderr,"Out of memory\n");
exit(ENOMEM);
}
} else if(!strcmp(opts, "netbiosname")) {
pstrcpy(my_netbios_name,opteq+1);
fstrcpy(my_netbios_name,opteq+1);
} else if(!strcmp(opts, "uid")) {
mount_uid = nametouid(opteq+1);
} else if(!strcmp(opts, "gid")) {
@ -804,14 +879,19 @@ static void parse_mount_smb(int argc, char **argv)
}
have_ip = True;
} else if(!strcmp(opts, "workgroup")) {
pstrcpy(workgroup,opteq+1);
fstrcpy(workgroup,opteq+1);
} else if(!strcmp(opts, "sockopt")) {
lp_do_parameter(-1, "socket options", opteq+1);
} else if(!strcmp(opts, "scope")) {
set_global_scope(opteq+1);
} else {
slprintf(p, sizeof(pstring) - (p - options) - 1, "%s=%s,", opts, opteq+1);
p += strlen(p);
options = talloc_asprintf_append(options,
"%s=%s,",
opts, opteq+1);
if (!options) {
fprintf(stderr,"Out of memory\n");
exit(ENOMEM);
}
}
} else {
val = 1;
@ -819,7 +899,11 @@ static void parse_mount_smb(int argc, char **argv)
fprintf(stderr, "Unhandled option: %s\n", opteq+1);
exit(1);
} else if(!strcmp(opts, "guest")) {
*password = '\0';
password = talloc_strdup(talloc_tos(), "");
if (!password) {
fprintf(stderr,"Out of memory\n");
exit(ENOMEM);
}
got_pass = True;
} else if(!strcmp(opts, "krb")) {
#ifdef HAVE_KRB5
@ -840,21 +924,24 @@ static void parse_mount_smb(int argc, char **argv)
} else if(!strcmp(opts, "lfs")) {
smbfs_has_lfs = True;
} else {
strncpy(p, opts, sizeof(pstring) - (p - options) - 1);
p += strlen(opts);
*p++ = ',';
*p = 0;
options = talloc_asprintf_append(options,
"%s,",
opts);
if (!options) {
fprintf(stderr,"Out of memory\n");
exit(ENOMEM);
}
}
}
}
if (!*service) {
if (!service || !*service) {
usage();
exit(1);
}
if (p != options) {
*(p-1) = 0; /* remove trailing , */
if (options && *options && options[strlen(options)-1] == ',') {
options[strlen(options)-1] = '\0'; /* remove trailing , */
DEBUG(3,("passthrough options '%s'\n", options));
}
}
@ -888,11 +975,17 @@ static void parse_mount_smb(int argc, char **argv)
in_client = True; /* Make sure that we tell lp_load we are */
if (getenv("USER")) {
pstrcpy(username,getenv("USER"));
username = talloc_strdup(frame, getenv("USER"));
if (!username) {
exit(ENOMEM);
}
if ((p=strchr_m(username,'%'))) {
*p = 0;
pstrcpy(password,p+1);
password = talloc_strdup(frame, p+1);
if (!password) {
exit(ENOMEM);
}
got_pass = True;
memset(strchr_m(getenv("USER"),'%')+1,'X',strlen(password));
}
@ -900,7 +993,10 @@ static void parse_mount_smb(int argc, char **argv)
}
if (getenv("PASSWD")) {
pstrcpy(password,getenv("PASSWD"));
password = talloc_strdup(frame, getenv("PASSWD"));
if (!password) {
exit(ENOMEM);
}
got_pass = True;
}
@ -909,8 +1005,11 @@ static void parse_mount_smb(int argc, char **argv)
got_pass = True;
}
if (*username == 0 && getenv("LOGNAME")) {
pstrcpy(username,getenv("LOGNAME"));
if ((!username || *username == 0) && getenv("LOGNAME")) {
username = talloc_strdup(frame, getenv("LOGNAME"));
if (!username) {
exit(ENOMEM);
}
}
if (!lp_load(dyn_CONFIGFILE,True,False,False,True)) {
@ -924,19 +1023,19 @@ static void parse_mount_smb(int argc, char **argv)
got_pass = True;
}
if (*credentials != 0) {
if (credentials && *credentials != 0) {
read_credentials_file(credentials);
}
DEBUG(3,("mount.smbfs started (version %s)\n", SAMBA_VERSION_STRING));
if (*workgroup == 0) {
pstrcpy(workgroup,lp_workgroup());
fstrcpy(workgroup,lp_workgroup());
}
load_interfaces();
if (!*my_netbios_name) {
pstrcpy(my_netbios_name, myhostname());
fstrcpy(my_netbios_name, myhostname());
}
strupper_m(my_netbios_name);