struct timeval tp_start;
int read_size = io_bufsize;
uint16 attr;
- size_t size;
+ SMB_OFF_T size;
off_t start = 0;
off_t nread = 0;
int rc = 0;
{
int fnum;
XFILE *f;
- size_t start = 0;
+ SMB_OFF_T start = 0;
off_t nread = 0;
char *buf = NULL;
int maxwrite = io_bufsize;
typedef struct file_info_struct file_info2;
struct file_info_struct {
- SMB_BIG_UINT size;
+ SMB_OFF_T size;
uint16 mode;
uid_t uid;
gid_t gid;
struct _SMBCFILE {
int cli_fd;
char *fname;
- off_t offset;
+ SMB_OFF_T offset;
struct _SMBCSRV *srv;
BOOL file;
struct smbc_dir_list *dir_list, *dir_end, *dir_next;
****************************************************************************/
BOOL cli_getattrE(struct cli_state *cli, int fd,
- uint16 *attr, SMB_BIG_UINT *size,
+ uint16 *attr, SMB_OFF_T *size,
time_t *c_time, time_t *a_time, time_t *m_time)
{
memset(cli->outbuf,'\0',smb_size);
****************************************************************************/
BOOL cli_getatr(struct cli_state *cli, const char *fname,
- uint16 *attr, size_t *size, time_t *t)
+ uint16 *attr, SMB_OFF_T *size, time_t *t)
{
char *p;
****************************************************************************/
BOOL cli_qpathinfo(struct cli_state *cli, const char *fname,
time_t *c_time, time_t *a_time, time_t *m_time,
- size_t *size, uint16 *mode)
+ SMB_OFF_T *size, uint16 *mode)
{
unsigned int data_len = 0;
unsigned int param_len = 0;
****************************************************************************/
BOOL cli_qpathinfo2(struct cli_state *cli, const char *fname,
time_t *c_time, time_t *a_time, time_t *m_time,
- time_t *w_time, size_t *size, uint16 *mode,
+ time_t *w_time, SMB_OFF_T *size, uint16 *mode,
SMB_INO_T *ino)
{
unsigned int data_len = 0;
*mode = SVAL(rdata, 32);
}
if (size) {
- *size = IVAL(rdata, 48);
+ *size = IVAL2_TO_SMB_BIG_UINT(rdata,48);
}
if (ino) {
*ino = IVAL(rdata, 64);
SSVAL(param, 2, SMB_QUERY_FILE_NAME_INFO);
if (!cli_send_trans(cli, SMBtrans2,
- NULL, /* name */
- -1, 0, /* fid, flags */
- &setup, 1, 0, /* setup, length, max */
- param, param_len, 2, /* param, length, max */
- NULL, data_len, cli->max_xmit /* data, length, max */
+ NULL, /* name */
+ -1, 0, /* fid, flags */
+ &setup, 1, 0, /* setup, length, max */
+ param, param_len, 2, /* param, length, max */
+ NULL, data_len, cli->max_xmit /* data, length, max */
)) {
return False;
}
send a qfileinfo call
****************************************************************************/
BOOL cli_qfileinfo(struct cli_state *cli, int fnum,
- uint16 *mode, size_t *size,
+ uint16 *mode, SMB_OFF_T *size,
time_t *c_time, time_t *a_time, time_t *m_time,
time_t *w_time, SMB_INO_T *ino)
{
SSVAL(param, 2, SMB_QUERY_FILE_ALL_INFO);
if (!cli_send_trans(cli, SMBtrans2,
- NULL, /* name */
- -1, 0, /* fid, flags */
- &setup, 1, 0, /* setup, length, max */
- param, param_len, 2, /* param, length, max */
- NULL, data_len, cli->max_xmit /* data, length, max */
+ NULL, /* name */
+ -1, 0, /* fid, flags */
+ &setup, 1, 0, /* setup, length, max */
+ param, param_len, 2, /* param, length, max */
+ NULL, data_len, cli->max_xmit /* data, length, max */
)) {
return False;
}
*mode = SVAL(rdata, 32);
}
if (size) {
- *size = IVAL(rdata, 48);
+ *size = IVAL2_TO_SMB_BIG_UINT(rdata,48);
}
if (ino) {
*ino = IVAL(rdata, 64);
{
int ret;
+ /*
+ * offset:
+ *
+ * Compiler bug (possibly) -- gcc (GCC) 3.3.5 (Debian 1:3.3.5-2) --
+ * appears to pass file->offset (which is type off_t) differently than
+ * a local variable of type off_t. Using local variable "offset" in
+ * the call to cli_read() instead of file->offset fixes a problem
+ * retrieving data at an offset greater than 4GB.
+ */
+ off_t offset = file->offset;
+
if (!context || !context->internal ||
!context->internal->_initialized) {
}
- ret = cli_read(&file->srv->cli, file->cli_fd, buf, file->offset, count);
+ ret = cli_read(&file->srv->cli, file->cli_fd, buf, offset, count);
if (ret < 0) {
static ssize_t smbc_write_ctx(SMBCCTX *context, SMBCFILE *file, void *buf, size_t count)
{
int ret;
+ off_t offset = file->offset; /* See "offset" comment in smbc_read_ctx() */
if (!context || !context->internal ||
!context->internal->_initialized) {
}
- ret = cli_write(&file->srv->cli, file->cli_fd, 0, buf, file->offset, count);
+ ret = cli_write(&file->srv->cli, file->cli_fd, 0, buf, offset, count);
if (ret <= 0) {
* and if that fails, use getatr, as Win95 sometimes refuses qpathinfo
*/
static BOOL smbc_getatr(SMBCCTX * context, SMBCSRV *srv, char *path,
- uint16 *mode, size_t *size,
+ uint16 *mode, SMB_OFF_T *size,
time_t *c_time, time_t *a_time, time_t *m_time,
SMB_INO_T *ino)
{
if (errno == EACCES) { /* Check if the file is a directory */
int saverr = errno;
- size_t size = 0;
+ SMB_OFF_T size = 0;
uint16 mode = 0;
time_t m_time = 0, a_time = 0, c_time = 0;
SMB_INO_T ino = 0;
static off_t smbc_lseek_ctx(SMBCCTX *context, SMBCFILE *file, off_t offset, int whence)
{
- size_t size;
+ SMB_OFF_T size;
if (!context || !context->internal ||
!context->internal->_initialized) {
*/
static
-int smbc_setup_stat(SMBCCTX *context, struct stat *st, char *fname, size_t size, int mode)
+int smbc_setup_stat(SMBCCTX *context, struct stat *st, char *fname,
+ SMB_OFF_T size, int mode)
{
st->st_mode = 0;
fstring server, share, user, password, workgroup;
pstring path;
time_t m_time = 0, a_time = 0, c_time = 0;
- size_t size = 0;
+ SMB_OFF_T size = 0;
uint16 mode = 0;
SMB_INO_T ino = 0;
static int smbc_fstat_ctx(SMBCCTX *context, SMBCFILE *file, struct stat *st)
{
time_t c_time, a_time, m_time;
- size_t size;
+ SMB_OFF_T size;
uint16 mode;
SMB_INO_T ino = 0;
if (!cli_qfileinfo(&file->srv->cli, file->cli_fd,
&mode, &size, &c_time, &a_time, &m_time, NULL, &ino)) {
- SMB_BIG_UINT b_size = size;
if (!cli_getattrE(&file->srv->cli, file->cli_fd,
- &mode, &b_size, &c_time, &a_time, &m_time)) {
+ &mode, &size, &c_time, &a_time, &m_time)) {
errno = EINVAL;
return -1;
- } else
- size = b_size;
-
+ }
}
st->st_ino = ino;
}
for (i = 0; i < count && i < max_lmb_count; i++) {
- DEBUG(99, ("Found master browser %s\n", inet_ntoa(ip_list[i].ip)));
+ DEBUG(99, ("Found master browser %d of %d: %s\n", i+1, MAX(count, max_lmb_count), inet_ntoa(ip_list[i].ip)));
cli = get_ipc_connect_master_ip(&ip_list[i], workgroup, &u_info);
/* cli == NULL is the master browser refused to talk or
srv = smbc_server(context, server,
"IPC$", workgroup, user, password);
if (!srv) {
-
- if (dir) {
- SAFE_FREE(dir->fname);
- SAFE_FREE(dir);
- }
- return NULL;
+ continue;
}
dir->srv = srv;
if (!cli_NetServerEnum(&srv->cli, workgroup, SV_TYPE_DOMAIN_ENUM, list_unique_wg_fn,
(void *)dir)) {
- if (dir) {
- SAFE_FREE(dir->fname);
- SAFE_FREE(dir);
- }
-
- return NULL;
-
+ continue;
}
}
} else {
SMBCSRV *srv)
{
time_t m_time = 0, a_time = 0, c_time = 0;
- size_t size = 0;
+ SMB_OFF_T size = 0;
uint16 mode = 0;
SMB_INO_T inode = 0;
DOS_ATTR_DESC *ret;
}
/* Obtain the DOS attributes */
- if (!smbc_getatr(context, srv, filename, &mode, &size,
+ if (!smbc_getatr(context, srv, (char *) filename, &mode, &size,
&c_time, &a_time, &m_time, &inode)) {
errno = smbc_errno(context, &srv->cli);
fstring sidstr;
char *p;
time_t m_time = 0, a_time = 0, c_time = 0;
- size_t size = 0;
+ SMB_OFF_T size = 0;
uint16 mode = 0;
SMB_INO_T ino = 0;
struct cli_state *cli = &srv->cli;
the_acl = p + 1;
}
- sd = sec_desc_parse(ctx, ipc_cli, pol, numeric, the_acl);
+ sd = sec_desc_parse(ctx, ipc_cli, pol, numeric, (char *) the_acl);
if (!sd) {
errno = EINVAL;
/* Yup. */
ret = cacl_get(context, ctx, srv,
ipc_srv == NULL ? NULL : &ipc_srv->cli,
- &pol, path, name, (char *) value, size);
+ &pol, path, (char*)name, (char *) value, size);
if (ret < 0 && errno == 0) {
errno = smbc_errno(context, &srv->cli);
}
static char *kwlist[] = { "fnum", "offset", "size", NULL };
int fnum, offset=0, size=0;
ssize_t result;
- size_t fsize;
+ SMB_OFF_T fsize;
char *data;
PyObject *ret;
off_t smbw_lseek(int fd, off_t offset, int whence)
{
struct smbw_file *file;
- size_t size;
+ SMB_OFF_T size;
smbw_busy++;
time_t *c_time, time_t *a_time, time_t *m_time,
SMB_INO_T *ino)
{
+ time_t c_a_m_time;
+ /*
+ * "size" (size_t) is only 32 bits. Rather than change the interface
+ * in this code as we change cli_qpathinfo2() and cli_getatr() to
+ * support 64-bit file sizes, we'll use a temporary variable and
+ * maintain the interface size_t. At some point, someone may want to
+ * change the interface as well. djl
+ */
+ SMB_OFF_T fullsize;
+
DEBUG(4,("sending qpathinfo\n"));
if (!srv->no_pathinfo2 &&
cli_qpathinfo2(&srv->cli, path, c_time, a_time, m_time, NULL,
- size, mode, ino)) return True;
+ &fullsize, mode, ino)) {
+ if (size != NULL) *size = (size_t) fullsize;
+ return True;
+ }
/* if this is NT then don't bother with the getatr */
if (srv->cli.capabilities & CAP_NT_SMBS) return False;
- if (cli_getatr(&srv->cli, path, mode, size, m_time)) {
- a_time = c_time = m_time;
+ if (cli_getatr(&srv->cli, path, mode, &fullsize, &c_a_m_time)) {
+ if (a_time != NULL) *a_time = c_a_m_time;
+ if (c_time != NULL) *a_time = c_a_m_time;
+ if (m_time != NULL) *a_time = c_a_m_time;
+ if (size != NULL) *size = (size_t) fullsize;
srv->no_pathinfo2 = True;
return True;
}
{
struct smbw_file *file;
time_t c_time, a_time, m_time;
- size_t size;
+ SMB_OFF_T size;
uint16 mode;
SMB_INO_T ino = 0;
static struct cli_state *cli1;
int fnum1;
const char *lockfname = "\\large.dat";
- size_t fsize;
+ SMB_OFF_T fsize;
char buf[126*1024];
BOOL correct = True;
{
struct cli_state *cli;
int fnum;
- size_t size;
+ SMB_OFF_T size;
time_t c_time, a_time, m_time, w_time, m_time2;
const char *fname = "\\trans2.tst";
const char *dname = "\\trans2";
const char *fname = "\\readonly.file";
int fnum1, fnum2;
char buf[20];
- size_t fsize;
+ SMB_OFF_T fsize;
BOOL correct = True;
char *tmp_path;
}
for (c=1; c < 0x10000; c++) {
- size_t size;
+ SMB_OFF_T size;
if (c == '.' || c == '\\') continue;