#include "trans2.h"
#include "libsmb/nmblib.h"
#include "include/ntioctl.h"
+#include "../libcli/smb/smbXcli_base.h"
#ifndef REGISTER
#define REGISTER 0
static bool recurse = false;
static bool showacls = false;
bool lowercase = false;
+static bool backup_intent = false;
static struct sockaddr_storage dest_ss;
static char dest_ss_str[INET6_ADDRSTRLEN];
struct push_state {
XFILE *f;
- SMB_OFF_T nread;
+ off_t nread;
};
static size_t push_source(uint8_t *buf, size_t n, void *priv)
/* Use a trans2_qpathinfo to test directories for modern servers.
Except Win9x doesn't support the qpathinfo_basic() call..... */
- if (targetcli->protocol > PROTOCOL_LANMAN2 && !targetcli->win95) {
+ if (smbXcli_conn_protocol(targetcli->conn) > PROTOCOL_LANMAN2 && !targetcli->win95) {
status = cli_qpathinfo_basic(targetcli, targetpath, &sbuf,
&attributes);
afname, nt_errstr(status)));
} else {
struct security_descriptor *sd = NULL;
- sd = cli_query_secdesc(cli_state, fnum, ctx);
- if (!sd) {
+ status = cli_query_secdesc(cli_state, fnum,
+ ctx, &sd);
+ if (!NT_STATUS_IS_OK(status)) {
DEBUG( 0, ("display_finfo() failed to "
- "get security descriptor: %s",
- cli_errstr(cli_state)));
- status = cli_nt_error(cli_state);
+ "get security descriptor: %s",
+ nt_errstr(status)));
} else {
display_sec_desc(sd);
}
}
TALLOC_FREE(targetpath);
} else {
- d_printf("do_list: [%s] %s\n", mask, cli_errstr(cli));
- ret_status = cli_nt_error(cli);
+ d_printf("do_list: [%s] %s\n", mask, nt_errstr(status));
+ ret_status = status;
}
}
bool newhandle = false;
struct timespec tp_start;
uint16 attr;
- SMB_OFF_T size;
+ off_t size;
off_t start = 0;
- SMB_OFF_T nread = 0;
+ off_t nread = 0;
int rc = 0;
struct cli_state *targetcli = NULL;
char *targetname = NULL;
}
if (lowercase) {
- strlower_m(lname);
+ if (!strlower_m(lname)) {
+ d_printf("strlower_m %s failed\n", lname);
+ return 1;
+ }
}
status = cli_resolve_path(ctx, "", auth_info, cli, rname, &targetcli,
handle = fileno(stdout);
} else {
if (reget) {
- handle = sys_open(lname, O_WRONLY|O_CREAT, 0644);
+ handle = open(lname, O_WRONLY|O_CREAT, 0644);
if (handle >= 0) {
- start = sys_lseek(handle, 0, SEEK_END);
+ start = lseek(handle, 0, SEEK_END);
if (start == -1) {
d_printf("Error seeking local file\n");
return 1;
}
}
} else {
- handle = sys_open(lname, O_WRONLY|O_CREAT|O_TRUNC, 0644);
+ handle = open(lname, O_WRONLY|O_CREAT|O_TRUNC, 0644);
}
newhandle = true;
}
string_replace(finfo->name,'\\','/');
if (lowercase) {
- strlower_m(finfo->name);
+ if (!strlower_m(finfo->name)) {
+ return NT_STATUS_INVALID_PARAMETER;
+ }
}
if (!directory_exist(finfo->name) &&
{
fstring altname;
struct timespec b_time, a_time, m_time, c_time;
- SMB_OFF_T size;
+ off_t size;
uint16_t mode;
SMB_INO_T ino;
NTTIME tmp;
}
status = cli_ntcreate(cli, name, 0,
- CREATE_ACCESS_READ, 0,
+ SEC_FILE_READ_DATA | SEC_FILE_READ_ATTRIBUTE |
+ SEC_STD_SYNCHRONIZE, 0,
FILE_SHARE_READ|FILE_SHARE_WRITE
|FILE_SHARE_DELETE,
FILE_OPEN, 0x0, 0x0, &fnum);
TALLOC_CTX *ctx = talloc_tos();
uint16_t fnum;
XFILE *f;
- SMB_OFF_T start = 0;
+ off_t start = 0;
int rc = 0;
struct timespec tp_start;
struct cli_state *targetcli;
if (f == x_stdin) {
cli_shutdown(cli);
- exit(0);
+ exit(rc);
}
return rc;
static int file_find(struct file_list **list, const char *directory,
const char *expression, bool match)
{
- SMB_STRUCT_DIR *dir;
+ DIR *dir;
struct file_list *entry;
struct stat statbuf;
int ret;
bool isdir;
const char *dname;
- dir = sys_opendir(directory);
+ dir = opendir(directory);
if (!dir)
return -1;
if (ret == -1) {
SAFE_FREE(path);
- sys_closedir(dir);
+ closedir(dir);
return -1;
}
}
entry = SMB_MALLOC_P(struct file_list);
if (!entry) {
d_printf("Out of memory in file_find\n");
- sys_closedir(dir);
+ closedir(dir);
return -1;
}
entry->file_path = path;
}
}
- sys_closedir(dir);
+ closedir(dir);
return 0;
}
d_printf("Job %d cancelled\n",job);
return 0;
} else {
- d_printf("Error cancelling job %d : %s\n",job,cli_errstr(cli));
+ NTSTATUS status = cli_nt_error(cli);
+ d_printf("Error cancelling job %d : %s\n",
+ job, nt_errstr(status));
return 1;
}
}
rname = talloc_asprintf(ctx,
"%s-%d",
p+1,
- (int)sys_getpid());
+ (int)getpid());
}
if (strequal(lname,"-")) {
rname = talloc_asprintf(ctx,
"stdin-%d",
- (int)sys_getpid());
+ (int)getpid());
}
if (!rname) {
return 1;
return 1;
}
- if (!NT_STATUS_IS_OK(cli_ntcreate(targetcli, targetname, 0,
+ status = cli_ntcreate(targetcli, targetname, 0,
FILE_READ_DATA|FILE_WRITE_DATA, 0,
- FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0x0, 0x0, &fnum))) {
- if (NT_STATUS_IS_OK(cli_ntcreate(targetcli, targetname, 0,
+ FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN,
+ 0x0, 0x0, &fnum);
+ if (!NT_STATUS_IS_OK(status)) {
+ status = cli_ntcreate(targetcli, targetname, 0,
FILE_READ_DATA, 0,
- FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0x0, 0x0, &fnum))) {
+ FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN,
+ 0x0, 0x0, &fnum);
+ if (NT_STATUS_IS_OK(status)) {
d_printf("open file %s: for read/write fnum %d\n", targetname, fnum);
} else {
- d_printf("Failed to open file %s. %s\n", targetname, cli_errstr(cli));
+ d_printf("Failed to open file %s. %s\n",
+ targetname, nt_errstr(status));
}
} else {
d_printf("open file %s: for read/write fnum %d\n", targetname, fnum);
return 1;
}
- if (!NT_STATUS_IS_OK(cli_posix_open(targetcli, targetname, O_CREAT|O_RDWR, mode, &fnum))) {
- if (!NT_STATUS_IS_OK(cli_posix_open(targetcli, targetname, O_CREAT|O_RDONLY, mode, &fnum))) {
- d_printf("Failed to open file %s. %s\n", targetname, cli_errstr(cli));
+ status = cli_posix_open(targetcli, targetname, O_CREAT|O_RDWR, mode,
+ &fnum);
+ if (!NT_STATUS_IS_OK(status)) {
+ status = cli_posix_open(targetcli, targetname,
+ O_CREAT|O_RDONLY, mode, &fnum);
+ if (!NT_STATUS_IS_OK(status)) {
+ d_printf("Failed to open file %s. %s\n", targetname,
+ nt_errstr(status));
} else {
- d_printf("posix_open file %s: for readonly fnum %d\n", targetname, fnum);
+ d_printf("posix_open file %s: for readonly fnum %d\n",
+ targetname, fnum);
}
} else {
- d_printf("posix_open file %s: for read/write fnum %d\n", targetname, fnum);
+ d_printf("posix_open file %s: for read/write fnum %d\n",
+ targetname, fnum);
}
return 0;
return 1;
}
- if (!NT_STATUS_IS_OK(cli_posix_mkdir(targetcli, targetname, mode))) {
- d_printf("Failed to open file %s. %s\n", targetname, cli_errstr(cli));
+ status = cli_posix_mkdir(targetcli, targetname, mode);
+ if (!NT_STATUS_IS_OK(status)) {
+ d_printf("Failed to open file %s. %s\n",
+ targetname, nt_errstr(status));
} else {
d_printf("posix_mkdir created directory %s\n", targetname);
}
return 1;
}
- if (!NT_STATUS_IS_OK(cli_posix_unlink(targetcli, targetname))) {
- d_printf("Failed to unlink file %s. %s\n", targetname, cli_errstr(cli));
+ status = cli_posix_unlink(targetcli, targetname);
+ if (!NT_STATUS_IS_OK(status)) {
+ d_printf("Failed to unlink file %s. %s\n",
+ targetname, nt_errstr(status));
} else {
d_printf("posix_unlink deleted file %s\n", targetname);
}
return 1;
}
- if (!NT_STATUS_IS_OK(cli_posix_rmdir(targetcli, targetname))) {
- d_printf("Failed to unlink directory %s. %s\n", targetname, cli_errstr(cli));
+ status = cli_posix_rmdir(targetcli, targetname);
+ if (!NT_STATUS_IS_OK(status)) {
+ d_printf("Failed to unlink directory %s. %s\n",
+ targetname, nt_errstr(status));
} else {
d_printf("posix_rmdir deleted directory %s\n", targetname);
}
TALLOC_CTX *ctx = talloc_tos();
char *buf = NULL;
int fnum;
+ NTSTATUS status;
if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) {
d_printf("close <fnum>\n");
fnum = atoi(buf);
/* We really should use the targetcli here.... */
- if (!NT_STATUS_IS_OK(cli_close(cli, fnum))) {
- d_printf("close %d: %s\n", fnum, cli_errstr(cli));
+ status = cli_close(cli, fnum);
+ if (!NT_STATUS_IS_OK(status)) {
+ d_printf("close %d: %s\n", fnum, nt_errstr(status));
return 1;
}
return 0;
uint64_t start, len;
enum brl_type lock_type;
int fnum;
+ NTSTATUS status;
if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) {
d_printf("lock <fnum> [r|w] <hex-start> <hex-len>\n");
len = (uint64_t)strtol(buf, (char **)NULL, 16);
- if (!NT_STATUS_IS_OK(cli_posix_lock(cli, fnum, start, len, true, lock_type))) {
- d_printf("lock failed %d: %s\n", fnum, cli_errstr(cli));
+ status = cli_posix_lock(cli, fnum, start, len, true, lock_type);
+ if (!NT_STATUS_IS_OK(status)) {
+ d_printf("lock failed %d: %s\n", fnum, nt_errstr(status));
}
return 0;
char *buf = NULL;
uint64_t start, len;
int fnum;
+ NTSTATUS status;
if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) {
d_printf("unlock <fnum> <hex-start> <hex-len>\n");
len = (uint64_t)strtol(buf, (char **)NULL, 16);
- if (!NT_STATUS_IS_OK(cli_posix_unlock(cli, fnum, start, len))) {
- d_printf("unlock failed %d: %s\n", fnum, cli_errstr(cli));
+ status = cli_posix_unlock(cli, fnum, start, len);
+ if (!NT_STATUS_IS_OK(status)) {
+ d_printf("unlock failed %d: %s\n", fnum, nt_errstr(status));
}
return 0;
return 1;
}
- if (!NT_STATUS_IS_OK(cli_rmdir(targetcli, targetname))) {
+ status = cli_rmdir(targetcli, targetname);
+ if (!NT_STATUS_IS_OK(status)) {
d_printf("%s removing remote directory file %s\n",
- cli_errstr(targetcli),mask);
+ nt_errstr(status), mask);
}
return 0;
return 1;
}
- if (!NT_STATUS_IS_OK(cli_posix_hardlink(targetcli, targetname, newname))) {
- d_printf("%s linking files (%s -> %s)\n", cli_errstr(targetcli), newname, oldname);
+ status = cli_posix_hardlink(targetcli, targetname, newname);
+ if (!NT_STATUS_IS_OK(status)) {
+ d_printf("%s linking files (%s -> %s)\n",
+ nt_errstr(status), newname, oldname);
return 1;
}
return 0;
return 1;
}
- if (!NT_STATUS_IS_OK(cli_posix_readlink(targetcli, name,
- linkname, PATH_MAX+1))) {
+ status = cli_posix_readlink(targetcli, name, linkname, PATH_MAX+1);
+ if (!NT_STATUS_IS_OK(status)) {
d_printf("%s readlink on file %s\n",
- cli_errstr(targetcli), name);
+ nt_errstr(status), name);
return 1;
}
return 1;
}
- if (!NT_STATUS_IS_OK(cli_posix_chmod(targetcli, targetname, mode))) {
+ status = cli_posix_chmod(targetcli, targetname, mode);
+ if (!NT_STATUS_IS_OK(status)) {
d_printf("%s chmod file %s 0%o\n",
- cli_errstr(targetcli), src, (unsigned int)mode);
+ nt_errstr(status), src, (unsigned int)mode);
return 1;
}
return 1;
}
+ status = cli_posix_stat(targetcli, targetname, &sbuf);
if (!NT_STATUS_IS_OK(cli_posix_stat(targetcli, targetname, &sbuf))) {
d_printf("%s getfacl doing a stat on file %s\n",
- cli_errstr(targetcli), src);
+ nt_errstr(status), src);
return 1;
}
- if (!NT_STATUS_IS_OK(cli_posix_getfacl(targetcli, targetname, ctx, &rb_size, &retbuf))) {
+ status = cli_posix_getfacl(targetcli, targetname, ctx, &rb_size, &retbuf);
+ if (!NT_STATUS_IS_OK(status)) {
d_printf("%s getfacl file %s\n",
- cli_errstr(targetcli), src);
+ nt_errstr(status), src);
return 1;
}
return 0;
}
-static void printf_cb(const char *buf, void *private_data)
-{
- printf("%s", buf);
-}
-
/****************************************************************************
Get the EA list of a file
****************************************************************************/
for (i=0; i<num_eas; i++) {
d_printf("%s (%d) =\n", eas[i].name, (int)eas[i].flags);
- dump_data_cb(eas[i].value.data, eas[i].value.length, false,
- printf_cb, NULL);
+ dump_data_file(eas[i].value.data, eas[i].value.length, false,
+ stdout);
d_printf("\n");
}
return 1;
}
- if (!NT_STATUS_IS_OK(cli_posix_stat(targetcli, targetname, &sbuf))) {
+ status = cli_posix_stat(targetcli, targetname, &sbuf);
+ if (!NT_STATUS_IS_OK(status)) {
d_printf("%s stat file %s\n",
- cli_errstr(targetcli), src);
+ nt_errstr(status), src);
return 1;
}
return 1;
}
- if (!NT_STATUS_IS_OK(cli_posix_chown(targetcli, targetname, uid, gid))) {
+ status = cli_posix_chown(targetcli, targetname, uid, gid);
+ if (!NT_STATUS_IS_OK(status)) {
d_printf("%s chown file %s uid=%d, gid=%d\n",
- cli_errstr(targetcli), src, (int)uid, (int)gid);
+ nt_errstr(status), src, (int)uid, (int)gid);
return 1;
}
return 1;
}
- if (!NT_STATUS_IS_OK(cli_rename(targetcli, targetsrc, targetdest))) {
+ status = cli_rename(targetcli, targetsrc, targetdest);
+ if (!NT_STATUS_IS_OK(status)) {
d_printf("%s renaming files %s -> %s \n",
- cli_errstr(targetcli),
+ nt_errstr(status),
targetsrc,
targetdest);
return 1;
static int cmd_volume(void)
{
- fstring volname;
- uint32 serial_num;
+ char *volname;
+ uint32_t serial_num;
time_t create_date;
NTSTATUS status;
- status = cli_get_fs_volume_info(cli, volname, &serial_num,
+ status = cli_get_fs_volume_info(cli, talloc_tos(),
+ &volname, &serial_num,
&create_date);
if (!NT_STATUS_IS_OK(status)) {
d_printf("Error %s getting volume info\n", nt_errstr(status));
return 1;
}
- if (!NT_STATUS_IS_OK(cli_nt_hardlink(targetcli, targetname, dest))) {
- d_printf("%s doing an NT hard link of files\n",cli_errstr(targetcli));
+ status = cli_nt_hardlink(targetcli, targetname, dest);
+ if (!NT_STATUS_IS_OK(status)) {
+ d_printf("%s doing an NT hard link of files\n",
+ nt_errstr(status));
return 1;
}
return 0;
}
+/****************************************************************************
+ Watch directory changes
+****************************************************************************/
+
+static int cmd_notify(void)
+{
+ TALLOC_CTX *frame = talloc_stackframe();
+ char *name, *buf;
+ NTSTATUS status;
+ uint16_t fnum;
+
+ name = talloc_strdup(talloc_tos(), client_get_cur_dir());
+ if (name == NULL) {
+ goto fail;
+ }
+ if (!next_token_talloc(talloc_tos(), &cmd_ptr, &buf, NULL)) {
+ goto usage;
+ }
+ name = talloc_asprintf_append(name, "%s", buf);
+ if (name == NULL) {
+ goto fail;
+ }
+ status = cli_ntcreate(
+ cli, name, 0, FILE_READ_DATA, 0,
+ FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
+ FILE_OPEN, 0, 0, &fnum);
+ if (!NT_STATUS_IS_OK(status)) {
+ d_printf("Could not open file: %s\n", nt_errstr(status));
+ goto fail;
+ }
+
+ while (1) {
+ uint32_t i, num_changes;
+ struct notify_change *changes;
+
+ status = cli_notify(cli, fnum, 1000, FILE_NOTIFY_CHANGE_ALL,
+ true,
+ talloc_tos(), &num_changes, &changes);
+ if (!NT_STATUS_IS_OK(status)) {
+ d_printf("notify returned %s\n",
+ nt_errstr(status));
+ goto fail;
+ }
+ for (i=0; i<num_changes; i++) {
+ printf("%4.4x %s\n", changes[i].action,
+ changes[i].name);
+ }
+ TALLOC_FREE(changes);
+ }
+usage:
+ d_printf("notify <file>\n");
+fail:
+ TALLOC_FREE(frame);
+ return 1;
+}
+
/****************************************************************************
Set the archive level.
****************************************************************************/
return 0;
}
+/****************************************************************************
+ Toggle the backup_intent state.
+****************************************************************************/
+
+static int cmd_backup(void)
+{
+ backup_intent = !backup_intent;
+ cli_set_backup_intent(cli, backup_intent);
+ DEBUG(2,("backup intent is now %s\n",backup_intent?"on":"off"));
+ return 1;
+}
+
/****************************************************************************
Toggle the lowercaseflag.
****************************************************************************/
return true;
}
- if((ret = cli_RNetShareEnum(cli, browse_fn, NULL)) == -1)
- d_printf("Error returning browse list: %s\n", cli_errstr(cli));
+ if((ret = cli_RNetShareEnum(cli, browse_fn, NULL)) == -1) {
+ NTSTATUS status = cli_nt_error(cli);
+ d_printf("Error returning browse list: %s\n",
+ nt_errstr(status));
+ }
return (ret != -1);
}
char *buf;
if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) {
- d_printf("Current VUID is %d\n", cli->vuid);
+ d_printf("Current VUID is %d\n",
+ cli_state_get_uid(cli));
return 0;
}
- cli->vuid = atoi(buf);
+ cli_state_set_uid(cli, atoi(buf));
return 0;
}
return -1;
}
- d_printf("Current VUID is %d\n", cli->vuid);
+ d_printf("Current VUID is %d\n", cli_state_get_uid(cli));
+ return 0;
+}
+
+/**
+ * close the session
+ */
+
+static int cmd_logoff(void)
+{
+ NTSTATUS status;
+
+ status = cli_ulogoff(cli);
+ if (!NT_STATUS_IS_OK(status)) {
+ d_printf("logoff failed: %s\n", nt_errstr(status));
+ return -1;
+ }
+
+ d_printf("logoff successful\n");
+ return 0;
+}
+
+
+/**
+ * tree connect (connect to a share)
+ */
+
+static int cmd_tcon(void)
+{
+ TALLOC_CTX *ctx = talloc_tos();
+ char *sharename;
+ NTSTATUS status;
+
+ if (!next_token_talloc(ctx, &cmd_ptr, &sharename, NULL)) {
+ d_printf("tcon <sharename>\n");
+ return 0;
+ }
+
+ if (!sharename) {
+ return 1;
+ }
+
+ status = cli_tree_connect(cli, sharename, "?????", "", 0);
+ if (!NT_STATUS_IS_OK(status)) {
+ d_printf("tcon failed: %s\n", nt_errstr(status));
+ return -1;
+ }
+
+ talloc_free(sharename);
+
+ d_printf("tcon to %s successful, tid: %u\n", sharename,
+ cli_state_get_tid(cli));
+ return 0;
+}
+
+/**
+ * tree disconnect (disconnect from a share)
+ */
+
+static int cmd_tdis(void)
+{
+ NTSTATUS status;
+
+ status = cli_tdis(cli);
+ if (!NT_STATUS_IS_OK(status)) {
+ d_printf("tdis failed: %s\n", nt_errstr(status));
+ return -1;
+ }
+
+ d_printf("tdis successful\n");
+ return 0;
+}
+
+
+/**
+ * get or set tid
+ */
+
+static int cmd_tid(void)
+{
+ TALLOC_CTX *ctx = talloc_tos();
+ char *tid_str;
+
+ if (!next_token_talloc(ctx, &cmd_ptr, &tid_str, NULL)) {
+ if (cli_state_has_tcon(cli)) {
+ d_printf("current tid is %d\n", cli_state_get_tid(cli));
+ } else {
+ d_printf("no tcon currently\n");
+ }
+ } else {
+ uint16_t tid = atoi(tid_str);
+ cli_state_set_tid(cli, tid);
+ }
+
return 0;
}
return 1;
}
- d_printf("//%s/%s\n", targetcli->desthost, targetcli->share);
+ d_printf("//%s/%s\n", smbXcli_conn_remote_name(targetcli->conn), targetcli->share);
return 0;
}
{COMPL_NONE,COMPL_NONE}},
{"altname",cmd_altname,"<file> show alt name",{COMPL_NONE,COMPL_NONE}},
{"archive",cmd_archive,"<level>\n0=ignore archive bit\n1=only get archive files\n2=only get archive files and reset archive bit\n3=get all files and reset archive bit",{COMPL_NONE,COMPL_NONE}},
+ {"backup",cmd_backup,"toggle backup intent state",{COMPL_NONE,COMPL_NONE}},
{"blocksize",cmd_block,"blocksize <number> (default 20)",{COMPL_NONE,COMPL_NONE}},
{"cancel",cmd_cancel,"<jobid> cancel a print queue entry",{COMPL_NONE,COMPL_NONE}},
{"case_sensitive",cmd_setcase,"toggle the case sensitive flag to server",{COMPL_NONE,COMPL_NONE}},
{"more",cmd_more,"<remote name> view a remote file with your pager",{COMPL_REMOTE,COMPL_NONE}},
{"mput",cmd_mput,"<mask> put all matching files",{COMPL_REMOTE,COMPL_NONE}},
{"newer",cmd_newer,"<file> only mget files newer than the specified local file",{COMPL_LOCAL,COMPL_NONE}},
+ {"notify",cmd_notify,"<file>Get notified of dir changes",{COMPL_REMOTE,COMPL_NONE}},
{"open",cmd_open,"<mask> open a file",{COMPL_REMOTE,COMPL_NONE}},
{"posix", cmd_posix, "turn on all POSIX capabilities", {COMPL_REMOTE,COMPL_NONE}},
{"posix_encrypt",cmd_posix_encrypt,"<domain> <user> <password> start up transport encryption",{COMPL_REMOTE,COMPL_NONE}},
{"logon",cmd_logon,"establish new logon",{COMPL_NONE,COMPL_NONE}},
{"listconnect",cmd_list_connect,"list open connections",{COMPL_NONE,COMPL_NONE}},
{"showconnect",cmd_show_connect,"display the current active connection",{COMPL_NONE,COMPL_NONE}},
+ {"tcon",cmd_tcon,"connect to a share" ,{COMPL_NONE,COMPL_NONE}},
+ {"tdis",cmd_tdis,"disconnect from a share",{COMPL_NONE,COMPL_NONE}},
+ {"tid",cmd_tid,"show or set the current tid (tree-id)",{COMPL_NONE,COMPL_NONE}},
+ {"logoff",cmd_logoff,"log off (close the session)",{COMPL_NONE,COMPL_NONE}},
{"..",cmd_cd_oneup,"change the remote directory (up one level)",{COMPL_REMOTE,COMPL_NONE}},
/* Yes, this must be here, see crh's comment above. */
info.matches[0] = SMB_STRNDUP(info.matches[1], info.samelen);
info.matches[info.count] = NULL;
+ TALLOC_FREE(ctx);
return info.matches;
cleanup:
static time_t last_t;
struct timespec now;
time_t t;
- int ret, revents;
+ NTSTATUS status;
+ unsigned char garbage[16];
clock_gettime_mono(&now);
t = now.tv_sec;
last_t = t;
- again:
-
- if (cli->fd == -1)
+ /* Ping the server to keep the connection alive using SMBecho. */
+ memset(garbage, 0xf0, sizeof(garbage));
+ status = cli_echo(cli, 1, data_blob_const(garbage, sizeof(garbage)));
+ if (NT_STATUS_IS_OK(status)) {
return;
-
- /* We deliberately use receive_smb_raw instead of
- client_receive_smb as we want to receive
- session keepalives and then drop them here.
- */
-
- ret = poll_intr_one_fd(cli->fd, POLLIN|POLLHUP, 0, &revents);
-
- if ((ret > 0) && (revents & (POLLIN|POLLHUP|POLLERR))) {
- NTSTATUS status;
- size_t len;
-
- set_smb_read_error(&cli->smb_rw_error, SMB_READ_OK);
-
- status = receive_smb_raw(cli->fd, cli->inbuf, cli->bufsize, 0, 0, &len);
-
- if (!NT_STATUS_IS_OK(status)) {
- DEBUG(0, ("Read from server failed, maybe it closed "
- "the connection\n"));
-
- finished = true;
- smb_readline_done();
- if (NT_STATUS_EQUAL(status, NT_STATUS_END_OF_FILE)) {
- set_smb_read_error(&cli->smb_rw_error,
- SMB_READ_EOF);
- return;
- }
-
- if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) {
- set_smb_read_error(&cli->smb_rw_error,
- SMB_READ_TIMEOUT);
- return;
- }
-
- set_smb_read_error(&cli->smb_rw_error, SMB_READ_ERROR);
- return;
- }
- if(CVAL(cli->inbuf,0) != SMBkeepalive) {
- DEBUG(0, ("Read from server "
- "returned unexpected packet!\n"));
- return;
- }
-
- goto again;
}
- /* Ping the server to keep the connection alive using SMBecho. */
- {
- NTSTATUS status;
- unsigned char garbage[16];
- memset(garbage, 0xf0, sizeof(garbage));
- status = cli_echo(cli, 1, data_blob_const(garbage, sizeof(garbage)));
-
- if (!NT_STATUS_IS_OK(status)) {
- DEBUG(0, ("SMBecho failed. Maybe server has closed "
- "the connection\n"));
- finished = true;
- smb_readline_done();
- }
+ if (!cli_state_is_connected(cli)) {
+ DEBUG(0,("SMBecho failed (%s). The connection is "
+ "disconnected now\n", nt_errstr(status)));
+ finished = true;
+ smb_readline_done();
}
}
}
}
- if (port != 139) {
+ if (port != NBT_SMB_PORT) {
/* Workgroups simply don't make sense over anything
else but port 139... */
status = cli_cm_open(talloc_tos(), NULL,
have_ip ? dest_ss_str : query_host,
"IPC$", auth_info, true, smb_encrypt,
- max_protocol, 139, name_type, &cli);
+ max_protocol, NBT_SMB_PORT, name_type,
+ &cli);
if (!NT_STATUS_IS_OK(status)) {
cli = NULL;
}
NTSTATUS status;
status = cli_connect_nb(desthost, have_ip ? &dest_ss : NULL,
- port ? port : 139, name_type,
- lp_netbios_name(), Undefined, &cli);
+ port ? port : NBT_SMB_PORT, name_type,
+ lp_netbios_name(), SMB_SIGNING_DEFAULT, 0, &cli);
if (!NT_STATUS_IS_OK(status)) {
d_printf("Connection to %s failed. Error %s\n", desthost, nt_errstr(status));
return 1;
pc = poptGetContext("smbclient", argc, (const char **) argv, long_options, 0);
poptSetOtherOptionHelp(pc, "service <password>");
- lp_set_in_client(true); /* Make sure that we tell lp_load we are */
-
while ((opt = poptGetNextOpt(pc)) != -1) {
/* if the tar option has been called previouslt, now we need to eat out the leftovers */
poptGetArg(pc));
}
+
switch (opt) {
case 'M':
/* Messages are sent to NetBIOS name type 0x3
exit(ENOMEM);
}
if( !port )
- port = 139;
+ port = NBT_SMB_PORT;
message = true;
break;
case 'I':
}
if ( override_logfile )
- setup_logging( lp_logfile(), DEBUG_FILE );
+ setup_logging( lp_logfile(talloc_tos()), DEBUG_FILE );
- if (!lp_load(get_dyn_CONFIGFILE(),true,false,false,true)) {
+ if (!lp_load_client(get_dyn_CONFIGFILE())) {
fprintf(stderr, "%s: Can't load %s - run testparm to debug it\n",
argv[0], get_dyn_CONFIGFILE());
}
}
if(new_name_resolve_order)
- lp_set_name_resolve_order(new_name_resolve_order);
+ lp_set_cmdline("name resolve order", new_name_resolve_order);
if (!tar_type && !query_host && !service && !message) {
poptPrintUsage(pc, stderr, 0);
}
poptFreeContext(pc);
+ popt_burn_cmdline_password(argc, argv);
DEBUG(3,("Client started (version %s).\n", samba_version_string()));
if (tar_type) {
if (cmdstr)
process_command_string(cmdstr);
- return do_tar_op(base_directory);
- }
-
- if (query_host && *query_host) {
+ rc = do_tar_op(base_directory);
+ } else if (query_host && *query_host) {
char *qhost = query_host;
char *slash;
sscanf(p, "%x", &name_type);
}
- return do_host_query(qhost);
- }
-
- if (message) {
- return do_message_op(auth_info);
- }
-
- if (process(base_directory)) {
- return 1;
+ rc = do_host_query(qhost);
+ } else if (message) {
+ rc = do_message_op(auth_info);
+ } else if (process(base_directory)) {
+ rc = 1;
}
TALLOC_FREE(frame);