mirror of
https://github.com/obarthel/amiga-smbfs.git
synced 2025-12-08 14:58:35 +00:00
Updated to version 1.143
Please keep in mind that this is still a development version and might surprise you (not necessarily in a good way). Do not let me discourage you to build and test this version, although there will be some risks involved such as data corruption or loss of data.
This commit is contained in:
@@ -75,6 +75,7 @@ int smb_proc_dskattr (struct smb_server *server, struct smb_dskattr *attr, int *
|
||||
int smb_proc_connect(struct smb_server *server, int * error_ptr);
|
||||
|
||||
/* sock.c */
|
||||
int smb_discard_netbios_frames(struct smb_server *server, int sock_fd, int * error_ptr);
|
||||
void smb_check_server_connection(struct smb_server *server, int error);
|
||||
void smb_release(struct smb_server *server);
|
||||
int smb_connect(struct smb_server *server, int * error_ptr);
|
||||
|
||||
@@ -58,7 +58,7 @@ struct smb_server
|
||||
int dont_retry;
|
||||
|
||||
/* olsen (2018-05-18): Override the "Native OS" name passed to the server. */
|
||||
char * native_os;
|
||||
const char * native_os;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
+421
-179
File diff suppressed because it is too large
Load Diff
+7
-5
@@ -1047,17 +1047,19 @@ smb_proc_open (struct smb_server *server, const char *pathname, int len, int wri
|
||||
if(writable)
|
||||
{
|
||||
SHOWMSG("write access required");
|
||||
// desired_access = FILE_READ_DATA|FILE_WRITE_DATA|FILE_DELETE;
|
||||
desired_access = GENERIC_READ|GENERIC_WRITE;
|
||||
desired_access = FILE_READ_DATA|FILE_WRITE_DATA|FILE_DELETE;
|
||||
|
||||
// desired_access = GENERIC_READ|GENERIC_WRITE;
|
||||
}
|
||||
else
|
||||
{
|
||||
SHOWMSG("read access is sufficient");
|
||||
// desired_access = FILE_READ_DATA;
|
||||
desired_access = GENERIC_READ;
|
||||
desired_access = FILE_READ_DATA;
|
||||
|
||||
// desired_access = GENERIC_READ;
|
||||
}
|
||||
|
||||
// desired_access |= FILE_READ_ATTRIBUTES|FILE_WRITE_ATTRIBUTES;
|
||||
desired_access |= FILE_READ_ATTRIBUTES|FILE_WRITE_ATTRIBUTES;
|
||||
|
||||
/* Allows others to read, write and delete the file just created.
|
||||
* This may be useful if smbfs hangs or you need to restart your
|
||||
|
||||
@@ -29,41 +29,6 @@
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
typedef struct dircache
|
||||
{
|
||||
int base;
|
||||
int len;
|
||||
int eof; /* cache end is eof */
|
||||
ULONG created_at; /* for invalidation */
|
||||
struct smba_file * cache_for; /* owner of this cache */
|
||||
int cache_size;
|
||||
struct smb_dirent cache[1];
|
||||
} dircache_t;
|
||||
|
||||
/* opaque structures for server and files: */
|
||||
struct smba_server
|
||||
{
|
||||
struct smb_server server;
|
||||
struct MinList open_files;
|
||||
ULONG num_open_files;
|
||||
dircache_t * dircache;
|
||||
unsigned supports_E:1;
|
||||
unsigned supports_E_known:1;
|
||||
};
|
||||
|
||||
struct smba_file
|
||||
{
|
||||
struct MinNode node;
|
||||
struct smba_server * server;
|
||||
struct smb_dirent dirent;
|
||||
ULONG attr_time; /* time when dirent was read */
|
||||
dircache_t * dircache; /* content cache for directories */
|
||||
unsigned is_valid:1; /* server was down, entry removed, ... */
|
||||
unsigned attr_dirty:1; /* attribute cache is dirty */
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#include "smb_abstraction.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -78,12 +43,12 @@ smba_connect (
|
||||
smba_connect_parameters_t * p,
|
||||
in_addr_t ip_addr,
|
||||
int use_E,
|
||||
char * workgroup_name,
|
||||
const char * workgroup_name,
|
||||
int cache_size,
|
||||
int max_transmit,
|
||||
int timeout,
|
||||
int opt_raw_smb,
|
||||
char * opt_native_os,
|
||||
const char * opt_native_os,
|
||||
int * error_ptr,
|
||||
int * smb_error_class_ptr,
|
||||
int * smb_error_ptr,
|
||||
@@ -1082,7 +1047,7 @@ smba_readdir (smba_file_t * f, long offs, void *d, smba_callback_t callback, int
|
||||
/*****************************************************************************/
|
||||
|
||||
static void
|
||||
invalidate_dircache (struct smba_server * server, char * path)
|
||||
invalidate_dircache (struct smba_server * server, const char * path)
|
||||
{
|
||||
dircache_t * dircache = server->dircache;
|
||||
char other_path[SMB_MAXNAMELEN + 1];
|
||||
@@ -1188,7 +1153,7 @@ smba_create (smba_file_t * dir, const char *name, int * error_ptr)
|
||||
goto out;
|
||||
}
|
||||
|
||||
invalidate_dircache (dir->server, path);
|
||||
/* invalidate_dircache (dir->server, path); */
|
||||
|
||||
out:
|
||||
|
||||
@@ -1227,7 +1192,7 @@ smba_mkdir (smba_file_t * dir, const char *name, int * error_ptr)
|
||||
if(result < 0)
|
||||
goto out;
|
||||
|
||||
invalidate_dircache (dir->server, path);
|
||||
/* invalidate_dircache (dir->server, path); */
|
||||
|
||||
out:
|
||||
|
||||
@@ -1240,7 +1205,7 @@ smba_mkdir (smba_file_t * dir, const char *name, int * error_ptr)
|
||||
/*****************************************************************************/
|
||||
|
||||
static int
|
||||
close_path (smba_server_t * s, char *path, int * error_ptr)
|
||||
close_path (smba_server_t * s, const char *path, int * error_ptr)
|
||||
{
|
||||
int result = 0;
|
||||
smba_file_t *p;
|
||||
@@ -1273,7 +1238,7 @@ close_path (smba_server_t * s, char *path, int * error_ptr)
|
||||
/*****************************************************************************/
|
||||
|
||||
int
|
||||
smba_remove (smba_server_t * s, char *path, int * error_ptr)
|
||||
smba_remove (smba_server_t * s, const char *path, int * error_ptr)
|
||||
{
|
||||
int result;
|
||||
|
||||
@@ -1285,7 +1250,7 @@ smba_remove (smba_server_t * s, char *path, int * error_ptr)
|
||||
if(result < 0)
|
||||
goto out;
|
||||
|
||||
invalidate_dircache (s, path);
|
||||
/* invalidate_dircache (s, path); */
|
||||
|
||||
out:
|
||||
|
||||
@@ -1295,7 +1260,7 @@ smba_remove (smba_server_t * s, char *path, int * error_ptr)
|
||||
/*****************************************************************************/
|
||||
|
||||
int
|
||||
smba_rmdir (smba_server_t * s, char *path, int * error_ptr)
|
||||
smba_rmdir (smba_server_t * s, const char *path, int * error_ptr)
|
||||
{
|
||||
int result;
|
||||
|
||||
@@ -1307,7 +1272,7 @@ smba_rmdir (smba_server_t * s, char *path, int * error_ptr)
|
||||
if(result < 0)
|
||||
goto out;
|
||||
|
||||
invalidate_dircache (s, path);
|
||||
/* invalidate_dircache (s, path); */
|
||||
|
||||
out:
|
||||
|
||||
@@ -1317,7 +1282,7 @@ smba_rmdir (smba_server_t * s, char *path, int * error_ptr)
|
||||
/*****************************************************************************/
|
||||
|
||||
int
|
||||
smba_rename (smba_server_t * s, char *from, char *to, int * error_ptr)
|
||||
smba_rename (smba_server_t * s, const char *from, const char *to, int * error_ptr)
|
||||
{
|
||||
int result;
|
||||
|
||||
@@ -1329,7 +1294,7 @@ smba_rename (smba_server_t * s, char *from, char *to, int * error_ptr)
|
||||
if(result < 0)
|
||||
goto out;
|
||||
|
||||
invalidate_dircache (s, from);
|
||||
/* invalidate_dircache (s, from); */
|
||||
|
||||
out:
|
||||
|
||||
@@ -1364,6 +1329,8 @@ smb_invalidate_all_inodes (struct smb_server *server)
|
||||
{
|
||||
smba_file_t *f;
|
||||
|
||||
ENTER();
|
||||
|
||||
invalidate_dircache (server->abstraction, NULL);
|
||||
|
||||
for (f = (smba_file_t *)server->abstraction->open_files.mlh_Head;
|
||||
@@ -1373,6 +1340,8 @@ smb_invalidate_all_inodes (struct smb_server *server)
|
||||
f->dirent.opened = FALSE;
|
||||
f->is_valid = FALSE;
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -1450,7 +1419,7 @@ smba_setup_dircache (struct smba_server * server,int cache_size, int * error_ptr
|
||||
/*****************************************************************************/
|
||||
|
||||
static int
|
||||
extract_service (char *service, char *server, size_t server_size, char *share, size_t share_size,int * error_ptr)
|
||||
extract_service (const char *service, char *server, size_t server_size, char *share, size_t share_size,int * error_ptr)
|
||||
{
|
||||
char * share_start;
|
||||
char * root_start;
|
||||
@@ -1523,17 +1492,17 @@ extract_service (char *service, char *server, size_t server_size, char *share, s
|
||||
|
||||
int
|
||||
smba_start(
|
||||
char * service,
|
||||
char * opt_workgroup,
|
||||
char * opt_username,
|
||||
char * opt_password,
|
||||
char * opt_clientname,
|
||||
char * opt_servername,
|
||||
const char * service,
|
||||
const char * opt_workgroup,
|
||||
const char * opt_username,
|
||||
const char * opt_password,
|
||||
const char * opt_clientname,
|
||||
const char * opt_servername,
|
||||
int opt_cachesize,
|
||||
int opt_max_transmit,
|
||||
int opt_timeout,
|
||||
int opt_raw_smb,
|
||||
char * opt_native_os,
|
||||
const char * opt_native_os,
|
||||
int * error_ptr,
|
||||
int * smb_error_class_ptr,
|
||||
int * smb_error_ptr,
|
||||
|
||||
@@ -24,13 +24,16 @@
|
||||
#include "quad_math.h"
|
||||
#endif /* _QUAD_MATH_H */
|
||||
|
||||
/****************************************************************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
/* Forward declaration to keep the compiler happy. */
|
||||
#ifndef _SMB_FS_SB
|
||||
struct smb_server;
|
||||
#include <smb/smb_fs_sb.h>
|
||||
#endif /* _SMB_FS_SB */
|
||||
|
||||
#ifndef _LINUX_SMB_H
|
||||
#include <smb/smb.h>
|
||||
#endif /* _LINUX_SMB_H */
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/* These should make the respective purpose of each make_open()
|
||||
@@ -50,34 +53,63 @@ struct smb_server;
|
||||
|
||||
typedef struct smba_connect_parameters
|
||||
{
|
||||
char server_ipname[64];
|
||||
char service[64];
|
||||
char *server_name;
|
||||
char *client_name;
|
||||
char *username;
|
||||
char *password;
|
||||
char server_ipname[64];
|
||||
char service[64];
|
||||
char * server_name;
|
||||
char * client_name;
|
||||
char * username;
|
||||
char * password;
|
||||
} smba_connect_parameters_t;
|
||||
|
||||
typedef struct smba_stat
|
||||
{
|
||||
unsigned is_dir:1;
|
||||
unsigned is_read_only:1;
|
||||
unsigned is_hidden:1;
|
||||
unsigned is_system:1;
|
||||
unsigned is_changed_since_last_archive:1;
|
||||
unsigned is_dir:1;
|
||||
unsigned is_read_only:1;
|
||||
unsigned is_hidden:1;
|
||||
unsigned is_system:1;
|
||||
unsigned is_changed_since_last_archive:1;
|
||||
|
||||
unsigned long size_low;
|
||||
unsigned long size_high;
|
||||
unsigned long size_low;
|
||||
unsigned long size_high;
|
||||
|
||||
time_t atime;
|
||||
time_t ctime;
|
||||
time_t mtime;
|
||||
time_t atime;
|
||||
time_t ctime;
|
||||
time_t mtime;
|
||||
} smba_stat_t;
|
||||
|
||||
/****************************************************************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
typedef struct smba_server smba_server_t;
|
||||
typedef struct smba_file smba_file_t;
|
||||
typedef struct dircache
|
||||
{
|
||||
int base;
|
||||
int len;
|
||||
int eof; /* cache end is eof */
|
||||
ULONG created_at; /* for invalidation */
|
||||
struct smba_file * cache_for; /* owner of this cache */
|
||||
int cache_size;
|
||||
struct smb_dirent cache[1];
|
||||
} dircache_t;
|
||||
|
||||
typedef struct smba_server
|
||||
{
|
||||
struct smb_server server;
|
||||
struct MinList open_files;
|
||||
ULONG num_open_files;
|
||||
dircache_t * dircache;
|
||||
unsigned supports_E:1;
|
||||
unsigned supports_E_known:1;
|
||||
} smba_server_t;
|
||||
|
||||
typedef struct smba_file
|
||||
{
|
||||
struct MinNode node;
|
||||
struct smba_server * server;
|
||||
struct smb_dirent dirent;
|
||||
ULONG attr_time; /* time when dirent was read */
|
||||
dircache_t * dircache; /* content cache for directories */
|
||||
unsigned is_valid:1; /* server was down, entry removed, ... */
|
||||
unsigned attr_dirty:1; /* attribute cache is dirty */
|
||||
} smba_file_t;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
@@ -95,12 +127,12 @@ int smba_setattr(smba_file_t *f, const smba_stat_t *data, const QUAD * const siz
|
||||
int smba_readdir(smba_file_t *f, long offs, void *d, smba_callback_t callback, int * error_ptr);
|
||||
int smba_create(smba_file_t *dir, const char *name, int * error_ptr);
|
||||
int smba_mkdir(smba_file_t *dir, const char *name, int * error_ptr);
|
||||
int smba_remove(smba_server_t *s, char *path, int * error_ptr);
|
||||
int smba_rmdir(smba_server_t *s, char *path, int * error_ptr);
|
||||
int smba_rename(smba_server_t *s, char *from, char *to, int * error_ptr);
|
||||
int smba_remove(smba_server_t *s, const char *path, int * error_ptr);
|
||||
int smba_rmdir(smba_server_t *s, const char *path, int * error_ptr);
|
||||
int smba_rename(smba_server_t *s, const char *from, const char *to, int * error_ptr);
|
||||
int smba_statfs(smba_server_t *s, long *bsize, long *blocks, long *bfree, int * error_ptr);
|
||||
void smb_invalidate_all_inodes(struct smb_server *server);
|
||||
int smba_start(char *service, char *opt_workgroup, char *opt_username, char *opt_password, char *opt_clientname, char *opt_servername, int opt_cachesize, int opt_max_transmit, int opt_timeout, int opt_raw_smb, char * opt_native_os, int * error_ptr, int * smb_error_class_ptr, int * smb_error_ptr, smba_server_t **result);
|
||||
int smba_start(const char *service, const char *opt_workgroup, const char *opt_username, const char *opt_password, const char *opt_clientname, const char *opt_servername, int opt_cachesize, int opt_max_transmit, int opt_timeout, int opt_raw_smb, const char * opt_native_os, int * error_ptr, int * smb_error_class_ptr, int * smb_error_ptr, smba_server_t **result);
|
||||
void smba_disconnect(smba_server_t *server);
|
||||
int smba_get_dircache_size(struct smba_server * server);
|
||||
int smba_change_dircache_size(struct smba_server * server,int cache_size);
|
||||
|
||||
+1
-1
@@ -161,7 +161,7 @@ extern void smb_nt_encrypt(unsigned char *passwd, unsigned char *c8, unsigned ch
|
||||
/****************************************************************************/
|
||||
|
||||
extern VOID FreeMemory(APTR address);
|
||||
extern APTR AllocateMemory(ULONG size);
|
||||
extern APTR AllocateMemory(LONG size);
|
||||
|
||||
#define malloc(s) AllocateMemory(s)
|
||||
#define free(m) FreeMemory(m)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#define VERSION 1
|
||||
#define REVISION 140
|
||||
#define DATE "27.5.2018"
|
||||
#define VERS "smbfs 1.140"
|
||||
#define VSTRING "smbfs 1.140 (27.5.2018)\r\n"
|
||||
#define VERSTAG "\0$VER: smbfs 1.140 (27.5.2018)"
|
||||
#define REVISION 143
|
||||
#define DATE "30.5.2018"
|
||||
#define VERS "smbfs 1.143"
|
||||
#define VSTRING "smbfs 1.143 (30.5.2018)\r\n"
|
||||
#define VERSTAG "\0$VER: smbfs 1.143 (30.5.2018)"
|
||||
|
||||
@@ -1 +1 @@
|
||||
140
|
||||
143
|
||||
|
||||
@@ -93,6 +93,102 @@ receive_all(int fd, void * _data, int len, int * error_ptr)
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/* Read the next NetBIOS frame and discard it. The primary purpose
|
||||
* of this function is to receive and ignore NetBIOS "keep alive"
|
||||
* messages.
|
||||
*/
|
||||
int
|
||||
smb_discard_netbios_frames(struct smb_server *server, int sock_fd, int * error_ptr)
|
||||
{
|
||||
unsigned char netbios_session_buf[NETBIOS_HEADER_SIZE];
|
||||
int netbios_session_payload_size;
|
||||
int result;
|
||||
|
||||
ENTER();
|
||||
|
||||
/* Read the NetBIOS session header (rfc-1002, section 4.3.1) */
|
||||
result = receive_all (sock_fd, netbios_session_buf, NETBIOS_HEADER_SIZE, error_ptr);
|
||||
if (result < 0)
|
||||
{
|
||||
LOG (("recv error = %ld\n", (*error_ptr)));
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (result < NETBIOS_HEADER_SIZE)
|
||||
{
|
||||
LOG (("got less than %ld bytes\n", NETBIOS_HEADER_SIZE));
|
||||
|
||||
(*error_ptr) = error_end_of_file;
|
||||
|
||||
result = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Check the session type. */
|
||||
switch (netbios_session_buf[0])
|
||||
{
|
||||
/* 0x00 == session message */
|
||||
case 0x00:
|
||||
|
||||
SHOWMSG("Got session message");
|
||||
break;
|
||||
|
||||
/* 0x85 == session keepalive */
|
||||
case 0x85:
|
||||
|
||||
SHOWMSG("Got session keepalive");
|
||||
break;
|
||||
|
||||
/* 0x81 == session request */
|
||||
/* 0x82 == positive session response */
|
||||
/* 0x83 == negative session response */
|
||||
/* 0x84 == retarget session response */
|
||||
default:
|
||||
|
||||
/* The session setup may need to know about the
|
||||
* NetBIOS session response, but for any command
|
||||
* these message types are invalid.
|
||||
*/
|
||||
D(("Invalid session header type 0x%02lx\n", netbios_session_buf[0]));
|
||||
|
||||
(*error_ptr) = error_invalid_netbios_session;
|
||||
|
||||
result = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
netbios_session_payload_size = (int)smb_len(netbios_session_buf);
|
||||
SHOWVALUE(netbios_session_payload_size);
|
||||
|
||||
if(netbios_session_payload_size > 0)
|
||||
{
|
||||
/* The length in the NetBIOS header is the raw data length (17 bits) */
|
||||
if (netbios_session_payload_size > server->transmit_buffer_allocation_size)
|
||||
{
|
||||
D(("Received length (%ld) > max_xmit (%ld)!", netbios_session_payload_size, server->transmit_buffer_allocation_size));
|
||||
|
||||
(*error_ptr) = error_message_exceeds_buffer_size;
|
||||
|
||||
result = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
result = receive_all (sock_fd, server->transmit_buffer, netbios_session_payload_size, error_ptr);
|
||||
if (result < 0)
|
||||
{
|
||||
D(("recv error = %ld", (*error_ptr)));
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
|
||||
RETURN(result);
|
||||
return(result);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/* smb_receive_raw: The NetBIOS header is only stored if want_header != 0. */
|
||||
static int
|
||||
smb_receive_raw (
|
||||
|
||||
Reference in New Issue
Block a user