Updated to version 2.12

Found a couple more cases in which debug output did not use the correct parameter information. This happened, for example, in the SMB write operation (which did not correctly report the 64 bit seek offset) and the ACTION_SET_COMMENT implementation which did not print the comment string correctly.

Added a proper string length limit check for the text buffers used by the DateToStr() function.

Enabled profiling support for SAS/C to learn more about the most frequently-used functions and their respective running times. Added inline qualifiers to these functions, or copied the respective function to where it was called, allowing it to be inlined.

The main file system processing loop no longer calls WaitSelect() every time it needs to wait for a new packet to arrive, or for a NetBIOS "keep alive" message to come along. It now defaults to calling Wait(), which has a much lower overhead than WaitSelect(). However, periodic calls to WaitSelect() and the associated NetBIOS "keep alive" handling are scheduled regularly every 10 seconds. That way the "keep alive" messages are dealt with without spending too much time with WaitSelect().
This commit is contained in:
obarthel
2019-01-06 10:45:39 +01:00
parent 2f0c186ff6
commit 401f1291e3
13 changed files with 618 additions and 175 deletions
+2 -2
View File
@@ -110,8 +110,8 @@
void _LEAVE(const char *file,int line,const char *function);
void _RETURN(const char *file,int line,const char *function,unsigned long result);
void _DPRINTF_HEADER(const char *file,int line);
void VARARGS68K _DPRINTF(const char *format,...);
void VARARGS68K _DLOG(const char *format,...);
void VARARGS68K _DPRINTF(const char *format,...) __attribute__ ((format (printf, 1, 2)));
void VARARGS68K _DLOG(const char *format,...) __attribute__ ((format (printf, 1, 2)));
void _SETDEBUGFILE(BPTR file);
int _SETDEBUGLEVEL(int level);
void _PUSHDEBUGLEVEL(int level);
-2
View File
@@ -52,8 +52,6 @@ struct smb_lkrng
/*****************************************************************************/
/* proc.c */
byte *smb_encode_smb_length(byte *p, int len);
int smb_len(const byte *packet);
void smb_translate_error_class_and_code(int errcls,int error,char ** class_ptr,char ** code_ptr);
int smb_errno(int errcls, int error);
int smb_payload_size(const struct smb_server *server, int wct, int bcc);
+241 -116
View File
File diff suppressed because it is too large Load Diff
+20 -6
View File
@@ -477,7 +477,7 @@ smb_decode_dword (const byte * p, dword * data)
return (byte *)&p[4];
}
byte *
static INLINE byte *
smb_encode_smb_length (byte * p, int len)
{
/* 0x00 = NetBIOS session message */
@@ -689,7 +689,7 @@ date_unix2dos (int utc_seconds, unsigned short *time_value, unsigned short *date
* Support section.
*
****************************************************************************/
int
static INLINE int
smb_len (const byte * packet)
{
/* This returns the payload length stored in the NetBIOS session header. */
@@ -956,13 +956,14 @@ smb_dump_packet (const byte * packet)
errcls = (int) packet[9];
error = (int) (int) (packet[11] | ((int)packet[12]) << 8);
LOG (("smb_len = %ld valid = %ld\n", len = smb_len (packet), smb_valid_packet (packet)));
LOG (("smb_len = %ld valid = %ld\n", smb_len (packet), smb_valid_packet (packet)));
LOG (("smb_cmd = %ld smb_wct = %ld smb_bcc = %ld\n", packet[8], SMB_WCT (packet), SMB_BCC (packet)));
LOG (("smb_rcls = %ld smb_err = %ld\n", errcls, error));
if (errcls)
smb_printerr (errcls, error);
len = smb_len (packet);
if (len > 100)
len = 100;
@@ -2461,7 +2462,14 @@ smb_decode_dirent (const char *p, struct smb_dirent *entry)
struct tm tm;
seconds_to_tm(entry->mtime,&tm);
LOG(("mtime = %ld-%02ld-%02ld %ld:%02ld:%02ld\n",tm.tm_year + 1900,tm.tm_mon+1,tm.tm_mday,tm.tm_hour,tm.tm_min,tm.tm_sec));
LOG(("mtime = %ld-%02ld-%02ld %ld:%02ld:%02ld\n",
tm.tm_year + 1900,
tm.tm_mon+1,
tm.tm_mday,
tm.tm_hour,
tm.tm_min,
tm.tm_sec));
}
#endif /* DEBUG */
@@ -2606,6 +2614,8 @@ smb_proc_readdir_short (
goto out;
}
ASSERT (bcc == count * SMB_DIRINFO_SIZE + 3);
if (bcc != count * SMB_DIRINFO_SIZE + 3)
{
LOG (("byte count (%ld) does not match expected size (%ld)\n", bcc, count * SMB_DIRINFO_SIZE + 3));
@@ -2812,7 +2822,7 @@ smb_decode_long_dirent (
/* Skip directory entries whose names we cannot store. */
if(name_len >= (int)finfo->complete_path_size)
{
LOG(("name length >= %ld (skipping it)\n", finfo->complete_path_size));
LOG(("name length >= %lu (skipping it)\n", (unsigned long)finfo->complete_path_size));
success = FALSE;
break;
@@ -2946,7 +2956,7 @@ smb_decode_long_dirent (
/* Skip directory entries whose names we cannot store. */
if(name_len >= (int)finfo->complete_path_size)
{
LOG(("name length >= %ld (skipping it)\n", finfo->complete_path_size));
LOG(("name length >= %lu (skipping it)\n", (unsigned long)finfo->complete_path_size));
success = FALSE;
break;
@@ -3194,8 +3204,12 @@ smb_proc_readdir_long (
{
SHOWMSG("ouch; delaying and retrying");
PROFILE_OFF();
Delay(TICKS_PER_SECOND / 5);
PROFILE_ON();
continue;
}
+4 -4
View File
@@ -20,14 +20,14 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef _QUAD_MATH_H
#include "quad_math.h"
#endif /* _QUAD_MATH_H */
#ifndef _SMBFS_H
#include "smbfs.h"
#endif /* _SMBFS_H */
/****************************************************************************/
/* This function comes from Harry S. Warren, Jr.'s book "Hacker's delight". */
static int
static INLINE int
carry(ULONG x, ULONG y)
{
int result;
+10 -3
View File
@@ -69,17 +69,24 @@ VERSION = 2
#
#DEBUG_OPTIONS = define=DEBUG define=DUMP_SMB code=far data=faronly
###########################################################################
# Enable profiling support; note that this requires linking
# against "lib:scnb.lib" instead of "lib:sc.lib", just like
# it is necessary for the debug build.
#PROFILE_OPTIONS = profile code=far data=faronly
###############################################################################
# Note: if DEBUG_OPTIONS are enabled you will need to link smbfs against
# "lib:scnb.lib" rather than "lib:sc.lib".
# Note: if DEBUG_OPTIONS or PROFILE_OPTIONS are enabled you will need to link
# smbfs against "lib:scnb.lib" rather than "lib:sc.lib".
LIBS = lib:sc.lib lib:amiga.lib lib:debug.lib
###############################################################################
CFLAGS = \
idlen=64 comnest streq strmerge nostkchk \
$(OPTIMIZE) cpu=$(CPU) debug=$(DEBUG) $(DEBUG_OPTIONS) \
$(OPTIMIZE) cpu=$(CPU) debug=$(DEBUG) $(DEBUG_OPTIONS) $(PROFILE_OPTIONS) \
params=register idir=netinclude idir=include \
ignore=306 gst=system_headers.gst
+3 -2
View File
@@ -796,7 +796,7 @@ smba_read (smba_file_t * f, char *data, long len, const QUAD * const offset, int
if (result < 0)
goto out;
LOG(("read %ld bytes from offset %ld\n",len,offset));
LOG(("read %ld bytes from offset %s\n",len,convert_quad_to_string(offset)));
/* SMB_COM_READ_ANDX supported? */
if (f->server->server.protocol >= PROTOCOL_LANMAN1 && !f->server->server.prefer_core_protocol)
@@ -1043,7 +1043,7 @@ smba_write (smba_file_t * f, const char *data, long len, const QUAD * const offs
ASSERT( n > 0 );
LOG(("writing %ld bytes; offset=%lu, len=%ld\n", n, offset, len));
LOG(("writing %ld bytes; offset=%s, len=%ld\n", n, convert_quad_to_string(&position_quad), len));
result = smb_proc_writex(&f->server->server, &f->dirent, &position_quad, n, data, error_ptr);
if(result < 0)
@@ -2136,6 +2136,7 @@ smba_start(
h_errno = 0;
h = gethostbyname (server);
lookup_error = h_errno;
if (h != NULL)
+1 -1
View File
@@ -154,7 +154,7 @@ extern void VARARGS68K report_error(const TEXT * fmt,...);
extern void string_toupper(STRPTR s);
extern void VARARGS68K LocalSNPrintf(STRPTR buffer, int limit, const TEXT * formatString,...);
extern TEXT * escape_name(const TEXT * name);
extern const char * convert_quad_to_string(const QUAD * const number);
extern const char * convert_quad_to_string(const QUAD * number);
/****************************************************************************/
+5 -5
View File
@@ -1,6 +1,6 @@
#define VERSION 2
#define REVISION 11
#define DATE "31.12.2018"
#define VERS "smbfs 2.11"
#define VSTRING "smbfs 2.11 (31.12.2018)\r\n"
#define VERSTAG "\0$VER: smbfs 2.11 (31.12.2018)"
#define REVISION 12
#define DATE "5.1.2019"
#define VERS "smbfs 2.12"
#define VSTRING "smbfs 2.12 (5.1.2019)\r\n"
#define VERSTAG "\0$VER: smbfs 2.12 (5.1.2019)"
+1 -1
View File
@@ -1 +1 @@
11
12
+255 -33
View File
@@ -56,38 +56,74 @@
/*****************************************************************************/
static INLINE int
smb_len (const byte * packet)
{
/* This returns the payload length stored in the NetBIOS session header. */
return (((int)(packet[1] & 0x1)) << 16) | (((int)packet[2]) << 8) | (packet[3]);
}
static INLINE byte *
smb_encode_smb_length (byte * p, int len)
{
/* 0x00 = NetBIOS session message */
p[0] = 0;
/* Length is a 17 bit integer, the most significant
* bit of which goes into bit #0. The other 7 bits
* are reserved.
*/
p[1] = (len >> 16) & 1;
/* Payload length in network byte order
* (least significant 16 bits).
*/
p[2] = (len & 0xFF00) >> 8;
p[3] = (len & 0xFF);
return &p[4];
}
/*****************************************************************************/
/* Attempt to receive all the incoming data, even if recv() returns only
* parts of the total number of bytes requested. Returns the number of bytes
* read or, in case of error a negative number. A negative result is the
* value of -errno.
*/
static int
receive_all(int fd, void * _data, int len, int * error_ptr)
static INLINE int
receive_all(int fd, void * _data, int len)
{
int num_bytes_received;
char * data = _data;
int result;
int result = 0;
int n;
ASSERT( data != NULL || len == 0 );
ASSERT( error_ptr != NULL );
for(num_bytes_received = 0 ; num_bytes_received < len ; num_bytes_received += result)
for(;;)
{
result = recv(fd, &data[num_bytes_received], len - num_bytes_received, 0);
if(result == 0)
PROFILE_OFF();
n = recv(fd, data, len, 0);
PROFILE_ON();
if(n < 0)
{
result = -1;
break;
}
result += n;
len -= n;
if(len == 0 || n == 0)
break;
if(result < 0)
{
(*error_ptr) = errno;
goto out;
}
data += n;
}
result = num_bytes_received;
out:
return(result);
}
@@ -110,9 +146,11 @@ smb_discard_netbios_frames(struct smb_server *server, int sock_fd, int * error_p
ASSERT( error_ptr != NULL );
/* Read the NetBIOS session header (rfc-1002, section 4.3.1) */
result = receive_all (sock_fd, netbios_session_buf, NETBIOS_HEADER_SIZE, error_ptr);
result = receive_all (sock_fd, netbios_session_buf, NETBIOS_HEADER_SIZE);
if (result < 0)
{
(*error_ptr) = errno;
LOG (("recv error = %ld\n", (*error_ptr)));
goto out;
}
@@ -176,9 +214,11 @@ smb_discard_netbios_frames(struct smb_server *server, int sock_fd, int * error_p
goto out;
}
result = receive_all (sock_fd, server->transmit_buffer, netbios_session_payload_size, error_ptr);
result = receive_all (sock_fd, server->transmit_buffer, netbios_session_payload_size);
if (result < 0)
{
(*error_ptr) = errno;
LOG(("recv error = %ld\n", (*error_ptr)));
goto out;
}
@@ -212,6 +252,8 @@ smb_receive_raw (
ASSERT( server != NULL );
ASSERT( error_ptr != NULL );
PROFILE_PUSH("SMB receive raw header");
/* We need to read the NetBIOS session header before we can move
* on and read the SMB data. Because the NetBIOS session header
* may be a keepalive message or something else we can safely
@@ -223,11 +265,21 @@ smb_receive_raw (
server->rcls = 0;
server->err = 0;
PROFILE_PUSH("SMB receive raw header: receive_all()");
/* Read the NetBIOS session header (rfc-1002, section 4.3.1) */
result = receive_all (sock_fd, netbios_session_buf, NETBIOS_HEADER_SIZE, error_ptr);
result = receive_all (sock_fd, netbios_session_buf, NETBIOS_HEADER_SIZE);
PROFILE_POP("SMB receive raw header: receive_all()");
if (result < 0)
{
(*error_ptr) = errno;
LOG (("recv error = %ld\n", (*error_ptr)));
PROFILE_POP("SMB receive raw header");
goto out;
}
@@ -238,6 +290,9 @@ smb_receive_raw (
(*error_ptr) = error_end_of_file;
result = -1;
PROFILE_POP("SMB receive raw header");
goto out;
}
@@ -260,10 +315,15 @@ smb_receive_raw (
if(netbios_session_payload_size > (int)sizeof(netbios_session_payload))
netbios_session_payload_size = sizeof(netbios_session_payload);
result = receive_all (sock_fd, netbios_session_payload, netbios_session_payload_size, error_ptr);
result = receive_all (sock_fd, netbios_session_payload, netbios_session_payload_size);
if (result < 0)
{
(*error_ptr) = errno;
LOG (("recv error = %ld\n", (*error_ptr)));
PROFILE_POP("SMB receive raw header");
goto out;
}
@@ -274,6 +334,9 @@ smb_receive_raw (
(*error_ptr) = error_end_of_file;
result = -1;
PROFILE_POP("SMB receive raw header");
goto out;
}
@@ -330,6 +393,9 @@ smb_receive_raw (
(*error_ptr) = error_invalid_netbios_session;
result = -1;
PROFILE_POP("SMB receive raw header");
goto out;
}
@@ -340,6 +406,8 @@ smb_receive_raw (
break;
}
PROFILE_POP("SMB receive raw header");
/* The length in the NetBIOS header is the raw data length (17 bits) */
len = netbios_session_payload_size;
if (len > max_raw_length)
@@ -383,13 +451,15 @@ smb_receive_raw (
LOG(("receiving SMB message and payload separately\n"));
LOG(("input_payload=0x%08lx, payload_size=%ld\n", input_payload, input_payload_size));
LOG(("input_payload=0x%08lx, payload_size=%ld\n", (unsigned long)input_payload, input_payload_size));
if(command == SMBreadX)
{
int data_length;
int data_offset;
PROFILE_PUSH("SMBreadX");
/* We need to read the following data:
*
* 0: 32 bytes of SMB message header
@@ -412,10 +482,15 @@ smb_receive_raw (
ASSERT( target != NULL );
result = receive_all (sock_fd, target, 59, error_ptr);
result = receive_all (sock_fd, target, 59);
if (result < 0)
{
(*error_ptr) = errno;
LOG (("recv error = %ld\n", (*error_ptr)));
PROFILE_POP("SMBreadX");
goto out;
}
@@ -432,6 +507,9 @@ smb_receive_raw (
(*error_ptr) = error_end_of_file;
result = -1;
PROFILE_POP("SMBreadX");
goto out;
}
@@ -444,10 +522,15 @@ smb_receive_raw (
{
LOG (("skipping %ld padding bytes\n", data_offset - 59));
result = receive_all (sock_fd, target + 59, data_offset - 59, error_ptr);
result = receive_all (sock_fd, target + 59, data_offset - 59);
if (result < 0)
{
(*error_ptr) = errno;
LOG (("recv error = %ld\n", (*error_ptr)));
PROFILE_POP("SMBreadX");
goto out;
}
@@ -460,6 +543,9 @@ smb_receive_raw (
(*error_ptr) = error_end_of_file;
result = -1;
PROFILE_POP("SMBreadX");
goto out;
}
@@ -472,10 +558,15 @@ smb_receive_raw (
ASSERT( data_length <= input_payload_size );
result = receive_all (sock_fd, input_payload, data_length, error_ptr);
result = receive_all (sock_fd, input_payload, data_length);
if (result < 0)
{
(*error_ptr) = errno;
LOG (("recv error = %ld\n", (*error_ptr)));
PROFILE_POP("SMBreadX");
goto out;
}
@@ -487,6 +578,9 @@ smb_receive_raw (
(*error_ptr) = error_end_of_file;
result = -1;
PROFILE_POP("SMBreadX");
goto out;
}
@@ -499,10 +593,15 @@ smb_receive_raw (
{
LOG(("reading the remaining %ld bytes; this should never happen\n", len - num_bytes_received ));
result = receive_all (sock_fd, &target[num_bytes_received], len - num_bytes_received, error_ptr);
result = receive_all (sock_fd, &target[num_bytes_received], len - num_bytes_received);
if (result < 0)
{
(*error_ptr) = errno;
LOG (("recv error = %ld\n", (*error_ptr)));
PROFILE_POP("SMBreadX");
goto out;
}
@@ -514,9 +613,14 @@ smb_receive_raw (
(*error_ptr) = error_end_of_file;
result = -1;
PROFILE_POP("SMBreadX");
goto out;
}
}
PROFILE_POP("SMBreadX");
}
else
{
@@ -524,6 +628,8 @@ smb_receive_raw (
int count_of_bytes_to_read;
int buffer_format;
PROFILE_PUSH("SMBread");
ASSERT( command == SMBread );
/* We need to read the following data:
@@ -543,10 +649,15 @@ smb_receive_raw (
ASSERT( target != NULL );
result = receive_all (sock_fd, target, 48, error_ptr);
result = receive_all (sock_fd, target, 48);
if (result < 0)
{
(*error_ptr) = errno;
LOG (("recv error = %ld\n", (*error_ptr)));
PROFILE_POP("SMBread");
goto out;
}
@@ -563,6 +674,9 @@ smb_receive_raw (
(*error_ptr) = error_end_of_file;
result = -1;
PROFILE_POP("SMBread");
goto out;
}
@@ -583,6 +697,9 @@ smb_receive_raw (
(*error_ptr) = error_invalid_buffer_format;
result = -1;
PROFILE_POP("SMBread");
goto out;
}
@@ -603,13 +720,21 @@ smb_receive_raw (
(*error_ptr) = error_message_exceeds_buffer_size;
result = -1;
PROFILE_POP("SMBread");
goto out;
}
result = receive_all (sock_fd, input_payload, count_of_bytes_to_read, error_ptr);
result = receive_all (sock_fd, input_payload, count_of_bytes_to_read);
if (result < 0)
{
(*error_ptr) = errno;
LOG (("recv error = %ld\n", (*error_ptr)));
PROFILE_POP("SMBread");
goto out;
}
@@ -621,6 +746,9 @@ smb_receive_raw (
(*error_ptr) = error_end_of_file;
result = -1;
PROFILE_POP("SMBread");
goto out;
}
@@ -642,10 +770,15 @@ smb_receive_raw (
{
LOG(("reading the remaining %ld bytes; this should never happen\n", len - num_bytes_received ));
result = receive_all (sock_fd, &target[num_bytes_received], len - num_bytes_received, error_ptr);
result = receive_all (sock_fd, &target[num_bytes_received], len - num_bytes_received);
if (result < 0)
{
(*error_ptr) = errno;
LOG (("recv error = %ld\n", (*error_ptr)));
PROFILE_POP("SMBread");
goto out;
}
@@ -657,6 +790,9 @@ smb_receive_raw (
(*error_ptr) = error_end_of_file;
result = -1;
PROFILE_POP("SMBread");
goto out;
}
}
@@ -673,6 +809,8 @@ smb_receive_raw (
dump_smb(__FILE__,__LINE__,!want_header,&target[num_bytes_received],result,smb_packet_to_consumer,server->max_recv);
}
#endif /* defined(DUMP_SMB) */
PROFILE_POP("SMBread");
}
result = num_bytes_received;
@@ -685,14 +823,21 @@ smb_receive_raw (
*/
else
{
PROFILE_PUSH("SMB read full");
LOG(("receiving SMB message and payload in one chunk\n"));
ASSERT( target != NULL );
result = receive_all (sock_fd, target, len, error_ptr);
result = receive_all (sock_fd, target, len);
if (result < 0)
{
(*error_ptr) = errno;
LOG (("recv error = %ld\n", (*error_ptr)));
PROFILE_POP("SMB read full");
goto out;
}
@@ -704,6 +849,9 @@ smb_receive_raw (
(*error_ptr) = error_end_of_file;
result = -1;
PROFILE_POP("SMB read full");
goto out;
}
@@ -751,6 +899,9 @@ smb_receive_raw (
(*error_ptr) = error_invalid_buffer_format;
result = -1;
PROFILE_POP("SMB read full");
goto out;
}
@@ -771,6 +922,9 @@ smb_receive_raw (
(*error_ptr) = error_message_exceeds_buffer_size;
result = -1;
PROFILE_POP("SMB read full");
goto out;
}
@@ -785,16 +939,25 @@ smb_receive_raw (
memset(&input_payload[count_of_bytes_to_read],0,count_of_bytes_returned - count_of_bytes_to_read);
}
}
PROFILE_POP("SMB read full");
}
}
else
{
PROFILE_PUSH("SMB read single buffer");
ASSERT( target != NULL );
result = receive_all (sock_fd, target, len, error_ptr);
result = receive_all (sock_fd, target, len);
if (result < 0)
{
(*error_ptr) = errno;
LOG (("recv error = %ld\n", (*error_ptr)));
PROFILE_POP("SMB read single buffer");
goto out;
}
@@ -806,6 +969,9 @@ smb_receive_raw (
(*error_ptr) = error_end_of_file;
result = -1;
PROFILE_POP("SMB read single buffer");
goto out;
}
@@ -815,6 +981,8 @@ smb_receive_raw (
dump_smb(__FILE__,__LINE__,!want_header,target,result,smb_packet_to_consumer,server->max_recv);
}
#endif /* defined(DUMP_SMB) */
PROFILE_POP("SMB read single buffer");
}
out:
@@ -1089,7 +1257,12 @@ smb_release (struct smb_server *server)
{
if (server->mount_data.fd >= 0)
{
PROFILE_OFF();
CloseSocket (server->mount_data.fd);
PROFILE_ON();
server->mount_data.fd = -1;
}
@@ -1102,6 +1275,8 @@ smb_connect (struct smb_server *server, int * error_ptr)
int enabled = TRUE;
int result;
PROFILE_OFF();
ASSERT( server != NULL );
ASSERT( error_ptr != NULL );
@@ -1292,6 +1467,8 @@ smb_connect (struct smb_server *server, int * error_ptr)
out:
PROFILE_ON();
return(result);
}
@@ -1426,8 +1603,8 @@ smb_request (
LOG (("len = %ld, cmd = 0x%lx, input_payload=0x%08lx, output_payload=0x%08lx, payload_size=%ld\n",
len,
buffer[8],
input_payload,
output_payload,
(unsigned long)input_payload,
(unsigned long)output_payload,
payload_size));
#if defined(DUMP_SMB)
@@ -1442,7 +1619,12 @@ smb_request (
{
LOG(("using two send() calls\n"));
PROFILE_OFF();
result = send (sock_fd, (void *) buffer, len, 0);
PROFILE_ON();
if (result < 0)
{
LOG(("send() for %ld bytes failed (errno=%ld)\n", len, errno));
@@ -1452,7 +1634,12 @@ smb_request (
goto out;
}
PROFILE_OFF();
result = send (sock_fd, (void *)output_payload, payload_size, 0);
PROFILE_ON();
if (result < 0)
{
LOG(("payload send() for %ld bytes failed (errno=%ld)\n", payload_size, errno));
@@ -1483,7 +1670,12 @@ smb_request (
iov[1].iov_base = (void *)output_payload;
iov[1].iov_len = payload_size;
PROFILE_OFF();
result = sendmsg (sock_fd, &msg, 0);
PROFILE_ON();
if (result < 0)
{
LOG(("sendmsg() for %ld+%ld bytes failed (errno=%ld)\n", len, payload_size, errno));
@@ -1496,7 +1688,12 @@ smb_request (
}
else
{
PROFILE_OFF();
result = send (sock_fd, (void *) buffer, len, 0);
PROFILE_ON();
if (result < 0)
{
LOG(("send() for %ld bytes failed (errno=%ld)\n", len, errno));
@@ -1560,7 +1757,12 @@ smb_trans2_request (
dump_smb(__FILE__,__LINE__,0,buffer+NETBIOS_HEADER_SIZE,len-NETBIOS_HEADER_SIZE,smb_packet_from_consumer,server->max_recv);
#endif /* defined(DUMP_SMB) */
PROFILE_OFF();
result = send (sock_fd, (void *) buffer, len, 0);
PROFILE_ON();
if (result < 0)
{
LOG(("send() for %ld bytes failed (errno=%ld)\n", len, errno));
@@ -1619,7 +1821,12 @@ smb_request_read_raw (struct smb_server *server, unsigned char *target, int max_
#endif /* defined(DUMP_SMB) */
/* Request that data should be read in raw mode. */
PROFILE_OFF();
result = send (sock_fd, (void *) buffer, len, 0);
PROFILE_ON();
if (result < 0)
{
LOG(("send() for %ld bytes failed (errno=%ld)\n", len, errno));
@@ -1680,7 +1887,12 @@ smb_request_write_raw (struct smb_server *server, unsigned const char *source, i
LOG(("using two send() calls\n"));
/* Send the NetBIOS header. */
PROFILE_OFF();
result = send (sock_fd, nb_header, NETBIOS_HEADER_SIZE, 0);
PROFILE_ON();
if(result < 0)
{
LOG(("send() for %ld bytes failed (errno=%ld)\n", NETBIOS_HEADER_SIZE, errno));
@@ -1691,7 +1903,12 @@ smb_request_write_raw (struct smb_server *server, unsigned const char *source, i
}
/* Now send the data to be written. */
PROFILE_OFF();
result = send (sock_fd, (void *)source, length, 0);
PROFILE_ON();
if(result < 0)
{
LOG(("send() for %ld bytes failed (errno=%ld)\n", length, errno));
@@ -1722,7 +1939,12 @@ smb_request_write_raw (struct smb_server *server, unsigned const char *source, i
iov[1].iov_base = (void *)source;
iov[1].iov_len = length;
PROFILE_OFF();
result = sendmsg (sock_fd, &msg, 0);
PROFILE_ON();
if (result < 0)
{
LOG(("sendmsg() for %ld+%ld bytes failed (errno=%ld)\n", NETBIOS_HEADER_SIZE, length, errno));
+49
View File
@@ -106,6 +106,17 @@
#include <proto/timer.h>
#include <proto/icon.h>
/*
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/intuition_protos.h>
#include <clib/bsdsocket_protos.h>
#include <clib/utility_protos.h>
#include <clib/locale_protos.h>
#include <clib/timer_protos.h>
#include <clib/icon_protos.h>
*/
/*****************************************************************************/
/* This is for backwards compatibility only. */
@@ -145,4 +156,42 @@
/*****************************************************************************/
/* This is for use with the profiling support of the SAS/C compiler and
* its runtime library. The macros defined in the header file are replaced
* by no-ops for other compilers.
*/
#if defined(__SASC) && defined(_PROFILE)
#include <sprof.h>
#if _PROFILE
/* The profiling disable/enable calls need to nest, which is
* why we use our own local counter and some corresponding
* macros instead of the SAS/C-supplied versions. See the
* <sprof.h> header file how they are supposed to work.
*/
extern int profile_nest_count;
#undef PROFILE_ON
#undef PROFILE_OFF
extern void kprintf(const char *fmt, ...);
#define PROFILE_OFF() { if(profile_nest_count++ == 0) _PROLOG(0L); }
#define PROFILE_ON() { if(--profile_nest_count == 0) _EPILOG(0L); }
#endif /* _PROFILE */
#else
#define PROFILE_OFF() {}
#define PROFILE_ON() {}
#define PROFILE_PUSH(x) {}
#define PROFILE_POP(x) {}
#endif /* __SASC */
/*****************************************************************************/
#endif /* _SYSTEM_HEADERS_H */