/*The following definitions come from rpc_server/srv_pipe_hnd.c */
void reset_chain_p(void);
-void set_chain_p(pipes_struct *new_p);
void init_rpc_pipe_hnd(void);
pipes_struct *open_rpc_pipe_p(char *pipe_name,
- connection_struct *conn, uint16 vuid);
+ connection_struct *conn, uint16 vuid);
int read_pipe(pipes_struct *p, char *data, uint32 pos, int n);
char *get_rpc_pipe_hnd_name(pipes_struct *p);
BOOL set_rpc_pipe_hnd_state(pipes_struct *p, uint16 device_state);
file_fd_struct *fd_get_new(void);
void file_close_conn(connection_struct *conn);
void file_init(void);
-files_struct *file_fsp(int fnum);
void file_close_user(int vuid);
files_struct *file_find_dit(int dev, int inode, struct timeval *tval);
files_struct *file_find_print(void);
void file_sync_all(connection_struct *conn);
void file_free(files_struct *fsp);
+files_struct *file_fsp(char *buf, int where);
+void file_chain_reset(void);
/*The following definitions come from smbd/groupname.c */
char *fsp_name;
} files_struct;
-/* this macro should always be used to extract an fnum (smb_fid) from
- a packet to ensure chaining works correctly */
-#define GETFSP(buf,where) (chain_fsp?chain_fsp:file_fsp(SVAL(buf,where)))
-
-
/* Domain controller authentication protocol info */
struct dcinfo
{
int num_good_sends = 0;
int num_good_receives = 0;
-extern pstring scope;
-extern struct in_addr ipzero;
static struct opcode_names {
char *nmb_opcode_name;
BOOL push_blocking_lock_request( char *inbuf, int length, int lock_timeout, int lock_num)
{
blocking_lock_record *blr;
- files_struct *fsp = GETFSP(inbuf,smb_vwv2);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv2);
/*
* Now queue an entry on the blocking lock queue. We setup
static void blocking_lock_reply_success(blocking_lock_record *blr)
{
extern int chain_size;
- extern files_struct *chain_fsp;
extern char *OutBuffer;
char *outbuf = OutBuffer;
int bufsize = BUFFER_SIZE;
char *inbuf = blr->inbuf;
- files_struct *fsp = GETFSP(inbuf,smb_vwv2);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv2);
int outsize = 0;
construct_reply_common(inbuf, outbuf);
* that here and must set up the chain info manually.
*/
- chain_fsp = fsp;
+ file_set_chain(fsp);
chain_size = 0;
outsize = chain_reply(inbuf,outbuf,blr->length,bufsize);
char *outbuf = OutBuffer;
int bufsize = BUFFER_SIZE;
char *inbuf = blr->inbuf;
- files_struct *fsp = GETFSP(inbuf,smb_vwv2);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv2);
uint16 num_ulocks = SVAL(inbuf,smb_vwv6);
uint16 num_locks = SVAL(inbuf,smb_vwv7);
uint32 count, offset;
{
char *inbuf = blr->inbuf;
unsigned char locktype = CVAL(inbuf,smb_vwv3);
- files_struct *fsp = GETFSP(inbuf,smb_vwv2);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv2);
uint16 num_ulocks = SVAL(inbuf,smb_vwv6);
uint16 num_locks = SVAL(inbuf,smb_vwv7);
uint32 count, offset;
*/
while(blr != NULL) {
- files_struct *fsp = GETFSP(blr->inbuf,smb_vwv2);
+ files_struct *fsp = file_fsp(blr->inbuf,smb_vwv2);
uint16 vuid = (lp_security() == SEC_SHARE) ? UID_FIELD_INVALID :
SVAL(blr->inbuf,smb_uid);
chain_p = NULL;
}
-/****************************************************************************
- sets chain pipe-file handle
-****************************************************************************/
-void set_chain_p(pipes_struct *new_p)
-{
- chain_p = new_p;
-}
-
/****************************************************************************
initialise pipe handle states...
****************************************************************************/
DEBUG(4,("Opened pipe %s with handle %x (pipes_open=%d)\n",
pipe_name, i, pipes_open));
- set_chain_p(p);
+ chain_p = p;
return p;
}
pipes_struct *p;
for (p=Pipes;p;p=p->next) {
- if (p->pnum == pnum) return p;
+ if (p->pnum == pnum) {
+ chain_p = p;
+ return p;
+ }
}
return NULL;
static files_struct *Files;
+/* a fsp to use when chaining */
+static files_struct *chain_fsp = NULL;
+
+
/*
* Indirection for file fd's. Needed as POSIX locking
* is based on file/process, not fd/process.
DEBUG(5,("allocated file structure %d (%d used)\n",
i, files_used));
+
+ chain_fsp = fsp;
return fsp;
}
}
-/****************************************************************************
-find a fsp given a fnum
-****************************************************************************/
-files_struct *file_fsp(int fnum)
-{
- files_struct *fsp;
-
- for (fsp=Files;fsp;fsp=fsp->next) {
- if (fsp->fnum == fnum) return fsp;
- }
-
- return NULL;
-}
-
-
/****************************************************************************
close files open by a specified vuid
****************************************************************************/
information */
memset(fsp, 0, sizeof(*fsp));
+ if (fsp == chain_fsp) chain_fsp = NULL;
+
free(fsp);
}
+
+
+/****************************************************************************
+get a fsp from a packet given the offset of a 16 bit fnum
+****************************************************************************/
+files_struct *file_fsp(char *buf, int where)
+{
+ int fnum;
+ files_struct *fsp;
+
+ if (chain_fsp) return chain_fsp;
+
+ fnum = SVAL(buf, where);
+
+ for (fsp=Files;fsp;fsp=fsp->next) {
+ if (fsp->fnum == fnum) {
+ chain_fsp = fsp;
+ return fsp;
+ }
+ }
+
+ return NULL;
+}
+
+
+/****************************************************************************
+reset the chained fsp - done at the start of a packet reply
+****************************************************************************/
+void file_chain_reset(void)
+{
+ chain_fsp = NULL;
+}
extern int DEBUGLEVEL;
extern int Protocol;
-extern files_struct *chain_fsp;
extern int Client;
extern int oplock_sock;
extern int smb_read_error;
SCVAL(p,0,fsp->is_directory ? 1 : 0);
}
- chain_fsp = fsp;
-
DEBUG(5,("reply_ntcreate_and_X: open name = %s\n",
fsp?fsp->fsp_name:"NULL"));
{
char *params = *ppparams;
pstring new_name;
- files_struct *fsp = GETFSP(params, 0);
+ files_struct *fsp = file_fsp(params, 0);
BOOL replace_if_exists = (SVAL(params,2) & RENAME_REPLACE_IF_EXISTS) ? True : False;
uint32 fname_len = MIN((((uint32)IVAL(inbuf,smb_nt_TotalParameterCount)-4)),
((uint32)sizeof(new_name)-1));
change_notify_buf *cnbp;
struct stat st;
- fsp = GETFSP(setup,4);
+ fsp = file_fsp(setup,4);
DEBUG(3,("call_nt_transact_notify_change\n"));
DEBUG(3,("readX pnum=%04x min=%d max=%d nread=%d\n",
p->pnum, smb_mincnt, smb_maxcnt, nread));
- set_chain_p(p);
-
return chain_reply(inbuf,outbuf,length,bufsize);
}
/****************************************************************************
extern int DEBUGLEVEL;
extern int max_send;
extern int max_recv;
-extern files_struct *chain_fsp;
extern char magic_char;
extern BOOL case_sensitive;
extern BOOL case_preserve;
SSVAL(outbuf,smb_vwv8,rmode);
SSVAL(outbuf,smb_vwv11,smb_action);
- chain_fsp = fsp;
-
return chain_reply(inbuf,outbuf,length,bufsize);
}
return -1;
}
- fsp = GETFSP(inbuf,smb_vwv0);
+ fsp = file_fsp(inbuf,smb_vwv0);
startpos = IVAL(inbuf,smb_vwv1);
maxcount = SVAL(inbuf,smb_vwv3);
uint32 startpos, numtoread;
int eclass;
uint32 ecode;
- files_struct *fsp = GETFSP(inbuf,smb_vwv0);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv0);
CHECK_FSP(fsp,conn);
CHECK_READ(fsp);
char *data;
uint32 startpos;
int outsize = 0;
- files_struct *fsp = GETFSP(inbuf,smb_vwv0);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv0);
CHECK_FSP(fsp,conn);
CHECK_READ(fsp);
****************************************************************************/
int reply_read_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize)
{
- files_struct *fsp = GETFSP(inbuf,smb_vwv2);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv2);
uint32 smb_offs = IVAL(inbuf,smb_vwv3);
int smb_maxcnt = SVAL(inbuf,smb_vwv5);
int smb_mincnt = SVAL(inbuf,smb_vwv6);
DEBUG( 3, ( "readX fnum=%d min=%d max=%d nread=%d\n",
fsp->fnum, smb_mincnt, smb_maxcnt, nread ) );
- chain_fsp = fsp;
-
return chain_reply(inbuf,outbuf,length,bufsize);
}
char *data=NULL;
BOOL write_through;
int tcount;
- files_struct *fsp = GETFSP(inbuf,smb_vwv0);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv0);
CHECK_FSP(fsp,conn);
CHECK_WRITE(fsp);
uint32 numtowrite,startpos;
int eclass;
uint32 ecode;
- files_struct *fsp = GETFSP(inbuf,smb_vwv0);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv0);
CHECK_FSP(fsp,conn);
CHECK_WRITE(fsp);
int outsize = 0;
int startpos;
char *data;
- files_struct *fsp = GETFSP(inbuf,smb_vwv0);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv0);
CHECK_FSP(fsp,conn);
CHECK_WRITE(fsp);
****************************************************************************/
int reply_write_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize)
{
- files_struct *fsp = GETFSP(inbuf,smb_vwv2);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv2);
uint32 smb_offs = IVAL(inbuf,smb_vwv3);
int smb_dsize = SVAL(inbuf,smb_vwv10);
int smb_doff = SVAL(inbuf,smb_vwv11);
DEBUG(3,("writeX fnum=%d num=%d wrote=%d\n",
fsp->fnum, smb_dsize, nwritten));
- chain_fsp = fsp;
-
if (lp_syncalways(SNUM(conn)) || write_through)
sync_file(conn,fsp);
int32 res= -1;
int mode,umode;
int outsize = 0;
- files_struct *fsp = GETFSP(inbuf,smb_vwv0);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv0);
CHECK_FSP(fsp,conn);
CHECK_ERROR(fsp);
int reply_flush(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
{
int outsize = set_message(outbuf,0,0,True);
- files_struct *fsp = GETFSP(inbuf,smb_vwv0);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv0);
if (fsp) {
CHECK_FSP(fsp,conn);
return reply_pipe_close(conn, inbuf,outbuf);
}
- fsp = GETFSP(inbuf,smb_vwv0);
+ fsp = file_fsp(inbuf,smb_vwv0);
/*
* We can only use CHECK_FSP if we know it's not a directory.
int startpos;
char *data;
time_t mtime;
- files_struct *fsp = GETFSP(inbuf,smb_vwv0);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv0);
CHECK_FSP(fsp,conn);
CHECK_WRITE(fsp);
uint32 count,offset;
int eclass;
uint32 ecode;
- files_struct *fsp = GETFSP(inbuf,smb_vwv0);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv0);
CHECK_FSP(fsp,conn);
CHECK_ERROR(fsp);
uint32 count,offset;
int eclass;
uint32 ecode;
- files_struct *fsp = GETFSP(inbuf,smb_vwv0);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv0);
CHECK_FSP(fsp,conn);
CHECK_ERROR(fsp);
char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
{
int outsize = set_message(outbuf,0,0,True);
- files_struct *fsp = GETFSP(inbuf,smb_vwv0);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv0);
CHECK_FSP(fsp,conn);
CHECK_ERROR(fsp);
int numtowrite;
int outsize = set_message(outbuf,0,0,True);
char *data;
- files_struct *fsp = GETFSP(inbuf,smb_vwv0);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv0);
if (!CAN_PRINT(conn))
return(ERROR(ERRDOS,ERRnoaccess));
****************************************************************************/
int reply_lockingX(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize)
{
- files_struct *fsp = GETFSP(inbuf,smb_vwv2);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv2);
unsigned char locktype = CVAL(inbuf,smb_vwv3);
#if 0
unsigned char oplocklevel = CVAL(inbuf,smb_vwv3+1);
DEBUG( 3, ( "lockingX fnum=%d type=%d num_locks=%d num_ulocks=%d\n",
fsp->fnum, (unsigned int)locktype, num_locks, num_ulocks ) );
- chain_fsp = fsp;
-
return chain_reply(inbuf,outbuf,length,bufsize);
}
int max_per_packet;
int tcount;
int pad;
- files_struct *fsp = GETFSP(inbuf,smb_vwv0);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv0);
/* this function doesn't seem to work - disable by default */
if (!lp_readbmpx())
uint32 startpos;
int tcount, write_through, smb_doff;
char *data;
- files_struct *fsp = GETFSP(inbuf,smb_vwv0);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv0);
CHECK_FSP(fsp,conn);
CHECK_WRITE(fsp);
char *data;
write_bmpx_struct *wbms;
BOOL send_response = False;
- files_struct *fsp = GETFSP(inbuf,smb_vwv0);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv0);
CHECK_FSP(fsp,conn);
CHECK_WRITE(fsp);
{
struct utimbuf unix_times;
int outsize = 0;
- files_struct *fsp = GETFSP(inbuf,smb_vwv0);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv0);
outsize = set_message(outbuf,0,0,True);
struct stat sbuf;
int outsize = 0;
int mode;
- files_struct *fsp = GETFSP(inbuf,smb_vwv0);
+ files_struct *fsp = file_fsp(inbuf,smb_vwv0);
outsize = set_message(outbuf,11,0,True);
*/
int max_recv = BUFFER_SIZE;
-/* a fsp to use when chaining */
-files_struct *chain_fsp = NULL;
-
/* number of open connections */
static int num_connections_open = 0;
smb_last_time = time(NULL);
chain_size = 0;
- chain_fsp = NULL;
+ file_chain_reset();
reset_chain_p();
if (msg_type != 0)
extern int smb_read_error;
extern fstring local_machine;
extern int global_oplock_break;
-extern files_struct *chain_fsp;
/****************************************************************************
Send the required number of replies back.
BOOL bad_path = False;
if (tran_call == TRANSACT2_QFILEINFO) {
- files_struct *fsp = GETFSP(params,0);
+ files_struct *fsp = file_fsp(params,0);
info_level = SVAL(params,2);
CHECK_FSP(fsp,conn);
return(ERROR(ERRSRV,ERRaccess));
if (tran_call == TRANSACT2_SETFILEINFO) {
- files_struct *fsp = GETFSP(params,0);
+ files_struct *fsp = file_fsp(params,0);
info_level = SVAL(params,2);
CHECK_FSP(fsp,conn);