summaryrefslogtreecommitdiff
path: root/source3/smbd/reply.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/smbd/reply.c')
-rw-r--r--source3/smbd/reply.c456
1 files changed, 358 insertions, 98 deletions
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index b98ae441ac..e64875a805 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -214,6 +214,7 @@ int reply_tcon(connection_struct *conn,
uint16 vuid = SVAL(inbuf,smb_uid);
int pwlen=0;
int ecode = -1;
+ START_PROFILE(SMBtcon);
*service = *user = *password = *dev = 0;
@@ -242,6 +243,7 @@ int reply_tcon(connection_struct *conn,
conn = make_connection(service,user,password,pwlen,dev,vuid,&ecode);
if (!conn) {
+ END_PROFILE(SMBtcon);
return(connection_error(inbuf,outbuf,ecode));
}
@@ -253,6 +255,7 @@ int reply_tcon(connection_struct *conn,
DEBUG(3,("tcon service=%s user=%s cnum=%d\n",
service, user, conn->cnum));
+ END_PROFILE(SMBtcon);
return(outsize);
}
@@ -271,6 +274,7 @@ int reply_tcon_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
int passlen = SVAL(inbuf,smb_vwv3);
char *path;
char *p;
+ START_PROFILE(SMBtconX);
*service = *user = *password = *devicename = 0;
@@ -294,8 +298,10 @@ int reply_tcon_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
}
p = strchr(path+2,'\\');
- if (!p)
+ if (!p) {
+ END_PROFILE(SMBtconX);
return(ERROR(ERRDOS,ERRnosuchshare));
+ }
fstrcpy(service,p+1);
p = strchr(service,'%');
if (p) {
@@ -327,8 +333,10 @@ int reply_tcon_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
conn = make_connection(service,user,password,passlen,devicename,vuid,&ecode);
- if (!conn)
+ if (!conn) {
+ END_PROFILE(SMBtconX);
return(connection_error(inbuf,outbuf,ecode));
+ }
if (Protocol < PROTOCOL_NT1) {
set_message(outbuf,2,strlen(devicename)+1,True);
@@ -359,6 +367,7 @@ int reply_tcon_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
SSVAL(inbuf,smb_tid,conn->cnum);
SSVAL(outbuf,smb_tid,conn->cnum);
+ END_PROFILE(SMBtconX);
return chain_reply(inbuf,outbuf,length,bufsize);
}
@@ -390,6 +399,7 @@ int reply_ioctl(connection_struct *conn,
int replysize, outsize;
char *p;
files_struct *fsp = file_fsp(inbuf,smb_vwv0);
+ START_PROFILE(SMBioctl);
DEBUG(4, ("Received IOCTL (code 0x%x)\n", ioctl_code));
@@ -399,6 +409,7 @@ int reply_ioctl(connection_struct *conn,
replysize = 32;
break;
default:
+ END_PROFILE(SMBioctl);
return(ERROR(ERRSRV,ERRnosupport));
}
@@ -417,6 +428,7 @@ int reply_ioctl(connection_struct *conn,
break;
}
+ END_PROFILE(SMBioctl);
return outsize;
}
@@ -653,6 +665,7 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int
static BOOL done_sesssetup = False;
BOOL doencrypt = SMBENCRYPT();
char *domain = "";
+ START_PROFILE(SMBsesssetupX);
*smb_apasswd = 0;
*smb_ntpasswd = 0;
@@ -801,6 +814,7 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int
/* say yes to everything ending in $. */
if (*user && (user[strlen(user) - 1] == '$') && (smb_apasslen == 24) && (smb_ntpasslen == 24)) {
+ END_PROFILE(SMBsesssetupX);
return session_trust_account(conn, inbuf, outbuf, user,
smb_apasswd, smb_apasslen,
smb_ntpasswd, smb_ntpasslen);
@@ -816,6 +830,7 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int
*/
if (!*user && !*smb_apasswd && !*domain) {
DEBUG(0, ("restrict anonymous is True and anonymous connection attempted. Denying access.\n"));
+ END_PROFILE(SMBsesssetupX);
return(ERROR(ERRDOS,ERRnoaccess));
}
}
@@ -913,6 +928,7 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int
if (lp_map_to_guest() == NEVER_MAP_TO_GUEST)
{
DEBUG(1,("Rejecting user '%s': authentication failed\n", user));
+ END_PROFILE(SMBsesssetupX);
return bad_password_error(inbuf,outbuf);
}
@@ -921,6 +937,7 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int
if (smb_getpwnam(user,True))
{
DEBUG(1,("Rejecting user '%s': bad password\n", user));
+ END_PROFILE(SMBsesssetupX);
return bad_password_error(inbuf,outbuf);
}
}
@@ -976,6 +993,7 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int
const struct passwd *pw = smb_getpwnam(user,False);
if (!pw) {
DEBUG(1,("Username %s is invalid on this system\n",user));
+ END_PROFILE(SMBsesssetupX);
return bad_password_error(inbuf,outbuf);
}
gid = pw->pw_gid;
@@ -1000,6 +1018,7 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int
done_sesssetup = True;
+ END_PROFILE(SMBsesssetupX);
return chain_reply(inbuf,outbuf,length,bufsize);
}
@@ -1015,6 +1034,7 @@ int reply_chkpth(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
BOOL ok = False;
BOOL bad_path = False;
SMB_STRUCT_STAT st;
+ START_PROFILE(SMBchkpth_count);
pstrcpy(name,smb_buf(inbuf) + 1);
@@ -1061,6 +1081,7 @@ int reply_chkpth(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
DEBUG(3,("chkpth %s mode=%d\n", name, mode));
+ END_PROFILE(SMBchkpth);
return(outsize);
}
@@ -1078,6 +1099,7 @@ int reply_getatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
SMB_OFF_T size=0;
time_t mtime=0;
BOOL bad_path = False;
+ START_PROFILE(SMBgetatr);
pstrcpy(fname,smb_buf(inbuf) + 1);
@@ -1122,6 +1144,7 @@ int reply_getatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
unix_ERR_code = ERRbadpath;
}
+ END_PROFILE(SMBgetatr);
return(UNIXERROR(ERRDOS,ERRbadfile));
}
@@ -1144,6 +1167,7 @@ int reply_getatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
DEBUG( 3, ( "getatr name=%s mode=%d size=%d\n", fname, mode, (uint32)size ) );
+ END_PROFILE(SMBgetatr);
return(outsize);
}
@@ -1160,6 +1184,7 @@ int reply_setatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
time_t mtime;
SMB_STRUCT_STAT st;
BOOL bad_path = False;
+ START_PROFILE(SMBsetatr);
pstrcpy(fname,smb_buf(inbuf) + 1);
unix_convert(fname,conn,0,&bad_path,&st);
@@ -1182,6 +1207,7 @@ int reply_setatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
unix_ERR_code = ERRbadpath;
}
+ END_PROFILE(SMBsetatr);
return(UNIXERROR(ERRDOS,ERRnoaccess));
}
@@ -1189,6 +1215,7 @@ int reply_setatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
DEBUG( 3, ( "setatr name=%s mode=%d\n", fname, mode ) );
+ END_PROFILE(SMBsetatr);
return(outsize);
}
@@ -1200,8 +1227,9 @@ int reply_dskattr(connection_struct *conn, char *inbuf,char *outbuf, int dum_siz
{
int outsize = 0;
SMB_BIG_UINT dfree,dsize,bsize;
+ START_PROFILE(SMBdskattr);
- conn->vfs_ops.disk_free(".",True,&bsize,&dfree,&dsize);
+ conn->vfs_ops.disk_free(conn,".",True,&bsize,&dfree,&dsize);
outsize = set_message(outbuf,5,0,True);
@@ -1212,6 +1240,7 @@ int reply_dskattr(connection_struct *conn, char *inbuf,char *outbuf, int dum_siz
DEBUG(3,("dskattr dfree=%d\n", (unsigned int)dfree));
+ END_PROFILE(SMBdskattr);
return(outsize);
}
@@ -1244,6 +1273,7 @@ int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
BOOL expect_close = False;
BOOL can_open = True;
BOOL bad_path = False;
+ START_PROFILE(SMBsearch);
*mask = *directory = *fname = 0;
@@ -1324,8 +1354,10 @@ int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
unix_ERR_class = ERRDOS;
unix_ERR_code = ERRbadpath;
}
+ END_PROFILE(SMBsearch);
return (UNIXERROR(ERRDOS,ERRnofids));
}
+ END_PROFILE(SMBsearch);
return(ERROR(ERRDOS,ERRnofids));
}
dptr_set_wcard(dptr_num, strdup(mask));
@@ -1416,6 +1448,7 @@ int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
smb_fn_name(CVAL(inbuf,smb_com)),
mask, directory, dirtype, numentries, maxentries ) );
+ END_PROFILE(SMBsearch);
return(outsize);
}
@@ -1430,14 +1463,17 @@ int reply_fclose(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
char *path;
char status[21];
int dptr_num= -2;
+ START_PROFILE(SMBfclose);
outsize = set_message(outbuf,1,0,True);
path = smb_buf(inbuf) + 1;
status_len = SVAL(smb_buf(inbuf),3 + strlen(path));
- if (status_len == 0)
+ if (status_len == 0) {
+ END_PROFILE(SMBfclose);
return(ERROR(ERRSRV,ERRsrverror));
+ }
memcpy(status,smb_buf(inbuf) + 1 + strlen(path) + 4,21);
@@ -1450,6 +1486,7 @@ int reply_fclose(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
DEBUG(3,("search close\n"));
+ END_PROFILE(SMBfclose);
return(outsize);
}
@@ -1472,6 +1509,7 @@ int reply_open(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
BOOL bad_path = False;
files_struct *fsp;
int oplock_request = CORE_OPLOCK_REQUEST(inbuf);
+ START_PROFILE(SMBopen);
share_mode = SVAL(inbuf,smb_vwv0);
@@ -1493,11 +1531,13 @@ int reply_open(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
unix_ERR_class = ERRDOS;
unix_ERR_code = ERRbadpath;
}
+ END_PROFILE(SMBopen);
return(UNIXERROR(ERRDOS,ERRnoaccess));
}
- if (fsp->conn->vfs_ops.fstat(fsp->fd,&sbuf) != 0) {
+ if (vfs_fstat(fsp,fsp->fd,&sbuf) != 0) {
close_file(fsp,False);
+ END_PROFILE(SMBopen);
return(ERROR(ERRDOS,ERRnoaccess));
}
@@ -1508,6 +1548,7 @@ int reply_open(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
if (fmode & aDIR) {
DEBUG(3,("attempt to open a directory %s\n",fname));
close_file(fsp,False);
+ END_PROFILE(SMBopen);
return(ERROR(ERRDOS,ERRnoaccess));
}
@@ -1527,6 +1568,7 @@ int reply_open(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
if(EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type))
CVAL(outbuf,smb_flg) |= CORE_OPLOCK_GRANTED;
+ END_PROFILE(SMBopen);
return(outsize);
}
@@ -1557,13 +1599,17 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
int smb_action = 0;
BOOL bad_path = False;
files_struct *fsp;
+ START_PROFILE(SMBopenX);
/* If it's an IPC, pass off the pipe handler. */
if (IS_IPC(conn)) {
- if (lp_nt_pipe_support())
+ if (lp_nt_pipe_support()) {
+ END_PROFILE(SMBopenX);
return reply_open_pipe_and_X(conn, inbuf,outbuf,length,bufsize);
- else
+ } else {
+ END_PROFILE(SMBopenX);
return (ERROR(ERRSRV,ERRaccess));
+ }
}
/* XXXX we need to handle passed times, sattr and flags */
@@ -1586,11 +1632,13 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
unix_ERR_class = ERRDOS;
unix_ERR_code = ERRbadpath;
}
+ END_PROFILE(SMBopenX);
return(UNIXERROR(ERRDOS,ERRnoaccess));
}
- if (fsp->conn->vfs_ops.fstat(fsp->fd,&sbuf) != 0) {
+ if (vfs_fstat(fsp,fsp->fd,&sbuf) != 0) {
close_file(fsp,False);
+ END_PROFILE(SMBopenX);
return(ERROR(ERRDOS,ERRnoaccess));
}
@@ -1599,6 +1647,7 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
mtime = sbuf.st_mtime;
if (fmode & aDIR) {
close_file(fsp,False);
+ END_PROFILE(SMBopenX);
return(ERROR(ERRDOS,ERRnoaccess));
}
@@ -1639,6 +1688,7 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
SSVAL(outbuf,smb_vwv8,rmode);
SSVAL(outbuf,smb_vwv11,smb_action);
+ END_PROFILE(SMBopenX);
return chain_reply(inbuf,outbuf,length,bufsize);
}
@@ -1650,6 +1700,7 @@ int reply_ulogoffX(connection_struct *conn, char *inbuf,char *outbuf,int length,
{
uint16 vuid = SVAL(inbuf,smb_uid);
user_struct *vuser = get_valid_user_struct(vuid);
+ START_PROFILE(SMBulogoffX);
if(vuser == 0) {
DEBUG(3,("ulogoff, vuser id %d does not map to user.\n", vuid));
@@ -1667,6 +1718,7 @@ int reply_ulogoffX(connection_struct *conn, char *inbuf,char *outbuf,int length,
DEBUG( 3, ( "ulogoffX vuid=%d\n", vuid ) );
+ END_PROFILE(SMBulogoffX);
return chain_reply(inbuf,outbuf,length,bufsize);
}
@@ -1685,6 +1737,7 @@ int reply_mknew(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
BOOL bad_path = False;
files_struct *fsp;
int oplock_request = CORE_OPLOCK_REQUEST(inbuf);
+ START_PROFILE(SMBcreate);
com = SVAL(inbuf,smb_com);
@@ -1724,6 +1777,7 @@ int reply_mknew(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
unix_ERR_class = ERRDOS;
unix_ERR_code = ERRbadpath;
}
+ END_PROFILE(SMBcreate);
return(UNIXERROR(ERRDOS,ERRnoaccess));
}
@@ -1741,6 +1795,7 @@ int reply_mknew(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
DEBUG( 3, ( "mknew %s fd=%d dmode=%d umode=%o\n",
fname, fsp->fd, createmode, (int)unixmode ) );
+ END_PROFILE(SMBcreate);
return(outsize);
}
@@ -1758,6 +1813,7 @@ int reply_ctemp(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
BOOL bad_path = False;
files_struct *fsp;
int oplock_request = CORE_OPLOCK_REQUEST(inbuf);
+ START_PROFILE(SMBctemp);
createmode = SVAL(inbuf,smb_vwv0);
pstrcpy(fname,smb_buf(inbuf)+1);
@@ -1783,6 +1839,7 @@ int reply_ctemp(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
unix_ERR_class = ERRDOS;
unix_ERR_code = ERRbadpath;
}
+ END_PROFILE(SMBctemp);
return(UNIXERROR(ERRDOS,ERRnoaccess));
}
@@ -1802,6 +1859,7 @@ int reply_ctemp(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
DEBUG( 3, ( "ctemp %s fd=%d dmode=%d umode=%o\n",
fname2, fsp->fd, createmode, (int)unixmode ) );
+ END_PROFILE(SMBctemp);
return(outsize);
}
@@ -1816,7 +1874,7 @@ static BOOL can_delete(char *fname,connection_struct *conn, int dirtype)
if (!CAN_WRITE(conn)) return(False);
- if (conn->vfs_ops.lstat(dos_to_unix(fname,False),&sbuf) != 0) return(False);
+ if (conn->vfs_ops.lstat(conn,dos_to_unix(fname,False),&sbuf) != 0) return(False);
fmode = dos_mode(conn,fname,&sbuf);
if (fmode & aDIR) return(False);
if (!lp_delete_readonly(SNUM(conn))) {
@@ -1846,6 +1904,7 @@ int reply_unlink(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
BOOL exists=False;
BOOL bad_path = False;
BOOL rc = True;
+ START_PROFILE(SMBunlink);
*directory = *mask = 0;
@@ -1919,7 +1978,7 @@ int reply_unlink(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
error = ERRnoaccess;
slprintf(fname,sizeof(fname)-1, "%s/%s",directory,dname);
if (!can_delete(fname,conn,dirtype)) continue;
- if (!conn->vfs_ops.unlink(dos_to_unix(fname,False))) count++;
+ if (!vfs_unlink(conn,fname)) count++;
DEBUG(3,("reply_unlink : doing unlink on %s\n",fname));
}
CloseDir(dirptr);
@@ -1927,21 +1986,24 @@ int reply_unlink(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
}
if (count == 0) {
- if (exists)
+ if (exists) {
+ END_PROFILE(SMBunlink);
return(ERROR(ERRDOS,error));
- else
+ } else
{
if((errno == ENOENT) && bad_path)
{
unix_ERR_class = ERRDOS;
unix_ERR_code = ERRbadpath;
}
+ END_PROFILE(SMBunlink);
return(UNIXERROR(ERRDOS,error));
}
}
outsize = set_message(outbuf,0,0,True);
+ END_PROFILE(SMBunlink);
return(outsize);
}
@@ -1958,6 +2020,7 @@ int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_s
char *header = outbuf;
ssize_t ret=0;
files_struct *fsp;
+ START_PROFILE(SMBreadbraw);
/*
* Special check if an oplock break has been issued
@@ -1970,6 +2033,7 @@ int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_s
_smb_setlen(header,0);
transfer_file(0,smbd_server_fd(),(SMB_OFF_T)0,header,4,0);
DEBUG(5,("readbraw - oplock break finished\n"));
+ END_PROFILE(SMBreadbraw);
return -1;
}
@@ -1982,6 +2046,7 @@ int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_s
DEBUG(3,("fnum %d not open in readbraw - cache prime?\n",(int)SVAL(inbuf,smb_vwv0)));
_smb_setlen(header,0);
transfer_file(0,smbd_server_fd(),(SMB_OFF_T)0,header,4,0);
+ END_PROFILE(SMBreadbraw);
return(-1);
}
@@ -2009,6 +2074,7 @@ int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_s
64 bit offsets.\n", (unsigned int)IVAL(inbuf,smb_vwv8) ));
_smb_setlen(header,0);
transfer_file(0,smbd_server_fd(),(SMB_OFF_T)0,header,4,0);
+ END_PROFILE(SMBreadbraw);
return(-1);
}
@@ -2019,6 +2085,7 @@ int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_s
(double)startpos ));
_smb_setlen(header,0);
transfer_file(0,smbd_server_fd(),(SMB_OFF_T)0,header,4,0);
+ END_PROFILE(SMBreadbraw);
return(-1);
}
}
@@ -2037,7 +2104,7 @@ int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_s
if (size < sizeneeded)
{
SMB_STRUCT_STAT st;
- if (fsp->conn->vfs_ops.fstat(fsp->fd,&st) == 0)
+ if (vfs_fstat(fsp,fsp->fd,&st) == 0)
size = st.st_size;
if (!fsp->can_write)
fsp->size = size;
@@ -2060,7 +2127,7 @@ int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_s
_smb_setlen(header,nread);
if ((nread-predict) > 0) {
- if(conn->vfs_ops.seek(fsp,startpos + predict) == -1) {
+ if(conn->vfs_ops.seek(fsp,fsp->fd,startpos + predict) == -1) {
DEBUG(0,("reply_readbraw: ERROR: seek_file failed.\n"));
ret = 0;
seek_fail = True;
@@ -2068,7 +2135,7 @@ int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_s
}
if(!seek_fail)
- ret = (ssize_t)vfs_transfer_file(-1, fsp->fd, Client, NULL,
+ ret = (ssize_t)vfs_transfer_file(-1, fsp, fsp->fd, Client, NULL,
(SMB_OFF_T)(nread-predict),header,4+predict,
startpos+predict);
}
@@ -2086,6 +2153,7 @@ int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_s
#endif /* UNSAFE_READRAW */
DEBUG(5,("readbraw finished\n"));
+ END_PROFILE(SMBreadbraw);
return -1;
}
@@ -2103,6 +2171,7 @@ int reply_lockread(connection_struct *conn, char *inbuf,char *outbuf, int length
int eclass;
uint32 ecode;
files_struct *fsp = file_fsp(inbuf,smb_vwv0);
+ START_PROFILE(SMBlockread);
CHECK_FSP(fsp,conn);
CHECK_READ(fsp);
@@ -2130,15 +2199,19 @@ int reply_lockread(connection_struct *conn, char *inbuf,char *outbuf, int length
* onto the blocking lock queue.
*/
if(push_blocking_lock_request(inbuf, length, -1, 0))
+ END_PROFILE(SMBlockread);
return -1;
}
+ END_PROFILE(SMBlockread);
return (ERROR(eclass,ecode));
}
nread = read_file(fsp,data,startpos,numtoread);
- if (nread < 0)
+ if (nread < 0) {
+ END_PROFILE(SMBlockread);
return(UNIXERROR(ERRDOS,ERRnoaccess));
+ }
outsize += nread;
SSVAL(outbuf,smb_vwv0,nread);
@@ -2148,6 +2221,7 @@ int reply_lockread(connection_struct *conn, char *inbuf,char *outbuf, int length
DEBUG( 3, ( "lockread fnum=%d num=%d nread=%d\n",
fsp->fnum, (int)numtoread, (int)nread ) );
+ END_PROFILE(SMBlockread);
return(outsize);
}
@@ -2164,6 +2238,7 @@ int reply_read(connection_struct *conn, char *inbuf,char *outbuf, int size, int
SMB_OFF_T startpos;
int outsize = 0;
files_struct *fsp = file_fsp(inbuf,smb_vwv0);
+ START_PROFILE(SMBread);
CHECK_FSP(fsp,conn);
CHECK_READ(fsp);
@@ -2176,14 +2251,18 @@ int reply_read(connection_struct *conn, char *inbuf,char *outbuf, int size, int
numtoread = MIN(BUFFER_SIZE-outsize,numtoread);
data = smb_buf(outbuf) + 3;
- if (is_locked(fsp,conn,(SMB_BIG_UINT)numtoread,(SMB_BIG_UINT)startpos, READ_LOCK))
+ if (is_locked(fsp,conn,(SMB_BIG_UINT)numtoread,(SMB_BIG_UINT)startpos, READ_LOCK)) {
+ END_PROFILE(SMBread);
return(ERROR(ERRDOS,ERRlock));
+ }
if (numtoread > 0)
nread = read_file(fsp,data,startpos,numtoread);
- if (nread < 0)
+ if (nread < 0) {
+ END_PROFILE(SMBread);
return(UNIXERROR(ERRDOS,ERRnoaccess));
+ }
outsize += nread;
SSVAL(outbuf,smb_vwv0,nread);
@@ -2194,6 +2273,7 @@ int reply_read(connection_struct *conn, char *inbuf,char *outbuf, int size, int
DEBUG( 3, ( "read fnum=%d num=%d nread=%d\n",
fsp->fnum, (int)numtoread, (int)nread ) );
+ END_PROFILE(SMBread);
return(outsize);
}
@@ -2209,10 +2289,13 @@ int reply_read_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
size_t smb_mincnt = SVAL(inbuf,smb_vwv6);
ssize_t nread = -1;
char *data;
+ START_PROFILE(SMBreadX);
/* If it's an IPC, pass off the pipe handler. */
- if (IS_IPC(conn))
+ if (IS_IPC(conn)) {
+ END_PROFILE(SMBreadX);
return reply_pipe_read_and_X(inbuf,outbuf,length,bufsize);
+ }
CHECK_FSP(fsp,conn);
CHECK_READ(fsp);
@@ -2237,6 +2320,7 @@ int reply_read_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
if(IVAL(inbuf,smb_vwv10) != 0) {
DEBUG(0,("reply_read_and_X - large offset (%x << 32) used and we don't support \
64 bit offsets.\n", (unsigned int)IVAL(inbuf,smb_vwv10) ));
+ END_PROFILE(SMBreadX);
return(ERROR(ERRDOS,ERRbadaccess));
}
@@ -2244,12 +2328,16 @@ int reply_read_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
}
- if (is_locked(fsp,conn,(SMB_BIG_UINT)smb_maxcnt,(SMB_BIG_UINT)startpos, READ_LOCK))
+ if (is_locked(fsp,conn,(SMB_BIG_UINT)smb_maxcnt,(SMB_BIG_UINT)startpos, READ_LOCK)) {
+ END_PROFILE(SMBreadX);
return(ERROR(ERRDOS,ERRlock));
+ }
nread = read_file(fsp,data,startpos,smb_maxcnt);
- if (nread < 0)
+ if (nread < 0) {
+ END_PROFILE(SMBreadX);
return(UNIXERROR(ERRDOS,ERRnoaccess));
+ }
SSVAL(outbuf,smb_vwv5,nread);
SSVAL(outbuf,smb_vwv6,smb_offset(data,outbuf));
@@ -2258,6 +2346,7 @@ int reply_read_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
DEBUG( 3, ( "readX fnum=%d min=%d max=%d nread=%d\n",
fsp->fnum, (int)smb_mincnt, (int)smb_maxcnt, (int)nread ) );
+ END_PROFILE(SMBreadX);
return chain_reply(inbuf,outbuf,length,bufsize);
}
@@ -2276,6 +2365,7 @@ int reply_writebraw(connection_struct *conn, char *inbuf,char *outbuf, int size,
BOOL write_through;
files_struct *fsp = file_fsp(inbuf,smb_vwv0);
int outsize = 0;
+ START_PROFILE(SMBwritebraw);
CHECK_FSP(fsp,conn);
CHECK_WRITE(fsp);
@@ -2299,8 +2389,10 @@ int reply_writebraw(connection_struct *conn, char *inbuf,char *outbuf, int size,
CVAL(inbuf,smb_com) = SMBwritec;
CVAL(outbuf,smb_com) = SMBwritec;
- if (is_locked(fsp,conn,(SMB_BIG_UINT)tcount,(SMB_BIG_UINT)startpos, WRITE_LOCK))
+ if (is_locked(fsp,conn,(SMB_BIG_UINT)tcount,(SMB_BIG_UINT)startpos, WRITE_LOCK)) {
+ END_PROFILE(SMBwritebraw);
return(ERROR(ERRDOS,ERRlock));
+ }
if (numtowrite>0)
nwritten = write_file(fsp,data,startpos,numtowrite);
@@ -2308,8 +2400,10 @@ int reply_writebraw(connection_struct *conn, char *inbuf,char *outbuf, int size,
DEBUG(3,("writebraw1 fnum=%d start=%.0f num=%d wrote=%d sync=%d\n",
fsp->fnum, (double)startpos, (int)numtowrite, (int)nwritten, (int)write_through));
- if (nwritten < numtowrite)
+ if (nwritten < numtowrite) {
+ END_PROFILE(SMBwritebraw);
return(UNIXERROR(ERRHRD,ERRdiskfull));
+ }
total_written = nwritten;
@@ -2358,8 +2452,10 @@ int reply_writebraw(connection_struct *conn, char *inbuf,char *outbuf, int size,
/* we won't return a status if write through is not selected - this
follows what WfWg does */
- if (!write_through && total_written==tcount)
+ END_PROFILE(SMBwritebraw);
+ if (!write_through && total_written==tcount) {
return(-1);
+ }
return(outsize);
}
@@ -2378,6 +2474,7 @@ int reply_writeunlock(connection_struct *conn, char *inbuf,char *outbuf, int siz
uint32 ecode;
files_struct *fsp = file_fsp(inbuf,smb_vwv0);
int outsize = 0;
+ START_PROFILE(SMBwriteunlock);
CHECK_FSP(fsp,conn);
CHECK_WRITE(fsp);
@@ -2387,8 +2484,10 @@ int reply_writeunlock(connection_struct *conn, char *inbuf,char *outbuf, int siz
startpos = IVAL(inbuf,smb_vwv2);
data = smb_buf(inbuf) + 3;
- if (is_locked(fsp,conn,(SMB_BIG_UINT)numtowrite,(SMB_BIG_UINT)startpos, WRITE_LOCK))
+ if (is_locked(fsp,conn,(SMB_BIG_UINT)numtowrite,(SMB_BIG_UINT)startpos, WRITE_LOCK)) {
+ END_PROFILE(SMBwriteunlock);
return(ERROR(ERRDOS,ERRlock));
+ }
/* The special X/Open SMB protocol handling of
zero length writes is *NOT* done for
@@ -2401,11 +2500,15 @@ int reply_writeunlock(connection_struct *conn, char *inbuf,char *outbuf, int siz
if (lp_syncalways(SNUM(conn)))
sync_file(conn,fsp);
- if(((nwritten == 0) && (numtowrite != 0))||(nwritten < 0))
+ if(((nwritten == 0) && (numtowrite != 0))||(nwritten < 0)) {
+ END_PROFILE(SMBwriteunlock);
return(UNIXERROR(ERRDOS,ERRnoaccess));
+ }
- if(!do_unlock(fsp, conn, (SMB_BIG_UINT)numtowrite, (SMB_BIG_UINT)startpos, &eclass, &ecode))
+ if(!do_unlock(fsp, conn, (SMB_BIG_UINT)numtowrite, (SMB_BIG_UINT)startpos, &eclass, &ecode)) {
+ END_PROFILE(SMBwriteunlock);
return(ERROR(eclass,ecode));
+ }
outsize = set_message(outbuf,1,0,True);
@@ -2414,6 +2517,7 @@ int reply_writeunlock(connection_struct *conn, char *inbuf,char *outbuf, int siz
DEBUG( 3, ( "writeunlock fnum=%d num=%d wrote=%d\n",
fsp->fnum, (int)numtowrite, (int)nwritten ) );
+ END_PROFILE(SMBwriteunlock);
return(outsize);
}
@@ -2428,10 +2532,13 @@ int reply_write(connection_struct *conn, char *inbuf,char *outbuf,int size,int d
char *data;
files_struct *fsp = file_fsp(inbuf,smb_vwv0);
int outsize = 0;
+ START_PROFILE(SMBwrite);
/* If it's an IPC, pass off the pipe handler. */
- if (IS_IPC(conn))
+ if (IS_IPC(conn)) {
+ END_PROFILE(SMBwrite);
return reply_pipe_write(inbuf,outbuf,size,dum_buffsize);
+ }
CHECK_FSP(fsp,conn);
CHECK_WRITE(fsp);
@@ -2441,8 +2548,10 @@ int reply_write(connection_struct *conn, char *inbuf,char *outbuf,int size,int d
startpos = IVAL(inbuf,smb_vwv2);
data = smb_buf(inbuf) + 3;
- if (is_locked(fsp,conn,(SMB_BIG_UINT)numtowrite,(SMB_BIG_UINT)startpos, WRITE_LOCK))
+ if (is_locked(fsp,conn,(SMB_BIG_UINT)numtowrite,(SMB_BIG_UINT)startpos, WRITE_LOCK)) {
+ END_PROFILE(SMBwrite);
return(ERROR(ERRDOS,ERRlock));
+ }
/* X/Open SMB protocol says that if smb_vwv1 is
zero then the file size should be extended or
@@ -2456,8 +2565,10 @@ int reply_write(connection_struct *conn, char *inbuf,char *outbuf,int size,int d
if (lp_syncalways(SNUM(conn)))
sync_file(conn,fsp);
- if(((nwritten == 0) && (numtowrite != 0))||(nwritten < 0))
+ if(((nwritten == 0) && (numtowrite != 0))||(nwritten < 0)) {
+ END_PROFILE(SMBwrite);
return(UNIXERROR(ERRDOS,ERRnoaccess));
+ }
outsize = set_message(outbuf,1,0,True);
@@ -2471,6 +2582,7 @@ int reply_write(connection_struct *conn, char *inbuf,char *outbuf,int size,int d
DEBUG(3,("write fnum=%d num=%d wrote=%d\n",
fsp->fnum, (int)numtowrite, (int)nwritten));
+ END_PROFILE(SMBwrite);
return(outsize);
}
@@ -2487,17 +2599,22 @@ int reply_write_and_X(connection_struct *conn, char *inbuf,char *outbuf,int leng
ssize_t nwritten = -1;
unsigned int smb_doff = SVAL(inbuf,smb_vwv11);
char *data;
+ START_PROFILE(SMBwriteX);
/* If it's an IPC, pass off the pipe handler. */
- if (IS_IPC(conn))
+ if (IS_IPC(conn)) {
+ END_PROFILE(SMBwriteX);
return reply_pipe_write_and_X(inbuf,outbuf,length,bufsize);
+ }
CHECK_FSP(fsp,conn);
CHECK_WRITE(fsp);
CHECK_ERROR(fsp);
- if(smb_doff > smb_len(inbuf))
+ if(smb_doff > smb_len(inbuf)) {
+ END_PROFILE(SMBwriteX);
return(ERROR(ERRDOS,ERRbadmem));
+ }
data = smb_base(inbuf) + smb_doff;
@@ -2517,14 +2634,17 @@ int reply_write_and_X(connection_struct *conn, char *inbuf,char *outbuf,int leng
if(IVAL(inbuf,smb_vwv12) != 0) {
DEBUG(0,("reply_write_and_X - large offset (%x << 32) used and we don't support \
64 bit offsets.\n", (unsigned int)IVAL(inbuf,smb_vwv12) ));
+ END_PROFILE(SMBwriteX);
return(ERROR(ERRDOS,ERRbadaccess));
}
#endif /* LARGE_SMB_OFF_T */
}
- if (is_locked(fsp,conn,(SMB_BIG_UINT)numtowrite,(SMB_BIG_UINT)startpos, WRITE_LOCK))
+ if (is_locked(fsp,conn,(SMB_BIG_UINT)numtowrite,(SMB_BIG_UINT)startpos, WRITE_LOCK)) {
+ END_PROFILE(SMBwriteX);
return(ERROR(ERRDOS,ERRlock));
+ }
/* X/Open SMB protocol says that, unlike SMBwrite
if the length is zero then NO truncation is
@@ -2535,8 +2655,10 @@ int reply_write_and_X(connection_struct *conn, char *inbuf,char *outbuf,int leng
else
nwritten = write_file(fsp,data,startpos,numtowrite);
- if(((nwritten == 0) && (numtowrite != 0))||(nwritten < 0))
+ if(((nwritten == 0) && (numtowrite != 0))||(nwritten < 0)) {
+ END_PROFILE(SMBwriteX);
return(UNIXERROR(ERRDOS,ERRnoaccess));
+ }
set_message(outbuf,6,0,True);
@@ -2553,6 +2675,7 @@ int reply_write_and_X(connection_struct *conn, char *inbuf,char *outbuf,int leng
if (lp_syncalways(SNUM(conn)) || write_through)
sync_file(conn,fsp);
+ END_PROFILE(SMBwriteX);
return chain_reply(inbuf,outbuf,length,bufsize);
}
@@ -2568,6 +2691,7 @@ int reply_lseek(connection_struct *conn, char *inbuf,char *outbuf, int size, int
int mode,umode;
int outsize = 0;
files_struct *fsp = file_fsp(inbuf,smb_vwv0);
+ START_PROFILE(SMBlseek);
CHECK_FSP(fsp,conn);
CHECK_ERROR(fsp);
@@ -2585,7 +2709,7 @@ int reply_lseek(connection_struct *conn, char *inbuf,char *outbuf, int size, int
umode = SEEK_SET; break;
}
- if((res = conn->vfs_ops.lseek(fsp->fd,startpos,umode)) == -1) {
+ if((res = conn->vfs_ops.lseek(fsp,fsp->fd,startpos,umode)) == -1) {
/*
* Check for the special case where a seek before the start
* of the file sets the offset to zero. Added in the CIFS spec,
@@ -2597,8 +2721,10 @@ int reply_lseek(connection_struct *conn, char *inbuf,char *outbuf, int size, int
if(umode == SEEK_CUR) {
- if((current_pos = conn->vfs_ops.lseek(fsp->fd,0,SEEK_CUR)) == -1)
+ if((current_pos = conn->vfs_ops.lseek(fsp,fsp->fd,0,SEEK_CUR)) == -1) {
+ END_PROFILE(SMBlseek);
return(UNIXERROR(ERRDOS,ERRnoaccess));
+ }
current_pos += startpos;
@@ -2606,18 +2732,22 @@ int reply_lseek(connection_struct *conn, char *inbuf,char *outbuf, int size, int
SMB_STRUCT_STAT sbuf;
- if(conn->vfs_ops.fstat(fsp->fd, &sbuf) == -1)
+ if(vfs_fstat(fsp,fsp->fd, &sbuf) == -1) {
+ END_PROFILE(SMBlseek);
return(UNIXERROR(ERRDOS,ERRnoaccess));
+ }
current_pos += sbuf.st_size;
}
if(current_pos < 0)
- res = conn->vfs_ops.lseek(fsp->fd,0,SEEK_SET);
+ res = conn->vfs_ops.lseek(fsp,fsp->fd,0,SEEK_SET);
}
- if(res == -1)
+ if(res == -1) {
+ END_PROFILE(SMBlseek);
return(UNIXERROR(ERRDOS,ERRnoaccess));
+ }
}
fsp->pos = res;
@@ -2628,6 +2758,7 @@ int reply_lseek(connection_struct *conn, char *inbuf,char *outbuf, int size, int
DEBUG(3,("lseek fnum=%d ofs=%.0f newpos = %.0f mode=%d\n",
fsp->fnum, (double)startpos, (double)res, mode));
+ END_PROFILE(SMBlseek);
return(outsize);
}
@@ -2639,6 +2770,7 @@ int reply_flush(connection_struct *conn, char *inbuf,char *outbuf, int size, int
{
int outsize = set_message(outbuf,0,0,True);
files_struct *fsp = file_fsp(inbuf,smb_vwv0);
+ START_PROFILE(SMBflush);
if (fsp) {
CHECK_FSP(fsp,conn);
@@ -2652,6 +2784,7 @@ int reply_flush(connection_struct *conn, char *inbuf,char *outbuf, int size, int
}
DEBUG(3,("flush\n"));
+ END_PROFILE(SMBflush);
return(outsize);
}
@@ -2662,9 +2795,13 @@ int reply_flush(connection_struct *conn, char *inbuf,char *outbuf, int size, int
int reply_exit(connection_struct *conn,
char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
{
- int outsize = set_message(outbuf,0,0,True);
+ int outsize;
+ START_PROFILE(SMBexit);
+ outsize = set_message(outbuf,0,0,True);
+
DEBUG(3,("exit\n"));
+ END_PROFILE(SMBexit);
return(outsize);
}
@@ -2679,12 +2816,15 @@ int reply_close(connection_struct *conn, char *inbuf,char *outbuf, int size,
time_t mtime;
int32 eclass = 0, err = 0;
files_struct *fsp = NULL;
+ START_PROFILE(SMBclose);
outsize = set_message(outbuf,0,0,True);
/* If it's an IPC, pass off to the pipe handler. */
- if (IS_IPC(conn))
+ if (IS_IPC(conn)) {
+ END_PROFILE(SMBclose);
return reply_pipe_close(conn, inbuf,outbuf);
+ }
fsp = file_fsp(inbuf,smb_vwv0);
@@ -2692,8 +2832,10 @@ int reply_close(connection_struct *conn, char *inbuf,char *outbuf, int size,
* We can only use CHECK_FSP if we know it's not a directory.
*/
- if(!fsp || (fsp->conn != conn))
+ if(!fsp || (fsp->conn != conn)) {
+ END_PROFILE(SMBclose);
return(ERROR(ERRDOS,ERRbadfid));
+ }
if(HAS_CACHED_ERROR(fsp)) {
eclass = fsp->wbmpx_ptr->wr_errclass;
@@ -2740,14 +2882,18 @@ int reply_close(connection_struct *conn, char *inbuf,char *outbuf, int size,
if((close_err = close_file(fsp,True)) != 0) {
errno = close_err;
+ END_PROFILE(SMBclose);
return (UNIXERROR(ERRHRD,ERRgeneral));
}
}
/* We have a cached error */
- if(eclass || err)
+ if(eclass || err) {
+ END_PROFILE(SMBclose);
return(ERROR(eclass,err));
+ }
+ END_PROFILE(SMBclose);
return(outsize);
}
@@ -2767,6 +2913,7 @@ int reply_writeclose(connection_struct *conn,
char *data;
time_t mtime;
files_struct *fsp = file_fsp(inbuf,smb_vwv0);
+ START_PROFILE(SMBwriteclose);
CHECK_FSP(fsp,conn);
CHECK_WRITE(fsp);
@@ -2777,9 +2924,11 @@ int reply_writeclose(connection_struct *conn,
mtime = make_unix_date3(inbuf+smb_vwv4);
data = smb_buf(inbuf) + 1;
- if (is_locked(fsp,conn,(SMB_BIG_UINT)numtowrite,(SMB_BIG_UINT)startpos, WRITE_LOCK))
+ if (is_locked(fsp,conn,(SMB_BIG_UINT)numtowrite,(SMB_BIG_UINT)startpos, WRITE_LOCK)) {
+ END_PROFILE(SMBwriteclose);
return(ERROR(ERRDOS,ERRlock));
-
+ }
+
nwritten = write_file(fsp,data,startpos,numtowrite);
set_filetime(conn, fsp->fsp_name,mtime);
@@ -2790,17 +2939,21 @@ int reply_writeclose(connection_struct *conn,
fsp->fnum, (int)numtowrite, (int)nwritten,
conn->num_files_open));
- if (nwritten <= 0)
+ if (nwritten <= 0) {
+ END_PROFILE(SMBwriteclose);
return(UNIXERROR(ERRDOS,ERRnoaccess));
+ }
if(close_err != 0) {
errno = close_err;
+ END_PROFILE(SMBwriteclose);
return(UNIXERROR(ERRHRD,ERRgeneral));
}
outsize = set_message(outbuf,1,0,True);
SSVAL(outbuf,smb_vwv0,nwritten);
+ END_PROFILE(SMBwriteclose);
return(outsize);
}
@@ -2816,6 +2969,7 @@ int reply_lock(connection_struct *conn,
int eclass;
uint32 ecode;
files_struct *fsp = file_fsp(inbuf,smb_vwv0);
+ START_PROFILE(SMBlock);
CHECK_FSP(fsp,conn);
CHECK_ERROR(fsp);
@@ -2827,18 +2981,22 @@ int reply_lock(connection_struct *conn,
fsp->fd, fsp->fnum, (double)offset, (double)count));
if (!do_lock(fsp, conn, count, offset, WRITE_LOCK, &eclass, &ecode)) {
- if((ecode == ERRlock) && lp_blocking_locks(SNUM(conn))) {
- /*
- * A blocking lock was requested. Package up
- * this smb into a queued request and push it
- * onto the blocking lock queue.
- */
- if(push_blocking_lock_request(inbuf, length, -1, 0))
- return -1;
- }
- return (ERROR(eclass,ecode));
- }
+ if((ecode == ERRlock) && lp_blocking_locks(SNUM(conn))) {
+ /*
+ * A blocking lock was requested. Package up
+ * this smb into a queued request and push it
+ * onto the blocking lock queue.
+ */
+ if(push_blocking_lock_request(inbuf, length, -1, 0)) {
+ END_PROFILE(SMBlock);
+ return -1;
+ }
+ }
+ END_PROFILE(SMBlock);
+ return (ERROR(eclass,ecode));
+ }
+ END_PROFILE(SMBlock);
return(outsize);
}
@@ -2853,6 +3011,7 @@ int reply_unlock(connection_struct *conn, char *inbuf,char *outbuf, int size, in
int eclass;
uint32 ecode;
files_struct *fsp = file_fsp(inbuf,smb_vwv0);
+ START_PROFILE(SMBunlock);
CHECK_FSP(fsp,conn);
CHECK_ERROR(fsp);
@@ -2860,12 +3019,15 @@ int reply_unlock(connection_struct *conn, char *inbuf,char *outbuf, int size, in
count = (SMB_BIG_UINT)IVAL(inbuf,smb_vwv1);
offset = (SMB_BIG_UINT)IVAL(inbuf,smb_vwv3);
- if(!do_unlock(fsp, conn, count, offset, &eclass, &ecode))
+ if(!do_unlock(fsp, conn, count, offset, &eclass, &ecode)) {
+ END_PROFILE(SMBunlock);
return (ERROR(eclass,ecode));
+ }
DEBUG( 3, ( "unlock fd=%d fnum=%d offset=%.0f count=%.0f\n",
fsp->fd, fsp->fnum, (double)offset, (double)count ) );
+ END_PROFILE(SMBunlock);
return(outsize);
}
@@ -2878,11 +3040,13 @@ int reply_tdis(connection_struct *conn,
{
int outsize = set_message(outbuf,0,0,True);
uint16 vuid;
+ START_PROFILE(SMBtdis);
vuid = SVAL(inbuf,smb_uid);
if (!conn) {
DEBUG(4,("Invalid connection in tdis\n"));
+ END_PROFILE(SMBtdis);
return(ERROR(ERRSRV,ERRinvnid));
}
@@ -2890,6 +3054,7 @@ int reply_tdis(connection_struct *conn,
close_cnum(conn,vuid);
+ END_PROFILE(SMBtdis);
return outsize;
}
@@ -2905,6 +3070,7 @@ int reply_echo(connection_struct *conn,
int seq_num;
unsigned int data_len = smb_buflen(inbuf);
int outsize = set_message(outbuf,1,data_len,True);
+ START_PROFILE(SMBecho);
data_len = MIN(data_len, (sizeof(inbuf)-(smb_buf(inbuf)-inbuf)));
@@ -2929,6 +3095,7 @@ int reply_echo(connection_struct *conn,
smb_echo_count++;
+ END_PROFILE(SMBecho);
return -1;
}
@@ -2941,14 +3108,18 @@ int reply_printopen(connection_struct *conn,
{
int outsize = 0;
files_struct *fsp;
+ START_PROFILE(SMBsplopen);
- if (!CAN_PRINT(conn))
+ if (!CAN_PRINT(conn)) {
+ END_PROFILE(SMBsplopen);
return(ERROR(ERRDOS,ERRnoaccess));
+ }
/* Open for exclusive use, write only. */
fsp = print_fsp_open(conn,"dos.prn");
if (!fsp) {
+ END_PROFILE(SMBsplopen);
return(UNIXERROR(ERRDOS,ERRnoaccess));
}
@@ -2958,6 +3129,7 @@ int reply_printopen(connection_struct *conn,
DEBUG(3,("openprint fd=%d fnum=%d\n",
fsp->fd, fsp->fnum));
+ END_PROFILE(SMBsplopen);
return(outsize);
}
@@ -2971,12 +3143,15 @@ int reply_printclose(connection_struct *conn,
int outsize = set_message(outbuf,0,0,True);
files_struct *fsp = file_fsp(inbuf,smb_vwv0);
int close_err = 0;
+ START_PROFILE(SMBsplclose);
CHECK_FSP(fsp,conn);
CHECK_ERROR(fsp);
- if (!CAN_PRINT(conn))
+ if (!CAN_PRINT(conn)) {
+ END_PROFILE(SMBsplclose);
return(ERROR(ERRDOS,ERRnoaccess));
+ }
DEBUG(3,("printclose fd=%d fnum=%d\n",
fsp->fd,fsp->fnum));
@@ -2985,9 +3160,11 @@ int reply_printclose(connection_struct *conn,
if(close_err != 0) {
errno = close_err;
+ END_PROFILE(SMBsplclose);
return(UNIXERROR(ERRHRD,ERRgeneral));
}
+ END_PROFILE(SMBsplclose);
return(outsize);
}
@@ -3001,13 +3178,16 @@ int reply_printqueue(connection_struct *conn,
int outsize = set_message(outbuf,2,3,True);
int max_count = SVAL(inbuf,smb_vwv0);
int start_index = SVAL(inbuf,smb_vwv1);
+ START_PROFILE(SMBsplretq);
/* we used to allow the client to get the cnum wrong, but that
is really quite gross and only worked when there was only
one printer - I think we should now only accept it if they
get it right (tridge) */
- if (!CAN_PRINT(conn))
+ if (!CAN_PRINT(conn)) {
+ END_PROFILE(SMBsplretq);
return(ERROR(ERRDOS,ERRnoaccess));
+ }
SSVAL(outbuf,smb_vwv0,0);
SSVAL(outbuf,smb_vwv1,0);
@@ -3054,6 +3234,7 @@ int reply_printqueue(connection_struct *conn,
DEBUG(3,("%d entries returned in queue\n",count));
}
+ END_PROFILE(SMBsplretq);
return(outsize);
}
@@ -3067,9 +3248,12 @@ int reply_printwrite(connection_struct *conn, char *inbuf,char *outbuf, int dum_
int outsize = set_message(outbuf,0,0,True);
char *data;
files_struct *fsp = file_fsp(inbuf,smb_vwv0);
+ START_PROFILE(SMBsplwr);
- if (!CAN_PRINT(conn))
+ if (!CAN_PRINT(conn)) {
+ END_PROFILE(SMBsplwr);
return(ERROR(ERRDOS,ERRnoaccess));
+ }
CHECK_FSP(fsp,conn);
CHECK_WRITE(fsp);
@@ -3078,11 +3262,14 @@ int reply_printwrite(connection_struct *conn, char *inbuf,char *outbuf, int dum_
numtowrite = SVAL(smb_buf(inbuf),1);
data = smb_buf(inbuf) + 3;
- if (write_file(fsp,data,-1,numtowrite) != numtowrite)
+ if (write_file(fsp,data,-1,numtowrite) != numtowrite) {
+ END_PROFILE(SMBsplwr);
return(UNIXERROR(ERRDOS,ERRnoaccess));
-
+ }
+
DEBUG( 3, ( "printwrite fnum=%d num=%d\n", fsp->fnum, numtowrite ) );
+ END_PROFILE(SMBsplwr);
return(outsize);
}
@@ -3121,6 +3308,7 @@ int reply_mkdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
{
pstring directory;
int outsize;
+ START_PROFILE(SMBmkdir);
pstrcpy(directory,smb_buf(inbuf) + 1);
@@ -3130,6 +3318,7 @@ int reply_mkdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
DEBUG( 3, ( "mkdir %s ret=%d\n", directory, outsize ) );
+ END_PROFILE(SMBmkdir);
return(outsize);
}
@@ -3166,7 +3355,7 @@ static BOOL recursive_rmdir(connection_struct *conn, char *directory)
pstrcat(fullname, "/");
pstrcat(fullname, dname);
- if(conn->vfs_ops.lstat(dos_to_unix(fullname,False), &st) != 0)
+ if(conn->vfs_ops.lstat(conn,dos_to_unix(fullname,False), &st) != 0)
{
ret = True;
break;
@@ -3179,13 +3368,13 @@ static BOOL recursive_rmdir(connection_struct *conn, char *directory)
ret = True;
break;
}
- if(conn->vfs_ops.rmdir(dos_to_unix(fullname,False)) != 0)
+ if(vfs_rmdir(conn,fullname) != 0)
{
ret = True;
break;
}
}
- else if(conn->vfs_ops.unlink(dos_to_unix(fullname,False)) != 0)
+ else if(vfs_unlink(conn,fullname) != 0)
{
ret = True;
break;
@@ -3203,7 +3392,7 @@ BOOL rmdir_internals(connection_struct *conn, char *directory)
{
BOOL ok;
- ok = (conn->vfs_ops.rmdir(dos_to_unix(directory, False)) == 0);
+ ok = (vfs_rmdir(conn,directory) == 0);
if(!ok && ((errno == ENOTEMPTY)||(errno == EEXIST)) && lp_veto_files(SNUM(conn)))
{
/*
@@ -3250,7 +3439,7 @@ BOOL rmdir_internals(connection_struct *conn, char *directory)
pstrcat(fullname, "/");
pstrcat(fullname, dname);
- if(conn->vfs_ops.lstat(dos_to_unix(fullname, False), &st) != 0)
+ if(conn->vfs_ops.lstat(conn,dos_to_unix(fullname, False), &st) != 0)
break;
if(st.st_mode & S_IFDIR)
{
@@ -3259,15 +3448,15 @@ BOOL rmdir_internals(connection_struct *conn, char *directory)
if(recursive_rmdir(conn, fullname) != 0)
break;
}
- if(conn->vfs_ops.rmdir(dos_to_unix(fullname, False)) != 0)
+ if(vfs_rmdir(conn,fullname) != 0)
break;
}
- else if(conn->vfs_ops.unlink(dos_to_unix(fullname, False)) != 0)
+ else if(vfs_unlink(conn,fullname) != 0)
break;
}
CloseDir(dirptr);
/* Retry the rmdir */
- ok = (conn->vfs_ops.rmdir(dos_to_unix(directory, False)) == 0);
+ ok = (vfs_rmdir(conn,directory) == 0);
}
else
CloseDir(dirptr);
@@ -3293,6 +3482,7 @@ int reply_rmdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
int outsize = 0;
BOOL ok = False;
BOOL bad_path = False;
+ START_PROFILE(SMBrmdir);
pstrcpy(directory,smb_buf(inbuf) + 1);
@@ -3313,6 +3503,7 @@ int reply_rmdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
unix_ERR_class = ERRDOS;
unix_ERR_code = ERRbadpath;
}
+ END_PROFILE(SMBrmdir);
return(UNIXERROR(ERRDOS,ERRbadpath));
}
@@ -3320,6 +3511,7 @@ int reply_rmdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
DEBUG( 3, ( "rmdir %s\n", directory ) );
+ END_PROFILE(SMBrmdir);
return(outsize);
}
@@ -3397,7 +3589,7 @@ static BOOL can_rename(char *fname,connection_struct *conn)
if (!CAN_WRITE(conn)) return(False);
- if (conn->vfs_ops.lstat(dos_to_unix(fname,False),&sbuf) != 0) return(False);
+ if (conn->vfs_ops.lstat(conn,dos_to_unix(fname,False),&sbuf) != 0) return(False);
if (!check_file_sharing(conn,fname,True)) return(False);
return(True);
@@ -3529,14 +3721,14 @@ int rename_internals(connection_struct *conn,
*/
if(resolve_wildcards(directory,newname) &&
can_rename(directory,conn) &&
- !conn->vfs_ops.rename(zdirectory,
+ !conn->vfs_ops.rename(conn,zdirectory,
dos_to_unix(newname,False)))
count++;
} else {
if (resolve_wildcards(directory,newname) &&
can_rename(directory,conn) &&
!vfs_file_exist(conn,newname,NULL) &&
- !conn->vfs_ops.rename(zdirectory,
+ !conn->vfs_ops.rename(conn,zdirectory,
dos_to_unix(newname,False)))
count++;
}
@@ -3595,7 +3787,7 @@ int rename_internals(connection_struct *conn,
continue;
}
- if (!conn->vfs_ops.rename(dos_to_unix(fname,False),
+ if (!conn->vfs_ops.rename(conn,dos_to_unix(fname,False),
dos_to_unix(destname,False)))
count++;
DEBUG(3,("rename_internals: doing rename on %s -> %s\n",fname,destname));
@@ -3628,6 +3820,7 @@ int reply_mv(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, in
int outsize = 0;
pstring name;
pstring newname;
+ START_PROFILE(SMBmv);
pstrcpy(name,smb_buf(inbuf) + 1);
pstrcpy(newname,smb_buf(inbuf) + 3 + strlen(name));
@@ -3650,6 +3843,7 @@ int reply_mv(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, in
outsize = set_message(outbuf,0,0,True);
}
+ END_PROFILE(SMBmv);
return(outsize);
}
@@ -3701,7 +3895,7 @@ static BOOL copy_file(char *src,char *dest1,connection_struct *conn, int ofun,
}
if ((ofun&3) == 1) {
- if(conn->vfs_ops.lseek(fsp2->fd,0,SEEK_END) == -1) {
+ if(conn->vfs_ops.lseek(fsp2,fsp2->fd,0,SEEK_END) == -1) {
DEBUG(0,("copy_file: error - sys_lseek returned error %s\n",
strerror(errno) ));
/*
@@ -3751,6 +3945,7 @@ int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
BOOL bad_path1 = False;
BOOL bad_path2 = False;
BOOL rc = True;
+ START_PROFILE(SMBcopy);
*directory = *mask = 0;
@@ -3762,6 +3957,7 @@ int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
if (tid2 != conn->cnum) {
/* can't currently handle inter share copies XXXX */
DEBUG(3,("Rejecting inter-share copy\n"));
+ END_PROFILE(SMBcopy);
return(ERROR(ERRSRV,ERRinvdevice));
}
@@ -3774,16 +3970,19 @@ int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
target_is_directory = vfs_directory_exist(conn,False,NULL);
if ((flags&1) && target_is_directory) {
+ END_PROFILE(SMBcopy);
return(ERROR(ERRDOS,ERRbadfile));
}
if ((flags&2) && !target_is_directory) {
+ END_PROFILE(SMBcopy);
return(ERROR(ERRDOS,ERRbadpath));
}
if ((flags&(1<<5)) && vfs_directory_exist(conn,name,NULL)) {
/* wants a tree copy! XXXX */
DEBUG(3,("Rejecting tree copy\n"));
+ END_PROFILE(SMBcopy);
return(ERROR(ERRSRV,ERRerror));
}
@@ -3819,6 +4018,7 @@ int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
count,target_is_directory,&err)) count++;
if(!count && err) {
errno = err;
+ END_PROFILE(SMBcopy);
return(UNIXERROR(ERRHRD,ERRgeneral));
}
if (!count) exists = vfs_file_exist(conn,directory,NULL);
@@ -3859,18 +4059,21 @@ int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
if(err) {
/* Error on close... */
errno = err;
+ END_PROFILE(SMBcopy);
return(UNIXERROR(ERRHRD,ERRgeneral));
}
- if (exists)
+ if (exists) {
+ END_PROFILE(SMBcopy);
return(ERROR(ERRDOS,error));
- else
+ } else
{
if((errno == ENOENT) && (bad_path1 || bad_path2))
{
unix_ERR_class = ERRDOS;
unix_ERR_code = ERRbadpath;
}
+ END_PROFILE(SMBcopy);
return(UNIXERROR(ERRDOS,error));
}
}
@@ -3878,6 +4081,7 @@ int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
outsize = set_message(outbuf,1,0,True);
SSVAL(outbuf,smb_vwv0,count);
+ END_PROFILE(SMBcopy);
return(outsize);
}
@@ -3890,10 +4094,13 @@ int reply_setdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
int outsize = 0;
BOOL ok = False;
pstring newdir;
+ START_PROFILE(pathworks_setdir);
snum = SNUM(conn);
- if (!CAN_SETDIR(snum))
+ if (!CAN_SETDIR(snum)) {
+ END_PROFILE(pathworks_setdir);
return(ERROR(ERRDOS,ERRnoaccess));
+ }
pstrcpy(newdir,smb_buf(inbuf) + 1);
strlower(newdir);
@@ -3907,14 +4114,17 @@ int reply_setdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
}
}
- if (!ok)
+ if (!ok) {
+ END_PROFILE(pathworks_setdir);
return(ERROR(ERRDOS,ERRbadpath));
+ }
outsize = set_message(outbuf,0,0,True);
CVAL(outbuf,smb_reh) = CVAL(inbuf,smb_reh);
DEBUG(3,("setdir %s\n", newdir));
+ END_PROFILE(pathworks_setdir);
return(outsize);
}
@@ -4026,6 +4236,7 @@ int reply_lockingX(connection_struct *conn, char *inbuf,char *outbuf,int length,
int eclass=0, dummy1;
BOOL large_file_format = (locktype & LOCKING_ANDX_LARGE_FILES)?True:False;
BOOL err;
+ START_PROFILE(SMBlockingX);
CHECK_FSP(fsp,conn);
CHECK_ERROR(fsp);
@@ -4050,10 +4261,13 @@ int reply_lockingX(connection_struct *conn, char *inbuf,char *outbuf,int length,
no oplock granted on this file (%s).\n", fsp->fnum, fsp->fsp_name));
/* if this is a pure oplock break request then don't send a reply */
- if (num_locks == 0 && num_ulocks == 0)
+ if (num_locks == 0 && num_ulocks == 0) {
+ END_PROFILE(SMBlockingX);
return -1;
- else
+ } else {
+ END_PROFILE(SMBlockingX);
return ERROR(ERRDOS,ERRlock);
+ }
}
if (remove_oplock(fsp) == False) {
@@ -4069,6 +4283,7 @@ no oplock granted on this file (%s).\n", fsp->fnum, fsp->fsp_name));
if(CVAL(inbuf,smb_vwv0) != 0xff)
DEBUG(0,("reply_lockingX: Error : pure oplock break is a chained %d request !\n",
(unsigned int)CVAL(inbuf,smb_vwv0) ));
+ END_PROFILE(SMBlockingX);
return -1;
}
}
@@ -4082,14 +4297,18 @@ no oplock granted on this file (%s).\n", fsp->fnum, fsp->fsp_name));
/*
* There is no error code marked "stupid client bug".... :-).
*/
- if(err)
+ if(err) {
+ END_PROFILE(SMBlockingX);
return ERROR(ERRDOS,ERRnoaccess);
+ }
DEBUG(10,("reply_lockingX: unlock start=%.0f, len=%.0f for file %s\n",
(double)offset, (double)count, fsp->fsp_name ));
- if(!do_unlock(fsp,conn,count,offset, &eclass, &ecode))
+ if(!do_unlock(fsp,conn,count,offset, &eclass, &ecode)) {
+ END_PROFILE(SMBlockingX);
return ERROR(eclass,ecode);
+ }
}
/* Setup the timeout in seconds. */
@@ -4108,8 +4327,10 @@ no oplock granted on this file (%s).\n", fsp->fnum, fsp->fsp_name));
/*
* There is no error code marked "stupid client bug".... :-).
*/
- if(err)
+ if(err) {
+ END_PROFILE(SMBlockingX);
return ERROR(ERRDOS,ERRnoaccess);
+ }
DEBUG(10,("reply_lockingX: lock start=%.0f, len=%.0f for file %s\n",
(double)offset, (double)count, fsp->fsp_name ));
@@ -4122,8 +4343,10 @@ no oplock granted on this file (%s).\n", fsp->fnum, fsp->fsp_name));
* this smb into a queued request and push it
* onto the blocking lock queue.
*/
- if(push_blocking_lock_request(inbuf, length, lock_timeout, i))
+ if(push_blocking_lock_request(inbuf, length, lock_timeout, i)) {
+ END_PROFILE(SMBlockingX);
return -1;
+ }
}
break;
}
@@ -4144,11 +4367,14 @@ no oplock granted on this file (%s).\n", fsp->fnum, fsp->fsp_name));
/*
* There is no error code marked "stupid client bug".... :-).
*/
- if(err)
+ if(err) {
+ END_PROFILE(SMBlockingX);
return ERROR(ERRDOS,ERRnoaccess);
+ }
do_unlock(fsp,conn,count,offset,&dummy1,&dummy2);
}
+ END_PROFILE(SMBlockingX);
return ERROR(eclass,ecode);
}
@@ -4157,6 +4383,7 @@ no oplock granted on this file (%s).\n", fsp->fnum, fsp->fsp_name));
DEBUG( 3, ( "lockingX fnum=%d type=%d num_locks=%d num_ulocks=%d\n",
fsp->fnum, (unsigned int)locktype, num_locks, num_ulocks ) );
+ END_PROFILE(SMBlockingX);
return chain_reply(inbuf,outbuf,length,bufsize);
}
@@ -4176,10 +4403,13 @@ int reply_readbmpx(connection_struct *conn, char *inbuf,char *outbuf,int length,
size_t tcount;
int pad;
files_struct *fsp = file_fsp(inbuf,smb_vwv0);
+ START_PROFILE(SMBreadBmpx);
/* this function doesn't seem to work - disable by default */
- if (!lp_readbmpx())
+ if (!lp_readbmpx()) {
+ END_PROFILE(SMBreadBmpx);
return(ERROR(ERRSRV,ERRuseSTD));
+ }
outsize = set_message(outbuf,8,0,True);
@@ -4199,9 +4429,11 @@ int reply_readbmpx(connection_struct *conn, char *inbuf,char *outbuf,int length,
tcount = maxcount;
total_read = 0;
- if (is_locked(fsp,conn,(SMB_BIG_UINT)maxcount,(SMB_BIG_UINT)startpos, READ_LOCK))
+ if (is_locked(fsp,conn,(SMB_BIG_UINT)maxcount,(SMB_BIG_UINT)startpos, READ_LOCK)) {
+ END_PROFILE(SMBreadBmpx);
return(ERROR(ERRDOS,ERRlock));
-
+ }
+
do
{
size_t N = MIN(max_per_packet,tcount-total_read);
@@ -4226,6 +4458,7 @@ int reply_readbmpx(connection_struct *conn, char *inbuf,char *outbuf,int length,
}
while (total_read < (ssize_t)tcount);
+ END_PROFILE(SMBreadBmpx);
return(-1);
}
@@ -4244,6 +4477,7 @@ int reply_writebmpx(connection_struct *conn, char *inbuf,char *outbuf, int size,
int smb_doff;
char *data;
files_struct *fsp = file_fsp(inbuf,smb_vwv0);
+ START_PROFILE(SMBwriteBmpx);
CHECK_FSP(fsp,conn);
CHECK_WRITE(fsp);
@@ -4261,16 +4495,20 @@ int reply_writebmpx(connection_struct *conn, char *inbuf,char *outbuf, int size,
not an SMBwritebmpx - set this up now so we don't forget */
CVAL(outbuf,smb_com) = SMBwritec;
- if (is_locked(fsp,conn,(SMB_BIG_UINT)tcount,(SMB_BIG_UINT)startpos,WRITE_LOCK))
+ if (is_locked(fsp,conn,(SMB_BIG_UINT)tcount,(SMB_BIG_UINT)startpos,WRITE_LOCK)) {
+ END_PROFILE(SMBwriteBmpx);
return(ERROR(ERRDOS,ERRlock));
+ }
nwritten = write_file(fsp,data,startpos,numtowrite);
if(lp_syncalways(SNUM(conn)) || write_through)
sync_file(conn,fsp);
- if(nwritten < (ssize_t)numtowrite)
+ if(nwritten < (ssize_t)numtowrite) {
+ END_PROFILE(SMBwriteBmpx);
return(UNIXERROR(ERRHRD,ERRdiskfull));
+ }
/* If the maximum to be written to this file
is greater than what we just wrote then set
@@ -4286,6 +4524,7 @@ int reply_writebmpx(connection_struct *conn, char *inbuf,char *outbuf, int size,
if(!wbms)
{
DEBUG(0,("Out of memory in reply_readmpx\n"));
+ END_PROFILE(SMBwriteBmpx);
return(ERROR(ERRSRV,ERRnoresource));
}
wbms->wr_mode = write_through;
@@ -4318,6 +4557,7 @@ int reply_writebmpx(connection_struct *conn, char *inbuf,char *outbuf, int size,
SSVAL(outbuf,smb_vwv0,nwritten);
}
+ END_PROFILE(SMBwriteBmpx);
return(outsize);
}
@@ -4338,6 +4578,7 @@ int reply_writebs(connection_struct *conn, char *inbuf,char *outbuf, int dum_siz
write_bmpx_struct *wbms;
BOOL send_response = False;
files_struct *fsp = file_fsp(inbuf,smb_vwv0);
+ START_PROFILE(SMBwriteBs);
CHECK_FSP(fsp,conn);
CHECK_WRITE(fsp);
@@ -4355,15 +4596,20 @@ int reply_writebs(connection_struct *conn, char *inbuf,char *outbuf, int dum_siz
/* This fd should have an auxiliary struct attached,
check that it does */
wbms = fsp->wbmpx_ptr;
- if(!wbms) return(-1);
+ if(!wbms) {
+ END_PROFILE(SMBwriteBs);
+ return(-1);
+ }
/* If write through is set we can return errors, else we must
cache them */
write_through = wbms->wr_mode;
/* Check for an earlier error */
- if(wbms->wr_discard)
+ if(wbms->wr_discard) {
+ END_PROFILE(SMBwriteBs);
return -1; /* Just discard the packet */
+ }
nwritten = write_file(fsp,data,startpos,numtowrite);
@@ -4377,8 +4623,10 @@ int reply_writebs(connection_struct *conn, char *inbuf,char *outbuf, int dum_siz
/* We are returning an error - we can delete the aux struct */
if (wbms) free((char *)wbms);
fsp->wbmpx_ptr = NULL;
+ END_PROFILE(SMBwriteBs);
return(ERROR(ERRHRD,ERRdiskfull));
}
+ END_PROFILE(SMBwriteBs);
return(CACHE_ERROR(wbms,ERRHRD,ERRdiskfull));
}
@@ -4398,9 +4646,12 @@ int reply_writebs(connection_struct *conn, char *inbuf,char *outbuf, int dum_siz
fsp->wbmpx_ptr = NULL;
}
- if(send_response)
+ if(send_response) {
+ END_PROFILE(SMBwriteBs);
return(outsize);
+ }
+ END_PROFILE(SMBwriteBs);
return(-1);
}
@@ -4414,6 +4665,7 @@ int reply_setattrE(connection_struct *conn, char *inbuf,char *outbuf, int size,
struct utimbuf unix_times;
int outsize = 0;
files_struct *fsp = file_fsp(inbuf,smb_vwv0);
+ START_PROFILE(SMBsetattrE);
outsize = set_message(outbuf,0,0,True);
@@ -4439,6 +4691,7 @@ int reply_setattrE(connection_struct *conn, char *inbuf,char *outbuf, int size,
dbgtext( "reply_setattrE fnum=%d ", fsp->fnum);
dbgtext( "ignoring zero request - not setting timestamps of 0\n" );
}
+ END_PROFILE(SMBsetattrE);
return(outsize);
}
else if ((unix_times.actime != 0) && (unix_times.modtime == 0))
@@ -4448,12 +4701,15 @@ int reply_setattrE(connection_struct *conn, char *inbuf,char *outbuf, int size,
}
/* Set the date on this file */
- if(file_utime(conn, fsp->fsp_name, &unix_times))
+ if(file_utime(conn, fsp->fsp_name, &unix_times)) {
+ END_PROFILE(SMBsetattrE);
return(ERROR(ERRDOS,ERRnoaccess));
+ }
DEBUG( 3, ( "reply_setattrE fnum=%d actime=%d modtime=%d\n",
fsp->fnum, (int)unix_times.actime, (int)unix_times.modtime ) );
+ END_PROFILE(SMBsetattrE);
return(outsize);
}
@@ -4468,6 +4724,7 @@ int reply_getattrE(connection_struct *conn, char *inbuf,char *outbuf, int size,
int outsize = 0;
int mode;
files_struct *fsp = file_fsp(inbuf,smb_vwv0);
+ START_PROFILE(SMBgetattrE);
outsize = set_message(outbuf,11,0,True);
@@ -4475,8 +4732,10 @@ int reply_getattrE(connection_struct *conn, char *inbuf,char *outbuf, int size,
CHECK_ERROR(fsp);
/* Do an fstat on this file */
- if(fsp->conn->vfs_ops.fstat(fsp->fd, &sbuf))
+ if(vfs_fstat(fsp,fsp->fd, &sbuf)) {
+ END_PROFILE(SMBgetattrE);
return(UNIXERROR(ERRDOS,ERRnoaccess));
+ }
mode = dos_mode(conn,fsp->fsp_name,&sbuf);
@@ -4500,6 +4759,7 @@ int reply_getattrE(connection_struct *conn, char *inbuf,char *outbuf, int size,
DEBUG( 3, ( "reply_getattrE fnum=%d\n", fsp->fnum));
+ END_PROFILE(SMBgetattrE);
return(outsize);
}
#undef OLD_NTDOMAIN